| Index: third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
|
| diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
|
| similarity index 86%
|
| rename from third_party/harfbuzz-ng/src/hb-ot-layout-gsub-private.hh
|
| rename to third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
|
| index ae1c5f3c5fdbdd12f61d779bda0f0a800ab0a4e6..f7ec3cc0f1a92b776a128ca5d6d23bacfbbe72fd 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-private.hh
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-layout-gsub-table.hh
|
| @@ -1,6 +1,6 @@
|
| /*
|
| - * Copyright (C) 2007,2008,2009,2010 Red Hat, Inc.
|
| - * Copyright (C) 2010 Google, Inc.
|
| + * Copyright © 2007,2008,2009,2010 Red Hat, Inc.
|
| + * Copyright © 2010 Google, Inc.
|
| *
|
| * This is part of HarfBuzz, a text shaping library.
|
| *
|
| @@ -26,12 +26,11 @@
|
| * Google Author(s): Behdad Esfahbod
|
| */
|
|
|
| -#ifndef HB_OT_LAYOUT_GSUB_PRIVATE_HH
|
| -#define HB_OT_LAYOUT_GSUB_PRIVATE_HH
|
| +#ifndef HB_OT_LAYOUT_GSUB_TABLE_HH
|
| +#define HB_OT_LAYOUT_GSUB_TABLE_HH
|
|
|
| #include "hb-ot-layout-gsubgpos-private.hh"
|
|
|
| -HB_BEGIN_DECLS
|
|
|
|
|
| struct SingleSubstFormat1
|
| @@ -43,12 +42,14 @@ struct SingleSubstFormat1
|
| inline bool apply (hb_apply_context_t *c) const
|
| {
|
| TRACE_APPLY ();
|
| - hb_codepoint_t glyph_id = c->buffer->info[c->buffer->i].codepoint;
|
| + hb_codepoint_t glyph_id = c->buffer->info[c->buffer->idx].codepoint;
|
| unsigned int index = (this+coverage) (glyph_id);
|
| if (likely (index == NOT_COVERED))
|
| return false;
|
|
|
| - glyph_id += deltaGlyphID;
|
| + /* According to the Adobe Annotated OpenType Suite, result is always
|
| + * limited to 16bit. */
|
| + glyph_id = (glyph_id + deltaGlyphID) & 0xFFFF;
|
| c->replace_glyph (glyph_id);
|
|
|
| return true;
|
| @@ -80,7 +81,7 @@ struct SingleSubstFormat2
|
| inline bool apply (hb_apply_context_t *c) const
|
| {
|
| TRACE_APPLY ();
|
| - hb_codepoint_t glyph_id = c->buffer->info[c->buffer->i].codepoint;
|
| + hb_codepoint_t glyph_id = c->buffer->info[c->buffer->idx].codepoint;
|
| unsigned int index = (this+coverage) (glyph_id);
|
| if (likely (index == NOT_COVERED))
|
| return false;
|
| @@ -188,7 +189,7 @@ struct MultipleSubstFormat1
|
| {
|
| TRACE_APPLY ();
|
|
|
| - unsigned int index = (this+coverage) (c->buffer->info[c->buffer->i].codepoint);
|
| + unsigned int index = (this+coverage) (c->buffer->info[c->buffer->idx].codepoint);
|
| if (likely (index == NOT_COVERED))
|
| return false;
|
|
|
| @@ -257,8 +258,8 @@ struct AlternateSubstFormat1
|
| inline bool apply (hb_apply_context_t *c) const
|
| {
|
| 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_codepoint_t glyph_id = c->buffer->info[c->buffer->idx].codepoint;
|
| + hb_mask_t glyph_mask = c->buffer->info[c->buffer->idx].mask;
|
| hb_mask_t lookup_mask = c->lookup_mask;
|
|
|
| unsigned int index = (this+coverage) (glyph_id);
|
| @@ -342,28 +343,27 @@ struct Ligature
|
| inline bool apply (hb_apply_context_t *c) const
|
| {
|
| TRACE_APPLY ();
|
| - unsigned int i, j;
|
| unsigned int count = component.len;
|
| - unsigned int end = MIN (c->buffer->len, c->buffer->i + c->context_length);
|
| - if (unlikely (count < 2 || c->buffer->i + count > end))
|
| + if (unlikely (count < 2))
|
| + return false;
|
| +
|
| + hb_apply_context_t::mark_skipping_forward_iterator_t skippy_iter (c, c->buffer->idx, count - 1);
|
| + if (skippy_iter.has_no_chance ())
|
| return false;
|
|
|
| bool first_was_mark = (c->property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
|
| bool found_non_mark = false;
|
|
|
| - for (i = 1, j = c->buffer->i + 1; i < count; i++, j++)
|
| + for (unsigned int i = 1; i < count; i++)
|
| {
|
| unsigned int property;
|
| - while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[j], c->lookup_props, &property))
|
| - {
|
| - if (unlikely (j + count - i == end))
|
| - return false;
|
| - j++;
|
| - }
|
| +
|
| + if (!skippy_iter.next (&property))
|
| + return false;
|
|
|
| found_non_mark |= !(property & HB_OT_LAYOUT_GLYPH_CLASS_MARK);
|
|
|
| - if (likely (c->buffer->info[j].codepoint != component[i]))
|
| + if (likely (c->buffer->info[skippy_iter.idx].codepoint != component[i]))
|
| return false;
|
| }
|
|
|
| @@ -372,12 +372,12 @@ struct Ligature
|
|
|
| /* Allocate new ligature id */
|
| unsigned int lig_id = allocate_lig_id (c->buffer);
|
| - c->buffer->info[c->buffer->i].lig_comp() = 0;
|
| - c->buffer->info[c->buffer->i].lig_id() = lig_id;
|
| + c->buffer->info[c->buffer->idx].lig_comp() = 0;
|
| + c->buffer->info[c->buffer->idx].lig_id() = lig_id;
|
|
|
| - if (j == c->buffer->i + i) /* No input glyphs skipped */
|
| + if (skippy_iter.idx < c->buffer->idx + count) /* No input glyphs skipped */
|
| {
|
| - c->replace_glyphs_be16 (i, 1, (const uint16_t *) &ligGlyph);
|
| + c->replace_glyphs_be16 (count, 1, (const uint16_t *) &ligGlyph);
|
| }
|
| else
|
| {
|
| @@ -390,29 +390,23 @@ struct Ligature
|
| value it is later possible to check whether a specific
|
| component value really belongs to a given ligature. */
|
|
|
| - for (i = 1; i < count; i++)
|
| + for (unsigned int i = 1; i < count; i++)
|
| {
|
| - while (_hb_ot_layout_skip_mark (c->layout->face, &c->buffer->info[c->buffer->i], c->lookup_props, NULL))
|
| + while (c->should_mark_skip_current_glyph ())
|
| {
|
| - c->buffer->info[c->buffer->i].lig_comp() = i;
|
| - c->buffer->info[c->buffer->i].lig_id() = lig_id;
|
| - c->replace_glyph (c->buffer->info[c->buffer->i].codepoint);
|
| + c->buffer->info[c->buffer->idx].lig_comp() = i;
|
| + c->buffer->info[c->buffer->idx].lig_id() = lig_id;
|
| + c->replace_glyph (c->buffer->info[c->buffer->idx].codepoint);
|
| }
|
|
|
| /* Skip the base glyph */
|
| - c->buffer->i++;
|
| + c->buffer->idx++;
|
| }
|
| }
|
|
|
| return true;
|
| }
|
|
|
| - inline uint16_t allocate_lig_id (hb_buffer_t *buffer) const {
|
| - uint16_t lig_id = buffer->next_serial ();
|
| - if (unlikely (!lig_id)) lig_id = buffer->next_serial (); /* in case of overflows */
|
| - return lig_id;
|
| - }
|
| -
|
| public:
|
| inline bool sanitize (hb_sanitize_context_t *c) {
|
| TRACE_SANITIZE ();
|
| @@ -471,7 +465,7 @@ struct LigatureSubstFormat1
|
| inline bool apply (hb_apply_context_t *c) const
|
| {
|
| TRACE_APPLY ();
|
| - hb_codepoint_t glyph_id = c->buffer->info[c->buffer->i].codepoint;
|
| + hb_codepoint_t glyph_id = c->buffer->info[c->buffer->idx].codepoint;
|
|
|
| unsigned int index = (this+coverage) (glyph_id);
|
| if (likely (index == NOT_COVERED))
|
| @@ -530,9 +524,7 @@ struct LigatureSubst
|
| };
|
|
|
|
|
| -HB_BEGIN_DECLS
|
| static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index);
|
| -HB_END_DECLS
|
|
|
| struct ContextSubst : Context
|
| {
|
| @@ -591,7 +583,7 @@ struct ReverseChainSingleSubstFormat1
|
| if (unlikely (c->context_length != NO_CONTEXT))
|
| return false; /* No chaining to this type */
|
|
|
| - unsigned int index = (this+coverage) (c->buffer->info[c->buffer->i].codepoint);
|
| + unsigned int index = (this+coverage) (c->buffer->info[c->buffer->idx].codepoint);
|
| if (likely (index == NOT_COVERED))
|
| return false;
|
|
|
| @@ -606,8 +598,8 @@ struct ReverseChainSingleSubstFormat1
|
| match_coverage, this,
|
| 1))
|
| {
|
| - c->buffer->info[c->buffer->i].codepoint = substitute[index];
|
| - c->buffer->i--; /* Reverse! */
|
| + c->buffer->info[c->buffer->idx].codepoint = substitute[index];
|
| + c->buffer->idx--; /* Reverse! */
|
| return true;
|
| }
|
|
|
| @@ -762,7 +754,7 @@ struct SubstLookup : Lookup
|
| }
|
|
|
|
|
| - inline bool apply_once (hb_ot_layout_context_t *layout,
|
| + inline bool apply_once (hb_face_t *face,
|
| hb_buffer_t *buffer,
|
| hb_mask_t lookup_mask,
|
| unsigned int context_length,
|
| @@ -771,14 +763,15 @@ struct SubstLookup : Lookup
|
| unsigned int lookup_type = get_type ();
|
| hb_apply_context_t c[1] = {{0}};
|
|
|
| - c->layout = layout;
|
| + 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->layout->face, &c->buffer->info[c->buffer->i], c->lookup_props, &c->property))
|
| + if (!_hb_ot_layout_check_glyph_property (c->face, &c->buffer->info[c->buffer->idx], c->lookup_props, &c->property))
|
| return false;
|
|
|
| if (unlikely (lookup_type == SubstLookupSubTable::Extension))
|
| @@ -803,7 +796,7 @@ struct SubstLookup : Lookup
|
| return false;
|
| }
|
|
|
| - inline bool apply_string (hb_ot_layout_context_t *layout,
|
| + inline bool apply_string (hb_face_t *face,
|
| hb_buffer_t *buffer,
|
| hb_mask_t mask) const
|
| {
|
| @@ -816,33 +809,33 @@ struct SubstLookup : Lookup
|
| {
|
| /* in/out forward substitution */
|
| buffer->clear_output ();
|
| - buffer->i = 0;
|
| - while (buffer->i < buffer->len)
|
| + buffer->idx = 0;
|
| + while (buffer->idx < buffer->len)
|
| {
|
| - if ((buffer->info[buffer->i].mask & mask) &&
|
| - apply_once (layout, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
|
| + if ((buffer->info[buffer->idx].mask & mask) &&
|
| + apply_once (face, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
|
| ret = true;
|
| else
|
| buffer->next_glyph ();
|
|
|
| }
|
| if (ret)
|
| - buffer->swap ();
|
| + buffer->swap_buffers ();
|
| }
|
| else
|
| {
|
| /* in-place backward substitution */
|
| - buffer->i = buffer->len - 1;
|
| + buffer->idx = buffer->len - 1;
|
| do
|
| {
|
| - if ((buffer->info[buffer->i].mask & mask) &&
|
| - apply_once (layout, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
|
| + if ((buffer->info[buffer->idx].mask & mask) &&
|
| + apply_once (face, buffer, mask, NO_CONTEXT, MAX_NESTING_LEVEL))
|
| ret = true;
|
| else
|
| - buffer->i--;
|
| + buffer->idx--;
|
|
|
| }
|
| - while ((int) buffer->i >= 0);
|
| + while ((int) buffer->idx >= 0);
|
| }
|
|
|
| return ret;
|
| @@ -859,7 +852,7 @@ struct SubstLookup : Lookup
|
| typedef OffsetListOf<SubstLookup> SubstLookupList;
|
|
|
| /*
|
| - * GSUB
|
| + * GSUB -- The Glyph Substitution Table
|
| */
|
|
|
| struct GSUB : GSUBGPOS
|
| @@ -869,11 +862,14 @@ struct GSUB : GSUBGPOS
|
| inline const SubstLookup& get_lookup (unsigned int i) const
|
| { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); }
|
|
|
| - inline bool substitute_lookup (hb_ot_layout_context_t *layout,
|
| + inline bool substitute_lookup (hb_face_t *face,
|
| hb_buffer_t *buffer,
|
| unsigned int lookup_index,
|
| hb_mask_t mask) const
|
| - { return get_lookup (lookup_index).apply_string (layout, buffer, mask); }
|
| + { return get_lookup (lookup_index).apply_string (face, buffer, mask); }
|
| +
|
| + static inline void substitute_start (hb_buffer_t *buffer);
|
| + static inline void substitute_finish (hb_buffer_t *buffer);
|
|
|
| inline bool sanitize (hb_sanitize_context_t *c) {
|
| TRACE_SANITIZE ();
|
| @@ -886,6 +882,24 @@ struct GSUB : GSUBGPOS
|
| };
|
|
|
|
|
| +void
|
| +GSUB::substitute_start (hb_buffer_t *buffer)
|
| +{
|
| + HB_BUFFER_ALLOCATE_VAR (buffer, props_cache);
|
| + HB_BUFFER_ALLOCATE_VAR (buffer, lig_id);
|
| + HB_BUFFER_ALLOCATE_VAR (buffer, lig_comp);
|
| +
|
| + unsigned int count = buffer->len;
|
| + for (unsigned int i = 0; i < count; i++)
|
| + buffer->info[i].props_cache() = buffer->info[i].lig_id() = buffer->info[i].lig_comp() = 0;
|
| +}
|
| +
|
| +void
|
| +GSUB::substitute_finish (hb_buffer_t *buffer)
|
| +{
|
| +}
|
| +
|
| +
|
| /* Out-of-class implementation for methods recursing */
|
|
|
| inline bool ExtensionSubst::apply (hb_apply_context_t *c) const
|
| @@ -913,7 +927,7 @@ inline bool ExtensionSubst::is_reverse (void) const
|
|
|
| static inline bool substitute_lookup (hb_apply_context_t *c, unsigned int lookup_index)
|
| {
|
| - const GSUB &gsub = *(c->layout->face->ot_layout->gsub);
|
| + const GSUB &gsub = *(c->face->ot_layout->gsub);
|
| const SubstLookup &l = gsub.get_lookup (lookup_index);
|
|
|
| if (unlikely (c->nesting_level_left == 0))
|
| @@ -922,10 +936,9 @@ 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->lookup_mask, c->context_length, c->nesting_level_left - 1);
|
| + return l.apply_once (c->face, c->buffer, c->lookup_mask, c->context_length, c->nesting_level_left - 1);
|
| }
|
|
|
|
|
| -HB_END_DECLS
|
|
|
| -#endif /* HB_OT_LAYOUT_GSUB_PRIVATE_HH */
|
| +#endif /* HB_OT_LAYOUT_GSUB_TABLE_HH */
|
|
|