From 64dbeaf0f4ca5ab0d0c76158d7febbf2cd770c9f Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Fri, 28 Feb 2025 00:54:39 -0700 Subject: [PATCH] [glyf] Mover decycler to the scratch pad --- src/OT/glyf/Glyph.hh | 9 +-------- src/hb-decycler.hh | 13 ++++++++----- src/hb-ot-var-gvar-table.hh | 2 ++ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/src/OT/glyf/Glyph.hh b/src/OT/glyf/Glyph.hh index ccd460ba0..2c289d511 100644 --- a/src/OT/glyf/Glyph.hh +++ b/src/OT/glyf/Glyph.hh @@ -3,7 +3,6 @@ #include "../../hb-open-type.hh" -#include "../../hb-decycler.hh" #include "GlyphHeader.hh" #include "SimpleGlyph.hh" @@ -315,7 +314,6 @@ struct Glyph bool use_my_metrics = true, bool phantom_only = false, hb_array_t coords = hb_array_t (), - hb_decycler_t *decycler = nullptr, unsigned int depth = 0, unsigned *edge_count = nullptr) const { @@ -421,11 +419,7 @@ struct Glyph break; case COMPOSITE: { - hb_decycler_t decycler_stack; // TODO Move out of here - if (!decycler) - decycler = &decycler_stack; - - hb_decycler_node_t decycler_node (*decycler); + hb_decycler_node_t decycler_node (scratch.decycler); unsigned int comp_index = 0; for (auto &item : get_composite_iterator ()) @@ -453,7 +447,6 @@ struct Glyph use_my_metrics, phantom_only, coords, - decycler, depth + 1, edge_count))) { diff --git a/src/hb-decycler.hh b/src/hb-decycler.hh index 49dbe5be0..95b961027 100644 --- a/src/hb-decycler.hh +++ b/src/hb-decycler.hh @@ -89,7 +89,7 @@ struct hb_decycler_t friend struct hb_decycler_node_t; private: - bool tortoise_asleep = true; + bool tortoise_awake = false; hb_decycler_node_t *tortoise = nullptr; hb_decycler_node_t *hare = nullptr; }; @@ -100,15 +100,18 @@ struct hb_decycler_node_t { u.decycler = &decycler; - decycler.tortoise_asleep = !decycler.tortoise_asleep; + decycler.tortoise_awake = !decycler.tortoise_awake; if (!decycler.tortoise) { // First node. + assert (decycler.tortoise_awake); + assert (!decycler.hare); decycler.tortoise = decycler.hare = this; return; } - if (!decycler.tortoise_asleep) + + if (decycler.tortoise_awake) decycler.tortoise = decycler.tortoise->u.next; // Time to move. this->prev = decycler.hare; @@ -128,10 +131,10 @@ struct hb_decycler_node_t prev->u.decycler = &decycler; assert (decycler.tortoise); - if (!decycler.tortoise_asleep) + if (decycler.tortoise_awake) decycler.tortoise = decycler.tortoise->prev; - decycler.tortoise_asleep = !decycler.tortoise_asleep; + decycler.tortoise_awake = !decycler.tortoise_awake; } bool visit (uintptr_t value_) diff --git a/src/hb-ot-var-gvar-table.hh b/src/hb-ot-var-gvar-table.hh index 9cd22f6d6..7ea8ee129 100644 --- a/src/hb-ot-var-gvar-table.hh +++ b/src/hb-ot-var-gvar-table.hh @@ -28,6 +28,7 @@ #ifndef HB_OT_VAR_GVAR_TABLE_HH #define HB_OT_VAR_GVAR_TABLE_HH +#include "hb-decycler.hh" #include "hb-open-type.hh" #include "hb-ot-var-common.hh" @@ -43,6 +44,7 @@ struct hb_glyf_scratch_t // glyf contour_point_vector_t all_points; contour_point_vector_t comp_points; + hb_decycler_t decycler; // gvar contour_point_vector_t orig_points;