uint32_t utf16_to_code_point(const uint16_t *chars, size_t len, ssize_t *iter) { const uint16_t v = chars[(*iter)++]; if (HB_IsHighSurrogate(v)) { // surrogate pair if (*iter >= len) { // the surrogate is incomplete. return HB_InvalidCodePoint; } const uint16_t v2 = chars[(*iter)++]; if (!HB_IsLowSurrogate(v2)) { // invalidate surrogate pair. return HB_InvalidCodePoint; } return HB_SurrogateToUcs4(v, v2); } if (HB_IsLowSurrogate(v)) { // this isn't a valid code point return HB_InvalidCodePoint; } return v; }
static HB_UChar32 getChar(const HB_UChar16 *string, hb_uint32 length, hb_uint32 &i) { HB_UChar32 ch; if (HB_IsHighSurrogate(string[i]) && i < length - 1 && HB_IsLowSurrogate(string[i + 1])) { ch = HB_SurrogateToUcs4(string[i], string[i + 1]); ++i; } else { ch = string[i]; } return ch; }