[OTLayout] Implement GPOS collect_glyphs()

pull/1/merge
Behdad Esfahbod 12 years ago
parent 4c4e8f0e75
commit cdd756b9f4
  1. 95
      src/hb-ot-layout-gpos-table.hh
  2. 9
      src/hb-ot-layout.cc

@ -419,6 +419,12 @@ struct MarkArray : ArrayOf<MarkRecord> /* Array of MarkRecords--in Coverage orde
struct SinglePosFormat1
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
(this+coverage).add_coverage (&c->input);
}
inline const Coverage &get_coverage (void) const
{
return this+coverage;
@ -458,6 +464,12 @@ struct SinglePosFormat1
struct SinglePosFormat2
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
(this+coverage).add_coverage (&c->input);
}
inline const Coverage &get_coverage (void) const
{
return this+coverage;
@ -548,6 +560,23 @@ struct PairSet
{
friend struct PairPosFormat1;
inline void collect_glyphs (hb_collect_glyphs_context_t *c,
const ValueFormat *valueFormats) const
{
TRACE_COLLECT_GLYPHS (this);
unsigned int len1 = valueFormats[0].get_len ();
unsigned int len2 = valueFormats[1].get_len ();
unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
const PairValueRecord *record = CastP<PairValueRecord> (array);
unsigned int count = len;
for (unsigned int i = 0; i < count; i++)
{
c->input.add (record->secondGlyph);
record = &StructAtOffset<PairValueRecord> (record, record_size);
}
}
inline bool apply (hb_apply_context_t *c,
const ValueFormat *valueFormats,
unsigned int pos) const
@ -557,8 +586,8 @@ struct PairSet
unsigned int len2 = valueFormats[1].get_len ();
unsigned int record_size = USHORT::static_size * (1 + len1 + len2);
unsigned int count = len;
const PairValueRecord *record = CastP<PairValueRecord> (array);
unsigned int count = len;
for (unsigned int i = 0; i < count; i++)
{
if (c->buffer->info[pos].codepoint == record->secondGlyph)
@ -606,6 +635,15 @@ struct PairSet
struct PairPosFormat1
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
(this+coverage).add_coverage (&c->input);
unsigned int count = pairSet.len;
for (unsigned int i = 0; i < count; i++)
(this+pairSet[i]).collect_glyphs (c, &valueFormat1);
}
inline const Coverage &get_coverage (void) const
{
return this+coverage;
@ -660,6 +698,24 @@ struct PairPosFormat1
struct PairPosFormat2
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
/* (this+coverage).add_coverage (&c->input); // Don't need this. */
/* TODO only add values for pairs that have nonzero adjustments. */
unsigned int count1 = class1Count;
const ClassDef &klass1 = this+classDef1;
for (unsigned int i = 0; i < count1; i++)
klass1.add_class (&c->input, i);
unsigned int count2 = class2Count;
const ClassDef &klass2 = this+classDef2;
for (unsigned int i = 0; i < count2; i++)
klass2.add_class (&c->input, i);
}
inline const Coverage &get_coverage (void) const
{
return this+coverage;
@ -800,6 +856,12 @@ struct EntryExitRecord
struct CursivePosFormat1
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
(this+coverage).add_coverage (&c->input);
}
inline const Coverage &get_coverage (void) const
{
return this+coverage;
@ -940,6 +1002,14 @@ typedef AnchorMatrix BaseArray; /* base-major--
struct MarkBasePosFormat1
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
(this+markCoverage).add_coverage (&c->input);
(this+baseCoverage).add_coverage (&c->input);
/* TODO only add combinations that have nonzero adjustment. */
}
inline const Coverage &get_coverage (void) const
{
return this+markCoverage;
@ -1036,6 +1106,14 @@ typedef OffsetListOf<LigatureAttach> LigatureArray;
struct MarkLigPosFormat1
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
(this+markCoverage).add_coverage (&c->input);
(this+ligatureCoverage).add_coverage (&c->input);
/* TODO only add combinations that have nonzero adjustment. */
}
inline const Coverage &get_coverage (void) const
{
return this+markCoverage;
@ -1144,6 +1222,14 @@ typedef AnchorMatrix Mark2Array; /* mark2-major--
struct MarkMarkPosFormat1
{
inline void collect_glyphs (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
(this+mark1Coverage).add_coverage (&c->input);
(this+mark2Coverage).add_coverage (&c->input);
/* TODO only add combinations that have nonzero adjustment. */
}
inline const Coverage &get_coverage (void) const
{
return this+mark1Coverage;
@ -1357,6 +1443,13 @@ struct PosLookup : Lookup
template <typename context_t>
static inline typename context_t::return_t process_recurse_func (context_t *c, unsigned int lookup_index);
inline hb_collect_glyphs_context_t::return_t collect_glyphs_lookup (hb_collect_glyphs_context_t *c) const
{
TRACE_COLLECT_GLYPHS (this);
c->set_recurse_func (process_recurse_func<hb_collect_glyphs_context_t>);
return TRACE_RETURN (process (c));
}
template <typename set_t>
inline void add_coverage (set_t *glyphs) const
{

@ -412,18 +412,19 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return;
// OT::hb_collect_glyphs_context_t c (face, glyphs_before, glyphs_input, glyphs_after, glyphs_output);
OT::hb_collect_glyphs_context_t c (face, glyphs_before, glyphs_input, glyphs_after, glyphs_output);
switch (table_tag) {
case HB_OT_TAG_GSUB:
{
// hb_ot_layout_from_face (face)->gsub->collect_glyphs_lookup (&c, lookup_index);
const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
l.collect_glyphs_lookup (&c);
return;
}
case HB_OT_TAG_GPOS:
{
// hb_ot_layout_from_face (face)->gpos->collect_glyphs_lookup (&c, lookup_index);
// l.collect_glyphs_lookup (&c);
const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
l.collect_glyphs_lookup (&c);
return;
}
}

Loading…
Cancel
Save