[HarfBuzz] harfbuzz-ng: Branch 'master'
Behdad Esfahbod
behdad at kemper.freedesktop.org
Thu May 20 09:27:32 PDT 2010
src/hb-ot-layout-gpos-private.hh | 12 +++++++-----
src/hb-ot-layout-gsub-private.hh | 20 +++++++++-----------
src/hb-ot-layout-gsubgpos-private.hh | 1 +
src/hb-private.h | 19 ++++++++++++++++++-
4 files changed, 35 insertions(+), 17 deletions(-)
New commits:
commit f7acd8df5146155b51d6f50aeb04f54f3030c1c3
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu May 20 17:26:35 2010 +0100
Do alternate glyph selection!
Kinda hand-wavy right now. Not tested.
diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh
index cb66aec..10e9df5 100644
--- a/src/hb-ot-layout-gpos-private.hh
+++ b/src/hb-ot-layout-gpos-private.hh
@@ -1497,15 +1497,17 @@ struct PosLookup : Lookup
{ return this+CastR<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; }
inline bool apply_once (hb_ot_layout_context_t *layout,
- hb_buffer_t *buffer,
- unsigned int context_length,
- unsigned int nesting_level_left) const
+ hb_buffer_t *buffer,
+ hb_mask_t lookup_mask,
+ unsigned int context_length,
+ unsigned int nesting_level_left) const
{
unsigned int lookup_type = get_type ();
hb_apply_context_t c[1] = {{0}};
c->layout = layout;
c->buffer = buffer;
+ c->lookup_mask = lookup_mask;
c->context_length = context_length;
c->nesting_level_left = nesting_level_left;
c->lookup_flag = get_flag ();
@@ -1537,7 +1539,7 @@ struct PosLookup : Lookup
bool done;
if (buffer->info[buffer->i].mask & mask)
{
- done = apply_once (layout, buffer, NO_CONTEXT, MAX_NESTING_LEVEL);
+ done = apply_once (layout, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL);
ret |= done;
}
else
@@ -1621,7 +1623,7 @@ 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->layout, c->buffer, c->context_length, c->nesting_level_left - 1);
+ return l.apply_once (c->layout, c->buffer, c->lookup_mask, c->context_length, c->nesting_level_left - 1);
}
diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh
index 96c1c9c..fae99d5 100644
--- a/src/hb-ot-layout-gsub-private.hh
+++ b/src/hb-ot-layout-gsub-private.hh
@@ -274,6 +274,8 @@ struct AlternateSubstFormat1
{
TRACE_APPLY ();
hb_codepoint_t glyph_id = c->buffer->info[c->buffer->i].codepoint;
+ hb_mask_t glyph_mask = c->buffer->info[c->buffer->i].mask;
+ hb_mask_t lookup_mask = c->lookup_mask;
unsigned int index = (this+coverage) (glyph_id);
if (likely (index == NOT_COVERED))
@@ -284,14 +286,8 @@ struct AlternateSubstFormat1
if (unlikely (!alt_set.len))
return false;
- unsigned int alt_index = 0;
-
- /* XXX callback to user to choose alternate
- if (c->layout->face->altfunc)
- alt_index = (c->layout->face->altfunc)(c->layout->layout, c->buffer,
- c->buffer->out_len, glyph_id,
- alt_set.len, alt_set.array);
- */
+ unsigned int shift = _hb_ctz (lookup_mask);
+ unsigned int alt_index = (lookup_mask & glyph_mask) >> shift;
if (unlikely (alt_index >= alt_set.len))
return false;
@@ -777,6 +773,7 @@ struct SubstLookup : Lookup
inline bool apply_once (hb_ot_layout_context_t *layout,
hb_buffer_t *buffer,
+ hb_mask_t lookup_mask,
unsigned int context_length,
unsigned int nesting_level_left) const
{
@@ -785,6 +782,7 @@ struct SubstLookup : Lookup
c->layout = layout;
c->buffer = buffer;
+ c->lookup_mask = lookup_mask;
c->context_length = context_length;
c->nesting_level_left = nesting_level_left;
c->lookup_flag = get_flag ();
@@ -831,7 +829,7 @@ struct SubstLookup : Lookup
while (buffer->i < buffer->len)
{
if ((buffer->info[buffer->i].mask & mask) &&
- apply_once (layout, buffer, NO_CONTEXT, MAX_NESTING_LEVEL))
+ apply_once (layout, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
ret = true;
else
buffer->next_glyph ();
@@ -847,7 +845,7 @@ struct SubstLookup : Lookup
do
{
if ((buffer->info[buffer->i].mask & mask) &&
- apply_once (layout, buffer, NO_CONTEXT, MAX_NESTING_LEVEL))
+ apply_once (layout, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
ret = true;
else
buffer->i--;
@@ -933,7 +931,7 @@ 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->layout, c->buffer, c->context_length, c->nesting_level_left - 1);
+ return l.apply_once (c->layout, c->buffer, c->lookup_mask, c->context_length, c->nesting_level_left - 1);
}
diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh
index 351285d..a3274b0 100644
--- a/src/hb-ot-layout-gsubgpos-private.hh
+++ b/src/hb-ot-layout-gsubgpos-private.hh
@@ -44,6 +44,7 @@ struct hb_apply_context_t
unsigned int debug_depth;
hb_ot_layout_context_t *layout;
hb_buffer_t *buffer;
+ hb_mask_t lookup_mask;
unsigned int context_length;
unsigned int nesting_level_left;
unsigned int lookup_flag;
diff --git a/src/hb-private.h b/src/hb-private.h
index 78d2bf1..6b0a957 100644
--- a/src/hb-private.h
+++ b/src/hb-private.h
@@ -156,7 +156,7 @@ static inline HB_CONST_FUNC unsigned int
_hb_bit_storage (unsigned int number)
{
#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
- return likely (number) ? (sizeof (unsigned int) * 8 - __builtin_clzl(number)) : 0;
+ return likely (number) ? (sizeof (unsigned int) * 8 - __builtin_clz (number)) : 0;
#else
register unsigned int n_bits = 0;
while (number) {
@@ -167,6 +167,23 @@ _hb_bit_storage (unsigned int number)
#endif
}
+/* Returns the number of zero bits in the least significant side of number */
+static inline HB_CONST_FUNC unsigned int
+_hb_ctz (unsigned int number)
+{
+#if defined(__GNUC__) && (__GNUC__ >= 4) && defined(__OPTIMIZE__)
+ return likely (number) ? __builtin_ctz (number) : 0;
+#else
+ register unsigned int n_bits = 0;
+ if (unlikely (!number)) return 0;
+ while (!(number & 1)) {
+ n_bits++;
+ number >>= 1;
+ }
+ return n_bits;
+#endif
+}
+
/* We need external help for these */
#ifdef HAVE_GLIB
More information about the HarfBuzz
mailing list