36#define NATIVE_DIGITS_LEN 11
45#define _OT(a,b,c,d) DWRITE_MAKE_OPENTYPE_TAG(a,b,c,d)
49 { { 0x7a7a7a5a, 999, 15, 0x0020, 0, 0, 0, 0, 0, 0, 0 } },
50 { { 0x7979795a, 998, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 } },
51 { { 0x686e695a, 994, 15, 0x0020, 1, 0, 0, 0, 0, 0, 0 } },
52 { { 0x62617241, 160, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'a',
'r',
'a',
'b') },
TRUE },
53 { { 0x6e6d7241, 230, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'a',
'r',
'm',
'n') } },
54 { { 0x74737641, 134, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'a',
'v',
's',
't') } },
55 { { 0x696c6142, 360, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'a',
'l',
'i') } },
56 { { 0x756d6142, 435, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'a',
'm',
'u') } },
57 { { 0x6b746142, 365, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'a',
't',
'k') } },
58 { { 0x676e6542, 325, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
'b',
'n',
'g',
'2'),
_OT(
'b',
'e',
'n',
'g') },
TRUE },
59 { { 0x6f706f42, 285, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'b',
'o',
'p',
'o') } },
60 { { 0x68617242, 300, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'r',
'a',
'h') } },
61 { { 0x69617242, 570, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'r',
'a',
'i') },
TRUE },
62 { { 0x69677542, 367, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'u',
'g',
'i') } },
63 { { 0x64687542, 372, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'u',
'h',
'd') } },
64 { { 0x736e6143, 440, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'a',
'n',
's') },
TRUE },
65 { { 0x69726143, 201, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'a',
'r',
'i') } },
66 { { 0x6d616843, 358, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'h',
'a',
'm') } },
67 { { 0x72656843, 445, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'h',
'e',
'r') },
TRUE },
68 { { 0x74706f43, 204, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'o',
'p',
't') } },
69 { { 0x78757358, 20, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'x',
's',
'u',
'x') } },
70 { { 0x74727043, 403, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'p',
'r',
't') } },
71 { { 0x6c727943, 220, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'y',
'r',
'l') } },
72 { { 0x74727344, 250, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'd',
's',
'r',
't') },
TRUE },
73 { { 0x61766544, 315, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
'd',
'e',
'v',
'2'),
_OT(
'd',
'e',
'v',
'a') },
TRUE },
74 { { 0x70796745, 50, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'e',
'g',
'y',
'p') } },
75 { { 0x69687445, 430, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'e',
't',
'h',
'i') },
TRUE },
76 { { 0x726f6547, 240, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'g',
'e',
'o',
'r') } },
77 { { 0x67616c47, 225, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'g',
'l',
'a',
'g') } },
78 { { 0x68746f47, 206, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'g',
'o',
't',
'h') } },
79 { { 0x6b657247, 200, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'g',
'r',
'e',
'k') } },
80 { { 0x726a7547, 320, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'g',
'j',
'r',
'2'),
_OT(
'g',
'u',
'j',
'r') },
TRUE },
81 { { 0x75727547, 310, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
'g',
'u',
'r',
'2'),
_OT(
'g',
'u',
'r',
'u') },
TRUE },
82 { { 0x696e6148, 500, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'h',
'a',
'n',
'i') } },
83 { { 0x676e6148, 286, 8, 0x0020, 1, 1, 1, 1, 0, 0, 0 }, {
_OT(
'h',
'a',
'n',
'g') },
TRUE },
84 { { 0x6f6e6148, 371, 8, 0x0020, 0, 0, 1, 0, 0, 0, 0 }, {
_OT(
'h',
'a',
'n',
'o') } },
85 { { 0x72626548, 125, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'h',
'e',
'b',
'r') },
TRUE },
86 { { 0x61726948, 410, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'k',
'a',
'n',
'a') } },
87 { { 0x696d7241, 124, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'a',
'r',
'm',
'i') } },
88 { { 0x696c6850, 131, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'p',
'h',
'l',
'i') } },
89 { { 0x69747250, 130, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'p',
'r',
't',
'i') } },
90 { { 0x6176614a, 361, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 }, {
_OT(
'j',
'a',
'v',
'a') } },
91 { { 0x6968744b, 317, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
'k',
't',
'h',
'i') } },
92 { { 0x61646e4b, 345, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'k',
'n',
'd',
'2'),
_OT(
'k',
'n',
'd',
'a') },
TRUE },
93 { { 0x616e614b, 411, 8, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'k',
'a',
'n',
'a') } },
94 { { 0x696c614b, 357, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'k',
'a',
'l',
'i') } },
95 { { 0x7261684b, 305, 15, 0x0020, 1, 0, 1, 0, 0, 0, 0 }, {
_OT(
'k',
'h',
'a',
'r') } },
96 { { 0x726d684b, 355, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 }, {
_OT(
'k',
'h',
'm',
'r') },
TRUE },
97 { { 0x6f6f614c, 356, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 }, {
_OT(
'l',
'a',
'o',
' ') },
TRUE },
98 { { 0x6e74614c, 215, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'l',
'a',
't',
'n') } },
99 { { 0x6370654c, 335, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'l',
'e',
'p',
'c') } },
100 { { 0x626d694c, 336, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'l',
'i',
'm',
'b') } },
101 { { 0x626e694c, 401, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'l',
'i',
'n',
'b') } },
102 { { 0x7573694c, 399, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'l',
'i',
's',
'u') } },
103 { { 0x6963794c, 202, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'l',
'y',
'c',
'i') } },
104 { { 0x6964794c, 116, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'l',
'y',
'd',
'i') } },
105 { { 0x6d796c4d, 347, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'l',
'm',
'2'),
_OT(
'm',
'l',
'y',
'm') },
TRUE },
106 { { 0x646e614d, 140, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'm',
'a',
'n',
'd') } },
107 { { 0x6965744d, 337, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
't',
'e',
'i') } },
108 { { 0x676e6f4d, 145, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'm',
'o',
'n',
'g') },
TRUE },
109 { { 0x726d794d, 350, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'y',
'm',
'r') },
TRUE },
110 { { 0x756c6154, 354, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'a',
'l',
'u') },
TRUE },
111 { { 0x6f6f6b4e, 165, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'n',
'k',
'o',
' ') },
TRUE },
112 { { 0x6d61674f, 212, 1, 0x1680, 0, 1, 0, 0, 0, 1, 0 }, {
_OT(
'o',
'g',
'a',
'm') },
TRUE },
113 { { 0x6b636c4f, 261, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'o',
'l',
'c',
'k') } },
114 { { 0x6c617449, 210, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'i',
't',
'a',
'l') } },
115 { { 0x6f657058, 30, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 }, {
_OT(
'x',
'p',
'e',
'o') },
TRUE },
116 { { 0x62726153, 105, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'a',
'r',
'b') } },
117 { { 0x686b724f, 175, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'o',
'r',
'k',
'h') } },
118 { { 0x6179724f, 327, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'o',
'r',
'y',
'2'),
_OT(
'o',
'r',
'y',
'a') },
TRUE },
119 { { 0x616d734f, 260, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'o',
's',
'm',
'a') },
TRUE },
120 { { 0x67616850, 331, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'p',
'h',
'a',
'g') },
TRUE },
121 { { 0x786e6850, 115, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 }, {
_OT(
'p',
'h',
'n',
'x') } },
122 { { 0x676e6a52, 363, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 }, {
_OT(
'r',
'j',
'n',
'g') } },
123 { { 0x726e7552, 211, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 }, {
_OT(
'r',
'u',
'n',
'r') },
TRUE },
124 { { 0x726d6153, 123, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'a',
'm',
'r') } },
125 { { 0x72756153, 344, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'a',
'u',
'r') } },
126 { { 0x77616853, 281, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'h',
'a',
'w') } },
127 { { 0x686e6953, 348, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'i',
'n',
'h') },
TRUE },
128 { { 0x646e7553, 362, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'u',
'n',
'd') } },
129 { { 0x6f6c7953, 316, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
's',
'y',
'l',
'o') } },
130 { { 0x63727953, 135, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
's',
'y',
'r',
'c') },
TRUE },
131 { { 0x676c6754, 370, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'g',
'l',
'g') } },
132 { { 0x62676154, 373, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'a',
'g',
'b') } },
133 { { 0x656c6154, 353, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'a',
'l',
'e') },
TRUE },
134 { { 0x616e614c, 351, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 }, {
_OT(
'l',
'a',
'n',
'a') } },
135 { { 0x74766154, 359, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 }, {
_OT(
't',
'a',
'v',
't') } },
136 { { 0x6c6d6154, 346, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'm',
'l',
'2'),
_OT(
't',
'a',
'm',
'l') },
TRUE },
137 { { 0x756c6554, 340, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'e',
'l',
'2'),
_OT(
't',
'e',
'l',
'u') },
TRUE },
138 { { 0x61616854, 170, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'h',
'a',
'a') },
TRUE },
139 { { 0x69616854, 352, 8, 0x0020, 1, 0, 1, 0, 1, 0, 0 }, {
_OT(
't',
'h',
'a',
'i') },
TRUE },
140 { { 0x74626954, 330, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'i',
'b',
't') },
TRUE },
141 { { 0x676e6654, 120, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'f',
'n',
'g') },
TRUE },
142 { { 0x72616755, 40, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'u',
'g',
'a',
'r') } },
143 { { 0x69696156, 470, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'v',
'a',
'i',
' ') },
TRUE },
144 { { 0x69696959, 460, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'y',
'i',
' ',
' ') },
TRUE },
145 { { 0x6d6b6143, 349, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'c',
'a',
'k',
'm') } },
146 { { 0x6372654d, 101, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'e',
'r',
'c') } },
147 { { 0x6f72654d, 100, 1, 0x0020, 0, 1, 1, 1, 0, 0, 0 }, {
_OT(
'm',
'e',
'r',
'o') } },
148 { { 0x64726c50, 282, 8, 0x0020, 1, 0, 1, 0, 0, 0, 0 }, {
_OT(
'p',
'l',
'r',
'd') } },
149 { { 0x64726853, 319, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'h',
'r',
'd') } },
150 { { 0x61726f53, 398, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'o',
'r',
'a') } },
151 { { 0x726b6154, 321, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'a',
'k',
'r') } },
152 { { 0x73736142, 259, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'a',
's',
's') } },
153 { { 0x62686741, 239, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'a',
'g',
'h',
'b') } },
154 { { 0x6c707544, 755, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'd',
'u',
'p',
'l') } },
155 { { 0x61626c45, 226, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'e',
'l',
'b',
'a') } },
156 { { 0x6e617247, 343, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'g',
'r',
'a',
'n') } },
157 { { 0x6a6f684b, 322, 15, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'k',
'h',
'o',
'j') } },
158 { { 0x646e6953, 318, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'i',
'n',
'd') } },
159 { { 0x616e694c, 400, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'l',
'i',
'n',
'a') } },
160 { { 0x6a68614d, 314, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'a',
'h',
'j') } },
161 { { 0x696e614d, 139, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'm',
'a',
'n',
'i') } },
162 { { 0x646e654d, 438, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'e',
'n',
'd') } },
163 { { 0x69646f4d, 324, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
'm',
'o',
'd',
'i') } },
164 { { 0x6f6f724d, 199, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'r',
'o',
'o') } },
165 { { 0x7461624e, 159, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'n',
'b',
'a',
't') } },
166 { { 0x6272614e, 106, 1, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'n',
'a',
'r',
'b') } },
167 { { 0x6d726550, 227, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'p',
'e',
'r',
'm') } },
168 { { 0x676e6d48, 450, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'h',
'm',
'n',
'g') } },
169 { { 0x6d6c6150, 126, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'p',
'a',
'l',
'm') } },
170 { { 0x63756150, 263, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'p',
'a',
'u',
'c') } },
171 { { 0x706c6850, 132, 8, 0x0640, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'p',
'h',
'l',
'p') } },
172 { { 0x64646953, 302, 8, 0x0020, 1, 0, 1, 1, 0, 0, 0 }, {
_OT(
's',
'i',
'd',
'd') } },
173 { { 0x68726954, 326, 15, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
't',
'i',
'r',
'h') } },
174 { { 0x61726157, 262, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'w',
'a',
'r',
'a') } },
175 { { 0x6d6c6441, 166, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'a',
'd',
'l',
'm') } },
176 { { 0x6d6f6841, 338, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'a',
'h',
'o',
'm') } },
177 { { 0x77756c48, 80, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'h',
'l',
'u',
'w') } },
178 { { 0x736b6842, 334, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'b',
'h',
'k',
's') } },
179 { { 0x72746148, 127, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'h',
'a',
't',
'r') } },
180 { { 0x6372614d, 332, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'a',
'r',
'c') } },
181 { { 0x746c754d, 323, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'u',
'l',
't') } },
182 { { 0x6177654e, 333, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'n',
'e',
'w',
'a') } },
183 { { 0x676e7548, 176, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'h',
'u',
'n',
'g') } },
184 { { 0x6567734f, 219, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'o',
's',
'g',
'e') } },
185 { { 0x776e6753, 95, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'g',
'n',
'w') } },
186 { { 0x676e6154, 520, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
't',
'a',
'n',
'g') } },
187 { { 0x6d6e6f47, 313, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'g',
'o',
'n',
'm') } },
188 { { 0x7568734e, 499, 1, 0x0020, 0, 0, 1, 1, 0, 0, 0 }, {
_OT(
'n',
's',
'h',
'u') } },
189 { { 0x6f796f53, 329, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'o',
'y',
'o') } },
190 { { 0x626e615a, 339, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'z',
'a',
'n',
'b') } },
191 { { 0x72676f44, 328, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
'd',
'o',
'g',
'r') } },
192 { { 0x676e6f47, 312, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
'g',
'o',
'n',
'g') } },
193 { { 0x67686f52, 167, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'r',
'o',
'h',
'g') } },
194 { { 0x616b614d, 366, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'a',
'k',
'a') } },
195 { { 0x6664654d, 265, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'm',
'e',
'd',
'f') } },
196 { { 0x6f676f53, 142, 8, 0x0020, 1, 1, 1, 0, 0, 0, 0 }, {
_OT(
's',
'o',
'g',
'o') } },
197 { { 0x64676f53, 141, 8, 0x0020, 1, 1, 0, 0, 0, 1, 1 }, {
_OT(
's',
'o',
'g',
'd') } },
198 { { 0x6d796c45, 128, 1, 0x0020, 0, 0, 1, 0, 0, 0, 0 }, {
_OT(
'e',
'l',
'y',
'm') } },
199 { { 0x706e6d48, 451, 8, 0x0020, 1, 1, 0, 0, 0, 0, 0 }, {
_OT(
'h',
'm',
'n',
'p') } },
200 { { 0x646e614e, 311, 8, 0x0020, 1, 1, 0, 0, 0, 1, 0 }, {
_OT(
'n',
'a',
'n',
'd') } },
201 { { 0x6f686357, 283, 8, 0x0020, 1, 1, 0, 0, 0, 0, 0 }, {
_OT(
'w',
'c',
'h',
'o') } },
202 { { 0x73726843, 109, 8, 0x0020, 0, 1, 0, 0, 0, 1, 1 }, {
_OT(
'c',
'h',
'r',
's') } },
203 { { 0x6b616944, 342, 8, 0x0020, 1, 1, 0, 0, 0, 0, 0 }, {
_OT(
'd',
'i',
'a',
'k') } },
204 { { 0x7374694b, 288, 8, 0x0020, 1, 0, 1, 1, 0, 0, 0 }, {
_OT(
'k',
'i',
't',
's') } },
205 { { 0x697a6559, 192, 8, 0x0020, 0, 1, 1, 0, 0, 0, 0 }, {
_OT(
'y',
'e',
'z',
'i') } },
223 {
"0000-007F, 0080-00FF, 0100-017F, 0180-024F, "
224 "0250-02AF, 02B0-02FF, 0300-036F",
L"Tahoma" },
226 {
"0530-058F, FB10-FB1C",
L"Noto Sans Armenian" },
228 {
"0590-05FF, FB1D-FB4F",
L"Noto Sans Hebrew" },
230 {
"0600-06FF, 0750-077F, "
231 "08A0-08FF, FB50-FDCF, "
232 "FDF0-FDFF, FE70-FEFE",
L"Noto Sans Arabic" },
234 {
"0700-074F",
L"Noto Sans Syriac" },
235 {
"0780-07BF",
L"Noto Sans Thaana" },
236 {
"07C0-07FF",
L"Noto Sans NKo" },
237 {
"0800-083F",
L"Noto Sans Samaritan" },
238 {
"0840-085F",
L"Noto Sans Mandaic" },
240 {
"0900-097F",
L"Noto Sans Devanagari" },
241 {
"0980-09FF",
L"Noto Sans Bengali" },
242 {
"0A00-0A7F",
L"Noto Sans Gurmukhi" },
243 {
"0A80-0AFF",
L"Noto Sans Gujarati" },
244 {
"0B00-0B7F",
L"Noto Sans Oriya" },
245 {
"0B80-0BFF",
L"Noto Sans Tamil" },
246 {
"0C00-0C7F",
L"Noto Sans Telugu" },
247 {
"0C80-0CFF",
L"Noto Sans Kannada" },
248 {
"0D00-0D7F",
L"Noto Sans Malayalam" },
249 {
"0D80-0DFF",
L"Noto Sans Sinhala" },
251 {
"0E00-0E7F",
L"Noto Sans Thai" },
252 {
"0E80-0EFF",
L"Noto Sans Lao" },
254 {
"0F00-0FFF",
L"Noto Serif Tibetan" },
256 {
"1000-109F, A9E0-A9FF, AA60-AA7F",
L"Noto Sans Myanmar" },
258 {
"10A0-10FF, 2D00-2D2F",
L"Noto Sans Georgian" },
268 {
"1100-11FF, 3130-318F, "
269 "3200-321F, 3260-327F, "
270 "A960-A97F, AC00-D7FF, "
271 "D7B0-D7FF",
L"Noto Sans CJK KR" },
273 {
"1680-169F",
L"Noto Sans Ogham" },
275 {
"16A0-16FF",
L"Noto Sans Runic" },
277 {
"1700-171F",
L"Noto Sans Tagalog" },
278 {
"1720-173F",
L"Noto Sans Hanunoo" },
279 {
"1740-175F",
L"Noto Sans Buhid" },
280 {
"1760-177F",
L"Noto Sans Tagbanwa" },
282 {
"1800-18AF, 202F, 11660-1167F",
L"Noto Sans Mongolian" },
284 {
"1900-194F",
L"Noto Sans Limbu" },
285 {
"1950-197F",
L"Noto Sans Tai Le" },
286 {
"1980-19DF",
L"Noto Sans New Tai Lue" },
287 {
"1A00-1A1F",
L"Noto Sans Buginese" },
288 {
"1A20-1AAF",
L"Noto Sans Tai Tham" },
289 {
"1B00-1B7F",
L"Noto Sans Balinese" },
290 {
"1B80-1BBF, 1CC0-1CCF",
L"Noto Sans Sundanes" },
291 {
"1BC0-1BFF",
L"Noto Sans Batak" },
292 {
"1C00-1C4F",
L"Noto Sans Lepcha" },
293 {
"1C50-1C7F",
L"Noto Sans Ol Chiki" },
295 {
"2C80-2CFF",
L"Noto Sans Coptic" },
296 {
"2D30-2D7F",
L"Noto Sans Tifinagh" },
300 {
"2E80-2EFF",
L"Noto Sans CJK SC",
L"zh-Hans" },
301 {
"2E80-2EFF",
L"Noto Sans CJK TC",
L"zh-Hant" },
302 {
"2E80-2EFF",
L"Noto Sans CJK KR",
L"ko" },
309 {
"3000-30FF, 31F0-31FF",
L"Noto Sans CJK SC",
L"zh-Hans" },
310 {
"3000-30FF, 31F0-31FF",
L"Noto Sans CJK TC",
L"zh-Hant" },
311 {
"3000-30FF, 31F0-31FF",
L"Noto Sans CJK KR",
L"ko" },
312 {
"3000-30FF, 31F0-31FF",
L"Noto Sans CJK JP" },
317 {
"3400-4DBF, 4E00-9FFF",
L"Noto Sans CJK SC",
L"zh-Hans" },
318 {
"3400-4DBF, 4E00-9FFF",
L"Noto Sans CJK TC",
L"zh-Hant" },
319 {
"3400-4DBF, 4E00-9FFF",
L"Noto Sans CJK KR",
L"ko" },
320 {
"3400-4DBF, 4E00-9FFF",
L"Noto Sans CJK JP" },
322 {
"A000-A4CF",
L"Noto Sans Yi" },
323 {
"A4D0-A4FF",
L"Noto Sans Lisu" },
324 {
"A500-A63F",
L"Noto Sans Vai" },
325 {
"A6A0-A6FF",
L"Noto Sans Bamum" },
326 {
"A800-A82F",
L"Noto Sans Syloti Nagri" },
327 {
"A840-A87F",
L"Noto Sans PhagsPa" },
328 {
"A880-A8DF",
L"Noto Sans Saurashtra" },
329 {
"A900-A92F",
L"Noto Sans Kayah Li" },
330 {
"A930-A95F",
L"Noto Sans Rejang" },
331 {
"A980-A9DF",
L"Noto Sans Javanese" },
332 {
"AA00-AA5F",
L"Noto Sans Cham" },
336 {
"F900-FAFF",
L"Noto Sans CJK SC",
L"zh-Hans" },
337 {
"F900-FAFF",
L"Noto Sans CJK TC",
L"zh-Hant" },
338 {
"F900-FAFF",
L"Noto Sans CJK KR",
L"ko" },
339 {
"F900-FAFF",
L"Noto Sans CJK JP" },
343 {
"FE10-FE1F",
L"Noto Sans CJK SC",
L"zh-Hans" },
344 {
"FE10-FE1F",
L"Noto Sans CJK KR",
L"ko" },
345 {
"FE10-FE1F",
L"Noto Sans CJK TC" },
350 {
"FE30-FE6F",
L"Noto Sans CJK SC",
L"zh-Hans" },
351 {
"FE30-FE6F",
L"Noto Sans CJK KR",
L"ko" },
352 {
"FE30-FE6F",
L"Noto Sans CJK JP",
L"ja" },
353 {
"FE30-FE6F",
L"Noto Sans CJK TC" },
356 {
"FF00-FFEF",
L"Noto Sans CJK SC",
L"zh-Hans" },
357 {
"FF00-FFEF",
L"Noto Sans CJK TC",
L"zh-Hant" },
358 {
"FF00-FFEF",
L"Noto Sans CJK KR",
L"ko" },
359 {
"FF00-FFEF",
L"Noto Sans CJK JP" },
381 return context->ch > 0xffff ? 2 : 1;
412 context->ch = 0x10000 + ((*
text - 0xd800) << 10) + *(
text + 1) - 0xdc00;
429 return IDWriteTextAnalysisSource_GetTextAtPosition(
source, position, &
context->text, &
context->chunk_length);
502 sizeof(*
locale->ranges.data)))
508 locale->ranges.count += 2;
568 IDWriteFontCollection_Release(
mapping->collection);
575 for (
i = 0;
i <
data->count; ++
i)
600 for (
i = 0;
i <
locale->ranges.count;
i += 2)
662 || (
c >= 0x007f &&
c <= 0x009f)
664 || (
c >= 0x200b &&
c <= 0x200f)
665 || (
c >= 0x2028 &&
c <= 0x202e)
666 || (
c >= 0x2060 &&
c <= 0x2064)
667 || (
c >= 0x2066 &&
c <= 0x2069)
668 || (
c >= 0x206a &&
c <= 0x206f)
673 || (
c >= 0x1bca0 &&
c <= 0x1bca3)
674 || (
c >= 0x1d173 &&
c <= 0x1d17a)
676 || (
c >= 0xe0020 &&
c <= 0xe007f))
735 return IDWriteTextAnalysisSink_SetScriptAnalysis(
sink,
pos,
length, &
sa);
873 if (!(break_class =
calloc(
length,
sizeof(*break_class))))
887 switch (break_class[
count])
919 state.breakpoints = breakpoints;
920 state.breaks = breaks;
931 switch (break_class[
i])
956 switch (break_class[
i])
982 if (break_class[
i] ==
b_CM || break_class[
i] ==
b_ZWJ)
986 switch (break_class[
i-1])
994 break_class[
i] =
b_AL;
998 break_class[
i] = break_class[
i-1];
1003 else break_class[
i] =
b_AL;
1009 switch (break_class[
i])
1022 if (break_class[
i-1] !=
b_SP && break_class[
i-1] !=
b_BA && break_class[
i-1] !=
b_HY)
1052 while(
j > 0 && break_class[
j] ==
b_SP)
1054 if (break_class[
j] ==
b_CL || break_class[
j] ==
b_CP)
1055 for (
j++;
j <=
i;
j++)
1071 switch(break_class[
i])
1102 switch (break_class[
i+1])
1109 if (
i > 0 && break_class[
i-1] ==
b_SY)
1121 if ((break_class[
i] ==
b_AL && break_class[
i+1] ==
b_NU) ||
1122 (break_class[
i] ==
b_HL && break_class[
i+1] ==
b_NU) ||
1123 (break_class[
i] ==
b_NU && break_class[
i+1] ==
b_AL) ||
1124 (break_class[
i] ==
b_NU && break_class[
i+1] ==
b_HL))
1128 if ((break_class[
i] ==
b_PR && break_class[
i+1] ==
b_ID) ||
1129 (break_class[
i] ==
b_PR && break_class[
i+1] ==
b_EB) ||
1130 (break_class[
i] ==
b_PR && break_class[
i+1] ==
b_EM) ||
1131 (break_class[
i] ==
b_ID && break_class[
i+1] ==
b_PO) ||
1132 (break_class[
i] ==
b_EM && break_class[
i+1] ==
b_PO) ||
1133 (break_class[
i] ==
b_EB && break_class[
i+1] ==
b_PO))
1137 if ((break_class[
i] ==
b_PR && break_class[
i+1] ==
b_AL) ||
1138 (break_class[
i] ==
b_PR && break_class[
i+1] ==
b_HL) ||
1139 (break_class[
i] ==
b_PO && break_class[
i+1] ==
b_AL) ||
1140 (break_class[
i] ==
b_PO && break_class[
i+1] ==
b_HL) ||
1141 (break_class[
i] ==
b_AL && break_class[
i+1] ==
b_PR) ||
1142 (break_class[
i] ==
b_HL && break_class[
i+1] ==
b_PR) ||
1143 (break_class[
i] ==
b_AL && break_class[
i+1] ==
b_PO) ||
1144 (break_class[
i] ==
b_HL && break_class[
i+1] ==
b_PO))
1148 if ((break_class[
i] ==
b_CL && break_class[
i+1] ==
b_PO) ||
1149 (break_class[
i] ==
b_CP && break_class[
i+1] ==
b_PO) ||
1150 (break_class[
i] ==
b_CL && break_class[
i+1] ==
b_PR) ||
1151 (break_class[
i] ==
b_CP && break_class[
i+1] ==
b_PR) ||
1152 (break_class[
i] ==
b_NU && break_class[
i+1] ==
b_PO) ||
1153 (break_class[
i] ==
b_NU && break_class[
i+1] ==
b_PR) ||
1154 (break_class[
i] ==
b_PO && break_class[
i+1] ==
b_OP) ||
1155 (break_class[
i] ==
b_PO && break_class[
i+1] ==
b_NU) ||
1156 (break_class[
i] ==
b_PR && break_class[
i+1] ==
b_OP) ||
1157 (break_class[
i] ==
b_PR && break_class[
i+1] ==
b_NU) ||
1158 (break_class[
i] ==
b_HY && break_class[
i+1] ==
b_NU) ||
1159 (break_class[
i] ==
b_IS && break_class[
i+1] ==
b_NU) ||
1160 (break_class[
i] ==
b_NU && break_class[
i+1] ==
b_NU) ||
1161 (break_class[
i] ==
b_SY && break_class[
i+1] ==
b_NU))
1165 if (break_class[
i] ==
b_JL)
1167 switch (break_class[
i+1])
1176 if ((break_class[
i] ==
b_JV || break_class[
i] ==
b_H2) &&
1177 (break_class[
i+1] ==
b_JV || break_class[
i+1] ==
b_JT))
1179 if ((break_class[
i] ==
b_JT || break_class[
i] ==
b_H3) &&
1180 break_class[
i+1] ==
b_JT)
1184 switch (break_class[
i])
1191 if (break_class[
i+1] ==
b_IN || break_class[
i+1] ==
b_PO)
1194 if (break_class[
i] ==
b_PR)
1196 switch (break_class[
i+1])
1208 if ((break_class[
i] ==
b_AL && break_class[
i+1] ==
b_AL) ||
1209 (break_class[
i] ==
b_AL && break_class[
i+1] ==
b_HL) ||
1210 (break_class[
i] ==
b_HL && break_class[
i+1] ==
b_AL) ||
1211 (break_class[
i] ==
b_HL && break_class[
i+1] ==
b_HL))
1215 if ((break_class[
i] ==
b_IS && break_class[
i+1] ==
b_AL) ||
1216 (break_class[
i] ==
b_IS && break_class[
i+1] ==
b_HL))
1220 if ((break_class[
i] ==
b_AL || break_class[
i] ==
b_HL || break_class[
i] ==
b_NU) &&
1221 break_class[
i+1] ==
b_OP)
1223 if (break_class[
i] ==
b_CP &&
1224 (break_class[
i+1] ==
b_AL || break_class[
i+1] ==
b_HL || break_class[
i+1] ==
b_NU))
1228 if (break_class[
i] ==
b_RI && break_class[
i+1] ==
b_RI) {
1232 while (
j > 0 && break_class[--
j] ==
b_RI)
1240 if (break_class[
i] ==
b_EB && break_class[
i+1] ==
b_EM)
1305 return c->ch > 0xffff ? 2 : 1;
1317 UINT8 baselevel, resolved,
explicit;
1318 unsigned int i, chars_count = 0;
1345 baselevel = IDWriteTextAnalysisSource_GetParagraphReadingDirection(
source);
1355 for (
i = 1,
ptr = chars + 1;
i < chars_count; ++
i, ++
ptr)
1363 hr = IDWriteTextAnalysisSink_SetBidiLevel(
sink,
pos, seq_length,
explicit,
resolved);
1370 explicit =
ptr->explicit;
1375 hr = IDWriteTextAnalysisSink_SetBidiLevel(
sink,
pos, seq_length,
explicit,
resolved);
1404 if (!(breakpoints =
calloc(
length,
sizeof(*breakpoints))))
1408 hr = IDWriteTextAnalysisSink_SetLineBreakpoints(
sink, position,
length, breakpoints);
1417 UINT32 language = DWRITE_MAKE_OPENTYPE_TAG(
'd',
'f',
'l',
't');
1422 language = DWRITE_MAKE_OPENTYPE_TAG(
tag[0],
tag[1],
tag[2],
tag[3]);
1476 static const WCHAR arabicW[] = {0x640,0x641,0x642,0x643,0x644,0x645,0x646,0x647,0x648,0x649,0};
1501 UINT32 const *feature_range_lengths,
UINT32 feature_ranges)
1505 if (!
TRACE_ON(dwrite) || !features)
1508 for (
i = 0,
start = 0;
i < feature_ranges;
start += feature_range_lengths[
i++]) {
1512 features[
i]->features[
j].parameter);
1528 unsigned int glyph_count;
1531 TRACE(
"%s:%u, %p, %d, %d, %s, %s, %p, %p, %p, %u, %u, %p, %p, %p, %p, %p.\n",
debugstr_wn(
text,
length),
1533 features, feature_range_lengths, feature_ranges, max_glyph_count, clustermap, text_props,
glyphs,
1534 glyph_props, actual_glyph_count);
1540 glyph_count =
max(max_glyph_count,
length);
1547 context.is_sideways = is_sideways;
1549 context.u.subst.glyph_props =
calloc(glyph_count,
sizeof(*glyph_props));
1550 context.u.subst.text_props = text_props;
1551 context.u.subst.clustermap = clustermap;
1552 context.u.subst.max_glyph_count = max_glyph_count;
1553 context.u.subst.capacity = glyph_count;
1556 context.user_features.features = features;
1557 context.user_features.range_lengths = feature_range_lengths;
1558 context.user_features.range_count = feature_ranges;
1562 *actual_glyph_count = 0;
1574 *actual_glyph_count =
context.glyph_count;
1600 TRACE(
"%s, %p, %p, %u, %p, %p, %u, %p, %.2f, %d, %d, %s, %s, %p, %p, %u, %p, %p.\n",
debugstr_wn(
text, text_len),
1601 clustermap, text_props, text_len,
glyphs, glyph_props, glyph_count, fontface, emSize, is_sideways,
1603 feature_ranges, advances,
offsets);
1607 if (glyph_count == 0)
1612 for (
i = 0;
i < glyph_count; ++
i)
1614 if (glyph_props[
i].isZeroWidthSpace)
1628 context.is_sideways = is_sideways;
1630 context.u.pos.glyph_props = glyph_props;
1631 context.u.pos.text_props = text_props;
1632 context.u.pos.clustermap = clustermap;
1633 context.glyph_count = glyph_count;
1639 context.user_features.features = features;
1640 context.user_features.range_lengths = feature_range_lengths;
1641 context.user_features.range_count = feature_ranges;
1675 TRACE(
"%s, %p, %p, %u, %p, %p, %u, %p, %.2f, %.2f, %p, %d, %d, %d, %s, %s, %p, %p, %u, %p, %p.\n",
1676 debugstr_wn(
text, text_len), clustermap, text_props, text_len,
glyphs, glyph_props, glyph_count, fontface,
1682 if (glyph_count == 0)
1689 for (
i = 0;
i < glyph_count; ++
i)
1691 if (glyph_props[
i].isZeroWidthSpace)
1705 context.is_sideways = is_sideways;
1707 context.u.pos.glyph_props = glyph_props;
1708 context.u.pos.text_props = text_props;
1709 context.u.pos.clustermap = clustermap;
1710 context.glyph_count = glyph_count;
1711 context.emsize = emSize * ppdip;
1712 context.measuring_mode = measuring_mode;
1716 context.user_features.features = features;
1717 context.user_features.range_lengths = feature_range_lengths;
1718 context.user_features.range_count = feature_ranges;
1742 BOOL reduced = leading_spacing < 0.0f || trailing_spacing < 0.0f;
1743 unsigned int first_spacing, last_spacing,
i;
1747 if (modified_advances != advances)
1749 if (modified_offsets !=
offsets)
1752 for (first_spacing =
start; first_spacing <=
end; ++first_spacing)
1754 if ((is_spacing_cluster = !glyph_props[first_spacing].isZeroWidthSpace))
1759 if (!is_spacing_cluster)
1762 for (last_spacing =
end; last_spacing >=
start; --last_spacing)
1764 if (!glyph_props[last_spacing].isZeroWidthSpace)
1784 if (leading_spacing < 0.0f)
1787 modified_advances[first_spacing] += leading_spacing;
1788 modified_offsets[first_spacing].
advanceOffset += leading_spacing;
1791 if (trailing_spacing < 0.0f)
1794 modified_advances[last_spacing] += trailing_spacing;
1805 modified_advances[first_spacing] += half;
1806 modified_advances[last_spacing] += half;
1809 else if (leading_spacing < 0.0f && trailing_spacing < 0.0f)
1811 modified_advances[first_spacing] += half;
1812 modified_advances[last_spacing] += half;
1815 else if (leading_spacing < 0.0f)
1817 modified_advances[first_spacing] +=
advance;
1821 modified_advances[last_spacing] +=
advance;
1825 if (leading_spacing > 0.0f)
1827 modified_advances[first_spacing] += leading_spacing;
1828 modified_offsets[first_spacing].
advanceOffset += leading_spacing;
1831 if (trailing_spacing > 0.0f)
1832 modified_advances[last_spacing] += trailing_spacing;
1835 for (
i = first_spacing;
i >
start; --
i)
1837 unsigned int cur =
i - 1;
1842 for (
i = first_spacing + 1;
i <=
end; ++
i)
1845 modified_advances[
i - 1];
1858 while (
start < (text_len - 1) && clustermap[++
start] ==
g)
1906 TRACE(
"%.2f, %.2f, %.2f, %u, %u, %p, %p, %p, %p, %p, %p.\n", leading_spacing, trailing_spacing, min_advance_width,
1907 len, glyph_count, clustermap, advances,
offsets,
props, modified_advances, modified_offsets);
1909 if (min_advance_width < 0.0f) {
1910 if (modified_advances != advances)
1911 memset(modified_advances, 0, glyph_count*
sizeof(*modified_advances));
1915 for (
i = 0;
i <
len;)
1939 TRACE(
"%p, %d, %d, %u, %s, %p, %p.\n", fontface, vertical, is_simulation_allowed,
sa.script,
debugstr_w(localeName),
1940 baseline_coord, exists);
1943 *baseline_coord = 0;
1953 if (!*exists && is_simulation_allowed)
1961 *baseline_coord = vertical ?
metrics->descent : 0;
1964 *baseline_coord = vertical ? (
metrics->ascent +
metrics->descent) / 2 :
1968 *baseline_coord = vertical ? (
metrics->ascent +
metrics->descent) / 2 :
1973 *baseline_coord = vertical ?
metrics->capHeight * 6 / 7 +
metrics->descent :
metrics->capHeight * 6 / 7;
1977 *baseline_coord = vertical ? 0 :
metrics->descent;
2003 return IDWriteTextAnalyzer2_GetGlyphOrientationTransform(iface,
angle, is_sideways, 0.0, 0.0,
transform);
2022 c == 0x200e ||
c == 0x200f || (
c >= 0x202a &&
c <= 0x202e))
2036 TRACE(
"%s:%u, %p, %p, %p, %p.\n",
debugstr_wn(
text,
len),
len,
face, is_simple, len_read,
indices);
2066 if (!(codepoints =
calloc(*len_read,
sizeof(*codepoints))))
2069 for (
i = 0;
i < *len_read;
i++)
2072 hr = IDWriteFontFace_GetGlyphIndices(
face, codepoints, *len_read,
indices);
2083 FIXME(
"(%p %.2f %u %u %u %s %p %p %p): stub\n",
face, font_em_size,
sa.script,
length, glyph_count,
2092 FIXME(
"(%.2f %u %p %p %p %p %p): stub\n",
width, glyph_count, jo, advances,
offsets, justifiedadvances,
2104 FIXME(
"(%p %.2f %u %u %u %u %p %p %p %p %p %p %p %p %p %p %p): stub\n",
face, font_em_size,
sa.script,
2105 length, glyph_count, max_glyphcount, clustermap,
indices, advances, justifiedadvances, justifiedoffsets,
2106 prop, actual_count, modified_clustermap, modified_indices, modified_advances, modified_offsets);
2114 { 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f },
2115 { 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f },
2116 { -1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f },
2117 { 0.0f, -1.0f, 1.0f, 0.0f, 0.0f, 0.0f }
2120 TRACE(
"%d, %d, %.2f, %.2f, %p.\n",
angle, is_sideways, originX, originY,
m);
2152 m->
dx = originX - (
m->m11 * originX +
m->m21 * originY);
2153 m->dy = originY - (
m->m12 * originX +
m->m22 * originY);
2167 TRACE(
"%p, %p, %u, %s, %u, %p, %p.\n", iface, fontface,
sa.script,
debugstr_w(
locale), max_tagcount,
2168 actual_tagcount,
tags);
2191 TRACE(
"%p, %p, %u, %s, %s, %u, %p, %p.\n", iface, fontface,
sa.script,
debugstr_w(
locale),
debugstr_fourcc(
feature),
2192 glyph_count,
glyphs, feature_applies);
2254 IDWriteNumberSubstitution_AddRef(iface);
2318 if (!(substitution =
calloc(1,
sizeof(*substitution))))
2346 IDWriteFontFallback1_AddRef(iface);
2360 TRACE(
"%p.\n", iface);
2362 return IDWriteFactory7_AddRef(fallback->
factory);
2369 TRACE(
"%p.\n", fallback);
2371 return IDWriteFactory7_Release(fallback->
factory);
2397 if (!IDWriteFont3_HasCharacter(
font,
context.ch))
break;
2447 *ret_length = mapped;
2453 for (
i = 0;
i <
mapping->families_count; ++
i)
2460 IDWriteFont3_Release(
font);
2465 *ret_length = mapped;
2497 hr = IDWriteFontCollection_GetFontFamily(
collection,
i, &family);
2501 hr = IDWriteFontFamily_GetFirstMatchingFont(family,
weight, stretch,
style, &
font);
2502 IDWriteFontFamily_Release(family);
2507 IDWriteFont_Release(
font);
2521 TRACE(
"%p, %p, %u, %u, %p, %s, %u, %u, %u, %p, %p, %p.\n", iface,
source, position,
length,
2534 if (!basecollection)
2537 if (basefamily && *basefamily)
2540 &IID_IDWriteFont, (
void **)&
font)))
2548 IDWriteFont3_Release(
font);
2560 FIXME(
"%p, %p, %u, %u, %p, %s, %p, %u, %p, %p, %p.\n", iface,
source, position,
length, basecollection,
2561 debugstr_w(basefamily), axis_values, values_count, mapped_length,
scale, ret_fontface);
2601 IDWriteFactory7_Release(fallback->
factory);
2626 IDWriteFontFallbackBuilder_AddRef(iface);
2655 IDWriteFactory7_Release(builder->
factory);
2685 TRACE(
"%p, %p, %u, %p, %u, %p, %s, %s, %f.\n", iface,
ranges, ranges_count, families, families_count,
2688 if (!
ranges || !ranges_count || !families || !families_count ||
scale < 0.0f)
2692 FIXME(
"base family ignored.\n");
2695 builder->
data.count + 1,
sizeof(*builder->
data.mappings)))
2712 for (
i = 0,
count = 0;
i < ranges_count; ++
i)
2730 mapping->families_count = families_count;
2731 for (
i = 0;
i < families_count;
i++)
2743 IDWriteFontCollection_AddRef(
mapping->collection);
2745 for (
m = 0;
m < builder->
data.count; ++
m)
2748 if (
c->collection)
continue;
2753 for (
j = 0;
j <
c->ranges_count; ++
j)
2775 builder->
data.count++;
2785 FIXME(
"%p, %p stub.\n", iface, fallback);
2818 for (
i = 0;
i <
data->count; ++
i)
2823 if (!(
dst->ranges =
calloc(
src->ranges_count,
sizeof(*
src->ranges))))
goto failed;
2825 dst->ranges_count =
src->ranges_count;
2827 if (!(
dst->families =
calloc(
src->families_count,
sizeof(*
src->families))))
goto failed;
2828 dst->families_count =
src->families_count;
2829 for (
j = 0;
j <
src->families_count; ++
j)
2834 dst->collection =
src->collection;
2835 if (
dst->collection)
2836 IDWriteFontCollection_AddRef(
dst->collection);
2852 if (!(fallback =
calloc(1,
sizeof(*fallback))))
2858 IDWriteFactory7_AddRef(fallback->
factory);
2915 if (!(builder =
calloc(1,
sizeof(*builder))))
2921 IDWriteFactory7_AddRef(builder->
factory);
2945 unsigned int count = 0;
2967 unsigned int count = 0;
2973 while (*family ==
' ') family++;
2974 families[
count++] = family;
2989 unsigned int range_count, families_count;
3009 if (
FAILED(
hr = IDWriteFontFallbackBuilder_AddMapping(builder_iface,
ranges, range_count,
3012 WARN(
"Failed to add mapping, hr %#lx.\n",
hr);
3019 IDWriteFontFallbackBuilder_Release(builder_iface);
3037 WARN(
"Failed to initialize system fallback data.\n");
3041 if (!(fallback =
calloc(1,
sizeof(*fallback))))
3046 fallback->
data.count = ~0
u;
INT WINAPI GetLocaleInfoEx(LPCWSTR locale, LCTYPE info, LPWSTR buffer, INT len)
BOOL WINAPI IsValidLocaleName(LPCWSTR lpLocaleName)
_STLP_MOVE_TO_STD_NAMESPACE void _STLP_CALL advance(_InputIterator &__i, _Distance __n)
static struct sockaddr_in sa
static unsigned int get_bidi_char_length(const struct bidi_char *c)
static UINT32 fallback_font_get_supported_length(IDWriteFont3 *font, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length)
static HRESULT WINAPI dwritetextanalyzer1_GetJustificationOpportunities(IDWriteTextAnalyzer2 *iface, IDWriteFontFace *face, FLOAT font_em_size, DWRITE_SCRIPT_ANALYSIS sa, UINT32 length, UINT32 glyph_count, const WCHAR *text, const UINT16 *clustermap, const DWRITE_SHAPING_GLYPH_PROPERTIES *prop, DWRITE_JUSTIFICATION_OPPORTUNITY *jo)
static BOOL WINAPI dwrite_system_fallback_initonce(INIT_ONCE *once, void *param, void **context)
static UINT8 get_char_bidi_class(UINT32 ch)
static ULONG WINAPI dwritenumbersubstitution_AddRef(IDWriteNumberSubstitution *iface)
static const IDWriteNumberSubstitutionVtbl numbersubstitutionvtbl
static unsigned int text_source_get_char_length(const struct text_source_context *context)
static ULONG WINAPI fontfallback_Release(IDWriteFontFallback1 *iface)
static void get_number_substitutes(IDWriteNumberSubstitution *substitution, BOOL is_rtl, WCHAR *digits)
static HRESULT WINAPI dwritetextanalyzer1_GetScriptProperties(IDWriteTextAnalyzer2 *iface, DWRITE_SCRIPT_ANALYSIS sa, DWRITE_SCRIPT_PROPERTIES *props)
static void release_fallback_data(struct fallback_data *data)
static HRESULT text_source_context_init(struct text_source_context *context, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length)
static HRESULT fallbackbuilder_create_fallback(struct dwrite_fontfallback_builder *builder, struct dwrite_fontfallback **ret)
static const struct dwritescript_properties dwritescripts_properties[Script_LastId+1]
#define NATIVE_DIGITS_LEN
static const IDWriteTextAnalyzer2Vtbl textanalyzervtbl
const unsigned short bidi_direction_table[]
static void analyzer_dump_user_features(DWRITE_TYPOGRAPHIC_FEATURES const **features, UINT32 const *feature_range_lengths, UINT32 feature_ranges)
HRESULT create_matching_font(IDWriteFontCollection *collection, const WCHAR *name, DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, REFIID riid, void **obj)
static DWRITE_SCRIPT_ANALYSIS get_char_sa(UINT32 c)
static ULONG WINAPI dwritenumbersubstitution_Release(IDWriteNumberSubstitution *iface)
static HRESULT WINAPI dwritetextanalyzer1_JustifyGlyphAdvances(IDWriteTextAnalyzer2 *iface, FLOAT width, UINT32 glyph_count, const DWRITE_JUSTIFICATION_OPPORTUNITY *jo, const FLOAT *advances, const DWRITE_GLYPH_OFFSET *offsets, FLOAT *justifiedadvances, DWRITE_GLYPH_OFFSET *justifiedoffsets)
static HRESULT WINAPI dwritetextanalyzer_GetGlyphPlacements(IDWriteTextAnalyzer2 *iface, WCHAR const *text, UINT16 const *clustermap, DWRITE_SHAPING_TEXT_PROPERTIES *text_props, UINT32 text_len, UINT16 const *glyphs, DWRITE_SHAPING_GLYPH_PROPERTIES const *glyph_props, UINT32 glyph_count, IDWriteFontFace *fontface, float emSize, BOOL is_sideways, BOOL is_rtl, DWRITE_SCRIPT_ANALYSIS const *analysis, WCHAR const *locale, DWRITE_TYPOGRAPHIC_FEATURES const **features, UINT32 const *feature_range_lengths, UINT32 feature_ranges, float *advances, DWRITE_GLYPH_OFFSET *offsets)
static const IDWriteFontFallback1Vtbl fontfallbackvtbl
static HRESULT WINAPI dwritetextanalyzer_AnalyzeBidi(IDWriteTextAnalyzer2 *iface, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, IDWriteTextAnalysisSink *sink)
static ULONG WINAPI dwritetextanalyzer_AddRef(IDWriteTextAnalyzer2 *iface)
static HRESULT WINAPI dwritetextanalyzer1_ApplyCharacterSpacing(IDWriteTextAnalyzer2 *iface, FLOAT leading_spacing, FLOAT trailing_spacing, FLOAT min_advance_width, UINT32 len, UINT32 glyph_count, UINT16 const *clustermap, FLOAT const *advances, DWRITE_GLYPH_OFFSET const *offsets, DWRITE_SHAPING_GLYPH_PROPERTIES const *props, FLOAT *modified_advances, DWRITE_GLYPH_OFFSET *modified_offsets)
static HRESULT analyze_script(struct text_source_context *context, IDWriteTextAnalysisSink *sink)
static struct fallback_locale * fallback_builder_add_locale(struct dwrite_fontfallback_builder *builder, const WCHAR *locale_name)
static HRESULT WINAPI fontfallbackbuilder_AddMappings(IDWriteFontFallbackBuilder *iface, IDWriteFontFallback *fallback)
static struct fallback_locale * font_fallback_get_locale(const struct list *locales, const WCHAR *locale_name)
void release_system_fontfallback(IDWriteFontFallback1 *iface)
static BOOL fallback_mapping_contains_character(const struct fallback_mapping *mapping, UINT32 ch)
void release_system_fallback_data(void)
static ULONG WINAPI fontfallback_AddRef(IDWriteFontFallback1 *iface)
static HRESULT WINAPI fontfallback_MapCharacters(IDWriteFontFallback1 *iface, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, IDWriteFontCollection *basecollection, const WCHAR *basefamily, DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, UINT32 *mapped_length, IDWriteFont **ret_font, float *scale)
static HRESULT WINAPI fontfallback_QueryInterface(IDWriteFontFallback1 *iface, REFIID riid, void **obj)
static HRESULT WINAPI dwritetextanalyzer1_GetTextComplexity(IDWriteTextAnalyzer2 *iface, const WCHAR *text, UINT32 len, IDWriteFontFace *face, BOOL *is_simple, UINT32 *len_read, UINT16 *indices)
static void set_break_condition(UINT32 pos, enum BreakConditionLocation location, DWRITE_BREAK_CONDITION condition, struct linebreaking_state *state)
static ULONG WINAPI fontfallbackbuilder_AddRef(IDWriteFontFallbackBuilder *iface)
static HRESULT fallbackbuilder_init_fallback_data(const struct dwrite_fontfallback_builder *builder, struct fallback_data *data)
static const struct fallback_description system_fallback_config[]
static void text_source_read_more(struct text_source_context *context)
static ULONG WINAPI customfontfallback_Release(IDWriteFontFallback1 *iface)
static HRESULT WINAPI dwritetextanalyzer_QueryInterface(IDWriteTextAnalyzer2 *iface, REFIID riid, void **obj)
static IDWriteTextAnalyzer2 textanalyzer
static HRESULT fallback_locale_add_mapping(struct fallback_locale *locale, size_t index)
static BOOL fallback_is_uvs(const struct text_source_context *context)
HRESULT create_numbersubstitution(DWRITE_NUMBER_SUBSTITUTION_METHOD method, const WCHAR *locale, BOOL ignore_user_override, IDWriteNumberSubstitution **ret)
static BOOL text_source_get_next_u32_char(struct text_source_context *context)
HRESULT create_system_fontfallback(IDWriteFactory7 *factory, IDWriteFontFallback1 **ret)
static HRESULT WINAPI fontfallbackbuilder_AddMapping(IDWriteFontFallbackBuilder *iface, const DWRITE_UNICODE_RANGE *ranges, UINT32 ranges_count, WCHAR const **families, UINT32 families_count, IDWriteFontCollection *collection, WCHAR const *locale_name, WCHAR const *base_family, float scale)
static void system_fallback_parse_families(WCHAR *str, WCHAR **families, unsigned int max_count, unsigned int *ret)
static UINT16 get_char_script(UINT32 c)
static UINT32 get_opentype_language(const WCHAR *locale)
const unsigned short wine_scripts_table[]
static HRESULT create_fontfallback_builder_internal(IDWriteFactory7 *factory, struct dwrite_fontfallback_builder **ret)
static HRESULT WINAPI dwritetextanalyzer_AnalyzeScript(IDWriteTextAnalyzer2 *iface, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, IDWriteTextAnalysisSink *sink)
static const struct fallback_mapping * find_fallback_mapping(const struct fallback_data *fallback, const struct fallback_locale *locale, UINT32 ch)
static struct dwrite_numbersubstitution * impl_from_IDWriteNumberSubstitution(IDWriteNumberSubstitution *iface)
static BOOL is_char_from_simple_script(WCHAR c)
static BOOL has_strong_condition(DWRITE_BREAK_CONDITION old_condition, DWRITE_BREAK_CONDITION new_condition)
static HRESULT apply_cluster_spacing(float leading_spacing, float trailing_spacing, float min_advance_width, unsigned int start, unsigned int end, float const *advances, DWRITE_GLYPH_OFFSET const *offsets, DWRITE_SHAPING_GLYPH_PROPERTIES const *glyph_props, float *modified_advances, DWRITE_GLYPH_OFFSET *modified_offsets)
static HRESULT WINAPI dwritetextanalyzer_GetGlyphs(IDWriteTextAnalyzer2 *iface, WCHAR const *text, UINT32 length, IDWriteFontFace *fontface, BOOL is_sideways, BOOL is_rtl, DWRITE_SCRIPT_ANALYSIS const *analysis, WCHAR const *locale, IDWriteNumberSubstitution *substitution, DWRITE_TYPOGRAPHIC_FEATURES const **features, UINT32 const *feature_range_lengths, UINT32 feature_ranges, UINT32 max_glyph_count, UINT16 *clustermap, DWRITE_SHAPING_TEXT_PROPERTIES *text_props, UINT16 *glyphs, DWRITE_SHAPING_GLYPH_PROPERTIES *glyph_props, UINT32 *actual_glyph_count)
const unsigned short wine_linebreak_table[]
static HRESULT WINAPI dwritetextanalyzer_AnalyzeLineBreakpoints(IDWriteTextAnalyzer2 *iface, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, IDWriteTextAnalysisSink *sink)
static HRESULT WINAPI fontfallback1_MapCharacters(IDWriteFontFallback1 *iface, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, IDWriteFontCollection *basecollection, const WCHAR *basefamily, DWRITE_FONT_AXIS_VALUE const *axis_values, UINT32 values_count, UINT32 *mapped_length, FLOAT *scale, IDWriteFontFace5 **ret_fontface)
static const IDWriteFontFallback1Vtbl customfontfallbackvtbl
static INIT_ONCE init_system_fallback_once
static const IDWriteFontFallbackBuilderVtbl fontfallbackbuildervtbl
static HRESULT WINAPI fontfallbackbuilder_QueryInterface(IDWriteFontFallbackBuilder *iface, REFIID riid, void **obj)
static struct fallback_data system_fallback
static struct dwrite_fontfallback_builder * impl_from_IDWriteFontFallbackBuilder(IDWriteFontFallbackBuilder *iface)
IDWriteTextAnalyzer2 * get_text_analyzer(void)
static HRESULT WINAPI dwritetextanalyzer2_CheckTypographicFeature(IDWriteTextAnalyzer2 *iface, IDWriteFontFace *fontface, DWRITE_SCRIPT_ANALYSIS sa, const WCHAR *locale, DWRITE_FONT_FEATURE_TAG feature, UINT32 glyph_count, const UINT16 *glyphs, UINT8 *feature_applies)
HRESULT create_fontfallback_builder(IDWriteFactory7 *factory, IDWriteFontFallbackBuilder **ret)
static HRESULT WINAPI dwritetextanalyzer1_GetBaseline(IDWriteTextAnalyzer2 *iface, IDWriteFontFace *fontface, DWRITE_BASELINE baseline, BOOL vertical, BOOL is_simulation_allowed, DWRITE_SCRIPT_ANALYSIS sa, const WCHAR *localeName, INT32 *baseline_coord, BOOL *exists)
static void text_source_get_u32_char(struct text_source_context *context)
static ULONG WINAPI customfontfallback_AddRef(IDWriteFontFallback1 *iface)
static HRESULT WINAPI dwritetextanalyzer_AnalyzeNumberSubstitution(IDWriteTextAnalyzer2 *iface, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, IDWriteTextAnalysisSink *sink)
static HRESULT analyze_linebreaks(IDWriteTextAnalysisSource *source, UINT32 position, UINT32 length, DWRITE_LINE_BREAKPOINT *breakpoints)
static HRESULT WINAPI dwritetextanalyzer1_GetJustifiedGlyphs(IDWriteTextAnalyzer2 *iface, IDWriteFontFace *face, FLOAT font_em_size, DWRITE_SCRIPT_ANALYSIS sa, UINT32 length, UINT32 glyph_count, UINT32 max_glyphcount, const UINT16 *clustermap, const UINT16 *indices, const FLOAT *advances, const FLOAT *justifiedadvances, const DWRITE_GLYPH_OFFSET *justifiedoffsets, const DWRITE_SHAPING_GLYPH_PROPERTIES *prop, UINT32 *actual_count, UINT16 *modified_clustermap, UINT16 *modified_indices, FLOAT *modified_advances, DWRITE_GLYPH_OFFSET *modified_offsets)
BOOL lb_is_newline_char(WCHAR ch)
static HRESULT WINAPI dwritetextanalyzer1_AnalyzeVerticalGlyphOrientation(IDWriteTextAnalyzer2 *iface, IDWriteTextAnalysisSource1 *source, UINT32 text_pos, UINT32 len, IDWriteTextAnalysisSink1 *sink)
static ULONG WINAPI dwritetextanalyzer_Release(IDWriteTextAnalyzer2 *iface)
static HRESULT WINAPI dwritetextanalyzer_GetGdiCompatibleGlyphPlacements(IDWriteTextAnalyzer2 *iface, WCHAR const *text, UINT16 const *clustermap, DWRITE_SHAPING_TEXT_PROPERTIES *text_props, UINT32 text_len, UINT16 const *glyphs, DWRITE_SHAPING_GLYPH_PROPERTIES const *glyph_props, UINT32 glyph_count, IDWriteFontFace *fontface, float emSize, float ppdip, DWRITE_MATRIX const *transform, BOOL use_gdi_natural, BOOL is_sideways, BOOL is_rtl, DWRITE_SCRIPT_ANALYSIS const *analysis, WCHAR const *locale, DWRITE_TYPOGRAPHIC_FEATURES const **features, UINT32 const *feature_range_lengths, UINT32 feature_ranges, float *advances, DWRITE_GLYPH_OFFSET *offsets)
static HRESULT WINAPI dwritetextanalyzer1_GetGlyphOrientationTransform(IDWriteTextAnalyzer2 *iface, DWRITE_GLYPH_ORIENTATION_ANGLE angle, BOOL is_sideways, DWRITE_MATRIX *transform)
static HRESULT WINAPI dwritenumbersubstitution_QueryInterface(IDWriteNumberSubstitution *iface, REFIID riid, void **obj)
static void system_fallback_parse_ranges(const char *str, DWRITE_UNICODE_RANGE *ranges, unsigned int max_count, unsigned int *ret)
static HRESULT WINAPI dwritetextanalyzer2_GetGlyphOrientationTransform(IDWriteTextAnalyzer2 *iface, DWRITE_GLYPH_ORIENTATION_ANGLE angle, BOOL is_sideways, FLOAT originX, FLOAT originY, DWRITE_MATRIX *m)
static HRESULT WINAPI fontfallbackbuilder_CreateFontFallback(IDWriteFontFallbackBuilder *iface, IDWriteFontFallback **ret)
static ULONG WINAPI fontfallbackbuilder_Release(IDWriteFontFallbackBuilder *iface)
static void release_fallback_mapping(struct fallback_mapping *mapping)
const char * debugstr_sa_script(UINT16 script)
static void fallback_locale_list_destroy(struct list *locales)
static UINT32 get_cluster_length(UINT16 const *clustermap, UINT32 start, UINT32 text_len)
static struct dwrite_numbersubstitution * unsafe_impl_from_IDWriteNumberSubstitution(IDWriteNumberSubstitution *iface)
static struct dwrite_fontfallback * impl_from_IDWriteFontFallback1(IDWriteFontFallback1 *iface)
static HRESULT fallback_map_characters(const struct dwrite_fontfallback *fallback, IDWriteTextAnalysisSource *source, UINT32 position, UINT32 text_length, DWRITE_FONT_WEIGHT weight, DWRITE_FONT_STYLE style, DWRITE_FONT_STRETCH stretch, IDWriteFont **ret_font, UINT32 *ret_length, float *scale)
static HRESULT WINAPI dwritetextanalyzer2_GetTypographicFeatures(IDWriteTextAnalyzer2 *iface, IDWriteFontFace *fontface, DWRITE_SCRIPT_ANALYSIS sa, const WCHAR *locale, UINT32 max_tagcount, UINT32 *actual_tagcount, DWRITE_FONT_FEATURE_TAG *tags)
#define InterlockedIncrement
#define InterlockedDecrement
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static void list_add_tail(struct list_entry *head, struct list_entry *entry)
static void list_init(struct list_entry *head)
@ DWRITE_MEASURING_MODE_GDI_CLASSIC
@ DWRITE_MEASURING_MODE_NATURAL
@ DWRITE_MEASURING_MODE_GDI_NATURAL
HRESULT bidi_computelevels(struct bidi_char *chars, unsigned int count, UINT8 baselevel)
static WCHAR available[MAX_STRING_RESOURCE_LEN]
BOOL WINAPI InitOnceExecuteOnce(_Inout_ PINIT_ONCE InitOnce, _In_ __callback PINIT_ONCE_FN InitFn, _Inout_opt_ PVOID Parameter, _Outptr_opt_result_maybenull_ LPVOID *Context)
_ACRTIMP wchar_t *__cdecl wcstok_s(wchar_t *, const wchar_t *, wchar_t **)
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
_ACRTIMP __msvcrt_ulong __cdecl strtoul(const char *, char **, int)
static wchar_t * wcsdup(const wchar_t *str)
@ DWRITE_SCRIPT_SHAPES_NO_VISUAL
@ DWRITE_SCRIPT_SHAPES_DEFAULT
@ DWRITE_BREAK_CONDITION_MUST_BREAK
@ DWRITE_BREAK_CONDITION_CAN_BREAK
@ DWRITE_BREAK_CONDITION_MAY_NOT_BREAK
@ DWRITE_BREAK_CONDITION_NEUTRAL
DWRITE_NUMBER_SUBSTITUTION_METHOD
@ DWRITE_NUMBER_SUBSTITUTION_METHOD_NONE
@ DWRITE_NUMBER_SUBSTITUTION_METHOD_CONTEXTUAL
@ DWRITE_NUMBER_SUBSTITUTION_METHOD_TRADITIONAL
@ DWRITE_NUMBER_SUBSTITUTION_METHOD_FROM_CULTURE
@ DWRITE_NUMBER_SUBSTITUTION_METHOD_NATIONAL
@ DWRITE_BASELINE_MINIMUM
@ DWRITE_BASELINE_DEFAULT
@ DWRITE_BASELINE_CENTRAL
@ DWRITE_BASELINE_IDEOGRAPHIC_TOP
@ DWRITE_BASELINE_HANGING
@ DWRITE_BASELINE_MAXIMUM
@ DWRITE_BASELINE_IDEOGRAPHIC_BOTTOM
DWRITE_GLYPH_ORIENTATION_ANGLE
@ DWRITE_GLYPH_ORIENTATION_ANGLE_180_DEGREES
@ DWRITE_GLYPH_ORIENTATION_ANGLE_90_DEGREES
@ DWRITE_GLYPH_ORIENTATION_ANGLE_0_DEGREES
@ DWRITE_GLYPH_ORIENTATION_ANGLE_270_DEGREES
float fontface_get_scaled_design_advance(struct dwrite_fontface *fontface, DWRITE_MEASURING_MODE measuring_mode, float emsize, float ppdip, const DWRITE_MATRIX *transform, UINT16 glyph, BOOL is_sideways)
HRESULT shape_get_glyphs(struct scriptshaping_context *context, const unsigned int *scripts)
struct scriptshaping_cache * fontface_get_shaping_cache(struct dwrite_fontface *fontface)
struct dwrite_fontface * unsafe_impl_from_IDWriteFontFace(IDWriteFontFace *iface)
static unsigned short get_table_entry_32(const unsigned short *table, UINT ch)
static BOOL dwrite_array_reserve(void **elements, size_t *capacity, size_t count, size_t size)
HRESULT shape_get_typographic_features(struct scriptshaping_context *context, const unsigned int *scripts, unsigned int max_tagcount, unsigned int *actual_tagcount, DWRITE_FONT_FEATURE_TAG *tags)
HRESULT shape_check_typographic_feature(struct scriptshaping_context *context, const unsigned int *scripts, unsigned int tag, unsigned int glyph_count, const UINT16 *glyphs, UINT8 *feature_applies)
HRESULT shape_get_positions(struct scriptshaping_context *context, const unsigned int *scripts)
Character const *const size_t const max_count
static const FxOffsetAndName offsets[]
GLuint GLuint GLsizei count
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLint GLint GLsizei width
GLuint GLuint GLsizei GLenum const GLvoid * indices
GLuint GLenum GLenum transform
GLenum GLenum GLenum GLenum GLenum scale
GLenum GLuint GLint GLenum face
GLsizei GLenum const GLvoid GLuint GLsizei GLfloat * metrics
GLuint GLsizei GLsizei * length
GLsizei GLenum GLboolean sink
GLenum GLenum GLenum GLenum mapping
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
static const int digits[]
#define memcpy(s1, s2, n)
static const LARGE_INTEGER *static const HANDLE const LARGE_INTEGER *static PSLIST_ENTRY PSLIST_ENTRY last
INTERNETFEATURELIST feature
#define LOCALE_NAME_MAX_LENGTH
#define IsEqualIID(riid1, riid2)
static __inline const char * debugstr_fourcc(unsigned int cc)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
#define LIST_FOR_EACH_ENTRY_SAFE(cursor, cursor2, list, type, field)
UINT8 breakConditionBefore
UINT8 breakConditionAfter
DWRITE_SCRIPT_SHAPES shapes
DWRITE_FONT_METRICS1 metrics
DWRITE_GLYPH_METRICS * glyphs[GLYPH_MAX/GLYPH_BLOCK_SIZE]
IDWriteFactory7 * factory
struct fallback_data data
IDWriteFontFallbackBuilder IDWriteFontFallbackBuilder_iface
IDWriteFontFallback1 IDWriteFontFallback1_iface
IDWriteFactory7 * factory
struct fallback_data data
IDWriteFontCollection * systemcollection
DWRITE_NUMBER_SUBSTITUTION_METHOD method
IDWriteNumberSubstitution IDWriteNumberSubstitution_iface
BOOL ignore_user_override
DWRITE_SCRIPT_PROPERTIES props
struct fallback_mapping * mappings
WCHAR name[LOCALE_NAME_MAX_LENGTH]
struct fallback_locale::@303 ranges
DWRITE_UNICODE_RANGE * ranges
IDWriteFontCollection * collection
struct break_index * breaks
DWRITE_LINE_BREAKPOINT * breakpoints
DWRITE_MEASURING_MODE measuring_mode
IDWriteTextAnalysisSource * source
#define CONTAINING_RECORD(address, type, field)
static const WCHAR props[]
#define INIT_ONCE_STATIC_INIT
#define LOCALE_SOPENTYPELANGUAGETAG
#define IS_HIGH_SURROGATE(ch)
#define LOCALE_SISO639LANGNAME
#define LOCALE_NOUSEROVERRIDE
#define IS_LOW_SURROGATE(ch)
#define LOCALE_SNATIVEDIGITS