src/hb-utf-private.hh | 46 +++++++++++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 21 deletions(-)
New commits: commit d5f0d7c9fb14255388ab616f56e178cb7ca10ec2 Merge: 04ff23e 529a933 Author: Behdad Esfahbod <[email protected]> Date: Sat Nov 7 07:50:58 2015 -0800 Merge pull request #167 from KonstantinRitt/unicode_cp_opt Micro optimizations to UTF-16 and UTF-32 codecs commit 529a93312815dff3c2f37f880bf6ccb428bd3da0 Author: Konstantin Ritt <[email protected]> Date: Sat Nov 7 02:00:04 2015 +0400 Micro optimization to hb_utf16_t and hb_utf32_t ::prev() Implement reverse lookup instead of re-using next() diff --git a/src/hb-utf-private.hh b/src/hb-utf-private.hh index dfdcab2..74cf5d6 100644 --- a/src/hb-utf-private.hh +++ b/src/hb-utf-private.hh @@ -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; } @@ -223,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 commit 44ae9be7a29eebd6003cad2fdb90b40512a9c8eb Author: Konstantin Ritt <[email protected]> Date: Sat Nov 7 01:58:38 2015 +0400 Nano optimization to hb_utf16_t and hb_utf32_t ::next() diff --git a/src/hb-utf-private.hh b/src/hb-utf-private.hh index 14d3c2e..dfdcab2 100644 --- a/src/hb-utf-private.hh +++ b/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); @@ -211,14 +211,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; } _______________________________________________ HarfBuzz mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/harfbuzz
