[HarfBuzz] harfbuzz: Branch 'master'
Behdad Esfahbod
behdad at kemper.freedesktop.org
Sun Oct 27 13:05:32 PDT 2013
src/hb-ot-shape-fallback.cc | 47 +++++++++++++++++++++++++++-----------------
1 file changed, 29 insertions(+), 18 deletions(-)
New commits:
commit 6b03e3c724ec6cd255f4a323bf4aa7d8c93a056e
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Sun Oct 27 21:04:55 2013 +0100
Optimize fallback kerning
Patch from Jonathan Kew. "These changes seem to yield a small but
just-about-measurable improvement with old fonts that lack GPOS
kerning."
diff --git a/src/hb-ot-shape-fallback.cc b/src/hb-ot-shape-fallback.cc
index 593c333..449b64e 100644
--- a/src/hb-ot-shape-fallback.cc
+++ b/src/hb-ot-shape-fallback.cc
@@ -430,41 +430,52 @@ _hb_ot_shape_fallback_kern (const hb_ot_shape_plan_t *plan,
hb_font_t *font,
hb_buffer_t *buffer)
{
- unsigned int count = buffer->len;
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'));
+ if (!kern_mask) return;
+
+ unsigned int count = buffer->len;
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;)
+ hb_glyph_info_t *info = buffer->info;
+ hb_glyph_position_t *pos = buffer->pos;
+
+ for (unsigned int idx = 0; idx < count;)
{
- OT::hb_apply_context_t::skipping_forward_iterator_t skippy_iter (&c, buffer->idx, 1);
+ OT::hb_apply_context_t::skipping_forward_iterator_t skippy_iter (&c, idx, 1);
if (!skippy_iter.next ())
{
- buffer->idx++;
+ idx++;
continue;
}
- hb_position_t x_kern, y_kern, kern1, kern2;
- font->get_glyph_kerning_for_direction (buffer->info[buffer->idx].codepoint,
- buffer->info[skippy_iter.idx].codepoint,
+ hb_position_t x_kern, y_kern;
+ font->get_glyph_kerning_for_direction (info[idx].codepoint,
+ info[skippy_iter.idx].codepoint,
buffer->props.direction,
&x_kern, &y_kern);
- kern1 = x_kern >> 1;
- kern2 = x_kern - kern1;
- buffer->pos[buffer->idx].x_advance += kern1;
- buffer->pos[skippy_iter.idx].x_advance += kern2;
- buffer->pos[skippy_iter.idx].x_offset += kern2;
+ if (x_kern)
+ {
+ hb_position_t kern1 = x_kern >> 1;
+ hb_position_t kern2 = x_kern - kern1;
+ pos[idx].x_advance += kern1;
+ pos[skippy_iter.idx].x_advance += kern2;
+ pos[skippy_iter.idx].x_offset += kern2;
+ }
- kern1 = y_kern >> 1;
- kern2 = y_kern - kern1;
- buffer->pos[buffer->idx].y_advance += kern1;
- buffer->pos[skippy_iter.idx].y_advance += kern2;
- buffer->pos[skippy_iter.idx].y_offset += kern2;
+ if (y_kern)
+ {
+ hb_position_t kern1 = y_kern >> 1;
+ hb_position_t kern2 = y_kern - kern1;
+ pos[idx].y_advance += kern1;
+ pos[skippy_iter.idx].y_advance += kern2;
+ pos[skippy_iter.idx].y_offset += kern2;
+ }
- buffer->idx = skippy_iter.idx;
+ idx = skippy_iter.idx;
}
}
More information about the HarfBuzz
mailing list