[icu] Remove support of ICU versions before 42
ICU 42 is released in 2012, see also 44a3136ae6 (commitcomment-41016353)
This commit is contained in:
parent
4ba8e3c6fd
commit
c9e5da8ded
109
src/hb-icu.cc
109
src/hb-icu.cc
|
@ -194,43 +194,11 @@ hb_icu_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
|
||||||
hb_codepoint_t *ab,
|
hb_codepoint_t *ab,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
#if U_ICU_VERSION_MAJOR_NUM >= 49
|
|
||||||
{
|
|
||||||
const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
|
const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
|
||||||
UChar32 ret = unorm2_composePair (normalizer, a, b);
|
UChar32 ret = unorm2_composePair (normalizer, a, b);
|
||||||
if (ret < 0) return false;
|
if (ret < 0) return false;
|
||||||
*ab = ret;
|
*ab = ret;
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We don't ifdef-out the fallback code such that compiler always
|
|
||||||
* sees it and makes sure it's compilable. */
|
|
||||||
|
|
||||||
UChar utf16[4], normalized[5];
|
|
||||||
unsigned int len;
|
|
||||||
hb_bool_t ret, err;
|
|
||||||
UErrorCode icu_err;
|
|
||||||
|
|
||||||
len = 0;
|
|
||||||
err = false;
|
|
||||||
U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), a, err);
|
|
||||||
if (err) return false;
|
|
||||||
U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), b, err);
|
|
||||||
if (err) return false;
|
|
||||||
|
|
||||||
icu_err = U_ZERO_ERROR;
|
|
||||||
len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
|
|
||||||
if (U_FAILURE (icu_err))
|
|
||||||
return false;
|
|
||||||
if (u_countChar32 (normalized, len) == 1) {
|
|
||||||
U16_GET_UNSAFE (normalized, 0, *ab);
|
|
||||||
ret = true;
|
|
||||||
} else {
|
|
||||||
ret = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_bool_t
|
static hb_bool_t
|
||||||
|
@ -240,8 +208,6 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
|
||||||
hb_codepoint_t *b,
|
hb_codepoint_t *b,
|
||||||
void *user_data HB_UNUSED)
|
void *user_data HB_UNUSED)
|
||||||
{
|
{
|
||||||
#if U_ICU_VERSION_MAJOR_NUM >= 49
|
|
||||||
{
|
|
||||||
const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
|
const UNormalizer2 *normalizer = (const UNormalizer2 *) user_data;
|
||||||
UChar decomposed[4];
|
UChar decomposed[4];
|
||||||
int len;
|
int len;
|
||||||
|
@ -251,84 +217,19 @@ hb_icu_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
|
||||||
if (U_FAILURE (icu_err) || len < 0) return false;
|
if (U_FAILURE (icu_err) || len < 0) return false;
|
||||||
|
|
||||||
len = u_countChar32 (decomposed, len);
|
len = u_countChar32 (decomposed, len);
|
||||||
if (len == 1) {
|
if (len == 1)
|
||||||
|
{
|
||||||
U16_GET_UNSAFE (decomposed, 0, *a);
|
U16_GET_UNSAFE (decomposed, 0, *a);
|
||||||
*b = 0;
|
*b = 0;
|
||||||
return *a != ab;
|
return *a != ab;
|
||||||
} else if (len == 2) {
|
}
|
||||||
|
else if (len == 2)
|
||||||
|
{
|
||||||
len = 0;
|
len = 0;
|
||||||
U16_NEXT_UNSAFE (decomposed, len, *a);
|
U16_NEXT_UNSAFE (decomposed, len, *a);
|
||||||
U16_NEXT_UNSAFE (decomposed, len, *b);
|
U16_NEXT_UNSAFE (decomposed, len, *b);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* We don't ifdef-out the fallback code such that compiler always
|
|
||||||
* sees it and makes sure it's compilable. */
|
|
||||||
|
|
||||||
UChar utf16[2], normalized[2 * 19/*HB_UNICODE_MAX_DECOMPOSITION_LEN*/ + 1];
|
|
||||||
unsigned int len;
|
|
||||||
hb_bool_t ret, err;
|
|
||||||
UErrorCode icu_err;
|
|
||||||
|
|
||||||
/* This function is a monster! Maybe it wasn't a good idea adding a
|
|
||||||
* pairwise decompose API... */
|
|
||||||
/* Watchout for the dragons. Err, watchout for macros changing len. */
|
|
||||||
|
|
||||||
len = 0;
|
|
||||||
err = false;
|
|
||||||
U16_APPEND (utf16, len, ARRAY_LENGTH (utf16), ab, err);
|
|
||||||
if (err) return false;
|
|
||||||
|
|
||||||
icu_err = U_ZERO_ERROR;
|
|
||||||
len = unorm2_normalize (unorm2_getNFDInstance (&icu_err), utf16, len, normalized, ARRAY_LENGTH (normalized), &icu_err);
|
|
||||||
if (U_FAILURE (icu_err))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
len = u_countChar32 (normalized, len);
|
|
||||||
|
|
||||||
if (len == 1) {
|
|
||||||
U16_GET_UNSAFE (normalized, 0, *a);
|
|
||||||
*b = 0;
|
|
||||||
ret = *a != ab;
|
|
||||||
} else if (len == 2) {
|
|
||||||
len = 0;
|
|
||||||
U16_NEXT_UNSAFE (normalized, len, *a);
|
|
||||||
U16_NEXT_UNSAFE (normalized, len, *b);
|
|
||||||
|
|
||||||
/* Here's the ugly part: if ab decomposes to a single character and
|
|
||||||
* that character decomposes again, we have to detect that and undo
|
|
||||||
* the second part :-(. */
|
|
||||||
UChar recomposed[20];
|
|
||||||
icu_err = U_ZERO_ERROR;
|
|
||||||
unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
|
|
||||||
if (U_FAILURE (icu_err))
|
|
||||||
return false;
|
|
||||||
hb_codepoint_t c;
|
|
||||||
U16_GET_UNSAFE (recomposed, 0, c);
|
|
||||||
if (c != *a && c != ab) {
|
|
||||||
*a = c;
|
|
||||||
*b = 0;
|
|
||||||
}
|
|
||||||
ret = true;
|
|
||||||
} else {
|
|
||||||
/* If decomposed to more than two characters, take the last one,
|
|
||||||
* and recompose the rest to get the first component. */
|
|
||||||
U16_PREV_UNSAFE (normalized, len, *b); /* Changes len in-place. */
|
|
||||||
UChar recomposed[18 * 2];
|
|
||||||
icu_err = U_ZERO_ERROR;
|
|
||||||
len = unorm2_normalize (unorm2_getNFCInstance (&icu_err), normalized, len, recomposed, ARRAY_LENGTH (recomposed), &icu_err);
|
|
||||||
if (U_FAILURE (icu_err))
|
|
||||||
return false;
|
|
||||||
/* We expect that recomposed has exactly one character now. */
|
|
||||||
if (unlikely (u_countChar32 (recomposed, len) != 1))
|
|
||||||
return false;
|
|
||||||
U16_GET_UNSAFE (recomposed, 0, *a);
|
|
||||||
ret = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue