[kerx] Implement Format0 apply()

Not hooked up to be called yet.
This commit is contained in:
Behdad Esfahbod 2018-10-09 22:35:22 -04:00
parent 60318f8715
commit 53e5594500
5 changed files with 42 additions and 13 deletions

View File

@ -518,6 +518,7 @@ struct hb_aat_apply_context_t :
static return_t default_return_value (void) { return false; }
bool stop_sublookup_iteration (return_t r) const { return r; }
hb_ot_shape_plan_t *plan;
hb_font_t *font;
hb_face_t *face;
hb_buffer_t *buffer;
@ -527,10 +528,11 @@ struct hb_aat_apply_context_t :
unsigned int lookup_index;
unsigned int debug_depth;
inline hb_aat_apply_context_t (hb_font_t *font_,
inline hb_aat_apply_context_t (hb_ot_shape_plan_t *plan_,
hb_font_t *font_,
hb_buffer_t *buffer_,
hb_blob_t *table) :
font (font_), face (font->face), buffer (buffer_),
plan (plan_), font (font_), face (font->face), buffer (buffer_),
sanitizer (), lookup_index (0), debug_depth (0)
{
sanitizer.init (table);

View File

@ -59,7 +59,9 @@ struct KerxSubTableFormat0
{
TRACE_APPLY (this);
/* TODO */
hb_kern_machine_t<KerxSubTableFormat0> machine (*this);
machine.kern (c->font, c->buffer, c->plan->kern_mask);
return_trace (true);
}
@ -111,8 +113,6 @@ struct KerxSubTableFormat2
unsigned int r = *(this+rightClassTable).get_value (right, num_glyphs);
unsigned int offset = l + r;
const FWORD *arr = &(this+array);
if (unlikely ((const void *) arr < (const void *) this || (const void *) arr >= (const void *) end))
return 0;
const FWORD *v = &StructAtOffset<FWORD> (arr, offset);
if (unlikely ((const void *) v < (const void *) arr || (const void *) (v + 1) > (const void *) end))
return 0;
@ -124,6 +124,13 @@ struct KerxSubTableFormat2
TRACE_APPLY (this);
/* TODO */
#if 0
accelerator_t accel (*this,
c->blob->data + c->blob->len,
c->face->get_num_glyphs ());
hb_kern_machine_t<accelerator_t> machine (accel);
machine.kern (c->font, c->buffer, c->plan->kern_mask);
#endif
return_trace (true);
}
@ -138,6 +145,22 @@ struct KerxSubTableFormat2
array.sanitize (c, this)));
}
struct accelerator_t
{
const KerxSubTableFormat2 &table;
const char *end;
unsigned int num_glyphs;
inline accelerator_t (const KerxSubTableFormat2 &table_,
const char *end_, unsigned int num_glyphs_)
: table (table_), end (end_), num_glyphs (num_glyphs_) {}
inline int get_kerning (hb_codepoint_t left, hb_codepoint_t right) const
{
return table.get_kerning (left, right, end, num_glyphs);
}
};
protected:
HBUINT32 rowWidth; /* The width, in bytes, of a row in the table. */
LOffsetTo<Lookup<HBUINT16> >

View File

@ -62,12 +62,14 @@ hb_aat_layout_has_substitution (hb_face_t *face)
}
void
hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer)
hb_aat_layout_substitute (hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
hb_blob_t *blob;
const AAT::morx& morx = _get_morx (font->face, &blob);
AAT::hb_aat_apply_context_t c (font, buffer, blob);
AAT::hb_aat_apply_context_t c (plan, font, buffer, blob);
morx.apply (&c);
}

View File

@ -29,17 +29,19 @@
#include "hb.hh"
#include "hb-font.hh"
#include "hb-buffer.hh"
#include "hb-open-type.hh"
#include "hb-ot-shape.hh"
HB_INTERNAL hb_bool_t
hb_aat_layout_has_substitution (hb_face_t *face);
HB_INTERNAL void
hb_aat_layout_substitute (hb_font_t *font, hb_buffer_t *buffer);
hb_aat_layout_substitute (hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
HB_INTERNAL void
hb_aat_layout_position (hb_font_t *font, hb_buffer_t *buffer);
hb_aat_layout_position (hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer);
#endif /* HB_AAT_LAYOUT_HH */

View File

@ -668,7 +668,7 @@ hb_ot_substitute_complex (const hb_ot_shape_context_t *c)
hb_synthesize_glyph_classes (c);
if (unlikely (c->plan->apply_morx))
hb_aat_layout_substitute (c->font, c->buffer);
hb_aat_layout_substitute (c->plan, c->font, c->buffer);
else
c->plan->substitute (c->font, buffer);
}