Update contrib.
1 // Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
2 // All rights reserved.
3 // This component and the accompanying materials are made available
4 // under the terms of "Eclipse Public License v1.0"
5 // which accompanies this distribution, and is available
6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
8 // Initial Contributors:
9 // Nokia Corporation - initial contribution.
14 // This is a unit test module which defines the test code that
15 // exercise CFont::GetCharacterPosition() functionality.
27 // -- INCLUDE FILES ---------------------------------------------------------
34 #include <linebreak.h>
35 #include <bidivisual.h>
37 #include "TGlyphSel.h"
38 #include <graphics/openfontconstants.h>
39 #include <graphics/openfontrasterizer.h>
43 // -- CONSTANTS -------------------------------------------------------------
47 This define when set introduces a delay to start up to allow Glowcode to
48 be set up to collect statistics.
50 //#define _GLOWCODE_LAUNCH_DELAY 1
53 /** RTest object for unit test output */
54 //RTest TEST(_L("TGlyphSel - CFont Glyph Selection"));
56 /** Thread name for test cases involving a new thread. */
57 _LIT(KThread2NameFirst, "GlyphSelPanicTest_First");
58 _LIT(KThread2NameSecond, "GlyphSelPanicTest_Second");
60 /*Beginning of Indic language font file constants declaration*/
62 _LIT16(KTestHindiFontFile, "C:\\TNR_Dev_OT.ttf");
63 _LIT16(KTestHindiFontFaceName, "Devanagari OT Eval");
65 //_LIT16(KTestIndicFontFile, "C:\\s60ssb_v435.ttf");
66 _LIT16(KTestIndicFontFile, "C:\\s60ssb_v500.ttf");
67 _LIT16(KTestIndicFontFaceName, "Series 60 Sans");
69 //_LIT16(KTestTeluguFontFile, "C:\\s60ssb_v500.ttf");
70 //_LIT16(KTestTeluguFontFaceName, "Series 60 Sans");
72 _LIT16(KTestGB18030FontFile, "C:\\TestExtB.ttf");
73 _LIT16(KTestGB18030FontFaceName, "Test Font for CJK ExtB");
75 /*End of Indic language font file constants declaration*/
77 // -- THAI TEST DATA --------------------------------------------------------
82 An array of Thai characters each of which is individually passed into
83 GetCharacterPosition() for testing.
85 LOCAL_D const TText16 Thai_SimpleChars[] = {
87 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54,
88 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59,
91 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
92 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
93 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
94 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
95 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
96 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E,
99 0x0E30, 0x0E32, // 0x0E33, Sara Am decomposed, not simple
100 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44,
103 0x0E2F, 0x0E3F, 0x0E45, 0x0E46, 0x0E4F, 0x0E5A, 0x0E5B,
110 Data structure used to hold the in and out data of one invoke
111 of the CFont::GetCharacterPosition() API.
113 struct TTestInput_PositionParam
120 TText16 oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
124 This array of structs is used in the test routine
125 CTGlyphSelection::TestThai_ValidGlyphClusters() for verifying
126 GetCharacterPosition() constructs Thai PUA glyph clusters correctly.
128 LOCAL_D const TTestInput_PositionParam Thai_ValidGlyphClusters[] = {
129 // --INPUT---------------- --OUTPUT----------------------
131 // TEST A1..A8 handled in Thai_SimpleChars table.
133 //0.TEST A9 - Decomposed SARA AM
134 { 2, {0x0E01, 0x0E33}, 1, 2, 1, {0x0E33}},
135 { 2, {0x0E1B, 0x0E33}, 1, 2, 2, {0xF711, 0x0E32}},
136 { 2, {0x0E41, 0x0E33}, 1, 2, 2, {KUnicodeDottedCircle, 0x0E33}},
137 { 1, {0x0E33}, 0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},
138 { 3, {0x0E19, 0x0E49, 0x0E33}, 0, 3, 4, {0x0E19, 0x0E4D, 0x0E49, 0x0E32}},
140 //5.TEST A9.1 - SARA AM exlcuded from cluster when vowel present
141 { 3, {0x0E19, 0x0E35, 0x0E33}, 0, 2, 2, {0x0E19, 0x0E35}},
142 { 3, {0x0E19, 0x0E39, 0x0E33}, 0, 2, 2, {0x0E19, 0x0E39}},
143 { 4, {0x0E19, 0x0E35, 0x0E48, 0x0E33}, 0, 3, 3, {0x0E19, 0x0E35, 0x0E48}},
145 //8.TEST B1 - Normal right aligned vowel/sign above short consonant
146 { 2, {0x0E04, 0x0E35}, 0, 2, 2, {0x0E04, 0x0E35}},
147 { 2, {0x0E01, 0x0E4D}, 0, 2, 2, {0x0E01, 0x0E4D}},
149 //10.TEST B2 - Left aligned vowel/sign above tall consonant
150 { 2, {0x0E1B, 0x0E34}, 0, 2, 2, {0x0E1B, 0xF701}},
151 { 2, {0x0E1D, 0x0E35}, 0, 2, 2, {0x0E1D, 0xF702}},
152 { 2, {0x0E1F, 0x0E36}, 0, 2, 2, {0x0E1F, 0xF703}},
153 { 2, {0x0E2C, 0x0E37}, 0, 2, 2, {0x0E2C, 0xF704}},
154 { 2, {0x0E1B, 0x0E31}, 0, 2, 2, {0x0E1B, 0xF710}},
155 { 2, {0x0E1D, 0x0E4D}, 0, 2, 2, {0x0E1D, 0xF711}},
156 { 2, {0x0E1F, 0x0E47}, 0, 2, 2, {0x0E1F, 0xF712}},
158 //17.TEST B3 - Normal right aligned vowel below short consonant
159 { 2, {0x0E2C, 0x0E3A}, 0, 2, 2, {0x0E2C, 0x0E3A}},
160 { 2, {0x0E0C, 0x0E38}, 0, 2, 2, {0x0E0C, 0x0E38}},
162 //19.TEST B4 - Vowel below consonant with joint decender
163 { 2, {0x0E0E, 0x0E38}, 0, 2, 2, {0x0E0E, 0xF718}},
164 { 2, {0x0E0F, 0x0E39}, 0, 2, 2, {0x0E0F, 0xF719}},
165 { 2, {0x0E0F, 0x0E3A}, 0, 2, 2, {0x0E0F, 0xF71A}},
166 { 2, {0x0E24, 0x0E38}, 0, 2, 2, {0x0E24, 0xF718}},
167 { 2, {0x0E26, 0x0E39}, 0, 2, 2, {0x0E26, 0xF719}},
169 //24.TEST B5 - Vowel below consonant with disjoint decender
170 { 2, {0x0E10, 0x0E38}, 0, 2, 2, {0xF700, 0x0E38}},
171 { 2, {0x0E0D, 0x0E39}, 0, 2, 2, {0xF70F, 0x0E39}},
172 { 2, {0x0E10, 0x0E3A}, 0, 2, 2, {0xF700, 0x0E3A}},
174 //27.TEST C1 - Tone mark/sign above short consonant
175 { 2, {0x0E14, 0x0E48}, 0, 2, 2, {0x0E14, 0xF70A}},
176 { 2, {0x0E16, 0x0E49}, 0, 2, 2, {0x0E16, 0xF70B}},
177 { 2, {0x0E17, 0x0E4A}, 0, 2, 2, {0x0E17, 0xF70C}},
178 { 2, {0x0E19, 0x0E4B}, 0, 2, 2, {0x0E19, 0xF70D}},
179 { 2, {0x0E20, 0x0E4C}, 0, 2, 2, {0x0E20, 0xF70E}},
180 // with lower vowel char in between the two?
181 { 3, {0x0E16, 0x0E39, 0x0E49}, 0, 3, 3, {0x0E16, 0x0E39, 0xF70B}},
183 //33.TEST C2 - Upper Vowel & tone makr/sign above short consonant
184 { 3, {0x0E01, 0x0E34, 0x0E48}, 0, 3, 3, {0x0E01, 0x0E34, 0x0E48}},
185 { 3, {0x0E02, 0x0E35, 0x0E49}, 0, 3, 3, {0x0E02, 0x0E35, 0x0E49}},
186 { 3, {0x0E04, 0x0E36, 0x0E4A}, 0, 3, 3, {0x0E04, 0x0E36, 0x0E4A}},
187 { 3, {0x0E08, 0x0E37, 0x0E4B}, 0, 3, 3, {0x0E08, 0x0E37, 0x0E4B}},
188 { 3, {0x0E09, 0x0E34, 0x0E4C}, 0, 3, 3, {0x0E09, 0x0E34, 0x0E4C}},
189 { 3, {0x0E11, 0x0E47, 0x0E4C}, 0, 2, 2, {0x0E11, 0x0E47}},
191 //39.TEST C2.1 - Lower Vowel & tone makr/sign above short consonant
192 { 3, {0x0E01, 0x0E38, 0x0E48}, 0, 3, 3, {0x0E01, 0x0E38, 0xF70A}},
193 { 3, {0x0E02, 0x0E39, 0x0E49}, 0, 3, 3, {0x0E02, 0x0E39, 0xF70B}},
194 { 3, {0x0E04, 0x0E38, 0x0E4A}, 0, 3, 3, {0x0E04, 0x0E38, 0xF70C}},
195 { 3, {0x0E08, 0x0E39, 0x0E4B}, 0, 3, 3, {0x0E08, 0x0E39, 0xF70D}},
196 { 3, {0x0E09, 0x0E38, 0x0E4C}, 0, 3, 3, {0x0E09, 0x0E38, 0xF70E}},
197 { 3, {0x0E09, 0x0E39, 0x0E4C}, 0, 2, 2, {0x0E09, 0x0E39}},
199 //45.TEST C3 - Left aligned tone mark/sign above tall consonant
200 { 2, {0x0E1B, 0x0E48}, 0, 2, 2, {0x0E1B, 0xF705}},
201 { 2, {0x0E1D, 0x0E49}, 0, 2, 2, {0x0E1D, 0xF706}},
202 { 2, {0x0E1F, 0x0E4A}, 0, 2, 2, {0x0E1F, 0xF707}},
203 { 2, {0x0E2C, 0x0E4B}, 0, 2, 2, {0x0E2C, 0xF708}},
204 { 2, {0x0E1B, 0x0E4C}, 0, 2, 2, {0x0E1B, 0xF709}},
206 //50.TEST C4 - Left aligned vowel & tone mark/sign above tall consonant
207 { 3, {0x0E1B, 0x0E34, 0x0E48}, 0, 3, 3, {0x0E1B, 0xF701, 0xF713}},
208 { 3, {0x0E1D, 0x0E35, 0x0E49}, 0, 3, 3, {0x0E1D, 0xF702, 0xF714}},
209 { 3, {0x0E1F, 0x0E36, 0x0E4A}, 0, 3, 3, {0x0E1F, 0xF703, 0xF715}},
210 { 3, {0x0E2C, 0x0E37, 0x0E4B}, 0, 3, 3, {0x0E2C, 0xF704, 0xF716}},
211 { 3, {0x0E1B, 0x0E34, 0x0E4C}, 0, 3, 3, {0x0E1B, 0xF701, 0xF717}},
213 //55. INC043221 - Tone marks are not readable with tall consonants and Sara Am
214 // Test that the nikhahit part of a sara am causes the same effects as top
216 // Test 4 already does one suitable test.
217 { 3, {0x0E1B, 0x0E49, 0x0E33}, 0, 3, 4, {0x0E1B, 0xF711, 0xF714, 0x0E32}},
219 //56. INC127996 - Tone mark/diacritic displayed incorrectly when combinded
220 // with long tail consonanat and below vowel. Test that in context
221 // 'short consonanat + below vowel + Tone Mark/diacritic', mark/diacritic
222 // can be replaced by corresonding PUA code.
223 { 3, {0x0E0D, 0x0E39, 0x0E49}, 0, 3, 3, {0xF70F, 0x0E39, 0xF70B}},
224 { 3, {0x0E0E, 0x0E38, 0x0E48}, 0, 3, 3, {0x0E0E, 0xF718, 0xF70A}},
225 { 3, {0x0E0F, 0x0E39, 0x0E4A}, 0, 3, 3, {0x0E0F, 0xF719, 0xF70C}},
226 { 3, {0x0E26, 0x0E39, 0x0E4B}, 0, 3, 3, {0x0E26, 0xF719, 0xF70D}},
227 { 3, {0x0E24, 0x0E38, 0x0E49}, 0, 3, 3, {0x0E24, 0xF718, 0xF70B}},
228 { 3, {0x0E10, 0x0E38, 0x0E4C}, 0, 3, 3, {0xF700, 0x0E38, 0xF70E}},
231 { -1, {0}, -1, -1, 0, {0}}
235 Data structure used to hold the in and out data of two invokes
236 of the CFont::GetCharacterPosition() API.
238 struct TTestInput_Invoke
243 TText16 oOutput[CFont::TPositionParam::EMaxOutputGlyphs];
247 Data structure used to hold the in and out data of two invokes
248 of the CFont::GetCharacterPosition() API.
250 struct TTestInput_PositionParam2
254 TTestInput_Invoke oOut[2];
258 Data structure used to hold the in and out data of two invokes
259 of the CFont::GetCharacterPosition() API.
261 struct TTestInput_PositionParam6
265 TTestInput_Invoke oOut[6];
268 // {-1, 1, 1, {0} } } indicate end of sequence
269 // The most significant bit of glyph index is trimmed off when stored
270 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiDigit[] = {
271 { 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
272 { 1, {0x0a67}, { {0, 1, 1, {0x12ff} }, {-1, 1, 1, {0} } } },
273 { 1, {0x0a68}, { {0, 1, 1, {0x1300} }, {-1, 1, 1, {0} } } },
274 { 1, {0x0a69}, { {0, 1, 1, {0x1301} }, {-1, 1, 1, {0} } } },
275 { 1, {0x0a6a}, { {0, 1, 1, {0x1302} }, {-1, 1, 1, {0} } } },
276 { 1, {0x0a6b}, { {0, 1, 1, {0x1303} }, {-1, 1, 1, {0} } } },
277 { 1, {0x0a6c}, { {0, 1, 1, {0x1304} }, {-1, 1, 1, {0} } } },
278 { 1, {0x0a6d}, { {0, 1, 1, {0x1305} }, {-1, 1, 1, {0} } } },
279 { 1, {0x0a6e}, { {0, 1, 1, {0x1306} }, {-1, 1, 1, {0} } } },
280 { 1, {0x0a6f}, { {0, 1, 1, {0x1307} }, {-1, 1, 1, {0} } } },
282 { 2, {0x0a15, 0x0a66}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
283 { 2, {0x0a17, 0x0a67}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
284 { 2, {0x0a19, 0x0a68}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
285 { 2, {0x0a25, 0x0a69}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
286 { 2, {0x0a27, 0x0a6a}, { {0, 1, 1, {0x12df}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
287 { 2, {0x0a28, 0x0a6b}, { {0, 1, 1, {0x12e0}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
288 { 2, {0x0a29, 0x0a6c}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
289 { 2, {0x0a3a, 0x0a6d}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
290 { 2, {0x0a3b, 0x0a6e}, { {0, 1, 1, {0x0000}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
291 { 2, {0x0a3c, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ee}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
293 { 2, {0x0a3e, 0x0a66}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
294 { 2, {0x0a3e, 0x0a67}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
295 { 2, {0x0a3e, 0x0a68}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
296 { 2, {0x0a3e, 0x0a69}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
297 { 2, {0x0a3e, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
298 { 2, {0x0a3e, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
299 { 2, {0x0a3e, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
300 { 2, {0x0a3e, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
301 { 2, {0x0a3e, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
302 { 2, {0x0a3e, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12ef}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
304 { 2, {0x0a73, 0x0a66}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
305 { 2, {0x0a73, 0x0a67}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
306 { 2, {0x0a73, 0x0a68}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
307 { 2, {0x0a73, 0x0a69}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
308 { 2, {0x0a73, 0x0a6a}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
309 { 2, {0x0a73, 0x0a6b}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
310 { 2, {0x0a73, 0x0a6c}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
311 { 2, {0x0a73, 0x0a6d}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
312 { 2, {0x0a73, 0x0a6e}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
313 { 2, {0x0a73, 0x0a6f}, { {0, 1, 1, {0x130b}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
315 { 2, {0x0a4d, 0x0a66}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12fe}}, {-1, 1, 1, {0} } } },
316 { 2, {0x0a4d, 0x0a67}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x12ff}}, {-1, 1, 1, {0} } } },
317 { 2, {0x0a4d, 0x0a68}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1300}}, {-1, 1, 1, {0} } } },
318 { 2, {0x0a4d, 0x0a69}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1301}}, {-1, 1, 1, {0} } } },
319 { 2, {0x0a4d, 0x0a6a}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1302}}, {-1, 1, 1, {0} } } },
320 { 2, {0x0a4d, 0x0a6b}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1303}}, {-1, 1, 1, {0} } } },
321 { 2, {0x0a4d, 0x0a6c}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1304}}, {-1, 1, 1, {0} } } },
322 { 2, {0x0a4d, 0x0a6d}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1305}}, {-1, 1, 1, {0} } } },
323 { 2, {0x0a4d, 0x0a6e}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1306}}, {-1, 1, 1, {0} } } },
324 { 2, {0x0a4d, 0x0a6f}, { {0, 1, 2, {0x058f, 0x12f8}}, {1, 2, 1, {0x1307}}, {-1, 1, 1, {0} } } },
325 // Consonant + digit + Matra
326 { 3, {0x0a15, 0x0a66, 0x0a3e}, { {0, 1, 1, {0x12cd}}, {1, 2, 1, {0x12fe}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
327 { 3, {0x0a16, 0x0a67, 0x0a3e}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x12ff}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
328 { 3, {0x0a17, 0x0a68, 0x0a3e}, { {0, 1, 1, {0x12cf}}, {1, 2, 1, {0x1300}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
329 { 3, {0x0a18, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x12d0}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
330 { 3, {0x0a19, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x12d1}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
331 { 3, {0x0a25, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x12dd}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
332 { 3, {0x0a2a, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x12e1}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
333 { 3, {0x0a2d, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x12e4}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
334 { 3, {0x0a30, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x12e7}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
335 { 3, {0x0a33, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x12e9}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
336 { -1, {0}, -1, -1, 0, {0}}
340 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamDigit[] = {
341 { 1, {0x0d66}, { {0, 1, 1, {0x123e} }, {-1, 1, 1, {0} } } },
342 { 1, {0x0d67}, { {0, 1, 1, {0x123f} }, {-1, 1, 1, {0} } } },
343 { 1, {0x0d68}, { {0, 1, 1, {0x1240} }, {-1, 1, 1, {0} } } },
344 { 1, {0x0d69}, { {0, 1, 1, {0x1241} }, {-1, 1, 1, {0} } } },
345 { 1, {0x0d6a}, { {0, 1, 1, {0x1242} }, {-1, 1, 1, {0} } } },
346 { 1, {0x0d6b}, { {0, 1, 1, {0x1243} }, {-1, 1, 1, {0} } } },
347 { 1, {0x0d6c}, { {0, 1, 1, {0x1244} }, {-1, 1, 1, {0} } } },
348 { 1, {0x0d6d}, { {0, 1, 1, {0x1245} }, {-1, 1, 1, {0} } } },
349 { 1, {0x0d6e}, { {0, 1, 1, {0x1246} }, {-1, 1, 1, {0} } } },
350 { 1, {0x0d6f}, { {0, 1, 1, {0x1247} }, {-1, 1, 1, {0} } } },
352 { 2, {0x0d15, 0x0d66}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} } } },
353 { 2, {0x0d15, 0x0d67}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} } } },
354 { 2, {0x0d17, 0x0d68}, { {0, 1, 1, {0x120c}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} } } },
355 { 2, {0x0d19, 0x0d69}, { {0, 1, 1, {0x120e}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} } } },
356 { 2, {0x0d25, 0x0d6a}, { {0, 1, 1, {0x121a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} } } },
357 { 2, {0x0d26, 0x0d6b}, { {0, 1, 1, {0x121b}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} } } },
358 { 2, {0x0d15, 0x0d6c}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} } } },
359 { 2, {0x0d30, 0x0d6d}, { {0, 1, 1, {0x1224}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} } } },
360 { 2, {0x0d31, 0x0d6e}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} } } },
361 { 2, {0x0d32, 0x0d6f}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} } } },
363 { 2, {0x0d03, 0x0d66}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} } } },
364 { 2, {0x0d03, 0x0d67}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} } } },
365 { 2, {0x0d03, 0x0d68}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} } } },
366 { 2, {0x0d03, 0x0d69}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} } } },
367 { 2, {0x0d03, 0x0d6a}, { {0, 1, 2, {0x058f, 0x11fb}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} } } },
368 { 2, {0x0d02, 0x0d6b}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} } } },
369 { 2, {0x0d02, 0x0d6c}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} } } },
370 { 2, {0x0d02, 0x0d6d}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} } } },
371 { 2, {0x0d02, 0x0d6e}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} } } },
372 { 2, {0x0d02, 0x0d6f}, { {0, 1, 2, {0x058f, 0x11fa}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} } } },
374 { 2, {0x0d3e, 0x0d66}, { {0, 1, 2, {0x058f, 0x122e}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} } } },
375 { 2, {0x0d3f, 0x0d67}, { {0, 1, 2, {0x058f, 0x122f}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} } } },
376 { 2, {0x0d40, 0x0d68}, { {0, 1, 2, {0x058f, 0x1230}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} } } },
377 { 2, {0x0d41, 0x0d69}, { {0, 1, 2, {0x058f, 0x1231}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} } } },
378 { 2, {0x0d42, 0x0d6a}, { {0, 1, 2, {0x058f, 0x1232}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} } } },
379 { 2, {0x0d43, 0x0d6b}, { {0, 1, 2, {0x058f, 0x1233}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} } } },
380 { 2, {0x0d46, 0x0d6c}, { {0, 1, 2, {0x1234, 0x058f}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} } } },
381 { 2, {0x0d47, 0x0d6d}, { {0, 1, 2, {0x1235, 0x058f}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} } } },
382 { 2, {0x0d48, 0x0d6e}, { {0, 1, 2, {0x1236, 0x058f}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} } } },
383 { 2, {0x0d4c, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123b}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} } } },
385 { 2, {0x0d4d, 0x0d66}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123e}}, {-1, 1, 1, {0} } } },
386 { 2, {0x0d4d, 0x0d67}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x123f}}, {-1, 1, 1, {0} } } },
387 { 2, {0x0d4d, 0x0d68}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1240}}, {-1, 1, 1, {0} } } },
388 { 2, {0x0d4d, 0x0d69}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1241}}, {-1, 1, 1, {0} } } },
389 { 2, {0x0d4d, 0x0d6a}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1242}}, {-1, 1, 1, {0} } } },
390 { 2, {0x0d4d, 0x0d6b}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1243}}, {-1, 1, 1, {0} } } },
391 { 2, {0x0d4d, 0x0d6c}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1244}}, {-1, 1, 1, {0} } } },
392 { 2, {0x0d4d, 0x0d6d}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1245}}, {-1, 1, 1, {0} } } },
393 { 2, {0x0d4d, 0x0d6e}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1246}}, {-1, 1, 1, {0} } } },
394 { 2, {0x0d4d, 0x0d6f}, { {0, 1, 2, {0x058f, 0x123a}}, {1, 2, 1, {0x1247}}, {-1, 1, 1, {0} } } },
395 // Consonant + digit + Matra
396 { 3, {0x0d15, 0x0d66, 0x0d3e}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x123e}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
397 { 3, {0x0d20, 0x0d67, 0x0d3f}, { {0, 1, 1, {0x1215}}, {1, 2, 1, {0x123f}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
398 { 3, {0x0d22, 0x0d68, 0x0d40}, { {0, 1, 1, {0x1217}}, {1, 2, 1, {0x1240}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
399 { 3, {0x0d27, 0x0d69, 0x0d41}, { {0, 1, 1, {0x121c}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
400 { 3, {0x0d28, 0x0d6a, 0x0d42}, { {0, 1, 1, {0x121d}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
401 { 3, {0x0d2A, 0x0d6b, 0x0d43}, { {0, 1, 1, {0x121e}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
402 { 3, {0x0d2D, 0x0d6c, 0x0d46}, { {0, 1, 1, {0x1221}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
403 { 3, {0x0d32, 0x0d6d, 0x0d47}, { {0, 1, 1, {0x1226}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
404 { 3, {0x0d34, 0x0d6e, 0x0d48}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
405 { 3, {0x0d39, 0x0d6f, 0x0d4a}, { {0, 1, 1, {0x122d}}, {1, 2, 1, {0x1247}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
406 { -1, {0}, -1, -1, 0, {0}}
409 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiAndLatin[] = {
410 // Gurmukhi sequence + Latin
411 { 3, {0x0a05, 0x0a70, 0x0077}, { {0, 2, 2, {0x12c3, 0x1308}}, {1, 2, 1, {0x1308}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} } } },
412 // Latin + Gurmukhi sequence
413 { 3, {0x0063, 0x0a19, 0x0a48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x12d1, 0x12f5}}, {2, 3, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
414 { 3, {0x0064, 0x0a3f, 0x0a71}, { {0, 1, 1, {0x0064}}, {1, 2, 2, {0x12f0, 0x058f}}, {2, 3, 2, {0x058f, 0x1309}}, {-1, 1, 1, {0} } } },
415 { 3, {0x0066, 0x0a69, 0x0a3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1301}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
416 { 3, {0x0068, 0x0a6a, 0x0a3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1302}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
417 { 3, {0x002e, 0x0a6b, 0x0a3e}, { {0, 1, 1, {0x0772}}, {1, 2, 1, {0x1303}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
418 { 3, {0x0074, 0x0a6c, 0x0a3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1304}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
419 { 3, {0x002c, 0x0a6d, 0x0a3e}, { {0, 1, 1, {0x0770}}, {1, 2, 1, {0x1305}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
420 { 3, {0x0078, 0x0a6e, 0x0a3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1306}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
421 { 3, {0x007a, 0x0a6f, 0x0a3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1307}}, {2, 3, 2, {0x058f, 0x12ef}}, {-1, 1, 1, {0} } } },
422 { 3, {0x0a6f, 0x0a3e, 0x0078}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0078}}, {-1, 1, 1, {0} } } },
423 { 3, {0x0a6f, 0x0a3e, 0x002e}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0772}}, {-1, 1, 1, {0} } } },
424 { 3, {0x0a6f, 0x0a3e, 0x0066}, { {0, 1, 1, {0x1307}}, {1, 2, 2, {0x058f, 0x12ef}}, {2, 3, 1, {0x0066}}, {-1, 1, 1, {0} } } },
425 { -1, {0}, -1, -1, 0, {0}}
429 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamAndLatin[] = {
430 // Malayalam sequence + Latin
431 //{ 3, {0x0d05, 0x0d70, 0x0077}, { {0, 1, 1, {0x11fc}}, {1, 2, 1, {0x0000}}, {2, 3, 1, {0x0077}}, {-1, 1, 1, {0} } } },
432 // Latin + Malayalam sequence
433 { 3, {0x0063, 0x0d19, 0x0d48}, { {0, 1, 1, {0x0063}}, {1, 3, 2, {0x1236, 0x120e}}, {2, 3, 1, {0x1236}}, {-1, 1, 1, {0} } } },
434 { 3, {0x0066, 0x0d69, 0x0d3e}, { {0, 1, 1, {0x0066}}, {1, 2, 1, {0x1241}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
435 { 3, {0x0068, 0x0d6a, 0x0d3e}, { {0, 1, 1, {0x0068}}, {1, 2, 1, {0x1242}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
436 { 3, {0x002e, 0x0d6b, 0x0d3e}, { {0, 1, 1, {0x0c87}}, {1, 2, 1, {0x1243}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
437 { 3, {0x0074, 0x0d6c, 0x0d3e}, { {0, 1, 1, {0x0074}}, {1, 2, 1, {0x1244}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
438 { 3, {0x002c, 0x0d6d, 0x0d3e}, { {0, 1, 1, {0x0c85}}, {1, 2, 1, {0x1245}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
439 { 3, {0x0078, 0x0d6e, 0x0d3e}, { {0, 1, 1, {0x0078}}, {1, 2, 1, {0x1246}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
440 { 3, {0x007a, 0x0d6f, 0x0d3e}, { {0, 1, 1, {0x007a}}, {1, 2, 1, {0x1247}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
441 { -1, {0}, -1, -1, 0, {0}}
445 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiModifierAfterConsonantViramaZWJ[] = {
446 // Consonant + Virama + ZWJ + Modifier
447 { 4, {0x0a15, 0x0a4d, 0x200d, 0x0A01}, { {0, 4, 2, {0x1335, 0x12c0}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c0}}, {3, 4, 1, {0x12c0}}, {-1, 1, 1, {0} } } },
448 { 4, {0x0a16, 0x0a4d, 0x200d, 0x0A02}, { {0, 4, 2, {0x1336, 0x12c1}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c1}}, {3, 4, 1, {0x12c1}}, {-1, 1, 1, {0} } } },
449 { 4, {0x0a17, 0x0a4d, 0x200d, 0x0A03}, { {0, 4, 2, {0x1337, 0x12c2}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x12c2}}, {3, 4, 1, {0x12c2}}, {-1, 1, 1, {0} } } },
450 { 4, {0x0a18, 0x0a4d, 0x200d, 0x0A70}, { {0, 4, 2, {0x1338, 0x1308}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x1308}}, {3, 4, 1, {0x1308}}, {-1, 1, 1, {0} } } },
451 { -1, {0}, -1, -1, 0, {0}}
455 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamModifierAfterConsonantViramaZWJ[] = {
456 // Consonant + Virama + ZWJ + Modifier
457 { 4, {0x0d15, 0x0d4d, 0x200d, 0x0d02}, { {0, 4, 2, {0x1248, 0x11fa}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
458 { 4, {0x0d25, 0x0d4d, 0x200d, 0x0d02}, { {0, 4, 2, {0x1258, 0x11fa}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
459 { 4, {0x0d33, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
460 { 4, {0x0d34, 0x0d4d, 0x200d, 0x0d03}, { {0, 4, 2, {0x1266, 0x11fb}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
461 { -1, {0}, -1, -1, 0, {0}}
464 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiConsonantLeading[] = {
466 { 2, {0x0a17, 0x0A3C}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
467 // Consonant + dependent vowel, two sequences to check context shaping
468 { 2, {0x0a15, 0x0A4C}, { {0, 2, 2, {0x12cd, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
469 { 2, {0x0a16, 0x0A4C}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
470 // Consonant + Matra /i/, and other Matras
471 { 2, {0x0a16, 0x0A3f}, { {0, 2, 2, {0x12f0, 0x12ce}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
472 { 2, {0x0a16, 0x0A3e}, { {0, 2, 2, {0x12ce, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
473 { 2, {0x0a16, 0x0A40}, { {0, 2, 2, {0x12ce, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
474 { 2, {0x0a16, 0x0A41}, { {0, 2, 2, {0x12ce, 0x12f2}}, {1, 2, 1, {0x12f2}}, {-1, 1, 1, {0} } } },
475 { 2, {0x0a16, 0x0A42}, { {0, 2, 2, {0x12ce, 0x12f3}}, {1, 2, 1, {0x12f3}}, {-1, 1, 1, {0} } } },
476 { 2, {0x0a16, 0x0A43}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
477 { 2, {0x0a16, 0x0A44}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
478 { 2, {0x0a16, 0x0A45}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
479 { 2, {0x0a16, 0x0A46}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
480 { 2, {0x0a16, 0x0A47}, { {0, 2, 2, {0x12ce, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
481 { 2, {0x0a16, 0x0A48}, { {0, 2, 2, {0x12ce, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
482 { 2, {0x0a16, 0x0A49}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
483 { 2, {0x0a16, 0x0A4a}, { {0, 1, 1, {0x12ce}}, {1, 2, 1, {0x0000}}, {-1, 1, 1, {0} } } },
484 { 2, {0x0a16, 0x0A4b}, { {0, 2, 2, {0x12ce, 0x12f6}}, {1, 2, 1, {0x12f6}}, {-1, 1, 1, {0} } } },
485 { 2, {0x0a16, 0x0A4c}, { {0, 2, 2, {0x12ce, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
487 //0d28 + 0d4d + //0d24 + 0d4d + 0d30
488 //0d38 + 0d4d + //0d15 + 0d4d + 0d30
489 // Consonant + Virama + HA(RA/VA/YA)
490 { 3, {0x0a15, 0x0a4d, 0x0a39}, { {0, 3, 2, {0x12cd, 0x1331}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1331}}, {-1, 1, 1, {0} } } },
491 { 3, {0x0a15, 0x0a4d, 0x0a30}, { {0, 3, 1, {0x13e7}}, {-1, 1, 1, {0} } } },
492 { 3, {0x0a15, 0x0a4d, 0x0a35}, { {0, 3, 2, {0x1399, 0x1333}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1333}}, {-1, 1, 1, {0} } } },
493 { 3, {0x0a15, 0x0a4d, 0x0a2f}, { {0, 3, 2, {0x12cd, 0x1373}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1373}}, {-1, 1, 1, {0} } } },
495 { 2, {0x0a16, 0x0A71}, { {0, 2, 2, {0x12ce, 0x1309}}, {1, 2, 1, {0x1309}}, {-1, 1, 1, {0} } } },
497 { 2, {0x0a16, 0x0A02}, { {0, 2, 2, {0x12ce, 0x12c1}}, {1, 2, 1, {0x12c1}}, {-1, 1, 1, {0} } } },
498 { 3, {0x0a16, 0x0a40, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f0}}, {1, 2, 1, {0x13f0}}, {-1, 1, 1, {0} } } },
499 { 3, {0x0a16, 0x0a4b, 0x0A02}, { {0, 3, 2, {0x12ce, 0x13f3}}, {1, 2, 1, {0x13f3}}, {-1, 1, 1, {0} } } },
501 { 2, {0x0a25, 0x0A70}, { {0, 2, 2, {0x12dd, 0x1308}}, {1, 2, 1, {0x1308}}, {-1, 1, 1, {0} } } },
502 { 3, {0x0a25, 0x0a3f, 0x0A70}, { {0, 3, 3, {0x12f0, 0x12dd, 0x1308}}, {1, 2, 1, {0x12f0}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
503 { 3, {0x0a25, 0x0a41, 0x0A70}, { {0, 3, 3, {0x12dd, 0x12f2, 0x1308}}, {1, 2, 1, {0x12f2}}, {2, 3, 1, {0x1308}}, {-1, 1, 1, {0} } } },
504 // Nukta, corresponding consonant, Nukta pair
505 { 1, {0x0a33}, { {0, 1, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
506 { 2, {0x0a32, 0x0A3c}, { {0, 2, 1, {0x12e9}}, {-1, 1, 1, {0} } } },
507 { 1, {0x0a36}, { {0, 1, 1, {0x12eb}},{-1, 1, 1, {0} } } },
508 { 2, {0x0a38, 0x0A3c}, { {0, 2, 1, {0x12eb}}, {-1, 1, 1, {0} } } },
509 { 1, {0x0a59}, { {0, 1, 1, {0x12f9}}, {-1, 1, 1, {0} } } },
510 { 2, {0x0aa1, 0x0A3c}, { {0, 1, 1, {0x096e}}, {1, 2, 2, {0x058f, 0x12ee}}, {-1, 1, 1, {0} } } },
511 { 1, {0x0a5a}, { {0, 1, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
512 { 2, {0x0a17, 0x0A3c}, { {0, 2, 1, {0x12fa}}, {-1, 1, 1, {0} } } },
513 { 1, {0x0a5b}, { {0, 1, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
514 { 2, {0x0a1c, 0x0A3c}, { {0, 2, 1, {0x12fb}}, {-1, 1, 1, {0} } } },
515 { 1, {0x0a5e}, { {0, 1, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
516 { 2, {0x0a2b, 0x0A3c}, { {0, 2, 1, {0x12fd}}, {-1, 1, 1, {0} } } },
517 { -1, {0}, -1, -1, 0, {0}}
522 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamConsonantLeading[] = {
523 // Consonant, and its split representation
524 { 2, {0x0d15, 0x0d14}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1209}}, {-1, 1, 1, {0} } } },
525 { 3, {0x0d15, 0x0d12, 0x0d57}, { {0, 1, 1, {0x120a}}, {1, 3, 3, {0x1207, 0x058f, 0x123b}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
527 { 2, {0x0d15, 0x0d4a}, { {0, 2, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} } } },
528 { 3, {0x0d15, 0x0d46, 0x0d3e}, { {0, 3, 3, {0x1234, 0x120a, 0x122e}}, {1, 2, 1, {0x1234}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} } } },
530 { 2, {0x0d17, 0x0d4b}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} } } },
531 { 3, {0x0d17, 0x0d47, 0x0d3e}, { {0, 3, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 1, {0x1235}}, {2, 3, 1, {0x122e}}, {-1, 1, 1, {0} } } },
533 { 2, {0x0d19, 0x0d4c}, { {0, 2, 2, {0x120e, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} } } },
534 { 3, {0x0d19, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120e, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} } } },
536 // Consonant + dependent vowel, two sequences to check context shaping
537 { 2, {0x0d15, 0x0d0a}, { {0, 1, 1, {0x120a}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} } } },
538 { 2, {0x0d16, 0x0d0a}, { {0, 1, 1, {0x120b}}, {1, 2, 1, {0x1201}}, {-1, 1, 1, {0} } } },
540 // Consonant + Matra /-e/, /-ee/, /-ai/
541 { 2, {0x0d16, 0x0d46}, { {0, 2, 2, {0x1234, 0x120b}}, {1, 2, 1, {0x1234}}, {-1, 1, 1, {0} } } },
542 { 2, {0x0d17, 0x0d47}, { {0, 2, 2, {0x1235, 0x120c}}, {1, 2, 1, {0x1235}}, {-1, 1, 1, {0} } } },
543 { 2, {0x0d18, 0x0d48}, { {0, 2, 2, {0x1236, 0x120d}}, {1, 2, 1, {0x1236}}, {-1, 1, 1, {0} } } },
545 // Consonant and Matras /-o/, /-oo/, /-au/ to shaper
546 // Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
547 // Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
548 { 2, {0x0d16, 0x0d4A}, { {0, 2, 3, {0x1234, 0x120b, 0x122e}}, {1, 2, 2, {0x1234, 0x122e}}, {-1, 1, 1, {0} } } },
549 { 2, {0x0d17, 0x0d4B}, { {0, 2, 3, {0x1235, 0x120c, 0x122e}}, {1, 2, 2, {0x1235, 0x122e}}, {-1, 1, 1, {0} } } },
550 { 2, {0x0d18, 0x0d4C}, { {0, 2, 2, {0x120d, 0x123b}}, {1, 2, 1, {0x123b}}, {-1, 1, 1, {0} } } },
551 { 3, {0x0d15, 0x0d46, 0x0d57}, { {0, 3, 2, {0x120a, 0x123b}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x123b}}, {-1, 1, 1, {0} } } },
553 // Consonant + 0x0d4d + Consonant
554 { 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
555 { 4, {0x0d31, 0x0d4d, 0x0d31, 0x0d4d}, { {0, 4, 2, {0x12a7, 0x123a}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x123a}}, {3, 4, 1, {0x123a}}, {-1, 1, 1, {0} } } },
557 // Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
558 // KA + Virama + ZWJ to shaper.
559 // other Consonant + Virama + ZWJ to shaper.
560 { 3, {0x0d23, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1272}}, {-1, 1, 1, {0} } } },
561 { 3, {0x0d28, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1273}}, {-1, 1, 1, {0} } } },
562 { 3, {0x0d32, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1276}}, {-1, 1, 1, {0} } } },
563 { 3, {0x0d33, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1275}}, {-1, 1, 1, {0} } } },
564 { 3, {0x0d15, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1248}}, {-1, 1, 1, {0} } } },
565 { 3, {0x0d16, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1249}}, {-1, 1, 1, {0} } } },
567 // RA + Virama + ZWJ to shaper,
568 // RRA + Viram + ZWJ to shaper.
569 { 3, {0x0d30, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1274}}, {-1, 1, 1, {0} } } },
570 { 3, {0x0d31, 0x0d4d, 0x200d}, { {0, 3, 1, {0x1263}}, {-1, 1, 1, {0} } } },
572 // Chillu and Modifier to shaper
573 // Chillu and Virama to shaper
574 { 4, {0x0d31, 0x0d4d, 0x200d, 0x0d05}, { {0, 3, 1, {0x1263}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x11fc}}, {-1, 1, 1, {0} } } },
575 { 4, {0x0d15, 0x0d4d, 0x200d, 0x0d14}, { {0, 3, 1, {0x1248}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1209}}, {-1, 1, 1, {0} } } },
576 { 4, {0x0d31, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1263}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
577 { 4, {0x0d15, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1248}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
580 { 3, {0x0d06, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
581 { 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
583 // K.KA, K.TA, K.SSA, G.NA, G.MA,
584 // NG.KA, NG.NGA, J.JA, J.NYA, NY.NYA, TT.TTA, NN.MA, T.BHA, T.MA,
585 // T.SA, D.DA, D.DHA,
586 // N.TA, N.DA, N.DHA, N.NA,
589 // H.NA, H.MA and LL.LLA
590 { 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
591 { 3, {0x0d15, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x1278}}, {-1, 1, 1, {0} } } },
592 { 3, {0x0d15, 0x0d4d, 0x0d37}, { {0, 3, 1, {0x127b}}, {-1, 1, 1, {0} } } },
593 { 3, {0x0d17, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x127e}}, {-1, 1, 1, {0} } } },
594 { 3, {0x0d17, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x127d}}, {-1, 1, 1, {0} } } },
595 { 3, {0x0d19, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1280}}, {-1, 1, 1, {0} } } },
596 { 3, {0x0d19, 0x0d4d, 0x0d19}, { {0, 3, 1, {0x1281}}, {-1, 1, 1, {0} } } },
597 { 3, {0x0d1c, 0x0d4d, 0x0d1c}, { {0, 3, 1, {0x1284}}, {-1, 1, 1, {0} } } },
598 { 3, {0x0d1c, 0x0d4d, 0x0d1e}, { {0, 3, 1, {0x1285}}, {-1, 1, 1, {0} } } },
599 { 3, {0x0d1f, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1288}}, {-1, 1, 1, {0} } } },
600 { 3, {0x0d23, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128b}}, {-1, 1, 1, {0} } } },
601 { 3, {0x0d24, 0x0d4d, 0x0d2d}, { {0, 3, 1, {0x128e}}, {-1, 1, 1, {0} } } },
602 { 3, {0x0d24, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x128f}}, {-1, 1, 1, {0} } } },
603 { 3, {0x0d24, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x1290}}, {-1, 1, 1, {0} } } },
604 { 3, {0x0d26, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1293}}, {-1, 1, 1, {0} } } },
605 { 3, {0x0d26, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1294}}, {-1, 1, 1, {0} } } },
606 { 3, {0x0d28, 0x0d4d, 0x0d24}, { {0, 3, 1, {0x129a}}, {-1, 1, 1, {0} } } },
607 { 3, {0x0d28, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x1295}}, {-1, 1, 1, {0} } } },
608 { 3, {0x0d28, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x1296}}, {-1, 1, 1, {0} } } },
609 { 3, {0x0d28, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x1297}}, {-1, 1, 1, {0} } } },
610 { 3, {0x0d2e, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x12a4}}, {-1, 1, 1, {0} } } },
611 { 3, {0x0d2e, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12a3}}, {-1, 1, 1, {0} } } },
612 { 3, {0x0d36, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x12ab}}, {-1, 1, 1, {0} } } },
613 { 3, {0x0d38, 0x0d4d, 0x0d25}, { {0, 3, 1, {0x12b1}}, {-1, 1, 1, {0} } } },
614 { 3, {0x0d39, 0x0d4d, 0x0d28}, { {0, 3, 1, {0x12b4}}, {-1, 1, 1, {0} } } },
615 { 3, {0x0d39, 0x0d4d, 0x0d2e}, { {0, 3, 1, {0x12b3}}, {-1, 1, 1, {0} } } },
616 { 3, {0x0d33, 0x0d4d, 0x0d23}, { {0, 3, 2, {0x1265, 0x1218}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1218}}, {-1, 1, 1, {0} } } },
618 // One of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
619 { 3, {0x0d15, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127a}}, {-1, 1, 1, {0} } } },
620 { 3, {0x0d17, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x127f}}, {-1, 1, 1, {0} } } },
621 { 3, {0x0d2a, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x129d}}, {-1, 1, 1, {0} } } },
622 { 3, {0x0d2c, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a2}}, {-1, 1, 1, {0} } } },
623 { 3, {0x0d2e, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a5}}, {-1, 1, 1, {0} } } },
624 { 3, {0x0d32, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12a8}}, {-1, 1, 1, {0} } } },
625 { 3, {0x0d36, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12ad}}, {-1, 1, 1, {0} } } },
626 { 3, {0x0d38, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b2}}, {-1, 1, 1, {0} } } },
627 { 3, {0x0d39, 0x0d4d, 0x0d32}, { {0, 3, 1, {0x12b5}}, {-1, 1, 1, {0} } } },
629 // CA, Virama and CA to shaper
630 // BA, Virama and BA to shaper
631 // YA, Virama and YA to shaper
632 // VA, Virama and VA to shaper
633 // other Consonant, Virama and the same Consonant to shaper.
634 { 3, {0x0d1a, 0x0d4d, 0x0d1a}, { {0, 3, 1, {0x1282}}, {-1, 1, 1, {0} } } },
635 { 3, {0x0d2c, 0x0d4d, 0x0d2c}, { {0, 3, 1, {0x129f}}, {-1, 1, 1, {0} } } },
636 { 3, {0x0d2f, 0x0d4d, 0x0d2f}, { {0, 3, 1, {0x12a6}}, {-1, 1, 1, {0} } } },
637 { 3, {0x0d35, 0x0d4d, 0x0d35}, { {0, 3, 1, {0x12aa}}, {-1, 1, 1, {0} } } },
638 { 3, {0x0d15, 0x0d4d, 0x0d15}, { {0, 3, 1, {0x1277}}, {-1, 1, 1, {0} } } },
640 // G.GA, C.CHA, K.TTA, SS.TTA, DD.DDA, NN.NNA, B.DA, B.DHA, P.PA, RR.RRA, SH.SHA, S.SA clusters to shaper
641 { 3, {0x0d17, 0x0d4d, 0x0d17}, { {0, 3, 1, {0x127c}}, {-1, 1, 1, {0} } } },
642 { 3, {0x0d2c, 0x0d4d, 0x0d26}, { {0, 3, 1, {0x12a0}}, {-1, 1, 1, {0} } } },
643 { 3, {0x0d1a, 0x0d4d, 0x0d1b}, { {0, 3, 1, {0x1283}}, {-1, 1, 1, {0} } } },
644 { 3, {0x0d2c, 0x0d4d, 0x0d27}, { {0, 3, 1, {0x12a1}}, {-1, 1, 1, {0} } } },
645 { 3, {0x0d15, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x1279}}, {-1, 1, 1, {0} } } },
646 { 3, {0x0d2a, 0x0d4d, 0x0d2a}, { {0, 3, 1, {0x129c}}, {-1, 1, 1, {0} } } },
647 { 3, {0x0d37, 0x0d4d, 0x0d1f}, { {0, 3, 1, {0x12ae}}, {-1, 1, 1, {0} } } },
648 { 3, {0x0d31, 0x0d4d, 0x0d31}, { {0, 3, 1, {0x12a7}}, {-1, 1, 1, {0} } } },
649 { 3, {0x0d21, 0x0d4d, 0x0d21}, { {0, 3, 1, {0x1289}}, {-1, 1, 1, {0} } } },
650 { 3, {0x0d36, 0x0d4d, 0x0d36}, { {0, 3, 1, {0x12ac}}, {-1, 1, 1, {0} } } },
651 { 3, {0x0d23, 0x0d4d, 0x0d23}, { {0, 3, 1, {0x128c}}, {-1, 1, 1, {0} } } },
652 { 3, {0x0d38, 0x0d4d, 0x0d38}, { {0, 3, 1, {0x12b0}}, {-1, 1, 1, {0} } } },
655 // Consonant clusters from REQ1.3.11 to shaper.
656 // Already covered in other sequence
657 // S.RR.RRA to shaper,
658 // N.RR.RRA to shaper
659 { 5, {0x0d38, 0x0d4d, 0x0d31, 0x0d4d, 0x0d31}, { {0, 5, 1, {0x12af}}, {-1, 1, 1, {0} } } },
660 { 4, {0x0d28, 0x0d4d, 0x0d31, 0x0d31}, { {0, 3, 2, {0x125b, 0x1225}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1225}}, {3, 4, 1, {0x1225}}, {-1, 1, 1, {0} } } },
663 { 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
665 // NA, Virama, ZWJ, RRA to shaper
666 // NA, Virama, ZWJ, ZWNJ, RRA to shaper
667 { 4, {0x0d28, 0x0d4d, 0x200d, 0x0d31}, { {0, 4, 1, {0x1299}}, {-1, 1, 1, {0} } } },
668 { 5, {0x0d28, 0x0d4d, 0x200d, 0x200c, 0x0d31}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1225}}, {-1, 1, 1, {0} } } },
670 // Consonant cluster and YA to shaper
671 // Consonant cluster and VA to shaper
672 { 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d3f}, { {0, 4, 3, {0x1271, 0x120a, 0x122f}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x1271, 0x122f}}, {3, 4, 1, {0x122f}}, {-1, 1, 1, {0} } } },
673 { 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d35}, { {0, 3, 2, {0x1271, 0x120a}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1271}}, {3, 4, 1, {0x1229}}, {-1, 1, 1, {0} } } },
675 // YA, YAKAR to shaper
676 // VA, VAKAR to shaper
677 { 3, {0x0d15, 0x0d4d, 0x0d2f}, { {0, 3, 2, {0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x126f}}, {-1, 1, 1, {0} } } },
678 { 3, {0x0d15, 0x0d4d, 0x0d35}, { {0, 3, 2, {0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1270}}, {-1, 1, 1, {0} } } },
679 { 5, {0x0d15, 0x0d4d, 0x0d30, 0x0d4d, 0x0d2f}, { {0, 5, 3, {0x1271, 0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x126f}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x126f}}, {-1, 1, 1, {0} } } },
680 { 5, {0x0d15, 0x0d4d, 0x0d30, 0x0d4d, 0x0d35}, { {0, 5, 3, {0x1271, 0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1270}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1270}}, {-1, 1, 1, {0} } } },
681 { 5, {0x0d15, 0x0d4d, 0x0d2f, 0x0d4d, 0x0d30}, { {0, 5, 3, {0x1248, 0x1271, 0x1223}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1223}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1271}}, {-1, 1, 1, {0} } } },
682 { 5, {0x0d15, 0x0d4d, 0x0d35, 0x0d4d, 0x0d30}, { {0, 5, 3, {0x1248, 0x1271, 0x1229}}, {1, 2, 0, {0x0000}}, {2, 5, 2, {0x1271, 0x1229}}, {3, 4, 0, {0x0000}}, {4, 5, 1, {0x1271}}, {-1, 1, 1, {0} } } },
684 // one of (LLA, LLLA, RRA) and YA to shaper
685 // one of (LLA, LLLA, RRA) and VA to shaper
686 { 2, {0x0d33, 0x0d2f}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
687 { 2, {0x0d34, 0x0d2f}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
688 { 2, {0x0d31, 0x0d2f}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1223}}, {-1, 1, 1, {0} } } },
689 { 2, {0x0d33, 0x0d35}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
690 { 2, {0x0d34, 0x0d35}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
691 { 2, {0x0d31, 0x0d35}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1229}}, {-1, 1, 1, {0} } } },
694 // Consonant cluster and RA to shaper
695 { 4, {0x0d15, 0x0d4d, 0x0d30, 0x0d30}, { {0, 3, 2, {0x1271, 0x120a}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1271}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
697 // one of (LLA, LLLA, RRA) and RA to shaper
698 { 2, {0x0d33, 0x0d30}, { {0, 1, 1, {0x1227}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
699 { 2, {0x0d34, 0x0d30}, { {0, 1, 1, {0x1228}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
700 { 2, {0x0d31, 0x0d30}, { {0, 1, 1, {0x1225}}, {1, 2, 1, {0x1224}}, {-1, 1, 1, {0} } } },
702 // YAKAR/VAKAR and RA to shaper.
703 { 4, {0x0d15, 0x0d4d, 0x0d2f, 0x0d30}, { {0, 3, 2, {0x120a, 0x126f}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x126f}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
704 { 4, {0x0d15, 0x0d4d, 0x0d35, 0x0d30}, { {0, 3, 2, {0x120a, 0x1270}}, {1, 2, 0, {0x0000}}, {2, 3, 1, {0x1270}}, {3, 4, 1, {0x1224}}, {-1, 1, 1, {0} } } },
707 // Chillu and Vowel to shaper
708 // Chillu and Consonant to shaper
709 // Chillu and Modifier to shaper
710 // Chillu and Virama to shaper
711 { 4, {0x0d06, 0x0d23, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1272}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
712 { 4, {0x0d06, 0x0d28, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1273}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
713 { 4, {0x0d06, 0x0d30, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1274}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
714 { 4, {0x0d06, 0x0d32, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1276}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
715 { 4, {0x0d06, 0x0d33, 0x0d4d, 0x200d}, { {0, 1, 1, {0x11fd}}, {1, 4, 1, {0x1275}}, {2, 3, 0, {0x058f, 0x123a}}, {3, 4, 0, {0x0d30}}, {-1, 1, 1, {0} } } },
717 { 4, {0x0d23, 0x0d4d, 0x200d, 0x0d06}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x11fd}}, {-1, 1, 1, {0} } } },
718 { 4, {0x0d28, 0x0d4d, 0x200d, 0x0d09}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1200}}, {-1, 1, 1, {0} } } },
719 { 4, {0x0d30, 0x0d4d, 0x200d, 0x0d0a}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1201}}, {-1, 1, 1, {0} } } },
720 { 4, {0x0d32, 0x0d4d, 0x200d, 0x0d0f}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1205}}, {-1, 1, 1, {0} } } },
721 { 4, {0x0d33, 0x0d4d, 0x200d, 0x0d13}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1208}}, {-1, 1, 1, {0} } } },
723 { 4, {0x0d23, 0x0d4d, 0x200d, 0x0d16}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120b}}, {-1, 1, 1, {0} } } },
724 { 4, {0x0d28, 0x0d4d, 0x200d, 0x0d19}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120e}}, {-1, 1, 1, {0} } } },
725 { 4, {0x0d30, 0x0d4d, 0x200d, 0x0d1a}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x120f}}, {-1, 1, 1, {0} } } },
726 { 4, {0x0d32, 0x0d4d, 0x200d, 0x0d1f}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1214}}, {-1, 1, 1, {0} } } },
727 { 4, {0x0d33, 0x0d4d, 0x200d, 0x0d31}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 3, 0, {0x0000}}, {3, 4, 1, {0x1225}}, {-1, 1, 1, {0} } } },
729 { 4, {0x0d23, 0x0d4d, 0x200d, 0x0d02}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
730 { 4, {0x0d28, 0x0d4d, 0x200d, 0x0d02}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fa}}, {3, 4, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
731 { 4, {0x0d30, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
732 { 4, {0x0d32, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
733 { 4, {0x0d33, 0x0d4d, 0x200d, 0x0d03}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 1, {0x11fb}}, {3, 4, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
735 { 4, {0x0d23, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1272}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
736 { 4, {0x0d28, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1273}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
737 { 4, {0x0d30, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1274}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
738 { 4, {0x0d32, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1276}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
739 { 4, {0x0d33, 0x0d4d, 0x200d, 0x0d4d}, { {0, 3, 1, {0x1275}}, {1, 2, 0, {0x0000}}, {2, 4, 2, {0x058f, 0x123a}}, {3, 4, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
740 { -1, {0}, -1, -1, 0, {0}}
743 LOCAL_D const TTestInput_PositionParam6 Indic_GurmukhiVowelLeading[] = {
744 // ARA, IRI, URA, independent vowel to shaper
745 { 1, {0x0a05}, { {0, 1, 1, {0x12c3}}, {-1, 1, 1, {0} } } },
746 { 1, {0x0a06}, { {0, 1, 1, {0x12c4}}, {-1, 1, 1, {0} } } },
747 { 1, {0x0a07}, { {0, 1, 1, {0x12c5}}, {-1, 1, 1, {0} } } },
748 { 1, {0x0a08}, { {0, 1, 1, {0x12c6}}, {-1, 1, 1, {0} } } },
749 { 1, {0x0a09}, { {0, 1, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
750 { 1, {0x0a0a}, { {0, 1, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
751 { 1, {0x0a0b}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
752 { 1, {0x0a0c}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
753 { 1, {0x0a0d}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
754 { 1, {0x0a0e}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
755 { 1, {0x0a0f}, { {0, 1, 1, {0x12c9}}, {-1, 1, 1, {0} } } },
756 { 1, {0x0a10}, { {0, 1, 1, {0x12ca}}, {-1, 1, 1, {0} } } },
757 { 1, {0x0a11}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
758 { 1, {0x0a12}, { {0, 1, 1, {0x0000}}, {-1, 1, 1, {0} } } },
759 { 1, {0x0a13}, { {0, 1, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
760 { 1, {0x0a14}, { {0, 1, 1, {0x12cc}}, {-1, 1, 1, {0} } } },
761 { 1, {0x0a72}, { {0, 1, 1, {0x130a}}, {-1, 1, 1, {0} } } },
762 { 1, {0x0a73}, { {0, 1, 1, {0x130b}}, {-1, 1, 1, {0} } } },
763 // Valid bear + vowel
764 { 2, {0x0a05, 0x0a3e}, { {0, 2, 2, {0x12c3, 0x12ef}}, {1, 2, 1, {0x12ef}}, {-1, 1, 1, {0} } } },
765 { 2, {0x0a05, 0x0a48}, { {0, 2, 2, {0x12c3, 0x12f5}}, {1, 2, 1, {0x12f5}}, {-1, 1, 1, {0} } } },
766 { 2, {0x0a05, 0x0a4c}, { {0, 2, 2, {0x12c3, 0x12f7}}, {1, 2, 1, {0x12f7}}, {-1, 1, 1, {0} } } },
767 { 2, {0x0a72, 0x0a3f}, { {0, 2, 2, {0x12f0, 0x130a}}, {1, 2, 1, {0x12f0}}, {-1, 1, 1, {0} } } },
768 { 2, {0x0a72, 0x0a40}, { {0, 2, 2, {0x130a, 0x12f1}}, {1, 2, 1, {0x12f1}}, {-1, 1, 1, {0} } } },
769 { 2, {0x0a72, 0x0a47}, { {0, 2, 2, {0x130a, 0x12f4}}, {1, 2, 1, {0x12f4}}, {-1, 1, 1, {0} } } },
770 { 2, {0x0a73, 0x0a41}, { {0, 2, 1, {0x12c7}}, {-1, 1, 1, {0} } } },
771 { 2, {0x0a73, 0x0a42}, { {0, 2, 1, {0x12c8}}, {-1, 1, 1, {0} } } },
772 { 2, {0x0a73, 0x0a4b}, { {0, 2, 1, {0x12cb}}, {-1, 1, 1, {0} } } },
773 // Invalid bear + vowel sequence
774 { 2, {0x0a72, 0x0a4b}, { {0, 1, 1, {0x130a}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
775 { 2, {0x0a05, 0x0a4b}, { {0, 1, 1, {0x12c3}}, {1, 2, 2, {0x058f, 0x12f6}}, {-1, 1, 1, {0} } } },
776 { 2, {0x0a73, 0x0a3f}, { {0, 1, 1, {0x130b}}, {1, 2, 2, {0x12f0, 0x058f}}, {-1, 1, 1, {0} } } },
777 { -1, {0}, -1, -1, 0, {0}}
781 LOCAL_D const TTestInput_PositionParam6 Indic_MalayalamVowelLeading[] = {
783 { 1, {0x0d05}, { {0, 1, 1, {0x11fc}}, {-1, 1, 1, {0} } } },
784 { 1, {0x0d06}, { {0, 1, 1, {0x11fd}}, {-1, 1, 1, {0} } } },
785 { 1, {0x0d07}, { {0, 1, 1, {0x11fe}}, {-1, 1, 1, {0} } } },
786 { 1, {0x0d08}, { {0, 1, 1, {0x11ff}}, {-1, 1, 1, {0} } } },
787 { 1, {0x0d09}, { {0, 1, 1, {0x1200}}, {-1, 1, 1, {0} } } },
788 { 1, {0x0d0a}, { {0, 1, 1, {0x1201}}, {-1, 1, 1, {0} } } },
789 { 1, {0x0d0b}, { {0, 1, 1, {0x1202}}, {-1, 1, 1, {0} } } },
790 { 1, {0x0d60}, { {0, 1, 1, {0x123c}}, {-1, 1, 1, {0} } } },
791 { 1, {0x0d0c}, { {0, 1, 1, {0x1203}}, {-1, 1, 1, {0} } } },
792 { 1, {0x0d61}, { {0, 1, 1, {0x123d}}, {-1, 1, 1, {0} } } },
793 { 1, {0x0d0e}, { {0, 1, 1, {0x1204}}, {-1, 1, 1, {0} } } },
794 { 1, {0x0d0f}, { {0, 1, 1, {0x1205}}, {-1, 1, 1, {0} } } },
795 { 1, {0x0d10}, { {0, 1, 1, {0x1206}}, {-1, 1, 1, {0} } } },
796 { 1, {0x0d12}, { {0, 1, 1, {0x1207}}, {-1, 1, 1, {0} } } },
797 { 1, {0x0d13}, { {0, 1, 1, {0x1208}}, {-1, 1, 1, {0} } } },
798 { 1, {0x0d14}, { {0, 1, 1, {0x1209}}, {-1, 1, 1, {0} } } },
800 { 2, {0x0d05, 0x0d02}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
801 { 2, {0x0d06, 0x0d02}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
802 { 2, {0x0d07, 0x0d02}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
803 { 2, {0x0d08, 0x0d02}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
804 { 2, {0x0d09, 0x0d02}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
805 { 2, {0x0d0a, 0x0d02}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
806 { 2, {0x0d0b, 0x0d02}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
807 { 2, {0x0d60, 0x0d02}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {-1, 1, 1, {0} } } },
808 { 2, {0x0d0c, 0x0d03}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
809 { 2, {0x0d61, 0x0d03}, { {0, 2, 2, {0x123d, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
810 { 2, {0x0d0e, 0x0d03}, { {0, 2, 2, {0x1204, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
811 { 2, {0x0d0f, 0x0d03}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
812 { 2, {0x0d10, 0x0d03}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
813 { 2, {0x0d12, 0x0d03}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
814 { 2, {0x0d13, 0x0d03}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
815 { 2, {0x0d14, 0x0d03}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {-1, 1, 1, {0} } } },
816 // Vowel, Modifier, Matra
817 { 3, {0x0d05, 0x0d02, 0x0d3e}, { {0, 2, 2, {0x11fc, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
818 { 3, {0x0d06, 0x0d02, 0x0d3f}, { {0, 2, 2, {0x11fd, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
819 { 3, {0x0d07, 0x0d02, 0x0d40}, { {0, 2, 2, {0x11fe, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
820 { 3, {0x0d08, 0x0d02, 0x0d41}, { {0, 2, 2, {0x11ff, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
821 { 3, {0x0d09, 0x0d02, 0x0d42}, { {0, 2, 2, {0x1200, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
822 { 3, {0x0d0a, 0x0d02, 0x0d43}, { {0, 2, 2, {0x1201, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
823 { 3, {0x0d0b, 0x0d02, 0x0d46}, { {0, 2, 2, {0x1202, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
824 { 3, {0x0d60, 0x0d02, 0x0d47}, { {0, 2, 2, {0x123c, 0x11fa}}, {1, 2, 1, {0x11fa}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
825 { 3, {0x0d0c, 0x0d03, 0x0d48}, { {0, 2, 2, {0x1203, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
826 { 3, {0x0d61, 0x0d03, 0x0d4a}, { {0, 2, 2, {0x123d, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
827 { 3, {0x0d0e, 0x0d03, 0x0d4b}, { {0, 2, 2, {0x1204, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
828 { 3, {0x0d0f, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1205, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
829 { 3, {0x0d10, 0x0d03, 0x0d3e}, { {0, 2, 2, {0x1206, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
830 { 3, {0x0d12, 0x0d03, 0x0d3f}, { {0, 2, 2, {0x1207, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
831 { 3, {0x0d13, 0x0d03, 0x0d40}, { {0, 2, 2, {0x1208, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
832 { 3, {0x0d14, 0x0d03, 0x0d4c}, { {0, 2, 2, {0x1209, 0x11fb}}, {1, 2, 1, {0x11fb}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
835 { 2, {0x0d05, 0x0d4d}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
836 { 2, {0x0d06, 0x0d4d}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
837 { 2, {0x0d07, 0x0d4d}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
838 { 2, {0x0d08, 0x0d4d}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
839 { 2, {0x0d09, 0x0d4d}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
840 { 2, {0x0d0a, 0x0d4d}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
841 { 2, {0x0d0b, 0x0d4d}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
842 { 2, {0x0d60, 0x0d4d}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
843 { 2, {0x0d0c, 0x0d4d}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
844 { 2, {0x0d61, 0x0d4d}, { {0, 1, 1, {0x123d}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
845 { 2, {0x0d0e, 0x0d4d}, { {0, 1, 1, {0x1204}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
846 { 2, {0x0d0f, 0x0d4d}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
847 { 2, {0x0d10, 0x0d4d}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
848 { 2, {0x0d12, 0x0d4d}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
849 { 2, {0x0d13, 0x0d4d}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
850 { 2, {0x0d14, 0x0d4d}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {-1, 1, 1, {0} } } },
853 { 2, {0x0d05, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
854 { 2, {0x0d06, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
855 { 2, {0x0d07, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
856 { 2, {0x0d08, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
857 { 2, {0x0d09, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
858 { 2, {0x0d0a, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
859 { 2, {0x0d0b, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
860 { 2, {0x0d60, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
861 { 2, {0x0d0c, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
862 { 2, {0x0d61, 0x0d4a}, { {0, 1, 1, {0x123d}}, {1, 2, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
863 { 2, {0x0d0e, 0x0d4b}, { {0, 1, 1, {0x1204}}, {1, 2, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
864 { 2, {0x0d0f, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
865 { 2, {0x0d10, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
866 { 2, {0x0d12, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
867 { 2, {0x0d13, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
868 { 2, {0x0d14, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
869 // Vowel Virma, Matra
870 { 3, {0x0d05, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x11fc}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
871 { 3, {0x0d06, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x11fd}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
872 { 3, {0x0d07, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x11fe}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
873 { 3, {0x0d08, 0x0d4d, 0x0d41}, { {0, 1, 1, {0x11ff}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1231}}, {-1, 1, 1, {0} } } },
874 { 3, {0x0d09, 0x0d4d, 0x0d42}, { {0, 1, 1, {0x1200}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1232}}, {-1, 1, 1, {0} } } },
875 { 3, {0x0d0a, 0x0d4d, 0x0d43}, { {0, 1, 1, {0x1201}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1233}}, {-1, 1, 1, {0} } } },
876 { 3, {0x0d0b, 0x0d4d, 0x0d46}, { {0, 1, 1, {0x1202}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1234, 0x058f}}, {-1, 1, 1, {0} } } },
877 { 3, {0x0d60, 0x0d4d, 0x0d47}, { {0, 1, 1, {0x123c}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1235, 0x058f}}, {-1, 1, 1, {0} } } },
878 { 3, {0x0d0c, 0x0d4d, 0x0d48}, { {0, 1, 1, {0x1203}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x1236, 0x058f}}, {-1, 1, 1, {0} } } },
879 { 3, {0x0d61, 0x0d4d, 0x0d4a}, { {0, 1, 1, {0x123d}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 3, {0x1234, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
880 { 3, {0x0d0e, 0x0d4d, 0x0d4b}, { {0, 1, 1, {0x1204}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 3, {0x1235, 0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
881 { 3, {0x0d0f, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1205}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
882 { 3, {0x0d10, 0x0d4d, 0x0d3e}, { {0, 1, 1, {0x1206}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122e}}, {-1, 1, 1, {0} } } },
883 { 3, {0x0d12, 0x0d4d, 0x0d3f}, { {0, 1, 1, {0x1207}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x122f}}, {-1, 1, 1, {0} } } },
884 { 3, {0x0d13, 0x0d4d, 0x0d40}, { {0, 1, 1, {0x1208}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x1230}}, {-1, 1, 1, {0} } } },
885 { 3, {0x0d14, 0x0d4d, 0x0d4c}, { {0, 1, 1, {0x1209}}, {1, 2, 2, {0x058f, 0x123a}}, {2, 3, 2, {0x058f, 0x123b}}, {-1, 1, 1, {0} } } },
886 { -1, {0}, -1, -1, 0, {0}}
890 This array of structs is used in the test routine
891 CTGlyphSelection::TestThai_InvalidGlyphClusters() to verify that
892 GetCharacterPosition() correctly uses the dotted circle character
893 when it crosses a glyph cluster boundary and finds invalid combining
896 LOCAL_D const TTestInput_PositionParam2 Thai_GlyphClusterBoundaries[] = {
897 // --TEXT---------------- --INVOKE 1--------------- --INVOKE 2----------------
899 //0.TEST D1 - Control character - skipped
901 //0.TEST D2 - Non Thai letter
902 { 2, {0x0E3F, 0x0E5B}, {{0, 1, 1, {0x0E3F}}, {1, 2, 1, {0x0E5B}}}},
903 { 2, {0x0041, 0x0E03}, {{0, 1, 1, {0x0041}}, {1, 2, 1, {0x0E03}}}},
904 { 2, {0x0E2F, 0x0E40}, {{0, 1, 1, {0x0E2F}}, {1, 2, 1, {0x0E40}}}},
905 { 2, {0x0E3F, 0x0E30}, {{0, 1, 1, {0x0E3F}}, {1, 2, 1, {0x0E30}}}},
906 { 2, {0x0E46, 0x0E45}, {{0, 1, 1, {0x0E46}}, {1, 2, 1, {0x0E45}}}},
907 { 2, {0x0E4F, 0x0E24}, {{0, 1, 1, {0x0E4F}}, {1, 2, 1, {0x0E24}}}},
909 { 2, {0x0E50, 0x0E38}, {{0, 1, 1, {0x0E50}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
910 { 2, {0x0E51, 0x0E39}, {{0, 1, 1, {0x0E51}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
911 { 2, {0x0E52, 0x0E3A}, {{0, 1, 1, {0x0E52}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
912 { 2, {0x0E55, 0x0E49}, {{0, 1, 1, {0x0E55}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
913 { 2, {0x0E56, 0x0E4C}, {{0, 1, 1, {0x0E56}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
914 { 2, {0x0E58, 0x0E47}, {{0, 1, 1, {0x0E58}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
915 { 2, {0x0E59, 0x0E4E}, {{0, 1, 1, {0x0E59}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
916 { 2, {0x0E5A, 0x0E34}, {{0, 1, 1, {0x0E5A}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
917 { 2, {0x0E5B, 0x0E31}, {{0, 1, 1, {0x0E5B}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
918 { 2, {0x005A, 0x0E37}, {{0, 1, 1, {0x005A}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
920 //16.TEST D3 - Thai consonant
921 { 2, {0x0E01, 0x0E3F}, {{0, 1, 1, {0x0E01}}, {1, 2, 1, {0x0E3F}}}},
922 { 2, {0x0E01, 0x0E03}, {{0, 1, 1, {0x0E01}}, {1, 2, 1, {0x0E03}}}},
923 { 2, {0x0E02, 0x0E40}, {{0, 1, 1, {0x0E02}}, {1, 2, 1, {0x0E40}}}},
924 { 2, {0x0E03, 0x0E30}, {{0, 1, 1, {0x0E03}}, {1, 2, 1, {0x0E30}}}},
925 { 2, {0x0E04, 0x0E45}, {{0, 1, 1, {0x0E04}}, {1, 2, 1, {0x0E45}}}},
926 { 2, {0x0E05, 0x0E24}, {{0, 1, 1, {0x0E05}}, {1, 2, 1, {0x0E24}}}},
928 { 2, {0x0E06, 0x0E38}, {{0, 2, 2, {0x0E06, 0x0E38}}, {-1, -1, 0, {0}}}},
929 { 2, {0x0E07, 0x0E39}, {{0, 2, 2, {0x0E07, 0x0E39}}, {-1, -1, 0, {0}}}},
930 { 2, {0x0E23, 0x0E3A}, {{0, 2, 2, {0x0E23, 0x0E3A}}, {-1, -1, 0, {0}}}},
931 { 2, {0x0E25, 0x0E49}, {{0, 2, 2, {0x0E25, 0xF70B}}, {-1, -1, 0, {0}}}},
932 { 2, {0x0E27, 0x0E4C}, {{0, 2, 2, {0x0E27, 0xF70E}}, {-1, -1, 0, {0}}}},
933 { 2, {0x0E28, 0x0E47}, {{0, 2, 2, {0x0E28, 0x0E47}}, {-1, -1, 0, {0}}}},
934 { 2, {0x0E29, 0x0E4E}, {{0, 2, 2, {0x0E29, 0x0E4E}}, {-1, -1, 0, {0}}}},
935 { 2, {0x0E2A, 0x0E34}, {{0, 2, 2, {0x0E2A, 0x0E34}}, {-1, -1, 0, {0}}}},
936 { 2, {0x0E2D, 0x0E31}, {{0, 2, 2, {0x0E2D, 0x0E31}}, {-1, -1, 0, {0}}}},
937 { 2, {0x0E2E, 0x0E37}, {{0, 2, 2, {0x0E2E, 0x0E37}}, {-1, -1, 0, {0}}}},
939 //32.TEST D4 - Thai leading vowel
940 { 2, {0x0E40, 0x0E3F}, {{0, 1, 1, {0x0E40}}, {1, 2, 1, {0x0E3F}}}},
941 { 2, {0x0E41, 0x0E03}, {{0, 1, 1, {0x0E41}}, {1, 2, 1, {0x0E03}}}},
942 { 2, {0x0E42, 0x0E40}, {{0, 1, 1, {0x0E42}}, {1, 2, 1, {0x0E40}}}},
943 { 2, {0x0E43, 0x0E30}, {{0, 1, 1, {0x0E43}}, {1, 2, 1, {0x0E30}}}},
944 { 2, {0x0E44, 0x0E45}, {{0, 1, 1, {0x0E44}}, {1, 2, 1, {0x0E45}}}},
945 { 2, {0x0E44, 0x0E24}, {{0, 1, 1, {0x0E44}}, {1, 2, 1, {0x0E24}}}},
947 { 2, {0x0E40, 0x0E38}, {{0, 1, 1, {0x0E40}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
948 { 2, {0x0E41, 0x0E39}, {{0, 1, 1, {0x0E41}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
949 { 2, {0x0E42, 0x0E3A}, {{0, 1, 1, {0x0E42}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
950 { 2, {0x0E43, 0x0E49}, {{0, 1, 1, {0x0E43}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
951 { 2, {0x0E44, 0x0E4C}, {{0, 1, 1, {0x0E44}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
952 { 2, {0x0E40, 0x0E47}, {{0, 1, 1, {0x0E40}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
953 { 2, {0x0E41, 0x0E4E}, {{0, 1, 1, {0x0E41}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
954 { 2, {0x0E42, 0x0E34}, {{0, 1, 1, {0x0E42}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
955 { 2, {0x0E43, 0x0E31}, {{0, 1, 1, {0x0E43}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
956 { 2, {0x0E44, 0x0E37}, {{0, 1, 1, {0x0E44}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
958 //48.TEST D5 - Thai following vowel 1
959 { 2, {0x0E30, 0x0E3F}, {{0, 1, 1, {0x0E30}}, {1, 2, 1, {0x0E3F}}}},
960 { 2, {0x0E32, 0x0E03}, {{0, 1, 1, {0x0E32}}, {1, 2, 1, {0x0E03}}}},
961 { 2, {0x0E33, 0x0E40}, {{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E40}}}},
962 { 2, {0x0E30, 0x0E30}, {{0, 1, 1, {0x0E30}}, {1, 2, 1, {0x0E30}}}},
963 { 2, {0x0E32, 0x0E45}, {{0, 1, 1, {0x0E32}}, {1, 2, 1, {0x0E45}}}},
964 { 2, {0x0E33, 0x0E24}, {{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 1, {0x0E24}}}},
966 { 2, {0x0E30, 0x0E38}, {{0, 1, 1, {0x0E30}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
967 { 2, {0x0E32, 0x0E39}, {{0, 1, 1, {0x0E32}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
968 { 2, {0x0E33, 0x0E3A}, {{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
969 { 2, {0x0E30, 0x0E49}, {{0, 1, 1, {0x0E30}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
970 { 2, {0x0E32, 0x0E4C}, {{0, 1, 1, {0x0E32}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
971 { 2, {0x0E33, 0x0E47}, {{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
972 { 2, {0x0E30, 0x0E4E}, {{0, 1, 1, {0x0E30}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
973 { 2, {0x0E32, 0x0E34}, {{0, 1, 1, {0x0E32}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
974 { 2, {0x0E33, 0x0E31}, {{0, 1, 2, {KUnicodeDottedCircle, 0x0E33}},{1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
975 { 2, {0x0E30, 0x0E37}, {{0, 1, 1, {0x0E30}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
977 //64.TEST D6 - Thai following vowel 2
978 { 2, {0x0E45, 0x0E3F}, {{0, 1, 1, {0x0E45}}, {1, 2, 1, {0x0E3F}}}},
979 { 2, {0x0E45, 0x0E03}, {{0, 1, 1, {0x0E45}}, {1, 2, 1, {0x0E03}}}},
980 { 2, {0x0E45, 0x0E40}, {{0, 1, 1, {0x0E45}}, {1, 2, 1, {0x0E40}}}},
981 { 2, {0x0E45, 0x0E30}, {{0, 1, 1, {0x0E45}}, {1, 2, 1, {0x0E30}}}},
982 { 2, {0x0E45, 0x0E45}, {{0, 1, 1, {0x0E45}}, {1, 2, 1, {0x0E45}}}},
983 { 2, {0x0E45, 0x0E24}, {{0, 1, 1, {0x0E45}}, {1, 2, 1, {0x0E24}}}},
985 { 2, {0x0E45, 0x0E38}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E38}}}},
986 { 2, {0x0E45, 0x0E39}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E39}}}},
987 { 2, {0x0E45, 0x0E3A}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
988 { 2, {0x0E45, 0x0E49}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70B}}}},
989 { 2, {0x0E45, 0x0E4C}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0xF70E}}}},
990 { 2, {0x0E45, 0x0E47}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E47}}}},
991 { 2, {0x0E45, 0x0E4E}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
992 { 2, {0x0E45, 0x0E34}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E34}}}},
993 { 2, {0x0E45, 0x0E31}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E31}}}},
994 { 2, {0x0E45, 0x0E37}, {{0, 1, 1, {0x0E45}}, {1, 2, 2, {KUnicodeDottedCircle, 0x0E37}}}},
996 //80.TEST D7 - Thai following vowel 3
997 { 2, {0x0E24, 0x0E3F}, {{0, 1, 1, {0x0E24}}, {1, 2, 1, {0x0E3F}}}},
998 { 2, {0x0E26, 0x0E03}, {{0, 1, 1, {0x0E26}}, {1, 2, 1, {0x0E03}}}},
999 { 2, {0x0E24, 0x0E40}, {{0, 1, 1, {0x0E24}}, {1, 2, 1, {0x0E40}}}},
1000 { 2, {0x0E26, 0x0E30}, {{0, 1, 1, {0x0E26}}, {1, 2, 1, {0x0E30}}}},
1001 { 2, {0x0E24, 0x0E45}, {{0, 1, 1, {0x0E24}}, {1, 2, 1, {0x0E45}}}},
1002 { 2, {0x0E26, 0x0E24}, {{0, 1, 1, {0x0E26}}, {1, 2, 1, {0x0E24}}}},
1004 { 2, {0x0E24, 0x0E38}, {{0, 2, 2, {0x0E24, 0xF718}}, {-1, -1, 0, {0}}}},
1005 { 2, {0x0E26, 0x0E39}, {{0, 2, 2, {0x0E26, 0xF719}}, {-1, -1, 0, {0}}}},
1006 { 2, {0x0E24, 0x0E3A}, {{0, 2, 2, {0x0E24, 0xF71A}}, {-1, -1, 0, {0}}}},
1007 { 2, {0x0E26, 0x0E49}, {{0, 2, 2, {0x0E26, 0xF70B}}, {-1, -1, 0, {0}}}},
1008 { 2, {0x0E24, 0x0E4C}, {{0, 2, 2, {0x0E24, 0xF70E}}, {-1, -1, 0, {0}}}},
1009 { 2, {0x0E26, 0x0E47}, {{0, 2, 2, {0x0E26, 0x0E47}}, {-1, -1, 0, {0}}}},
1010 { 2, {0x0E24, 0x0E4E}, {{0, 2, 2, {0x0E24, 0x0E4E}}, {-1, -1, 0, {0}}}},
1011 { 2, {0x0E26, 0x0E34}, {{0, 2, 2, {0x0E26, 0x0E34}}, {-1, -1, 0, {0}}}},
1012 { 2, {0x0E24, 0x0E31}, {{0, 2, 2, {0x0E24, 0x0E31}}, {-1, -1, 0, {0}}}},
1013 { 2, {0x0E26, 0x0E37}, {{0, 2, 2, {0x0E26, 0x0E37}}, {-1, -1, 0, {0}}}},
1015 //96.TEST D8 - Thai NO NU & Below Vowel 1
1016 { 3, {0x0E19, 0x0E38, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 1, {0x0E3F}}}},
1017 { 3, {0x0E19, 0x0E38, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 1, {0x0E03}}}},
1018 { 3, {0x0E19, 0x0E38, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 1, {0x0E40}}}},
1019 { 3, {0x0E19, 0x0E38, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 1, {0x0E30}}}},
1020 { 3, {0x0E19, 0x0E38, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 1, {0x0E45}}}},
1021 { 3, {0x0E19, 0x0E38, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 1, {0x0E24}}}},
1023 { 3, {0x0E19, 0x0E38, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1024 { 3, {0x0E19, 0x0E38, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1025 { 3, {0x0E19, 0x0E38, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1026 { 3, {0x0E19, 0x0E38, 0x0E49}, {{0, 3, 3, {0x0E19, 0x0E38, 0xF70B}}, {-1, -1, 0, {0}}}},
1027 { 3, {0x0E19, 0x0E38, 0x0E4C}, {{0, 3, 3, {0x0E19, 0x0E38, 0xF70E}}, {-1, -1, 0, {0}}}},
1028 { 3, {0x0E19, 0x0E38, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1029 { 3, {0x0E19, 0x0E38, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1030 { 3, {0x0E19, 0x0E38, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1031 { 3, {0x0E19, 0x0E38, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1032 { 3, {0x0E19, 0x0E38, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E38}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1034 //112.TEST D9 - Thai NO NU & Below Vowel 2
1035 { 3, {0x0E19, 0x0E39, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 1, {0x0E3F}}}},
1036 { 3, {0x0E19, 0x0E39, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 1, {0x0E03}}}},
1037 { 3, {0x0E19, 0x0E39, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 1, {0x0E40}}}},
1038 { 3, {0x0E19, 0x0E39, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 1, {0x0E30}}}},
1039 { 3, {0x0E19, 0x0E39, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 1, {0x0E45}}}},
1040 { 3, {0x0E19, 0x0E39, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 1, {0x0E24}}}},
1042 { 3, {0x0E19, 0x0E39, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1043 { 3, {0x0E19, 0x0E39, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1044 { 3, {0x0E19, 0x0E39, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1045 { 3, {0x0E19, 0x0E39, 0x0E49}, {{0, 3, 3, {0x0E19, 0x0E39, 0xF70B}}, {-1, -1, 0, {0}}}},
1046 { 3, {0x0E19, 0x0E39, 0x0E4C}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1047 { 3, {0x0E19, 0x0E39, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1048 { 3, {0x0E19, 0x0E39, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1049 { 3, {0x0E19, 0x0E39, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1050 { 3, {0x0E19, 0x0E39, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1051 { 3, {0x0E19, 0x0E39, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E39}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1053 //128.TEST D10 - Thai NO NU & Below Diacritic
1054 { 3, {0x0E19, 0x0E3A, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 1, {0x0E3F}}}},
1055 { 3, {0x0E19, 0x0E3A, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 1, {0x0E03}}}},
1056 { 3, {0x0E19, 0x0E3A, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 1, {0x0E40}}}},
1057 { 3, {0x0E19, 0x0E3A, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 1, {0x0E30}}}},
1058 { 3, {0x0E19, 0x0E3A, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 1, {0x0E45}}}},
1059 { 3, {0x0E19, 0x0E3A, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 1, {0x0E24}}}},
1061 { 3, {0x0E19, 0x0E3A, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1062 { 3, {0x0E19, 0x0E3A, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1063 { 3, {0x0E19, 0x0E3A, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1064 { 3, {0x0E19, 0x0E3A, 0x0E49}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
1065 { 3, {0x0E19, 0x0E3A, 0x0E4C}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1066 { 3, {0x0E19, 0x0E3A, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1067 { 3, {0x0E19, 0x0E3A, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1068 { 3, {0x0E19, 0x0E3A, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1069 { 3, {0x0E19, 0x0E3A, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1070 { 3, {0x0E19, 0x0E3A, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E3A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1072 //144.TEST D11 - Thai NO NU & Tone mark
1073 { 3, {0x0E19, 0x0E48, 0x0E3F}, {{0, 2, 2, {0x0E19, 0xF70A}}, {2, 3, 1, {0x0E3F}}}},
1074 { 3, {0x0E19, 0x0E49, 0x0E03}, {{0, 2, 2, {0x0E19, 0xF70B}}, {2, 3, 1, {0x0E03}}}},
1075 { 3, {0x0E19, 0x0E4A, 0x0E40}, {{0, 2, 2, {0x0E19, 0xF70C}}, {2, 3, 1, {0x0E40}}}},
1076 { 3, {0x0E19, 0x0E4B, 0x0E30}, {{0, 2, 2, {0x0E19, 0xF70D}}, {2, 3, 1, {0x0E30}}}},
1077 { 3, {0x0E19, 0x0E48, 0x0E45}, {{0, 2, 2, {0x0E19, 0xF70A}}, {2, 3, 1, {0x0E45}}}},
1078 { 3, {0x0E19, 0x0E49, 0x0E24}, {{0, 2, 2, {0x0E19, 0xF70B}}, {2, 3, 1, {0x0E24}}}},
1080 { 3, {0x0E19, 0x0E4A, 0x0E38}, {{0, 2, 2, {0x0E19, 0xF70C}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1081 { 3, {0x0E19, 0x0E4B, 0x0E39}, {{0, 2, 2, {0x0E19, 0xF70D}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1082 { 3, {0x0E19, 0x0E48, 0x0E3A}, {{0, 2, 2, {0x0E19, 0xF70A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1083 { 3, {0x0E19, 0x0E49, 0x0E49}, {{0, 2, 2, {0x0E19, 0xF70B}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
1084 { 3, {0x0E19, 0x0E4A, 0x0E4C}, {{0, 2, 2, {0x0E19, 0xF70C}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1085 { 3, {0x0E19, 0x0E4B, 0x0E47}, {{0, 2, 2, {0x0E19, 0xF70D}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1086 { 3, {0x0E19, 0x0E48, 0x0E4E}, {{0, 2, 2, {0x0E19, 0xF70A}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1087 { 3, {0x0E19, 0x0E49, 0x0E34}, {{0, 2, 2, {0x0E19, 0xF70B}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1088 { 3, {0x0E19, 0x0E4A, 0x0E31}, {{0, 2, 2, {0x0E19, 0xF70C}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1089 { 3, {0x0E19, 0x0E4B, 0x0E37}, {{0, 2, 2, {0x0E19, 0xF70D}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1091 //160.TEST D12 - Thai NO NU & Above Diacritic 1
1092 { 3, {0x0E19, 0x0E4C, 0x0E3F}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 1, {0x0E3F}}}},
1093 { 3, {0x0E19, 0x0E4D, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 1, {0x0E03}}}},
1094 { 3, {0x0E19, 0x0E4C, 0x0E40}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 1, {0x0E40}}}},
1095 { 3, {0x0E19, 0x0E4D, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 1, {0x0E30}}}},
1096 { 3, {0x0E19, 0x0E4C, 0x0E45}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 1, {0x0E45}}}},
1097 { 3, {0x0E19, 0x0E4D, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 1, {0x0E24}}}},
1099 { 3, {0x0E19, 0x0E4C, 0x0E38}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1100 { 3, {0x0E19, 0x0E4D, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1101 { 3, {0x0E19, 0x0E4C, 0x0E3A}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1102 { 3, {0x0E19, 0x0E4D, 0x0E49}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
1103 { 3, {0x0E19, 0x0E4C, 0x0E4C}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1104 { 3, {0x0E19, 0x0E4D, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1105 { 3, {0x0E19, 0x0E4C, 0x0E4E}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1106 { 3, {0x0E19, 0x0E4D, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1107 { 3, {0x0E19, 0x0E4C, 0x0E31}, {{0, 2, 2, {0x0E19, 0xF70E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1108 { 3, {0x0E19, 0x0E4D, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E4D}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1110 //176.TEST D13 - Thai NO NU & Above Diacritic 2
1111 { 3, {0x0E19, 0x0E47, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 1, {0x0E3F}}}},
1112 { 3, {0x0E19, 0x0E47, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 1, {0x0E03}}}},
1113 { 3, {0x0E19, 0x0E47, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 1, {0x0E40}}}},
1114 { 3, {0x0E19, 0x0E47, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 1, {0x0E30}}}},
1115 { 3, {0x0E19, 0x0E47, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 1, {0x0E45}}}},
1116 { 3, {0x0E19, 0x0E47, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 1, {0x0E24}}}},
1118 { 3, {0x0E19, 0x0E47, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1119 { 3, {0x0E19, 0x0E47, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1120 { 3, {0x0E19, 0x0E47, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1121 { 3, {0x0E19, 0x0E47, 0x0E49}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
1122 { 3, {0x0E19, 0x0E47, 0x0E4C}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1123 { 3, {0x0E19, 0x0E47, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1124 { 3, {0x0E19, 0x0E47, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1125 { 3, {0x0E19, 0x0E47, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1126 { 3, {0x0E19, 0x0E47, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1127 { 3, {0x0E19, 0x0E47, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E47}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1129 //176.TEST D14 - Thai NO NU & Above Diacritic 3
1130 { 3, {0x0E19, 0x0E4E, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 1, {0x0E3F}}}},
1131 { 3, {0x0E19, 0x0E4E, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 1, {0x0E03}}}},
1132 { 3, {0x0E19, 0x0E4E, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 1, {0x0E40}}}},
1133 { 3, {0x0E19, 0x0E4E, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 1, {0x0E30}}}},
1134 { 3, {0x0E19, 0x0E4E, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 1, {0x0E45}}}},
1135 { 3, {0x0E19, 0x0E4E, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 1, {0x0E24}}}},
1137 { 3, {0x0E19, 0x0E4E, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1138 { 3, {0x0E19, 0x0E4E, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1139 { 3, {0x0E19, 0x0E4E, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1140 { 3, {0x0E19, 0x0E4E, 0x0E49}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
1141 { 3, {0x0E19, 0x0E4E, 0x0E4C}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1142 { 3, {0x0E19, 0x0E4E, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1143 { 3, {0x0E19, 0x0E4E, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1144 { 3, {0x0E19, 0x0E4E, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1145 { 3, {0x0E19, 0x0E4E, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1146 { 3, {0x0E19, 0x0E4E, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E4E}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1148 //192.TEST D15 - Thai NO NU & Above Vowel 1
1149 { 3, {0x0E19, 0x0E34, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 1, {0x0E3F}}}},
1150 { 3, {0x0E19, 0x0E34, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 1, {0x0E03}}}},
1151 { 3, {0x0E19, 0x0E34, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 1, {0x0E40}}}},
1152 { 3, {0x0E19, 0x0E34, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 1, {0x0E30}}}},
1153 { 3, {0x0E19, 0x0E34, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 1, {0x0E45}}}},
1154 { 3, {0x0E19, 0x0E34, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 1, {0x0E24}}}},
1156 { 3, {0x0E19, 0x0E34, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1157 { 3, {0x0E19, 0x0E34, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1158 { 3, {0x0E19, 0x0E34, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1159 { 3, {0x0E19, 0x0E34, 0x0E49}, {{0, 3, 3, {0x0E19, 0x0E34, 0x0E49}}, {-1, -1, 0, {0}}}},
1160 { 3, {0x0E19, 0x0E34, 0x0E4C}, {{0, 3, 3, {0x0E19, 0x0E34, 0x0E4C}}, {-1, -1, 0, {0}}}},
1161 { 3, {0x0E19, 0x0E34, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1162 { 3, {0x0E19, 0x0E34, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1163 { 3, {0x0E19, 0x0E34, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1164 { 3, {0x0E19, 0x0E34, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1165 { 3, {0x0E19, 0x0E34, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1167 //208.TEST D16 - Thai NO NU & Above Vowel 2
1168 { 3, {0x0E19, 0x0E31, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 1, {0x0E3F}}}},
1169 { 3, {0x0E19, 0x0E36, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E36}}, {2, 3, 1, {0x0E03}}}},
1170 { 3, {0x0E19, 0x0E31, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 1, {0x0E40}}}},
1171 { 3, {0x0E19, 0x0E36, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E36}}, {2, 3, 1, {0x0E30}}}},
1172 { 3, {0x0E19, 0x0E31, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 1, {0x0E45}}}},
1173 { 3, {0x0E19, 0x0E36, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E36}}, {2, 3, 1, {0x0E24}}}},
1175 { 3, {0x0E19, 0x0E31, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1176 { 3, {0x0E19, 0x0E36, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E36}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1177 { 3, {0x0E19, 0x0E31, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1178 { 3, {0x0E19, 0x0E36, 0x0E49}, {{0, 3, 3, {0x0E19, 0x0E36, 0x0E49}}, {-1, -1, 0, {0}}}},
1179 { 3, {0x0E19, 0x0E31, 0x0E4C}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1180 { 3, {0x0E19, 0x0E36, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E36}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1181 { 3, {0x0E19, 0x0E31, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1182 { 3, {0x0E19, 0x0E36, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E36}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1183 { 3, {0x0E19, 0x0E31, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E31}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1184 { 3, {0x0E19, 0x0E36, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E36}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1186 //240.TEST D17 - Thai NO NU & Above Vowel 3
1187 { 3, {0x0E19, 0x0E35, 0x0E3F}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 1, {0x0E3F}}}},
1188 { 3, {0x0E19, 0x0E37, 0x0E03}, {{0, 2, 2, {0x0E19, 0x0E37}}, {2, 3, 1, {0x0E03}}}},
1189 { 3, {0x0E19, 0x0E35, 0x0E40}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 1, {0x0E40}}}},
1190 { 3, {0x0E19, 0x0E37, 0x0E30}, {{0, 2, 2, {0x0E19, 0x0E37}}, {2, 3, 1, {0x0E30}}}},
1191 { 3, {0x0E19, 0x0E35, 0x0E45}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 1, {0x0E45}}}},
1192 { 3, {0x0E19, 0x0E37, 0x0E24}, {{0, 2, 2, {0x0E19, 0x0E37}}, {2, 3, 1, {0x0E24}}}},
1194 { 3, {0x0E19, 0x0E35, 0x0E38}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E38}}}},
1195 { 3, {0x0E19, 0x0E37, 0x0E39}, {{0, 2, 2, {0x0E19, 0x0E37}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E39}}}},
1196 { 3, {0x0E19, 0x0E35, 0x0E3A}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E3A}}}},
1197 { 3, {0x0E19, 0x0E37, 0x0E49}, {{0, 3, 3, {0x0E19, 0x0E37, 0x0E49}}, {-1, -1, 0, {0}}}},
1198 { 3, {0x0E19, 0x0E35, 0x0E4C}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70E}}}},
1199 { 3, {0x0E19, 0x0E37, 0x0E47}, {{0, 2, 2, {0x0E19, 0x0E37}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1200 { 3, {0x0E19, 0x0E35, 0x0E4E}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4E}}}},
1201 { 3, {0x0E19, 0x0E37, 0x0E34}, {{0, 2, 2, {0x0E19, 0x0E37}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E34}}}},
1202 { 3, {0x0E19, 0x0E35, 0x0E31}, {{0, 2, 2, {0x0E19, 0x0E35}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E31}}}},
1203 { 3, {0x0E19, 0x0E37, 0x0E37}, {{0, 2, 2, {0x0E19, 0x0E37}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E37}}}},
1205 //256.TEST D18a - Test Thai combining marks stack over a dotted circle.
1206 { 2, {0x0E36, 0x0E48}, {{0, 2, 3, {KUnicodeDottedCircle, 0x0E36, 0x0E48}}, {-1, -1, 0, {0}}}},
1208 //257.TEST D18b - Test non-thai consonant preceding two tone/signs in a row
1209 { 2, {0x0041, 0x0E48, 0x0E49}, {{1, 2, 2, {KUnicodeDottedCircle, 0xF70A}}, {2, 3, 2, {KUnicodeDottedCircle, 0xF70B}}}},
1211 //258. TEST DEF038524 - Test WTT2.0 Rare 4 optional combinations 0xBE, 0xDE, 0xE7, 0xF7
1212 //3 Not supported, but render should degrade display to not overstrike at a minimum. 1 is supported.
1213 { 3, {0x0E01, 0x0E35, 0x0E47}, {{0, 2, 2, {0x0E01, 0x0E35}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1214 { 3, {0x0E01, 0x0E37, 0x0E47}, {{0, 2, 2, {0x0E01, 0x0E37}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E47}}}},
1215 { 3, {0x0E01, 0x0E38, 0x0E4D}, {{0, 3, 3, {0x0E01, 0x0E38, 0x0E4D}}, {-1, -1, 0, {0}}}},
1216 { 3, {0x0E01, 0x0E34, 0x0E4D}, {{0, 2, 2, {0x0E01, 0x0E34}}, {2, 3, 2, {KUnicodeDottedCircle, 0x0E4D}}}},
1219 { -1, {0}, {{-1, -1, 0, {0}}, {-1, -1, 0, {0}}}}
1224 // --- CLASS CTGlyphSelection --------------------------------------------
1228 CTGlyphSelection::CTGlyphSelection(CTestStep* aStep) :
1229 CTGraphicsBase(aStep),
1231 iTestGraphicsDevice(NULL),
1232 iTestGraphicsContext(NULL)
1237 CTGlyphSelection::~CTGlyphSelection()
1239 This method cleans up after testing is finished. It releases memory
1240 allocated by the test obejct at a point before object destruction.
1243 delete iTestGraphicsContext;
1244 delete iTestGraphicsDevice;
1249 void CTGlyphSelection::ConstructL()
1251 CreateTestGraphicsContextL();
1252 User::LeaveIfError(iFs.Connect());
1255 void CTGlyphSelection::CreateTestGraphicsContextL()
1257 This method sets-up the context data for the proceeding test cases.
1260 // Setup 400 pixel dummy graphics test device.
1261 TSize windowSize(400, 400);
1262 iTestGraphicsDevice = CTestGraphicsDevice::NewL(windowSize);
1264 // Create a dummy graphics test context.
1265 CGraphicsContext* tContext = NULL;
1266 TEST(iTestGraphicsDevice->CreateContext(tContext) == KErrNone);
1267 iTestGraphicsContext = static_cast<CTestGraphicsContext*>(tContext);
1269 // Allocate the dummy test font to be used.
1270 iTestFont = new (ELeave) CTestFont;
1274 LOCAL_C TInt TestApiBoundaries_TC2(TAny* aData)
1276 This is a root thread function which runs as part of the test case
1277 CTGlyphSelection::TestApiBoundaries(). It tests a panic
1278 is produced when an invalid text descriptor is supplied in the
1279 TPositionParam argument.
1282 CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
1284 CFont::TPositionParam param;
1285 param.iDirection = CFont::EHorizontal;
1286 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1287 param.iPosInText = 0;
1288 param.iPen.iX = param.iPen.iY = 0;
1290 testPtr->iTestFont->GetCharacterPosition(param);
1292 // Line above panics if component in UDEB is working OK;
1293 // should never get here if component is in UDEB.
1295 // If component is in UREL, then could reach here.
1301 LOCAL_C TInt TestApiBoundaries_TC5(TAny* aData)
1303 This is a root thread function which runs as part of the test case
1304 CTGlyphSelection::TestApiBoundaries(). It tests a panic
1305 is produced when a negative text position is supplied in the
1306 TPositionParam argument.
1309 CTGlyphSelection* testPtr = (CTGlyphSelection*)aData;
1311 CFont::TPositionParam param;
1312 param.iDirection = CFont::EHorizontal;
1313 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1314 _LIT16(KText_aaaa, "aaaa");
1315 param.iText.Set(KText_aaaa);
1316 param.iPosInText = -10;
1317 param.iPen.iX = param.iPen.iY = 0;
1319 testPtr->iTestFont->GetCharacterPosition(param);
1321 // Line above panics if component in UDEB is working OK;
1322 // should never get here if component is in UDEB.
1324 // If component is in UREL, then could reach here.
1330 void CTGlyphSelection::TestApiBoundaries()
1332 This method is a test case to exercise GetCharacterPosition() with
1333 parameter values at range boundaries and in some cases out-or-raange.
1337 TBuf<20> testText(0);
1339 CFont::TPositionParam param;
1340 param.iDirection = CFont::EHorizontal;
1341 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1343 // 1: Check input arguments in paramter not modified
1344 testText = _L16("a");
1345 param.iText.Set(testText);
1346 param.iPosInText = 0;
1347 param.iPen.iX = param.iPen.iY = 0;
1348 r = iTestFont->GetCharacterPosition(param);
1349 TEST(r && param.iDirection == CFont::EHorizontal
1350 && param.iFlags == CFont::TPositionParam::EFLogicalOrder
1351 && param.iText.Ptr() == testText.Ptr());
1353 // 2: Check invalid iText descriptor panics (when component in UDEB)
1354 // When component built in UREL, behaviour is undefined, so do not test.
1355 TRequestStatus threadStatus;
1359 jit = User::JustInTime();
1360 User::SetJustInTime(EFalse);
1361 rc = thread.Create(KThread2NameFirst, TestApiBoundaries_TC2,
1362 KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
1363 TEST(KErrNone == rc);
1364 thread.Logon(threadStatus);
1366 User::WaitForRequest(threadStatus);
1368 if (thread.ExitType() == EExitPanic)
1370 TEST (thread.ExitReason() == ETextBasePanic_InvalidInputParam);
1371 INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
1372 TExitCategoryName exitCategory = thread.ExitCategory();
1373 INFO_PRINTF2(_L("Exit category %S"), &exitCategory);
1377 // Function does not panic on invalid input;
1378 // Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
1379 // and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
1380 INFO_PRINTF1(_L("Warning: GetCharacterPosition() when given invalid iText descriptor has not panicked - this is only ok if the GDI component is built in UREL mode. If the GDI component is built in UDEB mode, then there is a problem."));
1383 User::SetJustInTime(jit);
1385 // 3: Zero length text descriptor
1387 param.iText.Set(testText);
1388 param.iPosInText = 0;
1389 param.iPen.iX = param.iPen.iY = 0;
1390 r = iTestFont->GetCharacterPosition(param);
1391 TEST(!r && param.iPen.iX == 0
1392 && param.iOutputGlyphs == 0);
1394 // 4: Position in text beyond descriptor length
1395 testText = _L16("a");
1396 param.iText.Set(testText);
1397 param.iPosInText = 5;
1398 param.iPen.iX = param.iPen.iY = 0;
1399 r = iTestFont->GetCharacterPosition(param);
1400 TEST(!r && param.iPen.iX == 0
1401 && param.iOutputGlyphs == 0);
1403 // 5: Position in text is negative, should panic (when component in UDEB)
1404 // When component built in UREL, behaviour is undefined, so do not test.
1405 jit = User::JustInTime();
1406 User::SetJustInTime(EFalse);
1407 rc = thread.Create(KThread2NameSecond, TestApiBoundaries_TC5,
1408 KDefaultStackSize, KMinHeapSize, KMinHeapSize*4, this);
1409 TEST(KErrNone == rc);
1410 thread.Logon(threadStatus);
1412 User::WaitForRequest(threadStatus);
1414 if (thread.ExitType() == EExitPanic)
1416 TEST (thread.ExitReason() == ETextBasePanic_InvalidInputParam);
1417 INFO_PRINTF2(_L("Exit reason %d"), thread.ExitReason());
1418 TExitCategoryName exitCategory = thread.ExitCategory();
1419 INFO_PRINTF2(_L("Exit category %S"), &exitCategory);
1423 // Function does not panic on invalid input;
1424 // Warn that this is only valid behaviour if the GDI component being tested is built in UREL mode
1425 // and there is a problem if the function has not panicked if the GDI component is build in UDEB mode
1426 INFO_PRINTF1(_L("Warning: GetCharacterPosition() when given negative iPosInText has not panicked - this is only ok if the GDI component is built in UREL mode. If the GDI component is built in UDEB mode, then there is a problem."));
1430 User::SetJustInTime(jit);
1432 // 6: Check 'No-char-data' condition handled
1433 testText = _L16("A\033C");
1434 param.iText.Set(testText);
1435 param.iPosInText = 1;
1436 param.iPen.iX = param.iPen.iY = 0;
1437 r = iTestFont->GetCharacterPosition(param);
1439 && param.iPosInText == 2
1440 && param.iPen.iX == 0
1441 && param.iOutputGlyphs == 0);
1443 // 7: Check "Not-a-Char" condition handled
1444 testText = _L16("\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF\xFFFF\xFFFE\xFFFF\xFFFF");
1445 param.iText.Set(testText);
1446 param.iPosInText = 0;
1447 param.iPen.iX = param.iPen.iY = 0;
1448 r = iTestFont->GetCharacterPosition(param);
1450 && param.iPosInText == 1
1451 && param.iPen.iX == 0
1452 && param.iOutputGlyphs == 0);
1454 param.iPosInText = 5;
1455 param.iPen.iX = param.iPen.iY = 0;
1456 r = iTestFont->GetCharacterPosition(param);
1458 && param.iPosInText == 6
1459 && param.iPen.iX == 0
1460 && param.iOutputGlyphs == 0);
1462 // 8. Check that a cluster cannot be made from heterogeneous elements
1463 // (in this case a 6 with a Hindi virama)
1464 testText = _L16("6\x94D");
1465 param.iText.Set(testText);
1466 param.iPosInText = 0;
1467 param.iPen.iX = param.iPen.iY = 0;
1468 r = iTestFont->GetCharacterPosition(param);
1469 TEST(r && param.iOutputGlyphs == 1);
1472 inline TBool IsSupplementary(TUint aChar)
1474 @param aChar The 32-bit code point value of a Unicode character.
1476 @return True, if aChar is supplementary character; false, otherwise.
1479 return (aChar > 0xFFFF);
1482 inline TBool IsSurrogate(TText16 aInt16)
1484 @return True, if aText16 is high surrogate or low surrogate; false, otherwise.
1487 return (aInt16 & 0xF800) == 0xD800;
1490 inline TText16 GetHighSurrogate(TUint aChar)
1492 Retrieve the high surrogate of a supplementary character.
1494 @param aChar The 32-bit code point value of a Unicode character.
1496 @return High surrogate of aChar, if aChar is a supplementary character;
1497 aChar itself, if aChar is not a supplementary character.
1500 return STATIC_CAST(TText16, 0xD7C0 + (aChar >> 10));
1503 inline TText16 GetLowSurrogate(TUint aChar)
1505 Retrieve the low surrogate of a supplementary character.
1507 @param aChar The 32-bit code point value of a Unicode character.
1509 @return Low surrogate of aChar, if aChar is a supplementary character;
1510 zero, if aChar is not a supplementary character.
1513 return STATIC_CAST(TText16, 0xDC00 | (aChar & 0x3FF));
1516 void CTGlyphSelection::TestCodepoint(TUint aCodepoint, CFont* aFont)
1518 This helper routine is used by the test case
1519 CTGlyphSelection::TestCtrlCharsIgnored().
1521 The Unicode character to test.
1523 The font to use in the test.
1526 TInt expectResultPosInText;
1528 const TInt KTestTextLen = 5;
1529 TBuf<16> testText(KTestTextLen);
1532 if (IsSupplementary(aCodepoint))
1534 testText[2] = GetHighSurrogate(aCodepoint);
1535 testText[3] = GetLowSurrogate(aCodepoint);
1536 expectResultPosInText = 4;
1540 testText[2] = aCodepoint;
1542 expectResultPosInText = 3;
1546 CFont::TPositionParam param;
1547 param.iDirection = CFont::EHorizontal;
1548 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1549 param.iText.Set(testText);
1550 param.iPen.iX = param.iPen.iY = 0;
1551 param.iPosInText = 2;
1552 TBool r = aFont->GetCharacterPosition(param);
1554 TEST(r && param.iPosInText == expectResultPosInText
1555 && param.iPen.iX == 0
1556 && param.iOutputGlyphs == 0);
1560 void CTGlyphSelection::TestCtrlCharsIgnored()
1562 This method is a test case to test GetCharacterPosition() copes
1563 with formatting and control characters in the text supplied by
1567 static const TUint testData[] = {
1568 // 1: Formatting control codes Unicode3-p499&p500
1569 0x200C, 0x200D, 0x200E, 0x200F,
1570 0x202A, 0x202B, 0x202C, 0x202D, 0x202E,
1571 // 3: Non-character codes Unicode3-p846 U+FFFE?
1574 // 4: Latin Ctrl codes U+0000..U+001F, U+007F Unicode3-p???
1575 // 5: Latin Supplement Ctrl code U+0080..U+009F Unicode3-p???
1576 // 6: Supplementary characters (scripts outside BMP still not supported)
1578 static const TUint testDataLength = sizeof(testData)/sizeof(testData[0]);
1580 for (TUint i = 0; i < testDataLength; i++)
1581 TestCodepoint(testData[i], iTestFont);
1585 void CTGlyphSelection::TestLatinChars()
1587 This method is a test case to test GetCharacterPosition() correctly
1588 processes characters from the Latin code page returning appropriate glyphs
1593 CFont::TPositionParam param;
1594 param.iDirection = CFont::EHorizontal;
1595 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1596 _LIT16(KText_aBc_1, "aBc 1");
1597 param.iText.Set(KText_aBc_1);
1599 // 1: Latin glyph at start of text
1600 param.iPosInText = 0;
1601 param.iPen.iX = param.iPen.iY = 0;
1602 r = iTestFont->GetCharacterPosition(param);
1603 TEST(r && param.iPosInText == 1
1604 && param.iPen.iX == 10
1605 && param.iOutputGlyphs == 1
1606 && param.iOutput[0].iCode == 'a');
1608 // 2: Latin glyph in middle of text
1609 param.iPosInText = 1;
1610 param.iPen.iX = param.iPen.iY = 0;
1611 r = iTestFont->GetCharacterPosition(param);
1612 TEST(r && param.iPosInText == 2
1613 && param.iPen.iX == 10
1614 && param.iOutputGlyphs == 1
1615 && param.iOutput[0].iCode == 'B');
1617 // 3: Latin glyph at end of text
1618 param.iPosInText = 4;
1619 param.iPen.iX = param.iPen.iY = 0;
1620 r = iTestFont->GetCharacterPosition(param);
1621 TEST(r && param.iPosInText == 5
1622 && param.iPen.iX == 10
1623 && param.iOutputGlyphs == 1
1624 && param.iOutput[0].iCode == '1');
1626 // 4: Latin space glyph
1627 param.iPosInText = 3;
1628 param.iPen.iX = param.iPen.iY = 0;
1629 r = iTestFont->GetCharacterPosition(param);
1630 TEST(r && param.iPosInText == 4
1631 && param.iPen.iX == 10
1632 && param.iOutputGlyphs == 1
1633 && param.iOutput[0].iCode == ' ');
1637 void CTGlyphSelection::TestSoftHyphen()
1639 This method is a test case to test GetCharacterPosition() correctly
1640 processes soft hyphen chars by ignoring them if they are NOT at the
1641 end of the text (aka end of the line).
1645 CFont::TPositionParam param;
1646 param.iDirection = CFont::EHorizontal;
1647 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1648 _LIT16(KText_DKNY, "DK\xadNY\xad");
1649 param.iText.Set(KText_DKNY);
1651 // 1: Invoke on char before hyphen position
1652 // This test returns only the glyph of the char before the hyphen
1653 // treating the hyphen as another base char which end scanning.
1654 param.iPosInText = 1;
1655 param.iPen.iX = param.iPen.iY = 0;
1656 r = iTestFont->GetCharacterPosition(param);
1657 TEST(r && param.iPosInText == 2
1658 && param.iPen.iX == 10
1659 && param.iOutputGlyphs == 1
1660 && param.iOutput[0].iCode == 'K');
1662 // 2: Invoke on hyphen position
1663 // This test should show it ignores and skips soft hyphens returning
1664 // no hyphen glyph. This is because soft hyphen are not visible when
1665 // in middle of lines.
1666 param.iPosInText = 2;
1667 param.iPen.iX = param.iPen.iY = 0;
1668 r = iTestFont->GetCharacterPosition(param);
1669 TEST(r && param.iPosInText == 3
1670 && param.iPen.iX == 0
1671 && param.iOutputGlyphs == 0);
1673 // 3: Invoke on hyphen position when hyphen at end of text
1674 // This test should result in the hyphen glyph being returned as it
1675 // is expect to be visible when it is at the end of the text supplied.
1676 param.iPosInText = 5;
1677 param.iPen.iX = param.iPen.iY = 0;
1678 r = iTestFont->GetCharacterPosition(param);
1679 TEST(r && param.iPosInText == 6
1680 && param.iPen.iX == 10
1681 && param.iOutputGlyphs == 1
1682 && param.iOutput[0].iCode == 0x00AD);
1687 void CTGlyphSelection::TestSurrogates()
1689 This method is a test case to test GetCharacterPosition() correctly
1690 processes surrogate pairs.
1693 static const TUint validPairs[] = {
1694 // Hi Lo Code Hi Lo Code Hi Lo Code
1695 0xD800, 0xDC00, 0x00010000, 0xD800, 0xDE9A, 0x0001029A, 0xD800, 0xDFFF, 0x000103FF,
1696 0xD89A, 0xDC00, 0x00036800, 0xD89A, 0xDE9A, 0x00036A9A, 0xD89A, 0xDFFF, 0x00036BFF,
1697 0xDBFF, 0xDC00, 0x0010FC00, 0xDBFF, 0xDE9A, 0x0010FE9A, 0xDBFF, 0xDFFF, 0x0010FFFF
1699 static const TUint validPairsLength = sizeof(validPairs)/sizeof(TText16);
1702 TBuf<20> testText(0);
1703 CFont::TPositionParam param;
1704 param.iDirection = CFont::EHorizontal;
1705 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1707 // 1: Test valid surrogate pair chars
1708 testText.SetLength(5);
1712 param.iText.Set(testText);
1713 for (TUint i = 0; i < validPairsLength/3; i+=3)
1715 testText[1] = (TText16) validPairs[i];
1716 testText[2] = (TText16) validPairs[i+1];
1717 param.iPosInText = 1;
1718 param.iPen.iX = param.iPen.iY = 0;
1719 r = iTestFont->GetCharacterPosition(param);
1720 TEST(r && param.iPosInText == 3
1721 && param.iPen.iX == 10
1722 && param.iOutputGlyphs == 1
1723 && param.iOutput[0].iCode == validPairs[i+2]);
1726 // 2: Test unpaired high surrogate chars
1727 testText[1] = 0xD809;
1729 param.iPosInText = 1;
1730 param.iPen.iX = param.iPen.iY = 0;
1731 r = iTestFont->GetCharacterPosition(param);
1732 TEST(r && param.iPosInText == 2
1733 && param.iPen.iX == 0
1734 && param.iOutputGlyphs == 0);
1736 // 3: Test unpaired low surrogate chars
1738 testText[2] = 0xDC09;
1739 param.iPosInText = 2;
1740 param.iPen.iX = param.iPen.iY = 0;
1741 r = iTestFont->GetCharacterPosition(param);
1742 TEST(r && param.iPosInText == 3
1743 && param.iPen.iX == 0
1744 && param.iOutputGlyphs == 0);
1746 // 4: Test latin/surrogate boundry ensuring surrogate not skipped!
1747 testText[1] = (TText16) validPairs[0];
1748 testText[2] = (TText16) validPairs[1];
1749 param.iPosInText = 0;
1750 param.iPen.iX = param.iPen.iY = 0;
1751 r = iTestFont->GetCharacterPosition(param);
1752 TEST(r && param.iPosInText == 1
1753 && param.iPen.iX == 10
1754 && param.iOutputGlyphs == 1
1755 && param.iOutput[0].iCode =='a');
1760 @SYMTestCaseID TI18N-GDI-CIT-4077
1761 @SYMTestCaseDesc Automated GDI testing for GB18030 ExtB
1762 @SYMTestPriority High
1763 @SYMTestActions Attempt to get glyph information for GB18030 ExtB characters.
1764 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
1765 @SYMPREQ 2471: UTF-16 compliant text handling
1767 void CTGlyphSelection::TestNonBmpCharsInGB18030(CFbsFont* aFont)
1769 INFO_PRINTF1(_L("Test GB18030 non-BMP Glyphs"));
1773 TBuf<30> testText(0);
1774 CFont::TPositionParam param;
1775 param.iDirection = CFont::EHorizontal;
1776 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1778 testText.SetLength(4);
1780 // 201AD = D840, DDAD
1781 testText[0] = 0xD840;
1782 testText[1] = 0xDDAD;
1784 // 253BB = D854, DFBB
1785 testText[2] = 0xD854;
1786 testText[3] = 0xDFBB;
1788 param.iText.Set(testText);
1790 RShapeInfo aShapeInfo;
1794 param.iPosInText = 0;
1795 param.iPen.iX = param.iPen.iY = 0;
1796 r = aFont->GetCharacterPosition2(param, aShapeInfo);
1798 TEST(r && param.iPosInText == 2
1799 && param.iOutputGlyphs == 1
1800 && param.iOutput[0].iCode == 0x000201AD);
1802 INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
1804 param.iPosInText = 2;
1805 param.iPen.iX = param.iPen.iY = 0;
1806 r = aFont->GetCharacterPosition2(param, aShapeInfo);
1808 TEST(r && param.iPosInText == 4
1809 && param.iOutputGlyphs == 1
1810 && param.iOutput[0].iCode == 0x000253BB);
1813 INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
1815 // Close aShapeInfo which releases any memory it is occupying
1816 if (aShapeInfo.IsOpen())
1822 void CTGlyphSelection::TestCombiningLatinChars()
1824 This method is a test case to test GetCharacterPosition() correctly
1825 processes regular latin characters with diacritics.
1829 TBuf<20> testText(0);
1830 CFont::TPositionParam param;
1831 param.iDirection = CFont::EHorizontal;
1832 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
1834 testText.SetLength(10);
1838 testText[3] = 0x0300; // Above Grave Acent
1840 testText[5] = 0x0330; // Below Tidle
1842 testText[7] = 0x0308; // Above Diaeresis
1843 testText[8] = 0x032F; // Below Inverted Breve
1845 param.iText.Set(testText);
1847 // 1: Latin base with following space
1848 param.iPosInText = 0;
1849 param.iPen.iX = param.iPen.iY = 0;
1850 r = iTestFont->GetCharacterPosition(param);
1851 TEST(r && param.iPosInText == 1
1852 && param.iPen.iX == 10
1853 && param.iOutputGlyphs == 1
1854 && param.iOutput[0].iCode == 'A');
1856 // 2: Latin base with 1 combining above diacritic
1857 param.iPosInText = 2;
1858 param.iPen.iX = param.iPen.iY = 0;
1859 r = iTestFont->GetCharacterPosition(param);
1860 // Will Compose A (0x41) followed by grave accent (0x300) into A grave (0xC0)
1861 TEST(r && param.iPosInText == 4
1862 && param.iPen.iX == 10
1863 && param.iOutputGlyphs == 1
1864 && param.iOutput[0].iCode == 0xC0
1865 && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
1866 && param.iOutput[0].iBounds.iBr == TPoint(10,2));
1868 // 3: Latin base with 1 combining below diacritic
1869 param.iPosInText = 4;
1870 param.iPen.iX = param.iPen.iY = 0;
1871 r = iTestFont->GetCharacterPosition(param);
1872 // Will compose I (0x49) with tilde below (0x330) into I with tilde below (0x1E2C)
1873 TEST(r && param.iPosInText == 6
1874 && param.iPen.iX == 10
1875 && param.iOutputGlyphs == 1
1876 && param.iOutput[0].iCode == 0x1E2C
1877 && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
1878 && param.iOutput[0].iBounds.iBr == TPoint(10,2));
1880 // 4: Latin base with 2 combining diacritic
1881 param.iPosInText = 6;
1882 param.iPen.iX = param.iPen.iY = 0;
1883 r = iTestFont->GetCharacterPosition(param);
1884 TEST(r && param.iPosInText == 9
1885 && param.iPen.iX == 10
1886 && param.iOutputGlyphs == 3
1887 && param.iOutput[0].iCode == 'o'
1888 && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
1889 && param.iOutput[0].iBounds.iBr == TPoint(10,2)
1890 && param.iOutput[1].iCode == 0x0308
1891 && param.iOutput[1].iBounds.iTl == TPoint(0,-23)
1892 && param.iOutput[1].iBounds.iBr == TPoint(10,-11)
1893 && param.iOutput[2].iCode == 0x032F
1894 && param.iOutput[2].iBounds.iTl == TPoint(0,3)
1895 && param.iOutput[2].iBounds.iBr == TPoint(10,15));
1897 // 5: Latin base with 9 combining chars, should exceed max output!
1899 testText[1] = 0x0300; // Above Grave Acent
1900 testText[2] = 0x0330; // Below Tidle
1901 testText[3] = 0x0308; // Above Diaeresis
1902 testText[4] = 0x032F; // Below Inverted Breve
1903 testText[5] = 0x0300; // Above Grave Acent
1904 testText[6] = 0x0330; // Below Tidle
1905 testText[7] = 0x0308; // Above Diaeresis
1906 testText[8] = 0x032F; // Below Inverted Breve
1907 testText[9] = 0x0300; // Above Grave Acent
1908 param.iPosInText = 0;
1909 param.iPen.iX = param.iPen.iY = 0;
1910 r = iTestFont->GetCharacterPosition(param);
1911 TEST(r && param.iPosInText == 8
1912 && param.iPen.iX == 10
1913 && param.iOutputGlyphs == 8
1914 && param.iOutput[0].iCode == 'a'
1915 && param.iOutput[7].iCode == 0x0308);
1919 Used for cleanup of RImplInfoArray implementationArray below
1920 This method is stolen from FbsTop.cpp
1923 LOCAL_C void ResetAndDestroyRImplInfoPtrArray(TAny* aPtr)
1925 RImplInfoPtrArray* array = reinterpret_cast <RImplInfoPtrArray*> (aPtr);
1926 array->ResetAndDestroy();
1929 LOCAL_C void LoadOpenFontLibraries(CFontStore* aFontStore)
1932 RImplInfoPtrArray implementationArray;
1933 TCleanupItem cleanup(ResetAndDestroyRImplInfoPtrArray, &implementationArray);
1934 CleanupStack::PushL(cleanup);
1938 TUid uid = {KUidOpenFontRasterizerPlunginInterface};
1940 // Making sure that no race situation arises
1941 // If ECom is not ready, give it another chance and try again. if it still doesn't work
1942 // after the third try, then it just carries on quietly and fails...
1943 for (ecomnotready =0; ecomnotready <3; ecomnotready++)
1945 TRAP(ecomerror,REComSession::ListImplementationsL(uid,implementationArray));
1957 const TInt availCount = implementationArray.Count();
1958 for (TInt count=0;count<availCount;++count)
1960 const CImplementationInformation* info = implementationArray[count];
1961 TUid rasterizerUid = info->ImplementationUid();
1962 // Create a rasterizer
1963 COpenFontRasterizer* rasterizer=0;
1964 TRAP(error,rasterizer = COpenFontRasterizer::NewL(rasterizerUid));
1967 // Install it in the font store.
1968 TRAP(error,aFontStore->InstallRasterizerL(rasterizer));
1973 CleanupStack::PopAndDestroy(&implementationArray);
1977 void CTGlyphSelection::TestIsolatedCombiningLatinChars()
1979 This method is a test case to test GetCharacterPosition() correctly
1980 processes isloated combining marks.
1983 // Need to use a valid font so that GetCharacterPosition will be able to find the necessary glyph information.
1984 _LIT16(KTestFontFile, "C:\\s60ssb_v500.ttf");
1985 _LIT16(KTestFontFaceName, "Series 60 Sans");
1987 // create a font store for testing
1988 CFontStore* fontStore = CFontStore::NewL(&User::Heap());
1989 //load all ecom implemented rasterizer dlls. installs the rasterizer.
1990 LoadOpenFontLibraries(fontStore);
1991 // test font preparation
1992 fontStore->iKPixelWidthInTwips = 11860; //This value is default
1993 //add any required font files
1994 TUid err = fontStore->AddFileL(KTestFontFile);
1995 TFontSpec testFontSpec(KTestFontFaceName,200);
1997 CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
1999 TInt ret = bmp->Create(TSize(100,100),EGray2);
2000 if (ret == KErrNotSupported)
2003 User::LeaveIfError(ret);
2005 CFbsBitmapDevice* device = NULL;
2006 TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
2007 TEST(err2 == KErrNone);
2009 CFbsBitGc* gc = NULL;
2010 User::LeaveIfError(device->CreateContext(gc));
2011 // Font file Creation
2012 CFbsFont* testFont = NULL;
2013 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(testFont,testFontSpec));
2014 gc->UseFont(testFont);
2015 CleanupStack::PushL(testFont);
2017 // Now start the test case:
2020 TBuf<20> testText(0);
2021 CFont::TPositionParam param;
2022 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2024 testText.SetLength(7);
2025 testText[0] = 0x0323; //Below Dot
2027 testText[2] = 0x0300; //Above Grave Acent
2029 testText[4] = 0x0323; //Below Dot
2030 testText[5] = 0x0300; //Above Grave Acent
2031 testText[6] = 0x0301; //Above Acute Acent
2032 param.iText.Set(testText);
2034 // 1: Test the bounds for combining below mark in isolation
2035 param.iPosInText = 0;
2036 param.iPen.iX = param.iPen.iY = 0;
2037 r = testFont->GetCharacterPosition(param);
2039 TEST(r && param.iPosInText == 1
2040 && param.iOutputGlyphs == 1
2041 && param.iOutput[0].iCode == 0x0323);
2043 #if defined __WINS__ || defined __WINSCW__
2044 TEST(r && param.iPen == TPoint(0,0)
2045 && param.iOutput[0].iBounds.iTl == TPoint(-6,1)
2046 && param.iOutput[0].iBounds.iBr == TPoint(-4,3));
2049 // 2: Test the bounds for combining above mark in isolation
2050 param.iPosInText = 1;
2051 param.iPen.iX = param.iPen.iY = 0;
2052 r = testFont->GetCharacterPosition(param);
2054 TEST(r && param.iPosInText == 3
2055 && param.iOutputGlyphs == 2
2056 && param.iOutput[1].iCode == 0x0300);
2058 #if defined __WINS__ || defined __WINSCW__
2059 TEST(r && param.iPen == TPoint(4,0)
2060 && param.iOutput[1].iBounds.iTl == TPoint(-2,-15)
2061 && param.iOutput[1].iBounds.iBr == TPoint(2,-12));
2064 // 3: Test the bounds for multiple combing marks in isolation
2065 param.iPosInText = 3;
2066 param.iPen.iX = param.iPen.iY = 0;
2067 r = testFont->GetCharacterPosition(param);
2069 TEST(r && param.iPosInText == 7
2070 && param.iOutputGlyphs == 4
2071 && param.iOutput[1].iCode == 0x0323
2072 && param.iOutput[2].iCode == 0x0300
2073 && param.iOutput[3].iCode == 0x0301);
2075 #if defined __WINS__ || defined __WINSCW__
2076 TEST(r && param.iPen == TPoint(4,0)
2077 && param.iOutput[1].iBounds.iTl == TPoint(-1,1)
2078 && param.iOutput[1].iBounds.iBr == TPoint(1,3)
2079 && param.iOutput[2].iBounds.iTl == TPoint(-2,-16)
2080 && param.iOutput[2].iBounds.iBr == TPoint(2,-13)
2081 && param.iOutput[3].iBounds.iTl == TPoint(-2,-20)
2082 && param.iOutput[3].iBounds.iBr == TPoint(2,-17));
2085 // Done with the font, pop it off.
2086 CleanupStack::Pop(testFont);
2088 //Cleaning the memory
2092 fontStore->RemoveFile(err);
2094 REComSession::FinalClose();
2098 void CTGlyphSelection::TestContextInShapeInfo()
2100 This method is a test case to test GetCharacterPosition2() correctly
2105 TBuf<20> testText(0);
2106 CFont::TPositionParam param;
2107 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2108 RShapeInfo shapeInfo;
2110 //test control characters which has not defined processFun in TTableEntry
2111 testText.SetLength(7);
2112 testText[0] = 0xffff; //control character, test for the range { 0xFFFE, 0xFFFF, 0}
2114 testText[2] = 0x200E; //control character, test for the range { 0x200C, 0x200F, 0}
2117 testText[5] = 0x202A; //control character, test for the range { 0x202A, 0x202E, 0}
2120 param.iText.Set(testText);
2122 // 1. Test '0xffff' as NULL context at position zero -
2123 // 0xffff should not be taken as context, and character '1' can be rendered correctly
2124 param.iPosInText = 1;
2125 param.iPen.iX = param.iPen.iY = 0;
2126 r = iTestFont->GetCharacterPosition2(param, shapeInfo);
2127 TEST(r && param.iPosInText == 2
2128 && param.iOutputGlyphs == 1
2129 && param.iOutput[0].iCode == 49);
2131 // 2. Test '0x200E' - 0x200E is not rendered, either not treated as context.
2132 // character '.' and 'a' should be rendered correctly.
2133 param.iPosInText = 2;
2134 param.iPen.iX = param.iPen.iY = 0;
2135 r = iTestFont->GetCharacterPosition2(param, shapeInfo);
2136 TEST(r && param.iPosInText == 3
2137 && param.iOutputGlyphs == 0);
2139 param.iPosInText = 3;
2140 param.iPen.iX = param.iPen.iY = 0;
2141 r = iTestFont->GetCharacterPosition2(param, shapeInfo);
2142 TEST(r && param.iPosInText == 4
2143 && param.iOutputGlyphs == 1
2144 && param.iOutput[0].iCode == 46);
2146 param.iPosInText = 4;
2147 param.iPen.iX = param.iPen.iY = 0;
2148 r = iTestFont->GetCharacterPosition2(param, shapeInfo);
2149 TEST(r && param.iPosInText == 5
2150 && param.iOutputGlyphs == 1
2151 && param.iOutput[0].iCode == 'a');
2153 // 3. Test '0x202A' - 0x202A is not rendered, either not treated as context.
2154 // character ',' should be rendered correctly.
2155 param.iPosInText = 5;
2156 param.iPen.iX = param.iPen.iY = 0;
2157 r = iTestFont->GetCharacterPosition2(param, shapeInfo);
2158 TEST(r && param.iPosInText == 6
2159 && param.iOutputGlyphs == 0);
2161 param.iPosInText = 6;
2162 param.iPen.iX = param.iPen.iY = 0;
2163 r = iTestFont->GetCharacterPosition2(param, shapeInfo);
2164 TEST(r && param.iPosInText == 7
2165 && param.iOutputGlyphs == 1
2166 && param.iOutput[0].iCode == 44);
2170 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CT-0221
2171 @SYMTestCaseDesc Test support for Vietnamese characters.
2172 @SYMTestPriority High
2173 @SYMTestActions Attempt to compose various valid and invalid Vietnamese glyph clusters.
2174 @SYMTestExpectedResults The test must not fail.
2175 @SYMPREQ 402: GDI for Bravo.
2177 void CTGlyphSelection::TestVietnameseChars()
2180 This method is a test case to test GetCharacterPosition() correctly
2181 processes Vietnamese characters.
2184 TBuf<41> testText(0);
2185 CFont::TPositionParam param;
2186 param.iDirection = CFont::EHorizontal;
2187 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2189 testText.SetLength(41);
2191 testText[0] = 0x0055; // capital U
2192 testText[1] = 0x031B; // combining horn - expect 0x01AF (succeed)
2194 testText[2] = 0x0055; // capital U
2195 testText[3] = 0x0027; // apostrophe - expect 0x0055 (fail)
2197 testText[4] = 0x0055; // capital U
2198 testText[5] = 0x02B9; // modifier prime - expect 0x0055 (fail)
2200 testText[6] = 0x0055; // capital U
2201 testText[7] = 0x02BC; // modifier apostrophe - expect 0x0055 (fail)
2203 testText[8] = 0x0055; // capital U
2204 testText[9] = 0x0315; // combining comma above right - expect 0x0055, 0x0315 (fail)
2206 testText[10] = 0x0055; // capital U
2207 testText[11] = 0x2019; // right single quote mark - expect 0x0055 (fail)
2209 testText[12] = 0x01AF; // capital U with horn
2210 testText[13] = 0x0020; // space - expect 0x01AF (succeed)
2212 testText[14] = 0x0045; // capital E
2213 testText[15] = 0x031B; // combining horn - expect 0x0045, 0x031B (fail)
2215 testText[16] = 0x0041; // capital A
2216 testText[17] = 0x0306; // combining breve
2217 testText[18] = 0x0301; // combining acute - expect 0x1EAE (succeed)
2219 testText[19] = 0x0102; // capital A with breve
2220 testText[20] = 0x0301; // combining acute - expect 0x1EAE (succeed)
2222 testText[21] = 0x0041; // capital A
2223 testText[22] = 0x0301; // combining acute
2224 testText[23] = 0x0306; // combining breve - expect 0x0041, 0x0301, 0x0306 (fail)
2226 testText[24] = 0x0041; // capital A
2227 testText[25] = 0x0323; // combining dot below
2228 testText[26] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
2230 testText[27] = 0x1EA0; // capital A with dot below
2231 testText[28] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
2233 testText[29] = 0x0102; // capital A with breve
2234 testText[30] = 0x0323; // combining dot below - expect 0x0102, 0x0323 (fail)
2236 testText[31] = 0x0045; // capital A
2237 testText[32] = 0x0302; // combining circumflex
2238 testText[33] = 0x0301; // combining acute - expect 0x1EBE (succeed)
2240 testText[34] = 0x00CA; // capital A with circumflex
2241 testText[35] = 0x0301; // combining acute - expect 0x1EBE (succeed)
2243 testText[36] = 0x004F; // capital O
2244 testText[37] = 0x031B; // combining horn
2245 testText[38] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
2247 testText[39] = 0x01A0; // capital O with horn
2248 testText[40] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
2250 param.iText.Set(testText);
2252 // 1: Capital U with combining horn
2253 param.iPosInText = 0;
2254 param.iPen.iX = param.iPen.iY = 0;
2255 r = iTestFont->GetCharacterPosition(param);
2256 TEST(r && param.iPosInText == 2
2257 && param.iPen.iX == 10
2258 && param.iOutputGlyphs == 1
2259 && param.iOutput[0].iCode == 0x01AF);
2261 // 2: Capital U with apostrophe
2262 param.iPosInText = 2;
2263 param.iPen.iX = param.iPen.iY = 0;
2264 r = iTestFont->GetCharacterPosition(param);
2265 TEST(r && param.iPosInText == 3
2266 && param.iPen.iX == 10
2267 && param.iOutputGlyphs == 1
2268 && param.iOutput[0].iCode == 0x0055);
2270 // 3: Capital U with modifier prime
2271 param.iPosInText = 4;
2272 param.iPen.iX = param.iPen.iY = 0;
2273 r = iTestFont->GetCharacterPosition(param);
2274 TEST(r && param.iPosInText == 5
2275 && param.iPen.iX == 10
2276 && param.iOutputGlyphs == 1
2277 && param.iOutput[0].iCode == 0x0055);
2279 // 4: Capital U with modifier apostrophe
2280 param.iPosInText = 6;
2281 param.iPen.iX = param.iPen.iY = 0;
2282 r = iTestFont->GetCharacterPosition(param);
2283 TEST(r && param.iPosInText == 7
2284 && param.iPen.iX == 10
2285 && param.iOutputGlyphs == 1
2286 && param.iOutput[0].iCode == 0x0055);
2288 // 5: Capital U with combining comma above right
2289 param.iPosInText = 8;
2290 param.iPen.iX = param.iPen.iY = 0;
2291 r = iTestFont->GetCharacterPosition(param);
2292 TEST(r && param.iPosInText == 10
2293 && param.iPen.iX == 10
2294 && param.iOutputGlyphs == 2
2295 && param.iOutput[0].iCode == 0x0055
2296 && param.iOutput[1].iCode == 0x0315);
2298 // 6: Capital U with right single quote
2299 param.iPosInText = 10;
2300 param.iPen.iX = param.iPen.iY = 0;
2301 r = iTestFont->GetCharacterPosition(param);
2302 TEST(r && param.iPosInText == 11
2303 && param.iPen.iX == 10
2304 && param.iOutputGlyphs == 1
2305 && param.iOutput[0].iCode == 0x0055);
2307 // 7: Capital U with horn plus space
2308 param.iPosInText = 12;
2309 param.iPen.iX = param.iPen.iY = 0;
2310 r = iTestFont->GetCharacterPosition(param);
2311 TEST(r && param.iPosInText == 13
2312 && param.iPen.iX == 10
2313 && param.iOutputGlyphs == 1
2314 && param.iOutput[0].iCode == 0x01AF);
2316 // 8: Capital E with combining horn
2317 param.iPosInText = 14;
2318 param.iPen.iX = param.iPen.iY = 0;
2319 r = iTestFont->GetCharacterPosition(param);
2320 TEST(r && param.iPosInText == 16
2321 && param.iPen.iX == 10
2322 && param.iOutputGlyphs == 2
2323 && param.iOutput[0].iCode == 0x0045
2324 && param.iOutput[1].iCode == 0x031B);
2326 // 9: Capital A with combining breve with combining acute
2327 param.iPosInText = 16;
2328 param.iPen.iX = param.iPen.iY = 0;
2329 r = iTestFont->GetCharacterPosition(param);
2330 TEST(r && param.iPosInText == 19
2331 && param.iPen.iX == 10
2332 && param.iOutputGlyphs == 1
2333 && param.iOutput[0].iCode == 0x1EAE);
2335 // 10: Capital A with breve with combining acute
2336 param.iPosInText = 19;
2337 param.iPen.iX = param.iPen.iY = 0;
2338 r = iTestFont->GetCharacterPosition(param);
2339 TEST(r && param.iPosInText == 21
2340 && param.iPen.iX == 10
2341 && param.iOutputGlyphs == 1
2342 && param.iOutput[0].iCode == 0x1EAE);
2344 // 11: Capital A with combining acute with combining breve
2345 param.iPosInText = 21;
2346 param.iPen.iX = param.iPen.iY = 0;
2347 r = iTestFont->GetCharacterPosition(param);
2348 TEST(r && param.iPosInText == 24
2349 && param.iPen.iX == 10
2350 && param.iOutputGlyphs == 3
2351 && param.iOutput[0].iCode == 0x0041
2352 && param.iOutput[1].iCode == 0x0301
2353 && param.iOutput[2].iCode == 0x0306);
2355 // 12: Capital A with combining dot below with combining breve
2356 param.iPosInText = 24;
2357 param.iPen.iX = param.iPen.iY = 0;
2358 r = iTestFont->GetCharacterPosition(param);
2359 TEST(r && param.iPosInText == 27
2360 && param.iPen.iX == 10
2361 && param.iOutputGlyphs == 1
2362 && param.iOutput[0].iCode == 0x1EB6);
2364 // 13: Capital A with dot below with combining breve
2365 param.iPosInText = 27;
2366 param.iPen.iX = param.iPen.iY = 0;
2367 r = iTestFont->GetCharacterPosition(param);
2368 TEST(r && param.iPosInText == 29
2369 && param.iPen.iX == 10
2370 && param.iOutputGlyphs == 1
2371 && param.iOutput[0].iCode == 0x1EB6);
2373 // 14: Capital A with breve with combining dot below
2374 param.iPosInText = 29;
2375 param.iPen.iX = param.iPen.iY = 0;
2376 r = iTestFont->GetCharacterPosition(param);
2377 TEST(r && param.iPosInText == 31
2378 && param.iPen.iX == 10
2379 && param.iOutputGlyphs == 2
2380 && param.iOutput[0].iCode == 0x0102
2381 && param.iOutput[1].iCode == 0x0323);
2383 // 15: Capital A with combining circumflex with combining acute
2384 param.iPosInText = 31;
2385 param.iPen.iX = param.iPen.iY = 0;
2386 r = iTestFont->GetCharacterPosition(param);
2387 TEST(r && param.iPosInText == 34
2388 && param.iPen.iX == 10
2389 && param.iOutputGlyphs == 1
2390 && param.iOutput[0].iCode == 0x1EBE);
2392 // 16: Capital A with circumflex with combining acute
2393 param.iPosInText = 34;
2394 param.iPen.iX = param.iPen.iY = 0;
2395 r = iTestFont->GetCharacterPosition(param);
2396 TEST(r && param.iPosInText == 36
2397 && param.iPen.iX == 10
2398 && param.iOutputGlyphs == 1
2399 && param.iOutput[0].iCode == 0x1EBE);
2401 // 17: Capital O with combining horn with combing hook above
2402 param.iPosInText = 36;
2403 param.iPen.iX = param.iPen.iY = 0;
2404 r = iTestFont->GetCharacterPosition(param);
2405 TEST(r && param.iPosInText == 39
2406 && param.iPen.iX == 10
2407 && param.iOutputGlyphs == 1
2408 && param.iOutput[0].iCode == 0x1EDE);
2410 // 18: Capital O with horn with combing hook above
2411 param.iPosInText = 39;
2412 param.iPen.iX = param.iPen.iY = 0;
2413 r = iTestFont->GetCharacterPosition(param);
2414 TEST(r && param.iPosInText == 41
2415 && param.iPen.iX == 10
2416 && param.iOutputGlyphs == 1
2417 && param.iOutput[0].iCode == 0x1EDE);
2421 void CTGlyphSelection::TestNonBmpCharsL()
2423 // create a font store for testing
2424 CFontStore* fontStore = CFontStore::NewL(&User::Heap());
2426 //load all ecom implemented rasterizer dlls. installs the rasterizer.
2427 LoadOpenFontLibraries(fontStore);
2428 // test font preparation
2429 fontStore->iKPixelWidthInTwips = 11860; //This value is default
2431 //add any required font files
2432 TUid err = fontStore->AddFileL(KTestGB18030FontFile);
2434 TFontSpec testGB18030FontSpec(KTestGB18030FontFaceName,200);
2436 CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
2438 TInt ret = bmp->Create(TSize(100,100),EGray2);
2439 if (ret == KErrNotSupported)
2442 User::LeaveIfError(ret);
2444 CFbsBitmapDevice* device = NULL;
2445 TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
2446 TEST(err2 == KErrNone);
2448 CFbsBitGc* gc = NULL;
2449 User::LeaveIfError(device->CreateContext(gc));
2450 // Font file Creation
2451 CFbsFont* gb18030Font = NULL;
2452 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(gb18030Font,testGB18030FontSpec));
2453 gc->UseFont(gb18030Font);
2454 CleanupStack::PushL(gb18030Font);
2456 //Testcode for GB18030
2457 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
2458 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("TI18N-GDI-CIT-4077"));
2459 TestNonBmpCharsInGB18030(gb18030Font);
2460 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
2462 CleanupStack::Pop(gb18030Font);
2464 //Cleaning the memory
2468 fontStore->RemoveFile(err);
2470 REComSession::FinalClose();
2474 void CTGlyphSelection::TestTextDirection()
2476 This method is a test case to test GetCharacterPosition() correctly
2477 produces glyph bounding boxes and utilizes various pen offsets in
2478 a horizontal and vertical context.
2482 TBuf<20> testText(0);
2483 CFont::TPositionParam param;
2484 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2486 testText.SetLength(5);
2492 param.iText.Set(testText);
2494 // 1: Test horizontal text pen advancement & bounds
2495 param.iDirection = CFont::EHorizontal;
2496 param.iPosInText = 0;
2497 param.iPen.iX = param.iPen.iY = 0;
2498 r = iTestFont->GetCharacterPosition(param);
2499 TEST(r && param.iPosInText == 1
2500 && param.iPen == TPoint(10,0)
2501 && param.iOutputGlyphs == 1
2502 && param.iOutput[0].iCode == 'a'
2503 && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
2504 && param.iOutput[0].iBounds.iBr == TPoint(10,2));
2505 // add check for bounds
2507 // 2: Test horizontal text pen advancement with +ve pen offset
2508 param.iPosInText = 4;
2511 r = iTestFont->GetCharacterPosition(param);
2512 TEST(r && param.iPosInText == 5
2513 && param.iPen == TPoint(30,12)
2514 && param.iOutputGlyphs == 1
2515 && param.iOutput[0].iCode == '1'
2516 && param.iOutput[0].iBounds.iTl == TPoint(20,2)
2517 && param.iOutput[0].iBounds.iBr == TPoint(30,14));
2519 // 3: Test horizontal text pen advancement with -ve pen offset
2520 param.iPosInText = 4;
2521 param.iPen.iX = -10;
2522 param.iPen.iY = -24;
2523 r = iTestFont->GetCharacterPosition(param);
2524 TEST(r && param.iPosInText == 5
2525 && param.iPen == TPoint(0,-24)
2526 && param.iOutputGlyphs == 1
2527 && param.iOutput[0].iCode == '1'
2528 && param.iOutput[0].iBounds.iTl == TPoint(-10,-34)
2529 && param.iOutput[0].iBounds.iBr == TPoint(0,-22));
2531 // 4: Test vertical text pen advancement & bounds
2532 param.iDirection = CFont::EVertical;
2533 param.iPosInText = 1;
2534 param.iPen.iX = param.iPen.iY = 0;
2535 r = iTestFont->GetCharacterPosition(param);
2536 TEST(r && param.iPosInText == 2
2537 && param.iPen == TPoint(0,12)
2538 && param.iOutputGlyphs == 1
2539 && param.iOutput[0].iCode == 'B'
2540 && param.iOutput[0].iBounds.iTl == TPoint(0,0)
2541 && param.iOutput[0].iBounds.iBr == TPoint(10,12));
2543 // 5: Test vertical text pen advancement with +ve pen offset
2544 param.iPosInText = 4;
2547 r = iTestFont->GetCharacterPosition(param);
2548 TEST(r && param.iPosInText == 5
2549 && param.iPen == TPoint(20,24)
2550 && param.iOutputGlyphs == 1
2551 && param.iOutput[0].iCode == '1'
2552 && param.iOutput[0].iBounds.iTl == TPoint(20,12)
2553 && param.iOutput[0].iBounds.iBr == TPoint(30,24));
2555 // 6: Test vertical text pen advancement with -ve pen offset
2556 param.iPosInText = 4;
2557 param.iPen.iX = -10;
2558 param.iPen.iY = -24;
2559 r = iTestFont->GetCharacterPosition(param);
2560 TEST(r && param.iPosInText == 5
2561 && param.iPen == TPoint(-10,-12)
2562 && param.iOutputGlyphs == 1
2563 && param.iOutput[0].iCode == '1'
2564 && param.iOutput[0].iBounds.iTl == TPoint(-10,-24)
2565 && param.iOutput[0].iBounds.iBr == TPoint(0,-12));
2568 void CTGlyphSelection::TestAllUnicodeChars()
2570 This method is a test case to test GetCharacterPosition() correctly
2571 processes all the characters in the Unicode code space 0x0000 to
2576 TBuf<8> testText(0);
2577 CFont::TPositionParam param;
2578 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2581 testText.SetLength(1);
2582 for (TUint i = 0xd802; i <= 0xffff; i++)
2584 testText[0] = (TText16) i;
2585 if (i==0x1b) continue; // Skip as CTestFont designed to fail here r==0.
2586 param.iText.Set(testText);
2587 param.iDirection = CFont::EHorizontal;
2588 param.iPosInText = 0;
2589 param.iPen.iX = param.iPen.iY = 0;
2590 r = iTestFont->GetCharacterPosition(param);
2591 if (!r || param.iPosInText != 1)
2594 //RDebug::Print(_L("%04x(%d,%d,%d), "), i, r, param.iPosInText, param.iOutputGlyphs );
2595 //if (errors%8 == 0)
2596 // RDebug::Print(_L("\n"));
2605 #define TEST(a) (void)(a)
2609 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-1580
2610 @SYMTestCaseDesc Automated GDI testing for Hindi
2611 @SYMTestPriority High
2612 @SYMTestActions Attempt to compose various valid and invalid Hindi glyph clusters.
2613 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
2614 @SYMPREQ 18: Hindi for Bravo
2616 void CTGlyphSelection::TestHindiChars(CFbsFont* aFont)
2618 INFO_PRINTF1(_L("Test Hindi Glyphs"));
2622 TBuf<30> testText(0);
2623 CFont::TPositionParam param;
2624 param.iDirection = CFont::EHorizontal;
2625 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2627 testText.SetLength(30);
2629 testText[0] = 0x0930;
2630 testText[1] = 0x093C;
2631 testText[2] = 0x094D;
2632 testText[3] = 0x0915;
2634 testText[4] = 0x0915;
2635 testText[5] = 0x094D;
2636 testText[6] = 0x0915;
2638 testText[7] = 0x0930;
2639 testText[8] = 0x094D;
2640 testText[9] = 0x0915;
2642 testText[10] = 0x0915;
2643 testText[11] = 0x094D;
2644 testText[12] = 0x0930;
2646 testText[13] = 0x0915;
2647 testText[14] = 0x094D;
2648 testText[15] = 0x0937;
2650 testText[16] = 0x0915;
2651 testText[17] = 0x094D;
2652 testText[18] = 0x0930;
2653 testText[19] = 0x094D;
2654 testText[20] = 0x092A;
2656 /* When the following character 0x0036 is shaped, the context will be taken into consideration when
2657 determining the glyph for 0x0036
2658 The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
2660 testText[21] = 0x0036;
2661 testText[22] = 0x094D;
2663 testText[23] = 0x0020;
2665 // INC101103: Strings containing ZWJ do not get rendered properly for Hindi
2666 testText[24] = 0x092E;
2667 testText[25] = 0x094D;
2668 testText[26] = 0x200D;
2669 testText[27] = 0x092E;
2670 testText[28] = 0x093F;
2671 testText[29] = 0x200D;
2673 param.iText.Set(testText);
2675 RShapeInfo aShapeInfo;
2679 param.iPosInText = 0;
2680 param.iPen.iX = param.iPen.iY = 0;
2681 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2683 TEST(r && param.iPosInText == 4
2684 && param.iOutputGlyphs == 2
2685 && param.iOutput[0].iCode == 0x80000108
2686 && param.iOutput[1].iCode == 0x80000072);
2688 #if defined __WINS__ || defined __WINSCW__
2689 TEST(r && param.iPen.iX == 17);
2692 INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
2694 param.iPosInText = 4;
2695 param.iPen.iX = param.iPen.iY = 0;
2696 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2698 TEST(r && param.iPosInText == 7
2699 && param.iOutputGlyphs == 1
2700 && param.iOutput[0].iCode == 0x800001C2);
2702 #if defined __WINS__ || defined __WINSCW__
2703 TEST(r && param.iPen.iX == 12);
2706 INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2708 param.iPosInText = 7;
2709 param.iPen.iX = param.iPen.iY = 0;
2710 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2712 TEST(r && param.iPosInText == 10
2713 && param.iOutputGlyphs == 2
2714 && param.iOutput[0].iCode == 0x80000072
2715 && param.iOutput[1].iCode == 0x80000130);
2717 #if defined __WINS__ || defined __WINSCW__
2718 TEST(r && param.iPen.iX == 11);
2721 INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
2723 param.iPosInText = 10;
2724 param.iPen.iX = param.iPen.iY = 0;
2725 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2727 TEST(r && param.iPosInText == 13
2728 && param.iOutputGlyphs == 1
2729 && param.iOutput[0].iCode == 0x80000136);
2731 #if defined __WINS__ || defined __WINSCW__
2732 TEST(r && param.iPen.iX == 12);
2735 INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2737 param.iPosInText = 13;
2738 param.iPen.iX = param.iPen.iY = 0;
2739 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2741 TEST(r && param.iPosInText == 16
2742 && param.iOutputGlyphs == 1
2743 && param.iOutput[0].iCode == 0x800001BE);
2745 #if defined __WINS__ || defined __WINSCW__
2746 TEST(r && param.iPen.iX == 12);
2749 INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2751 param.iPosInText = 16;
2752 param.iPen.iX = param.iPen.iY = 0;
2753 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2755 TEST(r && param.iPosInText == 21
2756 && param.iOutputGlyphs == 2
2757 && param.iOutput[0].iCode == 0x8000017A
2758 && param.iOutput[1].iCode == 0x80000087);
2760 #if defined __WINS__ || defined __WINSCW__
2761 TEST(r && param.iPen.iX == 18);
2764 INFO_PRINTF6(_L("The result of this shaping is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
2766 /* The following shaping will consider the context when determining the glyph for 0x0036 Digit character
2767 The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
2769 param.iPosInText = 21;
2770 param.iPen.iX = param.iPen.iY = 0;
2771 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2773 TEST(r && param.iPosInText == 22
2774 && param.iOutputGlyphs == 1
2775 && param.iOutput[0].iCode == 0x80000016);
2777 #if defined __WINS__ || defined __WINSCW__
2778 TEST(r && param.iPen.iX == 9);
2781 INFO_PRINTF5(_L("The result of this shaping is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2783 // INC101103: Strings containing ZWJ do not get rendered properly for Hindi
2784 param.iPosInText = 24;
2785 param.iPen.iX = param.iPen.iY = 0;
2786 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2787 // We are mainly testing the position in text after rendering, which should be at the end of the syllable
2788 // that should include the ZWJ and any consonant that follows it
2789 TEST(r && param.iPosInText == 29
2790 && param.iOutputGlyphs == 3
2791 && param.iOutput[0].iCode == 0x80000272
2792 && param.iOutput[1].iCode == 0x80000105
2793 && param.iOutput[2].iCode == 0x8000008B);
2795 // Close aShapeInfo which releases any memory it is occupying
2796 if (aShapeInfo.IsOpen())
2802 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3381
2803 @SYMTestCaseDesc Automated GDI testing for Kannada
2804 @SYMTestPriority High
2805 @SYMTestActions Attempt to compose various valid and invalid Kannada glyph clusters.
2806 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
2807 @SYMPREQ 19: Kannada for Ogmha
2810 void CTGlyphSelection::TestKannadaChars(CFbsFont* aFont)
2812 INFO_PRINTF1(_L("Test Kannada Glyphs"));
2814 TBuf<79> testText(0);
2815 CFont::TPositionParam param;
2816 param.iDirection = CFont::EHorizontal;
2817 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2819 testText.SetLength(79);
2820 //Testdata for kannada Langauage
2822 testText[0] = 0x0C95;
2823 testText[1] = 0x0CCD;
2824 testText[2] = 0x0020;
2826 testText[3] = 0x0CAF;
2827 testText[4] = 0x0CCD;
2828 testText[5] = 0x0020;
2830 testText[6] = 0x0C99;
2831 testText[7] = 0x0CCD;
2832 testText[8] = 0x0020;
2834 testText[9] = 0x0CA3;
2835 testText[10] = 0x0CCD;
2836 testText[11] = 0x0020;
2838 testText[12] = 0x0C95;
2839 testText[13] = 0x0CC3;
2841 testText[14] = 0x0CA4;
2842 testText[15] = 0x0CC6;
2844 testText[16] = 0x0C9D;
2845 testText[17] = 0x0CBE;
2847 testText[18] = 0x0C9E;
2848 testText[19] = 0x0CBE;
2850 testText[20] = 0x0CA3;
2851 testText[21] = 0x0CBE;
2853 testText[22] = 0x0CB3;
2854 testText[23] = 0x0CC6;
2856 testText[24] = 0x0C9D;
2857 testText[25] = 0x0CC6;
2859 testText[26] = 0x0CAC;
2860 testText[27] = 0x0CC6;
2862 testText[28] = 0x0C9F;
2863 testText[29] = 0x0CC6;
2865 testText[30] = 0x0C99;
2866 testText[31] = 0x0CC6;
2868 testText[32] = 0x0CA3;
2869 testText[33] = 0x0CC6;
2871 testText[34] = 0x0C95;
2872 testText[35] = 0x0CBF;
2874 testText[36] = 0x0CB8;
2875 testText[37] = 0x0CBF;
2877 testText[38] = 0x0CA1;
2878 testText[39] = 0x0CBF;
2880 testText[40] = 0x0CA6;
2881 testText[41] = 0x0CBF;
2883 testText[42] = 0x0C9D;
2884 testText[43] = 0x0CBF;
2886 testText[44] = 0x0C9D;
2887 testText[45] = 0x0CC1;
2889 testText[46] = 0x0CB5;
2890 testText[47] = 0x0CC1;
2892 testText[48] = 0x0C95;
2893 testText[49] = 0x0CC2;
2895 testText[50] = 0x0CAA;
2896 testText[51] = 0x0CC2;
2898 testText[52] = 0x0CAE;
2899 testText[53] = 0x0CCC;
2901 testText[54] = 0x0C95;
2903 testText[55] = 0x0CB0;
2904 testText[56] = 0x200D;
2905 testText[57] = 0x0CCD;
2906 testText[58] = 0x0CAE;
2908 testText[59] = 0x0020;
2910 testText[60] = 0x0CB0;
2911 testText[61] = 0x200D;
2912 testText[62] = 0x0CCD;
2913 testText[63] = 0x0CB0;
2914 testText[64] = 0x200D;
2915 testText[65] = 0x0CCD;
2918 testText[66] = 0x0CB0;
2919 testText[67] = 0x200D;
2920 testText[68] = 0x0CCD;
2921 testText[69] = 0x0CB0;
2922 testText[70] = 0x0CCD;
2923 testText[71] = 0x0CB0;
2924 testText[72] = 0x0CCD;
2925 testText[73] = 0x0CB0;
2926 testText[74] = 0x0CCD;
2927 testText[75] = 0x0CB0;
2929 // DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
2930 testText[76] = 0x0020;
2931 testText[77] = 0x0C8E;
2932 testText[78] = 0x0C82;
2933 // End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
2935 param.iText.Set(testText);
2940 param.iPosInText = 0;
2941 param.iPen.iX = param.iPen.iY = 0;
2942 RShapeInfo shapeInfo;
2943 r = aFont->GetCharacterPosition2(param,shapeInfo);
2945 TEST(r && param.iPosInText ==2
2946 && param.iOutputGlyphs == 1
2947 && param.iOutput[0].iCode == 0x80000839);
2949 #if defined __WINS__ || defined __WINSCW__
2950 TEST(r && param.iPen.iX == 16);
2953 INFO_PRINTF5(_L("The values of this shaping of Ka + Virama are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2955 param.iPosInText = 3;
2956 param.iPen.iX = param.iPen.iY = 0;
2957 r = aFont->GetCharacterPosition2(param,shapeInfo);
2959 TEST(r && param.iPosInText == 5
2960 && param.iOutputGlyphs ==1
2961 && param.iOutput[0].iCode == 0x80000852 );
2963 #if defined __WINS__ || defined __WINSCW__
2964 TEST(r && param.iPen.iX == 27);
2967 INFO_PRINTF5(_L("The values of this shaping Ya + Virama are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2969 param.iPosInText = 6;
2970 param.iPen.iX = param.iPen.iY = 0;
2971 r = aFont->GetCharacterPosition2(param,shapeInfo);
2973 TEST(r && param.iPosInText == 8
2974 && param.iOutputGlyphs == 1
2975 && param.iOutput[0].iCode ==0x8000083D);
2977 #if defined __WINS__ || defined __WINSCW__
2978 TEST(r && param.iPen.iX == 19);
2981 INFO_PRINTF5(_L("The result of this shaping for Nya + Virama iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2983 param.iPosInText = 9;
2984 param.iPen.iX = param.iPen.iY = 0;
2985 r = aFont->GetCharacterPosition2(param,shapeInfo);
2987 TEST(r && param.iPosInText == 11
2988 && param.iOutputGlyphs ==1
2989 && param.iOutput[0].iCode == 0x80000847);
2991 #if defined __WINS__ || defined __WINSCW__
2992 TEST(r && param.iPen.iX == 20);
2995 INFO_PRINTF5(_L("The result of this shaping for NNA + Virama iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
2997 param.iPosInText = 12;
2998 param.iPen.iX = param.iPen.iY = 0;
2999 r = aFont->GetCharacterPosition2(param,shapeInfo);
3001 TEST(r && param.iPosInText == 14
3002 && param.iOutputGlyphs == 2
3003 && param.iOutput[0].iCode == 0x800007A8
3004 && param.iOutput[1].iCode == 0x800007D2);
3006 #if defined __WINS__ || defined __WINSCW__
3007 TEST(r && param.iPen.iX == 12);
3010 INFO_PRINTF6(_L("The result of this shaping for Ka + Matra Vocalic R iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3012 param.iPosInText = 14;
3013 param.iPen.iX = param.iPen.iY = 0;
3014 r = aFont->GetCharacterPosition2(param,shapeInfo);
3016 TEST(r && param.iPosInText == 16
3017 && param.iOutputGlyphs == 1
3018 && param.iOutput[0].iCode == 0x8000088f);
3020 #if defined __WINS__ || defined __WINSCW__
3021 TEST(r && param.iPen.iX == 11);
3024 INFO_PRINTF5(_L("The result of this shaping for Ta + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3026 param.iPosInText = 16;
3027 param.iPen.iX = param.iPen.iY = 0;
3028 r = aFont->GetCharacterPosition2(param,shapeInfo);
3030 TEST(r && param.iPosInText == 18
3031 && param.iOutputGlyphs == 2
3032 && param.iOutput[0].iCode == 0x8000081E
3033 && param.iOutput[1].iCode == 0x800007CD);
3035 #if defined __WINS__ || defined __WINSCW__
3036 TEST(r && param.iPen.iX == 29);
3039 INFO_PRINTF6(_L("The result of this shaping for Jha + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3041 param.iPosInText = 18;
3042 param.iPen.iX = param.iPen.iY = 0;
3043 r = aFont->GetCharacterPosition2(param,shapeInfo);
3045 TEST(r && param.iPosInText == 20
3046 && param.iOutputGlyphs == 2
3047 && param.iOutput[0].iCode == 0x800007b1
3048 && param.iOutput[1].iCode == 0x800007cd);
3050 #if defined __WINS__ || defined __WINSCW__
3051 TEST(r && param.iPen.iX == 23);
3054 INFO_PRINTF6(_L("The result of this shaping for Nya + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3057 param.iPosInText = 20;
3058 param.iPen.iX = param.iPen.iY = 0;
3059 r = aFont->GetCharacterPosition2(param,shapeInfo);
3061 TEST(r && param.iPosInText == 22
3062 && param.iOutputGlyphs == 2
3063 && param.iOutput[0].iCode == 0x80000823
3064 && param.iOutput[1].iCode == 0x800007CD );
3066 #if defined __WINS__ || defined __WINSCW__
3067 TEST(r && param.iPen.iX == 21);
3070 INFO_PRINTF6(_L("The result of this shaping for Nna + Matra AA iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3072 param.iPosInText = 22;
3073 param.iPen.iX = param.iPen.iY = 0;
3074 r = aFont->GetCharacterPosition2(param,shapeInfo);
3076 TEST(r && param.iPosInText == 24
3077 && param.iOutputGlyphs == 1
3078 && param.iOutput[0].iCode == 0x8000089C);
3080 #if defined __WINS__ || defined __WINSCW__
3081 TEST(r && param.iPen.iX == 12);
3084 INFO_PRINTF5(_L("The result of this shaping for LLa + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3086 param.iPosInText = 24;
3087 param.iPen.iX = param.iPen.iY = 0;
3088 r = aFont->GetCharacterPosition2(param,shapeInfo);
3090 TEST(r && param.iPosInText == 26
3091 && param.iOutputGlyphs == 1
3092 && param.iOutput[0].iCode == 0x80000889);
3094 #if defined __WINS__ || defined __WINSCW__
3095 TEST(r && param.iPen.iX == 22);
3098 INFO_PRINTF5(_L("The result of this shaping for Jha + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3100 param.iPosInText = 26;
3101 param.iPen.iX = param.iPen.iY = 0;
3102 r = aFont->GetCharacterPosition2(param,shapeInfo);
3104 TEST(r && param.iPosInText == 28
3105 && param.iOutputGlyphs == 1
3106 && param.iOutput[0].iCode == 0x80000896 );
3108 #if defined __WINS__ || defined __WINSCW__
3109 TEST(r && param.iPen.iX == 13);
3112 INFO_PRINTF5(_L("The result of this shaping for Ba + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3114 param.iPosInText = 28;
3115 param.iPen.iX = param.iPen.iY = 0;
3116 r = aFont->GetCharacterPosition2(param,shapeInfo);
3118 TEST(r && param.iPosInText == 30
3119 && param.iOutputGlyphs == 1
3120 && param.iOutput[0].iCode == 0x8000088a);
3122 #if defined __WINS__ || defined __WINSCW__
3123 TEST(r && param.iPen.iX == 13);
3126 INFO_PRINTF5(_L("The result of this shaping for Tta + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3128 param.iPosInText = 30;
3129 param.iPen.iX = param.iPen.iY = 0;
3130 r = aFont->GetCharacterPosition2(param,shapeInfo);
3132 TEST(r && param.iPosInText == 32
3133 && param.iOutputGlyphs == 2
3134 && param.iOutput[0].iCode == 0x800007ac
3135 && param.iOutput[1].iCode == 0x800007d4 );
3137 #if defined __WINS__ || defined __WINSCW__
3138 TEST(r && param.iPen.iX == 19);
3141 INFO_PRINTF6(_L("The result of this shaping for Nya + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3143 param.iPosInText = 32;
3144 param.iPen.iX = param.iPen.iY = 0;
3145 r = aFont->GetCharacterPosition2(param,shapeInfo);
3147 TEST(r && param.iPosInText == 34
3148 && param.iOutputGlyphs == 1
3149 && param.iOutput[0].iCode == 0x8000088e);
3151 #if defined __WINS__ || defined __WINSCW__
3152 TEST(r && param.iPen.iX == 14);
3155 INFO_PRINTF5(_L("The result of this shaping for Nna + Matra E iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3157 param.iPosInText = 34;
3158 param.iPen.iX = param.iPen.iY = 0;
3159 r = aFont->GetCharacterPosition2(param,shapeInfo);
3161 TEST(r && param.iPosInText == 36
3162 && param.iOutputGlyphs == 1
3163 && param.iOutput[0].iCode == 0x80000860 );
3165 #if defined __WINS__ || defined __WINSCW__
3166 TEST(r && param.iPen.iX == 10);
3169 INFO_PRINTF5(_L("The result of this shaping for Ka + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3171 param.iPosInText = 36;
3172 param.iPen.iX = param.iPen.iY = 0;
3173 r = aFont->GetCharacterPosition2(param,shapeInfo);
3175 TEST(r && param.iPosInText == 38
3176 && param.iOutputGlyphs == 1
3177 && param.iOutput[0].iCode == 0x8000087e );
3179 #if defined __WINS__ || defined __WINSCW__
3180 TEST(r && param.iPen.iX == 11);
3183 INFO_PRINTF5(_L("The result of this shaping for Sa + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3185 param.iPosInText = 38;
3186 param.iPen.iX = param.iPen.iY = 0;
3187 r = aFont->GetCharacterPosition2(param,shapeInfo);
3189 TEST(r && param.iPosInText == 40
3190 && param.iOutputGlyphs == 1
3191 && param.iOutput[0].iCode == 0x8000086a);
3193 #if defined __WINS__ || defined __WINSCW__
3194 TEST(r && param.iPen.iX == 12);
3197 INFO_PRINTF5(_L("The result of this shaping for Dda + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3199 param.iPosInText = 40;
3200 param.iPen.iX = param.iPen.iY = 0;
3201 r = aFont->GetCharacterPosition2(param,shapeInfo);
3203 TEST(r && param.iPosInText == 42
3204 && param.iOutputGlyphs == 1
3205 && param.iOutput[0].iCode == 0x8000086f);
3207 #if defined __WINS__ || defined __WINSCW__
3208 TEST(r && param.iPen.iX == 12);
3211 INFO_PRINTF5(_L("The result of this shaping for Va + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3213 param.iPosInText = 42;
3214 param.iPen.iX = param.iPen.iY = 0;
3215 r = aFont->GetCharacterPosition2(param,shapeInfo);
3217 TEST(r && param.iPosInText == 44
3218 && param.iOutputGlyphs == 1
3219 && param.iOutput[0].iCode == 0x80000867 );
3221 #if defined __WINS__ || defined __WINSCW__
3222 TEST(r && param.iPen.iX == 22);
3225 INFO_PRINTF5(_L("The result of this shaping for Jha + Matra I iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3227 param.iPosInText = 44;
3228 param.iPen.iX = param.iPen.iY = 0;
3229 r = aFont->GetCharacterPosition2(param,shapeInfo);
3231 TEST(r && param.iPosInText == 46
3232 && param.iOutputGlyphs == 2
3233 && param.iOutput[0].iCode == 0x800007b0
3234 && param.iOutput[1].iCode == 0x800007d0);
3236 #if defined __WINS__ || defined __WINSCW__
3237 TEST(r && param.iPen.iX == 28);
3240 INFO_PRINTF6(_L("The result of this shaping for Jha + Matra U iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3242 param.iPosInText = 46;
3243 param.iPen.iX = param.iPen.iY = 0;
3244 r = aFont->GetCharacterPosition2(param,shapeInfo);
3246 TEST(r && param.iPosInText == 48
3247 && param.iOutputGlyphs == 2
3248 && param.iOutput[0].iCode == 0x800007c6
3249 && param.iOutput[1].iCode == 0x800007d0);
3251 #if defined __WINS__ || defined __WINSCW__
3252 TEST(r && param.iPen.iX == 18);
3255 INFO_PRINTF6(_L("The result of this shaping for Va + Matra U iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3258 param.iPosInText = 48;
3259 param.iPen.iX = param.iPen.iY = 0;
3260 r = aFont->GetCharacterPosition2(param,shapeInfo);
3262 TEST(r && param.iPosInText == 50
3263 && param.iOutputGlyphs == 2
3264 && param.iOutput[0].iCode == 0x800007a8
3265 && param.iOutput[1].iCode == 0x800007d1 );
3267 #if defined __WINS__ || defined __WINSCW__
3268 TEST(r && param.iPen.iX == 20);
3271 INFO_PRINTF6(_L("The result of this shaping for Ka Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);
3273 param.iPosInText = 50;
3274 param.iPen.iX = param.iPen.iY = 0;
3275 r = aFont->GetCharacterPosition2(param,shapeInfo);
3277 TEST(r && param.iPosInText == 52
3278 && param.iOutputGlyphs == 2
3279 && param.iOutput[0].iCode == 0x800007bc
3280 && param.iOutput[1].iCode == 0x800008a5);
3282 #if defined __WINS__ || defined __WINSCW__
3283 TEST(r && param.iPen.iX == 21);
3286 INFO_PRINTF6(_L("The result of this shaping for Pa + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3289 param.iPosInText = 52;
3290 param.iPen.iX = param.iPen.iY = 0;
3291 r = aFont->GetCharacterPosition2(param,shapeInfo);
3293 TEST(r && param.iPosInText == 54
3294 && param.iOutputGlyphs == 2
3295 && param.iOutput[0].iCode == 0x8000082d
3296 && param.iOutput[1].iCode == 0x800007d9);
3298 #if defined __WINS__ || defined __WINSCW__
3299 TEST(r && param.iPen.iX == 26);
3302 INFO_PRINTF6(_L("The result of this shaping for Ma + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3304 param.iPosInText = 55;
3305 param.iPen.iX = param.iPen.iY = 0;
3306 r = aFont->GetCharacterPosition2(param,shapeInfo);
3308 TEST(r && param.iPosInText == 59
3309 && param.iOutputGlyphs == 2
3310 && param.iOutput[0].iCode == 0x800007c2
3311 && param.iOutput[1].iCode == 0x80000809);
3313 #if defined __WINS__ || defined __WINSCW__
3314 TEST(r && param.iPen.iX == 17);
3317 INFO_PRINTF6(_L("The result of this shaping for Ma + Matra UU iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3319 param.iPosInText = 60;
3320 param.iPen.iX = param.iPen.iY = 0;
3321 r = aFont->GetCharacterPosition2(param,shapeInfo);
3322 TEST(r && param.iPosInText == 64
3323 && param.iOutputGlyphs == 2
3324 && param.iOutput[0].iCode == 0x800007c2
3325 && param.iOutput[1].iCode == 0x8000080b);
3326 INFO_PRINTF6(_L("Results are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3328 param.iPosInText = 66;
3329 param.iPen.iX = param.iPen.iY = 0;
3330 r = aFont->GetCharacterPosition2(param,shapeInfo);
3331 TEST(r && param.iPosInText == 75
3332 && param.iOutputGlyphs == 5
3333 && param.iOutput[0].iCode == 0x800007c2
3334 && param.iOutput[1].iCode == 0x8000080b
3335 && param.iOutput[2].iCode == 0x800008db
3336 && param.iOutput[3].iCode == 0x800008db
3337 && param.iOutput[4].iCode == 0x800007da);
3338 INFO_PRINTF7(_L("Results are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
3340 // DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
3341 param.iPosInText = 77;
3342 param.iPen.iX = param.iPen.iY = 0;
3343 r = aFont->GetCharacterPosition2(param,shapeInfo);
3344 TEST(r && param.iPosInText == 79
3345 && param.iOutputGlyphs == 2
3346 && param.iOutput[0].iCode == 0x800007A2
3347 && param.iOutput[1].iCode == 0x80000798);
3349 INFO_PRINTF5(_L("DEF103276 Vowel E + Anusvara: iPosInText=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3350 //End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
3355 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3360
3356 @SYMTestCaseDesc Automated GDI testing for Marathi
3357 @SYMTestPriority High
3358 @SYMTestActions Attempt to compose various valid and invalid Marathi glyph clusters.
3359 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
3360 @SYMPREQ 19: Marathi for Ogmha
3363 void CTGlyphSelection::TestMarathiChars(CFbsFont* aFont)
3365 INFO_PRINTF1(_L("Test Marathi Glyphs"));
3368 TBuf<47> testText(0);
3369 CFont::TPositionParam param;
3370 param.iDirection = CFont::EHorizontal;
3371 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
3373 testText.SetLength(47);
3376 testText[0] = 0x0905;
3377 testText[1] = 0x0945;
3379 testText[2] = 0x0931;
3380 testText[3] = 0x094D;
3381 testText[4] = 0x0915;
3383 testText[5] = 0x0930;
3384 testText[6] = 0x094D;
3385 testText[7] = 0x200D;
3386 testText[8] = 0x0915;
3388 testText[9] = 0x0905;
3389 testText[10] = 0x200D;
3390 testText[11] = 0x0945;
3392 testText[12] = 0x0909;
3393 testText[13] = 0x0945;
3395 testText[14] = 0x0915;
3396 testText[15] = 0x200D;
3397 testText[16] = 0x0945;
3399 // DEF102132: Marathi - Certain sequence of characters does not work correctly
3400 testText[17] = 0x0905;
3401 testText[18] = 0x0945;
3402 testText[19] = 0x0901;
3404 testText[20] = 0x0905;
3405 testText[21] = 0x200D;
3406 testText[22] = 0x0945;
3407 testText[23] = 0x0901;
3408 // End of DEF102132: Marathi - Certain sequence of characters does not work correctly
3411 // DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
3412 testText[24] = 0x0020;
3414 testText[25] = 0x0930;
3415 testText[26] = 0x094D;
3416 testText[27] = 0x200D;
3417 testText[28] = 0x0901;
3418 // End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
3420 // INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
3421 testText[29] = 0x0020;
3423 testText[30] = 0x0930;
3424 testText[31] = 0x094D;
3425 testText[32] = 0x200D;
3426 testText[33] = 0x0930;
3427 testText[34] = 0x094D;
3428 testText[35] = 0x200D;
3429 testText[36] = 0x0930;
3430 testText[37] = 0x094D;
3431 testText[38] = 0x200D;
3432 testText[39] = 0x0930;
3433 testText[40] = 0x094D;
3434 testText[41] = 0x200D;
3435 testText[42] = 0x0930;
3436 testText[43] = 0x094D;
3437 testText[44] = 0x200D;
3438 // End of INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
3440 // INC116507: Halant get attached with an independent vowel.
3441 testText[45] = 0x0905;
3442 testText[46] = 0x094D;
3443 // End of INC116507: Halant get attached with an independent vowel.
3447 param.iText.Set(testText);
3449 // Test CANDRA A: Independent Vowel A + CANDRA E
3450 param.iPosInText = 0;
3451 param.iPen.iX = param.iPen.iY = 0;
3452 RShapeInfo shapeInfo;
3453 r = aFont->GetCharacterPosition2(param,shapeInfo);
3455 TEST(r && param.iPosInText == 2
3456 && param.iOutputGlyphs == 2
3457 && param.iOutput[0].iCode == 0x80000528
3458 && param.iOutput[1].iCode == 0x80000566);
3460 #if defined __WINS__ || defined __WINSCW__
3461 TEST(r && param.iPen.iX == 12);
3464 INFO_PRINTF6(_L("The result of shaping CANDRA A is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3467 // Test Eyelash RA post Unicode 3.0: RRA + VIRAMA + CONSONANT
3468 param.iPosInText = 2 ;
3469 param.iPen.iX = param.iPen.iY = 0;
3470 r = aFont->GetCharacterPosition2(param,shapeInfo);
3472 TEST(r && param.iPosInText == 5
3473 && param.iOutputGlyphs == 2
3474 && param.iOutput[0].iCode == 0x800005d3
3475 && param.iOutput[1].iCode == 0x80000538);
3477 #if defined __WINS__ || defined __WINSCW__
3478 TEST(r && param.iPen.iX == 18);
3481 INFO_PRINTF6(_L("The result of shaping post Unicode 3.0 Eyelash RA is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3483 // Test Eyelash RA pre Unicode 3.0: RA + VIRAMA + ZWJ + CONSONANT
3484 param.iPosInText = 5;
3485 param.iPen.iX = param.iPen.iY = 0;
3486 r = aFont->GetCharacterPosition2(param,shapeInfo);
3488 TEST(r && param.iPosInText == 9
3489 && param.iOutputGlyphs == 2
3490 && param.iOutput[0].iCode == 0x800005d3
3491 && param.iOutput[1].iCode == 0x80000538);
3493 #if defined __WINS__ || defined __WINSCW__
3494 TEST(r && param.iPen.iX == 18);
3497 INFO_PRINTF6(_L("The result of shaping pre Unicode 3.0 Eyelash RA is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3499 // Test second form of CANDRA A: Independent Vowel A + ZWJ + CANDRA E
3500 param.iPosInText = 9;
3501 param.iPen.iX = param.iPen.iY = 0;
3502 r = aFont->GetCharacterPosition2(param,shapeInfo);
3504 TEST(r && param.iPosInText == 12
3505 && param.iOutputGlyphs == 2
3506 && param.iOutput[0].iCode == 0x80000528
3507 && param.iOutput[1].iCode == 0x80000566 );
3509 #if defined __WINS__ || defined __WINSCW__
3510 TEST(r && param.iPen.iX == 12);
3513 INFO_PRINTF6(_L("The result of shaping second form of CANDRA A is %d %d %d 0x%x 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3515 // Test that CANDRA E does not join with any other independent vowel
3516 param.iPosInText = 12;
3517 param.iPen.iX = param.iPen.iY = 0;
3518 r = aFont->GetCharacterPosition2(param,shapeInfo);
3520 TEST(r && param.iPosInText == 13
3521 && param.iOutputGlyphs == 1
3522 && param.iOutput[0].iCode == 0x8000052c);
3524 #if defined __WINS__ || defined __WINSCW__
3525 TEST(r && param.iPen.iX == 9);
3528 INFO_PRINTF5(_L("The result of shaping any other Independent Vowel + CANDRA E is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3530 // Test that the second form of CANDRA A (i.e. using ZWJ) doesn't work for CONSONANTS (illegal)
3531 param.iPosInText = 14;
3532 param.iPen.iX = param.iPen.iY = 0;
3533 r = aFont->GetCharacterPosition2(param,shapeInfo);
3535 TEST(r && param.iPosInText == 15
3536 && param.iOutputGlyphs == 1
3537 && param.iOutput[0].iCode == 0x80000538);
3539 #if defined __WINS__ || defined __WINSCW__
3540 TEST(r && param.iPen.iX == 11);
3543 INFO_PRINTF5(_L("The result of shaping CONSONANT + ZWJ + CANDRA E is %d %d %d 0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3545 // DEF102132: Marathi - Certain sequence of characters does not work correctly
3546 param.iPosInText = 17;
3547 param.iPen.iX = param.iPen.iY = 0;
3548 r = aFont->GetCharacterPosition2(param,shapeInfo);
3550 TEST(r && param.iPosInText == 20
3551 && param.iOutputGlyphs == 2
3552 && param.iOutput[0].iCode == 0x80000528
3553 && param.iOutput[1].iCode == 0x8000069d);
3556 INFO_PRINTF5(_L("DEF102132 Independent Vowel A + CANDRA E + Vowel Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3558 param.iPosInText = 20;
3559 param.iPen.iX = param.iPen.iY = 0;
3560 r = aFont->GetCharacterPosition2(param,shapeInfo);
3562 TEST(r && param.iPosInText == 23
3563 && param.iOutputGlyphs == 2
3564 && param.iOutput[0].iCode == 0x80000528
3565 && param.iOutput[1].iCode == 0x8000069d);
3567 INFO_PRINTF5(_L("DEF102132 Independent Vowel A + ZWJ + CANDRA E + Vowel Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3568 // End of DEF102132: Marathi - Certain sequence of characters does not work correctly
3570 // DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
3571 param.iPosInText = 25;
3572 param.iPen.iX = param.iPen.iY = 0;
3573 r = aFont->GetCharacterPosition2(param,shapeInfo);
3574 TEST(r && param.iPosInText == 29
3575 && param.iOutputGlyphs == 2
3576 && param.iOutput[0].iCode == 0x800005D3
3577 && param.iOutput[1].iCode == 0x80000524);
3579 INFO_PRINTF5(_L("DEF102858 Ra + Virama + ZWJ + Modifier %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3580 // End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
3582 // INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
3583 param.iPosInText = 30;
3584 param.iPen.iX = param.iPen.iY = 0;
3585 r = aFont->GetCharacterPosition2(param,shapeInfo);
3586 TEST(r && param.iPosInText == 42
3587 && param.iOutputGlyphs == 5
3588 && param.iOutput[0].iCode == 0x800005D3
3589 && param.iOutput[1].iCode == 0x800005D3
3590 && param.iOutput[2].iCode == 0x800005B8
3591 && param.iOutput[3].iCode == 0x80000553
3592 && param.iOutput[4].iCode == 0x8000056E);
3593 #if defined __WINS__ || defined __WINSCW__
3594 TEST(param.iPen.iX == 20);
3597 INFO_PRINTF7(_L("INC104705 Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ + Ra + Virama + ZWJ %d %d 0x%x 0x%x 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode, param.iOutput[3].iCode);
3598 // End of INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
3600 // INC116507: Halant get attached with an independent vowel.
3601 param.iPosInText = 45;
3602 param.iPen.iX = param.iPen.iY = 0;
3603 r = aFont->GetCharacterPosition2(param,shapeInfo);
3604 r = aFont->GetCharacterPosition2(param,shapeInfo);
3606 TEST(r && param.iPosInText == 47
3607 && param.iOutputGlyphs == 2
3608 && param.iOutput[0].iCode == 0x8000058F
3609 && param.iOutput[1].iCode == 0x8000056E);
3611 #if defined __WINS__ || defined __WINSCW__
3612 TEST(r && param.iPen.iX == 21);
3615 INFO_PRINTF6(_L("INC116507: Independent Vowel A + Halant %d %d %d 0x%x 0x%x"), param.iPosInText, param.iOutputGlyphs, param.iPen.iX, param.iOutput[0].iCode, param.iOutput[1].iCode);
3616 // End of INC116507: Halant get attached with an independent vowel.
3621 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3417
3622 @SYMTestCaseDesc Automated GDI testing for Gujarati
3623 @SYMTestPriority High
3624 @SYMTestActions Attempt to compose various valid and invalid gujarati glyph clusters.
3625 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
3626 @SYMPREQ 19: Gujarati for Ogmha
3630 void CTGlyphSelection::TestGujaratiChars(CFbsFont* aFont)
3632 INFO_PRINTF1(_L("Test Gujarati Glyphs"));
3637 TBuf<162> testText(0);
3638 CFont::TPositionParam param;
3639 param.iDirection = CFont::EHorizontal;
3640 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
3642 testText.SetLength(162);
3643 //Testdata for gujarati Langauage
3645 testText[0] = 0x0AAC;
3646 testText[1] = 0x0ACD;
3647 testText[2] = 0x200D;
3648 testText[3] = 0x0020;
3650 testText[4] = 0x0A96;
3651 testText[5] = 0x0ACD;
3652 testText[6] = 0x0A97;
3653 testText[7] = 0x0ACD;
3654 testText[8] = 0x0A98;
3655 testText[9] = 0x0ACD;
3656 testText[10] = 0x0A9A;
3658 testText[11] = 0x0A95;
3659 testText[12] = 0x0ACD;
3660 testText[13] = 0x0A9C;
3661 testText[14] = 0x200D;
3662 testText[15] = 0x0020;
3664 testText[16] = 0x0A99;
3665 testText[17] = 0x0ACD;
3666 testText[18] = 0x0A9B;
3667 testText[19] = 0x0ACD;
3668 testText[20] = 0x0A9F;
3669 testText[21] = 0x0ACD;
3670 testText[22] = 0x0AA0;
3672 //Requirement (GUJ003)
3674 testText[23] = 0x0A95;
3675 testText[24] = 0x0ACD;
3676 testText[25] = 0x0AB7;
3679 testText[26] = 0x0A95;
3680 testText[27] = 0x0ACD;
3681 testText[28] = 0x0AB7;
3682 testText[29] = 0x0ACD;
3683 testText[30] = 0x0AA4;
3685 testText[31] = 0x0A9C;
3686 testText[32] = 0x0ACD;
3687 testText[33] = 0x0AB7;
3688 testText[34] = 0x0ACD;
3689 testText[35] = 0x0AA4;
3691 testText[36] = 0x0A9C;
3692 testText[37] = 0x0ACD;
3693 testText[38] = 0x0A9E;
3694 testText[39] = 0x0ACD;
3695 testText[40] = 0x0AA4;
3697 //Requirement (GUJ 005)
3699 testText[41] = 0x0AB0;
3700 testText[42] = 0x0ACD;
3701 testText[43] = 0x0A95;
3703 testText[44] = 0x0AB0;
3704 testText[45] = 0x0ACD;
3705 testText[46] = 0x0A95;
3706 testText[47] = 0x0AC9;
3708 testText[48] = 0x0AB0;
3709 testText[49] = 0x0ACD;
3710 testText[50] = 0x0A95;
3711 testText[51] = 0x0A82;
3713 testText[52] = 0x0AB0;
3714 testText[53] = 0x0ACD;
3715 testText[54] = 0x0A95;
3716 testText[55] = 0x0AC9;
3717 testText[56] = 0x0A82;
3718 testText[57] = 0x0020;
3720 //Requirement (GUJ 006)
3722 testText[58] = 0x0A97;
3723 testText[59] = 0x0ACD;
3724 testText[60] = 0x0AB0;
3726 testText[61] = 0x0A9A;
3727 testText[62] = 0x0ACD;
3728 testText[63] = 0x0AB0;
3730 testText[64] = 0x0A97;
3731 testText[65] = 0x0ACD;
3732 testText[66] = 0x0AB0;
3733 testText[67] = 0x0ACD;
3734 testText[68] = 0x0AA4;
3736 testText[69] = 0x0A9A;
3737 testText[70] = 0x0ACD;
3738 testText[71] = 0x0AB0;
3739 testText[72] = 0x0ACD;
3740 testText[73] = 0x0AA4;
3742 //Requirement (GUJ 007)
3744 testText[74] = 0x0A95;
3745 testText[75] = 0x0ACD;
3746 testText[76] = 0x0AB0;
3748 testText[77] = 0x0A9C;
3749 testText[78] = 0x0ACD;
3750 testText[79] = 0x0AB0;
3752 testText[80] = 0x0A95;
3753 testText[81] = 0x0ACD;
3754 testText[82] = 0x0AB0;
3755 testText[83] = 0x0ACD;
3756 testText[84] = 0x0AA4;
3758 testText[85] = 0x0A9C;
3759 testText[86] = 0x0ACD;
3760 testText[87] = 0x0AB0;
3761 testText[88] = 0x0ACD;
3762 testText[89] = 0x0AA4;
3764 //Requirement (GUJ 008)
3766 testText[90] = 0x0A9B;
3767 testText[91] = 0x0ACD;
3768 testText[92] = 0x0AB0;
3770 testText[93] = 0x0AAF;
3771 testText[94] = 0x0ACD;
3772 testText[95] = 0x0AB0;
3774 testText[96] = 0x0A9B;
3775 testText[97] = 0x0ACD;
3776 testText[98] = 0x0AB0;
3777 testText[99] = 0x0ACD;
3778 testText[100]= 0x0AA4;
3780 testText[101] = 0x0AAF;
3781 testText[102] = 0x0ACD;
3782 testText[103] = 0x0AB0;
3784 testText[104] = 0x0AAF;
3785 testText[105] = 0x0ACD;
3786 testText[106] = 0x0AB0;
3787 testText[107] = 0x0ACD;
3788 testText[108] = 0x0AA4;
3790 testText[109] = 0x0AB0;
3791 testText[110] = 0x0ACD;
3792 testText[111] = 0x0AB0;
3793 testText[112] = 0x0ACD;
3794 testText[113] = 0x0AB0;
3796 //Requirement (GUJ 009)
3798 testText[114] = 0x0A9F;
3799 testText[115] = 0x0ACD;
3800 testText[116] = 0x0AAF;
3802 testText[117] = 0x0A9B;
3803 testText[118] = 0x0ACD;
3804 testText[119] = 0x0AAF;
3806 testText[120] = 0x0AA2;
3807 testText[121] = 0x0ACD;
3808 testText[122] = 0x0AAF;
3810 testText[123] = 0x0A97;
3811 testText[124] = 0x0ACD;
3812 testText[125] = 0x0AAF;
3814 //Requirement (GUJ 010)
3816 testText[126] = 0x0A9F;
3817 testText[127] = 0x0ACD;
3818 testText[128] = 0x0AA0;
3820 testText[129] = 0x0AA6;
3821 testText[130] = 0x0ACD;
3822 testText[131] = 0x0AB5;
3824 testText[132] = 0x0A9F;
3825 testText[133] = 0x0ACD;
3826 testText[134] = 0x0AA0;
3827 testText[135] = 0x0ACD;
3828 testText[136] = 0x0AA4;
3831 testText[137] = 0x0AA6;
3832 testText[138] = 0x0ACD;
3833 testText[139] = 0x0AB5;
3834 testText[140] = 0x0ACD;
3835 testText[141] = 0x0AA4;
3837 //Requirement (GUJ 011)
3839 testText[142] = 0x0AB0;
3840 testText[143] = 0x0AC2;
3842 testText[144] = 0x0AB9;
3843 testText[145] = 0x0AC3;
3845 testText[146] = 0x0AA6;
3846 testText[147] = 0x0AC3;
3848 testText[148] = 0x0A9C;
3849 testText[149] = 0x0AC0;
3851 //Subscript ligutares
3854 testText[150] = 0x0A95;
3855 testText[151] = 0x0A81;
3857 testText[152] = 0x0A95;
3858 testText[153] = 0x0ABE;
3859 testText[154] = 0x0A81;
3861 testText[155] = 0x0A95;
3862 testText[156] = 0x0AC1;
3863 testText[157] = 0x0A81;
3865 testText[158] = 0x0A8D;
3866 testText[159] = 0x0A81;
3868 testText[160] = 0x0A88;
3869 testText[161] = 0x0A81;
3873 param.iText.Set(testText);
3875 param.iPosInText = 0;
3876 param.iPen.iX = param.iPen.iY = 0;
3877 RShapeInfo shapeInfo;
3879 r = aFont->GetCharacterPosition2(param,shapeInfo);
3881 TEST(r && param.iPosInText == 3
3882 && param.iOutputGlyphs == 1
3883 && param.iOutput[0].iCode == 0x800009ec);
3885 #if defined __WINS__ || defined __WINSCW__
3886 TEST(r && param.iPen.iX == 9);
3890 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3892 param.iPosInText = 4;
3893 param.iPen.iX = param.iPen.iY = 0;
3895 r = aFont->GetCharacterPosition2(param,shapeInfo);
3897 TEST(r && param.iPosInText == 11
3898 && param.iOutputGlyphs == 4
3899 && param.iOutput[0].iCode == 0x800009d7
3900 && param.iOutput[1].iCode == 0x800009d8
3901 && param.iOutput[2].iCode == 0x800009d9
3902 && param.iOutput[3].iCode == 0x80000967 );
3904 #if defined __WINS__ || defined __WINSCW__
3905 TEST(r && param.iPen.iX == 34);
3908 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
3910 param.iPosInText = 11;
3911 param.iPen.iX = param.iPen.iY = 0;
3913 r = aFont->GetCharacterPosition2(param,shapeInfo);
3915 TEST(r && param.iPosInText == 14
3916 && param.iOutputGlyphs == 2
3917 && param.iOutput[0].iCode == 0x800009d6
3918 && param.iOutput[1].iCode == 0x80000969 );
3920 #if defined __WINS__ || defined __WINSCW__
3921 TEST(r && param.iPen.iX == 22);
3924 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3926 param.iPosInText = 16;
3927 param.iPen.iX = param.iPen.iY = 0;
3929 r = aFont->GetCharacterPosition2(param,shapeInfo);
3931 TEST(r && param.iPosInText == 23
3932 && param.iOutputGlyphs == 3
3933 && param.iOutput[0].iCode == 0x800009da
3934 && param.iOutput[1].iCode == 0x800009dc
3935 && param.iOutput[2].iCode == 0x80000aad);
3937 #if defined __WINS__ || defined __WINSCW__
3938 TEST(r && param.iPen.iX == 30);
3942 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
3944 param.iPosInText = 23;
3945 param.iPen.iX = param.iPen.iY = 0;
3947 r = aFont->GetCharacterPosition2(param,shapeInfo);
3949 TEST(r && param.iPosInText == 26
3950 && param.iOutputGlyphs == 1
3951 && param.iOutput[0].iCode == 0x800009d2 );
3953 #if defined __WINS__ || defined __WINSCW__
3954 TEST(r && param.iPen.iX == 12);
3957 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
3960 param.iPosInText = 26;
3961 param.iPen.iX = param.iPen.iY = 0;
3963 r = aFont->GetCharacterPosition2(param,shapeInfo);
3965 TEST(r && param.iPosInText == 31
3966 && param.iOutputGlyphs == 2
3967 && param.iOutput[0].iCode == 0x800009f8
3968 && param.iOutput[1].iCode == 0x80000971);
3970 #if defined __WINS__ || defined __WINSCW__
3971 TEST(r && param.iPen.iX == 18);
3974 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
3976 param.iPosInText = 31;
3977 param.iPen.iX = param.iPen.iY = 0;
3979 r = aFont->GetCharacterPosition2(param,shapeInfo);
3981 TEST(r && param.iPosInText == 36
3982 && param.iOutputGlyphs == 3
3983 && param.iOutput[0].iCode == 0x800009dd
3984 && param.iOutput[1].iCode == 0x800009f5
3985 && param.iOutput[2].iCode == 0x80000971);
3987 #if defined __WINS__ || defined __WINSCW__
3988 TEST(r && param.iPen.iX == 30);
3991 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
3993 param.iPosInText = 36;
3994 param.iPen.iX = param.iPen.iY = 0;
3996 r = aFont->GetCharacterPosition2(param,shapeInfo);
3998 TEST(r && param.iPosInText == 41
3999 && param.iOutputGlyphs == 2
4000 && param.iOutput[0].iCode == 0x800009f9
4001 && param.iOutput[1].iCode == 0x80000971);
4003 #if defined __WINS__ || defined __WINSCW__
4004 TEST(r && param.iPen.iX == 17);
4007 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4009 param.iPosInText = 41;
4010 param.iPen.iX = param.iPen.iY = 0;
4012 r = aFont->GetCharacterPosition2(param,shapeInfo);
4014 TEST(r && param.iPosInText == 44
4015 && param.iOutputGlyphs == 2
4016 && param.iOutput[0].iCode == 0x80000962
4017 && param.iOutput[1].iCode == 0x800009d4);
4019 #if defined __WINS__ || defined __WINSCW__
4020 TEST(r && param.iPen.iX == 8);
4023 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4025 param.iPosInText = 44;
4026 param.iPen.iX = param.iPen.iY = 0;
4028 r = aFont->GetCharacterPosition2(param,shapeInfo);
4030 TEST(r && param.iPosInText == 48
4031 && param.iOutputGlyphs == 2
4032 && param.iOutput[0].iCode == 0x80000962
4033 && param.iOutput[1].iCode == 0x80000ae1 );
4035 #if defined __WINS__ || defined __WINSCW__
4036 TEST(r && param.iPen.iX == 13);
4039 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4041 param.iPosInText = 48;
4042 param.iPen.iX = param.iPen.iY = 0;
4044 r = aFont->GetCharacterPosition2(param,shapeInfo);
4046 TEST(r && param.iPosInText == 52
4047 && param.iOutputGlyphs == 2
4048 && param.iOutput[0].iCode == 0x80000962
4049 && param.iOutput[1].iCode == 0x80000ae9);
4051 #if defined __WINS__ || defined __WINSCW__
4052 TEST(r && param.iPen.iX == 8);
4055 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4057 param.iPosInText = 52;
4058 param.iPen.iX = param.iPen.iY = 0;
4060 r = aFont->GetCharacterPosition2(param,shapeInfo);
4062 TEST(r && param.iPosInText == 57
4063 && param.iOutputGlyphs == 2
4064 && param.iOutput[0].iCode == 0x80000962
4065 && param.iOutput[1].iCode == 0x80000ae2);
4067 #if defined __WINS__ || defined __WINSCW__
4068 TEST(r && param.iPen.iX == 13);
4071 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4073 param.iPosInText = 58;
4074 param.iPen.iX = param.iPen.iY = 0;
4076 r = aFont->GetCharacterPosition2(param,shapeInfo);
4078 TEST(r && param.iPosInText == 61
4079 && param.iOutputGlyphs == 1
4080 && param.iOutput[0].iCode == 0x80000a1e );
4082 #if defined __WINS__ || defined __WINSCW__
4083 TEST(r && param.iPen.iX == 11);
4086 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4088 param.iPosInText = 61;
4089 param.iPen.iX = param.iPen.iY = 0;
4091 r = aFont->GetCharacterPosition2(param,shapeInfo);
4093 TEST(r && param.iPosInText == 64
4094 && param.iOutputGlyphs == 1
4095 && param.iOutput[0].iCode == 0x80000a21 );
4097 #if defined __WINS__ || defined __WINSCW__
4098 TEST(r && param.iPen.iX == 10);
4101 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4103 param.iPosInText = 64;
4104 param.iPen.iX = param.iPen.iY = 0;
4106 r = aFont->GetCharacterPosition2(param,shapeInfo);
4108 TEST(r && param.iPosInText == 69
4109 && param.iOutputGlyphs == 2
4110 && param.iOutput[0].iCode == 0x80000a64
4111 && param.iOutput[1].iCode == 0x80000971 );
4113 #if defined __WINS__ || defined __WINSCW__
4114 TEST(r && param.iPen.iX == 17);
4117 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4119 param.iPosInText = 69;
4120 param.iPen.iX = param.iPen.iY = 0;
4122 r = aFont->GetCharacterPosition2(param,shapeInfo);
4124 TEST(r && param.iPosInText == 74
4125 && param.iOutputGlyphs == 2
4126 && param.iOutput[0].iCode == 0x80000a67
4127 && param.iOutput[1].iCode == 0x80000971);
4129 #if defined __WINS__ || defined __WINSCW__
4130 TEST(r && param.iPen.iX == 16);
4133 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4135 param.iPosInText = 74;
4136 param.iPen.iX = param.iPen.iY = 0;
4138 r = aFont->GetCharacterPosition2(param,shapeInfo);
4140 TEST(r && param.iPosInText == 77
4141 && param.iOutputGlyphs == 1
4142 && param.iOutput[0].iCode == 0x80000a1c);
4144 #if defined __WINS__ || defined __WINSCW__
4145 TEST(r && param.iPen.iX == 8);
4148 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4150 param.iPosInText = 77;
4151 param.iPen.iX = param.iPen.iY = 0;
4153 r = aFont->GetCharacterPosition2(param,shapeInfo);
4155 TEST(r && param.iPosInText == 80
4156 && param.iOutputGlyphs == 1
4157 && param.iOutput[0].iCode == 0x80000a23);
4159 #if defined __WINS__ || defined __WINSCW__
4160 TEST(r && param.iPen.iX == 15);
4163 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4165 param.iPosInText = 80;
4166 param.iPen.iX = param.iPen.iY = 0;
4168 r = aFont->GetCharacterPosition2(param,shapeInfo);
4170 TEST(r && param.iPosInText == 85
4171 && param.iOutputGlyphs == 2
4172 && param.iOutput[0].iCode == 0x80000a62
4173 && param.iOutput[1].iCode == 0x80000971);
4175 #if defined __WINS__ || defined __WINSCW__
4176 TEST(r && param.iPen.iX == 17);
4179 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4181 param.iPosInText = 85;
4182 param.iPen.iX = param.iPen.iY = 0;
4184 r = aFont->GetCharacterPosition2(param,shapeInfo);
4186 TEST(r && param.iPosInText == 90
4187 && param.iOutputGlyphs == 2
4188 && param.iOutput[0].iCode == 0x80000a69
4189 && param.iOutput[1].iCode == 0x80000971);
4191 #if defined __WINS__ || defined __WINSCW__
4192 TEST(r && param.iPen.iX == 24);
4195 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4197 param.iPosInText =90;
4198 param.iPen.iX = param.iPen.iY = 0;
4200 r = aFont->GetCharacterPosition2(param,shapeInfo);
4202 TEST(r && param.iPosInText == 93
4203 && param.iOutputGlyphs == 1
4204 && param.iOutput[0].iCode == 0x80000a22 );
4206 #if defined __WINS__ || defined __WINSCW__
4207 TEST(r && param.iPen.iX == 12);
4210 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4212 param.iPosInText = 93;
4213 param.iPen.iX = param.iPen.iY = 0;
4215 r = aFont->GetCharacterPosition2(param,shapeInfo);
4217 TEST(r && param.iPosInText == 96
4218 && param.iOutputGlyphs == 1
4219 && param.iOutput[0].iCode == 0x80000a35 );
4221 #if defined __WINS__ || defined __WINSCW__
4222 TEST(r && param.iPen.iX == 10);
4225 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4227 param.iPosInText = 96;
4228 param.iPen.iX = param.iPen.iY = 0;
4230 r = aFont->GetCharacterPosition2(param,shapeInfo);
4232 TEST(r && param.iPosInText == 101
4233 && param.iOutputGlyphs == 2
4234 && param.iOutput[0].iCode == 0x80000a68
4235 && param.iOutput[1].iCode == 0x80000971);
4237 #if defined __WINS__ || defined __WINSCW__
4238 TEST(r && param.iPen.iX == 21);
4241 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4243 param.iPosInText = 101;
4244 param.iPen.iX = param.iPen.iY = 0;
4246 r = aFont->GetCharacterPosition2(param,shapeInfo);
4248 TEST(r && param.iPosInText == 104
4249 && param.iOutputGlyphs == 1
4250 && param.iOutput[0].iCode == 0x80000a35 );
4251 #if defined __WINS__ || defined __WINSCW__
4252 TEST(r && param.iPen.iX == 10);
4255 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4257 param.iPosInText = 104;
4258 param.iPen.iX = param.iPen.iY = 0;
4260 r = aFont->GetCharacterPosition2(param,shapeInfo);
4262 TEST(r && param.iPosInText == 109
4263 && param.iOutputGlyphs == 2
4264 && param.iOutput[0].iCode == 0x80000a7b
4265 && param.iOutput[1].iCode == 0x80000971 );
4267 #if defined __WINS__ || defined __WINSCW__
4268 TEST(r && param.iPen.iX == 16);
4271 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4273 param.iPosInText = 109;
4274 param.iPen.iX = param.iPen.iY = 0;
4276 r = aFont->GetCharacterPosition2(param,shapeInfo);
4278 TEST(r && param.iPosInText == 114
4279 && param.iOutputGlyphs == 2
4280 && param.iOutput[0].iCode == 0x80000a36
4281 && param.iOutput[1].iCode == 0x800009d4 );
4283 #if defined __WINS__ || defined __WINSCW__
4284 TEST(r && param.iPen.iX == 7);
4287 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4289 param.iPosInText = 114;
4290 param.iPen.iX = param.iPen.iY = 0;
4292 r = aFont->GetCharacterPosition2(param,shapeInfo);
4294 TEST(r && param.iPosInText == 117
4295 && param.iOutputGlyphs == 1
4296 && param.iOutput[0].iCode == 0x80000aae);
4298 #if defined __WINS__ || defined __WINSCW__
4299 TEST(r && param.iPen.iX == 17);
4302 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4304 param.iPosInText = 117;
4305 param.iPen.iX = param.iPen.iY = 0;
4307 r = aFont->GetCharacterPosition2(param,shapeInfo);
4309 TEST(r && param.iPosInText == 120
4310 && param.iOutputGlyphs == 1
4311 && param.iOutput[0].iCode == 0x80000aab );
4313 #if defined __WINS__ || defined __WINSCW__
4314 TEST(r && param.iPen.iX == 21);
4317 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4319 param.iPosInText = 120;
4320 param.iPen.iX = param.iPen.iY = 0;
4322 r = aFont->GetCharacterPosition2(param,shapeInfo);
4324 TEST(r && param.iPosInText == 123
4325 && param.iOutputGlyphs == 1
4326 && param.iOutput[0].iCode == 0x80000ab5 );
4328 #if defined __WINS__ || defined __WINSCW__
4329 TEST(r && param.iPen.iX == 18);
4332 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4334 param.iPosInText = 123;
4335 param.iPen.iX = param.iPen.iY = 0;
4337 r = aFont->GetCharacterPosition2(param,shapeInfo);
4339 TEST(r && param.iPosInText == 126
4340 && param.iOutputGlyphs == 2
4341 && param.iOutput[0].iCode == 0x800009d8
4342 && param.iOutput[1].iCode == 0x8000097b);
4344 #if defined __WINS__ || defined __WINSCW__
4345 TEST(r && param.iPen.iX == 17);
4348 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4350 param.iPosInText = 126;
4351 param.iPen.iX = param.iPen.iY = 0;
4353 r = aFont->GetCharacterPosition2(param,shapeInfo);
4355 TEST(r && param.iPosInText == 129
4356 && param.iOutputGlyphs == 1
4357 && param.iOutput[0].iCode == 0x80000aad);
4359 #if defined __WINS__ || defined __WINSCW__
4360 TEST(r && param.iPen.iX == 9);
4363 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4365 param.iPosInText = 129;
4366 param.iPen.iX = param.iPen.iY = 0;
4368 r = aFont->GetCharacterPosition2(param,shapeInfo);
4370 TEST(r && param.iPosInText == 132
4371 && param.iOutputGlyphs == 1
4372 && param.iOutput[0].iCode == 0x80000ac0 );
4374 #if defined __WINS__ || defined __WINSCW__
4375 TEST(r && param.iPen.iX == 10);
4378 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4380 param.iPosInText =132;
4381 param.iPen.iX = param.iPen.iY = 0;
4383 r = aFont->GetCharacterPosition2(param,shapeInfo);
4385 TEST(r && param.iPosInText == 137
4386 && param.iOutputGlyphs == 3
4387 && param.iOutput[0].iCode == 0x800009e0
4388 && param.iOutput[1].iCode == 0x800009e1
4389 && param.iOutput[2].iCode == 0x80000971);
4391 #if defined __WINS__ || defined __WINSCW__
4392 TEST(r && param.iPen.iX == 26);
4396 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
4398 param.iPosInText = 137;
4399 param.iPen.iX = param.iPen.iY = 0;
4401 r = aFont->GetCharacterPosition2(param,shapeInfo);
4403 TEST(r && param.iPosInText == 142
4404 && param.iOutputGlyphs == 3
4405 && param.iOutput[0].iCode == 0x800009e7
4406 && param.iOutput[1].iCode == 0x800009f3
4407 && param.iOutput[2].iCode == 0x80000971);
4409 #if defined __WINS__ || defined __WINSCW__
4410 TEST(r && param.iPen.iX == 23);
4413 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
4415 param.iPosInText = 142;
4416 param.iPen.iX = param.iPen.iY = 0;
4418 r = aFont->GetCharacterPosition2(param,shapeInfo);
4420 TEST(r && param.iPosInText == 144
4421 && param.iOutputGlyphs == 1
4422 && param.iOutput[0].iCode == 0x80000b04);
4424 #if defined __WINS__ || defined __WINSCW__
4425 TEST(r && param.iPen.iX == 7);
4428 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4430 param.iPosInText = 144;
4431 param.iPen.iX = param.iPen.iY = 0;
4433 r = aFont->GetCharacterPosition2(param,shapeInfo);
4435 TEST(r && param.iPosInText == 146
4436 && param.iOutputGlyphs == 1
4437 && param.iOutput[0].iCode == 0x80000b05);
4439 #if defined __WINS__ || defined __WINSCW__
4440 TEST(r && param.iPen.iX == 9);
4443 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4445 param.iPosInText = 146;
4446 param.iPen.iX = param.iPen.iY = 0;
4448 r = aFont->GetCharacterPosition2(param,shapeInfo);
4450 TEST(r && param.iPosInText == 148
4451 && param.iOutputGlyphs == 1
4452 && param.iOutput[0].iCode == 0x80000b02);
4454 #if defined __WINS__ || defined __WINSCW__
4455 TEST(r && param.iPen.iX == 7);
4458 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4460 param.iPosInText = 148;
4461 param.iPen.iX = param.iPen.iY = 0;
4463 r = aFont->GetCharacterPosition2(param,shapeInfo);
4465 TEST(r && param.iPosInText == 150
4466 && param.iOutputGlyphs == 1
4467 && param.iOutput[0].iCode == 0x80000aff);
4469 #if defined __WINS__ || defined __WINSCW__
4470 TEST(r && param.iPen.iX == 16);
4473 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4475 param.iPosInText = 150;
4476 param.iPen.iX = param.iPen.iY = 0;
4478 r = aFont->GetCharacterPosition2(param,shapeInfo);
4480 TEST(r && param.iPosInText == 152
4481 && param.iOutputGlyphs == 2
4482 && param.iOutput[0].iCode == 0x80000962
4483 && param.iOutput[1].iCode ==0x80000951);
4485 #if defined __WINS__ || defined __WINSCW__
4486 TEST(r && param.iPen.iX == 8);
4489 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4491 param.iPosInText = 152;
4492 param.iPen.iX = param.iPen.iY = 0;
4494 r = aFont->GetCharacterPosition2(param,shapeInfo);
4496 TEST(r && param.iPosInText == 155
4497 && param.iOutputGlyphs == 3
4498 && param.iOutput[0].iCode == 0x80000962
4499 && param.iOutput[1].iCode == 0x80000986
4500 && param.iOutput[2].iCode == 0x80000951);
4502 #if defined __WINS__ || defined __WINSCW__
4503 TEST(r && param.iPen.iX == 12);
4507 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
4509 param.iPosInText = 155;
4510 param.iPen.iX = param.iPen.iY = 0;
4512 r = aFont->GetCharacterPosition2(param,shapeInfo);
4514 TEST(r && param.iPosInText == 158
4515 && param.iOutputGlyphs == 3
4516 && param.iOutput[0].iCode == 0x80000962
4517 && param.iOutput[1].iCode == 0x80000989
4518 && param.iOutput[2].iCode == 0x80000951);
4520 #if defined __WINS__ || defined __WINSCW__
4521 TEST(r && param.iPen.iX == 8);
4525 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
4526 param.iPosInText = 158;
4527 param.iPen.iX = param.iPen.iY = 0;
4529 r = aFont->GetCharacterPosition2(param,shapeInfo);
4531 TEST(r && param.iPosInText == 160
4532 && param.iOutputGlyphs == 1
4533 && param.iOutput[0].iCode == 0x80000aee);
4535 #if defined __WINS__ || defined __WINSCW__
4536 TEST(r && param.iPen.iX == 14);
4539 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4541 param.iPosInText = 160;
4542 param.iPen.iX = param.iPen.iY = 0;
4544 r = aFont->GetCharacterPosition2(param,shapeInfo);
4546 TEST(r && param.iPosInText == 162
4547 && param.iOutputGlyphs == 1
4548 && param.iOutput[0].iCode == 0x80000aed);
4550 #if defined __WINS__ || defined __WINSCW__
4551 TEST(r && param.iPen.iX == 10);
4554 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4558 void CTGlyphSelection::TestBengaliChars(CFbsFont* aFont)
4560 INFO_PRINTF1(_L("Test Bengali Glyphs"));
4565 TBuf<115> testText(0);
4566 CFont::TPositionParam param;
4567 param.iDirection = CFont::EHorizontal;
4568 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
4570 testText.SetLength(115);
4571 // Make sure there is no garbage values in the memory we are using.
4572 for (TInt i = 0; i < testText.Length(); i++)
4575 //Testdata for Bengali language
4576 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4002"));
4578 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4002
4579 @SYMTestCaseDesc Automated GDI testing for Bengali
4580 @SYMTestPriority High
4581 @SYMTestActions Attempt to compose various invalid Bengali glyph clusters to test the requirement.
4582 If any part of stored text (e.g. received or downloaded document) is not properly encoded in logical order, the relevant text handling processes must treat that part as an invalid sequence of text and use appropriate fallback mechanisms. Invalid sequences of characters must be rendered as incomplete syllables and rendering engine must be able to handle invalid coding appropriately
4583 @SYMTestExpectedResults Rendering engine will render as incomplete syllables
4584 @SYMPREQ 1766 Bengali for Sphinx
4585 @SYMREQ 8741 Bengali Text Rendering
4588 // BEN002: Test invalid sequences
4589 testText[0] = 0x09C7;
4590 testText[1] = 0x0995;
4591 testText[2] = 0x0995;
4592 testText[3] = 0x09C1;
4593 testText[4] = 0x09C1;
4594 testText[5] = 0x0995;
4595 testText[6] = 0x09CD;
4596 testText[7] = 0x09C1;
4597 testText[8] = 0x0995;
4598 testText[9] = 0x0981;
4599 testText[10] = 0x09C1;
4601 param.iText.Set(testText);
4602 RShapeInfo shapeInfo;
4603 param.iPosInText = 0;
4604 param.iPen.iX = param.iPen.iY = 0;
4605 r = aFont->GetCharacterPosition2(param,shapeInfo);
4607 TEST(r && param.iPosInText == 1
4608 && param.iOutputGlyphs == 2
4609 && param.iOutput[0].iCode == 0x80000ce5
4610 && param.iOutput[1].iCode == 0x8000058f);
4612 #if defined __WINS__ || defined __WINSCW__
4613 TEST(r && param.iPen.iX == 15);
4616 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4618 param.iPosInText = 1;
4619 param.iPen.iX = param.iPen.iY = 0;
4620 r = aFont->GetCharacterPosition2(param,shapeInfo);
4622 TEST(r && param.iPosInText == 2
4623 && param.iOutputGlyphs == 1
4624 && param.iOutput[0].iCode == 0x80000cbc);
4626 #if defined __WINS__ || defined __WINSCW__
4627 TEST(r && param.iPen.iX == 12);
4630 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4632 param.iPosInText = 2;
4633 param.iPen.iX = param.iPen.iY = 0;
4634 r = aFont->GetCharacterPosition2(param,shapeInfo);
4636 TEST(r && param.iPosInText == 4
4637 && param.iOutputGlyphs == 1
4638 && param.iOutput[0].iCode == 0x80000ebe);
4640 #if defined __WINS__ || defined __WINSCW__
4641 TEST(r && param.iPen.iX == 13);
4644 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4646 param.iPosInText = 4;
4647 param.iPen.iX = param.iPen.iY = 0;
4648 r = aFont->GetCharacterPosition2(param,shapeInfo);
4650 TEST(r && param.iPosInText == 5
4651 && param.iOutputGlyphs == 2
4652 && param.iOutput[0].iCode == 0x8000058f
4653 && param.iOutput[1].iCode == 0x80000ce1
4655 #if defined __WINS__ || defined __WINSCW__
4656 TEST(r && param.iPen.iX == 9);
4659 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4661 param.iPosInText = 5;
4662 param.iPen.iX = param.iPen.iY = 0;
4663 r = aFont->GetCharacterPosition2(param,shapeInfo);
4665 TEST(r && param.iPosInText == 7
4666 && param.iOutputGlyphs == 2
4667 && param.iOutput[0].iCode == 0x80000cbc
4668 && param.iOutput[1].iCode == 0x80000ce9
4671 #if defined __WINS__ || defined __WINSCW__
4672 TEST(r && param.iPen.iX == 12);
4675 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4677 param.iPosInText = 7;
4678 param.iPen.iX = param.iPen.iY = 0;
4679 r = aFont->GetCharacterPosition2(param,shapeInfo);
4681 TEST(r && param.iPosInText == 8
4682 && param.iOutputGlyphs == 2
4683 && param.iOutput[0].iCode == 0x8000058f
4684 && param.iOutput[1].iCode == 0x80000ce1
4687 #if defined __WINS__ || defined __WINSCW__
4688 TEST(r && param.iPen.iX == 9);
4691 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4693 param.iPosInText = 8;
4694 param.iPen.iX = param.iPen.iY = 0;
4695 r = aFont->GetCharacterPosition2(param,shapeInfo);
4697 TEST(r && param.iPosInText == 10
4698 && param.iOutputGlyphs == 2
4699 && param.iOutput[0].iCode == 0x80000cbc
4700 && param.iOutput[1].iCode == 0x80000cad
4703 #if defined __WINS__ || defined __WINSCW__
4704 TEST(r && param.iPen.iX == 12);
4707 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4709 param.iPosInText = 10;
4710 param.iPen.iX = param.iPen.iY = 0;
4711 r = aFont->GetCharacterPosition2(param,shapeInfo);
4713 TEST(r && param.iPosInText == 11
4714 && param.iOutputGlyphs == 2
4715 && param.iOutput[0].iCode == 0x8000058f
4716 && param.iOutput[1].iCode == 0x80000ce1
4719 #if defined __WINS__ || defined __WINSCW__
4720 TEST(r && param.iPen.iX == 9);
4723 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
4724 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4726 INFO_PRINTF1(_L("Failed to record test result"));
4727 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4003"));
4729 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4003
4730 @SYMTestCaseDesc Automated GDI testing for Bengali
4731 @SYMTestPriority High
4733 Passing both Bengali and Latin scripts simultaneously
4734 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4735 @SYMPREQ 1766 Bengali for Sphinx
4736 @SYMREQ 8741 Bengali Text Rendering
4739 testText[11] = 0x0995;
4740 testText[12] = 0x0041; // Unicode value for A
4741 testText[13] = 0x09E6; //Bengali digit 1
4743 param.iPosInText = 11;
4744 param.iPen.iX = param.iPen.iY = 0;
4745 r = aFont->GetCharacterPosition2(param,shapeInfo);
4747 TEST(r && param.iPosInText == 12
4748 && param.iOutputGlyphs == 1
4749 && param.iOutput[0].iCode == 0x80000cbc
4752 #if defined __WINS__ || defined __WINSCW__
4753 TEST(r && param.iPen.iX == 12);
4756 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4758 param.iPosInText = 12;
4759 param.iPen.iX = param.iPen.iY = 0;
4760 r = aFont->GetCharacterPosition2(param,shapeInfo);
4762 TEST(r && param.iPosInText == 13
4763 && param.iOutputGlyphs == 1
4764 && param.iOutput[0].iCode == 0x41
4767 #if defined __WINS__ || defined __WINSCW__
4768 TEST(r && param.iPen.iX == 10);
4771 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4773 param.iPosInText = 13;
4774 param.iPen.iX = param.iPen.iY = 0;
4775 r = aFont->GetCharacterPosition2(param,shapeInfo);
4777 TEST(r && param.iPosInText == 14
4778 && param.iOutputGlyphs == 1
4779 && param.iOutput[0].iCode ==0x80000cf3
4782 #if defined __WINS__ || defined __WINSCW__
4783 TEST(r && param.iPen.iX == 10);
4786 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4787 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4789 INFO_PRINTF1(_L("Failed to record test result"));
4790 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4004"));
4792 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4004
4793 @SYMTestCaseDesc Automated GDI testing for Bengali
4794 @SYMTestPriority High
4795 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test the reequirement.
4796 Text rendering in Bengali must be based on syllables and the text rendering engine must be capable of handling the Bengali syllabic structure. If a single word is longer than one row, the line can only be broken at syllable border.
4797 Invalid sequences of characters must be rendered as incomplete syllables
4799 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4800 @SYMPREQ 1766: Bengali for Sphinx
4801 @SYMREQ 8741: Bengali Text Rendering
4804 testText[14] = 0x0985;
4805 testText[15] = 0x09A4;
4806 testText[16] = 0x09CD;
4807 testText[17] = 0x09AF;
4808 testText[18] = 0x09A8;
4809 testText[19] = 0x09CD;
4810 testText[20] = 0x09A4;
4812 param.iPosInText = 14;
4813 param.iPen.iX = param.iPen.iY = 0;
4814 r = aFont->GetCharacterPosition2(param,shapeInfo);
4816 TEST(r && param.iPosInText == 15
4817 && param.iOutputGlyphs == 1
4818 && param.iOutput[0].iCode == 0x80000cb0
4821 #if defined __WINS__ || defined __WINSCW__
4822 TEST(r && param.iPen.iX == 14);
4825 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4827 param.iPosInText = 15;
4828 param.iPen.iX = param.iPen.iY = 0;
4829 r = aFont->GetCharacterPosition2(param,shapeInfo);
4831 TEST(r && param.iPosInText == 18
4832 && param.iOutputGlyphs == 2
4833 && param.iOutput[0].iCode ==0x80000ccb
4834 && param.iOutput[1].iCode ==0x80000d6e
4837 #if defined __WINS__ || defined __WINSCW__
4838 TEST(r && param.iPen.iX == 16);
4841 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);
4843 param.iPosInText = 18;
4844 param.iPen.iX = param.iPen.iY = 0;
4845 r = aFont->GetCharacterPosition2(param,shapeInfo);
4847 TEST(r && param.iPosInText == 21
4848 && param.iOutputGlyphs == 1
4849 && param.iOutput[0].iCode == 0x80000e14
4852 #if defined __WINS__ || defined __WINSCW__
4853 TEST(r && param.iPen.iX == 13);
4856 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4857 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4859 INFO_PRINTF1(_L("Failed to record test result"));
4860 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4005"));
4863 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4005
4864 @SYMTestCaseDesc Automated GDI testing for Bengali
4865 @SYMTestPriority High
4866 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test the requirment
4867 Text rendering must be able to display specified character sequences using ligatures and set of ligatures (stable/unstable) must be font dependent / configurable.
4868 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4869 @SYMPREQ 1766: Bengali for Sphinx
4870 @SYMREQ 8741: Bengali Text Rendering
4872 testText[21] = 0x0995;
4873 testText[22] = 0x09CD;
4874 testText[23] = 0x09B7;
4876 testText[24] = 0x09A4;
4877 testText[25] = 0x09CD;
4878 testText[26] = 0x09B0;
4880 testText[27] = 0x09A6;
4881 testText[28] = 0x09CD;
4882 testText[29] = 0x09A6;
4885 param.iPosInText = 21;
4886 param.iPen.iX = param.iPen.iY = 0;
4887 r = aFont->GetCharacterPosition2(param,shapeInfo);
4889 TEST(r && param.iPosInText == 24
4890 && param.iOutputGlyphs == 1
4891 && param.iOutput[0].iCode == 0x80000d25
4894 #if defined __WINS__ || defined __WINSCW__
4895 TEST(r && param.iPen.iX == 15);
4898 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4900 param.iPosInText = 24;
4901 param.iPen.iX = param.iPen.iY = 0;
4902 r = aFont->GetCharacterPosition2(param,shapeInfo);
4904 TEST(r && param.iPosInText == 27
4905 && param.iOutputGlyphs == 1
4906 && param.iOutput[0].iCode ==0x80000d89
4909 #if defined __WINS__ || defined __WINSCW__
4910 TEST(r && param.iPen.iX == 12);
4913 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4915 param.iPosInText = 27;
4916 param.iPen.iX = param.iPen.iY = 0;
4917 r = aFont->GetCharacterPosition2(param,shapeInfo);
4919 TEST(r && param.iPosInText == 30
4920 && param.iOutputGlyphs == 1
4921 && param.iOutput[0].iCode == 0x80000e0a
4924 #if defined __WINS__ || defined __WINSCW__
4925 TEST(r && param.iPen.iX == 13);
4928 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4929 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4931 INFO_PRINTF1(_L("Failed to record test result"));
4932 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4006"));
4935 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4006
4936 @SYMTestCaseDesc Automated GDI testing for Bengali
4937 @SYMTestPriority High
4938 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
4939 whether tamil digits are recongized as numerals.
4940 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4941 @SYMPREQ 1766: Bengali for Sphinx
4942 @SYMREQ 8741: Bengali Text Rendering
4944 testText[30] = 0x09E6; // Bengali 1
4945 testText[31] = 0x0030; //Basic Latin 0
4948 param.iPosInText = 30;
4949 param.iPen.iX = param.iPen.iY = 0;
4950 r = aFont->GetCharacterPosition2(param,shapeInfo);
4952 TEST(r && param.iPosInText == 31
4953 && param.iOutputGlyphs == 1
4954 && param.iOutput[0].iCode == 0x80000cf3
4957 #if defined __WINS__ || defined __WINSCW__
4958 TEST(r && param.iPen.iX == 10);
4961 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4963 param.iPosInText = 31;
4964 param.iPen.iX = param.iPen.iY = 0;
4965 r = aFont->GetCharacterPosition2(param,shapeInfo);
4967 TEST(r && param.iPosInText == 32
4968 && param.iOutputGlyphs == 1
4969 && param.iOutput[0].iCode == 0x80000774
4972 #if defined __WINS__ || defined __WINSCW__
4973 TEST(r && param.iPen.iX == 8);
4976 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
4978 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4980 INFO_PRINTF1(_L("Failed to record test result"));
4981 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4007"));
4984 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4007
4985 @SYMTestCaseDesc Automated GDI testing for Bengali
4986 @SYMTestPriority High
4987 @SYMTestActions Attempt to compose various valid
4988 All text handling processes ((rendering, editing, searching, sorting etc.) MUST treat the sequence of a base consonant and a nukta equivalently to Nukta consonants
4989 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4990 @SYMPREQ 1766: Bengali for Sphinx
4991 @SYMREQ 8741: Bengali Text Rendering
4993 testText[32] = 0x09AF;
4994 testText[33] = 0x09BC;
4995 testText[34] = 0x09DF;
4997 param.iPosInText = 32;
4998 param.iPen.iX = param.iPen.iY = 0;
4999 r = aFont->GetCharacterPosition2(param,shapeInfo);
5001 TEST(r && param.iPosInText == 34
5002 && param.iOutputGlyphs == 1
5003 && param.iOutput[0].iCode == 0x80000cee
5006 #if defined __WINS__ || defined __WINSCW__
5007 TEST(r && param.iPen.iX == 10);
5010 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x "), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5011 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5013 INFO_PRINTF1(_L("Failed to record test result"));
5014 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4008"));
5017 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4008
5018 @SYMTestCaseDesc Automated GDI testing for Bengali
5019 @SYMTestPriority High
5020 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
5021 Rendering engine must be capable of handling joining formatters.
5022 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5023 @SYMPREQ 1766: Bengali for Sphinx
5024 @SYMREQ 8741: Bengali Text Rendering
5026 testText[35] = 0x0995;
5027 testText[36] = 0x09CD;
5028 testText[37] = 0x09B7;
5030 testText[38] = 0x0995;
5031 testText[39] = 0x09CD;
5032 testText[40] = 0x200C;
5033 testText[42] = 0x09B7;
5035 testText[43] = 0x0995;
5036 testText[44] = 0x09CD;
5037 testText[45] = 0x200D;
5038 testText[46] = 0x09B7;
5041 param.iPosInText = 35;
5042 param.iPen.iX = param.iPen.iY = 0;
5043 r = aFont->GetCharacterPosition2(param,shapeInfo);
5045 TEST(r && param.iPosInText == 38
5046 && param.iOutputGlyphs == 1
5047 && param.iOutput[0].iCode == 0x80000d25
5050 #if defined __WINS__ || defined __WINSCW__
5051 TEST(r && param.iPen.iX == 15);
5054 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5056 param.iPosInText = 38;
5057 param.iPen.iX = param.iPen.iY = 0;
5058 r = aFont->GetCharacterPosition2(param,shapeInfo);
5060 TEST(r && param.iPosInText == 40
5061 && param.iOutputGlyphs == 2
5062 && param.iOutput[0].iCode == 0x80000cbc
5063 && param.iOutput[1].iCode == 0x80000ce9
5066 #if defined __WINS__ || defined __WINSCW__
5067 TEST(r && param.iPen.iX == 12);
5070 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode,param.iOutput[1].iCode);
5072 param.iPosInText = 43;
5073 param.iPen.iX = param.iPen.iY = 0;
5074 r = aFont->GetCharacterPosition2(param,shapeInfo);
5076 TEST(r && param.iPosInText == 47
5077 && param.iOutputGlyphs == 2
5078 && param.iOutput[0].iCode == 0x80000d2a
5079 && param.iOutput[1].iCode == 0x80000cd9
5082 #if defined __WINS__ || defined __WINSCW__
5083 TEST(r && param.iPen.iX == 22);
5086 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5088 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5090 INFO_PRINTF1(_L("Failed to record test result"));
5091 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4009"));
5095 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4009
5096 @SYMTestCaseDesc Automated GDI testing for Bengali
5097 @SYMTestPriority High
5098 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
5099 If consonant /ya/, /ra/, /la/, /ma/, /na/ or /ba/, is the last element of a consonant cluster, the consonant assumes a phala form.
5100 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5101 @SYMPREQ 1766: Bengali for Sphinx
5102 @SYMREQ 8741: Bengali Text Rendering
5104 testText[47] = 0x09AA;
5105 testText[48] = 0x09CD;
5106 testText[49] = 0x09AF;
5108 testText[50] = 0x09AA;
5109 testText[51] = 0x09CD;
5110 testText[52] = 0x09A8;
5112 // Not working with Series60Sans font:
5113 testText[53] = 0x09AA;
5114 testText[54] = 0x09CD;
5115 testText[55] = 0x09AE;
5117 param.iPosInText = 47;
5118 param.iPen.iX = param.iPen.iY = 0;
5119 r = aFont->GetCharacterPosition2(param,shapeInfo);
5121 TEST(r && param.iPosInText == 50
5122 && param.iOutputGlyphs == 2
5123 && param.iOutput[0].iCode == 0x80000cd0
5126 #if defined __WINS__ || defined __WINSCW__
5127 TEST(r && param.iPen.iX == 15);
5130 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5132 param.iPosInText = 50;
5133 param.iPen.iX = param.iPen.iY = 0;
5134 r = aFont->GetCharacterPosition2(param,shapeInfo);
5136 TEST(r && param.iPosInText == 53
5137 && param.iOutputGlyphs == 1
5138 && param.iOutput[0].iCode == 0x80000e25
5141 #if defined __WINS__ || defined __WINSCW__
5142 TEST(r && param.iPen.iX == 11);
5145 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5146 // Not working with Series60Sans font:
5147 param.iPosInText = 53;
5148 param.iPen.iX = param.iPen.iY = 0;
5150 r = aFont->GetCharacterPosition2(param,shapeInfo);
5152 TEST(r && param.iPosInText == 56
5153 && param.iOutputGlyphs == 2
5154 && param.iOutput[0].iCode == 0x80000d3e
5155 && param.iOutput[1].iCode == 0x80000cd4
5158 #if defined __WINS__ || defined __WINSCW__
5159 TEST(r && param.iPen.iX == 19);
5162 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5163 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5165 INFO_PRINTF1(_L("Failed to record test result"));
5166 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4010"));
5169 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4010
5170 @SYMTestCaseDesc Automated GDI testing for Bengali
5171 @SYMTestPriority High
5172 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to tet
5173 Sequence <virama, ya>, i.e. ya-phala, MUST be allowed after independent vowels /a/ and /e/.
5174 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5175 @SYMPREQ 1766: Bengali for Sphinx
5176 @SYMREQ 8741: Bengali Text Rendering
5178 testText[56] = 0x0985;
5179 testText[57] = 0x09CD;
5180 testText[58] = 0x09AF;
5181 testText[59] = 0x09BE;
5183 // Double ya -> Ya, ya-phala
5184 testText[60] = 0x09AA;
5185 testText[61] = 0x09CD;
5186 testText[62] = 0x09AF;
5187 testText[63] = 0x09CD;
5188 testText[64] = 0x09AF;
5190 param.iPosInText = 56;
5191 param.iPen.iX = param.iPen.iY = 0;
5192 r = aFont->GetCharacterPosition2(param,shapeInfo);
5193 #if defined __WINS__ || defined __WINSCW__
5194 TEST(r && param.iPosInText == 57
5195 && param.iPen.iX == 14
5196 && param.iOutputGlyphs == 1
5197 && param.iOutput[0].iCode == 0x80000cb0
5199 #elif defined __ARMCC__
5200 TEST(r && param.iPosInText == 57
5201 && param.iOutputGlyphs == 1
5202 && param.iOutput[0].iCode == 0x80000cb0
5205 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5207 param.iPosInText = 57;
5208 param.iPen.iX = param.iPen.iY = 0;
5209 r = aFont->GetCharacterPosition2(param,shapeInfo);
5211 TEST(r && param.iPosInText == 58
5212 && param.iOutputGlyphs == 0
5215 #if defined __WINS__ || defined __WINSCW__
5216 TEST(r && param.iPen.iX == 0);
5219 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5221 param.iPosInText = 60;
5222 param.iPen.iX = param.iPen.iY = 0;
5223 r = aFont->GetCharacterPosition2(param,shapeInfo);
5225 TEST(r && param.iPosInText == 65
5226 && param.iOutputGlyphs == 3
5227 && param.iOutput[0].iCode == 0x80000d3e
5228 && param.iOutput[1].iCode == 0x80000cd5
5229 && param.iOutput[2].iCode == 0x80000d6e
5232 #if defined __WINS__ || defined __WINSCW__
5233 TEST(r && param.iPen.iX == 23);
5236 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
5237 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5239 INFO_PRINTF1(_L("Failed to record test result"));
5240 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4011"));
5243 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4011
5244 @SYMTestCaseDesc Automated GDI testing for Bengali
5245 @SYMTestPriority High
5246 @SYMTestActions Attempt to compose various valid and glyph clusters to test
5247 When consonant /ga/, /nna/, /na/, /pa/, /la/, /sha/, /ssa/ or /sa/ is a dead consonant, and none of the other consonant cluster formation rules apply, the consonant MUST be rendered with a stemless half form.
5248 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5249 @SYMPREQ 1766: Bengali for Sphinx
5250 @SYMREQ 8741: Bengali Text Rendering
5252 testText[65] = 0x0997;
5253 testText[66] = 0x09CD;
5254 testText[67] = 0x099C;
5256 testText[68] = 0x09AA;
5257 testText[69] = 0x09CD;
5258 testText[70] = 0x099C;
5261 param.iPosInText = 65;
5262 param.iPen.iX = param.iPen.iY = 0;
5263 r = aFont->GetCharacterPosition2(param,shapeInfo);
5265 TEST(r && param.iPosInText == 68
5266 && param.iOutputGlyphs == 2
5267 && param.iOutput[0].iCode == 0x80000d2c
5268 && param.iOutput[1].iCode == 0x80000cc3
5271 #if defined __WINS__ || defined __WINSCW__
5272 TEST(r && param.iPen.iX == 21);
5275 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5277 param.iPosInText = 68;
5278 param.iPen.iX = param.iPen.iY = 0;
5279 r = aFont->GetCharacterPosition2(param,shapeInfo);
5281 TEST(r && param.iPosInText == 71
5282 && param.iOutputGlyphs == 2
5283 && param.iOutput[0].iCode == 0x80000d3e
5286 #if defined __WINS__ || defined __WINSCW__
5287 TEST(r && param.iPen.iX == 23);
5290 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5294 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5296 INFO_PRINTF1(_L("Failed to record test result"));
5297 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4012"));
5299 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4012
5300 @SYMTestCaseDesc Automated GDI testing for Bengali
5301 @SYMTestPriority High
5302 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
5303 When /ka/, /nga/, /ca/, /tta/, /dda/, /ta/ or /da/ is a dead consonant, and none of the other consonant cluster formation rules apply, the consonant MUST be rendered with a miniature half form.
5304 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5305 @SYMPREQ 1766: Bengali for Sphinx
5306 @SYMREQ 8741: Bengali Text Rendering
5308 testText[71] = 0x0995;
5309 testText[72] = 0x09CD;
5310 testText[73] = 0x099C;
5313 param.iPosInText = 71;
5314 param.iPen.iX = param.iPen.iY = 0;
5315 r = aFont->GetCharacterPosition2(param,shapeInfo);
5317 TEST(r && param.iPosInText == 74
5318 && param.iOutputGlyphs == 2
5319 && param.iOutput[0].iCode == 0x80000d2a
5322 #if defined __WINS__ || defined __WINSCW__
5323 TEST(r && param.iPen.iX == 26);
5326 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5328 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5330 INFO_PRINTF1(_L("Failed to record test result"));
5331 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4013"));
5335 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4013
5336 @SYMTestCaseDesc Automated GDI testing for Bengali
5337 @SYMTestPriority High
5338 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
5339 The consonant pairs /k.ka/, /ng.kha/, /c.nya/, /nn.nna/, /n.tha/, /n.pha/, /m.ta/, /m.tha/, /m.pha/, /m.bha/, /l.ka/, /l.ga/, /l.pa/, /ss.ka/, /ss.pha/, /s.ka/, /s.kha/, /s.ta/, /s.tha/, /s.pha/, /h.nna/ MUST be representend as stacks of two consonants.
5340 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5341 @SYMPREQ 1766: Bengali for Sphinx
5342 @SYMREQ 8741: Bengali Text Rendering
5344 // Ma does not stack correctly on top with Series60Sans font, produces half form instead. Font defect.
5345 testText[74] = 0x09AE;
5346 testText[75] = 0x09CD;
5347 testText[76] = 0x09A5;
5349 testText[77] = 0x09AE;
5350 testText[78] = 0x09CD;
5351 testText[79] = 0x09AB;
5352 // Ma does not stack correctly on top, produces half form instead.
5353 testText[80] = 0x09AE;
5354 testText[81] = 0x09CD;
5355 testText[82] = 0x0995;
5357 testText[83] = 0x09A8;
5358 testText[84] = 0x09CD;
5359 testText[85] = 0x09A5;
5362 //Combination pa,virama,ma produces incorrect glyph mapping: Font defect.
5364 param.iPosInText = 74;
5365 param.iPen.iX = param.iPen.iY = 0;
5367 r = aFont->GetCharacterPosition2(param,shapeInfo);
5369 TEST(r && param.iPosInText == 77
5370 && param.iOutputGlyphs == 2
5371 && param.iOutput[0].iCode == 0x80000d42
5372 && param.iOutput[1].iCode == 0x80000ccc
5375 #if defined __WINS__ || defined __WINSCW__
5376 TEST(r && param.iPen.iX == 21);
5379 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5382 param.iPosInText = 77;
5383 param.iPen.iX = param.iPen.iY = 0;
5384 r = aFont->GetCharacterPosition2(param,shapeInfo);
5386 TEST(r && param.iPosInText == 80
5387 && param.iOutputGlyphs == 1
5388 && param.iOutput[0].iCode == 0x80000e30
5391 #if defined __WINS__ || defined __WINSCW__
5392 TEST(r && param.iPen.iX == 19);
5395 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5397 // Ma does not stack correctly on top, produces half form instead.
5398 param.iPosInText = 80;
5399 param.iPen.iX = param.iPen.iY = 0;
5401 r = aFont->GetCharacterPosition2(param,shapeInfo);
5403 TEST(r && param.iPosInText == 83
5404 && param.iOutputGlyphs == 2
5405 && param.iOutput[0].iCode == 0x80000d42
5408 #if defined __WINS__ || defined __WINSCW__
5409 TEST(r && param.iPen.iX == 22);
5412 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5415 param.iPosInText = 83;
5416 param.iPen.iX = param.iPen.iY = 0;
5417 r = aFont->GetCharacterPosition2(param,shapeInfo);
5419 TEST(r && param.iPosInText == 86
5420 && param.iOutputGlyphs == 1
5421 && param.iOutput[0].iCode == 0x80000e15
5424 #if defined __WINS__ || defined __WINSCW__
5425 TEST(r && param.iPen.iX == 10);
5428 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5429 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5431 INFO_PRINTF1(_L("Failed to record test result"));
5432 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4014"));
5436 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4014
5437 @SYMTestCaseDesc Automated GDI testing for Bengali
5438 @SYMTestPriority High
5439 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
5440 Consonant pairs /k.tta/, /k.ta/, /k.ssa/, /k.sa/, /g.ga/, /g.dha/, /ng.ka/, /ng.ga/, /j.ja/, /j.jha/, /j.nya/, /ny.ca/, /ny.cha/, /ny.ja/, /ny.jha/, /tt.tta/, /nn.ttha/, /nn.dda/, /t.ta/, /t.tha/, /d.da/, /d.dha/, /d.ba/, /d.bha/, /n.ta/, /n.dha/, /p.ta/, /b.ja/, /b.da/, /b.dha/, /m.pa/, /ss.tta/, /ss.ttha/, /ss.nna/, /s.pa/, /h.na/ /h.ma/ MUST be displayed as ligatures, if they appear at the end of a consonant cluster.
5441 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5442 @SYMPREQ 1766: Bengali for Sphinx
5443 @SYMREQ 8741: Bengali Text Rendering
5445 testText[86] = 0x0995;
5446 testText[87] = 0x09CD;
5447 testText[88] = 0x099F;
5449 testText[89] = 0x0995;
5450 testText[90] = 0x09CD;
5451 testText[91] = 0x09A4;
5453 // Not sure if this is forming the correct ligature
5454 testText[92] = 0x09AE;
5455 testText[93] = 0x09CD;
5456 testText[94] = 0x09AA;
5458 // Not sure if this is forming the correct ligature
5459 testText[95] = 0x09B8;
5460 testText[96] = 0x09CD;
5461 testText[97] = 0x09AA;
5463 testText[98] = 0x09B9;
5464 testText[99] = 0x09CD;
5465 testText[100] = 0x09A8;
5467 param.iPosInText = 86;
5468 param.iPen.iX = param.iPen.iY = 0;
5469 r = aFont->GetCharacterPosition2(param,shapeInfo);
5471 TEST(r && param.iPosInText == 89
5472 && param.iOutputGlyphs == 1
5473 && param.iOutput[0].iCode == 0x80000dd7
5476 #if defined __WINS__ || defined __WINSCW__
5477 TEST(r && param.iPen.iX == 12);
5480 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5482 param.iPosInText = 89;
5483 param.iPen.iX = param.iPen.iY = 0;
5484 r = aFont->GetCharacterPosition2(param,shapeInfo);
5486 TEST(r && param.iPosInText == 92
5487 && param.iOutputGlyphs == 1
5488 && param.iOutput[0].iCode == 0x80000dd9
5491 #if defined __WINS__ || defined __WINSCW__
5492 TEST(r && param.iPen.iX == 15);
5495 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5497 param.iPosInText = 92;
5498 param.iPen.iX = param.iPen.iY = 0;
5499 r = aFont->GetCharacterPosition2(param,shapeInfo);
5501 TEST(r && param.iPosInText == 95
5502 && param.iOutputGlyphs == 1
5503 && param.iOutput[0].iCode == 0x80000e2f
5506 #if defined __WINS__ || defined __WINSCW__
5507 TEST(r && param.iPen.iX == 19);
5510 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5512 param.iPosInText = 95;
5513 param.iPen.iX = param.iPen.iY = 0;
5514 r = aFont->GetCharacterPosition2(param,shapeInfo);
5516 TEST(r && param.iPosInText == 98
5517 && param.iOutputGlyphs == 1
5518 && param.iOutput[0].iCode == 0x80000e56
5521 #if defined __WINS__ || defined __WINSCW__
5522 TEST(r && param.iPen.iX == 20);
5525 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5527 param.iPosInText = 98;
5528 param.iPen.iX = param.iPen.iY = 0;
5529 r = aFont->GetCharacterPosition2(param,shapeInfo);
5531 TEST(r && param.iPosInText == 101
5532 && param.iOutputGlyphs == 1
5533 && param.iOutput[0].iCode == 0x80000e5d
5536 #if defined __WINS__ || defined __WINSCW__
5537 TEST(r && param.iPen.iX == 13);
5540 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5541 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5543 INFO_PRINTF1(_L("Failed to record test result"));
5544 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4015"));
5547 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4015
5548 @SYMTestCaseDesc Automated GDI testing for Bengali
5549 @SYMTestPriority High
5550 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test that
5551 If RA is the first consonant cluster, it must assume the form of Repha.
5552 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5553 @SYMPREQ 1766: Bengali for Sphinx
5554 @SYMREQ 8741: Bengali Text Rendering
5556 testText[101] = 0x09B0;
5557 testText[102] = 0x09CD;
5558 testText[103] = 0x0995;
5560 testText[104] = 0x09B0;
5561 testText[105] = 0x200C;
5562 testText[106] = 0x09CD;
5563 testText[107] = 0x09AF;
5565 param.iPosInText = 101;
5566 param.iPen.iX = param.iPen.iY = 0;
5567 r = aFont->GetCharacterPosition2(param,shapeInfo);
5569 TEST(r && param.iPosInText == 104
5570 && param.iOutputGlyphs == 2
5571 && param.iOutput[0].iCode == 0x80000cbc
5572 && param.iOutput[1].iCode == 0x80000d27
5575 #if defined __WINS__ || defined __WINSCW__
5576 TEST(r && param.iPen.iX == 12);
5579 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5581 param.iPosInText =104;
5582 param.iPen.iX = param.iPen.iY = 0;
5583 r = aFont->GetCharacterPosition2(param,shapeInfo);
5585 TEST(r && param.iPosInText == 105
5586 && param.iOutputGlyphs == 1
5587 && param.iOutput[0].iCode == 0x80000cd6
5590 #if defined __WINS__ || defined __WINSCW__
5591 TEST(r && param.iPen.iX == 9);
5594 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5599 void CTGlyphSelection::TestTamilChars(CFbsFont* aFont)
5601 INFO_PRINTF1(_L("Test Tamil Glyphs"));
5604 TBuf<162> testText(0);
5605 CFont::TPositionParam param;
5606 param.iDirection = CFont::EHorizontal;
5607 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
5609 testText.SetLength(162);
5610 // Make sure there is no garbage values in the memory we are using.
5611 for (TInt i = 0; i < testText.Length(); i++)
5613 param.iText.Set(testText);
5614 RShapeInfo shapeInfo;
5615 //Testdata for Tamil Langauage
5616 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5618 INFO_PRINTF1(_L("Failed to record test result"));
5619 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4016"));
5621 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4016
5622 @SYMTestCaseDesc Automated GDI testing for Tamil
5623 @SYMTestPriority High
5624 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5625 a)The Tamil alphabets are listed in contiguous Unicode range(U+0B80U+0BFF), This also contains Tamil Numbers.
5626 b)The Tamil alphabets are listed in contiguous Unicode range(U+0B80U+0BFF), This also contains Tamil Numbers.
5627 c)Internal data storage should always be in the logical order, but the rendering of it may be different to that of the logical order
5628 d)Combination of Unicode sequences must be rendered as valid blocks. In Tamil some character sequences are invalid and therefore only the sequences which follow the logical order as described in Req 1.2.3 should be rendered properly
5629 e)If the text being rendered contains a mixture of scripts, the text in each script should be rendered according to the rules of that particular script.
5630 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5631 @SYMPREQ 1766: Tamil for Sphinx
5632 @SYMREQ 8742:Tamil Text Rendering
5634 testText[0] = 0x0B95; //Tamil Ka
5635 testText[1] = 0x0B8E; //Tamil e
5636 testText[2] = 0x0061; //Latin A
5637 testText[3] = 0x0905; // Hindi Ka
5638 testText[4] = 0x0020;
5640 param.iPosInText = 0 ;
5641 param.iPen.iX = param.iPen.iY = 0;
5643 r = aFont->GetCharacterPosition2(param,shapeInfo);
5645 TEST(r && param.iPosInText == 1
5646 && param.iOutputGlyphs == 1
5647 && param.iOutput[0].iCode == 0x80000bf6);
5649 #if defined __WINS__ || defined __WINSCW__
5650 TEST(r && param.iPen.iX == 13);
5653 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5655 param.iPosInText = 1 ;
5656 param.iPen.iX = param.iPen.iY = 0;
5658 r = aFont->GetCharacterPosition2(param,shapeInfo);
5660 TEST(r && param.iPosInText == 2
5661 && param.iOutputGlyphs == 1
5662 && param.iOutput[0].iCode == 0x80000bf0);
5664 #if defined __WINS__ || defined __WINSCW__
5665 TEST(r && param.iPen.iX == 14);
5668 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5670 param.iPosInText = 2 ;
5671 param.iPen.iX = param.iPen.iY = 0;
5673 r = aFont->GetCharacterPosition2(param,shapeInfo);
5675 TEST(r && param.iPosInText == 3
5676 && param.iOutputGlyphs == 1
5677 && param.iOutput[0].iCode == 0x61 );
5679 #if defined __WINS__ || defined __WINSCW__
5680 TEST(r && param.iPen.iX == 10);
5683 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5684 param.iPosInText = 3 ;
5685 param.iPen.iX = param.iPen.iY = 0;
5687 r = aFont->GetCharacterPosition2(param,shapeInfo);
5689 TEST(r && param.iPosInText == 4
5690 && param.iOutputGlyphs == 1
5691 && param.iOutput[0].iCode == 0x80000528);
5693 #if defined __WINS__ || defined __WINSCW__
5694 TEST(r && param.iPen.iX == 12);
5697 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5699 /*Req 02 1.2.3, 1.3.21, 1.3.21.1, 1.3.21.2 1.3.21.3
5701 1.2.3 The attachment presents the logical order used to present Tamil text. In the schematic samples, square brackets are used to presents the components that may be omitted.
5702 1.3.21 If the text-rendering engine detects invalid sequences of characters, it should render the invalid sequences using an appropriate fallback rendering mechanism
5703 Please see the attachment for examples
5704 1.3.21.1 For normal rendering, combining Tamil characters must be preceded by a valid base character.
5705 1.3.21.2 Combining Tamil characters that do not follow a valid base character must be rendered using an appropriate fallback rendering.
5706 1.3.21.3 Device must not hang or crash because of unexpected character sequences.*/
5708 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5710 INFO_PRINTF1(_L("Failed to record test result"));
5711 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4017"));
5715 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4017
5716 @SYMTestCaseDesc Automated GDI testing for Tamil
5717 @SYMTestPriority High
5718 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5719 It is reasonably common to mix Latin, Tamil as well as other script in texts. This must include the numerals.
5720 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5721 @SYMPREQ 1766: Tamil for Sphinx
5722 @SYMREQ 8742:Tamil Text Rendering
5724 testText[4] = 0x0036;//Latin 06
5725 testText[5] = 0x0BEC;//Tamil 06
5727 param.iPosInText = 4 ;
5728 param.iPen.iX = param.iPen.iY = 0;
5730 r = aFont->GetCharacterPosition2(param,shapeInfo);
5732 TEST(r && param.iPosInText == 5
5733 && param.iOutputGlyphs == 1
5734 && param.iOutput[0].iCode == 0x8000077A);
5736 #if defined __WINS__ || defined __WINSCW__
5737 TEST(r && param.iPen.iX == 8);
5740 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5742 param.iPosInText = 5 ;
5743 param.iPen.iX = param.iPen.iY = 0;
5745 r = aFont->GetCharacterPosition2(param,shapeInfo);
5747 TEST(r && param.iPosInText == 6
5748 && param.iOutputGlyphs == 1
5749 && param.iOutput[0].iCode == 0x80000c20);
5751 #if defined __WINS__ || defined __WINSCW__
5752 TEST(r && param.iPen.iX == 16);
5755 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5757 /*Req 04 1.3.4, 1.3.20
5758 1.3.4 1. Tamil is a semi-syllabic script and in Tamil text rendering the basic unit for handling text must be the orthographic syllable.
5759 2. Therefore, a text-rendering engine should first identify a syllable and then analyze the syllable. Based on the analysis, text-rendering engine should then be able to select and/or shape the glyphs required for rendering the syllable and to perform contextual positioning of glyphs inside a syllable.
5760 3. After a syllable has been formed it must be considered an indivisible and invariable unit.
5761 4. The shape of a syllable is not affected by surrounding syllables.
5762 1.3.20 Syllable is the smallest unbreakable component in Tamil*/
5766 1.3.5 1. In Tamil, when ligatures are used there is a possibility that the shaping of the previous consonant will depend on the next consonant the user enters
5767 2. In Tamil, there is a possibility that even though the characters are entered one by one the position of the matras change depending on the consonant and the type of the matra
5771 1.3.19 In Tamil white space is used as a word boundary. Line breaking should be based on word boundaries
5776 1.2.4 For compatibility with legacy encodings, split matra and vowel representations must be recognized as identical to the single code representations (preferred)
5778 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5780 INFO_PRINTF1(_L("Failed to record test result"));
5781 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4018"));
5784 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4018
5785 @SYMTestCaseDesc Automated GDI testing for Tamil
5786 @SYMTestPriority High
5787 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
5788 Tamil character shaping MUST be based on combining character sequences. All shaping processes (splitting, reordering, glyph selection) MUST occur in the context of combining character sequence.
5789 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5790 @SYMPREQ 1766: Tamil for Sphinx
5791 @SYMREQ 8742:Tamil Text Rendering
5793 testText[6] = 0x0BAA; // Pa
5794 testText[7] = 0x0BCD; //Virama
5795 testText[8] = 0x0B95; //Ka
5796 testText[9] = 0x0BCD; //Virama
5797 testText[10] = 0x0B9F; //Tta
5798 testText[11] = 0x0BC7; //-e
5800 testText[12] = 0x0BAA;//Pa
5801 testText[13] = 0x0BCD;//Virama
5802 testText[14] = 0x0B95;//Ka
5803 testText[15] = 0x0BCC;//AU
5805 testText[16] = 0x0B95; //Ka
5806 testText[17] = 0x0BCD; //Virama
5807 testText[18] = 0x0BB7; //Ssa
5808 testText[19] = 0x0BCB; //OO
5810 param.iPosInText = 6 ;
5811 param.iPen.iX = param.iPen.iY = 0;
5813 r = aFont->GetCharacterPosition2(param,shapeInfo);
5815 TEST(r && param.iPosInText == 12
5816 && param.iOutputGlyphs == 4
5817 && param.iOutput[0].iCode == 0x80000c3a
5818 && param.iOutput[1].iCode == 0x80000c30
5819 && param.iOutput[2].iCode == 0x80000c13
5820 && param.iOutput[3].iCode == 0x80000bfb);
5822 #if defined __WINS__ || defined __WINSCW__
5823 TEST(r && param.iPen.iX == 51);
5826 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[3].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[3].iCode);
5828 param.iPosInText = 12 ;
5829 param.iPen.iX = param.iPen.iY = 0;
5831 r = aFont->GetCharacterPosition2(param,shapeInfo);
5833 TEST(r && param.iPosInText == 16
5834 && param.iOutputGlyphs ==4
5835 && param.iOutput[0].iCode == 0x80000c3a
5836 && param.iOutput[1].iCode == 0x80000c12
5837 && param.iOutput[2].iCode == 0x80000bf6
5838 && param.iOutput[3].iCode == 0x80000c19);
5840 #if defined __WINS__ || defined __WINSCW__
5841 TEST(r && param.iPen.iX == 56);
5844 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[3].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[3].iCode);
5846 param.iPosInText = 16 ;
5847 param.iPen.iX = param.iPen.iY = 0;
5849 r = aFont->GetCharacterPosition2(param,shapeInfo);
5851 TEST(r && param.iPosInText == 20
5852 && param.iOutputGlyphs == 3
5853 && param.iOutput[0].iCode == 0x80000c13
5854 && param.iOutput[1].iCode == 0x80000c2f
5855 && param.iOutput[2].iCode == 0x80000c0d);
5857 #if defined __WINS__ || defined __WINSCW__
5858 TEST(r && param.iPen.iX == 54);
5861 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
5862 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5864 INFO_PRINTF1(_L("Failed to record test result"));
5865 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4019"));
5868 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4019
5869 @SYMTestCaseDesc Automated GDI testing for Tamil
5870 @SYMTestPriority High
5871 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement
5872 Matras /-e/, /-ee/ and /-ai/ are reordered with the consonant they follow in memory order.
5873 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5874 @SYMPREQ 1766: Tamil for Sphinx
5875 @SYMREQ 8742:Tamil Text Rendering
5878 testText[20] = 0x0B95; //Ka
5879 testText[21] = 0x0BC7; //-e
5881 param.iPosInText = 20 ;
5882 param.iPen.iX = param.iPen.iY = 0;
5884 r = aFont->GetCharacterPosition2(param,shapeInfo);
5886 TEST(r && param.iPosInText == 22
5887 && param.iOutputGlyphs == 2
5888 && param.iOutput[0].iCode == 0x80000c13
5889 && param.iOutput[1].iCode == 0x80000bf6 );
5891 #if defined __WINS__ || defined __WINSCW__
5892 TEST(r && param.iPen.iX == 26);
5895 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
5896 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5898 INFO_PRINTF1(_L("Failed to record test result"));
5899 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4020"));
5902 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4020
5903 @SYMTestCaseDesc Automated GDI testing for Tamil
5904 @SYMTestPriority High
5905 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirment
5906 Matras /-o/, /-oo/ and /-au/ are split into two halves that enclose the consonant they follow in memory order.
5907 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5908 @SYMPREQ 1766: Tamil for Sphinx
5909 @SYMREQ 8742:Tamil Text Rendering
5912 testText[22] = 0x0B95; //Ka
5913 testText[23] = 0x0BCA; //O
5916 param.iPosInText = 22 ;
5917 param.iPen.iX = param.iPen.iY = 0;
5919 r = aFont->GetCharacterPosition2(param,shapeInfo);
5921 TEST(r && param.iPosInText == 24
5922 && param.iOutputGlyphs == 3
5923 && param.iOutput[0].iCode == 0x80000c12
5924 && param.iOutput[1].iCode == 0x80000bf6
5925 && param.iOutput[2].iCode == 0x80000c0d);
5927 #if defined __WINS__ || defined __WINSCW__
5928 TEST(r && param.iPen.iX == 37);
5931 INFO_PRINTF7(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x iOutput[2].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode, param.iOutput[2].iCode);
5932 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5934 INFO_PRINTF1(_L("Failed to record test result"));
5935 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4021"));
5938 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4021
5939 @SYMTestCaseDesc Automated GDI testing for Tamil
5940 @SYMTestPriority High
5941 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirment.
5942 Tamil Modifier "Ayatham" MUST be treated as an independent character
5943 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5944 @SYMPREQ 1766: Tamil for Sphinx
5945 @SYMREQ 8742:Tamil Text Rendering
5948 testText[24] = 0x0B95; //Ka
5949 testText[25] = 0x0B83; //Aythem
5950 testText[26] = 0x0B85; //A
5952 param.iPosInText = 24;
5953 param.iPen.iX = param.iPen.iY = 0;
5955 r = aFont->GetCharacterPosition2(param,shapeInfo);
5957 TEST(r && param.iPosInText == 25
5958 && param.iOutputGlyphs == 1
5959 && param.iOutput[0].iCode == 0x80000bf6);
5961 #if defined __WINS__ || defined __WINSCW__
5962 TEST(r && param.iPen.iX == 13);
5965 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
5966 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5968 INFO_PRINTF1(_L("Failed to record test result"));
5969 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4022"));
5972 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4022
5973 @SYMTestCaseDesc Automated GDI testing for Tamil
5974 @SYMTestPriority High
5975 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
5976 Rendering Engine MUST be capable of handling TAMIL ANUSVARA
5977 It has been suggested that this character be deprecated in Unicode
5978 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5979 @SYMPREQ 1766: Tamil for Sphinx
5980 @SYMREQ 8742:Tamil Text Rendering
5983 testText[27] = 0x0B95; //Ka
5984 testText[28] = 0x0B82; //Anusvara
5985 testText[29] = 0x0B95; //Ka
5987 param.iPosInText = 27;
5988 param.iPen.iX = param.iPen.iY = 0;
5990 r = aFont->GetCharacterPosition2(param,shapeInfo);
5992 TEST(r && param.iPosInText == 29
5993 && param.iOutputGlyphs == 2
5994 && param.iOutput[0].iCode == 0x80000bf6
5995 && param.iOutput[1].iCode == 0x80000be8);
5997 #if defined __WINS__ || defined __WINSCW__
5998 TEST(r && param.iPen.iX == 19);
6001 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6002 param.iPosInText = 29;
6003 param.iPen.iX = param.iPen.iY = 0;
6005 r = aFont->GetCharacterPosition2(param,shapeInfo);
6007 TEST(r && param.iPosInText == 30
6008 && param.iOutputGlyphs == 1
6009 && param.iOutput[0].iCode == 0x80000bf6 );
6011 #if defined __WINS__ || defined __WINSCW__
6012 TEST(r && param.iPen.iX == 13);
6015 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6017 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6019 INFO_PRINTF1(_L("Failed to record test result"));
6020 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4023"));
6023 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4023
6024 @SYMTestCaseDesc Automated GDI testing for Tamil
6025 @SYMTestPriority High
6026 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirment
6027 Tamil consonant /ra/ changes its shape, when a virama is applied to it.
6028 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6029 @SYMPREQ 1766: Tamil for Sphinx
6030 @SYMREQ 8742:Tamil Text Rendering
6033 testText[30] = 0x0BB0; //Ra
6034 testText[31] = 0x0BCD; //Virama
6035 testText[32] = 0x8205; //ZWJ
6038 param.iPosInText = 30;
6039 param.iPen.iX = param.iPen.iY = 0;
6041 r = aFont->GetCharacterPosition2(param,shapeInfo);
6043 TEST(r && param.iPosInText == 32
6044 && param.iOutputGlyphs == 2
6045 && param.iOutput[0].iCode == 0x80000c03 );
6047 #if defined __WINS__ || defined __WINSCW__
6048 TEST(r && param.iPen.iX == 10);
6051 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6052 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6054 INFO_PRINTF1(_L("Failed to record test result"));
6055 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4024"));
6058 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4024
6059 @SYMTestCaseDesc Automated GDI testing for Tamil
6060 @SYMTestPriority High
6061 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
6062 Matra /-aa/ is combined to consonants in regular fashion. No extra shaping is required.
6063 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6064 @SYMPREQ 1766: Tamil for Sphinx
6065 @SYMREQ 8742:Tamil Text Rendering
6068 testText[33] = 0x0B95; //Ka
6069 testText[34] = 0x0B82; //Anusvara
6071 param.iPosInText = 33 ;
6072 param.iPen.iX = param.iPen.iY = 0;
6074 r = aFont->GetCharacterPosition2(param,shapeInfo);
6076 TEST(r && param.iPosInText == 35
6077 && param.iOutputGlyphs == 2
6078 && param.iOutput[0].iCode == 0x80000bf6 );
6080 #if defined __WINS__ || defined __WINSCW__
6081 TEST(r && param.iPen.iX == 19);
6084 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6086 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6088 INFO_PRINTF1(_L("Failed to record test result"));
6089 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4025"));
6092 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4025
6093 @SYMTestCaseDesc Automated GDI testing for Tamil
6094 @SYMTestPriority High
6095 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
6096 Matras /-i/ and /-ii/ MUST form a ligature with consonant /tta/.
6097 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6098 @SYMPREQ 1766: Tamil for Sphinx
6099 @SYMREQ 8742:Tamil Text Rendering
6102 testText[35] = 0x0B9F; //Tta
6103 testText[36] = 0x0BBF; //I
6105 testText[37] = 0x0B9F; //Tta
6106 testText[38] = 0x0BC0; //Ii
6108 param.iPosInText = 35 ;
6109 param.iPen.iX = param.iPen.iY = 0;
6111 r = aFont->GetCharacterPosition2(param,shapeInfo);
6113 TEST(r && param.iPosInText == 37
6114 && param.iOutputGlyphs == 1
6115 && param.iOutput[0].iCode == 0x80000c51);
6117 #if defined __WINS__ || defined __WINSCW__
6118 TEST(r && param.iPen.iX == 15);
6121 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6123 param.iPosInText = 37 ;
6124 param.iPen.iX = param.iPen.iY = 0;
6126 r = aFont->GetCharacterPosition2(param,shapeInfo);
6128 TEST(r && param.iPosInText == 39
6129 && param.iOutputGlyphs == 1
6130 && param.iOutput[0].iCode == 0x80000c52);
6132 #if defined __WINS__ || defined __WINSCW__
6133 TEST(r && param.iPen.iX == 13);
6136 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6137 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6139 INFO_PRINTF1(_L("Failed to record test result"));
6140 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4026"));
6143 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4026
6144 @SYMTestCaseDesc Automated GDI testing for Tamil
6145 @SYMTestPriority High
6146 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
6147 Consonant /ra/ takes an alternate shape when combined with matras /-i/ and /-ii/.
6148 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6149 @SYMPREQ 1766: Tamil for Sphinx
6150 @SYMREQ 8742:Tamil Text Rendering
6152 testText[39] = 0x0BB0; //Ra
6153 testText[40] = 0x0BBF; //I
6155 testText[41] = 0x0BB0; //Ra
6156 testText[42] = 0x0BC0; //Ii
6158 param.iPosInText = 39 ;
6159 param.iPen.iX = param.iPen.iY = 0;
6161 r = aFont->GetCharacterPosition2(param,shapeInfo);
6163 TEST(r && param.iPosInText == 41
6164 && param.iOutputGlyphs == 2
6165 && param.iOutput[0].iCode == 0x80000c0d
6166 && param.iOutput[1].iCode == 0x80000c0e );
6168 #if defined __WINS__ || defined __WINSCW__
6169 TEST(r && param.iPen.iX == 13);
6172 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6174 param.iPosInText = 41 ;
6175 param.iPen.iX = param.iPen.iY = 0;
6177 r = aFont->GetCharacterPosition2(param,shapeInfo);
6179 TEST(r && param.iPosInText == 43
6180 && param.iOutputGlyphs == 2
6181 && param.iOutput[0].iCode == 0x80000c0d
6182 && param.iOutput[1].iCode == 0x80000c0f);
6184 #if defined __WINS__ || defined __WINSCW__
6185 TEST(r && param.iPen.iX == 13);
6188 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6189 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6191 INFO_PRINTF1(_L("Failed to record test result"));
6192 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4027"));
6195 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4027
6196 @SYMTestCaseDesc Automated GDI testing for Tamil
6197 @SYMTestPriority High
6198 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement
6199 Matras /-i/ and /-ii/ take an alternate form when applied to consonants /nga/, /pa/, /ya/ and /va/.
6200 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6201 @SYMPREQ 1766: Tamil for Sphinx
6202 @SYMREQ 8742:Tamil Text Rendering
6204 testText[43] = 0x0B99; //Nga
6205 testText[44] = 0x0BBF; //I
6207 testText[45] = 0x0B99; //Nga
6208 testText[46] = 0x0BC0; //Ii
6210 param.iPosInText = 43 ;
6211 param.iPen.iX = param.iPen.iY = 0;
6213 r = aFont->GetCharacterPosition2(param,shapeInfo);
6215 TEST(r && param.iPosInText == 45
6216 && param.iOutputGlyphs == 2
6217 && param.iOutput[0].iCode == 0x80000bf7
6218 && param.iOutput[1].iCode == 0x80000c0e );
6220 #if defined __WINS__ || defined __WINSCW__
6221 TEST(r && param.iPen.iX == 19);
6224 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6225 param.iPosInText = 45 ;
6226 param.iPen.iX = param.iPen.iY = 0;
6228 r = aFont->GetCharacterPosition2(param,shapeInfo);
6230 TEST(r && param.iPosInText == 47
6231 && param.iOutputGlyphs == 1
6232 && param.iOutput[0].iCode == 0x80000c4a );
6234 #if defined __WINS__ || defined __WINSCW__
6235 TEST(r && param.iPen.iX == 17);
6238 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6239 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6241 INFO_PRINTF1(_L("Failed to record test result"));
6242 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4028"));
6246 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4028
6247 @SYMTestCaseDesc Automated GDI testing for Tamil
6248 @SYMTestPriority High
6249 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
6250 Matras /-u/ and /-uu/ join in ligature form with all other consonants than /ha/, /ja/, /sa/, /ssa/ and /k.ssa/.
6251 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6252 @SYMPREQ 1766: Tamil for Sphinx
6253 @SYMREQ 8742:Tamil Text Rendering
6255 testText[47] = 0x0B9C; //Ja
6256 testText[48] = 0x0BC1; //U
6258 testText[49] = 0x0B9C; //Ja
6259 testText[50] = 0x0BC2; //Uu
6261 param.iPosInText = 47 ;
6262 param.iPen.iX = param.iPen.iY = 0;
6264 r = aFont->GetCharacterPosition2(param,shapeInfo);
6266 TEST(r && param.iPosInText == 49
6267 && param.iOutputGlyphs == 2
6268 && param.iOutput[0].iCode == 0x80000bf9
6269 && param.iOutput[1].iCode == 0x80000c10);
6271 #if defined __WINS__ || defined __WINSCW__
6272 TEST(r && param.iPen.iX == 26);
6275 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6277 param.iPosInText = 49;
6278 param.iPen.iX = param.iPen.iY = 0;
6280 r = aFont->GetCharacterPosition2(param,shapeInfo);
6282 TEST(r && param.iPosInText == 51
6283 && param.iOutputGlyphs == 2
6284 && param.iOutput[0].iCode == 0x80000bf9
6285 && param.iOutput[1].iCode == 0x80000c11 );
6287 #if defined __WINS__ || defined __WINSCW__
6288 TEST(r && param.iPen.iX == 29);
6291 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6292 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6294 INFO_PRINTF1(_L("Failed to record test result"));
6295 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4029"));
6298 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4029
6299 @SYMTestCaseDesc Automated GDI testing for Tamil
6300 @SYMTestPriority High
6301 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
6302 Matra /-ai/ is combined to consonants in regular fashion. No extra shaping is required.
6303 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6304 @SYMPREQ 1766: Tamil for Sphinx
6305 @SYMREQ 8742:Tamil Text Rendering
6307 testText[51] = 0x0B95; //Ka
6308 testText[52] = 0x0BC8; //Ai
6310 param.iPosInText = 51;
6311 param.iPen.iX = param.iPen.iY = 0;
6313 r = aFont->GetCharacterPosition2(param,shapeInfo);
6315 TEST(r && param.iPosInText == 53
6316 && param.iOutputGlyphs == 2
6317 && param.iOutput[0].iCode == 0x80000c14
6318 && param.iOutput[1].iCode == 0x80000bf6);
6320 #if defined __WINS__ || defined __WINSCW__
6321 TEST(r && param.iPen.iX == 31);
6324 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6325 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6327 INFO_PRINTF1(_L("Failed to record test result"));
6328 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4030"));
6331 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4030
6332 @SYMTestCaseDesc Automated GDI testing for Tamil
6333 @SYMTestPriority High
6334 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement
6335 Consonant cluster <ka, virama, ssa> MUST always form conjunct consonant /k.ssa/, which behaves as if it were a proper consonant of its own
6336 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6337 @SYMPREQ 1766: Tamil for Sphinx
6338 @SYMREQ 8742:Tamil Text Rendering
6340 testText[53] = 0x0B95; //Ka
6341 testText[54] = 0x0BCD; //Virama
6342 testText[55] = 0x0BB7; //Ssa
6344 param.iPosInText = 53;
6345 param.iPen.iX = param.iPen.iY = 0;
6347 r = aFont->GetCharacterPosition2(param,shapeInfo);
6349 TEST(r && param.iPosInText == 56
6350 && param.iOutputGlyphs == 1
6351 && param.iOutput[0].iCode == 0x80000c2f );
6353 #if defined __WINS__ || defined __WINSCW__
6354 TEST(r && param.iPen.iX == 31);
6357 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6358 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6360 INFO_PRINTF1(_L("Failed to record test result"));
6361 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4031"));
6364 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4031
6365 @SYMTestCaseDesc Automated GDI testing for Tamil
6366 @SYMTestPriority High
6367 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
6368 Character sequence <sa, virama, ra, matra_ii> MUST be rendered as a ligature form /s.rii/.
6369 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6370 @SYMPREQ 1766: Tamil for Sphinx
6371 @SYMREQ 8742:Tamil Text Rendering
6373 testText[56] = 0x0BB8; //Sa
6374 testText[57] = 0x0BCD; //Virama
6375 testText[58] = 0x0BB0; //Ra
6376 testText[59] = 0x0BC0; //Matra I
6378 param.iPosInText = 56;
6379 param.iPen.iX = param.iPen.iY = 0;
6381 r = aFont->GetCharacterPosition2(param,shapeInfo);
6383 TEST(r && param.iPosInText == 60
6384 && param.iOutputGlyphs == 1
6385 && param.iOutput[0].iCode == 0x80000c79 );
6387 #if defined __WINS__ || defined __WINSCW__
6388 TEST(r && param.iPen.iX == 27);
6391 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6392 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6394 INFO_PRINTF1(_L("Failed to record test result"));
6395 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4032"));
6398 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4032
6399 @SYMTestCaseDesc Automated GDI testing for Tamil
6400 @SYMTestPriority High
6401 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
6402 Vertical position of the glyphs for combining characters virama, matras /-i/ and /-ii/ must be determined separately in relation to the relevant base glyph
6403 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6404 @SYMPREQ 1766: Tamil for Sphinx
6405 @SYMREQ 8742:Tamil Text Rendering
6407 testText[60] = 0x0B95; //Ka
6408 testText[62] = 0x0BCD; //Virama
6409 testText[63] = 0x8205; //ZWJ
6411 param.iPosInText = 60;
6412 param.iPen.iX = param.iPen.iY = 0;
6414 r = aFont->GetCharacterPosition2(param,shapeInfo);
6416 TEST(r && param.iPosInText == 61
6417 && param.iOutputGlyphs == 1
6418 && param.iOutput[0].iCode == 0x80000bf6 );
6420 #if defined __WINS__ || defined __WINSCW__
6421 TEST(r && param.iPen.iX == 13);
6424 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6425 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6427 INFO_PRINTF1(_L("Failed to record test result"));
6431 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3479
6432 @SYMTestCaseDesc Automated GDI testing for correct localised punctuation after indic characters
6433 @SYMTestPriority High
6434 @SYMTestActions Attempt to compose various valid Indic strings with western punctuation
6435 @SYMTestExpectedResults The expected punctuation glyphs for the implied locale should be returned
6438 void CTGlyphSelection::TestGlyphs(CFont* aFont, CFont::TPositionParam& aParam,
6439 const TPtrC16& aText, const TPtrC16& aExpectedGlyphs)
6441 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3479"));
6442 TUint16* glyphs = CONST_CAST(TUint16*,aExpectedGlyphs.Ptr());
6443 const TInt mask = 0x80000000-1;
6445 RShapeInfo shapeInfo;
6446 aParam.iText.Set(aText);
6447 aParam.iPosInText = aParam.iPen.iX = aParam.iPen.iY = 0;
6448 while(aParam.iPosInText < aParam.iText.Length())
6450 r = aFont->GetCharacterPosition2(aParam,shapeInfo);
6451 //INFO_PRINTF3(_L("Glyph %d Icode 0x%x"),*glyphs,aParam.iOutput[0].iCode);
6452 TEST(r && ((aParam.iOutput[0].iCode & mask) == *glyphs++));
6455 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6457 INFO_PRINTF1(_L("Failed to record test result"));
6459 void CTGlyphSelection::TestTeluguChars(CFbsFont* aFont)
6461 INFO_PRINTF1(_L("Test Telugu Glyphs"));
6464 TBuf<162> testText(0);
6465 CFont::TPositionParam param;
6466 param.iDirection = CFont::EHorizontal;
6467 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
6469 testText.SetLength(162);
6470 // Make sure there is no garbage values in the memory we are using.
6471 for (TInt i = 0; i < testText.Length(); i++)
6474 param.iText.Set(testText);
6475 RShapeInfo shapeInfo;
6477 //Testdata for Telugu Langauage
6478 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4033"));
6480 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4033
6481 @SYMTestCaseDesc Automated GDI testing for Telugu
6482 @SYMTestPriority High
6483 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6484 These consonants contain a small tick mark (crest) at the top of the glyph. This graphical detail can be considered to be a vocalic stem that indirectly indicates the inherent vowel /-a/. VIRAMA replaces the vocalic stem.
6485 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6486 @SYMPREQ 1766: Tamil for Sphinx
6487 @SYMREQ 8743:Tamil Text Rendering
6491 testText[0] = 0x0C15;
6492 testText[1] = 0x0C4D;
6493 param.iPosInText = 0 ;
6494 param.iPen.iX = param.iPen.iY = 0;
6495 r = aFont->GetCharacterPosition2(param,shapeInfo);
6497 TEST(r && param.iPosInText == 2
6498 && param.iOutputGlyphs == 1
6499 && param.iOutput[0].iCode == 0x80000f49 );
6501 #if defined __WINS__ || defined __WINSCW__
6502 TEST(r && param.iPen.iX == 9);
6505 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6506 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6508 INFO_PRINTF1(_L("Failed to record test result"));
6509 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4034"));
6511 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4034
6512 @SYMTestCaseDesc Automated GDI testing for Telugu
6513 @SYMTestPriority High
6514 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6515 ?VIRAMA attaches the upward stroke at the right of the glyph.
6516 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6517 @SYMPREQ 1766: Tamil for Sphinx
6518 @SYMREQ 8743:Tamil Text Rendering
6520 testText[2] = 0x0C16;
6521 testText[3] = 0x0C4D;
6523 param.iPosInText = 2 ;
6525 param.iPen.iX = param.iPen.iY = 0;
6527 r = aFont->GetCharacterPosition2(param,shapeInfo);
6530 TEST(r && param.iPosInText == 4
6531 && param.iOutputGlyphs == 1
6532 && param.iOutput[0].iCode == 0x80000f4a);
6534 #if defined __WINS__ || defined __WINSCW__
6535 TEST(r && param.iPen.iX == 13);
6538 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6539 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6541 INFO_PRINTF1(_L("Failed to record test result"));
6542 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4035"));
6544 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4035
6545 @SYMTestCaseDesc Automated GDI testing for Telugu
6546 @SYMTestPriority High
6547 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6548 ?VIRAMA is attached to a stroke at the upper right corner.
6549 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6550 @SYMPREQ 1766: Tamil for Sphinx
6551 @SYMREQ 8743:Tamil Text Rendering
6554 testText[4] = 0x0C23;
6555 testText[5] = 0x0C4D;
6557 param.iPosInText = 4 ;
6558 param.iPen.iX = param.iPen.iY = 0;
6559 r = aFont->GetCharacterPosition2(param,shapeInfo);
6561 TEST(r && param.iPosInText == 6
6562 && param.iOutputGlyphs == 1
6563 && param.iOutput[0].iCode == 0x80000f57 );
6565 #if defined __WINS__ || defined __WINSCW__
6566 TEST(r && param.iPen.iX == 13);
6569 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6570 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6572 INFO_PRINTF1(_L("Failed to record test result"));
6573 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4036"));
6575 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4036
6576 @SYMTestCaseDesc Automated GDI testing for Telugu
6577 @SYMTestPriority High
6578 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6579 Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
6580 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6581 @SYMPREQ 1766: Tamil for Sphinx
6582 @SYMREQ 8743:Tamil Text Rendering
6585 testText[6] = 0x0C2E;
6586 testText[7] = 0x0C43;
6588 param.iPosInText = 6 ;
6589 param.iPen.iX = param.iPen.iY = 0;
6590 r = aFont->GetCharacterPosition2(param,shapeInfo);
6592 TEST(r && param.iPosInText == 8
6593 && param.iOutputGlyphs == 2
6594 && param.iOutput[0].iCode == 0x80000f21
6595 && param.iOutput[1].iCode == 0x80000f31 );
6597 #if defined __WINS__ || defined __WINSCW__
6598 TEST(r && param.iPen.iX == 24);
6601 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6602 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6604 INFO_PRINTF1(_L("Failed to record test result"));
6605 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4037"));
6607 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4037
6608 @SYMTestCaseDesc Automated GDI testing for Telugu
6609 @SYMTestPriority High
6610 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6611 Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
6612 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6613 @SYMPREQ 1766: Tamil for Sphinx
6614 @SYMREQ 8743:Tamil Text Rendering
6616 testText[8] = 0x0C32;
6618 testText[9] = 0x0C44;
6620 param.iPosInText = 8 ;
6621 param.iPen.iX = param.iPen.iY = 0;
6623 r = aFont->GetCharacterPosition2(param,shapeInfo);
6625 TEST(r && param.iPosInText == 10
6626 && param.iOutputGlyphs == 2
6627 && param.iOutput[0].iCode == 0x80000f25
6628 && param.iOutput[1].iCode == 0x80000f32);
6630 #if defined __WINS__ || defined __WINSCW__
6631 TEST(r && param.iPen.iX == 22);
6634 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
6635 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6637 INFO_PRINTF1(_L("Failed to record test result"));
6638 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4038"));
6640 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4038
6641 @SYMTestCaseDesc Automated GDI testing for Telugu
6642 @SYMTestPriority High
6643 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6644 ?Matras MATRA VOCALIC R and MATRA VOCALIC RR never attach the consonant glyph causing shape changes, but they are always placed at the right of the consonant glyph.
6645 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6646 @SYMPREQ 1766: Tamil for Sphinx
6647 @SYMREQ 8743:Tamil Text Rendering
6650 testText[10] = 0x0C15;
6651 testText[11] = 0x0C3E;
6653 param.iPosInText = 10 ;
6654 param.iPen.iX = param.iPen.iY = 0;
6655 r = aFont->GetCharacterPosition2(param,shapeInfo);
6657 TEST(r && param.iPosInText == 12
6658 && param.iOutputGlyphs == 1
6659 && param.iOutput[0].iCode == 0x80000f6d );
6661 #if defined __WINS__ || defined __WINSCW__
6662 TEST(r && param.iPen.iX == 13);
6665 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6666 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6668 INFO_PRINTF1(_L("Failed to record test result"));
6669 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4039"));
6671 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4039
6672 @SYMTestCaseDesc Automated GDI testing for Telugu
6673 @SYMTestPriority High
6674 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6675 ?MATRA AA attaches to the upwards left curving stroke
6676 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6677 @SYMPREQ 1766: Tamil for Sphinx
6678 @SYMREQ 8743:Tamil Text Rendering
6680 testText[12] = 0x0C1F;
6681 testText[13] = 0x0C3E;
6682 param.iPosInText = 12 ;
6683 param.iPen.iX = param.iPen.iY = 0;
6684 r = aFont->GetCharacterPosition2(param,shapeInfo);
6686 TEST(r && param.iPosInText == 14
6687 && param.iOutputGlyphs == 1
6688 && param.iOutput[0].iCode == 0x80000f77 );
6690 #if defined __WINS__ || defined __WINSCW__
6691 TEST(r && param.iPen.iX == 16);
6694 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6695 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6697 INFO_PRINTF1(_L("Failed to record test result"));
6698 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4040"));
6700 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4040
6701 @SYMTestCaseDesc Automated GDI testing for Telugu
6702 @SYMTestPriority High
6703 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6704 ?MATRA AA attaches the upwards (left curving) stroke at the top of the glyph
6705 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6706 @SYMPREQ 1766: Tamil for Sphinx
6707 @SYMREQ 8743:Tamil Text Rendering
6709 testText[14] = 0x0C1C;
6710 testText[15] = 0x0C3E;
6712 param.iPosInText = 14 ;
6713 param.iPen.iX = param.iPen.iY = 0;
6714 r = aFont->GetCharacterPosition2(param,shapeInfo);
6716 TEST(r && param.iPosInText == 16
6717 && param.iOutputGlyphs == 1
6718 && param.iOutput[0].iCode == 0x80000f74 );
6720 #if defined __WINS__ || defined __WINSCW__
6721 TEST(r && param.iPen.iX == 15);
6724 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6725 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6727 INFO_PRINTF1(_L("Failed to record test result"));
6728 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4041"));
6730 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4041
6731 @SYMTestCaseDesc Automated GDI testing for Telugu
6732 @SYMTestPriority High
6733 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6734 ?MATRA AA is drawn on top of the glyph
6735 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6736 @SYMPREQ 1766: Tamil for Sphinx
6737 @SYMREQ 8743:Tamil Text Rendering
6739 testText[16] = 0x0C23;
6740 testText[17] = 0x0C3E;
6742 param.iPosInText = 16 ;
6743 param.iPen.iX = param.iPen.iY = 0;
6744 r = aFont->GetCharacterPosition2(param,shapeInfo);
6746 TEST(r && param.iPosInText == 18
6747 && param.iOutputGlyphs == 1
6748 && param.iOutput[0].iCode == 0x80000f7b );
6750 #if defined __WINS__ || defined __WINSCW__
6751 TEST(r && param.iPen.iX == 16);
6754 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6755 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6757 INFO_PRINTF1(_L("Failed to record test result"));
6758 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4042"));
6760 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4042
6761 @SYMTestCaseDesc Automated GDI testing for Telugu
6762 @SYMTestPriority High
6763 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6764 ?MATRA AA attaches to the upwards left curving stroke, the vowel stem remains intact
6765 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6766 @SYMPREQ 1766: Tamil for Sphinx
6767 @SYMREQ 8743:Tamil Text Rendering
6769 testText[18] = 0x0C2B;
6770 testText[19] = 0x0C3E;
6772 param.iPosInText = 18 ;
6773 param.iPen.iX = param.iPen.iY = 0;
6775 r = aFont->GetCharacterPosition2(param,shapeInfo);
6777 TEST(r && param.iPosInText == 20
6778 && param.iOutputGlyphs == 1
6779 && param.iOutput[0].iCode == 0x80000f82 );
6781 #if defined __WINS__ || defined __WINSCW__
6782 TEST(r && param.iPen.iX == 16);
6785 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6786 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6788 INFO_PRINTF1(_L("Failed to record test result"));
6789 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4043"));
6791 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4043
6792 @SYMTestCaseDesc Automated GDI testing for Telugu
6793 @SYMTestPriority High
6794 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6795 ?MATRA AA replaces the vowel stem, the upwards left curving stroke is extended
6796 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6797 @SYMPREQ 1766: Tamil for Sphinx
6798 @SYMREQ 8743:Tamil Text Rendering
6800 testText[20] = 0x0C2A;
6801 testText[21] = 0x0C3E;
6803 param.iPosInText = 20 ;
6804 param.iPen.iX = param.iPen.iY = 0;
6806 r = aFont->GetCharacterPosition2(param,shapeInfo);
6808 TEST(r && param.iPosInText == 22
6809 && param.iOutputGlyphs == 1
6810 && param.iOutput[0].iCode == 0x80000f81);
6812 #if defined __WINS__ || defined __WINSCW__
6813 TEST(r && param.iPen.iX == 16);
6816 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6817 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6819 INFO_PRINTF1(_L("Failed to record test result"));
6820 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4044"));
6823 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4044
6824 @SYMTestCaseDesc Automated GDI testing for Telugu
6825 @SYMTestPriority High
6826 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6827 ?Vowel sign replaces the vowel stem
6828 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6829 @SYMPREQ 1766: Tamil for Sphinx
6830 @SYMREQ 8743:Tamil Text Rendering
6832 testText[22] = 0x0C26;
6833 testText[23] = 0x0C3F;
6835 param.iPosInText = 22 ;
6836 param.iPen.iX = param.iPen.iY = 0;
6838 r = aFont->GetCharacterPosition2(param,shapeInfo);
6840 TEST(r && param.iPosInText == 24
6841 && param.iOutputGlyphs == 1
6842 && param.iOutput[0].iCode == 0x80000fa2 );
6844 #if defined __WINS__ || defined __WINSCW__
6845 TEST(r && param.iPen.iX == 11);
6848 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6849 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6851 INFO_PRINTF1(_L("Failed to record test result"));
6852 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4045"));
6854 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4045
6855 @SYMTestCaseDesc Automated GDI testing for Telugu
6856 @SYMTestPriority High
6857 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6858 ?The upwards left curving stroke extends, vowel sign attaches to the extended stroke
6859 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6860 @SYMPREQ 1766: Tamil for Sphinx
6861 @SYMREQ 8743:Tamil Text Rendering
6863 testText[24] = 0x0C16;
6864 testText[25] = 0x0C3F;
6866 param.iPosInText = 24 ;
6867 param.iPen.iX = param.iPen.iY = 0;
6869 r = aFont->GetCharacterPosition2(param,shapeInfo);
6871 TEST(r && param.iPosInText == 26
6872 && param.iOutputGlyphs == 1
6873 && param.iOutput[0].iCode == 0x80000f92);
6875 #if defined __WINS__ || defined __WINSCW__
6876 TEST(r && param.iPen.iX == 12);
6879 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6880 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6882 INFO_PRINTF1(_L("Failed to record test result"));
6883 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4046"));
6885 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4046
6886 @SYMTestCaseDesc Automated GDI testing for Telugu
6887 @SYMTestPriority High
6888 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6889 ?Vowel sign attaches the upward stroke at the top of the glyph
6890 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6891 @SYMPREQ 1766: Tamil for Sphinx
6892 @SYMREQ 8743:Tamil Text Rendering
6894 testText[26] = 0x0C1C;
6895 testText[27] = 0x0C3F;
6897 param.iPosInText = 26 ;
6898 param.iPen.iX = param.iPen.iY = 0;
6900 r = aFont->GetCharacterPosition2(param,shapeInfo);
6902 TEST(r && param.iPosInText == 28
6903 && param.iOutputGlyphs == 1
6904 && param.iOutput[0].iCode == 0x80000f98 );
6906 #if defined __WINS__ || defined __WINSCW__
6907 TEST(r && param.iPen.iX == 12);
6910 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6911 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6913 INFO_PRINTF1(_L("Failed to record test result"));
6914 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4047"));
6916 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4047
6917 @SYMTestCaseDesc Automated GDI testing for Telugu
6918 @SYMTestPriority High
6919 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6920 ?Vowel sign attaches the upward stroke at the top of the glyph
6921 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6922 @SYMPREQ 1766: Tamil for Sphinx
6923 @SYMREQ 8743:Tamil Text Rendering
6925 testText[28] = 0x0C1E;
6926 testText[29] = 0x0C40;
6928 param.iPosInText = 28 ;
6929 param.iPen.iX = param.iPen.iY = 0;
6931 r = aFont->GetCharacterPosition2(param,shapeInfo);
6933 TEST(r && param.iPosInText == 30
6934 && param.iOutputGlyphs == 1
6935 && param.iOutput[0].iCode == 0x80000fbe );
6937 #if defined __WINS__ || defined __WINSCW__
6938 TEST(r && param.iPen.iX == 14);
6941 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6942 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6944 INFO_PRINTF1(_L("Failed to record test result"));
6945 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4048"));
6947 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4048
6948 @SYMTestCaseDesc Automated GDI testing for Telugu
6949 @SYMTestPriority High
6950 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6951 ?Vowel sign attaches to the right upper corner of the glyph
6952 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6953 @SYMPREQ 1766: Tamil for Sphinx
6954 @SYMREQ 8743:Tamil Text Rendering
6956 testText[30] = 0x0C1F;
6957 testText[31] = 0x0C3F;
6959 param.iPosInText = 30;
6960 param.iPen.iX = param.iPen.iY = 0;
6962 r = aFont->GetCharacterPosition2(param,shapeInfo);
6964 TEST(r && param.iPosInText == 32
6965 && param.iOutputGlyphs == 1
6966 && param.iOutput[0].iCode == 0x80000f9b );
6968 #if defined __WINS__ || defined __WINSCW__
6969 TEST(r && param.iPen.iX == 12);
6972 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
6973 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6975 INFO_PRINTF1(_L("Failed to record test result"));
6976 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4049"));
6978 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4049
6979 @SYMTestCaseDesc Automated GDI testing for Telugu
6980 @SYMTestPriority High
6981 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6982 ?Vowel sign takes a loop form that replaces the vowel stem
6983 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6984 @SYMPREQ 1766: Tamil for Sphinx
6985 @SYMREQ 8743:Tamil Text Rendering
6987 testText[32] = 0x0C1D;
6988 testText[33] = 0x0C3F;
6990 param.iPosInText = 32 ;
6991 param.iPen.iX = param.iPen.iY = 0;
6993 r = aFont->GetCharacterPosition2(param,shapeInfo);
6995 TEST(r && param.iPosInText == 34
6996 && param.iOutputGlyphs == 1
6997 && param.iOutput[0].iCode == 0x80000f99 );
6999 #if defined __WINS__ || defined __WINSCW__
7000 TEST(r && param.iPen.iX == 19);
7003 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7004 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7006 INFO_PRINTF1(_L("Failed to record test result"));
7007 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4050"));
7009 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4050
7010 @SYMTestCaseDesc Automated GDI testing for Telugu
7011 @SYMTestPriority High
7012 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7013 ?The upwards left curving stroke extends, vowel sign replaces the vowel stem at the tip of the extended stroke
7014 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7015 @SYMPREQ 1766: Tamil for Sphinx
7016 @SYMREQ 8743:Tamil Text Rendering
7018 testText[34] = 0x0C1B;
7019 testText[35] = 0x0C3F;
7021 param.iPosInText =34 ;
7022 param.iPen.iX = param.iPen.iY = 0;
7024 r = aFont->GetCharacterPosition2(param,shapeInfo);
7026 TEST(r && param.iPosInText == 36
7027 && param.iOutputGlyphs == 1
7028 && param.iOutput[0].iCode == 0x80000f97 );
7030 #if defined __WINS__ || defined __WINSCW__
7031 TEST(r && param.iPen.iX == 12);
7034 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7035 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7037 INFO_PRINTF1(_L("Failed to record test result"));
7038 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4051"));
7040 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4051
7041 @SYMTestCaseDesc Automated GDI testing for Telugu
7042 @SYMTestPriority High
7043 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7044 ?Vowel sign replaces the upwards curving stroke at the top of the glyph
7045 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7046 @SYMPREQ 1766: Tamil for Sphinx
7047 @SYMREQ 8743:Tamil Text Rendering
7049 testText[36] = 0x0C1C;
7050 testText[37] = 0x0C3F;
7052 param.iPosInText = 36 ;
7053 param.iPen.iX = param.iPen.iY = 0;
7055 r = aFont->GetCharacterPosition2(param,shapeInfo);
7057 TEST(r && param.iPosInText == 38
7058 && param.iOutputGlyphs == 1
7059 && param.iOutput[0].iCode == 0x80000f98 );
7061 #if defined __WINS__ || defined __WINSCW__
7062 TEST(r && param.iPen.iX == 12);
7065 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7066 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7068 INFO_PRINTF1(_L("Failed to record test result"));
7069 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4052"));
7071 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4052
7072 @SYMTestCaseDesc Automated GDI testing for Telugu
7073 @SYMTestPriority High
7074 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7075 ?Vowel stem is removed.
7076 ?Vowel stem is removed and MATRA II takes a form that looks like MATRA AA
7077 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7078 @SYMPREQ 1766: Tamil for Sphinx
7079 @SYMREQ 8743:Tamil Text Rendering
7081 testText[38] = 0x0C2F;
7082 testText[39] = 0x0C3F;
7084 param.iPosInText = 38 ;
7085 param.iPen.iX = param.iPen.iY = 0;
7087 r = aFont->GetCharacterPosition2(param,shapeInfo);
7089 TEST(r && param.iPosInText == 40
7090 && param.iOutputGlyphs == 1
7091 && param.iOutput[0].iCode == 0x80000faa );
7093 #if defined __WINS__ || defined __WINSCW__
7094 TEST(r && param.iPen.iX == 19);
7097 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7098 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7100 INFO_PRINTF1(_L("Failed to record test result"));
7101 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4053"));
7103 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4053
7104 @SYMTestCaseDesc Automated GDI testing for Telugu
7105 @SYMTestPriority High
7106 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7107 ?Vowel sign attaches to the right of the consonant glyph, vowel stem remains intact
7108 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7109 @SYMPREQ 1766: Tamil for Sphinx
7110 @SYMREQ 8743:Tamil Text Rendering
7112 testText[40] = 0x0C15;
7113 testText[41] = 0x0C41;
7115 param.iPosInText = 40 ;
7116 param.iPen.iX = param.iPen.iY = 0;
7117 r = aFont->GetCharacterPosition2(param,shapeInfo);
7119 TEST(r && param.iPosInText ==42
7120 && param.iOutputGlyphs == 1
7121 && param.iOutput[0].iCode == 0x80000fd9 );
7123 #if defined __WINS__ || defined __WINSCW__
7124 TEST(r && param.iPen.iX == 14);
7127 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7128 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7130 INFO_PRINTF1(_L("Failed to record test result"));
7131 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4054"));
7133 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4054
7134 @SYMTestCaseDesc Automated GDI testing for Telugu
7135 @SYMTestPriority High
7136 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7137 ?Vowel sign takes a miniature form which attaches to the stroke at the top of the consonant glyph
7138 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7139 @SYMPREQ 1766: Tamil for Sphinx
7140 @SYMREQ 8743:Tamil Text Rendering
7142 testText[42] = 0x0C19;
7143 testText[43] = 0x0C41;
7145 param.iPosInText = 42 ;
7146 param.iPen.iX = param.iPen.iY = 0;
7148 r = aFont->GetCharacterPosition2(param,shapeInfo);
7150 TEST(r && param.iPosInText == 44
7151 && param.iOutputGlyphs == 1
7152 && param.iOutput[0].iCode == 0x80000fda );
7154 #if defined __WINS__ || defined __WINSCW__
7155 TEST(r && param.iPen.iX == 15);
7158 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7159 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7161 INFO_PRINTF1(_L("Failed to record test result"));
7162 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4055"));
7164 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4055
7165 @SYMTestCaseDesc Automated GDI testing for Telugu
7166 @SYMTestPriority High
7167 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7168 ?Vowel sign attaches the consonant sign from below. Vowel stem remains intact.
7169 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7170 @SYMPREQ 1766: Tamil for Sphinx
7171 @SYMREQ 8743:Tamil Text Rendering
7173 testText[44] = 0x0C2E;
7174 testText[45] = 0x0C41;
7176 param.iPosInText = 44 ;
7177 param.iPen.iX = param.iPen.iY = 0;
7178 r = aFont->GetCharacterPosition2(param,shapeInfo);
7180 TEST(r && param.iPosInText == 46
7181 && param.iOutputGlyphs == 2
7182 && param.iOutput[0].iCode == 0x80000f21 );
7184 #if defined __WINS__ || defined __WINSCW__
7185 TEST(r && param.iPen.iX == 21);
7188 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7190 testText[46] = 0x0C36;
7191 testText[47] = 0x0C41;
7193 param.iPosInText = 46 ;
7194 param.iPen.iX = param.iPen.iY = 0;
7195 r = aFont->GetCharacterPosition2(param,shapeInfo);
7197 TEST(r && param.iPosInText == 48
7198 && param.iOutputGlyphs == 2
7199 && param.iOutput[0].iCode == 0x80000f28 );
7201 #if defined __WINS__ || defined __WINSCW__
7202 TEST(r && param.iPen.iX == 14);
7205 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7206 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7208 INFO_PRINTF1(_L("Failed to record test result"));
7209 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4056"));
7211 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4056
7212 @SYMTestCaseDesc Automated GDI testing for Telugu
7213 @SYMTestPriority High
7214 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7215 ?Vowel sign replaces the vowel stem
7216 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7217 @SYMPREQ 1766: Tamil for Sphinx
7218 @SYMREQ 8743:Tamil Text Rendering
7221 testText[48] = 0x0C28;
7222 testText[49] = 0x0C46;
7224 param.iPosInText = 48 ;
7225 param.iPen.iX = param.iPen.iY = 0;
7226 r = aFont->GetCharacterPosition2(param,shapeInfo);
7228 TEST(r && param.iPosInText == 50
7229 && param.iOutputGlyphs == 1
7230 && param.iOutput[0].iCode == 0x80001000 );
7232 #if defined __WINS__ || defined __WINSCW__
7233 TEST(r && param.iPen.iX == 11);
7236 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7237 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7239 INFO_PRINTF1(_L("Failed to record test result"));
7240 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4057"));
7242 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4057
7243 @SYMTestCaseDesc Automated GDI testing for Telugu
7244 @SYMTestPriority High
7245 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7246 ?Vowel sign replaces the vowel stem
7247 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7248 @SYMPREQ 1766: Tamil for Sphinx
7249 @SYMREQ 8743:Tamil Text Rendering
7251 testText[50] = 0x0C1B;
7252 testText[51] = 0x0C47;
7254 param.iPosInText = 50 ;
7255 param.iPen.iX = param.iPen.iY = 0;
7256 r = aFont->GetCharacterPosition2(param,shapeInfo);
7258 TEST(r && param.iPosInText == 52
7259 && param.iOutputGlyphs == 1
7260 && param.iOutput[0].iCode == 0x80001017 );
7262 #if defined __WINS__ || defined __WINSCW__
7263 TEST(r && param.iPen.iX == 12);
7266 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7267 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7269 INFO_PRINTF1(_L("Failed to record test result"));
7270 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4058"));
7272 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4058
7273 @SYMTestCaseDesc Automated GDI testing for Telugu
7274 @SYMTestPriority High
7275 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7276 ?Vowel sign replaces the vowel stem
7277 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7278 @SYMPREQ 1766: Tamil for Sphinx
7279 @SYMREQ 8743:Tamil Text Rendering
7281 testText[52] = 0x0C1D;
7282 testText[53] = 0x0C48;
7284 param.iPosInText = 52 ;
7285 param.iPen.iX = param.iPen.iY = 0;
7286 r = aFont->GetCharacterPosition2(param,shapeInfo);
7288 TEST(r && param.iPosInText == 54
7289 && param.iOutputGlyphs == 2
7290 && param.iOutput[0].iCode == 0x80000ff5
7291 && param.iOutput[1].iCode == 0x80000f3b );
7293 #if defined __WINS__ || defined __WINSCW__
7294 TEST(r && param.iPen.iX == 19);
7297 INFO_PRINTF6(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x iOutput[1].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode, param.iOutput[1].iCode);
7298 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7300 INFO_PRINTF1(_L("Failed to record test result"));
7301 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4059"));
7303 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4059
7304 @SYMTestCaseDesc Automated GDI testing for Telugu
7305 @SYMTestPriority High
7306 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7307 ?Vowel sign replaces the vowel stem.
7308 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7309 @SYMPREQ 1766: Tamil for Sphinx
7310 @SYMREQ 8743:Tamil Text Rendering
7313 testText[54] = 0x0C15;
7314 testText[55] = 0x0C4A;
7316 param.iPosInText = 54 ;
7317 param.iPen.iX = param.iPen.iY = 0;
7319 r = aFont->GetCharacterPosition2(param,shapeInfo);
7321 TEST(r && param.iPosInText == 56
7322 && param.iOutputGlyphs == 1
7323 && param.iOutput[0].iCode == 0x80001059 );
7325 #if defined __WINS__ || defined __WINSCW__
7326 TEST(r && param.iPen.iX == 13);
7329 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7330 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7332 INFO_PRINTF1(_L("Failed to record test result"));
7333 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4060"));
7335 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4060
7336 @SYMTestCaseDesc Automated GDI testing for Telugu
7337 @SYMTestPriority High
7338 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7339 ?Vowel sign replaces the vowel stem.
7340 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7341 @SYMPREQ 1766: Tamil for Sphinx
7342 @SYMREQ 8743:Tamil Text Rendering
7345 testText[56] = 0x0C21;
7346 testText[57] = 0x0C4B;
7348 param.iPosInText = 56 ;
7349 param.iPen.iX = param.iPen.iY = 0;
7351 r = aFont->GetCharacterPosition2(param,shapeInfo);
7353 TEST(r && param.iPosInText == 58
7354 && param.iOutputGlyphs == 1
7355 && param.iOutput[0].iCode == 0x80001089 );
7357 #if defined __WINS__ || defined __WINSCW__
7358 TEST(r && param.iPen.iX == 14);
7361 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7362 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
7364 INFO_PRINTF1(_L("Failed to record test result"));
7365 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4061"));
7367 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4061
7368 @SYMTestCaseDesc Automated GDI testing for Telugu
7369 @SYMTestPriority High
7370 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
7371 ?Vowel sign replaces the vowel stem.
7372 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
7373 @SYMPREQ 1766: Tamil for Sphinx
7374 @SYMREQ 8743:Tamil Text Rendering
7376 testText[58] = 0x0C26;
7377 testText[59] = 0x0C4C;
7379 param.iPosInText = 58 ;
7380 param.iPen.iX = param.iPen.iY = 0;
7382 r = aFont->GetCharacterPosition2(param,shapeInfo);
7384 TEST(r && param.iPosInText == 60
7385 && param.iOutputGlyphs == 1
7386 && param.iOutput[0].iCode == 0x800010b2 );
7388 #if defined __WINS__ || defined __WINSCW__
7389 TEST(r && param.iPen.iX == 14);
7392 INFO_PRINTF5(_L("The values are iPosInText=%d iPen.iX=%d iOutputGlyphs=%d iOutput[0].iCode=0x%x"), param.iPosInText, param.iPen.iX, param.iOutputGlyphs, param.iOutput[0].iCode);
7395 void CTGlyphSelection::TestIndicPunctuation(CFbsFont* aFont)
7397 INFO_PRINTF1(_L("Test Indic Punctuation"));
7399 CFont::TPositionParam param;
7400 param.iDirection = CFont::EHorizontal;
7401 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7403 //INFO_PRINTF1(_L("// punctuation string after Kannada text"));
7404 TestGlyphs(aFont,param,_L("\xC95!?#@"),_L("\x7A8\x920\x93C\x922\x23"));
7405 //INFO_PRINTF1(_L("// punctuation string before Kannada text"));
7406 TestGlyphs(aFont,param,_L("!?#@\xC95"),_L("\x21\x3F\x23\x40\x7A8"));
7407 //INFO_PRINTF1(_L("// punctuation string before and after Kannada text"));
7408 TestGlyphs(aFont,param,_L(" \"\xC95\" "),_L("\x20\x20\x22\x7A8\x22\x20\x20"));
7409 //INFO_PRINTF1(_L("// punctuation before and after latin text followed by punctuation before and after kannada text"));
7410 TestGlyphs(aFont,param,_L("\x201c\x041\x201D (\xc95)"),_L("\x201c\x41\x201d\x20\x28\x7a8\x29"));
7411 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween"));
7412 TestGlyphs(aFont,param,_L("\xc95 , \x041"),_L("\x7a8\x20\x929\x20\x41"));
7413 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween (reversed)"));
7414 TestGlyphs(aFont,param,_L("\x041 , \xc95"),_L("\x41\x20\x2C\x20\x7a8"));
7415 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin"));
7416 TestGlyphs(aFont,param,_L("\x041, \xc95"),_L("\x41\x2C\x20\x7a8"));
7417 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada"));
7418 TestGlyphs(aFont,param,_L("\x041 ,\xc95"),_L("\x41\x20\x2C\x7a8"));
7419 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin and seperating tab"));
7420 TestGlyphs(aFont,param,_L("\x041,\t\xc95"),_L("\x41\x2C\x9\x7a8"));
7421 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada and seperating tab"));
7422 TestGlyphs(aFont,param,_L("\x041\t,\xc95"),_L("\x41\x9\x2C\x7a8"));
7423 //INFO_PRINTF1(_L("// devanagari digits with colons"));
7424 TestGlyphs(aFont,param,_L("\x966\x03a\x967\x03a\x968\x03a\x969\x03a\x96a\x03a\x96b\x03a\x96c\x03a\x96d\x03a\x96e\x03a\x96f\x03a"),
7425 _L("\x582\x77e\x583\x77e\x584\x77e\x585\x77e\x586\x77e\x587\x77e\x588\x77e\x589\x77e\x58a\x77e\x58b\x77e"));
7426 //INFO_PRINTF1(_L("// string of only punctuation"));
7427 TestGlyphs(aFont,param,_L("\x002D\x002D\x002D\x002D\x002D\x002D"),_L("\x002D\x002D\x002D\x002D\x002D\x002D"));
7428 //INFO_PRINTF1(_L("// one Kannada character followed my multiple punctuation and non-punctuaion"));
7429 TestGlyphs(aFont,param,_L("\x0C95!\x0022\x00A3$%^&*()-={}[]:@~;'#<>?,./"),
7430 _L("\x07A8\x0920\x0022\x00A3\x0024\x0923\x005E\x0009\x0927\x0028\x0029\x092A\x003D\x007B\x007D\x005B\x005D\x0937\x0023\x007E\x0938\x0027\x0922\x003C\x003E\x093C\x0929\x092B\x092C"));
7435 void CTGlyphSelection::TestIndicCharsL()
7437 // create a font store for testing
7438 CFontStore* fontStore = CFontStore::NewL(&User::Heap());
7440 //load all ecom implemented rasterizer dlls. installs the rasterizer.
7441 LoadOpenFontLibraries(fontStore);
7442 // test font preparation
7443 fontStore->iKPixelWidthInTwips = 11860; //This value is default
7445 //add any required font files
7446 TUid err = fontStore->AddFileL(KTestHindiFontFile);
7448 TFontSpec testHindiFontSpec(KTestHindiFontFaceName,200);
7450 TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
7452 TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
7454 CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
7456 TInt ret = bmp->Create(TSize(100,100),EGray2);
7457 if (ret == KErrNotSupported)
7460 User::LeaveIfError(ret);
7462 CFbsBitmapDevice* device = NULL;
7463 TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
7464 TEST(err2 == KErrNone);
7466 CFbsBitGc* gc = NULL;
7467 User::LeaveIfError(device->CreateContext(gc));
7468 // Font file Creation
7469 CFbsFont* hindiFont = NULL;
7470 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(hindiFont,testHindiFontSpec));
7471 gc->UseFont(hindiFont);
7472 CleanupStack::PushL(hindiFont);
7474 //Testcode for Hindi language
7475 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7476 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-1580"));
7477 TestHindiChars(hindiFont);
7478 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7480 CleanupStack::Pop(hindiFont);
7482 // Font file Creation
7483 CFbsFont* indicFont = NULL;
7484 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
7485 gc->UseFont(indicFont);
7486 CleanupStack::PushL(indicFont);
7488 //Testcode for Kannada, Marathi,Gujarati,Bengali language
7489 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3381"));
7490 TestKannadaChars(indicFont);
7491 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7492 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3360"));
7493 TestMarathiChars(indicFont);
7494 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7495 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3417"));
7496 TestGujaratiChars(indicFont);
7497 TestBengaliChars(indicFont);
7498 TestTamilChars(indicFont);
7499 TestTeluguChars(indicFont);
7500 TestIndicPunctuation(indicFont);
7501 CleanupStack::Pop(indicFont);
7503 //Cleaning the memory
7507 fontStore->RemoveFile(err);
7508 fontStore->RemoveFile(err1);
7510 REComSession::FinalClose();
7515 /** Tests that ligatures (presently just Lam-Alef in Arabic) work correctly
7516 when diacritics are required on one, both or neither character comprising the
7518 void CTGlyphSelection::TestLigaturesWithDiacritics()
7520 // independent letters
7521 const TText KAlef = 0x627;
7522 const TText KLam = 0x644;
7523 const TText KBeh = 0x628;
7525 const TText KFatha = 0x64E;
7526 const TText KDamma = 0x64F;
7528 const TText KLamAlefIsolated = 0xFEFB;
7529 const TText KLamAlefFinal = 0xFEFC;
7533 // Logical order input.
7535 // Visual order input, should be equivalent to iInputL.
7537 // Which cluster to test
7538 TInt iClusterUnderTestStartL;
7539 TInt iClusterUnderTestStartV;
7540 // Expected glyphs to appear (in any order, but...)
7542 // ...number of glyphs from the start of iGlyphs that
7543 // are in order of their expected x-coordinates (of their
7545 TInt iGlyphsInOrder;
7547 const TTestCase KTestCases[] =
7549 {{KLam, KAlef, 0}, {KAlef, KLam, 0},
7550 0, 0, {KLamAlefIsolated, 0}, 1},
7551 {{KBeh, KLam, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KBeh, 0},
7552 1, 1, {KLamAlefFinal, 0}, 1},
7553 {{KLam, KFatha, KAlef, 0}, {KAlef, KLam, KFatha, 0},
7554 0, 0, {KLamAlefIsolated, KFatha, 0}, 1},
7555 {{KBeh, KLam, KFatha, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KFatha, KBeh, 0},
7556 1, 1, {KLamAlefFinal, KFatha, 0}, 1},
7557 {{KLam, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, 0},
7558 0, 0, {KLamAlefIsolated, KDamma, 0}, 1},
7559 {{KBeh, KLam, KAlef, KDamma, KBeh, 0}, {KBeh, KAlef, KDamma, KLam, KBeh, 0},
7560 1, 1, {KLamAlefFinal, KDamma, 0}, 1},
7561 {{KLam, KFatha, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, KFatha, 0},
7562 0, 0, {KDamma, KFatha, KLamAlefIsolated, 0}, 2},
7563 {{KBeh, KLam, KFatha, KAlef, KDamma, KBeh, 0},
7564 {KBeh, KAlef, KDamma, KLam, KFatha, KBeh, 0},
7565 1, 1, {KDamma, KFatha, KLamAlefFinal, 0}, 2},
7568 CFont::TPositionParam param;
7569 for (TInt testCase = 0;
7570 testCase != sizeof(KTestCases)/sizeof(KTestCases[0]);
7573 const TTestCase& t = KTestCases[testCase];
7574 for (TInt logical = 0; logical != 2; ++logical)
7576 const TText* in = logical?
7577 t.iInputL : t.iInputV;
7580 input.Append(*in++);
7581 param.iText.Set(input);
7582 param.iPosInText = logical?
7583 t.iClusterUnderTestStartL : t.iClusterUnderTestStartV;
7584 param.iFlags = static_cast<TUint16>(logical?
7585 CFont::TPositionParam::EFLogicalOrder : 0);
7586 param.iPen.SetXY(0, 0);
7587 TBool r = iTestFont->GetCharacterPosition(param);
7589 TInt currentX = KMinTInt;
7590 TInt expectedGlyphNo = 0;
7591 while (t.iGlyphs[expectedGlyphNo] != 0)
7593 // FInd the expected glyph in the output.
7594 TInt outputGlyph = 0;
7595 while (outputGlyph != param.iOutputGlyphs
7596 && static_cast<TInt>(param.iOutput[outputGlyph].iCode)
7597 != t.iGlyphs[expectedGlyphNo])
7601 TEST(outputGlyph < param.iOutputGlyphs);
7602 TInt x = param.iOutput[outputGlyph].iBounds.Center().iX;
7603 TEST(t.iGlyphsInOrder <= expectedGlyphNo
7608 TEST(expectedGlyphNo == param.iOutputGlyphs);
7613 #if defined(__GCC32__)
7614 typedef wchar_t __TText;
7615 #elif defined(__VC32__)
7616 typedef TUint16 __TText;
7617 #elif defined(__CW32__)
7618 typedef TUint16 __TText;
7619 #elif !defined(__TText_defined)
7620 #error no typedef for __TText
7622 const __TText* KLatinNoSideBearings = L"ABCDE";
7623 const __TText* KLatinLeftSideBearing = L"WABCD";
7624 const __TText* KLatinRightSideBearing = L"ABCDW";
7625 const __TText* KLatinBothSideBearings = L"WABCW";
7626 const __TText* KArabicAlefWaw = L"\x627\x648";
7627 const __TText* KArabicWawAlef = L"\x648\x627";
7628 const __TText* KGb18030NoSideBearings = L"\xD840\xDC00xyz\xD87E\xDE1D";
7629 const __TText* KGb18030LeftSideBearings = L"W\xD840\xDC00xy\xD87E\xDE1D";
7630 const __TText* KGb18030RightSideBearings = L"\xD840\xDC00xy\xD87E\xDE1DW";
7631 const __TText* KGb18030BothSideBearings = L"W\xD840\xDC00x\xD87E\xDE1DW";
7632 struct TMeasureTextTest
7634 const __TText* iText;
7635 TInt iExpectedAdvanceLogical;
7636 TInt iExpectedAdvanceL2R;
7637 TInt iExpectedBoundsL2RLeft;
7638 TInt iExpectedBoundsL2RRight;
7639 TInt iExpectedBoundsL2RTop;
7640 TInt iExpectedBoundsL2RBottom;
7641 TInt iExpectedAdvanceR2L;
7642 TInt iExpectedBoundsR2LLeft;
7643 TInt iExpectedBoundsR2LRight;
7644 TInt iExpectedBoundsR2LTop;
7645 TInt iExpectedBoundsR2LBottom;
7647 const TMeasureTextTest KMeasureTextResults[] =
7649 {KLatinNoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
7650 {KLatinLeftSideBearing, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
7651 {KLatinRightSideBearing, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
7652 {KLatinBothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
7653 {KArabicAlefWaw, 20, 20, 0, 20, -10, 2, 20, -5, 20, -10, 2},
7654 {KArabicWawAlef, 20, 20, -5, 20, -10, 2, 20, 0, 20, -10, 2},
7655 // ones containing surrogate pairs
7656 {KGb18030NoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
7657 {KGb18030LeftSideBearings, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
7658 {KGb18030RightSideBearings, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
7659 {KGb18030BothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
7661 /** Tests CFont::MeasureText */
7662 void CTGlyphSelection::TestMeasureText()
7664 CFont::TMeasureTextInput input;
7665 CFont::TMeasureTextOutput output;
7668 i != sizeof(KMeasureTextResults)/sizeof(KMeasureTextResults[0]); ++i)
7670 TPtrC text(reinterpret_cast<const TText16*>(
7671 KMeasureTextResults[i].iText));
7672 advance = iTestFont->MeasureText(text, &input, &output);
7673 TEST(advance == KMeasureTextResults[i].iExpectedAdvanceLogical);
7674 input.iFlags = CFont::TMeasureTextInput::EFVisualOrder;
7675 advance = iTestFont->MeasureText(text, &input, &output);
7676 TEST(advance == KMeasureTextResults[i].iExpectedAdvanceL2R);
7677 TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsL2RLeft);
7678 TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsL2RRight);
7679 TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsL2RTop);
7680 TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsL2RBottom);
7681 input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
7682 advance = iTestFont->MeasureText(text, &input, &output);
7683 TEST(advance == KMeasureTextResults[i].iExpectedAdvanceR2L);
7684 TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsR2LLeft);
7685 TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsR2LRight);
7686 TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsR2LTop);
7687 TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsR2LBottom);
7690 INFO_PRINTF1(_L("Test fix for INC086257 - EFIncludePenPositionInBoundsCheck"));
7691 // left-to-right w/o flag and bounds set to just fit string disregarding sidebearings
7693 input.iMaxBounds = 50;
7694 iTestFont->MeasureText(_L("XXXXX"), &input, &output);
7695 TEST(output.iChars == 5);
7696 // set flag, string should no longer fit (break happens)
7697 input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
7698 iTestFont->MeasureText(_L("XXXXX"), &input, &output);
7699 TEST(output.iChars == 4);
7700 // right-to-left w/o flag and bounds set to just fit string disregarding sidebearings
7701 input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
7702 iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
7703 TEST(output.iChars == 5);
7704 // set flag, string should no longer fit (break happens)
7705 input.iFlags |= CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
7706 iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
7707 TEST(output.iChars == 4);
7708 // top-to-bottom w/o flag and bounds set to just fit string disregarding endbearings
7710 input.iMaxBounds = 60;
7711 input.iDirection = CFont::EVertical;
7712 iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
7713 TEST(output.iChars == 5);
7714 // set flag, string should no longer fit (break happens)
7715 input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
7716 iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
7717 TEST(output.iChars == 4);
7720 void CTGlyphSelection::RunTestCaseL(TInt aCurTestCase)
7722 This method will execute each test case method in the class
7723 logging its progress as it does so.
7726 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
7727 switch(aCurTestCase)
7731 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0200
7733 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0200"));
7734 INFO_PRINTF1(_L("Test API Boundaries"));
7735 TestApiBoundaries();
7739 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0201
7741 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0201"));
7742 INFO_PRINTF1(_L("Test CTRL Chars"));
7743 TestCtrlCharsIgnored();
7747 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0202
7749 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0202"));
7750 INFO_PRINTF1(_L("Test Latin Chars"));
7755 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0203
7757 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0203"));
7758 INFO_PRINTF1(_L("Test Soft Hypen Char"));
7763 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0204
7765 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0204"));
7766 INFO_PRINTF1(_L("Test Surrogate Pairs"));
7768 INFO_PRINTF1(_L("Test Supplementary Chars"));
7773 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0205
7775 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0205"));
7776 INFO_PRINTF1(_L("Test Combining Latin Chars"));
7777 TestCombiningLatinChars();
7780 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0221"));
7781 INFO_PRINTF1(_L("Test Vietnamese Chars"));
7782 TestVietnameseChars();
7786 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0206
7788 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0206"));
7789 INFO_PRINTF1(_L("Test Vertical/Horizontal Text Bounds"));
7790 TestTextDirection();
7794 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0207
7796 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0207"));
7797 INFO_PRINTF1(_L("Test All Unicode Characters"));
7798 TestAllUnicodeChars();
7802 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0208
7804 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0208"));
7805 INFO_PRINTF1(_L("Test Ligatures with Diacritics"));
7806 TestLigaturesWithDiacritics();
7810 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0209
7812 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0209"));
7813 INFO_PRINTF1(_L("Test CFont::MeasureText()"));
7818 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0210
7820 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0210"));
7821 INFO_PRINTF1(_L("Test Indic Glyphs"));
7826 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0211
7828 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0211"));
7829 INFO_PRINTF1(_L("Test Thai Rendering"));
7834 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0212
7836 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0212"));
7837 INFO_PRINTF1(_L("Test isolated Combining Latin Chars"));
7838 TestIsolatedCombiningLatinChars();
7842 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0213
7844 INFO_PRINTF1(_L("Test Indic Gurmukhi and Malayalam Chars"));
7845 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0213"));
7846 ExecuteIndicGurmukhiMalayalamTests();
7850 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0214
7852 INFO_PRINTF1(_L("Test Rendering Context"));
7853 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0214"));
7854 TestContextInShapeInfo();
7858 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
7859 ((CTGlyphSelectionStep*)iStep)->CloseTMSGraphicsStep();
7862 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7865 void CTGlyphSelection::TestPerformance()
7867 This method tests the performance of the API under test
7868 by executing a 10000 cycles of each test case.
7872 INFO_PRINTF1(_L("Test Performance..."));
7875 for (TInt i = 0; i < 10000; i++)
7877 TestCtrlCharsIgnored();
7881 TestCombiningLatinChars();
7882 TestTextDirection();
7885 TUint numMilliSecs = profile.Stop();
7887 INFO_PRINTF3(_L("Performance test end %d.%d s\n"),numMilliSecs/1000,numMilliSecs%1000);
7891 void CTGlyphSelection::TestThai_SimpleChars()
7893 This routine tests individual Thai base characters pumping them
7894 through the CFont::GetCharacterPosition() API.
7898 CFont::TPositionParam param;
7899 param.iDirection = CFont::EHorizontal;
7900 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7901 TBuf<5> testText(0);
7902 testText.SetLength(1);
7903 param.iText.Set(testText);
7905 for (TUint i=0; Thai_SimpleChars[i] != 0xFFFF; i++)
7907 testText[0] = Thai_SimpleChars[i];
7908 param.iPosInText = 0;
7909 param.iPen.iX = param.iPen.iY = 0;
7911 r = iTestFont->GetCharacterPosition(param);
7913 TEST(r && param.iPosInText == 1
7914 && param.iPen.iX == 10
7915 && param.iOutputGlyphs == 1
7916 && param.iOutput[0].iCode == Thai_SimpleChars[i]);
7921 void CTGlyphSelection::TestThai_ValidGlyphClusters()
7923 This routine tests combining sequences of Thai base & mark
7924 characters pumping them through the CFont::GetCharacterPosition() API.
7925 The sequences mainly test the correct formation of Thay Glyph clusters
7926 and the PUA substutions that take place.
7931 CFont::TPositionParam param;
7932 param.iDirection = CFont::EHorizontal;
7933 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7935 for (TUint i=0; Thai_ValidGlyphClusters[i].iTextLen != -1; i++)
7937 TBuf<8> testText(Thai_ValidGlyphClusters[i].iText);
7938 param.iText.Set(testText);
7939 param.iPosInText = Thai_ValidGlyphClusters[i].iPosInText;
7940 param.iPen.iX = param.iPen.iY = 0;
7942 r = iTestFont->GetCharacterPosition(param);
7944 if (r && param.iPosInText == Thai_ValidGlyphClusters[i].oPosInText
7945 && param.iOutputGlyphs == Thai_ValidGlyphClusters[i].oOutputLen)
7947 for (TInt j=0; j<Thai_ValidGlyphClusters[i].oOutputLen; j++)
7949 if (param.iOutput[j].iCode != Thai_ValidGlyphClusters[i].oOutput[j])
7951 INFO_PRINTF4(_L("FAILURE: Glyph code invariance, Complex TEST(%d), %x != %x\n"), i, param.iOutput[j].iCode, Thai_ValidGlyphClusters[i].oOutput[j]);
7959 INFO_PRINTF2(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d)\n"), i);
7964 TEST(failures == 0);
7968 void CTGlyphSelection::TestThai_InvalidGlyphClusters()
7970 This routine tests Thai base & mark cluster boundaries to ensure where
7971 requried the KUnicodeDottedCircle char is used when an invalid sequence is
7972 processed. Test data from the global Thai_GlyphClusterBoundaries
7973 variable is pumped through the CFont::GetCharacterPosition() API.
7978 CFont::TPositionParam param;
7979 param.iDirection = CFont::EHorizontal;
7980 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7982 for (TUint i=0; Thai_GlyphClusterBoundaries[i].iTextLen != -1; i++)
7984 TBuf<8> testText(Thai_GlyphClusterBoundaries[i].iText);
7985 param.iText.Set(testText);
7987 for (TUint k=0; k<2; k++)
7989 if (Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText == -1)
7992 param.iPosInText = Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText;
7993 param.iPen.iX = param.iPen.iY = 0;
7995 r = iTestFont->GetCharacterPosition(param);
7997 if (r && param.iPosInText == Thai_GlyphClusterBoundaries[i].oOut[k].oPosInText
7998 && param.iOutputGlyphs == Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen)
8000 for (TInt j=0; j<Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen; j++)
8002 if (!(param.iOutput[j].iCode == Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]))
8004 INFO_PRINTF5(_L("FAILURE: Glyph code invariance, Complex TEST(%d,%d), %x != %x\n"), i, k, param.iOutput[j].iCode, Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]);
8012 INFO_PRINTF3(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d)\n"), i, k);
8020 RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
8021 TEST(failures == 0);
8025 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CT-4062
8026 @SYMTestCaseDesc Tests that a punctuation character following the special-case
8027 character Thai SaraAm is rendered as a punctuation, not
8028 another SaraAm character.
8029 @SYMTestPriority High
8030 @SYMTestActions Compare input string and corresponding output glyph codes
8031 @SYMTestExpectedResults In this case, the string and the codes should match.
8034 void CTGlyphSelection::TestThai_INC118424()
8036 CFont::TPositionParam param;
8037 param.iDirection = CFont::EHorizontal;
8038 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
8040 //punctuation after SaraAm
8041 TestGlyphs(iTestFont,param,_L("\xE04\xE33:\?>"),_L("\xE04\xE33:\?>"));
8045 This fuction tests Indic Gurmukhi and Malayalam support
8047 void CTGlyphSelection::ExecuteIndicGurmukhiMalayalamTests()
8049 // create a font store for testing
8050 CFontStore* fontStore = CFontStore::NewL(&User::Heap());
8052 //load all ecom implemented rasterizer dlls. installs the rasterizer.
8053 LoadOpenFontLibraries(fontStore);
8054 // test font preparation
8055 fontStore->iKPixelWidthInTwips = 11860; //This value is default
8057 //add any required font files
8058 TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
8060 TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
8062 CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
8064 TInt ret = bmp->Create(TSize(100,100),EGray2);
8065 if (ret == KErrNotSupported)
8068 User::LeaveIfError(ret);
8070 CFbsBitmapDevice* device = NULL;
8071 TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
8072 TEST(err2 == KErrNone);
8074 CFbsBitGc* gc = NULL;
8075 User::LeaveIfError(device->CreateContext(gc));
8077 // Font file Creation
8078 CFbsFont* indicFont = NULL;
8079 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
8080 gc->UseFont(indicFont);
8081 CleanupStack::PushL(indicFont);
8083 //Testcode for Kannada, Marathi,Gujarati,Bengali language
8084 // Test Indic Gurmukhi digit.
8086 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8088 INFO_PRINTF1(_L("Failed to record test result"));
8089 INFO_PRINTF1(_L("Test Indic Gurmukhi digits"));
8090 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4063"));
8091 TestGurmukhiDigit( *indicFont );
8092 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8094 INFO_PRINTF1(_L("Failed to record test result"));
8095 INFO_PRINTF1(_L("Test Indic Gurmukhi and Latin"));
8096 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4064"));
8097 TestGurmukhiAndLatin( *indicFont );
8098 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8100 INFO_PRINTF1(_L("Failed to record test result"));
8101 INFO_PRINTF1(_L("Test Indic DEF102858 on Gurmukhi"));
8102 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4065"));
8103 TestGurmukhiModifierAfterConsonantViramaZWJ( *indicFont );
8104 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8106 INFO_PRINTF1(_L("Failed to record test result"));
8107 INFO_PRINTF1(_L("Test Indic Gurmukhi consonant leading"));
8108 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4066"));
8109 TestGurmukhiWithConsonantInitial( *indicFont );
8110 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8112 INFO_PRINTF1(_L("Failed to record test result"));
8113 INFO_PRINTF1(_L("Test Indic Gurmukhi vowel leading"));
8114 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4068"));
8115 TestGurmukhiWithVowelInitial( *indicFont );
8116 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8118 INFO_PRINTF1(_L("Failed to record test result"));
8119 INFO_PRINTF1(_L("Test Indic Malayalam digits"));
8120 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4067"));
8121 TestMalayalamDigit( *indicFont );
8122 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8124 INFO_PRINTF1(_L("Failed to record test result"));
8125 INFO_PRINTF1(_L("Test Indic Malayalam and Latin"));
8126 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4069"));
8127 TestMalayalamAndLatin( *indicFont );
8128 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8130 INFO_PRINTF1(_L("Failed to record test result"));
8131 INFO_PRINTF1(_L("Test Indic DEF102858 on Malayalam"));
8132 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4070"));
8133 TestMalayalamModifierAfterConsonantViramaZWJ( *indicFont );
8134 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8136 INFO_PRINTF1(_L("Failed to record test result"));
8137 INFO_PRINTF1(_L("Test Indic Malayalam consonant leading"));
8138 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4071"));
8139 TestMalayalamWithConsonantInitial( *indicFont );
8140 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8142 INFO_PRINTF1(_L("Failed to record test result"));
8143 INFO_PRINTF1(_L("Test Indic Malayalam vowel leading"));
8144 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4072"));
8145 TestMalayalamWithVowelInitial( *indicFont );
8146 CleanupStack::Pop(indicFont);
8148 //Cleaning the memory
8152 fontStore->RemoveFile(err1);
8154 REComSession::FinalClose();
8157 This function tests the Thai Font Rendering feature of the CFont class
8158 in the GDI.dll and in particular the modifications made to
8159 CFont::GetCharacterPosition() to support the Unicocde Thai code page.
8160 First introduced during the Sirocco project (A3.1.1)
8161 @SYMFssID Graphics/GDI/GDI/1
8162 @SYMFssID Graphics/GDI/GDI/2
8165 void CTGlyphSelection::ExecuteThaiTests()
8167 // Test individual Thai digits, letters and sign characters.
8168 INFO_PRINTF1(_L("Test Thai simple charecters"));
8169 TestThai_SimpleChars();
8171 // Test complex Thai char sequences.
8172 INFO_PRINTF1(_L("Test valid Thai glyph clusters"));
8173 TestThai_ValidGlyphClusters();
8175 // Test Thai glyph cluster boundaries.
8176 INFO_PRINTF1(_L("Test invalid Thai glyph clusters"));
8177 TestThai_InvalidGlyphClusters();
8179 // Test Thai SaraAm-punctuation exception.
8180 INFO_PRINTF1(_L("Test fix for INC118424"));
8181 TestThai_INC118424();
8187 * This is just a easy way to help generate the test data info
8188 * Any new added test data should do manually check firstly to check the correction before using this function
8190 // #define GEN_GURMUKHIMALAYALAMTESTDATA
8191 void CTGlyphSelection::GenerateGurmukhiMalayalamData( const TDesC& filename, const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
8194 file.Replace( iFs, filename, EFileWrite );
8196 CFont::TPositionParam param;
8197 param.iDirection = CFont::EHorizontal;
8198 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
8199 RShapeInfo shapeInfo;
8206 for (TUint i = 0; testArray[i].iTextLen != -1; i++)
8208 TTestInput_PositionParam6 currentArray = testArray[i];
8209 TBuf<8> testText(testArray[i].iText);
8210 param.iText.Set(testText);
8212 TBuf8<256> datatext;
8213 datatext.SetLength(0);
8214 //{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
8215 datatext.Format(_L8("{ %d, {"), testArray[i].iTextLen); // 1,
8217 for (TUint i = 0; i<testText.Length(); i++)
8220 tmp.Format(_L8("0x%x, "), currentArray.iText[i]); // {0x0a66},
8221 datatext.Append(tmp);
8223 datatext = datatext.Left(datatext.Length()-2);
8224 datatext.Append(_L8("}, { "));
8226 if (shapeInfo.IsOpen())
8229 for (TUint k = 0; k < 6; k++)
8231 param.iPosInText = k;
8232 param.iPen.iX = param.iPen.iY = 0;
8233 TBool ret = aFont.GetCharacterPosition2(param, shapeInfo);
8234 if (0 == param.iOutputGlyphs)
8238 tmp.Format(_L8("{%d, %d, %d, {"), k, param.iPosInText, param.iOutputGlyphs);
8239 datatext.Append(tmp);
8241 for (TInt j = 0; j < param.iOutputGlyphs; j++)
8243 TText16 aCode = param.iOutput[j].iCode;
8245 tmp.Format(_L8("0x%x, "), aCode);
8246 datatext.Append(tmp);
8248 datatext = datatext.Left(datatext.Length()-2);
8249 datatext.Append(_L8("}}, "));
8251 datatext.Append(_L8(" {-1, 1, 1, {0}} } }, \n"));
8253 file.Write(datatext);
8260 void CTGlyphSelection::DoEachGurmukhiMalayalamCase( const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
8264 CFont::TPositionParam param;
8265 param.iDirection = CFont::EHorizontal;
8266 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
8267 RShapeInfo shapeInfo;
8274 for (TUint i=0; testArray[i].iTextLen != -1; i++)
8276 TBuf<8> testText(testArray[i].iText);
8277 param.iText.Set(testText);
8278 if(shapeInfo.IsOpen())
8281 for (TUint k=0; k<6; k++)
8283 // If it's end of sequence
8284 if ( testArray[i].oOut[k].iPosInText == -1)
8287 param.iPosInText = testArray[i].oOut[k].iPosInText;
8288 param.iPen.iX = param.iPen.iY = 0;
8290 r = aFont.GetCharacterPosition2(param, shapeInfo);
8292 if (r && param.iPosInText == testArray[i].oOut[k].oPosInText
8293 && param.iOutputGlyphs == testArray[i].oOut[k].oOutputLen)
8295 for (TInt j=0; j<testArray[i].oOut[k].oOutputLen; j++)
8297 // Trim off the highest bit
8298 TText16 aCode = param.iOutput[j].iCode;
8299 if (!( aCode == testArray[i].oOut[k].oOutput[j]))
8301 INFO_PRINTF5(_L("FAILURE: Glyph code invariance, Complex TEST(%d,%d), %x != %x\n"), i, k, param.iOutput[j].iCode, testArray[i].oOut[k].oOutput[j]);
8309 INFO_PRINTF4(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d,%d)\n"), i, k, param.iOutputGlyphs);
8317 RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
8318 TEST(failures == 0);
8321 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4063
8322 @SYMTestCaseDesc Case to check Gurmukhi digit support
8323 @SYMTestPriority High
8324 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8325 1.Pass Gurmukhi digit (0xa66 ~ 0x0a6f) sequence
8326 2.Pass any Consonant + Gurmukhi digit sequence
8327 3.Pass any Consonant + Gurmukhi digit + Matra sequence
8328 4.Repetitive callss with Unicode sequence from the first 3 action items
8329 5.Pass Modifer + digit sequence
8330 6.Pass Vowel and digit sequence
8331 7.Pass Virama and digit sequence
8332 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
8333 2.Digit is recognized as a separate syllable
8334 3.Matra and digit is not combined together
8335 4.The shaper returned the same result as first 3 results
8336 5.digit is recognized, and not combined with Modifier
8337 6.digit is recognized, and not combined with Vowel.
8338 7.digit is recognized, and not combined with Virama.
8339 @SYMPREQ 1922: Gurmukhi support
8341 void CTGlyphSelection::TestGurmukhiDigit( const CFbsFont& aFont )
8343 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8345 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8346 _LIT(KValidFontPath, "c:\\GurmukhiDigit.txt");
8347 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8352 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4064
8353 @SYMTestCaseDesc case to check if shaper can render Gurmukhi with other implemented Indic scripts and Latin
8354 @SYMTestPriority High
8355 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8356 1.Pass Gurmukhi sentence and Latin to the function
8357 2.Pass Latin and Gurmukhi setence.
8358 3.Pass syllable, Latin and syllable
8359 4.Pass phoneme, Latin and phoneme
8360 5.Pass Gurmukhi syllable and other Indic scripts together.
8361 6.Pass Gurmukhi phoneme and other Indic script phoneme
8362 @SYMTestExpectedResults Gurumuki and Latin characters donĄ¯t mess up. Gurmukhi phoneme doesnĄ¯t combine with Latin into a new syllable,
8363 Gurmukhi phoneme doesnĄ¯t form a syllable with other Indic script.
8364 @SYMPREQ 1922: Gurmukhi support
8366 void CTGlyphSelection::TestGurmukhiAndLatin( const CFbsFont& aFont )
8368 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiAndLatin, aFont );
8370 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8371 _LIT(KValidFontPath, "c:\\GurmukhiAndLatin.txt");
8372 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8377 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4065
8378 @SYMTestCaseDesc case to check Gurmukhi modifier after Consonant, Virama, ZWJ
8379 @SYMTestPriority High
8380 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8381 1.Pass Consonant + Virama + ZWJ + Modifier
8382 @SYMTestExpectedResults Modifier is part of the syllable.
8383 @SYMPREQ 1922: Gurmukhi support, make sure DEF102858 fixing does not cause side effect
8385 void CTGlyphSelection::TestGurmukhiModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
8387 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiModifierAfterConsonantViramaZWJ, aFont );
8389 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8390 _LIT(KValidFontPath, "c:\\GurmukhiModifierAfterConsonantViramaZWJ.txt");
8391 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8396 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4066
8397 @SYMTestCaseDesc case to check syllable with consonant in initial position
8398 @SYMTestPriority High
8399 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements, each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure, then pass it to the calling.
8400 1.Pass consonant and Nukta sequence
8401 2.Pass two consonant and dependent vowel sequences to shaper, save both returned results. The consonant is first sequence is difference with that of the second sequence..
8402 3.Pass consonant and matra /i/ t sequence
8403 4.Pass the following Consonant, Virama and HA sequence
8404 Another sequence: Consonant , Virama and RA
8405 Another sequence: Consonant, Virama and VA
8406 Another sequence: Consonant, Virama and YA
8407 5.Pass Consonant and Addak sequence to shaper
8408 Pass Consonant, Addak and Consonant to shaper
8409 6.Pass Consonant and BINDI sequence:
8410 Sequence1:Consonant and BINDI,
8411 Sequence2: Consonant, dependent vowel which is shown to the right of base consonant and BINDI,
8412 Sequence3: Consonant, dependent vowel which is shown to the top of the base consonant and BINDI
8413 Pass Consonant and TIPPI sequence:
8414 Sequence1: Consonant and TIPPI,
8415 Sequence2: Consonant, dependent vowel which is shown to the left of the base consonant and TIPPI.
8416 Sequence3: Consonant, dependent vowel which is shown to the bottom of the base consonant and TIPPI.
8417 7.Pass Nukta, equavalent consonant, Nukta sequence to shaper sepeartely, save both result
8418 @SYMTestExpectedResults 1.nukta is combined to the base consonant according to the returned shape info
8419 2.The matra position is different between two ShapeText calls according to the returned shaped info.
8420 3.matra /i/ is combined to the left of the base consonant in position
8421 4.HA, RA, VA is on bottom of the base consonant and subscripted, YA in final form according to the returned shape info.
8422 5.Addak is on top of consonant, addak belongs to the consonant precedes it.
8423 6.BINDI is on top, TIPPI is on bottom
8424 7.The combinationĄ¯s character count, glyph count, glyph indices info is the same as the single nuktaĄ¯s
8425 @SYMPREQ 1922: Gurmukhi support
8427 void CTGlyphSelection::TestGurmukhiWithConsonantInitial( const CFbsFont& aFont )
8429 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiConsonantLeading, aFont );
8431 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8432 _LIT(KValidFontPath, "c:\\GurmukhiWithConsonantInitial.txt");
8433 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8439 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4067
8440 @SYMTestCaseDesc Case to check Malayalam digit support
8441 @SYMTestPriority High
8442 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8443 1.Pass Malayalam digit (0xd66 ~ 0x0d6f) sequence
8444 2.Pass any Consonant + Malayalam digit sequence
8445 3.Pass any Consonant + Malayalam digit + Matra sequence
8446 4.Repetitive callss with Unicode sequence from the first 3 action items
8447 5.Pass Modifer + digit sequence
8448 6.Pass Vowel and digit sequence
8449 7.Pass Virama and digit sequence
8450 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
8451 2.Digit is recognized as a separate syllable
8452 3.Matra and digit is not combined together
8453 4.The shaper returned the same result as first 3 results
8454 5.digit is recognized, and not combined with Modifier
8455 6.digit is recognized, and not combined with Vowel.
8456 7.digit is recognized, and not combined with Virama.
8457 @SYMPREQ 1922: Malayalam support
8459 void CTGlyphSelection::TestMalayalamDigit( const CFbsFont& aFont )
8461 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamDigit, aFont );
8463 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8464 _LIT(KValidFontPath, "c:\\MalayalamDigit.txt");
8465 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8470 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4068
8471 @SYMTestCaseDesc case to check syllable with vowel in initial position
8472 @SYMTestPriority High
8473 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements,
8474 each requirement above gives a vowel leading Unicode sequence. Each sequence falls into one of the following structure,
8475 then pass it to the calling.
8476 1.Pass ARA, IRI to shaper, pass URA sequence
8477 2.Pass valid bearer and vowel pair sequence
8478 Pass invalid bearer and vowel pair sequence
8479 @SYMTestExpectedResults 1.ARA character count is 1, IRI, URA character count is 0
8480 2.valid combination is combined together, invalid is not combined together
8481 @SYMPREQ 1922: Gurmukhi support
8483 void CTGlyphSelection::TestGurmukhiWithVowelInitial( const CFbsFont& aFont )
8485 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiVowelLeading, aFont );
8487 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8488 _LIT(KValidFontPath, "c:\\GurmukhiWithVowelInitial.txt");
8489 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8494 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4069
8495 @SYMTestCaseDesc case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
8496 @SYMTestPriority High
8497 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8498 1.Pass Malayalam sentence and Latin to the function
8499 2.Pass Latin and Gurmukhi setence.
8500 3.Pass syllable, Latin and syllable
8501 4.Pass phoneme, Latin and phoneme
8502 5.Pass Malayalam syllable and other Indic scripts together.
8503 6.Pass Malayalam phoneme and other Indic script phoneme
8504 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable,
8505 Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
8506 @SYMPREQ 1922: Malayalam support
8508 void CTGlyphSelection::TestMalayalamAndLatin( const CFbsFont& aFont )
8510 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamAndLatin, aFont );
8512 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8513 _LIT(KValidFontPath, "c:\\MalayalamAndLatin.txt");
8514 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8519 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4070
8520 @SYMTestCaseDesc case to check Malayalam modifier after Consonant, Virama, ZWJ
8521 @SYMTestPriority High
8522 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8523 1. Pass Consonant + Virama + ZWJ + Modifier
8524 @SYMTestExpectedResults Modifier is part of the syllable.
8525 @SYMPREQ 1922: Malayalam support, make sure DEF102858 fixing does not cause side effect
8527 void CTGlyphSelection::TestMalayalamModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
8529 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamModifierAfterConsonantViramaZWJ, aFont );
8531 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8532 _LIT(KValidFontPath, "c:\\MalayalamModifierAfterConsonantViramaZWJ.txt");
8533 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8538 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4071
8539 @SYMTestCaseDesc case to check syllable with consonant in initial position
8540 @SYMTestPriority High
8541 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements,
8542 each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure,
8543 then pass it to the calling.
8544 1.Pass consonant + vowel single code, and consonant + its split representation to shaper
8545 The following Single representation /Split representation is passed to shaper
8546 0x0d14/0x0d12 + 0x0d57, 0x0d4a/0x0d46 + 0x0d3e, 0x0d4b/0x0d47 + 0x0d3e
8547 0x0d4c/0x0d46 + 0x0d57
8548 2.Pass two Consonant and dependent Vowel sequences to shaper, save both returned results.
8549 The Consonant is first sequence is difference with that of the second sequence, and the dependent Vowel is identical.
8550 3.Pass Consonant and Matras /-e/, /-ee/, /-ai/ to shaper.
8551 4.Pass Consonant and Matras /-o/, /-oo/, /-au/ to shaper
8552 Pass Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
8553 Pass Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
8554 5.Pass Consonant + 0x0d4d + Consonant to shaper
8555 Pass Consonant + Virama + Consonant + 0x0d4d to shaper
8556 6.Pass Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
8557 Pass KA + Virama + ZWJ to shaper.
8558 Pass other Consonant + Virama + ZWJ to shaper.
8559 7.Pass RA + Virama + ZWJ to shaper,
8560 Pass RRA + Viram + ZWJ to shaper.
8561 8.Pass Chillu ( one of 6 special consontants + Virama + ZWJ) and Vowel to shaper
8562 Pass Chillu and Modifier to shaper
8563 Pass Chillu and Virama to shaper
8564 9.Pass one of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
8565 10.Pass CA, Virama and CA to shaper
8566 Pass BA, Virama and BA to shaper
8567 Pass YA, Virama and YA to shaper
8568 Pass VA, Virama and VA to shaper
8569 PASS other Consonant, Virama and the same Consonant to shaper.
8570 11.Pass G.GA, C.CHA, K.TTA, SS.TTA, DD.DDA, NN.NNA, B.DA, B.DHA, P.PA, RR.RRA, SH.SHA, S.SA clusters to shaper.
8571 12.Pass Consonant clusters from REQ1.3.11 to shaper.
8572 13.Pass S.RR.RRA to shaper,
8573 Pass N.RR.RRA to shaper
8574 @SYMTestExpectedResults 1.First sequence is equivalent to the second sequence
8575 2.The dependent vowel position is different between the two sequence
8576 3.The visual position of the Matras is different with the logical order (The same as Keyboard input order).
8577 4.The Matra is split into halves from visual effect. And the second form of Matra /-au/ is recognized the same as the first form of it.
8578 5.0x0d4d is recognized as a Virama in first sequence, itĄ¯s recognized as MATRA (mid-u sound) in the second sequence
8579 6.Virama and ZWJ is interpreted as Chillaksharam for the 6 consonants, for others itĄ¯s not interpreted that way.
8580 7.Both sequences will interprete RA Chillu.
8581 8.The combining character should not combine with Chillu.
8582 9.LA takes subscript shape.
8583 10.CA, BA, YA, VA double should result in a ligature, other consonants donĄ¯t.
8584 11.The latter consonant in the cluster becomes a miniature subscript.
8585 12.sequence forms a ligature.
8586 13.sequence forms a ligature
8587 @SYMPREQ 1922: Malayalam support
8589 void CTGlyphSelection::TestMalayalamWithConsonantInitial( const CFbsFont& aFont )
8591 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamConsonantLeading, aFont );
8593 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8594 _LIT(KValidFontPath, "c:\\MalayalamWithConsonantInitial.txt");
8595 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8600 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4072
8601 @SYMTestCaseDesc case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
8602 @SYMTestPriority High
8603 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8604 1.Pass Malayalam sentence and Latin to the function
8605 2.Pass Latin and Malayalam setence.
8606 3.Pass syllable, Latin and syllable
8607 4.Pass phoneme, Latin and phoneme
8608 5.Pass Malayalam syllable and other Indic scripts together.
8609 6.Pass Malayalam phoneme and other Indic script phoneme
8610 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable,
8611 Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
8612 @SYMPREQ 1922: Malayalam support
8614 void CTGlyphSelection::TestMalayalamWithVowelInitial( const CFbsFont& aFont )
8616 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamVowelLeading, aFont );
8618 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8619 _LIT(KValidFontPath, "c:\\MalayalamWithVowelInitial.txt");
8620 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8626 #define TEST(a) testBooleanTrue((a), (TText8*)__FILE__, __LINE__)
8631 __CONSTRUCT_STEP__(GlyphSelection)
8633 void CTGlyphSelectionStep::TestSetupL()
8635 #ifdef _GLOWCODE_LAUNCH_DELAY
8636 INFO_PRINTF1(_L("Time delay...."));
8639 t1 += TTimeIntervalSeconds(15);