[HarfBuzz] harfbuzz-ng: Branch 'master'
Behdad Esfahbod
behdad at kemper.freedesktop.org
Wed Apr 11 14:14:09 PDT 2012
src/hb-ot-layout-gpos-table.hh | 24 ++++++------------------
src/hb-ot-layout-gsub-table.hh | 26 +++++++-------------------
src/hb-ot-layout-gsubgpos-private.hh | 22 ++++++++++++++++++++++
3 files changed, 35 insertions(+), 37 deletions(-)
New commits:
commit 41ae674f6871f43d0a6e4ca67a747074d63ae576
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Wed Apr 11 17:11:05 2012 -0400
Don't create hb_apply_context_t per glyph!
I couldn't measure significant performance gains out of this; maybe
about 5% (with one million Malayalam strings). Still, not bad.
But reminds me that optimizing this codebase without profiling first
is simply not going to work. Oh well...
diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh
index 412850b..f843fa3 100644
--- a/src/hb-ot-layout-gpos-table.hh
+++ b/src/hb-ot-layout-gpos-table.hh
@@ -1404,23 +1404,9 @@ struct PosLookup : Lookup
inline const PosLookupSubTable& get_subtable (unsigned int i) const
{ return this+CastR<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; }
- inline bool apply_once (hb_font_t *font,
- hb_buffer_t *buffer,
- hb_mask_t lookup_mask,
- unsigned int context_length,
- unsigned int nesting_level_left) const
+ inline bool apply_once (hb_apply_context_t *c) const
{
unsigned int lookup_type = get_type ();
- hb_apply_context_t c[1] = {{0}};
-
- c->font = font;
- c->face = font->face;
- c->buffer = buffer;
- c->direction = buffer->props.direction;
- c->lookup_mask = lookup_mask;
- c->context_length = context_length;
- c->nesting_level_left = nesting_level_left;
- c->lookup_props = get_props ();
if (!_hb_ot_layout_check_glyph_property (c->face, &c->buffer->info[c->buffer->idx], c->lookup_props, &c->property))
return false;
@@ -1441,11 +1427,12 @@ struct PosLookup : Lookup
if (unlikely (!buffer->len))
return false;
+ hb_apply_context_t c (font, font->face, buffer, mask, *this);
+
buffer->idx = 0;
while (buffer->idx < buffer->len)
{
- if ((buffer->info[buffer->idx].mask & mask) &&
- apply_once (font, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
+ if ((buffer->info[buffer->idx].mask & mask) && apply_once (&c))
ret = true;
else
buffer->idx++;
@@ -1598,7 +1585,8 @@ static inline bool position_lookup (hb_apply_context_t *c, unsigned int lookup_i
if (unlikely (c->context_length < 1))
return false;
- return l.apply_once (c->font, c->buffer, c->lookup_mask, c->context_length, c->nesting_level_left - 1);
+ hb_apply_context_t new_c (*c, l);
+ return l.apply_once (&new_c);
}
diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh
index f7ec3cc..941c669 100644
--- a/src/hb-ot-layout-gsub-table.hh
+++ b/src/hb-ot-layout-gsub-table.hh
@@ -754,22 +754,9 @@ struct SubstLookup : Lookup
}
- inline bool apply_once (hb_face_t *face,
- hb_buffer_t *buffer,
- hb_mask_t lookup_mask,
- unsigned int context_length,
- unsigned int nesting_level_left) const
+ inline bool apply_once (hb_apply_context_t *c) const
{
unsigned int lookup_type = get_type ();
- hb_apply_context_t c[1] = {{0}};
-
- c->face = face;
- c->buffer = buffer;
- c->direction = buffer->props.direction;
- c->lookup_mask = lookup_mask;
- c->context_length = context_length;
- c->nesting_level_left = nesting_level_left;
- c->lookup_props = get_props ();
if (!_hb_ot_layout_check_glyph_property (c->face, &c->buffer->info[c->buffer->idx], c->lookup_props, &c->property))
return false;
@@ -805,6 +792,8 @@ struct SubstLookup : Lookup
if (unlikely (!buffer->len))
return false;
+ hb_apply_context_t c (NULL, face, buffer, mask, *this);
+
if (likely (!is_reverse ()))
{
/* in/out forward substitution */
@@ -812,8 +801,7 @@ struct SubstLookup : Lookup
buffer->idx = 0;
while (buffer->idx < buffer->len)
{
- if ((buffer->info[buffer->idx].mask & mask) &&
- apply_once (face, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
+ if ((buffer->info[buffer->idx].mask & mask) && apply_once (&c))
ret = true;
else
buffer->next_glyph ();
@@ -828,8 +816,7 @@ struct SubstLookup : Lookup
buffer->idx = buffer->len - 1;
do
{
- if ((buffer->info[buffer->idx].mask & mask) &&
- apply_once (face, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
+ if ((buffer->info[buffer->idx].mask & mask) && apply_once (&c))
ret = true;
else
buffer->idx--;
@@ -936,7 +923,8 @@ static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup
if (unlikely (c->context_length < 1))
return false;
- return l.apply_once (c->face, c->buffer, c->lookup_mask, c->context_length, c->nesting_level_left - 1);
+ hb_apply_context_t new_c (*c, l);
+ return l.apply_once (&new_c);
}
diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh
index 13386c2..62ac29e 100644
--- a/src/hb-ot-layout-gsubgpos-private.hh
+++ b/src/hb-ot-layout-gsubgpos-private.hh
@@ -67,6 +67,28 @@ struct hb_apply_context_t
unsigned int lookup_props;
unsigned int property; /* propety of first glyph */
+
+ hb_apply_context_t (hb_font_t *font_,
+ hb_face_t *face_,
+ hb_buffer_t *buffer_,
+ hb_mask_t lookup_mask_,
+ const Lookup &l,
+ unsigned int context_length_ = NO_CONTEXT,
+ unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) :
+ font (font_), face (face_), buffer (buffer_),
+ direction (buffer_->props.direction),
+ lookup_mask (lookup_mask_),
+ context_length (context_length_),
+ nesting_level_left (nesting_level_left_),
+ lookup_props (l.get_props ()),
+ property (0) {}
+
+ hb_apply_context_t (const hb_apply_context_t &c, const Lookup &l) {
+ *this = c;
+ nesting_level_left--;
+ lookup_props = l.get_props ();
+ }
+
struct mark_skipping_forward_iterator_t
{
inline mark_skipping_forward_iterator_t (hb_apply_context_t *c_,
More information about the HarfBuzz
mailing list