Wine-devel
Threads by month
- ----- 2026 -----
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
February 2019
- 73 participants
- 737 discussions
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/kernel32/locale.c | 4 ++--
dlls/kernel32/tests/locale.c | 44 ++++++++++++++++++------------------
include/wine/unicode.h | 1 +
libs/port/normalize.c | 35 ++++++++++++++++++++++++++++
4 files changed, 60 insertions(+), 24 deletions(-)
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index f2455bd72e..9f539ddd53 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -5407,8 +5407,8 @@ INT WINAPI NormalizeString(NORM_FORM form, const WCHAR *src, INT src_len, WCHAR
if (compose)
{
- FIXME("Composing not yet implemented\n");
- res = 0;
+ res = wine_compose_string( buf, res );
+ if (dst_len >= res) memcpy( dst, buf, res * sizeof(WCHAR) );
}
done:
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index d877c65ec6..0c05311a20 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -5697,28 +5697,28 @@ static void test_NormalizeString(void)
};
static const struct test_data_normal test_arr[] =
{
- { part0_str1, { part0_str1, part0_nfd1, part0_str1, part0_nfd1 }, { 1, 0, 1, 0 } },
- { part0_str2, { part0_nfc2, part0_str2, part0_nfc2, part0_str2 }, { 1, 0, 1, 0 } },
- { part0_str3, { part0_nfc3, part0_str3, part0_nfc3, part0_str3 }, { 1, 0, 1, 0 } },
- { part0_str4, { part0_nfc4, part0_str4, part0_nfc4, part0_str4 }, { 1, 0, 1, 0 } },
- { part0_str5, { part0_nfc5, part0_nfc5, part0_nfc5, part0_nfc5 }, { 1, 0, 1, 0 } },
- { part0_str6, { part0_nfc6, part0_nfc6, part0_nfc6, part0_nfc6 }, { 1, 0, 1, 0 } },
- { part0_str8, { part0_str8, part0_nfd8, part0_str8, part0_nfd8 }, { 1, 0, 1, 0 } },
- { part0_str9, { part0_nfc9, part0_nfd9, part0_nfc9, part0_nfd9 }, { 1, 0, 1, 0 } },
- { part0_str10, { part0_str10, part0_nfd10, part0_str10, part0_nfd10 }, { 1, 0, 1, 0 } },
- { part0_str11, { part0_str11, part0_nfd11, part0_str11, part0_nfd11 }, { 1, 0, 1, 0 } },
- { part0_str12, { part0_nfc12, part0_nfd12, part0_nfc12, part0_nfd12 }, { 1, 0, 1, 0 } },
- { part1_str1, { part1_str1, part1_str1, part1_nfkc1, part1_nfkc1 }, { 1, 0, 1, 0 } },
- { part1_str2, { part1_str2, part1_str2, part1_nfkc2, part1_nfkc2 }, { 1, 0, 1, 0 } },
- { part1_str3, { part1_str3, part1_nfd3, part1_str3, part1_nfd3 }, { 1, 0, 1, 0 } },
- { part1_str4, { part1_str4, part1_str4, part1_nfkc4, part1_nfkc4 }, { 1, 0, 1, 0 } },
- { part1_str5, { part1_str5, part1_nfd5, part1_str5, part1_nfd5 }, { 1, 0, 1, 0 } },
- { part1_str6, { part1_str6, part1_nfd6, part1_str6, part1_nfd6 }, { 1, 0, 1, 0 } },
- { part1_str7, { part1_str7, part1_str7, part1_nfkc7, part1_nfkc7 }, { 1, 0, 1, 0 } },
- { part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 }, { 1, 0, 1, 0 } },
- { part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 }, { 1, 0, 1, 0 } },
- { part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 }, { 1, 0, 1, 0 } },
- { part1_str11, { part1_nfc11, part1_nfd11, part1_nfc11, part1_nfd11 }, { 1, 0, 1, 0 } },
+ { part0_str1, { part0_str1, part0_nfd1, part0_str1, part0_nfd1 } },
+ { part0_str2, { part0_nfc2, part0_str2, part0_nfc2, part0_str2 } },
+ { part0_str3, { part0_nfc3, part0_str3, part0_nfc3, part0_str3 } },
+ { part0_str4, { part0_nfc4, part0_str4, part0_nfc4, part0_str4 } },
+ { part0_str5, { part0_nfc5, part0_nfc5, part0_nfc5, part0_nfc5 } },
+ { part0_str6, { part0_nfc6, part0_nfc6, part0_nfc6, part0_nfc6 } },
+ { part0_str8, { part0_str8, part0_nfd8, part0_str8, part0_nfd8 } },
+ { part0_str9, { part0_nfc9, part0_nfd9, part0_nfc9, part0_nfd9 } },
+ { part0_str10, { part0_str10, part0_nfd10, part0_str10, part0_nfd10 } },
+ { part0_str11, { part0_str11, part0_nfd11, part0_str11, part0_nfd11 } },
+ { part0_str12, { part0_nfc12, part0_nfd12, part0_nfc12, part0_nfd12 } },
+ { part1_str1, { part1_str1, part1_str1, part1_nfkc1, part1_nfkc1 } },
+ { part1_str2, { part1_str2, part1_str2, part1_nfkc2, part1_nfkc2 } },
+ { part1_str3, { part1_str3, part1_nfd3, part1_str3, part1_nfd3 } },
+ { part1_str4, { part1_str4, part1_str4, part1_nfkc4, part1_nfkc4 } },
+ { part1_str5, { part1_str5, part1_nfd5, part1_str5, part1_nfd5 } },
+ { part1_str6, { part1_str6, part1_nfd6, part1_str6, part1_nfd6 } },
+ { part1_str7, { part1_str7, part1_str7, part1_nfkc7, part1_nfkc7 } },
+ { part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 } },
+ { part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 } },
+ { part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 } },
+ { part1_str11, { part1_nfc11, part1_nfd11, part1_nfc11, part1_nfd11 } },
{ 0 }
};
const struct test_data_normal *ptest = test_arr;
diff --git a/include/wine/unicode.h b/include/wine/unicode.h
index 2c21cdfe48..a4b483a0e9 100644
--- a/include/wine/unicode.h
+++ b/include/wine/unicode.h
@@ -101,6 +101,7 @@ extern int wine_compare_string( int flags, const WCHAR *str1, int len1, const WC
extern int wine_get_sortkey( int flags, const WCHAR *src, int srclen, char *dst, int dstlen );
extern int wine_fold_string( int flags, const WCHAR *src, int srclen , WCHAR *dst, int dstlen );
+extern unsigned int wine_compose_string( WCHAR *str, unsigned int len );
extern unsigned int wine_decompose_string( int flags, const WCHAR *src, unsigned int srclen, WCHAR *dst, unsigned int dstlen );
#define WINE_DECOMPOSE_COMPAT 1
#define WINE_DECOMPOSE_REORDER 2
diff --git a/libs/port/normalize.c b/libs/port/normalize.c
index 8363eee98e..954a33cfdf 100644
--- a/libs/port/normalize.c
+++ b/libs/port/normalize.c
@@ -20,6 +20,7 @@
#include "wine/unicode.h"
+extern WCHAR wine_compose( const WCHAR *str ) DECLSPEC_HIDDEN;
extern unsigned int wine_decompose( int flags, WCHAR ch, WCHAR *dst, unsigned int dstlen ) DECLSPEC_HIDDEN;
extern const unsigned short combining_class_table[] DECLSPEC_HIDDEN;
@@ -104,3 +105,37 @@ unsigned int wine_decompose_string( int flags, const WCHAR *src, unsigned int sr
if (flags & WINE_DECOMPOSE_REORDER) canonical_order_string( dst, dst_pos );
return dst_pos;
}
+
+static BOOL is_blocked( WCHAR *starter, WCHAR *ptr )
+{
+ if (ptr == starter + 1) return FALSE;
+ /* Because the string is already canonically ordered, the chars are blocked
+ only if the previous char's combining class is equal to the test char. */
+ if (get_combining_class( *(ptr - 1) ) == get_combining_class( *ptr )) return TRUE;
+ return FALSE;
+}
+
+unsigned int wine_compose_string( WCHAR *str, unsigned int len )
+{
+ unsigned int i, last_starter = len;
+ WCHAR pair[2], comp;
+
+ for (i = 0; i < len; i++)
+ {
+ pair[1] = str[i];
+ if (last_starter == len || is_blocked( str + last_starter, str + i ) || !(comp = wine_compose( pair )))
+ {
+ if (is_starter( str[i] ))
+ {
+ last_starter = i;
+ pair[0] = str[i];
+ }
+ continue;
+ }
+ str[last_starter] = pair[0] = comp;
+ len--;
+ memmove( str + i, str + i + 1, (len - i) * sizeof(WCHAR) );
+ i = last_starter;
+ }
+ return len;
+}
--
2.18.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/kernel32/tests/locale.c | 6 +
libs/port/decompose.c | 314 +++++++++++++++++++++++++++--------
tools/make_unicode | 18 +-
3 files changed, 267 insertions(+), 71 deletions(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 1e25122c23..d877c65ec6 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -5685,6 +5685,11 @@ static void test_NormalizeString(void)
static const WCHAR part1_str10[] = {0x309B,0};
static const WCHAR part1_nfkc10[] = {0x20,0x3099,0};
+ /* ANGSTROM SIGN */
+ static const WCHAR part1_str11[] = {0x212B,0};
+ static const WCHAR part1_nfc11[] = {0xC5,0};
+ static const WCHAR part1_nfd11[] = {'A',0x030A,0};
+
struct test_data_normal {
const WCHAR *str;
const WCHAR *expected[4];
@@ -5713,6 +5718,7 @@ static void test_NormalizeString(void)
{ part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 }, { 1, 0, 1, 0 } },
{ part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 }, { 1, 0, 1, 0 } },
{ part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 }, { 1, 0, 1, 0 } },
+ { part1_str11, { part1_nfc11, part1_nfd11, part1_nfc11, part1_nfd11 }, { 1, 0, 1, 0 } },
{ 0 }
};
const struct test_data_normal *ptest = test_arr;
diff --git a/libs/port/decompose.c b/libs/port/decompose.c
index c46906921a..e8305d938b 100644
--- a/libs/port/decompose.c
+++ b/libs/port/decompose.c
@@ -4,16 +4,16 @@
#include "wine/unicode.h"
-static const WCHAR table[4704] =
+static const WCHAR table[5856] =
{
/* index */
0x0110, 0x0120, 0x0130, 0x0140, 0x0150, 0x0100, 0x0160, 0x0100,
0x0100, 0x0170, 0x0180, 0x0190, 0x01a0, 0x01b0, 0x0100, 0x01c0,
0x01d0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x01e0, 0x0100, 0x0100, 0x01f0, 0x0200,
- 0x0100, 0x0210, 0x0220, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
- 0x0100, 0x0100, 0x0230, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
- 0x0240, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0210, 0x0220, 0x0230, 0x0240, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0250, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0260, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
@@ -38,73 +38,85 @@ static const WCHAR table[4704] =
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
- 0x0100, 0x0100, 0x0100, 0x0250, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0270, 0x0280, 0x0290, 0x0100, 0x0100, 0x0100, 0x0100,
/* null sub-index */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 00 */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0280, 0x02a0, 0x02c0, 0x02e0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02c0, 0x02e0, 0x0300, 0x0320,
/* sub-index 01 */
- 0x0300, 0x0320, 0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0, 0x03e0,
- 0x0260, 0x0260, 0x0400, 0x0420, 0x0440, 0x0460, 0x0480, 0x04a0,
+ 0x0340, 0x0360, 0x0380, 0x03a0, 0x03c0, 0x03e0, 0x0400, 0x0420,
+ 0x02a0, 0x02a0, 0x0440, 0x0460, 0x0480, 0x04a0, 0x04c0, 0x04e0,
/* sub-index 02 */
- 0x04c0, 0x04e0, 0x0500, 0x0520, 0x0260, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+ 0x0500, 0x0520, 0x0540, 0x0560, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 03 */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0540, 0x0260, 0x0260, 0x0260,
- 0x0560, 0x0580, 0x05a0, 0x05c0, 0x05e0, 0x0600, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0580, 0x02a0, 0x02a0, 0x05a0,
+ 0x05c0, 0x05e0, 0x0600, 0x0620, 0x0640, 0x0660, 0x02a0, 0x02a0,
/* sub-index 04 */
- 0x0620, 0x0640, 0x0260, 0x0660, 0x0260, 0x0680, 0x0260, 0x06a0,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x06c0, 0x06e0, 0x0700, 0x0720,
+ 0x0680, 0x06a0, 0x02a0, 0x06c0, 0x02a0, 0x06e0, 0x02a0, 0x0700,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0720, 0x0740, 0x0760, 0x0780,
/* sub-index 06 */
- 0x0260, 0x0260, 0x0740, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0760, 0x0780, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x07a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x07c0, 0x07e0, 0x02a0, 0x02a0,
/* sub-index 09 */
- 0x0260, 0x0260, 0x07a0, 0x07c0, 0x0260, 0x07e0, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0800, 0x0820, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x0800, 0x0820, 0x02a0, 0x0840, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0860, 0x0880, 0x02a0, 0x02a0,
/* sub-index 0a */
- 0x0260, 0x0260, 0x0260, 0x0840, 0x0260, 0x0860, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x08a0, 0x02a0, 0x08c0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 0b */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0880, 0x08a0, 0x0260, 0x0260,
- 0x0260, 0x08c0, 0x0260, 0x0260, 0x08e0, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x08e0, 0x0900, 0x02a0, 0x02a0,
+ 0x02a0, 0x0920, 0x02a0, 0x02a0, 0x0940, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 0c */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0900, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0920, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0960, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x0980, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 0d */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0940, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0960, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x09a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x09c0, 0x02a0, 0x02a0,
/* sub-index 0f */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0980, 0x09a0, 0x09c0, 0x09e0,
- 0x0a00, 0x0a20, 0x0a40, 0x0a60, 0x0260, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x09e0, 0x0a00, 0x0a20, 0x0a40,
+ 0x0a60, 0x0a80, 0x0aa0, 0x0ac0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 10 */
- 0x0260, 0x0260, 0x0a80, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x0ae0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 1b */
- 0x0aa0, 0x0ac0, 0x0260, 0x0ae0, 0x0b00, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+ 0x0b00, 0x0b20, 0x02a0, 0x0b40, 0x0b60, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 1e */
- 0x0b20, 0x0b40, 0x0b60, 0x0b80, 0x0ba0, 0x0bc0, 0x0be0, 0x0c00,
- 0x0c20, 0x0c40, 0x0c60, 0x0c80, 0x0ca0, 0x0cc0, 0x0ce0, 0x0d00,
+ 0x0b80, 0x0ba0, 0x0bc0, 0x0be0, 0x0c00, 0x0c20, 0x0c40, 0x0c60,
+ 0x0c80, 0x0ca0, 0x0cc0, 0x0ce0, 0x0d00, 0x0d20, 0x0d40, 0x0d60,
/* sub-index 1f */
- 0x0d20, 0x0d40, 0x0d60, 0x0d80, 0x0da0, 0x0dc0, 0x0de0, 0x0e00,
- 0x0e20, 0x0e40, 0x0e60, 0x0e80, 0x0ea0, 0x0ec0, 0x0ee0, 0x0f00,
+ 0x0d80, 0x0da0, 0x0dc0, 0x0de0, 0x0e00, 0x0e20, 0x0e40, 0x0e60,
+ 0x0e80, 0x0ea0, 0x0ec0, 0x0ee0, 0x0f00, 0x0f20, 0x0f40, 0x0f60,
+ /* sub-index 20 */
+ 0x0f80, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 21 */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0f20, 0x0f40, 0x0260, 0x0f60, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x0fa0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x0fc0, 0x0fe0, 0x02a0, 0x1000, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 22 */
- 0x0f80, 0x0260, 0x0fa0, 0x0260, 0x0fc0, 0x0260, 0x0fe0, 0x1000,
- 0x1020, 0x0260, 0x1040, 0x0260, 0x0260, 0x0260, 0x1060, 0x0260,
+ 0x1020, 0x02a0, 0x1040, 0x02a0, 0x1060, 0x02a0, 0x1080, 0x10a0,
+ 0x10c0, 0x02a0, 0x10e0, 0x02a0, 0x02a0, 0x02a0, 0x1100, 0x02a0,
+ /* sub-index 23 */
+ 0x02a0, 0x02a0, 0x1120, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* sub-index 2a */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x1080, 0x0260, 0x0260,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x1140, 0x02a0, 0x02a0,
/* sub-index 30 */
- 0x0260, 0x0260, 0x0260, 0x0260, 0x10a0, 0x10c0, 0x10e0, 0x1100,
- 0x0260, 0x1120, 0x1140, 0x1160, 0x1180, 0x11a0, 0x0260, 0x11c0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x1160, 0x1180, 0x11a0, 0x11c0,
+ 0x02a0, 0x11e0, 0x1200, 0x1220, 0x1240, 0x1260, 0x02a0, 0x1280,
+ /* sub-index f9 */
+ 0x12a0, 0x12c0, 0x12e0, 0x1300, 0x1320, 0x1340, 0x1360, 0x1380,
+ 0x13a0, 0x13c0, 0x13e0, 0x1400, 0x1420, 0x1440, 0x1460, 0x1480,
+ /* sub-index fa */
+ 0x14a0, 0x14c0, 0x14e0, 0x1500, 0x1520, 0x1540, 0x1560, 0x1580,
+ 0x15a0, 0x15c0, 0x15e0, 0x1600, 0x1620, 0x1640, 0x02a0, 0x02a0,
/* sub-index fb */
- 0x0260, 0x11e0, 0x1200, 0x1220, 0x1240, 0x0260, 0x0260, 0x0260,
- 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260, 0x0260,
+ 0x02a0, 0x1660, 0x1680, 0x16a0, 0x16c0, 0x02a0, 0x02a0, 0x02a0,
+ 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0, 0x02a0,
/* null mapping */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -221,13 +233,18 @@ static const WCHAR table[4704] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x0340 .. 0x034f */
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0300, 0x0000, 0x0301, 0x0000, 0x0000, 0x0000, 0x0313, 0x0000,
0x0308, 0x0301, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x0370 .. 0x037f */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x02b9, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x003b, 0x0000, 0x0000, 0x0000,
/* 0x0380 .. 0x038f */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x00a8, 0x0301, 0x0391, 0x0301, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00a8, 0x0301, 0x0391, 0x0301, 0x00b7, 0x0000,
0x0395, 0x0301, 0x0397, 0x0301, 0x0399, 0x0301, 0x0000, 0x0000,
0x039f, 0x0301, 0x0000, 0x0000, 0x03a5, 0x0301, 0x03a9, 0x0301,
/* 0x0390 .. 0x039f */
@@ -571,10 +588,10 @@ static const WCHAR table[4704] =
0x03a9, 0x0313, 0x03a9, 0x0314, 0x1f68, 0x0300, 0x1f69, 0x0300,
0x1f68, 0x0301, 0x1f69, 0x0301, 0x1f68, 0x0342, 0x1f69, 0x0342,
/* 0x1f70 .. 0x1f7f */
- 0x03b1, 0x0300, 0x0000, 0x0000, 0x03b5, 0x0300, 0x0000, 0x0000,
- 0x03b7, 0x0300, 0x0000, 0x0000, 0x03b9, 0x0300, 0x0000, 0x0000,
- 0x03bf, 0x0300, 0x0000, 0x0000, 0x03c5, 0x0300, 0x0000, 0x0000,
- 0x03c9, 0x0300, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x03b1, 0x0300, 0x03ac, 0x0000, 0x03b5, 0x0300, 0x03ad, 0x0000,
+ 0x03b7, 0x0300, 0x03ae, 0x0000, 0x03b9, 0x0300, 0x03af, 0x0000,
+ 0x03bf, 0x0300, 0x03cc, 0x0000, 0x03c5, 0x0300, 0x03cd, 0x0000,
+ 0x03c9, 0x0300, 0x03ce, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x1f80 .. 0x1f8f */
0x1f00, 0x0345, 0x1f01, 0x0345, 0x1f02, 0x0345, 0x1f03, 0x0345,
0x1f04, 0x0345, 0x1f05, 0x0345, 0x1f06, 0x0345, 0x1f07, 0x0345,
@@ -593,28 +610,38 @@ static const WCHAR table[4704] =
/* 0x1fb0 .. 0x1fbf */
0x03b1, 0x0306, 0x03b1, 0x0304, 0x1f70, 0x0345, 0x03b1, 0x0345,
0x03ac, 0x0345, 0x0000, 0x0000, 0x03b1, 0x0342, 0x1fb6, 0x0345,
- 0x0391, 0x0306, 0x0391, 0x0304, 0x0391, 0x0300, 0x0000, 0x0000,
- 0x0391, 0x0345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0391, 0x0306, 0x0391, 0x0304, 0x0391, 0x0300, 0x0386, 0x0000,
+ 0x0391, 0x0345, 0x0000, 0x0000, 0x03b9, 0x0000, 0x0000, 0x0000,
/* 0x1fc0 .. 0x1fcf */
0x0000, 0x0000, 0x00a8, 0x0342, 0x1f74, 0x0345, 0x03b7, 0x0345,
0x03ae, 0x0345, 0x0000, 0x0000, 0x03b7, 0x0342, 0x1fc6, 0x0345,
- 0x0395, 0x0300, 0x0000, 0x0000, 0x0397, 0x0300, 0x0000, 0x0000,
+ 0x0395, 0x0300, 0x0388, 0x0000, 0x0397, 0x0300, 0x0389, 0x0000,
0x0397, 0x0345, 0x1fbf, 0x0300, 0x1fbf, 0x0301, 0x1fbf, 0x0342,
/* 0x1fd0 .. 0x1fdf */
- 0x03b9, 0x0306, 0x03b9, 0x0304, 0x03ca, 0x0300, 0x0000, 0x0000,
+ 0x03b9, 0x0306, 0x03b9, 0x0304, 0x03ca, 0x0300, 0x0390, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x03b9, 0x0342, 0x03ca, 0x0342,
- 0x0399, 0x0306, 0x0399, 0x0304, 0x0399, 0x0300, 0x0000, 0x0000,
+ 0x0399, 0x0306, 0x0399, 0x0304, 0x0399, 0x0300, 0x038a, 0x0000,
0x0000, 0x0000, 0x1ffe, 0x0300, 0x1ffe, 0x0301, 0x1ffe, 0x0342,
/* 0x1fe0 .. 0x1fef */
- 0x03c5, 0x0306, 0x03c5, 0x0304, 0x03cb, 0x0300, 0x0000, 0x0000,
+ 0x03c5, 0x0306, 0x03c5, 0x0304, 0x03cb, 0x0300, 0x03b0, 0x0000,
0x03c1, 0x0313, 0x03c1, 0x0314, 0x03c5, 0x0342, 0x03cb, 0x0342,
- 0x03a5, 0x0306, 0x03a5, 0x0304, 0x03a5, 0x0300, 0x0000, 0x0000,
- 0x03a1, 0x0314, 0x00a8, 0x0300, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x03a5, 0x0306, 0x03a5, 0x0304, 0x03a5, 0x0300, 0x038e, 0x0000,
+ 0x03a1, 0x0314, 0x00a8, 0x0300, 0x0385, 0x0000, 0x0060, 0x0000,
/* 0x1ff0 .. 0x1fff */
0x0000, 0x0000, 0x0000, 0x0000, 0x1f7c, 0x0345, 0x03c9, 0x0345,
0x03ce, 0x0345, 0x0000, 0x0000, 0x03c9, 0x0342, 0x1ff6, 0x0345,
- 0x039f, 0x0300, 0x0000, 0x0000, 0x03a9, 0x0300, 0x0000, 0x0000,
- 0x03a9, 0x0345, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x039f, 0x0300, 0x038c, 0x0000, 0x03a9, 0x0300, 0x038f, 0x0000,
+ 0x03a9, 0x0345, 0x00b4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2000 .. 0x200f */
+ 0x2002, 0x0000, 0x2003, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2120 .. 0x212f */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x03a9, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x004b, 0x0000, 0x00c5, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x2190 .. 0x219f */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -670,6 +697,11 @@ static const WCHAR table[4704] =
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x22b2, 0x0338, 0x22b3, 0x0338,
0x22b4, 0x0338, 0x22b5, 0x0338, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0x2320 .. 0x232f */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x3008, 0x0000, 0x3009, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0x2ad0 .. 0x2adf */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -725,6 +757,156 @@ static const WCHAR table[4704] =
0x30a6, 0x3099, 0x0000, 0x0000, 0x0000, 0x0000, 0x30ef, 0x3099,
0x30f0, 0x3099, 0x30f1, 0x3099, 0x30f2, 0x3099, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x30fd, 0x3099, 0x0000, 0x0000,
+ /* 0xf900 .. 0xf90f */
+ 0x8c48, 0x0000, 0x66f4, 0x0000, 0x8eca, 0x0000, 0x8cc8, 0x0000,
+ 0x6ed1, 0x0000, 0x4e32, 0x0000, 0x53e5, 0x0000, 0x9f9c, 0x0000,
+ 0x9f9c, 0x0000, 0x5951, 0x0000, 0x91d1, 0x0000, 0x5587, 0x0000,
+ 0x5948, 0x0000, 0x61f6, 0x0000, 0x7669, 0x0000, 0x7f85, 0x0000,
+ /* 0xf910 .. 0xf91f */
+ 0x863f, 0x0000, 0x87ba, 0x0000, 0x88f8, 0x0000, 0x908f, 0x0000,
+ 0x6a02, 0x0000, 0x6d1b, 0x0000, 0x70d9, 0x0000, 0x73de, 0x0000,
+ 0x843d, 0x0000, 0x916a, 0x0000, 0x99f1, 0x0000, 0x4e82, 0x0000,
+ 0x5375, 0x0000, 0x6b04, 0x0000, 0x721b, 0x0000, 0x862d, 0x0000,
+ /* 0xf920 .. 0xf92f */
+ 0x9e1e, 0x0000, 0x5d50, 0x0000, 0x6feb, 0x0000, 0x85cd, 0x0000,
+ 0x8964, 0x0000, 0x62c9, 0x0000, 0x81d8, 0x0000, 0x881f, 0x0000,
+ 0x5eca, 0x0000, 0x6717, 0x0000, 0x6d6a, 0x0000, 0x72fc, 0x0000,
+ 0x90ce, 0x0000, 0x4f86, 0x0000, 0x51b7, 0x0000, 0x52de, 0x0000,
+ /* 0xf930 .. 0xf93f */
+ 0x64c4, 0x0000, 0x6ad3, 0x0000, 0x7210, 0x0000, 0x76e7, 0x0000,
+ 0x8001, 0x0000, 0x8606, 0x0000, 0x865c, 0x0000, 0x8def, 0x0000,
+ 0x9732, 0x0000, 0x9b6f, 0x0000, 0x9dfa, 0x0000, 0x788c, 0x0000,
+ 0x797f, 0x0000, 0x7da0, 0x0000, 0x83c9, 0x0000, 0x9304, 0x0000,
+ /* 0xf940 .. 0xf94f */
+ 0x9e7f, 0x0000, 0x8ad6, 0x0000, 0x58df, 0x0000, 0x5f04, 0x0000,
+ 0x7c60, 0x0000, 0x807e, 0x0000, 0x7262, 0x0000, 0x78ca, 0x0000,
+ 0x8cc2, 0x0000, 0x96f7, 0x0000, 0x58d8, 0x0000, 0x5c62, 0x0000,
+ 0x6a13, 0x0000, 0x6dda, 0x0000, 0x6f0f, 0x0000, 0x7d2f, 0x0000,
+ /* 0xf950 .. 0xf95f */
+ 0x7e37, 0x0000, 0x964b, 0x0000, 0x52d2, 0x0000, 0x808b, 0x0000,
+ 0x51dc, 0x0000, 0x51cc, 0x0000, 0x7a1c, 0x0000, 0x7dbe, 0x0000,
+ 0x83f1, 0x0000, 0x9675, 0x0000, 0x8b80, 0x0000, 0x62cf, 0x0000,
+ 0x6a02, 0x0000, 0x8afe, 0x0000, 0x4e39, 0x0000, 0x5be7, 0x0000,
+ /* 0xf960 .. 0xf96f */
+ 0x6012, 0x0000, 0x7387, 0x0000, 0x7570, 0x0000, 0x5317, 0x0000,
+ 0x78fb, 0x0000, 0x4fbf, 0x0000, 0x5fa9, 0x0000, 0x4e0d, 0x0000,
+ 0x6ccc, 0x0000, 0x6578, 0x0000, 0x7d22, 0x0000, 0x53c3, 0x0000,
+ 0x585e, 0x0000, 0x7701, 0x0000, 0x8449, 0x0000, 0x8aaa, 0x0000,
+ /* 0xf970 .. 0xf97f */
+ 0x6bba, 0x0000, 0x8fb0, 0x0000, 0x6c88, 0x0000, 0x62fe, 0x0000,
+ 0x82e5, 0x0000, 0x63a0, 0x0000, 0x7565, 0x0000, 0x4eae, 0x0000,
+ 0x5169, 0x0000, 0x51c9, 0x0000, 0x6881, 0x0000, 0x7ce7, 0x0000,
+ 0x826f, 0x0000, 0x8ad2, 0x0000, 0x91cf, 0x0000, 0x52f5, 0x0000,
+ /* 0xf980 .. 0xf98f */
+ 0x5442, 0x0000, 0x5973, 0x0000, 0x5eec, 0x0000, 0x65c5, 0x0000,
+ 0x6ffe, 0x0000, 0x792a, 0x0000, 0x95ad, 0x0000, 0x9a6a, 0x0000,
+ 0x9e97, 0x0000, 0x9ece, 0x0000, 0x529b, 0x0000, 0x66c6, 0x0000,
+ 0x6b77, 0x0000, 0x8f62, 0x0000, 0x5e74, 0x0000, 0x6190, 0x0000,
+ /* 0xf990 .. 0xf99f */
+ 0x6200, 0x0000, 0x649a, 0x0000, 0x6f23, 0x0000, 0x7149, 0x0000,
+ 0x7489, 0x0000, 0x79ca, 0x0000, 0x7df4, 0x0000, 0x806f, 0x0000,
+ 0x8f26, 0x0000, 0x84ee, 0x0000, 0x9023, 0x0000, 0x934a, 0x0000,
+ 0x5217, 0x0000, 0x52a3, 0x0000, 0x54bd, 0x0000, 0x70c8, 0x0000,
+ /* 0xf9a0 .. 0xf9af */
+ 0x88c2, 0x0000, 0x8aaa, 0x0000, 0x5ec9, 0x0000, 0x5ff5, 0x0000,
+ 0x637b, 0x0000, 0x6bae, 0x0000, 0x7c3e, 0x0000, 0x7375, 0x0000,
+ 0x4ee4, 0x0000, 0x56f9, 0x0000, 0x5be7, 0x0000, 0x5dba, 0x0000,
+ 0x601c, 0x0000, 0x73b2, 0x0000, 0x7469, 0x0000, 0x7f9a, 0x0000,
+ /* 0xf9b0 .. 0xf9bf */
+ 0x8046, 0x0000, 0x9234, 0x0000, 0x96f6, 0x0000, 0x9748, 0x0000,
+ 0x9818, 0x0000, 0x4f8b, 0x0000, 0x79ae, 0x0000, 0x91b4, 0x0000,
+ 0x96b8, 0x0000, 0x60e1, 0x0000, 0x4e86, 0x0000, 0x50da, 0x0000,
+ 0x5bee, 0x0000, 0x5c3f, 0x0000, 0x6599, 0x0000, 0x6a02, 0x0000,
+ /* 0xf9c0 .. 0xf9cf */
+ 0x71ce, 0x0000, 0x7642, 0x0000, 0x84fc, 0x0000, 0x907c, 0x0000,
+ 0x9f8d, 0x0000, 0x6688, 0x0000, 0x962e, 0x0000, 0x5289, 0x0000,
+ 0x677b, 0x0000, 0x67f3, 0x0000, 0x6d41, 0x0000, 0x6e9c, 0x0000,
+ 0x7409, 0x0000, 0x7559, 0x0000, 0x786b, 0x0000, 0x7d10, 0x0000,
+ /* 0xf9d0 .. 0xf9df */
+ 0x985e, 0x0000, 0x516d, 0x0000, 0x622e, 0x0000, 0x9678, 0x0000,
+ 0x502b, 0x0000, 0x5d19, 0x0000, 0x6dea, 0x0000, 0x8f2a, 0x0000,
+ 0x5f8b, 0x0000, 0x6144, 0x0000, 0x6817, 0x0000, 0x7387, 0x0000,
+ 0x9686, 0x0000, 0x5229, 0x0000, 0x540f, 0x0000, 0x5c65, 0x0000,
+ /* 0xf9e0 .. 0xf9ef */
+ 0x6613, 0x0000, 0x674e, 0x0000, 0x68a8, 0x0000, 0x6ce5, 0x0000,
+ 0x7406, 0x0000, 0x75e2, 0x0000, 0x7f79, 0x0000, 0x88cf, 0x0000,
+ 0x88e1, 0x0000, 0x91cc, 0x0000, 0x96e2, 0x0000, 0x533f, 0x0000,
+ 0x6eba, 0x0000, 0x541d, 0x0000, 0x71d0, 0x0000, 0x7498, 0x0000,
+ /* 0xf9f0 .. 0xf9ff */
+ 0x85fa, 0x0000, 0x96a3, 0x0000, 0x9c57, 0x0000, 0x9e9f, 0x0000,
+ 0x6797, 0x0000, 0x6dcb, 0x0000, 0x81e8, 0x0000, 0x7acb, 0x0000,
+ 0x7b20, 0x0000, 0x7c92, 0x0000, 0x72c0, 0x0000, 0x7099, 0x0000,
+ 0x8b58, 0x0000, 0x4ec0, 0x0000, 0x8336, 0x0000, 0x523a, 0x0000,
+ /* 0xfa00 .. 0xfa0f */
+ 0x5207, 0x0000, 0x5ea6, 0x0000, 0x62d3, 0x0000, 0x7cd6, 0x0000,
+ 0x5b85, 0x0000, 0x6d1e, 0x0000, 0x66b4, 0x0000, 0x8f3b, 0x0000,
+ 0x884c, 0x0000, 0x964d, 0x0000, 0x898b, 0x0000, 0x5ed3, 0x0000,
+ 0x5140, 0x0000, 0x55c0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0xfa10 .. 0xfa1f */
+ 0x585a, 0x0000, 0x0000, 0x0000, 0x6674, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x51de, 0x0000, 0x732a, 0x0000, 0x76ca, 0x0000,
+ 0x793c, 0x0000, 0x795e, 0x0000, 0x7965, 0x0000, 0x798f, 0x0000,
+ 0x9756, 0x0000, 0x7cbe, 0x0000, 0x7fbd, 0x0000, 0x0000, 0x0000,
+ /* 0xfa20 .. 0xfa2f */
+ 0x8612, 0x0000, 0x0000, 0x0000, 0x8af8, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x9038, 0x0000, 0x90fd, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x98ef, 0x0000, 0x98fc, 0x0000,
+ 0x9928, 0x0000, 0x9db4, 0x0000, 0x90de, 0x0000, 0x96b7, 0x0000,
+ /* 0xfa30 .. 0xfa3f */
+ 0x4fae, 0x0000, 0x50e7, 0x0000, 0x514d, 0x0000, 0x52c9, 0x0000,
+ 0x52e4, 0x0000, 0x5351, 0x0000, 0x559d, 0x0000, 0x5606, 0x0000,
+ 0x5668, 0x0000, 0x5840, 0x0000, 0x58a8, 0x0000, 0x5c64, 0x0000,
+ 0x5c6e, 0x0000, 0x6094, 0x0000, 0x6168, 0x0000, 0x618e, 0x0000,
+ /* 0xfa40 .. 0xfa4f */
+ 0x61f2, 0x0000, 0x654f, 0x0000, 0x65e2, 0x0000, 0x6691, 0x0000,
+ 0x6885, 0x0000, 0x6d77, 0x0000, 0x6e1a, 0x0000, 0x6f22, 0x0000,
+ 0x716e, 0x0000, 0x722b, 0x0000, 0x7422, 0x0000, 0x7891, 0x0000,
+ 0x793e, 0x0000, 0x7949, 0x0000, 0x7948, 0x0000, 0x7950, 0x0000,
+ /* 0xfa50 .. 0xfa5f */
+ 0x7956, 0x0000, 0x795d, 0x0000, 0x798d, 0x0000, 0x798e, 0x0000,
+ 0x7a40, 0x0000, 0x7a81, 0x0000, 0x7bc0, 0x0000, 0x7df4, 0x0000,
+ 0x7e09, 0x0000, 0x7e41, 0x0000, 0x7f72, 0x0000, 0x8005, 0x0000,
+ 0x81ed, 0x0000, 0x8279, 0x0000, 0x8279, 0x0000, 0x8457, 0x0000,
+ /* 0xfa60 .. 0xfa6f */
+ 0x8910, 0x0000, 0x8996, 0x0000, 0x8b01, 0x0000, 0x8b39, 0x0000,
+ 0x8cd3, 0x0000, 0x8d08, 0x0000, 0x8fb6, 0x0000, 0x9038, 0x0000,
+ 0x96e3, 0x0000, 0x97ff, 0x0000, 0x983b, 0x0000, 0x6075, 0x0000,
+ 0x0000, 0x0000, 0x8218, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ /* 0xfa70 .. 0xfa7f */
+ 0x4e26, 0x0000, 0x51b5, 0x0000, 0x5168, 0x0000, 0x4f80, 0x0000,
+ 0x5145, 0x0000, 0x5180, 0x0000, 0x52c7, 0x0000, 0x52fa, 0x0000,
+ 0x559d, 0x0000, 0x5555, 0x0000, 0x5599, 0x0000, 0x55e2, 0x0000,
+ 0x585a, 0x0000, 0x58b3, 0x0000, 0x5944, 0x0000, 0x5954, 0x0000,
+ /* 0xfa80 .. 0xfa8f */
+ 0x5a62, 0x0000, 0x5b28, 0x0000, 0x5ed2, 0x0000, 0x5ed9, 0x0000,
+ 0x5f69, 0x0000, 0x5fad, 0x0000, 0x60d8, 0x0000, 0x614e, 0x0000,
+ 0x6108, 0x0000, 0x618e, 0x0000, 0x6160, 0x0000, 0x61f2, 0x0000,
+ 0x6234, 0x0000, 0x63c4, 0x0000, 0x641c, 0x0000, 0x6452, 0x0000,
+ /* 0xfa90 .. 0xfa9f */
+ 0x6556, 0x0000, 0x6674, 0x0000, 0x6717, 0x0000, 0x671b, 0x0000,
+ 0x6756, 0x0000, 0x6b79, 0x0000, 0x6bba, 0x0000, 0x6d41, 0x0000,
+ 0x6edb, 0x0000, 0x6ecb, 0x0000, 0x6f22, 0x0000, 0x701e, 0x0000,
+ 0x716e, 0x0000, 0x77a7, 0x0000, 0x7235, 0x0000, 0x72af, 0x0000,
+ /* 0xfaa0 .. 0xfaaf */
+ 0x732a, 0x0000, 0x7471, 0x0000, 0x7506, 0x0000, 0x753b, 0x0000,
+ 0x761d, 0x0000, 0x761f, 0x0000, 0x76ca, 0x0000, 0x76db, 0x0000,
+ 0x76f4, 0x0000, 0x774a, 0x0000, 0x7740, 0x0000, 0x78cc, 0x0000,
+ 0x7ab1, 0x0000, 0x7bc0, 0x0000, 0x7c7b, 0x0000, 0x7d5b, 0x0000,
+ /* 0xfab0 .. 0xfabf */
+ 0x7df4, 0x0000, 0x7f3e, 0x0000, 0x8005, 0x0000, 0x8352, 0x0000,
+ 0x83ef, 0x0000, 0x8779, 0x0000, 0x8941, 0x0000, 0x8986, 0x0000,
+ 0x8996, 0x0000, 0x8abf, 0x0000, 0x8af8, 0x0000, 0x8acb, 0x0000,
+ 0x8b01, 0x0000, 0x8afe, 0x0000, 0x8aed, 0x0000, 0x8b39, 0x0000,
+ /* 0xfac0 .. 0xfacf */
+ 0x8b8a, 0x0000, 0x8d08, 0x0000, 0x8f38, 0x0000, 0x9072, 0x0000,
+ 0x9199, 0x0000, 0x9276, 0x0000, 0x967c, 0x0000, 0x96e3, 0x0000,
+ 0x9756, 0x0000, 0x97db, 0x0000, 0x97ff, 0x0000, 0x980b, 0x0000,
+ 0x983b, 0x0000, 0x9b12, 0x0000, 0x9f9c, 0x0000, 0x0000, 0x0000,
+ /* 0xfad0 .. 0xfadf */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x3b9d, 0x0000, 0x4018, 0x0000,
+ 0x4039, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x9f43, 0x0000, 0x9f8e, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
/* 0xfb10 .. 0xfb1f */
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
@@ -2041,7 +2223,7 @@ unsigned int DECLSPEC_HIDDEN wine_decompose( int flags, WCHAR ch, WCHAR *dst, un
if (!ptr)
{
ptr = table + table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + 2 * (ch & 0xf);
- len = 2;
+ len = ptr[1] ? 2 : 1;
}
if (!*ptr) return 1;
diff --git a/tools/make_unicode b/tools/make_unicode
index 3a9fefe474..dbf640abe7 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -528,11 +528,19 @@ sub READ_DEFAULTS($)
$decomp_table[$src] = [ hex $1, hex $2 ];
push @compose_table, [ hex $1, hex $2, $src ];
}
- elsif ($decomp =~ /^(<[a-z]+>\s)*([0-9a-fA-F]+)$/ &&
- (($src >= 0xf900 && $src < 0xfb00) || ($src >= 0xfe30 && $src < 0xfffd)))
+ elsif ($decomp =~ /^([0-9a-fA-F]+)$/)
{
- # Single char decomposition in the compatibility range
- $compatmap_table[$src] = hex $2;
+ # Single char decomposition
+ if (hex $1 < 65536)
+ {
+ $decomp_table[$src] = [ hex $1, 0 ];
+ }
+
+ if (($src >= 0xf900 && $src < 0xfb00) || ($src >= 0xfe30 && $src < 0xfffd))
+ {
+ # Single char decomposition in the compatibility range
+ $compatmap_table[$src] = hex $1;
+ }
}
}
else
@@ -2494,7 +2502,7 @@ unsigned int DECLSPEC_HIDDEN wine_decompose( int flags, WCHAR ch, WCHAR *dst, un
if (!ptr)
{
ptr = table + table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + 2 * (ch & 0xf);
- len = 2;
+ len = ptr[1] ? 2 : 1;
}
if (!*ptr) return 1;
--
2.18.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/kernel32/locale.c | 1 +
dlls/kernel32/tests/locale.c | 6 +-
libs/port/Makefile.in | 1 +
libs/port/combclass.c | 288 +++++++++++++++++++++++++++++++++++
libs/port/normalize.c | 68 +++++++++
tools/make_unicode | 24 +++
6 files changed, 385 insertions(+), 3 deletions(-)
create mode 100644 libs/port/combclass.c
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index a4e5ef5a38..f2455bd72e 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -5374,6 +5374,7 @@ INT WINAPI NormalizeString(NORM_FORM form, const WCHAR *src, INT src_len, WCHAR
if (form == NormalizationKC || form == NormalizationKD) flags |= WINE_DECOMPOSE_COMPAT;
if (form == NormalizationC || form == NormalizationKC) compose = 1;
+ if (compose || dst_len) flags |= WINE_DECOMPOSE_REORDER;
if (!compose && dst_len)
{
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 0fa6aeb7b4..851da7febf 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -5696,10 +5696,10 @@ static void test_NormalizeString(void)
{ part0_str2, { part0_nfc2, part0_str2, part0_nfc2, part0_str2 }, { 1, 0, 1, 0 } },
{ part0_str3, { part0_nfc3, part0_str3, part0_nfc3, part0_str3 }, { 1, 0, 1, 0 } },
{ part0_str4, { part0_nfc4, part0_str4, part0_nfc4, part0_str4 }, { 1, 0, 1, 0 } },
- { part0_str5, { part0_nfc5, part0_nfc5, part0_nfc5, part0_nfc5 }, { 1, 1, 1, 1 } },
- { part0_str6, { part0_nfc6, part0_nfc6, part0_nfc6, part0_nfc6 }, { 1, 1, 1, 1 } },
+ { part0_str5, { part0_nfc5, part0_nfc5, part0_nfc5, part0_nfc5 }, { 1, 0, 1, 0 } },
+ { part0_str6, { part0_nfc6, part0_nfc6, part0_nfc6, part0_nfc6 }, { 1, 0, 1, 0 } },
{ part0_str8, { part0_str8, part0_nfd8, part0_str8, part0_nfd8 }, { 1, 0, 1, 0 } },
- { part0_str9, { part0_nfc9, part0_nfd9, part0_nfc9, part0_nfd9 }, { 1, 1, 1, 1 } },
+ { part0_str9, { part0_nfc9, part0_nfd9, part0_nfc9, part0_nfd9 }, { 1, 0, 1, 0 } },
{ part0_str10, { part0_str10, part0_nfd10, part0_str10, part0_nfd10 }, { 1, 0, 1, 0 } },
{ part0_str11, { part0_str11, part0_nfd11, part0_str11, part0_nfd11 }, { 1, 0, 1, 0 } },
{ part0_str12, { part0_nfc12, part0_nfd12, part0_nfc12, part0_nfd12 }, { 1, 0, 1, 0 } },
diff --git a/libs/port/Makefile.in b/libs/port/Makefile.in
index 1c753fd893..8d16741534 100644
--- a/libs/port/Makefile.in
+++ b/libs/port/Makefile.in
@@ -73,6 +73,7 @@ C_SRCS = \
c_936.c \
c_949.c \
c_950.c \
+ combclass.c \
compose.c \
cpsymbol.c \
cptable.c \
diff --git a/libs/port/combclass.c b/libs/port/combclass.c
new file mode 100644
index 0000000000..1567812c33
--- /dev/null
+++ b/libs/port/combclass.c
@@ -0,0 +1,288 @@
+/* Unicode Combining Classes */
+/* generated from http://www.unicode.org/Public/11.0.0/ucd/UnicodeData.txt */
+/* DO NOT EDIT!! */
+
+#include "wine/unicode.h"
+
+const unsigned short DECLSPEC_HIDDEN combining_class_table[2208] =
+{
+ /* level 1 offsets */
+ 0x0100, 0x0100, 0x0100, 0x0110, 0x0120, 0x0130, 0x0140, 0x0150,
+ 0x0160, 0x0170, 0x0180, 0x0190, 0x01a0, 0x01b0, 0x01c0, 0x01d0,
+ 0x01e0, 0x0100, 0x0100, 0x01f0, 0x0100, 0x0100, 0x0100, 0x0200,
+ 0x0210, 0x0220, 0x0230, 0x0240, 0x0250, 0x0260, 0x0100, 0x0100,
+ 0x0270, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0280, 0x0290, 0x0100, 0x0100,
+ 0x02a0, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x02b0, 0x0100,
+ 0x02c0, 0x02d0, 0x02e0, 0x02f0, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100,
+ 0x0100, 0x0100, 0x0100, 0x0300, 0x0100, 0x0100, 0x0310, 0x0100,
+ /* level 2 offsets */
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0330, 0x0340, 0x0350, 0x0360, 0x0370, 0x0380, 0x0390, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x03a0, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x03b0, 0x03c0, 0x03d0, 0x03e0, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x03f0, 0x0320, 0x0320, 0x0400, 0x0410, 0x0320, 0x0420,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0430, 0x0440, 0x0320,
+ 0x0320, 0x0450, 0x0320, 0x0460, 0x0470, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0480, 0x0490,
+ 0x0320, 0x04a0, 0x04b0, 0x0320, 0x0320, 0x04c0, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x04d0, 0x04e0, 0x04f0,
+ 0x0320, 0x0320, 0x0320, 0x0500, 0x0510, 0x0520, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0500, 0x0510, 0x0320, 0x0320, 0x0530,
+ 0x0320, 0x0320, 0x0320, 0x0500, 0x0510, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0500, 0x0510, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0500, 0x0510, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0510, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0510, 0x0540, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0500, 0x0510, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0550, 0x0510, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0560, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0570, 0x0580, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0590, 0x05a0, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x05b0, 0x0320, 0x05c0, 0x0320, 0x0320, 0x0320, 0x05d0,
+ 0x05e0, 0x0320, 0x0320, 0x0320, 0x05f0, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0600, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0610, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0620, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0630, 0x0320, 0x0630, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0640, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0650, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0660, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0670, 0x0320, 0x0320, 0x0320, 0x0320, 0x0680, 0x0690,
+ 0x0320, 0x0320, 0x0320, 0x06a0, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x06b0, 0x0630, 0x0320, 0x06c0, 0x06d0,
+ 0x0320, 0x0320, 0x06e0, 0x0320, 0x0320, 0x0320, 0x06f0, 0x0700,
+ 0x0320, 0x0320, 0x0320, 0x0710, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0720, 0x0730, 0x0740,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0750, 0x0760, 0x0330, 0x0770,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0780, 0x0790, 0x07a0,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x07b0, 0x07c0,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x07d0,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0330, 0x0330,
+ 0x0320, 0x0320, 0x07e0, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x07f0, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x07b0, 0x0800,
+ 0x0320, 0x0810, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x07c0,
+ 0x0820, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0630, 0x0320, 0x0330, 0x07c0,
+ 0x0320, 0x0320, 0x0830, 0x0320, 0x0320, 0x0840, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0850, 0x0680, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0860, 0x0870, 0x0320, 0x0320, 0x0820,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0510, 0x0320,
+ 0x0320, 0x0880, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0890, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320, 0x0320,
+ /* values */
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e8, 0x00dc, 0x00dc,
+ 0x00dc, 0x00dc, 0x00e8, 0x00d8, 0x00dc, 0x00dc, 0x00dc, 0x00dc,
+ 0x00dc, 0x00ca, 0x00ca, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00ca,
+ 0x00ca, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc,
+ 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00f0, 0x00e6, 0x00dc,
+ 0x00dc, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00dc, 0x0000,
+ 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00e6,
+ 0x00e8, 0x00dc, 0x00dc, 0x00e6, 0x00e9, 0x00ea, 0x00ea, 0x00e9,
+ 0x00ea, 0x00ea, 0x00e9, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00e6,
+ 0x00e6, 0x00e6, 0x00de, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc,
+ 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00de, 0x00e4, 0x00e6,
+ 0x000a, 0x000b, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011,
+ 0x0012, 0x0013, 0x0013, 0x0014, 0x0015, 0x0016, 0x0000, 0x0017,
+ 0x0000, 0x0018, 0x0019, 0x0000, 0x00e6, 0x00dc, 0x0000, 0x0012,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x001e, 0x001f, 0x0020, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x001b, 0x001c, 0x001d, 0x001e, 0x001f,
+ 0x0020, 0x0021, 0x0022, 0x00e6, 0x00e6, 0x00dc, 0x00dc, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00dc,
+ 0x0023, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x0000, 0x0000, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x0000, 0x0000, 0x00e6,
+ 0x00e6, 0x0000, 0x00dc, 0x00e6, 0x00e6, 0x00dc, 0x0000, 0x0000,
+ 0x0000, 0x0024, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00dc,
+ 0x00dc, 0x00dc, 0x00e6, 0x00dc, 0x00dc, 0x00e6, 0x00dc, 0x00e6,
+ 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x00dc, 0x00e6, 0x00dc, 0x00e6,
+ 0x00dc, 0x00e6, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x0000, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x0000, 0x00e6, 0x00e6, 0x00e6,
+ 0x0000, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00dc, 0x00dc, 0x00dc, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x0000, 0x00dc, 0x00e6, 0x00e6, 0x00dc, 0x00e6,
+ 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00dc, 0x00dc,
+ 0x001b, 0x001c, 0x001d, 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00e6,
+ 0x00e6, 0x00dc, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000,
+ 0x0000, 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0054, 0x005b, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0067, 0x0067, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x006b, 0x006b, 0x006b, 0x006b, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0076, 0x0076, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x007a, 0x007a, 0x007a, 0x007a, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00dc, 0x00dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x00dc,
+ 0x0000, 0x00d8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0081, 0x0082, 0x0000, 0x0084, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0082, 0x0082, 0x0082, 0x0082, 0x0000, 0x0000,
+ 0x0082, 0x0000, 0x00e6, 0x00e6, 0x0009, 0x0000, 0x00e6, 0x00e6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007,
+ 0x0000, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6, 0x00e6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00e4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00de, 0x00e6, 0x00dc, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6,
+ 0x00dc, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0009, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x0000, 0x0000, 0x00dc,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00dc, 0x00dc, 0x00dc,
+ 0x00dc, 0x00dc, 0x00dc, 0x00e6, 0x00e6, 0x00dc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0009, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0007,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00e6, 0x00e6, 0x00e6, 0x0000, 0x0001, 0x00dc, 0x00dc, 0x00dc,
+ 0x00dc, 0x00dc, 0x00e6, 0x00e6, 0x00dc, 0x00dc, 0x00dc, 0x00dc,
+ 0x00e6, 0x0000, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001, 0x0001,
+ 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x00dc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x0000, 0x0000, 0x0000,
+ 0x00e6, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00dc, 0x00e6, 0x00e6, 0x00ea, 0x00d6, 0x00dc,
+ 0x00ca, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e8, 0x00e4,
+ 0x00e4, 0x00dc, 0x0000, 0x00e6, 0x00e9, 0x00dc, 0x00e6, 0x00dc,
+ 0x00e6, 0x00e6, 0x0001, 0x0001, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x0001, 0x0001, 0x0001, 0x00e6, 0x00e6, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0001, 0x0001, 0x00e6,
+ 0x00dc, 0x00e6, 0x0001, 0x0001, 0x00dc, 0x00dc, 0x00dc, 0x00dc,
+ 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6,
+ 0x00e6, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x00da, 0x00e4, 0x00e8, 0x00de, 0x00e0, 0x00e0,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0008, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6, 0x00e6, 0x00e6,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0009, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x00dc, 0x00dc, 0x00dc, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0009, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0007, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x00e6, 0x0000, 0x00e6, 0x00e6, 0x00dc, 0x0000, 0x0000, 0x00e6,
+ 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00e6, 0x00e6,
+ 0x0000, 0x00e6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x001a, 0x0000,
+ 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00e6, 0x00dc,
+ 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00dc, 0x00e6, 0x00e6
+};
diff --git a/libs/port/normalize.c b/libs/port/normalize.c
index ba6e39fe0e..8363eee98e 100644
--- a/libs/port/normalize.c
+++ b/libs/port/normalize.c
@@ -21,6 +21,72 @@
#include "wine/unicode.h"
extern unsigned int wine_decompose( int flags, WCHAR ch, WCHAR *dst, unsigned int dstlen ) DECLSPEC_HIDDEN;
+extern const unsigned short combining_class_table[] DECLSPEC_HIDDEN;
+
+static BYTE get_combining_class( WCHAR c )
+{
+ return combining_class_table[combining_class_table[combining_class_table[c >> 8] + ((c >> 4) & 0xf)] + (c & 0xf)];
+}
+
+static BOOL is_starter( WCHAR c )
+{
+ return !get_combining_class( c );
+}
+
+static BOOL reorderable_pair( WCHAR c1, WCHAR c2 )
+{
+ BYTE ccc1, ccc2;
+
+ /* reorderable if ccc1 > ccc2 > 0 */
+ ccc1 = get_combining_class( c1 );
+ if (ccc1 < 2) return FALSE;
+ ccc2 = get_combining_class( c2 );
+ return ccc2 && (ccc1 > ccc2);
+}
+
+static void canonical_order_substring( WCHAR *str, unsigned int len )
+{
+ unsigned int i;
+ BOOL swapped;
+
+ do
+ {
+ swapped = FALSE;
+ for (i = 0; i < len - 1; i++)
+ {
+ if (reorderable_pair( str[i], str[i + 1] ))
+ {
+ WCHAR tmp = str[i];
+ str[i] = str[i + 1];
+ str[i + 1] = tmp;
+ swapped = TRUE;
+ }
+ }
+ } while (swapped);
+}
+
+/****************************************************************************
+ * canonical_order_string
+ *
+ * Reorder the string into canonical order - D108/D109.
+ *
+ * Starters (chars with combining class == 0) don't move, so look for continuous
+ * substrings of non-starters and only reorder those.
+ */
+static void canonical_order_string( WCHAR *str, unsigned int len )
+{
+ unsigned int i, next = 0;
+
+ for (i = 1; i <= len; i++)
+ {
+ if (i == len || is_starter( str[i] ))
+ {
+ if (i > next + 1) /* at least two successive non-starters */
+ canonical_order_substring( str + next, i - next );
+ next = i + 1;
+ }
+ }
+}
unsigned int wine_decompose_string( int flags, const WCHAR *src, unsigned int src_len,
WCHAR *dst, unsigned int dst_len )
@@ -34,5 +100,7 @@ unsigned int wine_decompose_string( int flags, const WCHAR *src, unsigned int sr
if (decomp_len == 0) return 0;
dst_pos += decomp_len;
}
+
+ if (flags & WINE_DECOMPOSE_REORDER) canonical_order_string( dst, dst_pos );
return dst_pos;
}
diff --git a/tools/make_unicode b/tools/make_unicode
index 1533c46cea..f0056d09f3 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -360,6 +360,7 @@ my @joining_table = ();
my @direction_table = ();
my @decomp_table = ();
my @compose_table = ();
+my @combining_class_table = ();
my $default_char;
my $default_wchar;
@@ -457,6 +458,10 @@ sub READ_DEFAULTS($)
{
$digitmap_table[$src] = ord $dig;
}
+ if ($comb ne "")
+ {
+ $combining_class_table[$src] = $comb;
+ }
# copy the category and direction for everything between First/Last pairs
if ($name =~ /, First>/) { $start = $src; }
@@ -2370,6 +2375,24 @@ EOF
save_file($filename);
}
+################################################################
+# dump the combining class table
+sub dump_combining_class($)
+{
+ my $filename = shift;
+
+ open OUTPUT,">$filename.new" or die "Cannot create $filename";
+ print "Building $filename\n";
+ print OUTPUT "/* Unicode Combining Classes */\n";
+ print OUTPUT "/* generated from $UNIDATA/UnicodeData.txt */\n";
+ print OUTPUT "/* DO NOT EDIT!! */\n\n";
+ print OUTPUT "#include \"wine/unicode.h\"\n\n";
+
+ dump_two_level_mapping( "combining_class_table", 0, @combining_class_table );
+ close OUTPUT;
+ save_file($filename);
+}
+
################################################################
# output a codepage definition file from the global tables
sub output_codepage_file($$$$)
@@ -2604,6 +2627,7 @@ dump_compose_table( "libs/port/compose.c" );
dump_decompose_table( "libs/port/decompose.c" );
DUMP_CTYPE_TABLES( "libs/wine/wctype.c" );
dump_digit_folding( "libs/port/digitmap.c" );
+dump_combining_class( "libs/port/combclass.c" );
dump_mirroring( "dlls/usp10/mirror.c" );
dump_mirroring( "dlls/dwrite/mirror.c" );
dump_bracket( "dlls/usp10/bracket.c" );
--
2.18.0
1
0
[PATCH 2/6] kernel32: Initial support for canonical decomposition in NormalizeString().
by Huw Davies 08 Feb '19
by Huw Davies 08 Feb '19
08 Feb '19
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/kernel32/locale.c | 56 ++++++++++++++++++++++++++++++++----
dlls/kernel32/tests/locale.c | 42 +++++++++++++--------------
include/wine/unicode.h | 4 +++
libs/port/Makefile.in | 1 +
libs/port/decompose.c | 4 +--
libs/port/mbtowc.c | 10 +++----
libs/port/normalize.c | 38 ++++++++++++++++++++++++
libs/wine/sortkey.c | 2 +-
tools/make_unicode | 4 +--
9 files changed, 124 insertions(+), 37 deletions(-)
create mode 100644 libs/port/normalize.c
diff --git a/dlls/kernel32/locale.c b/dlls/kernel32/locale.c
index e62b849d09..a4e5ef5a38 100644
--- a/dlls/kernel32/locale.c
+++ b/dlls/kernel32/locale.c
@@ -48,6 +48,7 @@
#include "winerror.h"
#include "winver.h"
#include "kernel_private.h"
+#include "wine/heap.h"
#include "wine/debug.h"
WINE_DEFAULT_DEBUG_CHANNEL(nls);
@@ -5361,12 +5362,57 @@ INT WINAPI GetUserDefaultLocaleName(LPWSTR localename, int buffersize)
/******************************************************************************
* NormalizeString (KERNEL32.@)
*/
-INT WINAPI NormalizeString(NORM_FORM NormForm, LPCWSTR lpSrcString, INT cwSrcLength,
- LPWSTR lpDstString, INT cwDstLength)
+INT WINAPI NormalizeString(NORM_FORM form, const WCHAR *src, INT src_len, WCHAR *dst, INT dst_len)
{
- FIXME("%x %p %d %p %d\n", NormForm, lpSrcString, cwSrcLength, lpDstString, cwDstLength);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+ int flags = 0, compose = 0;
+ unsigned int res, buf_len;
+ WCHAR *buf = NULL;
+
+ TRACE("%x %s %d %p %d\n", form, debugstr_wn(src, src_len), src_len, dst, dst_len);
+
+ if (src_len == -1) src_len = strlenW(src) + 1;
+
+ if (form == NormalizationKC || form == NormalizationKD) flags |= WINE_DECOMPOSE_COMPAT;
+ if (form == NormalizationC || form == NormalizationKC) compose = 1;
+
+ if (!compose && dst_len)
+ {
+ res = wine_decompose_string( flags, src, src_len, dst, dst_len );
+ if (!res)
+ {
+ SetLastError( ERROR_INSUFFICIENT_BUFFER );
+ goto done;
+ }
+ buf = dst;
+ }
+ else
+ {
+ buf_len = src_len * 4;
+ do
+ {
+ WCHAR *old_buf = buf;
+
+ buf = heap_realloc( buf, buf_len );
+ if (!buf)
+ {
+ heap_free( old_buf );
+ SetLastError( ERROR_OUTOFMEMORY );
+ return 0;
+ }
+ res = wine_decompose_string( flags, src, src_len, buf, buf_len );
+ buf_len *= 2;
+ } while (!res);
+ }
+
+ if (compose)
+ {
+ FIXME("Composing not yet implemented\n");
+ res = 0;
+ }
+
+done:
+ if (buf != dst) heap_free( buf );
+ return res;
}
/******************************************************************************
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index d93fdb224e..0fa6aeb7b4 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -5692,27 +5692,27 @@ static void test_NormalizeString(void)
};
static const struct test_data_normal test_arr[] =
{
- { part0_str1, { part0_str1, part0_nfd1, part0_str1, part0_nfd1 }, { 1, 1, 1, 1 } },
- { part0_str2, { part0_nfc2, part0_str2, part0_nfc2, part0_str2 }, { 1, 1, 1, 1 } },
- { part0_str3, { part0_nfc3, part0_str3, part0_nfc3, part0_str3 }, { 1, 1, 1, 1 } },
- { part0_str4, { part0_nfc4, part0_str4, part0_nfc4, part0_str4 }, { 1, 1, 1, 1 } },
+ { part0_str1, { part0_str1, part0_nfd1, part0_str1, part0_nfd1 }, { 1, 0, 1, 0 } },
+ { part0_str2, { part0_nfc2, part0_str2, part0_nfc2, part0_str2 }, { 1, 0, 1, 0 } },
+ { part0_str3, { part0_nfc3, part0_str3, part0_nfc3, part0_str3 }, { 1, 0, 1, 0 } },
+ { part0_str4, { part0_nfc4, part0_str4, part0_nfc4, part0_str4 }, { 1, 0, 1, 0 } },
{ part0_str5, { part0_nfc5, part0_nfc5, part0_nfc5, part0_nfc5 }, { 1, 1, 1, 1 } },
{ part0_str6, { part0_nfc6, part0_nfc6, part0_nfc6, part0_nfc6 }, { 1, 1, 1, 1 } },
- { part0_str8, { part0_str8, part0_nfd8, part0_str8, part0_nfd8 }, { 1, 1, 1, 1 } },
+ { part0_str8, { part0_str8, part0_nfd8, part0_str8, part0_nfd8 }, { 1, 0, 1, 0 } },
{ part0_str9, { part0_nfc9, part0_nfd9, part0_nfc9, part0_nfd9 }, { 1, 1, 1, 1 } },
- { part0_str10, { part0_str10, part0_nfd10, part0_str10, part0_nfd10 }, { 1, 1, 1, 1 } },
- { part0_str11, { part0_str11, part0_nfd11, part0_str11, part0_nfd11 }, { 1, 1, 1, 1 } },
- { part0_str12, { part0_nfc12, part0_nfd12, part0_nfc12, part0_nfd12 }, { 1, 1, 1, 1 } },
- { part1_str1, { part1_str1, part1_str1, part1_nfkc1, part1_nfkc1 }, { 1, 1, 1, 1 } },
- { part1_str2, { part1_str2, part1_str2, part1_nfkc2, part1_nfkc2 }, { 1, 1, 1, 1 } },
- { part1_str3, { part1_str3, part1_nfd3, part1_str3, part1_nfd3 }, { 1, 1, 1, 1 } },
- { part1_str4, { part1_str4, part1_str4, part1_nfkc4, part1_nfkc4 }, { 1, 1, 1, 1 } },
- { part1_str5, { part1_str5, part1_nfd5, part1_str5, part1_nfd5 }, { 1, 1, 1, 1 } },
- { part1_str6, { part1_str6, part1_nfd6, part1_str6, part1_nfd6 }, { 1, 1, 1, 1 } },
- { part1_str7, { part1_str7, part1_str7, part1_nfkc7, part1_nfkc7 }, { 1, 1, 1, 1 } },
- { part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 }, { 1, 1, 1, 1 } },
- { part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 }, { 1, 1, 1, 1 } },
- { part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 }, { 1, 1, 1, 1 } },
+ { part0_str10, { part0_str10, part0_nfd10, part0_str10, part0_nfd10 }, { 1, 0, 1, 0 } },
+ { part0_str11, { part0_str11, part0_nfd11, part0_str11, part0_nfd11 }, { 1, 0, 1, 0 } },
+ { part0_str12, { part0_nfc12, part0_nfd12, part0_nfc12, part0_nfd12 }, { 1, 0, 1, 0 } },
+ { part1_str1, { part1_str1, part1_str1, part1_nfkc1, part1_nfkc1 }, { 1, 0, 1, 1 } },
+ { part1_str2, { part1_str2, part1_str2, part1_nfkc2, part1_nfkc2 }, { 1, 0, 1, 1 } },
+ { part1_str3, { part1_str3, part1_nfd3, part1_str3, part1_nfd3 }, { 1, 0, 1, 0 } },
+ { part1_str4, { part1_str4, part1_str4, part1_nfkc4, part1_nfkc4 }, { 1, 0, 1, 1 } },
+ { part1_str5, { part1_str5, part1_nfd5, part1_str5, part1_nfd5 }, { 1, 0, 1, 0 } },
+ { part1_str6, { part1_str6, part1_nfd6, part1_str6, part1_nfd6 }, { 1, 0, 1, 0 } },
+ { part1_str7, { part1_str7, part1_str7, part1_nfkc7, part1_nfkc7 }, { 1, 0, 1, 1 } },
+ { part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 }, { 1, 0, 1, 0 } },
+ { part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 }, { 1, 0, 1, 1 } },
+ { part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 }, { 1, 0, 1, 1 } },
{ 0 }
};
const struct test_data_normal *ptest = test_arr;
@@ -5726,10 +5726,8 @@ static void test_NormalizeString(void)
return;
}
- todo_wine {
- dstlen = pNormalizeString( NormalizationD, ptest->str, -1, dst, 1 );
- ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Should have failed with ERROR_INSUFFICIENT_BUFFER\n");
- }
+ dstlen = pNormalizeString( NormalizationD, ptest->str, -1, dst, 1 );
+ ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER, "Should have failed with ERROR_INSUFFICIENT_BUFFER\n");
/*
* For each string, first test passing -1 as srclen to NormalizeString,
diff --git a/include/wine/unicode.h b/include/wine/unicode.h
index 35c61666d2..2c21cdfe48 100644
--- a/include/wine/unicode.h
+++ b/include/wine/unicode.h
@@ -101,6 +101,10 @@ extern int wine_compare_string( int flags, const WCHAR *str1, int len1, const WC
extern int wine_get_sortkey( int flags, const WCHAR *src, int srclen, char *dst, int dstlen );
extern int wine_fold_string( int flags, const WCHAR *src, int srclen , WCHAR *dst, int dstlen );
+extern unsigned int wine_decompose_string( int flags, const WCHAR *src, unsigned int srclen, WCHAR *dst, unsigned int dstlen );
+#define WINE_DECOMPOSE_COMPAT 1
+#define WINE_DECOMPOSE_REORDER 2
+
extern int strcmpiW( const WCHAR *str1, const WCHAR *str2 );
extern int strncmpiW( const WCHAR *str1, const WCHAR *str2, int n );
extern int memicmpW( const WCHAR *str1, const WCHAR *str2, int n );
diff --git a/libs/port/Makefile.in b/libs/port/Makefile.in
index c87b99de6d..1c753fd893 100644
--- a/libs/port/Makefile.in
+++ b/libs/port/Makefile.in
@@ -92,6 +92,7 @@ C_SRCS = \
memcpy_unaligned.c \
memmove.c \
mkstemps.c \
+ normalize.c \
poll.c \
pread.c \
pwrite.c \
diff --git a/libs/port/decompose.c b/libs/port/decompose.c
index 5e6b2214ec..c7568a01ea 100644
--- a/libs/port/decompose.c
+++ b/libs/port/decompose.c
@@ -747,7 +747,7 @@ static const WCHAR table[4704] =
0x05d1, 0x05bf, 0x05db, 0x05bf, 0x05e4, 0x05bf, 0x0000, 0x0000
};
-unsigned int DECLSPEC_HIDDEN wine_decompose( WCHAR ch, WCHAR *dst, unsigned int dstlen )
+unsigned int DECLSPEC_HIDDEN wine_decompose( int flags, WCHAR ch, WCHAR *dst, unsigned int dstlen )
{
const WCHAR *ptr = table + table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + 2 * (ch & 0xf);
unsigned int res;
@@ -756,6 +756,6 @@ unsigned int DECLSPEC_HIDDEN wine_decompose( WCHAR ch, WCHAR *dst, unsigned int
if (!*ptr) return 1;
if (dstlen <= 1) return 0;
/* apply the decomposition recursively to the first char */
- if ((res = wine_decompose( *ptr, dst, dstlen-1 ))) dst[res++] = ptr[1];
+ if ((res = wine_decompose( flags, *ptr, dst, dstlen-1 ))) dst[res++] = ptr[1];
return res;
}
diff --git a/libs/port/mbtowc.c b/libs/port/mbtowc.c
index f5d0059e15..471b87be6c 100644
--- a/libs/port/mbtowc.c
+++ b/libs/port/mbtowc.c
@@ -22,7 +22,7 @@
#include "wine/unicode.h"
-extern unsigned int wine_decompose( WCHAR ch, WCHAR *dst, unsigned int dstlen ) DECLSPEC_HIDDEN;
+extern unsigned int wine_decompose( int flags, WCHAR ch, WCHAR *dst, unsigned int dstlen ) DECLSPEC_HIDDEN;
/* check the code whether it is in Unicode Private Use Area (PUA). */
/* MB_ERR_INVALID_CHARS raises an error converting from 1-byte character to PUA. */
@@ -125,13 +125,13 @@ static int mbstowcs_sbcs_decompose( const struct sbcs_table *table, int flags,
{
WCHAR dummy[4]; /* no decomposition is larger than 4 chars */
for (len = 0; srclen; srclen--, src++)
- len += wine_decompose( cp2uni[*src], dummy, 4 );
+ len += wine_decompose( 0, cp2uni[*src], dummy, 4 );
return len;
}
for (len = dstlen; srclen && len; srclen--, src++)
{
- unsigned int res = wine_decompose( cp2uni[*src], dst, len );
+ unsigned int res = wine_decompose( 0, cp2uni[*src], dst, len );
if (!res) break;
len -= res;
dst += res;
@@ -237,7 +237,7 @@ static int mbstowcs_dbcs_decompose( const struct dbcs_table *table,
ch = cp2uni[(off << 8) + *src];
}
else ch = cp2uni[*src];
- len += wine_decompose( ch, dummy, 4 );
+ len += wine_decompose( 0, ch, dummy, 4 );
}
return len;
}
@@ -252,7 +252,7 @@ static int mbstowcs_dbcs_decompose( const struct dbcs_table *table,
ch = cp2uni[(off << 8) + *src];
}
else ch = cp2uni[*src];
- if (!(res = wine_decompose( ch, dst, len ))) break;
+ if (!(res = wine_decompose( 0, ch, dst, len ))) break;
dst += res;
len -= res;
}
diff --git a/libs/port/normalize.c b/libs/port/normalize.c
new file mode 100644
index 0000000000..ba6e39fe0e
--- /dev/null
+++ b/libs/port/normalize.c
@@ -0,0 +1,38 @@
+/*
+ * Unicode normalization functions
+ *
+ * Copyright 2019 Huw Davies
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "wine/unicode.h"
+
+extern unsigned int wine_decompose( int flags, WCHAR ch, WCHAR *dst, unsigned int dstlen ) DECLSPEC_HIDDEN;
+
+unsigned int wine_decompose_string( int flags, const WCHAR *src, unsigned int src_len,
+ WCHAR *dst, unsigned int dst_len )
+{
+ unsigned int src_pos, dst_pos = 0, decomp_len;
+
+ for (src_pos = 0; src_pos < src_len; src_pos++)
+ {
+ if (dst_pos == dst_len) return 0;
+ decomp_len = wine_decompose( flags, src[src_pos], dst + dst_pos, dst_len - dst_pos );
+ if (decomp_len == 0) return 0;
+ dst_pos += decomp_len;
+ }
+ return dst_pos;
+}
diff --git a/libs/wine/sortkey.c b/libs/wine/sortkey.c
index 634e910d4c..ef4488908b 100644
--- a/libs/wine/sortkey.c
+++ b/libs/wine/sortkey.c
@@ -19,7 +19,7 @@
*/
#include "wine/unicode.h"
-extern unsigned int wine_decompose( WCHAR ch, WCHAR *dst, unsigned int dstlen );
+extern unsigned int wine_decompose( int flags, WCHAR ch, WCHAR *dst, unsigned int dstlen );
extern const unsigned int collation_table[];
/*
diff --git a/tools/make_unicode b/tools/make_unicode
index 56d1905656..1533c46cea 100755
--- a/tools/make_unicode
+++ b/tools/make_unicode
@@ -2353,7 +2353,7 @@ sub dump_decompose_table($)
printf OUTPUT "\n};\n\n";
print OUTPUT <<"EOF";
-unsigned int DECLSPEC_HIDDEN wine_decompose( WCHAR ch, WCHAR *dst, unsigned int dstlen )
+unsigned int DECLSPEC_HIDDEN wine_decompose( int flags, WCHAR ch, WCHAR *dst, unsigned int dstlen )
{
const WCHAR *ptr = table + table[table[ch >> 8] + ((ch >> 4) & 0x0f)] + 2 * (ch & 0xf);
unsigned int res;
@@ -2362,7 +2362,7 @@ unsigned int DECLSPEC_HIDDEN wine_decompose( WCHAR ch, WCHAR *dst, unsigned int
if (!*ptr) return 1;
if (dstlen <= 1) return 0;
/* apply the decomposition recursively to the first char */
- if ((res = wine_decompose( *ptr, dst, dstlen-1 ))) dst[res++] = ptr[1];
+ if ((res = wine_decompose( flags, *ptr, dst, dstlen-1 ))) dst[res++] = ptr[1];
return res;
}
EOF
--
2.18.0
1
0
Signed-off-by: Huw Davies <huw(a)codeweavers.com>
---
dlls/kernel32/tests/locale.c | 86 +++++++++++++++++++-----------------
1 file changed, 45 insertions(+), 41 deletions(-)
diff --git a/dlls/kernel32/tests/locale.c b/dlls/kernel32/tests/locale.c
index 3357d0db9e..d93fdb224e 100644
--- a/dlls/kernel32/tests/locale.c
+++ b/dlls/kernel32/tests/locale.c
@@ -5688,30 +5688,31 @@ static void test_NormalizeString(void)
struct test_data_normal {
const WCHAR *str;
const WCHAR *expected[4];
+ BOOL todo[4];
};
static const struct test_data_normal test_arr[] =
{
- { part0_str1, { part0_str1, part0_nfd1, part0_str1, part0_nfd1 } },
- { part0_str2, { part0_nfc2, part0_str2, part0_nfc2, part0_str2 } },
- { part0_str3, { part0_nfc3, part0_str3, part0_nfc3, part0_str3 } },
- { part0_str4, { part0_nfc4, part0_str4, part0_nfc4, part0_str4 } },
- { part0_str5, { part0_nfc5, part0_nfc5, part0_nfc5, part0_nfc5 } },
- { part0_str6, { part0_nfc6, part0_nfc6, part0_nfc6, part0_nfc6 } },
- { part0_str8, { part0_str8, part0_nfd8, part0_str8, part0_nfd8 } },
- { part0_str9, { part0_nfc9, part0_nfd9, part0_nfc9, part0_nfd9 } },
- { part0_str10, { part0_str10, part0_nfd10, part0_str10, part0_nfd10 } },
- { part0_str11, { part0_str11, part0_nfd11, part0_str11, part0_nfd11 } },
- { part0_str12, { part0_nfc12, part0_nfd12, part0_nfc12, part0_nfd12 } },
- { part1_str1, { part1_str1, part1_str1, part1_nfkc1, part1_nfkc1 } },
- { part1_str2, { part1_str2, part1_str2, part1_nfkc2, part1_nfkc2 } },
- { part1_str3, { part1_str3, part1_nfd3, part1_str3, part1_nfd3 } },
- { part1_str4, { part1_str4, part1_str4, part1_nfkc4, part1_nfkc4 } },
- { part1_str5, { part1_str5, part1_nfd5, part1_str5, part1_nfd5 } },
- { part1_str6, { part1_str6, part1_nfd6, part1_str6, part1_nfd6 } },
- { part1_str7, { part1_str7, part1_str7, part1_nfkc7, part1_nfkc7 } },
- { part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 } },
- { part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 } },
- { part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 } },
+ { part0_str1, { part0_str1, part0_nfd1, part0_str1, part0_nfd1 }, { 1, 1, 1, 1 } },
+ { part0_str2, { part0_nfc2, part0_str2, part0_nfc2, part0_str2 }, { 1, 1, 1, 1 } },
+ { part0_str3, { part0_nfc3, part0_str3, part0_nfc3, part0_str3 }, { 1, 1, 1, 1 } },
+ { part0_str4, { part0_nfc4, part0_str4, part0_nfc4, part0_str4 }, { 1, 1, 1, 1 } },
+ { part0_str5, { part0_nfc5, part0_nfc5, part0_nfc5, part0_nfc5 }, { 1, 1, 1, 1 } },
+ { part0_str6, { part0_nfc6, part0_nfc6, part0_nfc6, part0_nfc6 }, { 1, 1, 1, 1 } },
+ { part0_str8, { part0_str8, part0_nfd8, part0_str8, part0_nfd8 }, { 1, 1, 1, 1 } },
+ { part0_str9, { part0_nfc9, part0_nfd9, part0_nfc9, part0_nfd9 }, { 1, 1, 1, 1 } },
+ { part0_str10, { part0_str10, part0_nfd10, part0_str10, part0_nfd10 }, { 1, 1, 1, 1 } },
+ { part0_str11, { part0_str11, part0_nfd11, part0_str11, part0_nfd11 }, { 1, 1, 1, 1 } },
+ { part0_str12, { part0_nfc12, part0_nfd12, part0_nfc12, part0_nfd12 }, { 1, 1, 1, 1 } },
+ { part1_str1, { part1_str1, part1_str1, part1_nfkc1, part1_nfkc1 }, { 1, 1, 1, 1 } },
+ { part1_str2, { part1_str2, part1_str2, part1_nfkc2, part1_nfkc2 }, { 1, 1, 1, 1 } },
+ { part1_str3, { part1_str3, part1_nfd3, part1_str3, part1_nfd3 }, { 1, 1, 1, 1 } },
+ { part1_str4, { part1_str4, part1_str4, part1_nfkc4, part1_nfkc4 }, { 1, 1, 1, 1 } },
+ { part1_str5, { part1_str5, part1_nfd5, part1_str5, part1_nfd5 }, { 1, 1, 1, 1 } },
+ { part1_str6, { part1_str6, part1_nfd6, part1_str6, part1_nfd6 }, { 1, 1, 1, 1 } },
+ { part1_str7, { part1_str7, part1_str7, part1_nfkc7, part1_nfkc7 }, { 1, 1, 1, 1 } },
+ { part1_str8, { part1_str8, part1_nfd8, part1_str8, part1_nfd8 }, { 1, 1, 1, 1 } },
+ { part1_str9, { part1_str9, part1_str9, part1_nfkc9, part1_nfkc9 }, { 1, 1, 1, 1 } },
+ { part1_str10, { part1_str10, part1_str10, part1_nfkc10, part1_nfkc10 }, { 1, 1, 1, 1 } },
{ 0 }
};
const struct test_data_normal *ptest = test_arr;
@@ -5742,26 +5743,29 @@ static void test_NormalizeString(void)
for (i = 0; i < 4; i++)
{
- todo_wine {
- dstlen = pNormalizeString( norm_forms[i], ptest->str, -1, NULL, 0 );
- if (dstlen)
- {
- dstlen = pNormalizeString( norm_forms[i], ptest->str, -1, dst, dstlen );
- ok(dstlen == strlenW( ptest->expected[i] )+1, "Copied length differed: was %d, should be %d\n",
- dstlen, strlenW( ptest->expected[i] )+1);
- str_cmp = strncmpW( ptest->expected[i], dst, dstlen+1 );
- ok( str_cmp == 0, "test failed: returned value was %d\n", str_cmp );
- }
-
- dstlen = pNormalizeString( norm_forms[i], ptest->str, strlenW(ptest->str), NULL, 0 );
- if (dstlen)
- {
- dstlen = pNormalizeString( norm_forms[i], ptest->str, strlenW(ptest->str), dst, dstlen );
- ok(dstlen == strlenW( ptest->expected[i] ), "Copied length differed: was %d, should be %d\n",
- dstlen, strlenW( ptest->expected[i] ));
- str_cmp = strncmpW( ptest->expected[i], dst, dstlen );
- ok( str_cmp == 0, "test failed: returned value was %d\n", str_cmp );
- }
+ dstlen = pNormalizeString( norm_forms[i], ptest->str, -1, NULL, 0 );
+ if (dstlen)
+ {
+ dstlen = pNormalizeString( norm_forms[i], ptest->str, -1, dst, dstlen );
+ ok(dstlen == strlenW( dst )+1, "%s:%d: Copied length differed: was %d, should be %d\n",
+ wine_dbgstr_w(ptest->str), i, dstlen, strlenW( dst )+1);
+ str_cmp = strncmpW( ptest->expected[i], dst, dstlen+1 );
+todo_wine_if(ptest->todo[i])
+ ok( str_cmp == 0, "%s:%d: string incorrect got %s expect %s\n", wine_dbgstr_w(ptest->str), i,
+ wine_dbgstr_w(dst), wine_dbgstr_w(ptest->expected[i]) );
+ }
+
+ dstlen = pNormalizeString( norm_forms[i], ptest->str, strlenW(ptest->str), NULL, 0 );
+ if (dstlen)
+ {
+ memset(dst, 0, sizeof(dst));
+ dstlen = pNormalizeString( norm_forms[i], ptest->str, strlenW(ptest->str), dst, dstlen );
+ ok(dstlen == strlenW( dst ), "%s:%d: Copied length differed: was %d, should be %d\n",
+ wine_dbgstr_w(ptest->str), i, dstlen, strlenW( dst ));
+ str_cmp = strncmpW( ptest->expected[i], dst, dstlen );
+todo_wine_if(ptest->todo[i])
+ ok( str_cmp == 0, "%s:%d: string incorrect got %s expect %s\n", wine_dbgstr_w(ptest->str), i,
+ wine_dbgstr_w(dst), wine_dbgstr_w(ptest->expected[i]) );
}
}
ptest++;
--
2.18.0
1
0
08 Feb '19
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/secur32/schannel_gnutls.c | 23 +++++++++++++++++++++--
1 file changed, 21 insertions(+), 2 deletions(-)
diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c
index ddb10ac..d14e6f3 100644
--- a/dlls/secur32/schannel_gnutls.c
+++ b/dlls/secur32/schannel_gnutls.c
@@ -54,6 +54,12 @@ static int (*pgnutls_cipher_get_block_size)(gnutls_cipher_algorithm_t);
/* Not present in gnutls version < 3.4.0. */
static int (*pgnutls_privkey_export_x509)(gnutls_privkey_t, gnutls_x509_privkey_t *);
+static int (*pgnutls_privkey_import_rsa_raw)(gnutls_privkey_t, const gnutls_datum_t *,
+ const gnutls_datum_t *, const gnutls_datum_t *,
+ const gnutls_datum_t *, const gnutls_datum_t *,
+ const gnutls_datum_t *, const gnutls_datum_t *,
+ const gnutls_datum_t *);
+
static void *libgnutls_handle;
#define MAKE_FUNCPTR(f) static typeof(f) * p##f
MAKE_FUNCPTR(gnutls_alert_get);
@@ -79,7 +85,6 @@ MAKE_FUNCPTR(gnutls_perror);
MAKE_FUNCPTR(gnutls_protocol_get_version);
MAKE_FUNCPTR(gnutls_priority_set_direct);
MAKE_FUNCPTR(gnutls_privkey_deinit);
-MAKE_FUNCPTR(gnutls_privkey_import_rsa_raw);
MAKE_FUNCPTR(gnutls_privkey_init);
MAKE_FUNCPTR(gnutls_record_get_max_size);
MAKE_FUNCPTR(gnutls_record_recv);
@@ -138,6 +143,16 @@ static int compat_gnutls_privkey_export_x509(gnutls_privkey_t privkey, gnutls_x5
return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
}
+static int compat_gnutls_privkey_import_rsa_raw(gnutls_privkey_t key, const gnutls_datum_t *p1,
+ const gnutls_datum_t *p2, const gnutls_datum_t *p3,
+ const gnutls_datum_t *p4, const gnutls_datum_t *p5,
+ const gnutls_datum_t *p6, const gnutls_datum_t *p7,
+ const gnutls_datum_t *p8)
+{
+ FIXME("\n");
+ return GNUTLS_E_UNKNOWN_PK_ALGORITHM;
+}
+
static ssize_t schan_pull_adapter(gnutls_transport_ptr_t transport,
void *buff, size_t buff_len)
{
@@ -897,7 +912,6 @@ BOOL schan_imp_init(void)
LOAD_FUNCPTR(gnutls_protocol_get_version)
LOAD_FUNCPTR(gnutls_priority_set_direct)
LOAD_FUNCPTR(gnutls_privkey_deinit)
- LOAD_FUNCPTR(gnutls_privkey_import_rsa_raw)
LOAD_FUNCPTR(gnutls_privkey_init)
LOAD_FUNCPTR(gnutls_record_get_max_size);
LOAD_FUNCPTR(gnutls_record_recv);
@@ -924,6 +938,11 @@ BOOL schan_imp_init(void)
WARN("gnutls_privkey_export_x509 not found\n");
pgnutls_privkey_export_x509 = compat_gnutls_privkey_export_x509;
}
+ if (!(pgnutls_privkey_import_rsa_raw = wine_dlsym(libgnutls_handle, "gnutls_privkey_import_rsa_raw", NULL, 0)))
+ {
+ WARN("gnutls_privkey_import_rsa_raw not found\n");
+ pgnutls_privkey_import_rsa_raw = compat_gnutls_privkey_import_rsa_raw;
+ }
ret = pgnutls_global_init();
if (ret != GNUTLS_E_SUCCESS)
--
1.9.1
2
3
[PATCH] wininet: Trace modifiers in hexadecimal in HttpAddRequestHeaders.
by Hans Leidekker 08 Feb '19
by Hans Leidekker 08 Feb '19
08 Feb '19
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/wininet/http.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/wininet/http.c b/dlls/wininet/http.c
index 4122067e41..54bb569eb9 100644
--- a/dlls/wininet/http.c
+++ b/dlls/wininet/http.c
@@ -1335,7 +1335,7 @@ BOOL WINAPI HttpAddRequestHeadersW(HINTERNET hHttpRequest,
http_request_t *request;
DWORD res = ERROR_INTERNET_INCORRECT_HANDLE_TYPE;
- TRACE("%p, %s, %i, %i\n", hHttpRequest, debugstr_wn(lpszHeader, dwHeaderLength), dwHeaderLength, dwModifier);
+ TRACE("%p, %s, %u, %08x\n", hHttpRequest, debugstr_wn(lpszHeader, dwHeaderLength), dwHeaderLength, dwModifier);
if (!lpszHeader)
return TRUE;
@@ -1367,7 +1367,7 @@ BOOL WINAPI HttpAddRequestHeadersA(HINTERNET hHttpRequest,
WCHAR *headers = NULL;
BOOL r;
- TRACE("%p, %s, %i, %i\n", hHttpRequest, debugstr_an(lpszHeader, dwHeaderLength), dwHeaderLength, dwModifier);
+ TRACE("%p, %s, %u, %08x\n", hHttpRequest, debugstr_an(lpszHeader, dwHeaderLength), dwHeaderLength, dwModifier);
if(lpszHeader)
headers = heap_strndupAtoW(lpszHeader, dwHeaderLength, &dwHeaderLength);
--
2.20.1
1
0
08 Feb '19
Signed-off-by: Byeongsik Jeon <bsjeon(a)hanmail.net>
---
dlls/gdi32/freetype.c | 77 ++++++++++++++++++++++++++++---------------
1 file changed, 50 insertions(+), 27 deletions(-)
diff --git a/dlls/gdi32/freetype.c b/dlls/gdi32/freetype.c
index b21365d61e..f4cb5d5c27 100644
--- a/dlls/gdi32/freetype.c
+++ b/dlls/gdi32/freetype.c
@@ -4697,6 +4697,52 @@ static void free_font(GdiFont *font)
HeapFree(GetProcessHeap(), 0, font);
}
+/* TODO: GGO format support */
+static BOOL get_cached_metrics( GdiFont *font, UINT index, GLYPHMETRICS *gm, ABC *abc )
+{
+ UINT block = index / GM_BLOCK_SIZE;
+ UINT entry = index % GM_BLOCK_SIZE;
+
+ if (block < font->gmsize && font->gm[block] && font->gm[block][entry].init)
+ {
+ *gm = font->gm[block][entry].gm;
+ *abc = font->gm[block][entry].abc;
+
+ TRACE( "cached gm: %u, %u, %s, %d, %d abc: %d, %u, %d\n",
+ gm->gmBlackBoxX, gm->gmBlackBoxY, wine_dbgstr_point( &gm->gmptGlyphOrigin ),
+ gm->gmCellIncX, gm->gmCellIncY, abc->abcA, abc->abcB, abc->abcC );
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static void set_cached_metrics( GdiFont *font, UINT index, const GLYPHMETRICS *gm, const ABC *abc )
+{
+ UINT block = index / GM_BLOCK_SIZE;
+ UINT entry = index % GM_BLOCK_SIZE;
+
+ if (block >= font->gmsize)
+ {
+ GM **ptr = HeapReAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+ font->gm, (block + 1) * sizeof(GM *) );
+ if (!ptr) return;
+
+ font->gmsize = block + 1;
+ font->gm = ptr;
+ }
+
+ if (!font->gm[block])
+ {
+ font->gm[block] = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(GM) * GM_BLOCK_SIZE );
+ if (!font->gm[block]) return;
+ }
+
+ font->gm[block][entry].gm = *gm;
+ font->gm[block][entry].abc = *abc;
+ font->gm[block][entry].init = TRUE;
+}
static DWORD get_font_data( GdiFont *font, DWORD table, DWORD offset, LPVOID buf, DWORD cbData)
{
@@ -7063,7 +7109,6 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
BOOL needsTransform = FALSE;
BOOL tategaki = (font->name[0] == '@');
BOOL vertical_metrics;
- UINT original_index;
TRACE("%p, %04x, %08x, %p, %08x, %p, %p\n", font, glyph, format, lpgm,
buflen, buf, lpmat);
@@ -7080,7 +7125,6 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
TRACE("translate glyph index %04x -> %04x\n", glyph, glyph_index);
} else
glyph_index = glyph;
- original_index = glyph_index;
format &= ~GGO_GLYPH_INDEX;
/* TODO: Window also turns off tategaki for glyphs passed in by index
if their unicode code points fall outside of the range that is
@@ -7089,32 +7133,15 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
BOOL vert;
get_glyph_index_linked(incoming_font, glyph, &font, &glyph_index, &vert);
ft_face = font->ft_face;
- original_index = glyph_index;
if (!vert && tategaki)
tategaki = check_unicode_tategaki(glyph);
}
format &= ~GGO_UNHINTED;
- if(original_index >= font->gmsize * GM_BLOCK_SIZE) {
- font->gmsize = (original_index / GM_BLOCK_SIZE + 1);
- font->gm = HeapReAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, font->gm,
- font->gmsize * sizeof(GM*));
- } else {
- if (format == GGO_METRICS && font->gm[original_index / GM_BLOCK_SIZE] != NULL &&
- FONT_GM(font,original_index)->init && is_identity_MAT2(lpmat))
- {
- *lpgm = FONT_GM(font,original_index)->gm;
- *abc = FONT_GM(font,original_index)->abc;
- TRACE("cached: %u,%u,%s,%d,%d\n", lpgm->gmBlackBoxX, lpgm->gmBlackBoxY,
- wine_dbgstr_point(&lpgm->gmptGlyphOrigin),
- lpgm->gmCellIncX, lpgm->gmCellIncY);
- return 1; /* FIXME */
- }
- }
-
- if (!font->gm[original_index / GM_BLOCK_SIZE])
- font->gm[original_index / GM_BLOCK_SIZE] = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, sizeof(GM) * GM_BLOCK_SIZE);
+ if (format == GGO_METRICS && is_identity_MAT2(lpmat) &&
+ get_cached_metrics( font, glyph_index, lpgm, abc ))
+ return 1; /* FIXME */
needsTransform = get_transform_matrices( font, tategaki, lpmat, matrices );
@@ -7254,11 +7281,7 @@ static DWORD get_glyph_outline(GdiFont *incoming_font, UINT glyph, UINT format,
if ((format == GGO_METRICS || format == GGO_BITMAP || format == WINE_GGO_GRAY16_BITMAP) &&
is_identity_MAT2(lpmat)) /* don't cache custom transforms */
- {
- FONT_GM(font,original_index)->gm = gm;
- FONT_GM(font,original_index)->abc = *abc;
- FONT_GM(font,original_index)->init = TRUE;
- }
+ set_cached_metrics( font, glyph_index, &gm, abc );
if(format == GGO_METRICS)
{
--
2.20.1
2
7
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/dwrite_private.h | 5 +--
dlls/dwrite/freetype.c | 61 +++++++++++++++++++++---------------
2 files changed, 38 insertions(+), 28 deletions(-)
diff --git a/dlls/dwrite/dwrite_private.h b/dlls/dwrite/dwrite_private.h
index 0451a7e3f0..e2aa2131a1 100644
--- a/dlls/dwrite/dwrite_private.h
+++ b/dlls/dwrite/dwrite_private.h
@@ -320,8 +320,9 @@ extern void release_freetype(void) DECLSPEC_HIDDEN;
extern HRESULT freetype_get_design_glyph_metrics(IDWriteFontFace4*,UINT16,UINT16,DWRITE_GLYPH_METRICS*) DECLSPEC_HIDDEN;
extern void freetype_notify_cacheremove(IDWriteFontFace4*) DECLSPEC_HIDDEN;
extern BOOL freetype_is_monospaced(IDWriteFontFace4*) DECLSPEC_HIDDEN;
-extern HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4*,FLOAT,UINT16 const*,FLOAT const*, DWRITE_GLYPH_OFFSET const*,
- UINT32,BOOL,IDWriteGeometrySink*) DECLSPEC_HIDDEN;
+extern HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4 *fontface, float emsize, UINT16 const *glyphs,
+ float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
+ IDWriteGeometrySink *sink) DECLSPEC_HIDDEN;
extern UINT16 freetype_get_glyphcount(IDWriteFontFace4*) DECLSPEC_HIDDEN;
extern void freetype_get_glyphs(IDWriteFontFace4*,INT,UINT32 const*,UINT32,UINT16*) DECLSPEC_HIDDEN;
extern BOOL freetype_has_kerning_pairs(IDWriteFontFace4*) DECLSPEC_HIDDEN;
diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c
index d3036537f0..29acb5e0de 100644
--- a/dlls/dwrite/freetype.c
+++ b/dlls/dwrite/freetype.c
@@ -438,7 +438,7 @@ static int decompose_cubic_to(const FT_Vector *control1, const FT_Vector *contro
return 0;
}
-static void decompose_outline(FT_Outline *outline, FLOAT xoffset, FLOAT yoffset, IDWriteGeometrySink *sink)
+static void decompose_outline(FT_Outline *outline, D2D1_POINT_2F offset, IDWriteGeometrySink *sink)
{
static const FT_Outline_Funcs decompose_funcs = {
decompose_move_to,
@@ -451,8 +451,8 @@ static void decompose_outline(FT_Outline *outline, FLOAT xoffset, FLOAT yoffset,
struct decompose_context context;
context.sink = sink;
- context.xoffset = xoffset;
- context.yoffset = yoffset;
+ context.xoffset = offset.x;
+ context.yoffset = offset.y;
context.figure_started = FALSE;
context.move_to = FALSE;
context.origin.x = 0;
@@ -485,8 +485,9 @@ static void embolden_glyph(FT_Glyph glyph, FLOAT emsize)
embolden_glyph_outline(&outline_glyph->outline, emsize);
}
-HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4 *fontface, FLOAT emSize, UINT16 const *glyphs,
- FLOAT const *advances, DWRITE_GLYPH_OFFSET const *offsets, UINT32 count, BOOL is_rtl, IDWriteGeometrySink *sink)
+HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4 *fontface, float emSize, UINT16 const *glyphs,
+ float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
+ IDWriteGeometrySink *sink)
{
FTC_ScalerRec scaler;
USHORT simulations;
@@ -509,14 +510,19 @@ HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4 *fontface, FLOAT emSize,
EnterCriticalSection(&freetype_cs);
if (pFTC_Manager_LookupSize(cache_manager, &scaler, &size) == 0) {
- FLOAT advance = 0.0f;
- UINT32 g;
-
- for (g = 0; g < count; g++) {
- if (pFT_Load_Glyph(size->face, glyphs[g], FT_LOAD_NO_BITMAP) == 0) {
+ float rtl_factor = is_rtl ? -1.0f : 1.0f;
+ D2D1_POINT_2F origin;
+ unsigned int i;
+
+ origin.x = origin.y = 0.0f;
+ for (i = 0; i < count; ++i)
+ {
+ if (pFT_Load_Glyph(size->face, glyphs[i], FT_LOAD_NO_BITMAP) == 0)
+ {
FLOAT ft_advance = size->face->glyph->metrics.horiAdvance >> 6;
FT_Outline *outline = &size->face->glyph->outline;
- FLOAT xoffset = 0.0f, yoffset = 0.0f;
+ D2D1_POINT_2F glyph_origin;
+ float advance;
FT_Matrix m;
if (simulations & DWRITE_FONT_SIMULATIONS_BOLD)
@@ -529,23 +535,25 @@ HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4 *fontface, FLOAT emSize,
pFT_Outline_Transform(outline, &m);
+ if (advances)
+ advance = rtl_factor * advances[i];
+ else
+ advance = rtl_factor * ft_advance;
+
+ glyph_origin = origin;
+ if (is_rtl)
+ glyph_origin.x += advance;
+
/* glyph offsets act as current glyph adjustment */
- if (offsets) {
- xoffset += is_rtl ? -offsets[g].advanceOffset : offsets[g].advanceOffset;
- yoffset -= offsets[g].ascenderOffset;
+ if (offsets)
+ {
+ glyph_origin.x += rtl_factor * offsets[i].advanceOffset;
+ glyph_origin.y -= offsets[i].ascenderOffset;
}
- if (g == 0 && is_rtl)
- advance = advances ? -advances[g] : -ft_advance;
-
- xoffset += advance;
- decompose_outline(outline, xoffset, yoffset, sink);
+ decompose_outline(outline, glyph_origin, sink);
- /* update advance to next glyph */
- if (advances)
- advance += is_rtl ? -advances[g] : advances[g];
- else
- advance += is_rtl ? -ft_advance : ft_advance;
+ origin.x += advance;
}
}
}
@@ -959,8 +967,9 @@ BOOL freetype_is_monospaced(IDWriteFontFace4 *fontface)
return FALSE;
}
-HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4 *fontface, FLOAT emSize, UINT16 const *glyphs, FLOAT const *advances,
- DWRITE_GLYPH_OFFSET const *offsets, UINT32 count, BOOL is_rtl, IDWriteGeometrySink *sink)
+HRESULT freetype_get_glyphrun_outline(IDWriteFontFace4 *fontface, float emSize, UINT16 const *glyphs,
+ float const *advances, DWRITE_GLYPH_OFFSET const *offsets, unsigned int count, BOOL is_rtl,
+ IDWriteGeometrySink *sink)
{
return E_NOTIMPL;
}
--
2.20.1
1
1
08 Feb '19
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/secur32/schannel.c | 10 +---------
dlls/secur32/tests/schannel.c | 5 +++--
2 files changed, 4 insertions(+), 11 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index 5caaece8a5..8063fd4d6b 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -915,17 +915,9 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW(
pInput->pBuffers[1].cbBuffer = pInput->pBuffers[0].cbBuffer-ctx->transport.in.offset;
}
- *pfContextAttr = 0;
- if (ctx->req_ctx_attr & ISC_REQ_REPLAY_DETECT)
- *pfContextAttr |= ISC_RET_REPLAY_DETECT;
- if (ctx->req_ctx_attr & ISC_REQ_SEQUENCE_DETECT)
- *pfContextAttr |= ISC_RET_SEQUENCE_DETECT;
- if (ctx->req_ctx_attr & ISC_REQ_CONFIDENTIALITY)
- *pfContextAttr |= ISC_RET_CONFIDENTIALITY;
+ *pfContextAttr = ISC_RET_REPLAY_DETECT | ISC_RET_SEQUENCE_DETECT | ISC_RET_CONFIDENTIALITY | ISC_RET_STREAM;
if (ctx->req_ctx_attr & ISC_REQ_ALLOCATE_MEMORY)
*pfContextAttr |= ISC_RET_ALLOCATED_MEMORY;
- if (ctx->req_ctx_attr & ISC_REQ_STREAM)
- *pfContextAttr |= ISC_RET_STREAM;
if (ctx->req_ctx_attr & ISC_REQ_USE_SUPPLIED_CREDS)
*pfContextAttr |= ISC_RET_USED_SUPPLIED_CREDS;
diff --git a/dlls/secur32/tests/schannel.c b/dlls/secur32/tests/schannel.c
index 6ae76eab1a..426bf66014 100644
--- a/dlls/secur32/tests/schannel.c
+++ b/dlls/secur32/tests/schannel.c
@@ -860,7 +860,7 @@ todo_wine
buf->BufferType = SECBUFFER_TOKEN;
status = InitializeSecurityContextA(&cred_handle, &context, (SEC_CHAR *)"localhost",
- ISC_REQ_CONFIDENTIALITY|ISC_REQ_STREAM|ISC_REQ_USE_SUPPLIED_CREDS,
+ ISC_REQ_USE_SUPPLIED_CREDS,
0, 0, &buffers[1], 0, NULL, &buffers[0], &attrs, NULL);
buffers[1].pBuffers[0].cbBuffer = buf_size;
}
@@ -871,7 +871,8 @@ todo_wine
skip("Handshake failed\n");
return;
}
- ok(attrs & (ISC_RET_CONFIDENTIALITY|ISC_RET_STREAM|ISC_RET_USED_SUPPLIED_CREDS), "got %08x\n", attrs);
+ ok(attrs == (ISC_RET_REPLAY_DETECT|ISC_RET_SEQUENCE_DETECT|ISC_RET_CONFIDENTIALITY|ISC_RET_STREAM|ISC_RET_USED_SUPPLIED_CREDS),
+ "got %08x\n", attrs);
status = QueryCredentialsAttributesA(&cred_handle, SECPKG_CRED_ATTR_NAMES, &names);
ok(status == SEC_E_NO_CREDENTIALS || status == SEC_E_UNSUPPORTED_FUNCTION /* before Vista */, "expected SEC_E_NO_CREDENTIALS, got %08x\n", status);
--
2.11.0
1
0