| Index: third_party/harfbuzz-ng/src/hb-ot-cmap-table.hh
|
| diff --git a/third_party/harfbuzz-ng/src/hb-ot-cmap-table.hh b/third_party/harfbuzz-ng/src/hb-ot-cmap-table.hh
|
| index c9161f0ef4c641cce35cbf3d9efa4dd7220cb985..d7a94a1ef0feb7d7c1af90ad4e8a549b07332804 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-cmap-table.hh
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-cmap-table.hh
|
| @@ -69,61 +69,78 @@ struct CmapSubtableFormat0
|
|
|
| struct CmapSubtableFormat4
|
| {
|
| - inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
|
| + struct accelerator_t
|
| {
|
| - unsigned int segCount;
|
| - const USHORT *endCount;
|
| - const USHORT *startCount;
|
| - const USHORT *idDelta;
|
| - const USHORT *idRangeOffset;
|
| - const USHORT *glyphIdArray;
|
| - unsigned int glyphIdArrayLength;
|
| + inline void init (const CmapSubtableFormat4 *subtable)
|
| + {
|
| + segCount = subtable->segCountX2 / 2;
|
| + endCount = subtable->values;
|
| + startCount = endCount + segCount + 1;
|
| + idDelta = startCount + segCount;
|
| + idRangeOffset = idDelta + segCount;
|
| + glyphIdArray = idRangeOffset + segCount;
|
| + glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2;
|
| + }
|
|
|
| - segCount = this->segCountX2 / 2;
|
| - endCount = this->values;
|
| - startCount = endCount + segCount + 1;
|
| - idDelta = startCount + segCount;
|
| - idRangeOffset = idDelta + segCount;
|
| - glyphIdArray = idRangeOffset + segCount;
|
| - glyphIdArrayLength = (this->length - 16 - 8 * segCount) / 2;
|
| -
|
| - /* Custom two-array bsearch. */
|
| - int min = 0, max = (int) segCount - 1;
|
| - unsigned int i;
|
| - while (min <= max)
|
| + static inline bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph)
|
| {
|
| - int mid = (min + max) / 2;
|
| - if (codepoint < startCount[mid])
|
| - max = mid - 1;
|
| - else if (codepoint > endCount[mid])
|
| - min = mid + 1;
|
| + const accelerator_t *thiz = (const accelerator_t *) obj;
|
| +
|
| + /* Custom two-array bsearch. */
|
| + int min = 0, max = (int) thiz->segCount - 1;
|
| + const USHORT *startCount = thiz->startCount;
|
| + const USHORT *endCount = thiz->endCount;
|
| + unsigned int i;
|
| + while (min <= max)
|
| + {
|
| + int mid = (min + max) / 2;
|
| + if (codepoint < startCount[mid])
|
| + max = mid - 1;
|
| + else if (codepoint > endCount[mid])
|
| + min = mid + 1;
|
| + else
|
| + {
|
| + i = mid;
|
| + goto found;
|
| + }
|
| + }
|
| + return false;
|
| +
|
| + found:
|
| + hb_codepoint_t gid;
|
| + unsigned int rangeOffset = thiz->idRangeOffset[i];
|
| + if (rangeOffset == 0)
|
| + gid = codepoint + thiz->idDelta[i];
|
| else
|
| {
|
| - i = mid;
|
| - goto found;
|
| + /* Somebody has been smoking... */
|
| + unsigned int index = rangeOffset / 2 + (codepoint - thiz->startCount[i]) + i - thiz->segCount;
|
| + if (unlikely (index >= thiz->glyphIdArrayLength))
|
| + return false;
|
| + gid = thiz->glyphIdArray[index];
|
| + if (unlikely (!gid))
|
| + return false;
|
| + gid += thiz->idDelta[i];
|
| }
|
| - }
|
| - return false;
|
| -
|
| - found:
|
| - hb_codepoint_t gid;
|
| - unsigned int rangeOffset = idRangeOffset[i];
|
| - if (rangeOffset == 0)
|
| - gid = codepoint + idDelta[i];
|
| - else
|
| - {
|
| - /* Somebody has been smoking... */
|
| - unsigned int index = rangeOffset / 2 + (codepoint - startCount[i]) + i - segCount;
|
| - if (unlikely (index >= glyphIdArrayLength))
|
| - return false;
|
| - gid = glyphIdArray[index];
|
| - if (unlikely (!gid))
|
| - return false;
|
| - gid += idDelta[i];
|
| +
|
| + *glyph = gid & 0xFFFFu;
|
| + return true;
|
| }
|
|
|
| - *glyph = gid & 0xFFFFu;
|
| - return true;
|
| + const USHORT *endCount;
|
| + const USHORT *startCount;
|
| + const USHORT *idDelta;
|
| + const USHORT *idRangeOffset;
|
| + const USHORT *glyphIdArray;
|
| + unsigned int segCount;
|
| + unsigned int glyphIdArrayLength;
|
| + };
|
| +
|
| + inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const
|
| + {
|
| + accelerator_t accel;
|
| + accel.init (this);
|
| + return accel.get_glyph_func (&accel, codepoint, glyph);
|
| }
|
|
|
| inline bool sanitize (hb_sanitize_context_t *c) const
|
| @@ -388,7 +405,7 @@ struct CmapSubtableFormat14
|
| }
|
|
|
| protected:
|
| - USHORT format; /* Format number is set to 0. */
|
| + USHORT format; /* Format number is set to 14. */
|
| ULONG lengthZ; /* Byte length of this subtable. */
|
| SortedArrayOf<VariationSelectorRecord, ULONG>
|
| record; /* Variation selector records; sorted
|
| @@ -416,16 +433,6 @@ struct CmapSubtable
|
| }
|
| }
|
|
|
| - inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint,
|
| - hb_codepoint_t variation_selector,
|
| - hb_codepoint_t *glyph) const
|
| - {
|
| - switch (u.format) {
|
| - case 14: return u.format14.get_glyph_variant(codepoint, variation_selector, glyph);
|
| - default: return GLYPH_VARIANT_NOT_FOUND;
|
| - }
|
| - }
|
| -
|
| inline bool sanitize (hb_sanitize_context_t *c) const
|
| {
|
| TRACE_SANITIZE (this);
|
| @@ -442,7 +449,7 @@ struct CmapSubtable
|
| }
|
| }
|
|
|
| - protected:
|
| + public:
|
| union {
|
| USHORT format; /* Format identifier */
|
| CmapSubtableFormat0 format0;
|
|
|