Micro optimization to hb_utf16_t and hb_utf32_t ::prev()

Implement reverse lookup instead of re-using next()
This commit is contained in:
Konstantin Ritt 2015-11-07 02:00:04 +04:00
parent 44ae9be7a2
commit 529a933128
1 changed files with 19 additions and 10 deletions

View File

@ -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)))
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--;
if (likely (next (text, end, unicode, replacement) == end))
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