| Index: third_party/harfbuzz-ng/src/hb-utf-private.hh
|
| diff --git a/third_party/harfbuzz-ng/src/hb-utf-private.hh b/third_party/harfbuzz-ng/src/hb-utf-private.hh
|
| index 14d3c2e369b97e1241d16dee3e538750a37dd4b5..74cf5d66a29d4f2cc12abf6b1f75cf6f195ee694 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-utf-private.hh
|
| +++ b/third_party/harfbuzz-ng/src/hb-utf-private.hh
|
| @@ -146,11 +146,11 @@ struct hb_utf16_t
|
| return text;
|
| }
|
|
|
| - if (likely (hb_in_range (c, 0xD800u, 0xDBFFu)))
|
| + if (likely (c <= 0xDBFFu && text < end))
|
| {
|
| /* High-surrogate in c */
|
| - hb_codepoint_t l;
|
| - if (text < end && ((l = *text), likely (hb_in_range (l, 0xDC00u, 0xDFFFu))))
|
| + hb_codepoint_t l = *text;
|
| + if (likely (hb_in_range (l, 0xDC00u, 0xDFFFu)))
|
| {
|
| /* Low-surrogate in l */
|
| *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u);
|
| @@ -170,8 +170,7 @@ struct hb_utf16_t
|
| hb_codepoint_t *unicode,
|
| hb_codepoint_t replacement)
|
| {
|
| - const uint16_t *end = text--;
|
| - hb_codepoint_t c = *text;
|
| + hb_codepoint_t c = *--text;
|
|
|
| if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu)))
|
| {
|
| @@ -179,14 +178,22 @@ struct hb_utf16_t
|
| return text;
|
| }
|
|
|
| - if (likely (start < text && hb_in_range (c, 0xDC00u, 0xDFFFu)))
|
| - text--;
|
| -
|
| - if (likely (next (text, end, unicode, replacement) == end))
|
| - return text;
|
| + if (likely (c >= 0xDC00u && start < text))
|
| + {
|
| + /* Low-surrogate in c */
|
| + hb_codepoint_t h = text[-1];
|
| + if (likely (hb_in_range (h, 0xD800u, 0xDBFFu)))
|
| + {
|
| + /* High-surrogate in h */
|
| + *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u);
|
| + text--;
|
| + return text;
|
| + }
|
| + }
|
|
|
| + /* Lonely / out-of-order surrogate. */
|
| *unicode = replacement;
|
| - return end - 1;
|
| + return text;
|
| }
|
|
|
|
|
| @@ -211,14 +218,9 @@ struct hb_utf32_t
|
| hb_codepoint_t *unicode,
|
| hb_codepoint_t replacement)
|
| {
|
| - hb_codepoint_t c = *text++;
|
| - if (validate && unlikely (c > 0x10FFFFu || hb_in_range (c, 0xD800u, 0xDFFFu)))
|
| - goto error;
|
| - *unicode = c;
|
| - return text;
|
| -
|
| - error:
|
| - *unicode = replacement;
|
| + hb_codepoint_t c = *unicode = *text++;
|
| + if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
|
| + *unicode = replacement;
|
| return text;
|
| }
|
|
|
| @@ -228,8 +230,10 @@ struct hb_utf32_t
|
| hb_codepoint_t *unicode,
|
| hb_codepoint_t replacement)
|
| {
|
| - next (text - 1, text, unicode, replacement);
|
| - return text - 1;
|
| + hb_codepoint_t c = *unicode = *--text;
|
| + if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu)))
|
| + *unicode = replacement;
|
| + return text;
|
| }
|
|
|
| static inline unsigned int
|
|
|