[OTLayout] Refactor a bit more
This commit is contained in:
parent
d2c96819de
commit
bac1dd6a0f
|
@ -278,14 +278,12 @@ struct hb_apply_context_t
|
|||
|
||||
hb_apply_context_t (unsigned int table_index_,
|
||||
hb_font_t *font_,
|
||||
hb_buffer_t *buffer_,
|
||||
hb_mask_t lookup_mask_,
|
||||
bool auto_zwj_) :
|
||||
hb_buffer_t *buffer_) :
|
||||
table_index (table_index_),
|
||||
font (font_), face (font->face), buffer (buffer_),
|
||||
direction (buffer_->props.direction),
|
||||
lookup_mask (lookup_mask_),
|
||||
auto_zwj (auto_zwj_),
|
||||
lookup_mask (1),
|
||||
auto_zwj (true),
|
||||
recurse_func (NULL),
|
||||
nesting_level_left (MAX_NESTING_LEVEL),
|
||||
lookup_props (0),
|
||||
|
@ -293,6 +291,8 @@ struct hb_apply_context_t
|
|||
has_glyph_classes (gdef.has_glyph_classes ()),
|
||||
debug_depth (0) {}
|
||||
|
||||
inline void set_lookup_mask (hb_mask_t mask) { lookup_mask = mask; }
|
||||
inline void set_auto_zwj (bool auto_zwj_) { auto_zwj = auto_zwj_; }
|
||||
inline void set_recurse_func (recurse_func_t func) { recurse_func = func; }
|
||||
inline void set_lookup_props (unsigned int lookup_props_) { lookup_props = lookup_props_; }
|
||||
inline void set_lookup (const Lookup &l) { lookup_props = l.get_props (); }
|
||||
|
|
|
@ -202,12 +202,19 @@ HB_INTERNAL void
|
|||
hb_ot_layout_substitute_start (hb_font_t *font,
|
||||
hb_buffer_t *buffer);
|
||||
|
||||
HB_INTERNAL hb_bool_t
|
||||
hb_ot_layout_substitute_lookup (hb_font_t *font,
|
||||
hb_buffer_t *buffer,
|
||||
unsigned int lookup_index,
|
||||
hb_mask_t mask,
|
||||
hb_bool_t auto_zwj);
|
||||
|
||||
struct hb_ot_layout_lookup_accelerator_t;
|
||||
|
||||
namespace OT {
|
||||
struct hb_apply_context_t;
|
||||
struct SubstLookup;
|
||||
}
|
||||
|
||||
HB_INTERNAL void
|
||||
hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
|
||||
const OT::SubstLookup &lookup,
|
||||
const hb_ot_layout_lookup_accelerator_t &accel);
|
||||
|
||||
|
||||
/* Should be called after all the substitute_lookup's are done */
|
||||
HB_INTERNAL void
|
||||
|
@ -220,13 +227,6 @@ HB_INTERNAL void
|
|||
hb_ot_layout_position_start (hb_font_t *font,
|
||||
hb_buffer_t *buffer);
|
||||
|
||||
HB_INTERNAL hb_bool_t
|
||||
hb_ot_layout_position_lookup (hb_font_t *font,
|
||||
hb_buffer_t *buffer,
|
||||
unsigned int lookup_index,
|
||||
hb_mask_t mask,
|
||||
hb_bool_t auto_zwj);
|
||||
|
||||
/* Should be called after all the position_lookup's are done */
|
||||
HB_INTERNAL void
|
||||
hb_ot_layout_position_finish (hb_font_t *font,
|
||||
|
|
|
@ -669,22 +669,6 @@ hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer)
|
|||
OT::GSUB::substitute_start (font, buffer);
|
||||
}
|
||||
|
||||
hb_bool_t
|
||||
hb_ot_layout_substitute_lookup (hb_font_t *font,
|
||||
hb_buffer_t *buffer,
|
||||
unsigned int lookup_index,
|
||||
hb_mask_t mask,
|
||||
hb_bool_t auto_zwj)
|
||||
{
|
||||
if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gsub_lookup_count)) return false;
|
||||
|
||||
OT::hb_apply_context_t c (0, font, buffer, mask, auto_zwj);
|
||||
|
||||
const OT::SubstLookup& l = hb_ot_layout_from_face (font->face)->gsub->get_lookup (lookup_index);
|
||||
|
||||
return l.apply_string (&c, &hb_ot_layout_from_face (font->face)->gsub_accels[lookup_index].digest);
|
||||
}
|
||||
|
||||
void
|
||||
hb_ot_layout_substitute_finish (hb_font_t *font, hb_buffer_t *buffer)
|
||||
{
|
||||
|
@ -719,22 +703,6 @@ hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer)
|
|||
OT::GPOS::position_start (font, buffer);
|
||||
}
|
||||
|
||||
hb_bool_t
|
||||
hb_ot_layout_position_lookup (hb_font_t *font,
|
||||
hb_buffer_t *buffer,
|
||||
unsigned int lookup_index,
|
||||
hb_mask_t mask,
|
||||
hb_bool_t auto_zwj)
|
||||
{
|
||||
if (unlikely (lookup_index >= hb_ot_layout_from_face (font->face)->gpos_lookup_count)) return false;
|
||||
|
||||
OT::hb_apply_context_t c (1, font, buffer, mask, auto_zwj);
|
||||
|
||||
const OT::PosLookup& l = hb_ot_layout_from_face (font->face)->gpos->get_lookup (lookup_index);
|
||||
|
||||
return l.apply_string (&c, &hb_ot_layout_from_face (font->face)->gpos_accels[lookup_index].digest);
|
||||
}
|
||||
|
||||
void
|
||||
hb_ot_layout_position_finish (hb_font_t *font, hb_buffer_t *buffer)
|
||||
{
|
||||
|
@ -788,35 +756,57 @@ hb_ot_layout_get_size_params (hb_face_t *face,
|
|||
|
||||
|
||||
/*
|
||||
* Parts of hb-ot-map are implemented here such that they have direct
|
||||
* Parts of different types are implemented here such that they have direct
|
||||
* access to GSUB/GPOS lookups.
|
||||
*/
|
||||
|
||||
|
||||
inline void hb_ot_map_t::apply (unsigned int table_index,
|
||||
struct GSUBProxy
|
||||
{
|
||||
static const unsigned int table_index = 0;
|
||||
typedef OT::SubstLookup Lookup;
|
||||
|
||||
GSUBProxy (hb_face_t *face) :
|
||||
table (*hb_ot_layout_from_face (face)->gsub),
|
||||
accels (hb_ot_layout_from_face (face)->gsub_accels) {}
|
||||
|
||||
const OT::GSUB &table;
|
||||
const hb_ot_layout_lookup_accelerator_t *accels;
|
||||
};
|
||||
|
||||
struct GPOSProxy
|
||||
{
|
||||
static const unsigned int table_index = 1;
|
||||
typedef OT::PosLookup Lookup;
|
||||
|
||||
GPOSProxy (hb_face_t *face) :
|
||||
table (*hb_ot_layout_from_face (face)->gpos),
|
||||
accels (hb_ot_layout_from_face (face)->gpos_accels) {}
|
||||
|
||||
const OT::GPOS &table;
|
||||
const hb_ot_layout_lookup_accelerator_t *accels;
|
||||
};
|
||||
|
||||
|
||||
template <typename Proxy>
|
||||
inline void hb_ot_map_t::apply (const Proxy &proxy,
|
||||
const hb_ot_shape_plan_t *plan,
|
||||
hb_font_t *font,
|
||||
hb_buffer_t *buffer) const
|
||||
{
|
||||
const unsigned int table_index = proxy.table_index;
|
||||
unsigned int i = 0;
|
||||
OT::hb_apply_context_t c (table_index, font, buffer);
|
||||
|
||||
for (unsigned int stage_index = 0; stage_index < stages[table_index].len; stage_index++) {
|
||||
const stage_map_t *stage = &stages[table_index][stage_index];
|
||||
for (; i < stage->last_lookup; i++)
|
||||
switch (table_index)
|
||||
{
|
||||
case 0:
|
||||
hb_ot_layout_substitute_lookup (font, buffer, lookups[table_index][i].index,
|
||||
lookups[table_index][i].mask,
|
||||
lookups[table_index][i].auto_zwj);
|
||||
break;
|
||||
|
||||
case 1:
|
||||
hb_ot_layout_position_lookup (font, buffer, lookups[table_index][i].index,
|
||||
lookups[table_index][i].mask,
|
||||
lookups[table_index][i].auto_zwj);
|
||||
break;
|
||||
}
|
||||
{
|
||||
unsigned int lookup_index = lookups[table_index][i].index;
|
||||
c.set_lookup_mask (lookups[table_index][i].mask);
|
||||
c.set_auto_zwj (lookups[table_index][i].auto_zwj);
|
||||
proxy.table.get_lookup (lookup_index).apply_string (&c, &proxy.accels[lookup_index].digest);
|
||||
}
|
||||
|
||||
if (stage->pause_func)
|
||||
{
|
||||
|
@ -828,10 +818,20 @@ inline void hb_ot_map_t::apply (unsigned int table_index,
|
|||
|
||||
void hb_ot_map_t::substitute (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
|
||||
{
|
||||
apply (0, plan, font, buffer);
|
||||
GSUBProxy proxy (font->face);
|
||||
apply (proxy, plan, font, buffer);
|
||||
}
|
||||
|
||||
void hb_ot_map_t::position (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const
|
||||
{
|
||||
apply (1, plan, font, buffer);
|
||||
GPOSProxy proxy (font->face);
|
||||
apply (proxy, plan, font, buffer);
|
||||
}
|
||||
|
||||
HB_INTERNAL void
|
||||
hb_ot_layout_substitute_lookup (OT::hb_apply_context_t *c,
|
||||
const OT::SubstLookup &lookup,
|
||||
const hb_ot_layout_lookup_accelerator_t &accel)
|
||||
{
|
||||
lookup.apply_string (c, &accel.digest);
|
||||
}
|
||||
|
|
|
@ -118,10 +118,9 @@ struct hb_ot_map_t
|
|||
}
|
||||
|
||||
HB_INTERNAL void collect_lookups (unsigned int table_index, hb_set_t *lookups) const;
|
||||
HB_INTERNAL inline void apply (unsigned int table_index,
|
||||
const struct hb_ot_shape_plan_t *plan,
|
||||
hb_font_t *font,
|
||||
hb_buffer_t *buffer) const;
|
||||
template <typename Proxy>
|
||||
HB_INTERNAL inline void apply (const Proxy &proxy,
|
||||
const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
|
||||
HB_INTERNAL void substitute (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
|
||||
HB_INTERNAL void position (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) const;
|
||||
|
||||
|
|
|
@ -246,10 +246,13 @@ arabic_fallback_plan_shape (arabic_fallback_plan_t *fallback_plan,
|
|||
hb_font_t *font,
|
||||
hb_buffer_t *buffer)
|
||||
{
|
||||
OT::hb_apply_context_t c (0, font, buffer);
|
||||
for (unsigned int i = 0; i < ARABIC_NUM_FALLBACK_FEATURES; i++)
|
||||
if (fallback_plan->lookup_array[i]) {
|
||||
OT::hb_apply_context_t c (0, font, buffer, fallback_plan->mask_array[i], true/*auto_zwj*/);
|
||||
fallback_plan->lookup_array[i]->apply_string (&c, &fallback_plan->accel_array[i].digest);
|
||||
c.set_lookup_mask (fallback_plan->mask_array[i]);
|
||||
hb_ot_layout_substitute_lookup (&c,
|
||||
*fallback_plan->lookup_array[i],
|
||||
fallback_plan->accel_array[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -420,7 +420,8 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
|
|||
hb_mask_t kern_mask = plan->map.get_1_mask (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction) ?
|
||||
HB_TAG ('k','e','r','n') : HB_TAG ('v','k','r','n'));
|
||||
|
||||
OT::hb_apply_context_t c (1, font, buffer, kern_mask, true/*auto_zwj*/);
|
||||
OT::hb_apply_context_t c (1, font, buffer);
|
||||
c.set_lookup_mask (kern_mask);
|
||||
c.set_lookup_props (OT::LookupFlag::IgnoreMarks);
|
||||
|
||||
for (buffer->idx = 0; buffer->idx < count;)
|
||||
|
|
Loading…
Reference in New Issue