]>
Commit | Line | Data |
---|---|---|
b75a7d8f A |
1 | /* |
2 | ******************************************************************************* | |
3 | * | |
4 | * Copyright (C) 1999-2003, International Business Machines | |
5 | * Corporation and others. All Rights Reserved. | |
6 | * | |
7 | ******************************************************************************* | |
8 | * file name: gendata.cpp | |
9 | * | |
10 | * created on: 11/03/2000 | |
11 | * created by: Eric R. Mader | |
12 | */ | |
13 | ||
14 | #include <stdio.h> | |
15 | #include <ctype.h> | |
16 | ||
17 | #include "LETypes.h" | |
18 | #include "LEScripts.h" | |
19 | #include "LayoutEngine.h" | |
20 | ||
21 | #include "PortableFontInstance.h" | |
22 | ||
23 | #include "unicode/uscript.h" | |
24 | ||
25 | U_NAMESPACE_USE | |
26 | ||
27 | #define ARRAY_LENGTH(array) (sizeof array / sizeof array[0]) | |
28 | ||
29 | struct TestInput | |
30 | { | |
31 | char *fontName; | |
32 | LEUnicode *text; | |
33 | le_int32 textLength; | |
34 | le_int32 scriptCode; | |
35 | le_bool rightToLeft; | |
36 | }; | |
37 | ||
38 | /* | |
39 | * FIXME: should use the output file name and the current date. | |
40 | */ | |
41 | char *header = | |
42 | "/*\n" | |
43 | " *******************************************************************************\n" | |
44 | " *\n" | |
45 | " * Copyright (C) 1999-2003, International Business Machines\n" | |
46 | " * Corporation and others. All Rights Reserved.\n" | |
47 | " *\n" | |
48 | " * WARNING: THIS FILE IS MACHINE GENERATED. DO NOT HAND EDIT IT\n" | |
49 | " * UNLESS YOU REALLY KNOW WHAT YOU'RE DOING.\n" | |
50 | " *\n" | |
51 | " *******************************************************************************\n" | |
52 | " *\n" | |
53 | " * file name: testdata.cpp\n" | |
54 | " * created on: 12/14/2000\n" | |
55 | " * created by: gendata.cpp\n" | |
56 | " */\n" | |
57 | "\n" | |
58 | "#include \"LETypes.h\"\n" | |
59 | "#include \"LEScripts.h\"\n" | |
60 | "#include \"letest.h\"\n" | |
61 | "\n"; | |
62 | ||
63 | #if 0 | |
64 | char *scriptNames[] = | |
65 | { | |
66 | "USCRIPT_COMMON", /* Zyyy */ | |
67 | "USCRIPT_INHERITED", /* Qaai */ | |
68 | "USCRIPT_ARABIC", /* Arab */ | |
69 | "USCRIPT_ARMENIAN", /* Armn */ | |
70 | "USCRIPT_BENGALI", /* Beng */ | |
71 | "USCRIPT_BOPOMOFO", /* Bopo */ | |
72 | "USCRIPT_CHEROKEE", /* Cher */ | |
73 | "USCRIPT_COPTIC", /* Qaac */ | |
74 | "USCRIPT_CYRILLIC", /* Cyrl (Cyrs) */ | |
75 | "USCRIPT_DESERET", /* Dsrt */ | |
76 | "USCRIPT_DEVANAGARI", /* Deva */ | |
77 | "USCRIPT_ETHIOPIC", /* Ethi */ | |
78 | "USCRIPT_GEORGIAN", /* Geor (Geon, Geoa) */ | |
79 | "USCRIPT_GOTHIC", /* Goth */ | |
80 | "USCRIPT_GREEK", /* Grek */ | |
81 | "USCRIPT_GUJARATI", /* Gujr */ | |
82 | "USCRIPT_GURMUKHI", /* Guru */ | |
83 | "USCRIPT_HAN", /* Hani */ | |
84 | "USCRIPT_HANGUL", /* Hang */ | |
85 | "USCRIPT_HEBREW", /* Hebr */ | |
86 | "USCRIPT_HIRAGANA", /* Hira */ | |
87 | "USCRIPT_KANNADA", /* Knda */ | |
88 | "USCRIPT_KATAKANA", /* Kana */ | |
89 | "USCRIPT_KHMER", /* Khmr */ | |
90 | "USCRIPT_LAO", /* Laoo */ | |
91 | "USCRIPT_LATIN", /* Latn (Latf, Latg) */ | |
92 | "USCRIPT_MALAYALAM", /* Mlym */ | |
93 | "USCRIPT_MONGOLIAN", /* Mong */ | |
94 | "USCRIPT_MYANMAR", /* Mymr */ | |
95 | "USCRIPT_OGHAM", /* Ogam */ | |
96 | "USCRIPT_OLD_ITALIC", /* Ital */ | |
97 | "USCRIPT_ORIYA", /* Orya */ | |
98 | "USCRIPT_RUNIC", /* Runr */ | |
99 | "USCRIPT_SINHALA", /* Sinh */ | |
100 | "USCRIPT_SYRIAC", /* Syrc (Syrj, Syrn, Syre) */ | |
101 | "USCRIPT_TAMIL", /* Taml */ | |
102 | "USCRIPT_TELUGU", /* Telu */ | |
103 | "USCRIPT_THAANA", /* Thaa */ | |
104 | "USCRIPT_THAI", /* Thai */ | |
105 | "USCRIPT_TIBETAN", /* Tibt */ | |
106 | "USCRIPT_UCAS", /* Cans */ | |
107 | "USCRIPT_YI", /* Yiii */ | |
108 | "USCRIPT_TAGALOG", /* Tglg */ | |
109 | "USCRIPT_HANUNOO", /* Hano */ | |
110 | "USCRIPT_BUHID", /* Buhd */ | |
111 | "USCRIPT_TAGBANWA" /* Tagb */ | |
112 | }; | |
113 | #endif | |
114 | ||
115 | LEUnicode devaText[] = | |
116 | { | |
117 | 0x0936, 0x094d, 0x0930, 0x0940, 0x092e, 0x0926, 0x094d, 0x0020, | |
118 | 0x092d, 0x0917, 0x0935, 0x0926, 0x094d, 0x0917, 0x0940, 0x0924, | |
119 | 0x093e, 0x0020, 0x0905, 0x0927, 0x094d, 0x092f, 0x093e, 0x092f, | |
120 | 0x0020, 0x0905, 0x0930, 0x094d, 0x091c, 0x0941, 0x0928, 0x0020, | |
121 | 0x0935, 0x093f, 0x0937, 0x093e, 0x0926, 0x0020, 0x092f, 0x094b, | |
122 | 0x0917, 0x0020, 0x0927, 0x0943, 0x0924, 0x0930, 0x093e, 0x0937, | |
123 | 0x094d, 0x091f, 0x094d, 0x0930, 0x0020, 0x0909, 0x0935, 0x093E, | |
124 | 0x091A, 0x0943, 0x0020, 0x0927, 0x0930, 0x094d, 0x092e, 0x0915, | |
125 | 0x094d, 0x0937, 0x0947, 0x0924, 0x094d, 0x0930, 0x0947, 0x0020, | |
126 | 0x0915, 0x0941, 0x0930, 0x0941, 0x0915, 0x094d, 0x0937, 0x0947, | |
127 | 0x0924, 0x094d, 0x0930, 0x0947, 0x0020, 0x0938, 0x092e, 0x0935, | |
128 | 0x0947, 0x0924, 0x093e, 0x0020, 0x092f, 0x0941, 0x092f, 0x0941, | |
129 | 0x0924, 0x094d, 0x0938, 0x0935, 0x0903, 0x0020, 0x092e, 0x093e, | |
130 | 0x092e, 0x0915, 0x093e, 0x0903, 0x0020, 0x092a, 0x093e, 0x0923, | |
131 | 0x094d, 0x0921, 0x0935, 0x093e, 0x0936, 0x094d, 0x091a, 0x0948, | |
132 | 0x0935, 0x0020, 0x0915, 0x093f, 0x092e, 0x0915, 0x0941, 0x0930, | |
133 | 0x094d, 0x0935, 0x0924, 0x0020, 0x0938, 0x0902, 0x091c, 0x0935 | |
134 | }; | |
135 | ||
136 | le_int32 devaTextLength = ARRAY_LENGTH(devaText); | |
137 | ||
138 | LEUnicode arabText[] = | |
139 | { | |
140 | 0x0623, 0x0633, 0x0627, 0x0633, 0x064B, 0x0627, 0x060C, 0x0020, | |
141 | 0x062A, 0x062A, 0x0639, 0x0627, 0x0645, 0x0644, 0x0020, | |
142 | 0x0627, 0x0644, 0x062D, 0x0648, 0x0627, 0x0633, 0x064A, 0x0628, | |
143 | 0x0020, 0x0641, 0x0642, 0x0637, 0x0020, 0x0645, 0x0639, 0x0020, | |
144 | 0x0627, 0x0644, 0x0623, 0x0631, 0x0642, 0x0627, 0x0645, 0x060C, | |
145 | 0x0020, 0x0648, 0x062A, 0x0642, 0x0648, 0x0645, 0x0020, 0x0628, | |
146 | 0x062A, 0x062E, 0x0632, 0x064A, 0x0646, 0x0020, 0x0627, 0x0644, | |
147 | 0x0623, 0x062D, 0x0631, 0x0641, 0x0020, 0x0648, 0x0627, 0x0644, | |
148 | 0x0645, 0x062D, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, | |
149 | 0x0623, 0x062E, 0x0631, 0x0649, 0x0020, 0x0628, 0x0639, 0x062F, | |
150 | 0x0020, 0x0623, 0x0646, 0x0020, 0x062A, 0x064F, 0x0639, 0x0637, | |
151 | 0x064A, 0x0020, 0x0631, 0x0642, 0x0645, 0x0627, 0x0020, 0x0645, | |
152 | 0x0639, 0x064A, 0x0646, 0x0627, 0x0020, 0x0644, 0x0643, 0x0644, | |
153 | 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x0645, 0x0646, | |
154 | 0x0647, 0x0627, 0x002E, 0x0020, 0x0648, 0x0642, 0x0628, 0x0644, | |
155 | 0x0020, 0x0627, 0x062E, 0x062A, 0x0631, 0x0627, 0x0639, 0x0020, | |
156 | 0x0022, 0x064A, 0x0648, 0x0646, 0x0650, 0x0643, 0x0648, 0x062F, | |
157 | 0x0022, 0x060C, 0x0020, 0x0643, 0x0627, 0x0646, 0x0020, 0x0647, | |
158 | 0x0646, 0x0627, 0x0643, 0x0020, 0x0645, 0x0626, 0x0627, 0x062A, | |
159 | 0x0020, 0x0627, 0x0644, 0x0623, 0x0646, 0x0638, 0x0645, 0x0629, | |
160 | 0x0020, 0x0644, 0x0644, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, | |
161 | 0x0020, 0x0648, 0x062A, 0x062E, 0x0635, 0x064A, 0x0635, 0x0020, | |
162 | 0x0647, 0x0630, 0x0647, 0x0020, 0x0627, 0x0644, 0x0623, 0x0631, | |
163 | 0x0642, 0x0627, 0x0645, 0x0020, 0x0644, 0x0644, 0x0645, 0x062D, | |
164 | 0x0627, 0x0631, 0x0641, 0x060C, 0x0020, 0x0648, 0x0644, 0x0645, | |
165 | 0x0020, 0x064A, 0x0648, 0x062C, 0x062F, 0x0020, 0x0646, 0x0638, | |
166 | 0x0627, 0x0645, 0x0020, 0x062A, 0x0634, 0x0641, 0x064A, 0x0631, | |
167 | 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x064A, 0x062D, | |
168 | 0x062A, 0x0648, 0x064A, 0x0020, 0x0639, 0x0644, 0x0649, 0x0020, | |
169 | 0x062C, 0x0645, 0x064A, 0x0639, 0x0020, 0x0627, 0x0644, 0x0645, | |
170 | 0x062D, 0x0627, 0x0631, 0x0641, 0x0020, 0x0627, 0x0644, 0x0636, | |
171 | 0x0631, 0x0648, 0x0631, 0x064A, 0x0629 | |
172 | ||
173 | /* The next few sentences... | |
174 | 0x002E, 0x0020, 0x0648, | |
175 | 0x0639, 0x0644, 0x0649, 0x0020, 0x0633, 0x0628, 0x064A, 0x0644, | |
176 | 0x0020, 0x0627, 0x0644, 0x0645, 0x062B, 0x0627, 0x0644, 0x060C, | |
177 | 0x0020, 0x0641, 0x0625, 0x0646, 0x0020, 0x0627, 0x0644, 0x0627, | |
178 | 0x062A, 0x062D, 0x0627, 0x062F, 0x0020, 0x0627, 0x0644, 0x0623, | |
179 | 0x0648, 0x0631, 0x0648, 0x0628, 0x064A, 0x0020, 0x0644, 0x0648, | |
180 | 0x062D, 0x062F, 0x0647, 0x060C, 0x0020, 0x0627, 0x062D, 0x062A, | |
181 | 0x0648, 0x0649, 0x0020, 0x0627, 0x0644, 0x0639, 0x062F, 0x064A, | |
182 | 0x062F, 0x0020, 0x0645, 0x0646, 0x0020, 0x0627, 0x0644, 0x0634, | |
183 | 0x0641, 0x0631, 0x0627, 0x062A, 0x0020, 0x0627, 0x0644, 0x0645, | |
184 | 0x062E, 0x062A, 0x0644, 0x0641, 0x0629, 0x0020, 0x0644, 0x064A, | |
185 | 0x063A, 0x0637, 0x064A, 0x0020, 0x062C, 0x0645, 0x064A, 0x0639, | |
186 | 0x0020, 0x0627, 0x0644, 0x0644, 0x063A, 0x0627, 0x062A, 0x0020, | |
187 | 0x0627, 0x0644, 0x0645, 0x0633, 0x062A, 0x062E, 0x062F, 0x0645, | |
188 | 0x0629, 0x0020, 0x0641, 0x064A, 0x0020, 0x0627, 0x0644, 0x0627, | |
189 | 0x062A, 0x062D, 0x0627, 0x062F, 0x002E, 0x0020, 0x0648, 0x062D, | |
190 | 0x062A, 0x0649, 0x0020, 0x0644, 0x0648, 0x0020, 0x0627, 0x0639, | |
191 | 0x062A, 0x0628, 0x0631, 0x0646, 0x0627, 0x0020, 0x0644, 0x063A, | |
192 | 0x0629, 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0629, 0x060C, | |
193 | 0x0020, 0x0643, 0x0627, 0x0644, 0x0644, 0x063A, 0x0629, 0x0020, | |
194 | 0x0627, 0x0644, 0x0625, 0x0646, 0x062C, 0x0644, 0x064A, 0x0632, | |
195 | 0x064A, 0x0629, 0x060C, 0x0020, 0x0641, 0x0625, 0x0646, 0x0020, | |
196 | 0x062C, 0x062F, 0x0648, 0x0644, 0x0020, 0x0634, 0x0641, 0x0631, | |
197 | 0x0629, 0x0020, 0x0648, 0x0627, 0x062D, 0x062F, 0x0020, 0x0644, | |
198 | 0x0645, 0x0020, 0x064A, 0x0643, 0x0641, 0x0020, 0x0644, 0x0627, | |
199 | 0x0633, 0x062A, 0x064A, 0x0639, 0x0627, 0x0628, 0x0020, 0x062C, | |
200 | 0x0645, 0x064A, 0x0639, 0x0020, 0x0627, 0x0644, 0x0623, 0x062D, | |
201 | 0x0631, 0x0641, 0x0020, 0x0648, 0x0639, 0x0644, 0x0627, 0x0645, | |
202 | 0x0627, 0x062A, 0x0020, 0x0627, 0x0644, 0x062A, 0x0631, 0x0642, | |
203 | 0x064A, 0x0645, 0x0020, 0x0648, 0x0627, 0x0644, 0x0631, 0x0645, | |
204 | 0x0648, 0x0632, 0x0020, 0x0627, 0x0644, 0x0641, 0x0646, 0x064A, | |
205 | 0x0629, 0x0020, 0x0648, 0x0627, 0x0644, 0x0639, 0x0644, 0x0645, | |
206 | 0x064A, 0x0629, 0x0020, 0x0627, 0x0644, 0x0634, 0x0627, 0x0626, | |
207 | 0x0639, 0x0629, 0x0020, 0x0627, 0x0644, 0x0627, 0x0633, 0x062A, | |
208 | 0x0639, 0x0645, 0x0627, 0x0644, 0x002E */ | |
209 | }; | |
210 | le_int32 arabTextLength = ARRAY_LENGTH(arabText); | |
211 | ||
212 | ||
213 | LEUnicode thaiSample[] = | |
214 | { | |
215 | 0x0E1A, 0x0E17, 0x0E17, 0x0E35, 0x0E48, 0x0E51, 0x0E1E, 0x0E32, | |
216 | 0x0E22, 0x0E38, 0x0E44, 0x0E0B, 0x0E42, 0x0E04, 0x0E25, 0x0E19, | |
217 | 0x0E42, 0x0E14, 0x0E42, 0x0E23, 0x0E18, 0x0E35, 0x0E2D, 0x0E32, | |
218 | 0x0E28, 0x0E31, 0x0E22, 0x0E2D, 0x0E22, 0x0E39, 0x0E48, 0x0E17, | |
219 | 0x0E48, 0x0E32, 0x0E21, 0x0E01, 0x0E25, 0x0E32, 0x0E07, 0x0E17, | |
220 | 0x0E38, 0x0E48, 0x0E07, 0x0E43, 0x0E2B, 0x0E0D, 0x0E48, 0x0E43, | |
221 | 0x0E19, 0x0E41, 0x0E04, 0x0E19, 0x0E0B, 0x0E31, 0x0E2A, 0x0E01, | |
222 | 0x0E31, 0x0E1A, 0x0E25, 0x0E38, 0x0E07, 0x0E40, 0x0E2E, 0x0E19, | |
223 | 0x0E23, 0x0E35, 0x0E0A, 0x0E32, 0x0E27, 0x0E44, 0x0E23, 0x0E48, | |
224 | 0x0E41, 0x0E25, 0x0E30, 0x0E1B, 0x0E49, 0x0E32, 0x0E40, 0x0E2D, | |
225 | 0x0E47, 0x0E21, 0x0E20, 0x0E23, 0x0E23, 0x0E22, 0x0E32, 0x0E0A, | |
226 | 0x0E32, 0x0E27, 0x0E44, 0x0E23, 0x0E48, 0x0E1A, 0x0E49, 0x0E32, | |
227 | 0x0E19, 0x0E02, 0x0E2D, 0x0E07, 0x0E1E, 0x0E27, 0x0E01, 0x0E40, | |
228 | 0x0E02, 0x0E32, 0x0E2B, 0x0E25, 0x0E31, 0x0E07, 0x0E40, 0x0E25, | |
229 | 0x0E47, 0x0E01, 0x0E40, 0x0E1E, 0x0E23, 0x0E32, 0x0E30, 0x0E44, | |
230 | 0x0E21, 0x0E49, 0x0E2A, 0x0E23, 0x0E49, 0x0E32, 0x0E07, 0x0E1A, | |
231 | 0x0E49, 0x0E32, 0x0E19, 0x0E15, 0x0E49, 0x0E2D, 0x0E07, 0x0E02, | |
232 | 0x0E19, 0x0E21, 0x0E32, 0x0E14, 0x0E49, 0x0E27, 0x0E22, 0x0E40, | |
233 | 0x0E01, 0x0E27, 0x0E35, 0x0E22, 0x0E19, 0x0E40, 0x0E1B, 0x0E47, | |
234 | 0x0E19, 0x0E23, 0x0E30, 0x0E22, 0x0E30, 0x0E17, 0x0E32, 0x0E07, | |
235 | 0x0E2B, 0x0E25, 0x0E32, 0x0E22, 0x0E44, 0x0E21, 0x0E25, 0x0E4C | |
236 | /* A few more lines... | |
237 | 0x0E1A, 0x0E49, 0x0E32, 0x0E19, 0x0E21, 0x0E35, 0x0E2A, 0x0E35, | |
238 | 0x0E48, 0x0E1D, 0x0E32, 0x0E21, 0x0E35, 0x0E1E, 0x0E37, 0x0E49, | |
239 | 0x0E19, 0x0E01, 0x0E31, 0x0E1A, 0x0E2B, 0x0E25, 0x0E31, 0x0E07, | |
240 | 0x0E04, 0x0E32, 0x0E23, 0x0E27, 0x0E21, 0x0E17, 0x0E33, 0x0E40, | |
241 | 0x0E1B, 0x0E47, 0x0E19, 0x0E2B, 0x0E49, 0x0E2D, 0x0E07, 0x0E40, | |
242 | 0x0E14, 0x0E35, 0x0E22, 0x0E27, 0x0E43, 0x0E19, 0x0E2B, 0x0E49, | |
243 | 0x0E2D, 0x0E07, 0x0E21, 0x0E35, 0x0E17, 0x0E31, 0x0E49, 0x0E07, | |
244 | 0x0E40, 0x0E15, 0x0E32, 0x0E2B, 0x0E38, 0x0E07, 0x0E15, 0x0E49, | |
245 | 0x0E21, 0x0E17, 0x0E35, 0x0E48, 0x0E2A, 0x0E19, 0x0E34, 0x0E21, | |
246 | 0x0E14, 0x0E39, 0x0E02, 0x0E36, 0x0E49, 0x0E19, 0x0E40, 0x0E25, | |
247 | 0x0E2D, 0x0E30, 0x0E21, 0x0E35, 0x0E15, 0x0E39, 0x0E49, 0x0E43, | |
248 | 0x0E2A, 0x0E48, 0x0E16, 0x0E49, 0x0E27, 0x0E22, 0x0E0A, 0x0E32, | |
249 | 0x0E21, 0x0E42, 0x0E15, 0x0E4A, 0x0E30, 0x0E40, 0x0E01, 0x0E49, | |
250 | 0x0E32, 0x0E2D, 0x0E35, 0x0E49, 0x0E2A, 0x0E32, 0x0E21, 0x0E2B, | |
251 | 0x0E23 | |
252 | */ | |
253 | }; | |
254 | ||
255 | le_int32 thaiSampleLength = ARRAY_LENGTH(thaiSample); | |
256 | ||
257 | TestInput testInputs[] = { | |
258 | {"raghu.ttf", devaText, devaTextLength, devaScriptCode, false}, | |
259 | {"CODE2000.TTF", arabText, arabTextLength, arabScriptCode, true}, | |
260 | {"LucidaSansRegular.ttf", arabText, arabTextLength, arabScriptCode, true}, | |
261 | {"Thonburi.ttf", thaiSample, thaiSampleLength, thaiScriptCode, false} | |
262 | }; | |
263 | ||
264 | #define TEST_COUNT ARRAY_LENGTH(testInputs) | |
265 | ||
266 | le_int32 testCount = TEST_COUNT; | |
267 | ||
268 | void dumpShorts(FILE *file, char *label, le_int32 id, le_uint16 *shorts, le_int32 count) { | |
269 | char lineBuffer[8 * 8 + 2]; | |
270 | le_int32 bufp = 0; | |
271 | ||
272 | fprintf(file, label, id); | |
273 | ||
274 | for (int i = 0; i < count; i += 1) { | |
275 | if (i % 8 == 0 && bufp != 0) { | |
276 | fprintf(file, " %s\n", lineBuffer); | |
277 | bufp = 0; | |
278 | } | |
279 | ||
280 | bufp += sprintf(&lineBuffer[bufp], "0x%4.4X, ", shorts[i]); | |
281 | } | |
282 | ||
283 | if (bufp != 0) { | |
284 | lineBuffer[bufp - 2] = '\0'; | |
285 | fprintf(file, " %s\n", lineBuffer); | |
286 | } | |
287 | ||
288 | fprintf(file, "};\n\n"); | |
289 | } | |
290 | ||
291 | void dumpLongs(FILE *file, char *label, le_int32 id, le_int32 *longs, le_int32 count) { | |
292 | char lineBuffer[8 * 12 + 2]; | |
293 | le_int32 bufp = 0; | |
294 | ||
295 | fprintf(file, label, id); | |
296 | ||
297 | for (int i = 0; i < count; i += 1) { | |
298 | if (i % 8 == 0 && bufp != 0) { | |
299 | fprintf(file, " %s\n", lineBuffer); | |
300 | bufp = 0; | |
301 | } | |
302 | ||
303 | bufp += sprintf(&lineBuffer[bufp], "0x%8.8X, ", longs[i]); | |
304 | } | |
305 | ||
306 | if (bufp != 0) { | |
307 | lineBuffer[bufp - 2] = '\0'; | |
308 | fprintf(file, " %s\n", lineBuffer); | |
309 | } | |
310 | ||
311 | fprintf(file, "};\n\n"); | |
312 | } | |
313 | ||
314 | void dumpFloats(FILE *file, char *label, le_int32 id, float *floats, le_int32 count) { | |
315 | char lineBuffer[8 * 16 + 2]; | |
316 | le_int32 bufp = 0; | |
317 | ||
318 | fprintf(file, label, id); | |
319 | ||
320 | for (int i = 0; i < count; i += 1) { | |
321 | if (i % 8 == 0 && bufp != 0) { | |
322 | fprintf(file, " %s\n", lineBuffer); | |
323 | bufp = 0; | |
324 | } | |
325 | ||
326 | bufp += sprintf(&lineBuffer[bufp], "%fF, ", floats[i]); | |
327 | } | |
328 | ||
329 | if (bufp != 0) { | |
330 | lineBuffer[bufp - 2] = '\0'; | |
331 | fprintf(file, " %s\n", lineBuffer); | |
332 | } | |
333 | ||
334 | fprintf(file, "};\n\n"); | |
335 | } | |
336 | ||
337 | const char *getShortName(le_int32 scriptCode) | |
338 | { | |
339 | static char shortName[5]; | |
340 | const char *name = uscript_getShortName((UScriptCode) scriptCode); | |
341 | ||
342 | shortName[0] = tolower(name[0]); | |
343 | shortName[1] = tolower(name[1]); | |
344 | shortName[2] = tolower(name[2]); | |
345 | shortName[3] = tolower(name[3]); | |
346 | shortName[4] = '\0'; | |
347 | ||
348 | return shortName; | |
349 | } | |
350 | ||
351 | int main(int argc, char *argv[]) | |
352 | { | |
353 | le_int32 test; | |
354 | FILE *outputFile = fopen(argv[1], "w"); | |
355 | ||
356 | fprintf(outputFile, header); | |
357 | ||
358 | for (test = 0; test < testCount; test += 1) { | |
359 | LEErrorCode fontStatus = LE_NO_ERROR; | |
360 | PortableFontInstance fontInstance(testInputs[test].fontName, 12, fontStatus); | |
361 | ||
362 | if (LE_FAILURE(fontStatus)) { | |
363 | printf("ERROR: test case %d, could not get a font instance for %s\n", test, testInputs[test].fontName); | |
364 | continue; | |
365 | } | |
366 | ||
367 | LEErrorCode success = LE_NO_ERROR; | |
368 | LayoutEngine *engine = LayoutEngine::layoutEngineFactory(&fontInstance, testInputs[test].scriptCode, -1, success); | |
369 | le_uint32 glyphCount; | |
370 | LEGlyphID *glyphs; | |
371 | le_int32 *indices; | |
372 | float *positions; | |
373 | ||
374 | if (LE_FAILURE(success)) { | |
375 | printf("ERROR: test case %d, could not create a LayoutEngine for script %s.\n", test, uscript_getName((UScriptCode) testInputs[test].scriptCode)); | |
376 | continue; | |
377 | } | |
378 | ||
379 | glyphCount = engine->layoutChars(testInputs[test].text, 0, testInputs[test].textLength, testInputs[test].textLength, testInputs[test].rightToLeft, 0, 0, success); | |
380 | ||
381 | glyphs = new LEGlyphID[glyphCount]; | |
382 | indices = new le_int32[glyphCount]; | |
383 | positions = new float[glyphCount * 2 + 2]; | |
384 | ||
385 | engine->getGlyphs(glyphs, success); | |
386 | engine->getCharIndices(indices, success); | |
387 | engine->getGlyphPositions(positions, success); | |
388 | ||
389 | //fprintf(outputFile, "font: %s\n", testInputs[test].fontName); | |
390 | dumpShorts(outputFile, "LEUnicode inputText%d[] =\n{\n", test, testInputs[test].text, testInputs[test].textLength); | |
391 | ||
392 | dumpLongs(outputFile, "LEGlyphID resultGlyphs%d[] =\n{\n", test, (le_int32 *) glyphs, glyphCount); | |
393 | fprintf(outputFile, "le_int32 resultGlyphCount%d = %d;\n\n", test, glyphCount); | |
394 | ||
395 | dumpLongs(outputFile, "le_int32 resultIndices%d[] =\n{\n", test, indices, glyphCount); | |
396 | ||
397 | dumpFloats(outputFile, "float resultPositions%d[] =\n{\n", test, positions, glyphCount * 2 + 2); | |
398 | ||
399 | fprintf(outputFile, "\n"); | |
400 | ||
401 | delete[] positions; | |
402 | delete[] indices; | |
403 | delete[] glyphs; | |
404 | delete engine; | |
405 | } | |
406 | ||
407 | fprintf(outputFile, "TestInput testInputs[] = \n{\n"); | |
408 | ||
409 | for (test = 0; test < testCount; test += 1) { | |
410 | fprintf(outputFile, " {\"%s\", inputText%d, %d, %sScriptCode, %s},\n", | |
411 | testInputs[test].fontName, test, testInputs[test].textLength, getShortName(testInputs[test].scriptCode), | |
412 | testInputs[test].rightToLeft? "true" : "false"); | |
413 | } | |
414 | ||
415 | fprintf(outputFile, "};\n\nle_int32 testCount = ARRAY_LENGTH(testInputs);\n\n"); | |
416 | ||
417 | fprintf(outputFile, "TestResult testResults[] = \n{\n"); | |
418 | ||
419 | for (test = 0; test < testCount; test += 1) { | |
420 | fprintf(outputFile, " {resultGlyphCount%d, resultGlyphs%d, resultIndices%d, resultPositions%d},\n", | |
421 | test, test, test, test); | |
422 | } | |
423 | ||
424 | fprintf(outputFile, "};\n\n"); | |
425 | ||
426 | fclose(outputFile); | |
427 | return 0; | |
428 | } |