diff --git a/src/OT/Layout/GPOS/CursivePosFormat1.hh b/src/OT/Layout/GPOS/CursivePosFormat1.hh index 87e4df593..f6e46b1a1 100644 --- a/src/OT/Layout/GPOS/CursivePosFormat1.hh +++ b/src/OT/Layout/GPOS/CursivePosFormat1.hh @@ -50,7 +50,30 @@ struct EntryExitRecord }; static void -reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent); +reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent) { + int chain = pos[i].attach_chain(), type = pos[i].attach_type(); + if (likely (!chain || 0 == (type & OT::Layout::GPOS::ATTACH_TYPE_CURSIVE))) + return; + + pos[i].attach_chain() = 0; + + unsigned int j = (int) i + chain; + + /* Stop if we see new parent in the chain. */ + if (j == new_parent) + return; + + reverse_cursive_minor_offset (pos, j, direction, new_parent); + + if (HB_DIRECTION_IS_HORIZONTAL (direction)) + pos[j].y_offset = -pos[i].y_offset; + else + pos[j].x_offset = -pos[i].x_offset; + + pos[j].attach_chain() = -chain; + pos[j].attach_type() = type; +} + struct CursivePosFormat1 { diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index ccc51c136..0f2ce59ab 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -33,71 +33,33 @@ namespace OT { +using Layout::GPOS::ATTACH_TYPE_MARK; +using Layout::GPOS::ATTACH_TYPE_NONE; +using Layout::GPOS::ATTACH_TYPE_CURSIVE; using Layout::GPOS::PosLookup; -using OT::Layout::GPOS::ATTACH_TYPE_NONE; -using OT::Layout::GPOS::ATTACH_TYPE_MARK; -using OT::Layout::GPOS::ATTACH_TYPE_CURSIVE; - -// struct MarkArray; -// static void Markclass_closure_and_remap_indexes (const Coverage &mark_coverage, -// const MarkArray &mark_array, -// const hb_set_t &glyphset, -// hb_map_t* klass_mapping /* INOUT */); - - -/* Shared Tables: ValueRecord, Anchor Table, and MarkArray */ - -/* Lookups */ - - -static void -reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent) -{ - int chain = pos[i].attach_chain(), type = pos[i].attach_type(); - if (likely (!chain || 0 == (type & OT::Layout::GPOS::ATTACH_TYPE_CURSIVE))) - return; - - pos[i].attach_chain() = 0; - - unsigned int j = (int) i + chain; - - /* Stop if we see new parent in the chain. */ - if (j == new_parent) - return; - - reverse_cursive_minor_offset (pos, j, direction, new_parent); - - if (HB_DIRECTION_IS_HORIZONTAL (direction)) - pos[j].y_offset = -pos[i].y_offset; - else - pos[j].x_offset = -pos[i].x_offset; - - pos[j].attach_chain() = -chain; - pos[j].attach_type() = type; -} // TODO(garretrieger): Move into new layout directory. /* Out-of-class implementation for methods recursing */ #ifndef HB_NO_OT_LAYOUT template -/*static*/ typename context_t::return_t PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index) +/*static*/ typename context_t::return_t Layout::GPOS::PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index) { - const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index); + const Layout::GPOS::PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index); return l.dispatch (c); } template <> inline hb_closure_lookups_context_t::return_t -PosLookup::dispatch_recurse_func (hb_closure_lookups_context_t *c, unsigned this_index) +Layout::GPOS::PosLookup::dispatch_recurse_func (hb_closure_lookups_context_t *c, unsigned this_index) { - const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (this_index); + const Layout::GPOS::PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (this_index); return l.closure_lookups (c, this_index); } template <> -inline bool PosLookup::dispatch_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) +inline bool Layout::GPOS::PosLookup::dispatch_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index) { - const PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index); + const Layout::GPOS::PosLookup &l = c->face->table.GPOS.get_relaxed ()->table->get_lookup (lookup_index); unsigned int saved_lookup_props = c->lookup_props; unsigned int saved_lookup_index = c->lookup_index; c->set_lookup_index (lookup_index);