Update contrib.
1 // Copyright (c) 2007-2009 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() == EGdiPanic_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() == EGdiPanic_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-CIT-1580
2171 @SYMTestCaseDesc Automated GDI testing for Hindi
2172 @SYMTestPriority High
2173 @SYMTestActions Attempt to compose various valid and invalid Hindi glyph clusters.
2174 @SYMTestExpectedResults The expected glyph clusters for given Unicode charactors must be returned
2175 @SYMPREQ 18: Hindi for Bravo
2177 void CTGlyphSelection::TestHindiChars(CFbsFont* aFont)
2179 INFO_PRINTF1(_L("Test Hindi Glyphs"));
2183 TBuf<30> testText(0);
2184 CFont::TPositionParam param;
2185 param.iDirection = CFont::EHorizontal;
2186 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2188 testText.SetLength(30);
2190 testText[0] = 0x0930;
2191 testText[1] = 0x093C;
2192 testText[2] = 0x094D;
2193 testText[3] = 0x0915;
2195 testText[4] = 0x0915;
2196 testText[5] = 0x094D;
2197 testText[6] = 0x0915;
2199 testText[7] = 0x0930;
2200 testText[8] = 0x094D;
2201 testText[9] = 0x0915;
2203 testText[10] = 0x0915;
2204 testText[11] = 0x094D;
2205 testText[12] = 0x0930;
2207 testText[13] = 0x0915;
2208 testText[14] = 0x094D;
2209 testText[15] = 0x0937;
2211 testText[16] = 0x0915;
2212 testText[17] = 0x094D;
2213 testText[18] = 0x0930;
2214 testText[19] = 0x094D;
2215 testText[20] = 0x092A;
2217 /* When the following character 0x0036 is shaped, the context will be taken into consideration when
2218 determining the glyph for 0x0036
2219 The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
2221 testText[21] = 0x0036;
2222 testText[22] = 0x094D;
2224 testText[23] = 0x0020;
2226 // INC101103: Strings containing ZWJ do not get rendered properly for Hindi
2227 testText[24] = 0x092E;
2228 testText[25] = 0x094D;
2229 testText[26] = 0x200D;
2230 testText[27] = 0x092E;
2231 testText[28] = 0x093F;
2232 testText[29] = 0x200D;
2234 param.iText.Set(testText);
2236 RShapeInfo aShapeInfo;
2240 param.iPosInText = 0;
2241 param.iPen.iX = param.iPen.iY = 0;
2242 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2244 TEST(r && param.iPosInText == 4
2245 && param.iOutputGlyphs == 2
2246 && param.iOutput[0].iCode == 0x80000108
2247 && param.iOutput[1].iCode == 0x80000072);
2249 #if defined __WINS__ || defined __WINSCW__
2250 TEST(r && param.iPen.iX == 17);
2253 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);
2255 param.iPosInText = 4;
2256 param.iPen.iX = param.iPen.iY = 0;
2257 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2259 TEST(r && param.iPosInText == 7
2260 && param.iOutputGlyphs == 1
2261 && param.iOutput[0].iCode == 0x800001C2);
2263 #if defined __WINS__ || defined __WINSCW__
2264 TEST(r && param.iPen.iX == 12);
2267 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);
2269 param.iPosInText = 7;
2270 param.iPen.iX = param.iPen.iY = 0;
2271 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2273 TEST(r && param.iPosInText == 10
2274 && param.iOutputGlyphs == 2
2275 && param.iOutput[0].iCode == 0x80000072
2276 && param.iOutput[1].iCode == 0x80000130);
2278 #if defined __WINS__ || defined __WINSCW__
2279 TEST(r && param.iPen.iX == 11);
2282 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);
2284 param.iPosInText = 10;
2285 param.iPen.iX = param.iPen.iY = 0;
2286 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2288 TEST(r && param.iPosInText == 13
2289 && param.iOutputGlyphs == 1
2290 && param.iOutput[0].iCode == 0x80000136);
2292 #if defined __WINS__ || defined __WINSCW__
2293 TEST(r && param.iPen.iX == 12);
2296 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);
2298 param.iPosInText = 13;
2299 param.iPen.iX = param.iPen.iY = 0;
2300 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2302 TEST(r && param.iPosInText == 16
2303 && param.iOutputGlyphs == 1
2304 && param.iOutput[0].iCode == 0x800001BE);
2306 #if defined __WINS__ || defined __WINSCW__
2307 TEST(r && param.iPen.iX == 12);
2310 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);
2312 param.iPosInText = 16;
2313 param.iPen.iX = param.iPen.iY = 0;
2314 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2316 TEST(r && param.iPosInText == 21
2317 && param.iOutputGlyphs == 2
2318 && param.iOutput[0].iCode == 0x8000017A
2319 && param.iOutput[1].iCode == 0x80000087);
2321 #if defined __WINS__ || defined __WINSCW__
2322 TEST(r && param.iPen.iX == 18);
2325 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);
2327 /* The following shaping will consider the context when determining the glyph for 0x0036 Digit character
2328 The context for 0x0036 is the Devanagari character 0x092A at position (iPosInText) 20
2330 param.iPosInText = 21;
2331 param.iPen.iX = param.iPen.iY = 0;
2332 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2334 TEST(r && param.iPosInText == 22
2335 && param.iOutputGlyphs == 1
2336 && param.iOutput[0].iCode == 0x80000016);
2338 #if defined __WINS__ || defined __WINSCW__
2339 TEST(r && param.iPen.iX == 9);
2342 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);
2344 // INC101103: Strings containing ZWJ do not get rendered properly for Hindi
2345 param.iPosInText = 24;
2346 param.iPen.iX = param.iPen.iY = 0;
2347 r = aFont->GetCharacterPosition2(param, aShapeInfo);
2348 // We are mainly testing the position in text after rendering, which should be at the end of the syllable
2349 // that should include the ZWJ and any consonant that follows it
2350 TEST(r && param.iPosInText == 29
2351 && param.iOutputGlyphs == 3
2352 && param.iOutput[0].iCode == 0x80000272
2353 && param.iOutput[1].iCode == 0x80000105
2354 && param.iOutput[2].iCode == 0x8000008B);
2356 // Close aShapeInfo which releases any memory it is occupying
2357 if (aShapeInfo.IsOpen())
2363 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3381
2364 @SYMTestCaseDesc Automated GDI testing for Kannada
2365 @SYMTestPriority High
2366 @SYMTestActions Attempt to compose various valid and invalid Kannada glyph clusters.
2367 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
2368 @SYMPREQ 19: Kannada for Ogmha
2371 void CTGlyphSelection::TestKannadaChars(CFbsFont* aFont)
2373 INFO_PRINTF1(_L("Test Kannada Glyphs"));
2375 TBuf<79> testText(0);
2376 CFont::TPositionParam param;
2377 param.iDirection = CFont::EHorizontal;
2378 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2380 testText.SetLength(79);
2381 //Testdata for kannada Langauage
2383 testText[0] = 0x0C95;
2384 testText[1] = 0x0CCD;
2385 testText[2] = 0x0020;
2387 testText[3] = 0x0CAF;
2388 testText[4] = 0x0CCD;
2389 testText[5] = 0x0020;
2391 testText[6] = 0x0C99;
2392 testText[7] = 0x0CCD;
2393 testText[8] = 0x0020;
2395 testText[9] = 0x0CA3;
2396 testText[10] = 0x0CCD;
2397 testText[11] = 0x0020;
2399 testText[12] = 0x0C95;
2400 testText[13] = 0x0CC3;
2402 testText[14] = 0x0CA4;
2403 testText[15] = 0x0CC6;
2405 testText[16] = 0x0C9D;
2406 testText[17] = 0x0CBE;
2408 testText[18] = 0x0C9E;
2409 testText[19] = 0x0CBE;
2411 testText[20] = 0x0CA3;
2412 testText[21] = 0x0CBE;
2414 testText[22] = 0x0CB3;
2415 testText[23] = 0x0CC6;
2417 testText[24] = 0x0C9D;
2418 testText[25] = 0x0CC6;
2420 testText[26] = 0x0CAC;
2421 testText[27] = 0x0CC6;
2423 testText[28] = 0x0C9F;
2424 testText[29] = 0x0CC6;
2426 testText[30] = 0x0C99;
2427 testText[31] = 0x0CC6;
2429 testText[32] = 0x0CA3;
2430 testText[33] = 0x0CC6;
2432 testText[34] = 0x0C95;
2433 testText[35] = 0x0CBF;
2435 testText[36] = 0x0CB8;
2436 testText[37] = 0x0CBF;
2438 testText[38] = 0x0CA1;
2439 testText[39] = 0x0CBF;
2441 testText[40] = 0x0CA6;
2442 testText[41] = 0x0CBF;
2444 testText[42] = 0x0C9D;
2445 testText[43] = 0x0CBF;
2447 testText[44] = 0x0C9D;
2448 testText[45] = 0x0CC1;
2450 testText[46] = 0x0CB5;
2451 testText[47] = 0x0CC1;
2453 testText[48] = 0x0C95;
2454 testText[49] = 0x0CC2;
2456 testText[50] = 0x0CAA;
2457 testText[51] = 0x0CC2;
2459 testText[52] = 0x0CAE;
2460 testText[53] = 0x0CCC;
2462 testText[54] = 0x0C95;
2464 testText[55] = 0x0CB0;
2465 testText[56] = 0x200D;
2466 testText[57] = 0x0CCD;
2467 testText[58] = 0x0CAE;
2469 testText[59] = 0x0020;
2471 testText[60] = 0x0CB0;
2472 testText[61] = 0x200D;
2473 testText[62] = 0x0CCD;
2474 testText[63] = 0x0CB0;
2475 testText[64] = 0x200D;
2476 testText[65] = 0x0CCD;
2479 testText[66] = 0x0CB0;
2480 testText[67] = 0x200D;
2481 testText[68] = 0x0CCD;
2482 testText[69] = 0x0CB0;
2483 testText[70] = 0x0CCD;
2484 testText[71] = 0x0CB0;
2485 testText[72] = 0x0CCD;
2486 testText[73] = 0x0CB0;
2487 testText[74] = 0x0CCD;
2488 testText[75] = 0x0CB0;
2490 // DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
2491 testText[76] = 0x0020;
2492 testText[77] = 0x0C8E;
2493 testText[78] = 0x0C82;
2494 // End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
2496 param.iText.Set(testText);
2501 param.iPosInText = 0;
2502 param.iPen.iX = param.iPen.iY = 0;
2503 RShapeInfo shapeInfo;
2504 r = aFont->GetCharacterPosition2(param,shapeInfo);
2506 TEST(r && param.iPosInText ==2
2507 && param.iOutputGlyphs == 1
2508 && param.iOutput[0].iCode == 0x80000839);
2510 #if defined __WINS__ || defined __WINSCW__
2511 TEST(r && param.iPen.iX == 16);
2514 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);
2516 param.iPosInText = 3;
2517 param.iPen.iX = param.iPen.iY = 0;
2518 r = aFont->GetCharacterPosition2(param,shapeInfo);
2520 TEST(r && param.iPosInText == 5
2521 && param.iOutputGlyphs ==1
2522 && param.iOutput[0].iCode == 0x80000852 );
2524 #if defined __WINS__ || defined __WINSCW__
2525 TEST(r && param.iPen.iX == 27);
2528 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);
2530 param.iPosInText = 6;
2531 param.iPen.iX = param.iPen.iY = 0;
2532 r = aFont->GetCharacterPosition2(param,shapeInfo);
2534 TEST(r && param.iPosInText == 8
2535 && param.iOutputGlyphs == 1
2536 && param.iOutput[0].iCode ==0x8000083D);
2538 #if defined __WINS__ || defined __WINSCW__
2539 TEST(r && param.iPen.iX == 19);
2542 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);
2544 param.iPosInText = 9;
2545 param.iPen.iX = param.iPen.iY = 0;
2546 r = aFont->GetCharacterPosition2(param,shapeInfo);
2548 TEST(r && param.iPosInText == 11
2549 && param.iOutputGlyphs ==1
2550 && param.iOutput[0].iCode == 0x80000847);
2552 #if defined __WINS__ || defined __WINSCW__
2553 TEST(r && param.iPen.iX == 20);
2556 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);
2558 param.iPosInText = 12;
2559 param.iPen.iX = param.iPen.iY = 0;
2560 r = aFont->GetCharacterPosition2(param,shapeInfo);
2562 TEST(r && param.iPosInText == 14
2563 && param.iOutputGlyphs == 2
2564 && param.iOutput[0].iCode == 0x800007A8
2565 && param.iOutput[1].iCode == 0x800007D2);
2567 #if defined __WINS__ || defined __WINSCW__
2568 TEST(r && param.iPen.iX == 12);
2571 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);
2573 param.iPosInText = 14;
2574 param.iPen.iX = param.iPen.iY = 0;
2575 r = aFont->GetCharacterPosition2(param,shapeInfo);
2577 TEST(r && param.iPosInText == 16
2578 && param.iOutputGlyphs == 1
2579 && param.iOutput[0].iCode == 0x8000088f);
2581 #if defined __WINS__ || defined __WINSCW__
2582 TEST(r && param.iPen.iX == 11);
2585 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);
2587 param.iPosInText = 16;
2588 param.iPen.iX = param.iPen.iY = 0;
2589 r = aFont->GetCharacterPosition2(param,shapeInfo);
2591 TEST(r && param.iPosInText == 18
2592 && param.iOutputGlyphs == 2
2593 && param.iOutput[0].iCode == 0x8000081E
2594 && param.iOutput[1].iCode == 0x800007CD);
2596 #if defined __WINS__ || defined __WINSCW__
2597 TEST(r && param.iPen.iX == 29);
2600 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);
2602 param.iPosInText = 18;
2603 param.iPen.iX = param.iPen.iY = 0;
2604 r = aFont->GetCharacterPosition2(param,shapeInfo);
2606 TEST(r && param.iPosInText == 20
2607 && param.iOutputGlyphs == 2
2608 && param.iOutput[0].iCode == 0x800007b1
2609 && param.iOutput[1].iCode == 0x800007cd);
2611 #if defined __WINS__ || defined __WINSCW__
2612 TEST(r && param.iPen.iX == 23);
2615 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);
2618 param.iPosInText = 20;
2619 param.iPen.iX = param.iPen.iY = 0;
2620 r = aFont->GetCharacterPosition2(param,shapeInfo);
2622 TEST(r && param.iPosInText == 22
2623 && param.iOutputGlyphs == 2
2624 && param.iOutput[0].iCode == 0x80000823
2625 && param.iOutput[1].iCode == 0x800007CD );
2627 #if defined __WINS__ || defined __WINSCW__
2628 TEST(r && param.iPen.iX == 21);
2631 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);
2633 param.iPosInText = 22;
2634 param.iPen.iX = param.iPen.iY = 0;
2635 r = aFont->GetCharacterPosition2(param,shapeInfo);
2637 TEST(r && param.iPosInText == 24
2638 && param.iOutputGlyphs == 1
2639 && param.iOutput[0].iCode == 0x8000089C);
2641 #if defined __WINS__ || defined __WINSCW__
2642 TEST(r && param.iPen.iX == 12);
2645 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);
2647 param.iPosInText = 24;
2648 param.iPen.iX = param.iPen.iY = 0;
2649 r = aFont->GetCharacterPosition2(param,shapeInfo);
2651 TEST(r && param.iPosInText == 26
2652 && param.iOutputGlyphs == 1
2653 && param.iOutput[0].iCode == 0x80000889);
2655 #if defined __WINS__ || defined __WINSCW__
2656 TEST(r && param.iPen.iX == 22);
2659 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);
2661 param.iPosInText = 26;
2662 param.iPen.iX = param.iPen.iY = 0;
2663 r = aFont->GetCharacterPosition2(param,shapeInfo);
2665 TEST(r && param.iPosInText == 28
2666 && param.iOutputGlyphs == 1
2667 && param.iOutput[0].iCode == 0x80000896 );
2669 #if defined __WINS__ || defined __WINSCW__
2670 TEST(r && param.iPen.iX == 13);
2673 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);
2675 param.iPosInText = 28;
2676 param.iPen.iX = param.iPen.iY = 0;
2677 r = aFont->GetCharacterPosition2(param,shapeInfo);
2679 TEST(r && param.iPosInText == 30
2680 && param.iOutputGlyphs == 1
2681 && param.iOutput[0].iCode == 0x8000088a);
2683 #if defined __WINS__ || defined __WINSCW__
2684 TEST(r && param.iPen.iX == 13);
2687 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);
2689 param.iPosInText = 30;
2690 param.iPen.iX = param.iPen.iY = 0;
2691 r = aFont->GetCharacterPosition2(param,shapeInfo);
2693 TEST(r && param.iPosInText == 32
2694 && param.iOutputGlyphs == 2
2695 && param.iOutput[0].iCode == 0x800007ac
2696 && param.iOutput[1].iCode == 0x800007d4 );
2698 #if defined __WINS__ || defined __WINSCW__
2699 TEST(r && param.iPen.iX == 19);
2702 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);
2704 param.iPosInText = 32;
2705 param.iPen.iX = param.iPen.iY = 0;
2706 r = aFont->GetCharacterPosition2(param,shapeInfo);
2708 TEST(r && param.iPosInText == 34
2709 && param.iOutputGlyphs == 1
2710 && param.iOutput[0].iCode == 0x8000088e);
2712 #if defined __WINS__ || defined __WINSCW__
2713 TEST(r && param.iPen.iX == 14);
2716 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);
2718 param.iPosInText = 34;
2719 param.iPen.iX = param.iPen.iY = 0;
2720 r = aFont->GetCharacterPosition2(param,shapeInfo);
2722 TEST(r && param.iPosInText == 36
2723 && param.iOutputGlyphs == 1
2724 && param.iOutput[0].iCode == 0x80000860 );
2726 #if defined __WINS__ || defined __WINSCW__
2727 TEST(r && param.iPen.iX == 10);
2730 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);
2732 param.iPosInText = 36;
2733 param.iPen.iX = param.iPen.iY = 0;
2734 r = aFont->GetCharacterPosition2(param,shapeInfo);
2736 TEST(r && param.iPosInText == 38
2737 && param.iOutputGlyphs == 1
2738 && param.iOutput[0].iCode == 0x8000087e );
2740 #if defined __WINS__ || defined __WINSCW__
2741 TEST(r && param.iPen.iX == 11);
2744 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);
2746 param.iPosInText = 38;
2747 param.iPen.iX = param.iPen.iY = 0;
2748 r = aFont->GetCharacterPosition2(param,shapeInfo);
2750 TEST(r && param.iPosInText == 40
2751 && param.iOutputGlyphs == 1
2752 && param.iOutput[0].iCode == 0x8000086a);
2754 #if defined __WINS__ || defined __WINSCW__
2755 TEST(r && param.iPen.iX == 12);
2758 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);
2760 param.iPosInText = 40;
2761 param.iPen.iX = param.iPen.iY = 0;
2762 r = aFont->GetCharacterPosition2(param,shapeInfo);
2764 TEST(r && param.iPosInText == 42
2765 && param.iOutputGlyphs == 1
2766 && param.iOutput[0].iCode == 0x8000086f);
2768 #if defined __WINS__ || defined __WINSCW__
2769 TEST(r && param.iPen.iX == 12);
2772 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);
2774 param.iPosInText = 42;
2775 param.iPen.iX = param.iPen.iY = 0;
2776 r = aFont->GetCharacterPosition2(param,shapeInfo);
2778 TEST(r && param.iPosInText == 44
2779 && param.iOutputGlyphs == 1
2780 && param.iOutput[0].iCode == 0x80000867 );
2782 #if defined __WINS__ || defined __WINSCW__
2783 TEST(r && param.iPen.iX == 22);
2786 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);
2788 param.iPosInText = 44;
2789 param.iPen.iX = param.iPen.iY = 0;
2790 r = aFont->GetCharacterPosition2(param,shapeInfo);
2792 TEST(r && param.iPosInText == 46
2793 && param.iOutputGlyphs == 2
2794 && param.iOutput[0].iCode == 0x800007b0
2795 && param.iOutput[1].iCode == 0x800007d0);
2797 #if defined __WINS__ || defined __WINSCW__
2798 TEST(r && param.iPen.iX == 28);
2801 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);
2803 param.iPosInText = 46;
2804 param.iPen.iX = param.iPen.iY = 0;
2805 r = aFont->GetCharacterPosition2(param,shapeInfo);
2807 TEST(r && param.iPosInText == 48
2808 && param.iOutputGlyphs == 2
2809 && param.iOutput[0].iCode == 0x800007c6
2810 && param.iOutput[1].iCode == 0x800007d0);
2812 #if defined __WINS__ || defined __WINSCW__
2813 TEST(r && param.iPen.iX == 18);
2816 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);
2819 param.iPosInText = 48;
2820 param.iPen.iX = param.iPen.iY = 0;
2821 r = aFont->GetCharacterPosition2(param,shapeInfo);
2823 TEST(r && param.iPosInText == 50
2824 && param.iOutputGlyphs == 2
2825 && param.iOutput[0].iCode == 0x800007a8
2826 && param.iOutput[1].iCode == 0x800007d1 );
2828 #if defined __WINS__ || defined __WINSCW__
2829 TEST(r && param.iPen.iX == 20);
2832 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);
2834 param.iPosInText = 50;
2835 param.iPen.iX = param.iPen.iY = 0;
2836 r = aFont->GetCharacterPosition2(param,shapeInfo);
2838 TEST(r && param.iPosInText == 52
2839 && param.iOutputGlyphs == 2
2840 && param.iOutput[0].iCode == 0x800007bc
2841 && param.iOutput[1].iCode == 0x800008a5);
2843 #if defined __WINS__ || defined __WINSCW__
2844 TEST(r && param.iPen.iX == 21);
2847 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);
2850 param.iPosInText = 52;
2851 param.iPen.iX = param.iPen.iY = 0;
2852 r = aFont->GetCharacterPosition2(param,shapeInfo);
2854 TEST(r && param.iPosInText == 54
2855 && param.iOutputGlyphs == 2
2856 && param.iOutput[0].iCode == 0x8000082d
2857 && param.iOutput[1].iCode == 0x800007d9);
2859 #if defined __WINS__ || defined __WINSCW__
2860 TEST(r && param.iPen.iX == 26);
2863 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);
2865 param.iPosInText = 55;
2866 param.iPen.iX = param.iPen.iY = 0;
2867 r = aFont->GetCharacterPosition2(param,shapeInfo);
2869 TEST(r && param.iPosInText == 59
2870 && param.iOutputGlyphs == 2
2871 && param.iOutput[0].iCode == 0x800007c2
2872 && param.iOutput[1].iCode == 0x80000809);
2874 #if defined __WINS__ || defined __WINSCW__
2875 TEST(r && param.iPen.iX == 17);
2878 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);
2880 param.iPosInText = 60;
2881 param.iPen.iX = param.iPen.iY = 0;
2882 r = aFont->GetCharacterPosition2(param,shapeInfo);
2883 TEST(r && param.iPosInText == 64
2884 && param.iOutputGlyphs == 2
2885 && param.iOutput[0].iCode == 0x800007c2
2886 && param.iOutput[1].iCode == 0x8000080b);
2887 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);
2889 param.iPosInText = 66;
2890 param.iPen.iX = param.iPen.iY = 0;
2891 r = aFont->GetCharacterPosition2(param,shapeInfo);
2892 TEST(r && param.iPosInText == 75
2893 && param.iOutputGlyphs == 5
2894 && param.iOutput[0].iCode == 0x800007c2
2895 && param.iOutput[1].iCode == 0x8000080b
2896 && param.iOutput[2].iCode == 0x800008db
2897 && param.iOutput[3].iCode == 0x800008db
2898 && param.iOutput[4].iCode == 0x800007da);
2899 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);
2901 // DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
2902 param.iPosInText = 77;
2903 param.iPen.iX = param.iPen.iY = 0;
2904 r = aFont->GetCharacterPosition2(param,shapeInfo);
2905 TEST(r && param.iPosInText == 79
2906 && param.iOutputGlyphs == 2
2907 && param.iOutput[0].iCode == 0x800007A2
2908 && param.iOutput[1].iCode == 0x80000798);
2910 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);
2911 //End of DEF103276: Kannada rendering: IcuLayoutEngine does not recongnise 0X0C8E as a vowel
2916 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3360
2917 @SYMTestCaseDesc Automated GDI testing for Marathi
2918 @SYMTestPriority High
2919 @SYMTestActions Attempt to compose various valid and invalid Marathi glyph clusters.
2920 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
2921 @SYMPREQ 19: Marathi for Ogmha
2924 void CTGlyphSelection::TestMarathiChars(CFbsFont* aFont)
2926 INFO_PRINTF1(_L("Test Marathi Glyphs"));
2929 TBuf<47> testText(0);
2930 CFont::TPositionParam param;
2931 param.iDirection = CFont::EHorizontal;
2932 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
2934 testText.SetLength(47);
2937 testText[0] = 0x0905;
2938 testText[1] = 0x0945;
2940 testText[2] = 0x0931;
2941 testText[3] = 0x094D;
2942 testText[4] = 0x0915;
2944 testText[5] = 0x0930;
2945 testText[6] = 0x094D;
2946 testText[7] = 0x200D;
2947 testText[8] = 0x0915;
2949 testText[9] = 0x0905;
2950 testText[10] = 0x200D;
2951 testText[11] = 0x0945;
2953 testText[12] = 0x0909;
2954 testText[13] = 0x0945;
2956 testText[14] = 0x0915;
2957 testText[15] = 0x200D;
2958 testText[16] = 0x0945;
2960 // DEF102132: Marathi - Certain sequence of characters does not work correctly
2961 testText[17] = 0x0905;
2962 testText[18] = 0x0945;
2963 testText[19] = 0x0901;
2965 testText[20] = 0x0905;
2966 testText[21] = 0x200D;
2967 testText[22] = 0x0945;
2968 testText[23] = 0x0901;
2969 // End of DEF102132: Marathi - Certain sequence of characters does not work correctly
2972 // DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
2973 testText[24] = 0x0020;
2975 testText[25] = 0x0930;
2976 testText[26] = 0x094D;
2977 testText[27] = 0x200D;
2978 testText[28] = 0x0901;
2979 // End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
2981 // INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
2982 testText[29] = 0x0020;
2984 testText[30] = 0x0930;
2985 testText[31] = 0x094D;
2986 testText[32] = 0x200D;
2987 testText[33] = 0x0930;
2988 testText[34] = 0x094D;
2989 testText[35] = 0x200D;
2990 testText[36] = 0x0930;
2991 testText[37] = 0x094D;
2992 testText[38] = 0x200D;
2993 testText[39] = 0x0930;
2994 testText[40] = 0x094D;
2995 testText[41] = 0x200D;
2996 testText[42] = 0x0930;
2997 testText[43] = 0x094D;
2998 testText[44] = 0x200D;
2999 // End of INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
3001 // INC116507: Halant get attached with an independent vowel.
3002 testText[45] = 0x0905;
3003 testText[46] = 0x094D;
3004 // End of INC116507: Halant get attached with an independent vowel.
3008 param.iText.Set(testText);
3010 // Test CANDRA A: Independent Vowel A + CANDRA E
3011 param.iPosInText = 0;
3012 param.iPen.iX = param.iPen.iY = 0;
3013 RShapeInfo shapeInfo;
3014 r = aFont->GetCharacterPosition2(param,shapeInfo);
3016 TEST(r && param.iPosInText == 2
3017 && param.iOutputGlyphs == 2
3018 && param.iOutput[0].iCode == 0x80000528
3019 && param.iOutput[1].iCode == 0x80000566);
3021 #if defined __WINS__ || defined __WINSCW__
3022 TEST(r && param.iPen.iX == 12);
3025 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);
3028 // Test Eyelash RA post Unicode 3.0: RRA + VIRAMA + CONSONANT
3029 param.iPosInText = 2 ;
3030 param.iPen.iX = param.iPen.iY = 0;
3031 r = aFont->GetCharacterPosition2(param,shapeInfo);
3033 TEST(r && param.iPosInText == 5
3034 && param.iOutputGlyphs == 2
3035 && param.iOutput[0].iCode == 0x800005d3
3036 && param.iOutput[1].iCode == 0x80000538);
3038 #if defined __WINS__ || defined __WINSCW__
3039 TEST(r && param.iPen.iX == 18);
3042 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);
3044 // Test Eyelash RA pre Unicode 3.0: RA + VIRAMA + ZWJ + CONSONANT
3045 param.iPosInText = 5;
3046 param.iPen.iX = param.iPen.iY = 0;
3047 r = aFont->GetCharacterPosition2(param,shapeInfo);
3049 TEST(r && param.iPosInText == 9
3050 && param.iOutputGlyphs == 2
3051 && param.iOutput[0].iCode == 0x800005d3
3052 && param.iOutput[1].iCode == 0x80000538);
3054 #if defined __WINS__ || defined __WINSCW__
3055 TEST(r && param.iPen.iX == 18);
3058 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);
3060 // Test second form of CANDRA A: Independent Vowel A + ZWJ + CANDRA E
3061 param.iPosInText = 9;
3062 param.iPen.iX = param.iPen.iY = 0;
3063 r = aFont->GetCharacterPosition2(param,shapeInfo);
3065 TEST(r && param.iPosInText == 12
3066 && param.iOutputGlyphs == 2
3067 && param.iOutput[0].iCode == 0x80000528
3068 && param.iOutput[1].iCode == 0x80000566 );
3070 #if defined __WINS__ || defined __WINSCW__
3071 TEST(r && param.iPen.iX == 12);
3074 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);
3076 // Test that CANDRA E does not join with any other independent vowel
3077 param.iPosInText = 12;
3078 param.iPen.iX = param.iPen.iY = 0;
3079 r = aFont->GetCharacterPosition2(param,shapeInfo);
3081 TEST(r && param.iPosInText == 13
3082 && param.iOutputGlyphs == 1
3083 && param.iOutput[0].iCode == 0x8000052c);
3085 #if defined __WINS__ || defined __WINSCW__
3086 TEST(r && param.iPen.iX == 9);
3089 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);
3091 // Test that the second form of CANDRA A (i.e. using ZWJ) doesn't work for CONSONANTS (illegal)
3092 param.iPosInText = 14;
3093 param.iPen.iX = param.iPen.iY = 0;
3094 r = aFont->GetCharacterPosition2(param,shapeInfo);
3096 TEST(r && param.iPosInText == 15
3097 && param.iOutputGlyphs == 1
3098 && param.iOutput[0].iCode == 0x80000538);
3100 #if defined __WINS__ || defined __WINSCW__
3101 TEST(r && param.iPen.iX == 11);
3104 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);
3106 // DEF102132: Marathi - Certain sequence of characters does not work correctly
3107 param.iPosInText = 17;
3108 param.iPen.iX = param.iPen.iY = 0;
3109 r = aFont->GetCharacterPosition2(param,shapeInfo);
3111 TEST(r && param.iPosInText == 20
3112 && param.iOutputGlyphs == 2
3113 && param.iOutput[0].iCode == 0x80000528
3114 && param.iOutput[1].iCode == 0x8000069d);
3117 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);
3119 param.iPosInText = 20;
3120 param.iPen.iX = param.iPen.iY = 0;
3121 r = aFont->GetCharacterPosition2(param,shapeInfo);
3123 TEST(r && param.iPosInText == 23
3124 && param.iOutputGlyphs == 2
3125 && param.iOutput[0].iCode == 0x80000528
3126 && param.iOutput[1].iCode == 0x8000069d);
3128 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);
3129 // End of DEF102132: Marathi - Certain sequence of characters does not work correctly
3131 // DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
3132 param.iPosInText = 25;
3133 param.iPen.iX = param.iPen.iY = 0;
3134 r = aFont->GetCharacterPosition2(param,shapeInfo);
3135 TEST(r && param.iPosInText == 29
3136 && param.iOutputGlyphs == 2
3137 && param.iOutput[0].iCode == 0x800005D3
3138 && param.iOutput[1].iCode == 0x80000524);
3140 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);
3141 // End of DEF102858: Marathi - State table does not allow explicit half forms followed by modifiers
3143 // INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
3144 param.iPosInText = 30;
3145 param.iPen.iX = param.iPen.iY = 0;
3146 r = aFont->GetCharacterPosition2(param,shapeInfo);
3147 TEST(r && param.iPosInText == 42
3148 && param.iOutputGlyphs == 5
3149 && param.iOutput[0].iCode == 0x800005D3
3150 && param.iOutput[1].iCode == 0x800005D3
3151 && param.iOutput[2].iCode == 0x800005B8
3152 && param.iOutput[3].iCode == 0x80000553
3153 && param.iOutput[4].iCode == 0x8000056E);
3154 #if defined __WINS__ || defined __WINSCW__
3155 TEST(param.iPen.iX == 20);
3158 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);
3159 // End of INC104705 Marathi input: Incorrect movement of cursor with eyelash ra forming ligature.
3161 // INC116507: Halant get attached with an independent vowel.
3162 param.iPosInText = 45;
3163 param.iPen.iX = param.iPen.iY = 0;
3164 r = aFont->GetCharacterPosition2(param,shapeInfo);
3165 r = aFont->GetCharacterPosition2(param,shapeInfo);
3167 TEST(r && param.iPosInText == 47
3168 && param.iOutputGlyphs == 2
3169 && param.iOutput[0].iCode == 0x8000058F
3170 && param.iOutput[1].iCode == 0x8000056E);
3172 #if defined __WINS__ || defined __WINSCW__
3173 TEST(r && param.iPen.iX == 21);
3176 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);
3177 // End of INC116507: Halant get attached with an independent vowel.
3182 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3417
3183 @SYMTestCaseDesc Automated GDI testing for Gujarati
3184 @SYMTestPriority High
3185 @SYMTestActions Attempt to compose various valid and invalid gujarati glyph clusters.
3186 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
3187 @SYMPREQ 19: Gujarati for Ogmha
3191 void CTGlyphSelection::TestGujaratiChars(CFbsFont* aFont)
3193 INFO_PRINTF1(_L("Test Gujarati Glyphs"));
3198 TBuf<162> testText(0);
3199 CFont::TPositionParam param;
3200 param.iDirection = CFont::EHorizontal;
3201 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
3203 testText.SetLength(162);
3204 //Testdata for gujarati Langauage
3206 testText[0] = 0x0AAC;
3207 testText[1] = 0x0ACD;
3208 testText[2] = 0x200D;
3209 testText[3] = 0x0020;
3211 testText[4] = 0x0A96;
3212 testText[5] = 0x0ACD;
3213 testText[6] = 0x0A97;
3214 testText[7] = 0x0ACD;
3215 testText[8] = 0x0A98;
3216 testText[9] = 0x0ACD;
3217 testText[10] = 0x0A9A;
3219 testText[11] = 0x0A95;
3220 testText[12] = 0x0ACD;
3221 testText[13] = 0x0A9C;
3222 testText[14] = 0x200D;
3223 testText[15] = 0x0020;
3225 testText[16] = 0x0A99;
3226 testText[17] = 0x0ACD;
3227 testText[18] = 0x0A9B;
3228 testText[19] = 0x0ACD;
3229 testText[20] = 0x0A9F;
3230 testText[21] = 0x0ACD;
3231 testText[22] = 0x0AA0;
3233 //Requirement (GUJ003)
3235 testText[23] = 0x0A95;
3236 testText[24] = 0x0ACD;
3237 testText[25] = 0x0AB7;
3240 testText[26] = 0x0A95;
3241 testText[27] = 0x0ACD;
3242 testText[28] = 0x0AB7;
3243 testText[29] = 0x0ACD;
3244 testText[30] = 0x0AA4;
3246 testText[31] = 0x0A9C;
3247 testText[32] = 0x0ACD;
3248 testText[33] = 0x0AB7;
3249 testText[34] = 0x0ACD;
3250 testText[35] = 0x0AA4;
3252 testText[36] = 0x0A9C;
3253 testText[37] = 0x0ACD;
3254 testText[38] = 0x0A9E;
3255 testText[39] = 0x0ACD;
3256 testText[40] = 0x0AA4;
3258 //Requirement (GUJ 005)
3260 testText[41] = 0x0AB0;
3261 testText[42] = 0x0ACD;
3262 testText[43] = 0x0A95;
3264 testText[44] = 0x0AB0;
3265 testText[45] = 0x0ACD;
3266 testText[46] = 0x0A95;
3267 testText[47] = 0x0AC9;
3269 testText[48] = 0x0AB0;
3270 testText[49] = 0x0ACD;
3271 testText[50] = 0x0A95;
3272 testText[51] = 0x0A82;
3274 testText[52] = 0x0AB0;
3275 testText[53] = 0x0ACD;
3276 testText[54] = 0x0A95;
3277 testText[55] = 0x0AC9;
3278 testText[56] = 0x0A82;
3279 testText[57] = 0x0020;
3281 //Requirement (GUJ 006)
3283 testText[58] = 0x0A97;
3284 testText[59] = 0x0ACD;
3285 testText[60] = 0x0AB0;
3287 testText[61] = 0x0A9A;
3288 testText[62] = 0x0ACD;
3289 testText[63] = 0x0AB0;
3291 testText[64] = 0x0A97;
3292 testText[65] = 0x0ACD;
3293 testText[66] = 0x0AB0;
3294 testText[67] = 0x0ACD;
3295 testText[68] = 0x0AA4;
3297 testText[69] = 0x0A9A;
3298 testText[70] = 0x0ACD;
3299 testText[71] = 0x0AB0;
3300 testText[72] = 0x0ACD;
3301 testText[73] = 0x0AA4;
3303 //Requirement (GUJ 007)
3305 testText[74] = 0x0A95;
3306 testText[75] = 0x0ACD;
3307 testText[76] = 0x0AB0;
3309 testText[77] = 0x0A9C;
3310 testText[78] = 0x0ACD;
3311 testText[79] = 0x0AB0;
3313 testText[80] = 0x0A95;
3314 testText[81] = 0x0ACD;
3315 testText[82] = 0x0AB0;
3316 testText[83] = 0x0ACD;
3317 testText[84] = 0x0AA4;
3319 testText[85] = 0x0A9C;
3320 testText[86] = 0x0ACD;
3321 testText[87] = 0x0AB0;
3322 testText[88] = 0x0ACD;
3323 testText[89] = 0x0AA4;
3325 //Requirement (GUJ 008)
3327 testText[90] = 0x0A9B;
3328 testText[91] = 0x0ACD;
3329 testText[92] = 0x0AB0;
3331 testText[93] = 0x0AAF;
3332 testText[94] = 0x0ACD;
3333 testText[95] = 0x0AB0;
3335 testText[96] = 0x0A9B;
3336 testText[97] = 0x0ACD;
3337 testText[98] = 0x0AB0;
3338 testText[99] = 0x0ACD;
3339 testText[100]= 0x0AA4;
3341 testText[101] = 0x0AAF;
3342 testText[102] = 0x0ACD;
3343 testText[103] = 0x0AB0;
3345 testText[104] = 0x0AAF;
3346 testText[105] = 0x0ACD;
3347 testText[106] = 0x0AB0;
3348 testText[107] = 0x0ACD;
3349 testText[108] = 0x0AA4;
3351 testText[109] = 0x0AB0;
3352 testText[110] = 0x0ACD;
3353 testText[111] = 0x0AB0;
3354 testText[112] = 0x0ACD;
3355 testText[113] = 0x0AB0;
3357 //Requirement (GUJ 009)
3359 testText[114] = 0x0A9F;
3360 testText[115] = 0x0ACD;
3361 testText[116] = 0x0AAF;
3363 testText[117] = 0x0A9B;
3364 testText[118] = 0x0ACD;
3365 testText[119] = 0x0AAF;
3367 testText[120] = 0x0AA2;
3368 testText[121] = 0x0ACD;
3369 testText[122] = 0x0AAF;
3371 testText[123] = 0x0A97;
3372 testText[124] = 0x0ACD;
3373 testText[125] = 0x0AAF;
3375 //Requirement (GUJ 010)
3377 testText[126] = 0x0A9F;
3378 testText[127] = 0x0ACD;
3379 testText[128] = 0x0AA0;
3381 testText[129] = 0x0AA6;
3382 testText[130] = 0x0ACD;
3383 testText[131] = 0x0AB5;
3385 testText[132] = 0x0A9F;
3386 testText[133] = 0x0ACD;
3387 testText[134] = 0x0AA0;
3388 testText[135] = 0x0ACD;
3389 testText[136] = 0x0AA4;
3392 testText[137] = 0x0AA6;
3393 testText[138] = 0x0ACD;
3394 testText[139] = 0x0AB5;
3395 testText[140] = 0x0ACD;
3396 testText[141] = 0x0AA4;
3398 //Requirement (GUJ 011)
3400 testText[142] = 0x0AB0;
3401 testText[143] = 0x0AC2;
3403 testText[144] = 0x0AB9;
3404 testText[145] = 0x0AC3;
3406 testText[146] = 0x0AA6;
3407 testText[147] = 0x0AC3;
3409 testText[148] = 0x0A9C;
3410 testText[149] = 0x0AC0;
3412 //Subscript ligutares
3415 testText[150] = 0x0A95;
3416 testText[151] = 0x0A81;
3418 testText[152] = 0x0A95;
3419 testText[153] = 0x0ABE;
3420 testText[154] = 0x0A81;
3422 testText[155] = 0x0A95;
3423 testText[156] = 0x0AC1;
3424 testText[157] = 0x0A81;
3426 testText[158] = 0x0A8D;
3427 testText[159] = 0x0A81;
3429 testText[160] = 0x0A88;
3430 testText[161] = 0x0A81;
3434 param.iText.Set(testText);
3436 param.iPosInText = 0;
3437 param.iPen.iX = param.iPen.iY = 0;
3438 RShapeInfo shapeInfo;
3440 r = aFont->GetCharacterPosition2(param,shapeInfo);
3442 TEST(r && param.iPosInText == 3
3443 && param.iOutputGlyphs == 1
3444 && param.iOutput[0].iCode == 0x800009ec);
3446 #if defined __WINS__ || defined __WINSCW__
3447 TEST(r && param.iPen.iX == 9);
3451 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);
3453 param.iPosInText = 4;
3454 param.iPen.iX = param.iPen.iY = 0;
3456 r = aFont->GetCharacterPosition2(param,shapeInfo);
3458 TEST(r && param.iPosInText == 11
3459 && param.iOutputGlyphs == 4
3460 && param.iOutput[0].iCode == 0x800009d7
3461 && param.iOutput[1].iCode == 0x800009d8
3462 && param.iOutput[2].iCode == 0x800009d9
3463 && param.iOutput[3].iCode == 0x80000967 );
3465 #if defined __WINS__ || defined __WINSCW__
3466 TEST(r && param.iPen.iX == 34);
3469 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);
3471 param.iPosInText = 11;
3472 param.iPen.iX = param.iPen.iY = 0;
3474 r = aFont->GetCharacterPosition2(param,shapeInfo);
3476 TEST(r && param.iPosInText == 14
3477 && param.iOutputGlyphs == 2
3478 && param.iOutput[0].iCode == 0x800009d6
3479 && param.iOutput[1].iCode == 0x80000969 );
3481 #if defined __WINS__ || defined __WINSCW__
3482 TEST(r && param.iPen.iX == 22);
3485 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);
3487 param.iPosInText = 16;
3488 param.iPen.iX = param.iPen.iY = 0;
3490 r = aFont->GetCharacterPosition2(param,shapeInfo);
3492 TEST(r && param.iPosInText == 23
3493 && param.iOutputGlyphs == 3
3494 && param.iOutput[0].iCode == 0x800009da
3495 && param.iOutput[1].iCode == 0x800009dc
3496 && param.iOutput[2].iCode == 0x80000aad);
3498 #if defined __WINS__ || defined __WINSCW__
3499 TEST(r && param.iPen.iX == 30);
3503 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);
3505 param.iPosInText = 23;
3506 param.iPen.iX = param.iPen.iY = 0;
3508 r = aFont->GetCharacterPosition2(param,shapeInfo);
3510 TEST(r && param.iPosInText == 26
3511 && param.iOutputGlyphs == 1
3512 && param.iOutput[0].iCode == 0x800009d2 );
3514 #if defined __WINS__ || defined __WINSCW__
3515 TEST(r && param.iPen.iX == 12);
3518 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);
3521 param.iPosInText = 26;
3522 param.iPen.iX = param.iPen.iY = 0;
3524 r = aFont->GetCharacterPosition2(param,shapeInfo);
3526 TEST(r && param.iPosInText == 31
3527 && param.iOutputGlyphs == 2
3528 && param.iOutput[0].iCode == 0x800009f8
3529 && param.iOutput[1].iCode == 0x80000971);
3531 #if defined __WINS__ || defined __WINSCW__
3532 TEST(r && param.iPen.iX == 18);
3535 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);
3537 param.iPosInText = 31;
3538 param.iPen.iX = param.iPen.iY = 0;
3540 r = aFont->GetCharacterPosition2(param,shapeInfo);
3542 TEST(r && param.iPosInText == 36
3543 && param.iOutputGlyphs == 3
3544 && param.iOutput[0].iCode == 0x800009dd
3545 && param.iOutput[1].iCode == 0x800009f5
3546 && param.iOutput[2].iCode == 0x80000971);
3548 #if defined __WINS__ || defined __WINSCW__
3549 TEST(r && param.iPen.iX == 30);
3552 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);
3554 param.iPosInText = 36;
3555 param.iPen.iX = param.iPen.iY = 0;
3557 r = aFont->GetCharacterPosition2(param,shapeInfo);
3559 TEST(r && param.iPosInText == 41
3560 && param.iOutputGlyphs == 2
3561 && param.iOutput[0].iCode == 0x800009f9
3562 && param.iOutput[1].iCode == 0x80000971);
3564 #if defined __WINS__ || defined __WINSCW__
3565 TEST(r && param.iPen.iX == 17);
3568 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);
3570 param.iPosInText = 41;
3571 param.iPen.iX = param.iPen.iY = 0;
3573 r = aFont->GetCharacterPosition2(param,shapeInfo);
3575 TEST(r && param.iPosInText == 44
3576 && param.iOutputGlyphs == 2
3577 && param.iOutput[0].iCode == 0x80000962
3578 && param.iOutput[1].iCode == 0x800009d4);
3580 #if defined __WINS__ || defined __WINSCW__
3581 TEST(r && param.iPen.iX == 8);
3584 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);
3586 param.iPosInText = 44;
3587 param.iPen.iX = param.iPen.iY = 0;
3589 r = aFont->GetCharacterPosition2(param,shapeInfo);
3591 TEST(r && param.iPosInText == 48
3592 && param.iOutputGlyphs == 2
3593 && param.iOutput[0].iCode == 0x80000962
3594 && param.iOutput[1].iCode == 0x80000ae1 );
3596 #if defined __WINS__ || defined __WINSCW__
3597 TEST(r && param.iPen.iX == 13);
3600 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);
3602 param.iPosInText = 48;
3603 param.iPen.iX = param.iPen.iY = 0;
3605 r = aFont->GetCharacterPosition2(param,shapeInfo);
3607 TEST(r && param.iPosInText == 52
3608 && param.iOutputGlyphs == 2
3609 && param.iOutput[0].iCode == 0x80000962
3610 && param.iOutput[1].iCode == 0x80000ae9);
3612 #if defined __WINS__ || defined __WINSCW__
3613 TEST(r && param.iPen.iX == 8);
3616 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);
3618 param.iPosInText = 52;
3619 param.iPen.iX = param.iPen.iY = 0;
3621 r = aFont->GetCharacterPosition2(param,shapeInfo);
3623 TEST(r && param.iPosInText == 57
3624 && param.iOutputGlyphs == 2
3625 && param.iOutput[0].iCode == 0x80000962
3626 && param.iOutput[1].iCode == 0x80000ae2);
3628 #if defined __WINS__ || defined __WINSCW__
3629 TEST(r && param.iPen.iX == 13);
3632 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);
3634 param.iPosInText = 58;
3635 param.iPen.iX = param.iPen.iY = 0;
3637 r = aFont->GetCharacterPosition2(param,shapeInfo);
3639 TEST(r && param.iPosInText == 61
3640 && param.iOutputGlyphs == 1
3641 && param.iOutput[0].iCode == 0x80000a1e );
3643 #if defined __WINS__ || defined __WINSCW__
3644 TEST(r && param.iPen.iX == 11);
3647 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);
3649 param.iPosInText = 61;
3650 param.iPen.iX = param.iPen.iY = 0;
3652 r = aFont->GetCharacterPosition2(param,shapeInfo);
3654 TEST(r && param.iPosInText == 64
3655 && param.iOutputGlyphs == 1
3656 && param.iOutput[0].iCode == 0x80000a21 );
3658 #if defined __WINS__ || defined __WINSCW__
3659 TEST(r && param.iPen.iX == 10);
3662 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);
3664 param.iPosInText = 64;
3665 param.iPen.iX = param.iPen.iY = 0;
3667 r = aFont->GetCharacterPosition2(param,shapeInfo);
3669 TEST(r && param.iPosInText == 69
3670 && param.iOutputGlyphs == 2
3671 && param.iOutput[0].iCode == 0x80000a64
3672 && param.iOutput[1].iCode == 0x80000971 );
3674 #if defined __WINS__ || defined __WINSCW__
3675 TEST(r && param.iPen.iX == 17);
3678 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);
3680 param.iPosInText = 69;
3681 param.iPen.iX = param.iPen.iY = 0;
3683 r = aFont->GetCharacterPosition2(param,shapeInfo);
3685 TEST(r && param.iPosInText == 74
3686 && param.iOutputGlyphs == 2
3687 && param.iOutput[0].iCode == 0x80000a67
3688 && param.iOutput[1].iCode == 0x80000971);
3690 #if defined __WINS__ || defined __WINSCW__
3691 TEST(r && param.iPen.iX == 16);
3694 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);
3696 param.iPosInText = 74;
3697 param.iPen.iX = param.iPen.iY = 0;
3699 r = aFont->GetCharacterPosition2(param,shapeInfo);
3701 TEST(r && param.iPosInText == 77
3702 && param.iOutputGlyphs == 1
3703 && param.iOutput[0].iCode == 0x80000a1c);
3705 #if defined __WINS__ || defined __WINSCW__
3706 TEST(r && param.iPen.iX == 8);
3709 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);
3711 param.iPosInText = 77;
3712 param.iPen.iX = param.iPen.iY = 0;
3714 r = aFont->GetCharacterPosition2(param,shapeInfo);
3716 TEST(r && param.iPosInText == 80
3717 && param.iOutputGlyphs == 1
3718 && param.iOutput[0].iCode == 0x80000a23);
3720 #if defined __WINS__ || defined __WINSCW__
3721 TEST(r && param.iPen.iX == 15);
3724 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);
3726 param.iPosInText = 80;
3727 param.iPen.iX = param.iPen.iY = 0;
3729 r = aFont->GetCharacterPosition2(param,shapeInfo);
3731 TEST(r && param.iPosInText == 85
3732 && param.iOutputGlyphs == 2
3733 && param.iOutput[0].iCode == 0x80000a62
3734 && param.iOutput[1].iCode == 0x80000971);
3736 #if defined __WINS__ || defined __WINSCW__
3737 TEST(r && param.iPen.iX == 17);
3740 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);
3742 param.iPosInText = 85;
3743 param.iPen.iX = param.iPen.iY = 0;
3745 r = aFont->GetCharacterPosition2(param,shapeInfo);
3747 TEST(r && param.iPosInText == 90
3748 && param.iOutputGlyphs == 2
3749 && param.iOutput[0].iCode == 0x80000a69
3750 && param.iOutput[1].iCode == 0x80000971);
3752 #if defined __WINS__ || defined __WINSCW__
3753 TEST(r && param.iPen.iX == 24);
3756 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);
3758 param.iPosInText =90;
3759 param.iPen.iX = param.iPen.iY = 0;
3761 r = aFont->GetCharacterPosition2(param,shapeInfo);
3763 TEST(r && param.iPosInText == 93
3764 && param.iOutputGlyphs == 1
3765 && param.iOutput[0].iCode == 0x80000a22 );
3767 #if defined __WINS__ || defined __WINSCW__
3768 TEST(r && param.iPen.iX == 12);
3771 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);
3773 param.iPosInText = 93;
3774 param.iPen.iX = param.iPen.iY = 0;
3776 r = aFont->GetCharacterPosition2(param,shapeInfo);
3778 TEST(r && param.iPosInText == 96
3779 && param.iOutputGlyphs == 1
3780 && param.iOutput[0].iCode == 0x80000a35 );
3782 #if defined __WINS__ || defined __WINSCW__
3783 TEST(r && param.iPen.iX == 10);
3786 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);
3788 param.iPosInText = 96;
3789 param.iPen.iX = param.iPen.iY = 0;
3791 r = aFont->GetCharacterPosition2(param,shapeInfo);
3793 TEST(r && param.iPosInText == 101
3794 && param.iOutputGlyphs == 2
3795 && param.iOutput[0].iCode == 0x80000a68
3796 && param.iOutput[1].iCode == 0x80000971);
3798 #if defined __WINS__ || defined __WINSCW__
3799 TEST(r && param.iPen.iX == 21);
3802 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);
3804 param.iPosInText = 101;
3805 param.iPen.iX = param.iPen.iY = 0;
3807 r = aFont->GetCharacterPosition2(param,shapeInfo);
3809 TEST(r && param.iPosInText == 104
3810 && param.iOutputGlyphs == 1
3811 && param.iOutput[0].iCode == 0x80000a35 );
3812 #if defined __WINS__ || defined __WINSCW__
3813 TEST(r && param.iPen.iX == 10);
3816 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);
3818 param.iPosInText = 104;
3819 param.iPen.iX = param.iPen.iY = 0;
3821 r = aFont->GetCharacterPosition2(param,shapeInfo);
3823 TEST(r && param.iPosInText == 109
3824 && param.iOutputGlyphs == 2
3825 && param.iOutput[0].iCode == 0x80000a7b
3826 && param.iOutput[1].iCode == 0x80000971 );
3828 #if defined __WINS__ || defined __WINSCW__
3829 TEST(r && param.iPen.iX == 16);
3832 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);
3834 param.iPosInText = 109;
3835 param.iPen.iX = param.iPen.iY = 0;
3837 r = aFont->GetCharacterPosition2(param,shapeInfo);
3839 TEST(r && param.iPosInText == 114
3840 && param.iOutputGlyphs == 2
3841 && param.iOutput[0].iCode == 0x80000a36
3842 && param.iOutput[1].iCode == 0x800009d4 );
3844 #if defined __WINS__ || defined __WINSCW__
3845 TEST(r && param.iPen.iX == 7);
3848 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);
3850 param.iPosInText = 114;
3851 param.iPen.iX = param.iPen.iY = 0;
3853 r = aFont->GetCharacterPosition2(param,shapeInfo);
3855 TEST(r && param.iPosInText == 117
3856 && param.iOutputGlyphs == 1
3857 && param.iOutput[0].iCode == 0x80000aae);
3859 #if defined __WINS__ || defined __WINSCW__
3860 TEST(r && param.iPen.iX == 17);
3863 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);
3865 param.iPosInText = 117;
3866 param.iPen.iX = param.iPen.iY = 0;
3868 r = aFont->GetCharacterPosition2(param,shapeInfo);
3870 TEST(r && param.iPosInText == 120
3871 && param.iOutputGlyphs == 1
3872 && param.iOutput[0].iCode == 0x80000aab );
3874 #if defined __WINS__ || defined __WINSCW__
3875 TEST(r && param.iPen.iX == 21);
3878 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);
3880 param.iPosInText = 120;
3881 param.iPen.iX = param.iPen.iY = 0;
3883 r = aFont->GetCharacterPosition2(param,shapeInfo);
3885 TEST(r && param.iPosInText == 123
3886 && param.iOutputGlyphs == 1
3887 && param.iOutput[0].iCode == 0x80000ab5 );
3889 #if defined __WINS__ || defined __WINSCW__
3890 TEST(r && param.iPen.iX == 18);
3893 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);
3895 param.iPosInText = 123;
3896 param.iPen.iX = param.iPen.iY = 0;
3898 r = aFont->GetCharacterPosition2(param,shapeInfo);
3900 TEST(r && param.iPosInText == 126
3901 && param.iOutputGlyphs == 2
3902 && param.iOutput[0].iCode == 0x800009d8
3903 && param.iOutput[1].iCode == 0x8000097b);
3905 #if defined __WINS__ || defined __WINSCW__
3906 TEST(r && param.iPen.iX == 17);
3909 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);
3911 param.iPosInText = 126;
3912 param.iPen.iX = param.iPen.iY = 0;
3914 r = aFont->GetCharacterPosition2(param,shapeInfo);
3916 TEST(r && param.iPosInText == 129
3917 && param.iOutputGlyphs == 1
3918 && param.iOutput[0].iCode == 0x80000aad);
3920 #if defined __WINS__ || defined __WINSCW__
3921 TEST(r && param.iPen.iX == 9);
3924 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);
3926 param.iPosInText = 129;
3927 param.iPen.iX = param.iPen.iY = 0;
3929 r = aFont->GetCharacterPosition2(param,shapeInfo);
3931 TEST(r && param.iPosInText == 132
3932 && param.iOutputGlyphs == 1
3933 && param.iOutput[0].iCode == 0x80000ac0 );
3935 #if defined __WINS__ || defined __WINSCW__
3936 TEST(r && param.iPen.iX == 10);
3939 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);
3941 param.iPosInText =132;
3942 param.iPen.iX = param.iPen.iY = 0;
3944 r = aFont->GetCharacterPosition2(param,shapeInfo);
3946 TEST(r && param.iPosInText == 137
3947 && param.iOutputGlyphs == 3
3948 && param.iOutput[0].iCode == 0x800009e0
3949 && param.iOutput[1].iCode == 0x800009e1
3950 && param.iOutput[2].iCode == 0x80000971);
3952 #if defined __WINS__ || defined __WINSCW__
3953 TEST(r && param.iPen.iX == 26);
3957 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);
3959 param.iPosInText = 137;
3960 param.iPen.iX = param.iPen.iY = 0;
3962 r = aFont->GetCharacterPosition2(param,shapeInfo);
3964 TEST(r && param.iPosInText == 142
3965 && param.iOutputGlyphs == 3
3966 && param.iOutput[0].iCode == 0x800009e7
3967 && param.iOutput[1].iCode == 0x800009f3
3968 && param.iOutput[2].iCode == 0x80000971);
3970 #if defined __WINS__ || defined __WINSCW__
3971 TEST(r && param.iPen.iX == 23);
3974 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);
3976 param.iPosInText = 142;
3977 param.iPen.iX = param.iPen.iY = 0;
3979 r = aFont->GetCharacterPosition2(param,shapeInfo);
3981 TEST(r && param.iPosInText == 144
3982 && param.iOutputGlyphs == 1
3983 && param.iOutput[0].iCode == 0x80000b04);
3985 #if defined __WINS__ || defined __WINSCW__
3986 TEST(r && param.iPen.iX == 7);
3989 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);
3991 param.iPosInText = 144;
3992 param.iPen.iX = param.iPen.iY = 0;
3994 r = aFont->GetCharacterPosition2(param,shapeInfo);
3996 TEST(r && param.iPosInText == 146
3997 && param.iOutputGlyphs == 1
3998 && param.iOutput[0].iCode == 0x80000b05);
4000 #if defined __WINS__ || defined __WINSCW__
4001 TEST(r && param.iPen.iX == 9);
4004 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);
4006 param.iPosInText = 146;
4007 param.iPen.iX = param.iPen.iY = 0;
4009 r = aFont->GetCharacterPosition2(param,shapeInfo);
4011 TEST(r && param.iPosInText == 148
4012 && param.iOutputGlyphs == 1
4013 && param.iOutput[0].iCode == 0x80000b02);
4015 #if defined __WINS__ || defined __WINSCW__
4016 TEST(r && param.iPen.iX == 7);
4019 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);
4021 param.iPosInText = 148;
4022 param.iPen.iX = param.iPen.iY = 0;
4024 r = aFont->GetCharacterPosition2(param,shapeInfo);
4026 TEST(r && param.iPosInText == 150
4027 && param.iOutputGlyphs == 1
4028 && param.iOutput[0].iCode == 0x80000aff);
4030 #if defined __WINS__ || defined __WINSCW__
4031 TEST(r && param.iPen.iX == 16);
4034 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);
4036 param.iPosInText = 150;
4037 param.iPen.iX = param.iPen.iY = 0;
4039 r = aFont->GetCharacterPosition2(param,shapeInfo);
4041 TEST(r && param.iPosInText == 152
4042 && param.iOutputGlyphs == 2
4043 && param.iOutput[0].iCode == 0x80000962
4044 && param.iOutput[1].iCode ==0x80000951);
4046 #if defined __WINS__ || defined __WINSCW__
4047 TEST(r && param.iPen.iX == 8);
4050 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);
4052 param.iPosInText = 152;
4053 param.iPen.iX = param.iPen.iY = 0;
4055 r = aFont->GetCharacterPosition2(param,shapeInfo);
4057 TEST(r && param.iPosInText == 155
4058 && param.iOutputGlyphs == 3
4059 && param.iOutput[0].iCode == 0x80000962
4060 && param.iOutput[1].iCode == 0x80000986
4061 && param.iOutput[2].iCode == 0x80000951);
4063 #if defined __WINS__ || defined __WINSCW__
4064 TEST(r && param.iPen.iX == 12);
4068 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);
4070 param.iPosInText = 155;
4071 param.iPen.iX = param.iPen.iY = 0;
4073 r = aFont->GetCharacterPosition2(param,shapeInfo);
4075 TEST(r && param.iPosInText == 158
4076 && param.iOutputGlyphs == 3
4077 && param.iOutput[0].iCode == 0x80000962
4078 && param.iOutput[1].iCode == 0x80000989
4079 && param.iOutput[2].iCode == 0x80000951);
4081 #if defined __WINS__ || defined __WINSCW__
4082 TEST(r && param.iPen.iX == 8);
4086 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);
4087 param.iPosInText = 158;
4088 param.iPen.iX = param.iPen.iY = 0;
4090 r = aFont->GetCharacterPosition2(param,shapeInfo);
4092 TEST(r && param.iPosInText == 160
4093 && param.iOutputGlyphs == 1
4094 && param.iOutput[0].iCode == 0x80000aee);
4096 #if defined __WINS__ || defined __WINSCW__
4097 TEST(r && param.iPen.iX == 14);
4100 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);
4102 param.iPosInText = 160;
4103 param.iPen.iX = param.iPen.iY = 0;
4105 r = aFont->GetCharacterPosition2(param,shapeInfo);
4107 TEST(r && param.iPosInText == 162
4108 && param.iOutputGlyphs == 1
4109 && param.iOutput[0].iCode == 0x80000aed);
4111 #if defined __WINS__ || defined __WINSCW__
4112 TEST(r && param.iPen.iX == 10);
4115 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);
4119 void CTGlyphSelection::TestBengaliChars(CFbsFont* aFont)
4121 INFO_PRINTF1(_L("Test Bengali Glyphs"));
4126 TBuf<115> testText(0);
4127 CFont::TPositionParam param;
4128 param.iDirection = CFont::EHorizontal;
4129 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
4131 testText.SetLength(115);
4132 // Make sure there is no garbage values in the memory we are using.
4133 for (TInt i = 0; i < testText.Length(); i++)
4136 //Testdata for Bengali language
4137 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4002"));
4139 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4002
4140 @SYMTestCaseDesc Automated GDI testing for Bengali
4141 @SYMTestPriority High
4142 @SYMTestActions Attempt to compose various invalid Bengali glyph clusters to test the requirement.
4143 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
4144 @SYMTestExpectedResults Rendering engine will render as incomplete syllables
4145 @SYMPREQ 1766 Bengali for Sphinx
4146 @SYMREQ 8741 Bengali Text Rendering
4149 // BEN002: Test invalid sequences
4150 testText[0] = 0x09C7;
4151 testText[1] = 0x0995;
4152 testText[2] = 0x0995;
4153 testText[3] = 0x09C1;
4154 testText[4] = 0x09C1;
4155 testText[5] = 0x0995;
4156 testText[6] = 0x09CD;
4157 testText[7] = 0x09C1;
4158 testText[8] = 0x0995;
4159 testText[9] = 0x0981;
4160 testText[10] = 0x09C1;
4162 param.iText.Set(testText);
4163 RShapeInfo shapeInfo;
4164 param.iPosInText = 0;
4165 param.iPen.iX = param.iPen.iY = 0;
4166 r = aFont->GetCharacterPosition2(param,shapeInfo);
4168 TEST(r && param.iPosInText == 1
4169 && param.iOutputGlyphs == 2
4170 && param.iOutput[0].iCode == 0x80000ce5
4171 && param.iOutput[1].iCode == 0x8000058f);
4173 #if defined __WINS__ || defined __WINSCW__
4174 TEST(r && param.iPen.iX == 15);
4177 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);
4179 param.iPosInText = 1;
4180 param.iPen.iX = param.iPen.iY = 0;
4181 r = aFont->GetCharacterPosition2(param,shapeInfo);
4183 TEST(r && param.iPosInText == 2
4184 && param.iOutputGlyphs == 1
4185 && param.iOutput[0].iCode == 0x80000cbc);
4187 #if defined __WINS__ || defined __WINSCW__
4188 TEST(r && param.iPen.iX == 12);
4191 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);
4193 param.iPosInText = 2;
4194 param.iPen.iX = param.iPen.iY = 0;
4195 r = aFont->GetCharacterPosition2(param,shapeInfo);
4197 TEST(r && param.iPosInText == 4
4198 && param.iOutputGlyphs == 1
4199 && param.iOutput[0].iCode == 0x80000ebe);
4201 #if defined __WINS__ || defined __WINSCW__
4202 TEST(r && param.iPen.iX == 13);
4205 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);
4207 param.iPosInText = 4;
4208 param.iPen.iX = param.iPen.iY = 0;
4209 r = aFont->GetCharacterPosition2(param,shapeInfo);
4211 TEST(r && param.iPosInText == 5
4212 && param.iOutputGlyphs == 2
4213 && param.iOutput[0].iCode == 0x8000058f
4214 && param.iOutput[1].iCode == 0x80000ce1
4216 #if defined __WINS__ || defined __WINSCW__
4217 TEST(r && param.iPen.iX == 9);
4220 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);
4222 param.iPosInText = 5;
4223 param.iPen.iX = param.iPen.iY = 0;
4224 r = aFont->GetCharacterPosition2(param,shapeInfo);
4226 TEST(r && param.iPosInText == 7
4227 && param.iOutputGlyphs == 2
4228 && param.iOutput[0].iCode == 0x80000cbc
4229 && param.iOutput[1].iCode == 0x80000ce9
4232 #if defined __WINS__ || defined __WINSCW__
4233 TEST(r && param.iPen.iX == 12);
4236 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);
4238 param.iPosInText = 7;
4239 param.iPen.iX = param.iPen.iY = 0;
4240 r = aFont->GetCharacterPosition2(param,shapeInfo);
4242 TEST(r && param.iPosInText == 8
4243 && param.iOutputGlyphs == 2
4244 && param.iOutput[0].iCode == 0x8000058f
4245 && param.iOutput[1].iCode == 0x80000ce1
4248 #if defined __WINS__ || defined __WINSCW__
4249 TEST(r && param.iPen.iX == 9);
4252 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);
4254 param.iPosInText = 8;
4255 param.iPen.iX = param.iPen.iY = 0;
4256 r = aFont->GetCharacterPosition2(param,shapeInfo);
4258 TEST(r && param.iPosInText == 10
4259 && param.iOutputGlyphs == 2
4260 && param.iOutput[0].iCode == 0x80000cbc
4261 && param.iOutput[1].iCode == 0x80000cad
4264 #if defined __WINS__ || defined __WINSCW__
4265 TEST(r && param.iPen.iX == 12);
4268 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);
4270 param.iPosInText = 10;
4271 param.iPen.iX = param.iPen.iY = 0;
4272 r = aFont->GetCharacterPosition2(param,shapeInfo);
4274 TEST(r && param.iPosInText == 11
4275 && param.iOutputGlyphs == 2
4276 && param.iOutput[0].iCode == 0x8000058f
4277 && param.iOutput[1].iCode == 0x80000ce1
4280 #if defined __WINS__ || defined __WINSCW__
4281 TEST(r && param.iPen.iX == 9);
4284 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);
4285 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4287 INFO_PRINTF1(_L("Failed to record test result"));
4288 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4003"));
4290 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4003
4291 @SYMTestCaseDesc Automated GDI testing for Bengali
4292 @SYMTestPriority High
4294 Passing both Bengali and Latin scripts simultaneously
4295 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4296 @SYMPREQ 1766 Bengali for Sphinx
4297 @SYMREQ 8741 Bengali Text Rendering
4300 testText[11] = 0x0995;
4301 testText[12] = 0x0041; // Unicode value for A
4302 testText[13] = 0x09E6; //Bengali digit 1
4304 param.iPosInText = 11;
4305 param.iPen.iX = param.iPen.iY = 0;
4306 r = aFont->GetCharacterPosition2(param,shapeInfo);
4308 TEST(r && param.iPosInText == 12
4309 && param.iOutputGlyphs == 1
4310 && param.iOutput[0].iCode == 0x80000cbc
4313 #if defined __WINS__ || defined __WINSCW__
4314 TEST(r && param.iPen.iX == 12);
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 = 12;
4320 param.iPen.iX = param.iPen.iY = 0;
4321 r = aFont->GetCharacterPosition2(param,shapeInfo);
4323 TEST(r && param.iPosInText == 13
4324 && param.iOutputGlyphs == 1
4325 && param.iOutput[0].iCode == 0x41
4328 #if defined __WINS__ || defined __WINSCW__
4329 TEST(r && param.iPen.iX == 10);
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 = 13;
4335 param.iPen.iX = param.iPen.iY = 0;
4336 r = aFont->GetCharacterPosition2(param,shapeInfo);
4338 TEST(r && param.iPosInText == 14
4339 && param.iOutputGlyphs == 1
4340 && param.iOutput[0].iCode ==0x80000cf3
4343 #if defined __WINS__ || defined __WINSCW__
4344 TEST(r && param.iPen.iX == 10);
4347 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);
4348 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4350 INFO_PRINTF1(_L("Failed to record test result"));
4351 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4004"));
4353 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4004
4354 @SYMTestCaseDesc Automated GDI testing for Bengali
4355 @SYMTestPriority High
4356 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test the reequirement.
4357 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.
4358 Invalid sequences of characters must be rendered as incomplete syllables
4360 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4361 @SYMPREQ 1766: Bengali for Sphinx
4362 @SYMREQ 8741: Bengali Text Rendering
4365 testText[14] = 0x0985;
4366 testText[15] = 0x09A4;
4367 testText[16] = 0x09CD;
4368 testText[17] = 0x09AF;
4369 testText[18] = 0x09A8;
4370 testText[19] = 0x09CD;
4371 testText[20] = 0x09A4;
4373 param.iPosInText = 14;
4374 param.iPen.iX = param.iPen.iY = 0;
4375 r = aFont->GetCharacterPosition2(param,shapeInfo);
4377 TEST(r && param.iPosInText == 15
4378 && param.iOutputGlyphs == 1
4379 && param.iOutput[0].iCode == 0x80000cb0
4382 #if defined __WINS__ || defined __WINSCW__
4383 TEST(r && param.iPen.iX == 14);
4386 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);
4388 param.iPosInText = 15;
4389 param.iPen.iX = param.iPen.iY = 0;
4390 r = aFont->GetCharacterPosition2(param,shapeInfo);
4392 TEST(r && param.iPosInText == 18
4393 && param.iOutputGlyphs == 2
4394 && param.iOutput[0].iCode ==0x80000ccb
4395 && param.iOutput[1].iCode ==0x80000d6e
4398 #if defined __WINS__ || defined __WINSCW__
4399 TEST(r && param.iPen.iX == 16);
4402 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);
4404 param.iPosInText = 18;
4405 param.iPen.iX = param.iPen.iY = 0;
4406 r = aFont->GetCharacterPosition2(param,shapeInfo);
4408 TEST(r && param.iPosInText == 21
4409 && param.iOutputGlyphs == 1
4410 && param.iOutput[0].iCode == 0x80000e14
4413 #if defined __WINS__ || defined __WINSCW__
4414 TEST(r && param.iPen.iX == 13);
4417 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);
4418 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4420 INFO_PRINTF1(_L("Failed to record test result"));
4421 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4005"));
4424 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4005
4425 @SYMTestCaseDesc Automated GDI testing for Bengali
4426 @SYMTestPriority High
4427 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test the requirment
4428 Text rendering must be able to display specified character sequences using ligatures and set of ligatures (stable/unstable) must be font dependent / configurable.
4429 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4430 @SYMPREQ 1766: Bengali for Sphinx
4431 @SYMREQ 8741: Bengali Text Rendering
4433 testText[21] = 0x0995;
4434 testText[22] = 0x09CD;
4435 testText[23] = 0x09B7;
4437 testText[24] = 0x09A4;
4438 testText[25] = 0x09CD;
4439 testText[26] = 0x09B0;
4441 testText[27] = 0x09A6;
4442 testText[28] = 0x09CD;
4443 testText[29] = 0x09A6;
4446 param.iPosInText = 21;
4447 param.iPen.iX = param.iPen.iY = 0;
4448 r = aFont->GetCharacterPosition2(param,shapeInfo);
4450 TEST(r && param.iPosInText == 24
4451 && param.iOutputGlyphs == 1
4452 && param.iOutput[0].iCode == 0x80000d25
4455 #if defined __WINS__ || defined __WINSCW__
4456 TEST(r && param.iPen.iX == 15);
4459 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);
4461 param.iPosInText = 24;
4462 param.iPen.iX = param.iPen.iY = 0;
4463 r = aFont->GetCharacterPosition2(param,shapeInfo);
4465 TEST(r && param.iPosInText == 27
4466 && param.iOutputGlyphs == 1
4467 && param.iOutput[0].iCode ==0x80000d89
4470 #if defined __WINS__ || defined __WINSCW__
4471 TEST(r && param.iPen.iX == 12);
4474 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);
4476 param.iPosInText = 27;
4477 param.iPen.iX = param.iPen.iY = 0;
4478 r = aFont->GetCharacterPosition2(param,shapeInfo);
4480 TEST(r && param.iPosInText == 30
4481 && param.iOutputGlyphs == 1
4482 && param.iOutput[0].iCode == 0x80000e0a
4485 #if defined __WINS__ || defined __WINSCW__
4486 TEST(r && param.iPen.iX == 13);
4489 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);
4490 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4492 INFO_PRINTF1(_L("Failed to record test result"));
4493 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4006"));
4496 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4006
4497 @SYMTestCaseDesc Automated GDI testing for Bengali
4498 @SYMTestPriority High
4499 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
4500 whether tamil digits are recongized as numerals.
4501 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4502 @SYMPREQ 1766: Bengali for Sphinx
4503 @SYMREQ 8741: Bengali Text Rendering
4505 testText[30] = 0x09E6; // Bengali 1
4506 testText[31] = 0x0030; //Basic Latin 0
4509 param.iPosInText = 30;
4510 param.iPen.iX = param.iPen.iY = 0;
4511 r = aFont->GetCharacterPosition2(param,shapeInfo);
4513 TEST(r && param.iPosInText == 31
4514 && param.iOutputGlyphs == 1
4515 && param.iOutput[0].iCode == 0x80000cf3
4518 #if defined __WINS__ || defined __WINSCW__
4519 TEST(r && param.iPen.iX == 10);
4522 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);
4524 param.iPosInText = 31;
4525 param.iPen.iX = param.iPen.iY = 0;
4526 r = aFont->GetCharacterPosition2(param,shapeInfo);
4528 TEST(r && param.iPosInText == 32
4529 && param.iOutputGlyphs == 1
4530 && param.iOutput[0].iCode == 0x80000774
4533 #if defined __WINS__ || defined __WINSCW__
4534 TEST(r && param.iPen.iX == 8);
4537 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);
4539 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4541 INFO_PRINTF1(_L("Failed to record test result"));
4542 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4007"));
4545 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4007
4546 @SYMTestCaseDesc Automated GDI testing for Bengali
4547 @SYMTestPriority High
4548 @SYMTestActions Attempt to compose various valid
4549 All text handling processes ((rendering, editing, searching, sorting etc.) MUST treat the sequence of a base consonant and a nukta equivalently to Nukta consonants
4550 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4551 @SYMPREQ 1766: Bengali for Sphinx
4552 @SYMREQ 8741: Bengali Text Rendering
4554 testText[32] = 0x09AF;
4555 testText[33] = 0x09BC;
4556 testText[34] = 0x09DF;
4558 param.iPosInText = 32;
4559 param.iPen.iX = param.iPen.iY = 0;
4560 r = aFont->GetCharacterPosition2(param,shapeInfo);
4562 TEST(r && param.iPosInText == 34
4563 && param.iOutputGlyphs == 1
4564 && param.iOutput[0].iCode == 0x80000cee
4567 #if defined __WINS__ || defined __WINSCW__
4568 TEST(r && param.iPen.iX == 10);
4571 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);
4572 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4574 INFO_PRINTF1(_L("Failed to record test result"));
4575 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4008"));
4578 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4008
4579 @SYMTestCaseDesc Automated GDI testing for Bengali
4580 @SYMTestPriority High
4581 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
4582 Rendering engine must be capable of handling joining formatters.
4583 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4584 @SYMPREQ 1766: Bengali for Sphinx
4585 @SYMREQ 8741: Bengali Text Rendering
4587 testText[35] = 0x0995;
4588 testText[36] = 0x09CD;
4589 testText[37] = 0x09B7;
4591 testText[38] = 0x0995;
4592 testText[39] = 0x09CD;
4593 testText[40] = 0x200C;
4594 testText[42] = 0x09B7;
4596 testText[43] = 0x0995;
4597 testText[44] = 0x09CD;
4598 testText[45] = 0x200D;
4599 testText[46] = 0x09B7;
4602 param.iPosInText = 35;
4603 param.iPen.iX = param.iPen.iY = 0;
4604 r = aFont->GetCharacterPosition2(param,shapeInfo);
4606 TEST(r && param.iPosInText == 38
4607 && param.iOutputGlyphs == 1
4608 && param.iOutput[0].iCode == 0x80000d25
4611 #if defined __WINS__ || defined __WINSCW__
4612 TEST(r && param.iPen.iX == 15);
4615 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);
4617 param.iPosInText = 38;
4618 param.iPen.iX = param.iPen.iY = 0;
4619 r = aFont->GetCharacterPosition2(param,shapeInfo);
4621 TEST(r && param.iPosInText == 40
4622 && param.iOutputGlyphs == 2
4623 && param.iOutput[0].iCode == 0x80000cbc
4624 && param.iOutput[1].iCode == 0x80000ce9
4627 #if defined __WINS__ || defined __WINSCW__
4628 TEST(r && param.iPen.iX == 12);
4631 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);
4633 param.iPosInText = 43;
4634 param.iPen.iX = param.iPen.iY = 0;
4635 r = aFont->GetCharacterPosition2(param,shapeInfo);
4637 TEST(r && param.iPosInText == 47
4638 && param.iOutputGlyphs == 2
4639 && param.iOutput[0].iCode == 0x80000d2a
4640 && param.iOutput[1].iCode == 0x80000cd9
4643 #if defined __WINS__ || defined __WINSCW__
4644 TEST(r && param.iPen.iX == 22);
4647 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);
4649 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4651 INFO_PRINTF1(_L("Failed to record test result"));
4652 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4009"));
4656 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4009
4657 @SYMTestCaseDesc Automated GDI testing for Bengali
4658 @SYMTestPriority High
4659 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
4660 If consonant /ya/, /ra/, /la/, /ma/, /na/ or /ba/, is the last element of a consonant cluster, the consonant assumes a phala form.
4661 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4662 @SYMPREQ 1766: Bengali for Sphinx
4663 @SYMREQ 8741: Bengali Text Rendering
4665 testText[47] = 0x09AA;
4666 testText[48] = 0x09CD;
4667 testText[49] = 0x09AF;
4669 testText[50] = 0x09AA;
4670 testText[51] = 0x09CD;
4671 testText[52] = 0x09A8;
4673 // Not working with Series60Sans font:
4674 testText[53] = 0x09AA;
4675 testText[54] = 0x09CD;
4676 testText[55] = 0x09AE;
4678 param.iPosInText = 47;
4679 param.iPen.iX = param.iPen.iY = 0;
4680 r = aFont->GetCharacterPosition2(param,shapeInfo);
4682 TEST(r && param.iPosInText == 50
4683 && param.iOutputGlyphs == 2
4684 && param.iOutput[0].iCode == 0x80000cd0
4687 #if defined __WINS__ || defined __WINSCW__
4688 TEST(r && param.iPen.iX == 15);
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 = 50;
4694 param.iPen.iX = param.iPen.iY = 0;
4695 r = aFont->GetCharacterPosition2(param,shapeInfo);
4697 TEST(r && param.iPosInText == 53
4698 && param.iOutputGlyphs == 1
4699 && param.iOutput[0].iCode == 0x80000e25
4702 #if defined __WINS__ || defined __WINSCW__
4703 TEST(r && param.iPen.iX == 11);
4706 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);
4707 // Not working with Series60Sans font:
4708 param.iPosInText = 53;
4709 param.iPen.iX = param.iPen.iY = 0;
4711 r = aFont->GetCharacterPosition2(param,shapeInfo);
4713 TEST(r && param.iPosInText == 56
4714 && param.iOutputGlyphs == 2
4715 && param.iOutput[0].iCode == 0x80000d3e
4716 && param.iOutput[1].iCode == 0x80000cd4
4719 #if defined __WINS__ || defined __WINSCW__
4720 TEST(r && param.iPen.iX == 19);
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 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4726 INFO_PRINTF1(_L("Failed to record test result"));
4727 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4010"));
4730 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4010
4731 @SYMTestCaseDesc Automated GDI testing for Bengali
4732 @SYMTestPriority High
4733 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to tet
4734 Sequence <virama, ya>, i.e. ya-phala, MUST be allowed after independent vowels /a/ and /e/.
4735 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4736 @SYMPREQ 1766: Bengali for Sphinx
4737 @SYMREQ 8741: Bengali Text Rendering
4739 testText[56] = 0x0985;
4740 testText[57] = 0x09CD;
4741 testText[58] = 0x09AF;
4742 testText[59] = 0x09BE;
4744 // Double ya -> Ya, ya-phala
4745 testText[60] = 0x09AA;
4746 testText[61] = 0x09CD;
4747 testText[62] = 0x09AF;
4748 testText[63] = 0x09CD;
4749 testText[64] = 0x09AF;
4751 param.iPosInText = 56;
4752 param.iPen.iX = param.iPen.iY = 0;
4753 r = aFont->GetCharacterPosition2(param,shapeInfo);
4754 #if defined __WINS__ || defined __WINSCW__
4755 TEST(r && param.iPosInText == 57
4756 && param.iPen.iX == 14
4757 && param.iOutputGlyphs == 1
4758 && param.iOutput[0].iCode == 0x80000cb0
4760 #elif defined __ARMCC__
4761 TEST(r && param.iPosInText == 57
4762 && param.iOutputGlyphs == 1
4763 && param.iOutput[0].iCode == 0x80000cb0
4766 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);
4768 param.iPosInText = 57;
4769 param.iPen.iX = param.iPen.iY = 0;
4770 r = aFont->GetCharacterPosition2(param,shapeInfo);
4772 TEST(r && param.iPosInText == 58
4773 && param.iOutputGlyphs == 0
4776 #if defined __WINS__ || defined __WINSCW__
4777 TEST(r && param.iPen.iX == 0);
4780 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);
4782 param.iPosInText = 60;
4783 param.iPen.iX = param.iPen.iY = 0;
4784 r = aFont->GetCharacterPosition2(param,shapeInfo);
4786 TEST(r && param.iPosInText == 65
4787 && param.iOutputGlyphs == 3
4788 && param.iOutput[0].iCode == 0x80000d3e
4789 && param.iOutput[1].iCode == 0x80000cd5
4790 && param.iOutput[2].iCode == 0x80000d6e
4793 #if defined __WINS__ || defined __WINSCW__
4794 TEST(r && param.iPen.iX == 23);
4797 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);
4798 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4800 INFO_PRINTF1(_L("Failed to record test result"));
4801 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4011"));
4804 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4011
4805 @SYMTestCaseDesc Automated GDI testing for Bengali
4806 @SYMTestPriority High
4807 @SYMTestActions Attempt to compose various valid and glyph clusters to test
4808 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.
4809 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4810 @SYMPREQ 1766: Bengali for Sphinx
4811 @SYMREQ 8741: Bengali Text Rendering
4813 testText[65] = 0x0997;
4814 testText[66] = 0x09CD;
4815 testText[67] = 0x099C;
4817 testText[68] = 0x09AA;
4818 testText[69] = 0x09CD;
4819 testText[70] = 0x099C;
4822 param.iPosInText = 65;
4823 param.iPen.iX = param.iPen.iY = 0;
4824 r = aFont->GetCharacterPosition2(param,shapeInfo);
4826 TEST(r && param.iPosInText == 68
4827 && param.iOutputGlyphs == 2
4828 && param.iOutput[0].iCode == 0x80000d2c
4829 && param.iOutput[1].iCode == 0x80000cc3
4832 #if defined __WINS__ || defined __WINSCW__
4833 TEST(r && param.iPen.iX == 21);
4836 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);
4838 param.iPosInText = 68;
4839 param.iPen.iX = param.iPen.iY = 0;
4840 r = aFont->GetCharacterPosition2(param,shapeInfo);
4842 TEST(r && param.iPosInText == 71
4843 && param.iOutputGlyphs == 2
4844 && param.iOutput[0].iCode == 0x80000d3e
4847 #if defined __WINS__ || defined __WINSCW__
4848 TEST(r && param.iPen.iX == 23);
4851 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);
4855 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4857 INFO_PRINTF1(_L("Failed to record test result"));
4858 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4012"));
4860 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4012
4861 @SYMTestCaseDesc Automated GDI testing for Bengali
4862 @SYMTestPriority High
4863 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
4864 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.
4865 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4866 @SYMPREQ 1766: Bengali for Sphinx
4867 @SYMREQ 8741: Bengali Text Rendering
4869 testText[71] = 0x0995;
4870 testText[72] = 0x09CD;
4871 testText[73] = 0x099C;
4874 param.iPosInText = 71;
4875 param.iPen.iX = param.iPen.iY = 0;
4876 r = aFont->GetCharacterPosition2(param,shapeInfo);
4878 TEST(r && param.iPosInText == 74
4879 && param.iOutputGlyphs == 2
4880 && param.iOutput[0].iCode == 0x80000d2a
4883 #if defined __WINS__ || defined __WINSCW__
4884 TEST(r && param.iPen.iX == 26);
4887 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);
4889 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4891 INFO_PRINTF1(_L("Failed to record test result"));
4892 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4013"));
4896 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4013
4897 @SYMTestCaseDesc Automated GDI testing for Bengali
4898 @SYMTestPriority High
4899 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
4900 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.
4901 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
4902 @SYMPREQ 1766: Bengali for Sphinx
4903 @SYMREQ 8741: Bengali Text Rendering
4905 // Ma does not stack correctly on top with Series60Sans font, produces half form instead. Font defect.
4906 testText[74] = 0x09AE;
4907 testText[75] = 0x09CD;
4908 testText[76] = 0x09A5;
4910 testText[77] = 0x09AE;
4911 testText[78] = 0x09CD;
4912 testText[79] = 0x09AB;
4913 // Ma does not stack correctly on top, produces half form instead.
4914 testText[80] = 0x09AE;
4915 testText[81] = 0x09CD;
4916 testText[82] = 0x0995;
4918 testText[83] = 0x09A8;
4919 testText[84] = 0x09CD;
4920 testText[85] = 0x09A5;
4923 //Combination pa,virama,ma produces incorrect glyph mapping: Font defect.
4925 param.iPosInText = 74;
4926 param.iPen.iX = param.iPen.iY = 0;
4928 r = aFont->GetCharacterPosition2(param,shapeInfo);
4930 TEST(r && param.iPosInText == 77
4931 && param.iOutputGlyphs == 2
4932 && param.iOutput[0].iCode == 0x80000d42
4933 && param.iOutput[1].iCode == 0x80000ccc
4936 #if defined __WINS__ || defined __WINSCW__
4937 TEST(r && param.iPen.iX == 21);
4940 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);
4943 param.iPosInText = 77;
4944 param.iPen.iX = param.iPen.iY = 0;
4945 r = aFont->GetCharacterPosition2(param,shapeInfo);
4947 TEST(r && param.iPosInText == 80
4948 && param.iOutputGlyphs == 1
4949 && param.iOutput[0].iCode == 0x80000e30
4952 #if defined __WINS__ || defined __WINSCW__
4953 TEST(r && param.iPen.iX == 19);
4956 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);
4958 // Ma does not stack correctly on top, produces half form instead.
4959 param.iPosInText = 80;
4960 param.iPen.iX = param.iPen.iY = 0;
4962 r = aFont->GetCharacterPosition2(param,shapeInfo);
4964 TEST(r && param.iPosInText == 83
4965 && param.iOutputGlyphs == 2
4966 && param.iOutput[0].iCode == 0x80000d42
4969 #if defined __WINS__ || defined __WINSCW__
4970 TEST(r && param.iPen.iX == 22);
4973 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);
4976 param.iPosInText = 83;
4977 param.iPen.iX = param.iPen.iY = 0;
4978 r = aFont->GetCharacterPosition2(param,shapeInfo);
4980 TEST(r && param.iPosInText == 86
4981 && param.iOutputGlyphs == 1
4982 && param.iOutput[0].iCode == 0x80000e15
4985 #if defined __WINS__ || defined __WINSCW__
4986 TEST(r && param.iPen.iX == 10);
4989 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);
4990 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
4992 INFO_PRINTF1(_L("Failed to record test result"));
4993 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4014"));
4997 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4014
4998 @SYMTestCaseDesc Automated GDI testing for Bengali
4999 @SYMTestPriority High
5000 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test
5001 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.
5002 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5003 @SYMPREQ 1766: Bengali for Sphinx
5004 @SYMREQ 8741: Bengali Text Rendering
5006 testText[86] = 0x0995;
5007 testText[87] = 0x09CD;
5008 testText[88] = 0x099F;
5010 testText[89] = 0x0995;
5011 testText[90] = 0x09CD;
5012 testText[91] = 0x09A4;
5014 // Not sure if this is forming the correct ligature
5015 testText[92] = 0x09AE;
5016 testText[93] = 0x09CD;
5017 testText[94] = 0x09AA;
5019 // Not sure if this is forming the correct ligature
5020 testText[95] = 0x09B8;
5021 testText[96] = 0x09CD;
5022 testText[97] = 0x09AA;
5024 testText[98] = 0x09B9;
5025 testText[99] = 0x09CD;
5026 testText[100] = 0x09A8;
5028 param.iPosInText = 86;
5029 param.iPen.iX = param.iPen.iY = 0;
5030 r = aFont->GetCharacterPosition2(param,shapeInfo);
5032 TEST(r && param.iPosInText == 89
5033 && param.iOutputGlyphs == 1
5034 && param.iOutput[0].iCode == 0x80000dd7
5037 #if defined __WINS__ || defined __WINSCW__
5038 TEST(r && param.iPen.iX == 12);
5041 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);
5043 param.iPosInText = 89;
5044 param.iPen.iX = param.iPen.iY = 0;
5045 r = aFont->GetCharacterPosition2(param,shapeInfo);
5047 TEST(r && param.iPosInText == 92
5048 && param.iOutputGlyphs == 1
5049 && param.iOutput[0].iCode == 0x80000dd9
5052 #if defined __WINS__ || defined __WINSCW__
5053 TEST(r && param.iPen.iX == 15);
5056 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);
5058 param.iPosInText = 92;
5059 param.iPen.iX = param.iPen.iY = 0;
5060 r = aFont->GetCharacterPosition2(param,shapeInfo);
5062 TEST(r && param.iPosInText == 95
5063 && param.iOutputGlyphs == 1
5064 && param.iOutput[0].iCode == 0x80000e2f
5067 #if defined __WINS__ || defined __WINSCW__
5068 TEST(r && param.iPen.iX == 19);
5071 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);
5073 param.iPosInText = 95;
5074 param.iPen.iX = param.iPen.iY = 0;
5075 r = aFont->GetCharacterPosition2(param,shapeInfo);
5077 TEST(r && param.iPosInText == 98
5078 && param.iOutputGlyphs == 1
5079 && param.iOutput[0].iCode == 0x80000e56
5082 #if defined __WINS__ || defined __WINSCW__
5083 TEST(r && param.iPen.iX == 20);
5086 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);
5088 param.iPosInText = 98;
5089 param.iPen.iX = param.iPen.iY = 0;
5090 r = aFont->GetCharacterPosition2(param,shapeInfo);
5092 TEST(r && param.iPosInText == 101
5093 && param.iOutputGlyphs == 1
5094 && param.iOutput[0].iCode == 0x80000e5d
5097 #if defined __WINS__ || defined __WINSCW__
5098 TEST(r && param.iPen.iX == 13);
5101 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);
5102 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5104 INFO_PRINTF1(_L("Failed to record test result"));
5105 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4015"));
5108 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4015
5109 @SYMTestCaseDesc Automated GDI testing for Bengali
5110 @SYMTestPriority High
5111 @SYMTestActions Attempt to compose various valid Bengali glyph clusters to test that
5112 If RA is the first consonant cluster, it must assume the form of Repha.
5113 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5114 @SYMPREQ 1766: Bengali for Sphinx
5115 @SYMREQ 8741: Bengali Text Rendering
5117 testText[101] = 0x09B0;
5118 testText[102] = 0x09CD;
5119 testText[103] = 0x0995;
5121 testText[104] = 0x09B0;
5122 testText[105] = 0x200C;
5123 testText[106] = 0x09CD;
5124 testText[107] = 0x09AF;
5126 param.iPosInText = 101;
5127 param.iPen.iX = param.iPen.iY = 0;
5128 r = aFont->GetCharacterPosition2(param,shapeInfo);
5130 TEST(r && param.iPosInText == 104
5131 && param.iOutputGlyphs == 2
5132 && param.iOutput[0].iCode == 0x80000cbc
5133 && param.iOutput[1].iCode == 0x80000d27
5136 #if defined __WINS__ || defined __WINSCW__
5137 TEST(r && param.iPen.iX == 12);
5140 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);
5142 param.iPosInText =104;
5143 param.iPen.iX = param.iPen.iY = 0;
5144 r = aFont->GetCharacterPosition2(param,shapeInfo);
5146 TEST(r && param.iPosInText == 105
5147 && param.iOutputGlyphs == 1
5148 && param.iOutput[0].iCode == 0x80000cd6
5151 #if defined __WINS__ || defined __WINSCW__
5152 TEST(r && param.iPen.iX == 9);
5155 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);
5160 void CTGlyphSelection::TestTamilChars(CFbsFont* aFont)
5162 INFO_PRINTF1(_L("Test Tamil Glyphs"));
5165 TBuf<162> testText(0);
5166 CFont::TPositionParam param;
5167 param.iDirection = CFont::EHorizontal;
5168 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
5170 testText.SetLength(162);
5171 // Make sure there is no garbage values in the memory we are using.
5172 for (TInt i = 0; i < testText.Length(); i++)
5174 param.iText.Set(testText);
5175 RShapeInfo shapeInfo;
5176 //Testdata for Tamil Langauage
5177 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5179 INFO_PRINTF1(_L("Failed to record test result"));
5180 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4016"));
5182 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4016
5183 @SYMTestCaseDesc Automated GDI testing for Tamil
5184 @SYMTestPriority High
5185 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5186 a)The Tamil alphabets are listed in contiguous Unicode range(U+0B80U+0BFF), This also contains Tamil Numbers.
5187 b)The Tamil alphabets are listed in contiguous Unicode range(U+0B80U+0BFF), This also contains Tamil Numbers.
5188 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
5189 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
5190 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.
5191 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5192 @SYMPREQ 1766: Tamil for Sphinx
5193 @SYMREQ 8742:Tamil Text Rendering
5195 testText[0] = 0x0B95; //Tamil Ka
5196 testText[1] = 0x0B8E; //Tamil e
5197 testText[2] = 0x0061; //Latin A
5198 testText[3] = 0x0905; // Hindi Ka
5199 testText[4] = 0x0020;
5201 param.iPosInText = 0 ;
5202 param.iPen.iX = param.iPen.iY = 0;
5204 r = aFont->GetCharacterPosition2(param,shapeInfo);
5206 TEST(r && param.iPosInText == 1
5207 && param.iOutputGlyphs == 1
5208 && param.iOutput[0].iCode == 0x80000bf6);
5210 #if defined __WINS__ || defined __WINSCW__
5211 TEST(r && param.iPen.iX == 13);
5214 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);
5216 param.iPosInText = 1 ;
5217 param.iPen.iX = param.iPen.iY = 0;
5219 r = aFont->GetCharacterPosition2(param,shapeInfo);
5221 TEST(r && param.iPosInText == 2
5222 && param.iOutputGlyphs == 1
5223 && param.iOutput[0].iCode == 0x80000bf0);
5225 #if defined __WINS__ || defined __WINSCW__
5226 TEST(r && param.iPen.iX == 14);
5229 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);
5231 param.iPosInText = 2 ;
5232 param.iPen.iX = param.iPen.iY = 0;
5234 r = aFont->GetCharacterPosition2(param,shapeInfo);
5236 TEST(r && param.iPosInText == 3
5237 && param.iOutputGlyphs == 1
5238 && param.iOutput[0].iCode == 0x61 );
5240 #if defined __WINS__ || defined __WINSCW__
5241 TEST(r && param.iPen.iX == 10);
5244 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);
5245 param.iPosInText = 3 ;
5246 param.iPen.iX = param.iPen.iY = 0;
5248 r = aFont->GetCharacterPosition2(param,shapeInfo);
5250 TEST(r && param.iPosInText == 4
5251 && param.iOutputGlyphs == 1
5252 && param.iOutput[0].iCode == 0x80000528);
5254 #if defined __WINS__ || defined __WINSCW__
5255 TEST(r && param.iPen.iX == 12);
5258 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);
5260 /*Req 02 1.2.3, 1.3.21, 1.3.21.1, 1.3.21.2 1.3.21.3
5262 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.
5263 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
5264 Please see the attachment for examples
5265 1.3.21.1 For normal rendering, combining Tamil characters must be preceded by a valid base character.
5266 1.3.21.2 Combining Tamil characters that do not follow a valid base character must be rendered using an appropriate fallback rendering.
5267 1.3.21.3 Device must not hang or crash because of unexpected character sequences.*/
5269 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5271 INFO_PRINTF1(_L("Failed to record test result"));
5272 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4017"));
5276 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4017
5277 @SYMTestCaseDesc Automated GDI testing for Tamil
5278 @SYMTestPriority High
5279 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5280 It is reasonably common to mix Latin, Tamil as well as other script in texts. This must include the numerals.
5281 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5282 @SYMPREQ 1766: Tamil for Sphinx
5283 @SYMREQ 8742:Tamil Text Rendering
5285 testText[4] = 0x0036;//Latin 06
5286 testText[5] = 0x0BEC;//Tamil 06
5288 param.iPosInText = 4 ;
5289 param.iPen.iX = param.iPen.iY = 0;
5291 r = aFont->GetCharacterPosition2(param,shapeInfo);
5293 TEST(r && param.iPosInText == 5
5294 && param.iOutputGlyphs == 1
5295 && param.iOutput[0].iCode == 0x8000077A);
5297 #if defined __WINS__ || defined __WINSCW__
5298 TEST(r && param.iPen.iX == 8);
5301 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);
5303 param.iPosInText = 5 ;
5304 param.iPen.iX = param.iPen.iY = 0;
5306 r = aFont->GetCharacterPosition2(param,shapeInfo);
5308 TEST(r && param.iPosInText == 6
5309 && param.iOutputGlyphs == 1
5310 && param.iOutput[0].iCode == 0x80000c20);
5312 #if defined __WINS__ || defined __WINSCW__
5313 TEST(r && param.iPen.iX == 16);
5316 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);
5318 /*Req 04 1.3.4, 1.3.20
5319 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.
5320 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.
5321 3. After a syllable has been formed it must be considered an indivisible and invariable unit.
5322 4. The shape of a syllable is not affected by surrounding syllables.
5323 1.3.20 Syllable is the smallest unbreakable component in Tamil*/
5327 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
5328 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
5332 1.3.19 In Tamil white space is used as a word boundary. Line breaking should be based on word boundaries
5337 1.2.4 For compatibility with legacy encodings, split matra and vowel representations must be recognized as identical to the single code representations (preferred)
5339 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5341 INFO_PRINTF1(_L("Failed to record test result"));
5342 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4018"));
5345 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4018
5346 @SYMTestCaseDesc Automated GDI testing for Tamil
5347 @SYMTestPriority High
5348 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
5349 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.
5350 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5351 @SYMPREQ 1766: Tamil for Sphinx
5352 @SYMREQ 8742:Tamil Text Rendering
5354 testText[6] = 0x0BAA; // Pa
5355 testText[7] = 0x0BCD; //Virama
5356 testText[8] = 0x0B95; //Ka
5357 testText[9] = 0x0BCD; //Virama
5358 testText[10] = 0x0B9F; //Tta
5359 testText[11] = 0x0BC7; //-e
5361 testText[12] = 0x0BAA;//Pa
5362 testText[13] = 0x0BCD;//Virama
5363 testText[14] = 0x0B95;//Ka
5364 testText[15] = 0x0BCC;//AU
5366 testText[16] = 0x0B95; //Ka
5367 testText[17] = 0x0BCD; //Virama
5368 testText[18] = 0x0BB7; //Ssa
5369 testText[19] = 0x0BCB; //OO
5371 param.iPosInText = 6 ;
5372 param.iPen.iX = param.iPen.iY = 0;
5374 r = aFont->GetCharacterPosition2(param,shapeInfo);
5376 TEST(r && param.iPosInText == 12
5377 && param.iOutputGlyphs == 4
5378 && param.iOutput[0].iCode == 0x80000c3a
5379 && param.iOutput[1].iCode == 0x80000c30
5380 && param.iOutput[2].iCode == 0x80000c13
5381 && param.iOutput[3].iCode == 0x80000bfb);
5383 #if defined __WINS__ || defined __WINSCW__
5384 TEST(r && param.iPen.iX == 51);
5387 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);
5389 param.iPosInText = 12 ;
5390 param.iPen.iX = param.iPen.iY = 0;
5392 r = aFont->GetCharacterPosition2(param,shapeInfo);
5394 TEST(r && param.iPosInText == 16
5395 && param.iOutputGlyphs ==4
5396 && param.iOutput[0].iCode == 0x80000c3a
5397 && param.iOutput[1].iCode == 0x80000c12
5398 && param.iOutput[2].iCode == 0x80000bf6
5399 && param.iOutput[3].iCode == 0x80000c19);
5401 #if defined __WINS__ || defined __WINSCW__
5402 TEST(r && param.iPen.iX == 56);
5405 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);
5407 param.iPosInText = 16 ;
5408 param.iPen.iX = param.iPen.iY = 0;
5410 r = aFont->GetCharacterPosition2(param,shapeInfo);
5412 TEST(r && param.iPosInText == 20
5413 && param.iOutputGlyphs == 3
5414 && param.iOutput[0].iCode == 0x80000c13
5415 && param.iOutput[1].iCode == 0x80000c2f
5416 && param.iOutput[2].iCode == 0x80000c0d);
5418 #if defined __WINS__ || defined __WINSCW__
5419 TEST(r && param.iPen.iX == 54);
5422 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);
5423 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5425 INFO_PRINTF1(_L("Failed to record test result"));
5426 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4019"));
5429 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4019
5430 @SYMTestCaseDesc Automated GDI testing for Tamil
5431 @SYMTestPriority High
5432 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement
5433 Matras /-e/, /-ee/ and /-ai/ are reordered with the consonant they follow in memory order.
5434 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5435 @SYMPREQ 1766: Tamil for Sphinx
5436 @SYMREQ 8742:Tamil Text Rendering
5439 testText[20] = 0x0B95; //Ka
5440 testText[21] = 0x0BC7; //-e
5442 param.iPosInText = 20 ;
5443 param.iPen.iX = param.iPen.iY = 0;
5445 r = aFont->GetCharacterPosition2(param,shapeInfo);
5447 TEST(r && param.iPosInText == 22
5448 && param.iOutputGlyphs == 2
5449 && param.iOutput[0].iCode == 0x80000c13
5450 && param.iOutput[1].iCode == 0x80000bf6 );
5452 #if defined __WINS__ || defined __WINSCW__
5453 TEST(r && param.iPen.iX == 26);
5456 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);
5457 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5459 INFO_PRINTF1(_L("Failed to record test result"));
5460 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4020"));
5463 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4020
5464 @SYMTestCaseDesc Automated GDI testing for Tamil
5465 @SYMTestPriority High
5466 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirment
5467 Matras /-o/, /-oo/ and /-au/ are split into two halves that enclose the consonant they follow in memory order.
5468 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5469 @SYMPREQ 1766: Tamil for Sphinx
5470 @SYMREQ 8742:Tamil Text Rendering
5473 testText[22] = 0x0B95; //Ka
5474 testText[23] = 0x0BCA; //O
5477 param.iPosInText = 22 ;
5478 param.iPen.iX = param.iPen.iY = 0;
5480 r = aFont->GetCharacterPosition2(param,shapeInfo);
5482 TEST(r && param.iPosInText == 24
5483 && param.iOutputGlyphs == 3
5484 && param.iOutput[0].iCode == 0x80000c12
5485 && param.iOutput[1].iCode == 0x80000bf6
5486 && param.iOutput[2].iCode == 0x80000c0d);
5488 #if defined __WINS__ || defined __WINSCW__
5489 TEST(r && param.iPen.iX == 37);
5492 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);
5493 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5495 INFO_PRINTF1(_L("Failed to record test result"));
5496 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4021"));
5499 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4021
5500 @SYMTestCaseDesc Automated GDI testing for Tamil
5501 @SYMTestPriority High
5502 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirment.
5503 Tamil Modifier "Ayatham" MUST be treated as an independent character
5504 @SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5505 @SYMPREQ 1766: Tamil for Sphinx
5506 @SYMREQ 8742:Tamil Text Rendering
5509 testText[24] = 0x0B95; //Ka
5510 testText[25] = 0x0B83; //Aythem
5511 testText[26] = 0x0B85; //A
5513 param.iPosInText = 24;
5514 param.iPen.iX = param.iPen.iY = 0;
5516 r = aFont->GetCharacterPosition2(param,shapeInfo);
5518 TEST(r && param.iPosInText == 25
5519 && param.iOutputGlyphs == 1
5520 && param.iOutput[0].iCode == 0x80000bf6);
5522 #if defined __WINS__ || defined __WINSCW__
5523 TEST(r && param.iPen.iX == 13);
5526 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 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5529 INFO_PRINTF1(_L("Failed to record test result"));
5530 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4022"));
5533 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4022
5534 @SYMTestCaseDesc Automated GDI testing for Tamil
5535 @SYMTestPriority High
5536 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
5537 Rendering Engine MUST be capable of handling TAMIL ANUSVARA
5538 It has been suggested that this character be deprecated in Unicode
5539 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5540 @SYMPREQ 1766: Tamil for Sphinx
5541 @SYMREQ 8742:Tamil Text Rendering
5544 testText[27] = 0x0B95; //Ka
5545 testText[28] = 0x0B82; //Anusvara
5546 testText[29] = 0x0B95; //Ka
5548 param.iPosInText = 27;
5549 param.iPen.iX = param.iPen.iY = 0;
5551 r = aFont->GetCharacterPosition2(param,shapeInfo);
5553 TEST(r && param.iPosInText == 29
5554 && param.iOutputGlyphs == 2
5555 && param.iOutput[0].iCode == 0x80000bf6
5556 && param.iOutput[1].iCode == 0x80000be8);
5558 #if defined __WINS__ || defined __WINSCW__
5559 TEST(r && param.iPen.iX == 19);
5562 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);
5563 param.iPosInText = 29;
5564 param.iPen.iX = param.iPen.iY = 0;
5566 r = aFont->GetCharacterPosition2(param,shapeInfo);
5568 TEST(r && param.iPosInText == 30
5569 && param.iOutputGlyphs == 1
5570 && param.iOutput[0].iCode == 0x80000bf6 );
5572 #if defined __WINS__ || defined __WINSCW__
5573 TEST(r && param.iPen.iX == 13);
5576 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);
5578 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5580 INFO_PRINTF1(_L("Failed to record test result"));
5581 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4023"));
5584 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4023
5585 @SYMTestCaseDesc Automated GDI testing for Tamil
5586 @SYMTestPriority High
5587 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirment
5588 Tamil consonant /ra/ changes its shape, when a virama is applied to it.
5589 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5590 @SYMPREQ 1766: Tamil for Sphinx
5591 @SYMREQ 8742:Tamil Text Rendering
5594 testText[30] = 0x0BB0; //Ra
5595 testText[31] = 0x0BCD; //Virama
5596 testText[32] = 0x8205; //ZWJ
5599 param.iPosInText = 30;
5600 param.iPen.iX = param.iPen.iY = 0;
5602 r = aFont->GetCharacterPosition2(param,shapeInfo);
5604 TEST(r && param.iPosInText == 32
5605 && param.iOutputGlyphs == 2
5606 && param.iOutput[0].iCode == 0x80000c03 );
5608 #if defined __WINS__ || defined __WINSCW__
5609 TEST(r && param.iPen.iX == 10);
5612 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);
5613 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5615 INFO_PRINTF1(_L("Failed to record test result"));
5616 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4024"));
5619 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4024
5620 @SYMTestCaseDesc Automated GDI testing for Tamil
5621 @SYMTestPriority High
5622 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5623 Matra /-aa/ is combined to consonants in regular fashion. No extra shaping is required.
5624 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5625 @SYMPREQ 1766: Tamil for Sphinx
5626 @SYMREQ 8742:Tamil Text Rendering
5629 testText[33] = 0x0B95; //Ka
5630 testText[34] = 0x0B82; //Anusvara
5632 param.iPosInText = 33 ;
5633 param.iPen.iX = param.iPen.iY = 0;
5635 r = aFont->GetCharacterPosition2(param,shapeInfo);
5637 TEST(r && param.iPosInText == 35
5638 && param.iOutputGlyphs == 2
5639 && param.iOutput[0].iCode == 0x80000bf6 );
5641 #if defined __WINS__ || defined __WINSCW__
5642 TEST(r && param.iPen.iX == 19);
5645 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);
5647 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5649 INFO_PRINTF1(_L("Failed to record test result"));
5650 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4025"));
5653 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4025
5654 @SYMTestCaseDesc Automated GDI testing for Tamil
5655 @SYMTestPriority High
5656 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5657 Matras /-i/ and /-ii/ MUST form a ligature with consonant /tta/.
5658 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5659 @SYMPREQ 1766: Tamil for Sphinx
5660 @SYMREQ 8742:Tamil Text Rendering
5663 testText[35] = 0x0B9F; //Tta
5664 testText[36] = 0x0BBF; //I
5666 testText[37] = 0x0B9F; //Tta
5667 testText[38] = 0x0BC0; //Ii
5669 param.iPosInText = 35 ;
5670 param.iPen.iX = param.iPen.iY = 0;
5672 r = aFont->GetCharacterPosition2(param,shapeInfo);
5674 TEST(r && param.iPosInText == 37
5675 && param.iOutputGlyphs == 1
5676 && param.iOutput[0].iCode == 0x80000c51);
5678 #if defined __WINS__ || defined __WINSCW__
5679 TEST(r && param.iPen.iX == 15);
5682 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 = 37 ;
5685 param.iPen.iX = param.iPen.iY = 0;
5687 r = aFont->GetCharacterPosition2(param,shapeInfo);
5689 TEST(r && param.iPosInText == 39
5690 && param.iOutputGlyphs == 1
5691 && param.iOutput[0].iCode == 0x80000c52);
5693 #if defined __WINS__ || defined __WINSCW__
5694 TEST(r && param.iPen.iX == 13);
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);
5698 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5700 INFO_PRINTF1(_L("Failed to record test result"));
5701 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4026"));
5704 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4026
5705 @SYMTestCaseDesc Automated GDI testing for Tamil
5706 @SYMTestPriority High
5707 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5708 Consonant /ra/ takes an alternate shape when combined with matras /-i/ and /-ii/.
5709 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5710 @SYMPREQ 1766: Tamil for Sphinx
5711 @SYMREQ 8742:Tamil Text Rendering
5713 testText[39] = 0x0BB0; //Ra
5714 testText[40] = 0x0BBF; //I
5716 testText[41] = 0x0BB0; //Ra
5717 testText[42] = 0x0BC0; //Ii
5719 param.iPosInText = 39 ;
5720 param.iPen.iX = param.iPen.iY = 0;
5722 r = aFont->GetCharacterPosition2(param,shapeInfo);
5724 TEST(r && param.iPosInText == 41
5725 && param.iOutputGlyphs == 2
5726 && param.iOutput[0].iCode == 0x80000c0d
5727 && param.iOutput[1].iCode == 0x80000c0e );
5729 #if defined __WINS__ || defined __WINSCW__
5730 TEST(r && param.iPen.iX == 13);
5733 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);
5735 param.iPosInText = 41 ;
5736 param.iPen.iX = param.iPen.iY = 0;
5738 r = aFont->GetCharacterPosition2(param,shapeInfo);
5740 TEST(r && param.iPosInText == 43
5741 && param.iOutputGlyphs == 2
5742 && param.iOutput[0].iCode == 0x80000c0d
5743 && param.iOutput[1].iCode == 0x80000c0f);
5745 #if defined __WINS__ || defined __WINSCW__
5746 TEST(r && param.iPen.iX == 13);
5749 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);
5750 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5752 INFO_PRINTF1(_L("Failed to record test result"));
5753 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4027"));
5756 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4027
5757 @SYMTestCaseDesc Automated GDI testing for Tamil
5758 @SYMTestPriority High
5759 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement
5760 Matras /-i/ and /-ii/ take an alternate form when applied to consonants /nga/, /pa/, /ya/ and /va/.
5761 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5762 @SYMPREQ 1766: Tamil for Sphinx
5763 @SYMREQ 8742:Tamil Text Rendering
5765 testText[43] = 0x0B99; //Nga
5766 testText[44] = 0x0BBF; //I
5768 testText[45] = 0x0B99; //Nga
5769 testText[46] = 0x0BC0; //Ii
5771 param.iPosInText = 43 ;
5772 param.iPen.iX = param.iPen.iY = 0;
5774 r = aFont->GetCharacterPosition2(param,shapeInfo);
5776 TEST(r && param.iPosInText == 45
5777 && param.iOutputGlyphs == 2
5778 && param.iOutput[0].iCode == 0x80000bf7
5779 && param.iOutput[1].iCode == 0x80000c0e );
5781 #if defined __WINS__ || defined __WINSCW__
5782 TEST(r && param.iPen.iX == 19);
5785 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);
5786 param.iPosInText = 45 ;
5787 param.iPen.iX = param.iPen.iY = 0;
5789 r = aFont->GetCharacterPosition2(param,shapeInfo);
5791 TEST(r && param.iPosInText == 47
5792 && param.iOutputGlyphs == 1
5793 && param.iOutput[0].iCode == 0x80000c4a );
5795 #if defined __WINS__ || defined __WINSCW__
5796 TEST(r && param.iPen.iX == 17);
5799 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);
5800 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5802 INFO_PRINTF1(_L("Failed to record test result"));
5803 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4028"));
5807 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4028
5808 @SYMTestCaseDesc Automated GDI testing for Tamil
5809 @SYMTestPriority High
5810 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
5811 Matras /-u/ and /-uu/ join in ligature form with all other consonants than /ha/, /ja/, /sa/, /ssa/ and /k.ssa/.
5812 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5813 @SYMPREQ 1766: Tamil for Sphinx
5814 @SYMREQ 8742:Tamil Text Rendering
5816 testText[47] = 0x0B9C; //Ja
5817 testText[48] = 0x0BC1; //U
5819 testText[49] = 0x0B9C; //Ja
5820 testText[50] = 0x0BC2; //Uu
5822 param.iPosInText = 47 ;
5823 param.iPen.iX = param.iPen.iY = 0;
5825 r = aFont->GetCharacterPosition2(param,shapeInfo);
5827 TEST(r && param.iPosInText == 49
5828 && param.iOutputGlyphs == 2
5829 && param.iOutput[0].iCode == 0x80000bf9
5830 && param.iOutput[1].iCode == 0x80000c10);
5832 #if defined __WINS__ || defined __WINSCW__
5833 TEST(r && param.iPen.iX == 26);
5836 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);
5838 param.iPosInText = 49;
5839 param.iPen.iX = param.iPen.iY = 0;
5841 r = aFont->GetCharacterPosition2(param,shapeInfo);
5843 TEST(r && param.iPosInText == 51
5844 && param.iOutputGlyphs == 2
5845 && param.iOutput[0].iCode == 0x80000bf9
5846 && param.iOutput[1].iCode == 0x80000c11 );
5848 #if defined __WINS__ || defined __WINSCW__
5849 TEST(r && param.iPen.iX == 29);
5852 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);
5853 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5855 INFO_PRINTF1(_L("Failed to record test result"));
5856 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4029"));
5859 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4029
5860 @SYMTestCaseDesc Automated GDI testing for Tamil
5861 @SYMTestPriority High
5862 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement.
5863 Matra /-ai/ is combined to consonants in regular fashion. No extra shaping is required.
5864 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5865 @SYMPREQ 1766: Tamil for Sphinx
5866 @SYMREQ 8742:Tamil Text Rendering
5868 testText[51] = 0x0B95; //Ka
5869 testText[52] = 0x0BC8; //Ai
5871 param.iPosInText = 51;
5872 param.iPen.iX = param.iPen.iY = 0;
5874 r = aFont->GetCharacterPosition2(param,shapeInfo);
5876 TEST(r && param.iPosInText == 53
5877 && param.iOutputGlyphs == 2
5878 && param.iOutput[0].iCode == 0x80000c14
5879 && param.iOutput[1].iCode == 0x80000bf6);
5881 #if defined __WINS__ || defined __WINSCW__
5882 TEST(r && param.iPen.iX == 31);
5885 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);
5886 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5888 INFO_PRINTF1(_L("Failed to record test result"));
5889 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4030"));
5892 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4030
5893 @SYMTestCaseDesc Automated GDI testing for Tamil
5894 @SYMTestPriority High
5895 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test the requirement
5896 Consonant cluster <ka, virama, ssa> MUST always form conjunct consonant /k.ssa/, which behaves as if it were a proper consonant of its own
5897 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5898 @SYMPREQ 1766: Tamil for Sphinx
5899 @SYMREQ 8742:Tamil Text Rendering
5901 testText[53] = 0x0B95; //Ka
5902 testText[54] = 0x0BCD; //Virama
5903 testText[55] = 0x0BB7; //Ssa
5905 param.iPosInText = 53;
5906 param.iPen.iX = param.iPen.iY = 0;
5908 r = aFont->GetCharacterPosition2(param,shapeInfo);
5910 TEST(r && param.iPosInText == 56
5911 && param.iOutputGlyphs == 1
5912 && param.iOutput[0].iCode == 0x80000c2f );
5914 #if defined __WINS__ || defined __WINSCW__
5915 TEST(r && param.iPen.iX == 31);
5918 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);
5919 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5921 INFO_PRINTF1(_L("Failed to record test result"));
5922 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4031"));
5925 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4031
5926 @SYMTestCaseDesc Automated GDI testing for Tamil
5927 @SYMTestPriority High
5928 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5929 Character sequence <sa, virama, ra, matra_ii> MUST be rendered as a ligature form /s.rii/.
5930 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5931 @SYMPREQ 1766: Tamil for Sphinx
5932 @SYMREQ 8742:Tamil Text Rendering
5934 testText[56] = 0x0BB8; //Sa
5935 testText[57] = 0x0BCD; //Virama
5936 testText[58] = 0x0BB0; //Ra
5937 testText[59] = 0x0BC0; //Matra I
5939 param.iPosInText = 56;
5940 param.iPen.iX = param.iPen.iY = 0;
5942 r = aFont->GetCharacterPosition2(param,shapeInfo);
5944 TEST(r && param.iPosInText == 60
5945 && param.iOutputGlyphs == 1
5946 && param.iOutput[0].iCode == 0x80000c79 );
5948 #if defined __WINS__ || defined __WINSCW__
5949 TEST(r && param.iPen.iX == 27);
5952 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);
5953 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5955 INFO_PRINTF1(_L("Failed to record test result"));
5956 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4032"));
5959 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4032
5960 @SYMTestCaseDesc Automated GDI testing for Tamil
5961 @SYMTestPriority High
5962 @SYMTestActions Attempt to compose various valid Tamil glyph clusters to test
5963 Vertical position of the glyphs for combining characters virama, matras /-i/ and /-ii/ must be determined separately in relation to the relevant base glyph
5964 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
5965 @SYMPREQ 1766: Tamil for Sphinx
5966 @SYMREQ 8742:Tamil Text Rendering
5968 testText[60] = 0x0B95; //Ka
5969 testText[62] = 0x0BCD; //Virama
5970 testText[63] = 0x8205; //ZWJ
5972 param.iPosInText = 60;
5973 param.iPen.iX = param.iPen.iY = 0;
5975 r = aFont->GetCharacterPosition2(param,shapeInfo);
5977 TEST(r && param.iPosInText == 61
5978 && param.iOutputGlyphs == 1
5979 && param.iOutput[0].iCode == 0x80000bf6 );
5981 #if defined __WINS__ || defined __WINSCW__
5982 TEST(r && param.iPen.iX == 13);
5985 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);
5986 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
5988 INFO_PRINTF1(_L("Failed to record test result"));
5992 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-3479
5993 @SYMTestCaseDesc Automated GDI testing for correct localised punctuation after indic characters
5994 @SYMTestPriority High
5995 @SYMTestActions Attempt to compose various valid Indic strings with western punctuation
5996 @SYMTestExpectedResults The expected punctuation glyphs for the implied locale should be returned
5999 void CTGlyphSelection::TestGlyphs(CFont* aFont, CFont::TPositionParam& aParam,
6000 const TPtrC16& aText, const TPtrC16& aExpectedGlyphs)
6002 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3479"));
6003 TUint16* glyphs = CONST_CAST(TUint16*,aExpectedGlyphs.Ptr());
6004 const TInt mask = 0x80000000-1;
6006 RShapeInfo shapeInfo;
6007 aParam.iText.Set(aText);
6008 aParam.iPosInText = aParam.iPen.iX = aParam.iPen.iY = 0;
6009 while(aParam.iPosInText < aParam.iText.Length())
6011 r = aFont->GetCharacterPosition2(aParam,shapeInfo);
6012 //INFO_PRINTF3(_L("Glyph %d Icode 0x%x"),*glyphs,aParam.iOutput[0].iCode);
6013 TEST(r && ((aParam.iOutput[0].iCode & mask) == *glyphs++));
6016 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6018 INFO_PRINTF1(_L("Failed to record test result"));
6020 void CTGlyphSelection::TestTeluguChars(CFbsFont* aFont)
6022 INFO_PRINTF1(_L("Test Telugu Glyphs"));
6025 TBuf<162> testText(0);
6026 CFont::TPositionParam param;
6027 param.iDirection = CFont::EHorizontal;
6028 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
6030 testText.SetLength(162);
6031 // Make sure there is no garbage values in the memory we are using.
6032 for (TInt i = 0; i < testText.Length(); i++)
6035 param.iText.Set(testText);
6036 RShapeInfo shapeInfo;
6038 //Testdata for Telugu Langauage
6039 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4033"));
6041 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4033
6042 @SYMTestCaseDesc Automated GDI testing for Telugu
6043 @SYMTestPriority High
6044 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6045 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.
6046 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6047 @SYMPREQ 1766: Tamil for Sphinx
6048 @SYMREQ 8743:Tamil Text Rendering
6052 testText[0] = 0x0C15;
6053 testText[1] = 0x0C4D;
6054 param.iPosInText = 0 ;
6055 param.iPen.iX = param.iPen.iY = 0;
6056 r = aFont->GetCharacterPosition2(param,shapeInfo);
6058 TEST(r && param.iPosInText == 2
6059 && param.iOutputGlyphs == 1
6060 && param.iOutput[0].iCode == 0x80000f49 );
6062 #if defined __WINS__ || defined __WINSCW__
6063 TEST(r && param.iPen.iX == 9);
6066 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);
6067 TRAPD(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6069 INFO_PRINTF1(_L("Failed to record test result"));
6070 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4034"));
6072 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4034
6073 @SYMTestCaseDesc Automated GDI testing for Telugu
6074 @SYMTestPriority High
6075 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6076 ?VIRAMA attaches the upward stroke at the right of the glyph.
6077 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6078 @SYMPREQ 1766: Tamil for Sphinx
6079 @SYMREQ 8743:Tamil Text Rendering
6081 testText[2] = 0x0C16;
6082 testText[3] = 0x0C4D;
6084 param.iPosInText = 2 ;
6086 param.iPen.iX = param.iPen.iY = 0;
6088 r = aFont->GetCharacterPosition2(param,shapeInfo);
6091 TEST(r && param.iPosInText == 4
6092 && param.iOutputGlyphs == 1
6093 && param.iOutput[0].iCode == 0x80000f4a);
6095 #if defined __WINS__ || defined __WINSCW__
6096 TEST(r && param.iPen.iX == 13);
6099 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);
6100 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6102 INFO_PRINTF1(_L("Failed to record test result"));
6103 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4035"));
6105 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4035
6106 @SYMTestCaseDesc Automated GDI testing for Telugu
6107 @SYMTestPriority High
6108 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6109 ?VIRAMA is attached to a stroke at the upper right corner.
6110 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6111 @SYMPREQ 1766: Tamil for Sphinx
6112 @SYMREQ 8743:Tamil Text Rendering
6115 testText[4] = 0x0C23;
6116 testText[5] = 0x0C4D;
6118 param.iPosInText = 4 ;
6119 param.iPen.iX = param.iPen.iY = 0;
6120 r = aFont->GetCharacterPosition2(param,shapeInfo);
6122 TEST(r && param.iPosInText == 6
6123 && param.iOutputGlyphs == 1
6124 && param.iOutput[0].iCode == 0x80000f57 );
6126 #if defined __WINS__ || defined __WINSCW__
6127 TEST(r && param.iPen.iX == 13);
6130 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);
6131 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6133 INFO_PRINTF1(_L("Failed to record test result"));
6134 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4036"));
6136 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4036
6137 @SYMTestCaseDesc Automated GDI testing for Telugu
6138 @SYMTestPriority High
6139 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6140 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.
6141 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6142 @SYMPREQ 1766: Tamil for Sphinx
6143 @SYMREQ 8743:Tamil Text Rendering
6146 testText[6] = 0x0C2E;
6147 testText[7] = 0x0C43;
6149 param.iPosInText = 6 ;
6150 param.iPen.iX = param.iPen.iY = 0;
6151 r = aFont->GetCharacterPosition2(param,shapeInfo);
6153 TEST(r && param.iPosInText == 8
6154 && param.iOutputGlyphs == 2
6155 && param.iOutput[0].iCode == 0x80000f21
6156 && param.iOutput[1].iCode == 0x80000f31 );
6158 #if defined __WINS__ || defined __WINSCW__
6159 TEST(r && param.iPen.iX == 24);
6162 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);
6163 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6165 INFO_PRINTF1(_L("Failed to record test result"));
6166 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4037"));
6168 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4037
6169 @SYMTestCaseDesc Automated GDI testing for Telugu
6170 @SYMTestPriority High
6171 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6172 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.
6173 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6174 @SYMPREQ 1766: Tamil for Sphinx
6175 @SYMREQ 8743:Tamil Text Rendering
6177 testText[8] = 0x0C32;
6179 testText[9] = 0x0C44;
6181 param.iPosInText = 8 ;
6182 param.iPen.iX = param.iPen.iY = 0;
6184 r = aFont->GetCharacterPosition2(param,shapeInfo);
6186 TEST(r && param.iPosInText == 10
6187 && param.iOutputGlyphs == 2
6188 && param.iOutput[0].iCode == 0x80000f25
6189 && param.iOutput[1].iCode == 0x80000f32);
6191 #if defined __WINS__ || defined __WINSCW__
6192 TEST(r && param.iPen.iX == 22);
6195 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);
6196 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6198 INFO_PRINTF1(_L("Failed to record test result"));
6199 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4038"));
6201 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4038
6202 @SYMTestCaseDesc Automated GDI testing for Telugu
6203 @SYMTestPriority High
6204 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6205 ?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.
6206 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6207 @SYMPREQ 1766: Tamil for Sphinx
6208 @SYMREQ 8743:Tamil Text Rendering
6211 testText[10] = 0x0C15;
6212 testText[11] = 0x0C3E;
6214 param.iPosInText = 10 ;
6215 param.iPen.iX = param.iPen.iY = 0;
6216 r = aFont->GetCharacterPosition2(param,shapeInfo);
6218 TEST(r && param.iPosInText == 12
6219 && param.iOutputGlyphs == 1
6220 && param.iOutput[0].iCode == 0x80000f6d );
6222 #if defined __WINS__ || defined __WINSCW__
6223 TEST(r && param.iPen.iX == 13);
6226 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);
6227 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6229 INFO_PRINTF1(_L("Failed to record test result"));
6230 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4039"));
6232 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4039
6233 @SYMTestCaseDesc Automated GDI testing for Telugu
6234 @SYMTestPriority High
6235 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6236 ?MATRA AA attaches to the upwards left curving stroke
6237 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6238 @SYMPREQ 1766: Tamil for Sphinx
6239 @SYMREQ 8743:Tamil Text Rendering
6241 testText[12] = 0x0C1F;
6242 testText[13] = 0x0C3E;
6243 param.iPosInText = 12 ;
6244 param.iPen.iX = param.iPen.iY = 0;
6245 r = aFont->GetCharacterPosition2(param,shapeInfo);
6247 TEST(r && param.iPosInText == 14
6248 && param.iOutputGlyphs == 1
6249 && param.iOutput[0].iCode == 0x80000f77 );
6251 #if defined __WINS__ || defined __WINSCW__
6252 TEST(r && param.iPen.iX == 16);
6255 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);
6256 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6258 INFO_PRINTF1(_L("Failed to record test result"));
6259 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4040"));
6261 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4040
6262 @SYMTestCaseDesc Automated GDI testing for Telugu
6263 @SYMTestPriority High
6264 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6265 ?MATRA AA attaches the upwards (left curving) stroke at the top of the glyph
6266 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6267 @SYMPREQ 1766: Tamil for Sphinx
6268 @SYMREQ 8743:Tamil Text Rendering
6270 testText[14] = 0x0C1C;
6271 testText[15] = 0x0C3E;
6273 param.iPosInText = 14 ;
6274 param.iPen.iX = param.iPen.iY = 0;
6275 r = aFont->GetCharacterPosition2(param,shapeInfo);
6277 TEST(r && param.iPosInText == 16
6278 && param.iOutputGlyphs == 1
6279 && param.iOutput[0].iCode == 0x80000f74 );
6281 #if defined __WINS__ || defined __WINSCW__
6282 TEST(r && param.iPen.iX == 15);
6285 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);
6286 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6288 INFO_PRINTF1(_L("Failed to record test result"));
6289 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4041"));
6291 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4041
6292 @SYMTestCaseDesc Automated GDI testing for Telugu
6293 @SYMTestPriority High
6294 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6295 ?MATRA AA is drawn on top of the glyph
6296 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6297 @SYMPREQ 1766: Tamil for Sphinx
6298 @SYMREQ 8743:Tamil Text Rendering
6300 testText[16] = 0x0C23;
6301 testText[17] = 0x0C3E;
6303 param.iPosInText = 16 ;
6304 param.iPen.iX = param.iPen.iY = 0;
6305 r = aFont->GetCharacterPosition2(param,shapeInfo);
6307 TEST(r && param.iPosInText == 18
6308 && param.iOutputGlyphs == 1
6309 && param.iOutput[0].iCode == 0x80000f7b );
6311 #if defined __WINS__ || defined __WINSCW__
6312 TEST(r && param.iPen.iX == 16);
6315 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);
6316 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6318 INFO_PRINTF1(_L("Failed to record test result"));
6319 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4042"));
6321 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4042
6322 @SYMTestCaseDesc Automated GDI testing for Telugu
6323 @SYMTestPriority High
6324 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6325 ?MATRA AA attaches to the upwards left curving stroke, the vowel stem remains intact
6326 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6327 @SYMPREQ 1766: Tamil for Sphinx
6328 @SYMREQ 8743:Tamil Text Rendering
6330 testText[18] = 0x0C2B;
6331 testText[19] = 0x0C3E;
6333 param.iPosInText = 18 ;
6334 param.iPen.iX = param.iPen.iY = 0;
6336 r = aFont->GetCharacterPosition2(param,shapeInfo);
6338 TEST(r && param.iPosInText == 20
6339 && param.iOutputGlyphs == 1
6340 && param.iOutput[0].iCode == 0x80000f82 );
6342 #if defined __WINS__ || defined __WINSCW__
6343 TEST(r && param.iPen.iX == 16);
6346 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);
6347 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6349 INFO_PRINTF1(_L("Failed to record test result"));
6350 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4043"));
6352 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4043
6353 @SYMTestCaseDesc Automated GDI testing for Telugu
6354 @SYMTestPriority High
6355 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6356 ?MATRA AA replaces the vowel stem, the upwards left curving stroke is extended
6357 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6358 @SYMPREQ 1766: Tamil for Sphinx
6359 @SYMREQ 8743:Tamil Text Rendering
6361 testText[20] = 0x0C2A;
6362 testText[21] = 0x0C3E;
6364 param.iPosInText = 20 ;
6365 param.iPen.iX = param.iPen.iY = 0;
6367 r = aFont->GetCharacterPosition2(param,shapeInfo);
6369 TEST(r && param.iPosInText == 22
6370 && param.iOutputGlyphs == 1
6371 && param.iOutput[0].iCode == 0x80000f81);
6373 #if defined __WINS__ || defined __WINSCW__
6374 TEST(r && param.iPen.iX == 16);
6377 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);
6378 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6380 INFO_PRINTF1(_L("Failed to record test result"));
6381 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4044"));
6384 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4044
6385 @SYMTestCaseDesc Automated GDI testing for Telugu
6386 @SYMTestPriority High
6387 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6388 ?Vowel sign replaces the vowel stem
6389 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6390 @SYMPREQ 1766: Tamil for Sphinx
6391 @SYMREQ 8743:Tamil Text Rendering
6393 testText[22] = 0x0C26;
6394 testText[23] = 0x0C3F;
6396 param.iPosInText = 22 ;
6397 param.iPen.iX = param.iPen.iY = 0;
6399 r = aFont->GetCharacterPosition2(param,shapeInfo);
6401 TEST(r && param.iPosInText == 24
6402 && param.iOutputGlyphs == 1
6403 && param.iOutput[0].iCode == 0x80000fa2 );
6405 #if defined __WINS__ || defined __WINSCW__
6406 TEST(r && param.iPen.iX == 11);
6409 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);
6410 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6412 INFO_PRINTF1(_L("Failed to record test result"));
6413 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4045"));
6415 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4045
6416 @SYMTestCaseDesc Automated GDI testing for Telugu
6417 @SYMTestPriority High
6418 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6419 ?The upwards left curving stroke extends, vowel sign attaches to the extended stroke
6420 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6421 @SYMPREQ 1766: Tamil for Sphinx
6422 @SYMREQ 8743:Tamil Text Rendering
6424 testText[24] = 0x0C16;
6425 testText[25] = 0x0C3F;
6427 param.iPosInText = 24 ;
6428 param.iPen.iX = param.iPen.iY = 0;
6430 r = aFont->GetCharacterPosition2(param,shapeInfo);
6432 TEST(r && param.iPosInText == 26
6433 && param.iOutputGlyphs == 1
6434 && param.iOutput[0].iCode == 0x80000f92);
6436 #if defined __WINS__ || defined __WINSCW__
6437 TEST(r && param.iPen.iX == 12);
6440 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);
6441 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6443 INFO_PRINTF1(_L("Failed to record test result"));
6444 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4046"));
6446 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4046
6447 @SYMTestCaseDesc Automated GDI testing for Telugu
6448 @SYMTestPriority High
6449 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6450 ?Vowel sign attaches the upward stroke at the top of the glyph
6451 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6452 @SYMPREQ 1766: Tamil for Sphinx
6453 @SYMREQ 8743:Tamil Text Rendering
6455 testText[26] = 0x0C1C;
6456 testText[27] = 0x0C3F;
6458 param.iPosInText = 26 ;
6459 param.iPen.iX = param.iPen.iY = 0;
6461 r = aFont->GetCharacterPosition2(param,shapeInfo);
6463 TEST(r && param.iPosInText == 28
6464 && param.iOutputGlyphs == 1
6465 && param.iOutput[0].iCode == 0x80000f98 );
6467 #if defined __WINS__ || defined __WINSCW__
6468 TEST(r && param.iPen.iX == 12);
6471 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);
6472 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6474 INFO_PRINTF1(_L("Failed to record test result"));
6475 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4047"));
6477 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4047
6478 @SYMTestCaseDesc Automated GDI testing for Telugu
6479 @SYMTestPriority High
6480 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6481 ?Vowel sign attaches the upward stroke at the top of the glyph
6482 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6483 @SYMPREQ 1766: Tamil for Sphinx
6484 @SYMREQ 8743:Tamil Text Rendering
6486 testText[28] = 0x0C1E;
6487 testText[29] = 0x0C40;
6489 param.iPosInText = 28 ;
6490 param.iPen.iX = param.iPen.iY = 0;
6492 r = aFont->GetCharacterPosition2(param,shapeInfo);
6494 TEST(r && param.iPosInText == 30
6495 && param.iOutputGlyphs == 1
6496 && param.iOutput[0].iCode == 0x80000fbe );
6498 #if defined __WINS__ || defined __WINSCW__
6499 TEST(r && param.iPen.iX == 14);
6502 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);
6503 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6505 INFO_PRINTF1(_L("Failed to record test result"));
6506 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4048"));
6508 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4048
6509 @SYMTestCaseDesc Automated GDI testing for Telugu
6510 @SYMTestPriority High
6511 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6512 ?Vowel sign attaches to the right upper corner of the glyph
6513 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6514 @SYMPREQ 1766: Tamil for Sphinx
6515 @SYMREQ 8743:Tamil Text Rendering
6517 testText[30] = 0x0C1F;
6518 testText[31] = 0x0C3F;
6520 param.iPosInText = 30;
6521 param.iPen.iX = param.iPen.iY = 0;
6523 r = aFont->GetCharacterPosition2(param,shapeInfo);
6525 TEST(r && param.iPosInText == 32
6526 && param.iOutputGlyphs == 1
6527 && param.iOutput[0].iCode == 0x80000f9b );
6529 #if defined __WINS__ || defined __WINSCW__
6530 TEST(r && param.iPen.iX == 12);
6533 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);
6534 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6536 INFO_PRINTF1(_L("Failed to record test result"));
6537 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4049"));
6539 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4049
6540 @SYMTestCaseDesc Automated GDI testing for Telugu
6541 @SYMTestPriority High
6542 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6543 ?Vowel sign takes a loop form that replaces the vowel stem
6544 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6545 @SYMPREQ 1766: Tamil for Sphinx
6546 @SYMREQ 8743:Tamil Text Rendering
6548 testText[32] = 0x0C1D;
6549 testText[33] = 0x0C3F;
6551 param.iPosInText = 32 ;
6552 param.iPen.iX = param.iPen.iY = 0;
6554 r = aFont->GetCharacterPosition2(param,shapeInfo);
6556 TEST(r && param.iPosInText == 34
6557 && param.iOutputGlyphs == 1
6558 && param.iOutput[0].iCode == 0x80000f99 );
6560 #if defined __WINS__ || defined __WINSCW__
6561 TEST(r && param.iPen.iX == 19);
6564 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);
6565 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6567 INFO_PRINTF1(_L("Failed to record test result"));
6568 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4050"));
6570 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4050
6571 @SYMTestCaseDesc Automated GDI testing for Telugu
6572 @SYMTestPriority High
6573 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6574 ?The upwards left curving stroke extends, vowel sign replaces the vowel stem at the tip of the extended stroke
6575 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6576 @SYMPREQ 1766: Tamil for Sphinx
6577 @SYMREQ 8743:Tamil Text Rendering
6579 testText[34] = 0x0C1B;
6580 testText[35] = 0x0C3F;
6582 param.iPosInText =34 ;
6583 param.iPen.iX = param.iPen.iY = 0;
6585 r = aFont->GetCharacterPosition2(param,shapeInfo);
6587 TEST(r && param.iPosInText == 36
6588 && param.iOutputGlyphs == 1
6589 && param.iOutput[0].iCode == 0x80000f97 );
6591 #if defined __WINS__ || defined __WINSCW__
6592 TEST(r && param.iPen.iX == 12);
6595 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);
6596 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6598 INFO_PRINTF1(_L("Failed to record test result"));
6599 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4051"));
6601 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4051
6602 @SYMTestCaseDesc Automated GDI testing for Telugu
6603 @SYMTestPriority High
6604 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6605 ?Vowel sign replaces the upwards curving stroke at the top of the glyph
6606 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6607 @SYMPREQ 1766: Tamil for Sphinx
6608 @SYMREQ 8743:Tamil Text Rendering
6610 testText[36] = 0x0C1C;
6611 testText[37] = 0x0C3F;
6613 param.iPosInText = 36 ;
6614 param.iPen.iX = param.iPen.iY = 0;
6616 r = aFont->GetCharacterPosition2(param,shapeInfo);
6618 TEST(r && param.iPosInText == 38
6619 && param.iOutputGlyphs == 1
6620 && param.iOutput[0].iCode == 0x80000f98 );
6622 #if defined __WINS__ || defined __WINSCW__
6623 TEST(r && param.iPen.iX == 12);
6626 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);
6627 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6629 INFO_PRINTF1(_L("Failed to record test result"));
6630 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4052"));
6632 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4052
6633 @SYMTestCaseDesc Automated GDI testing for Telugu
6634 @SYMTestPriority High
6635 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6636 ?Vowel stem is removed.
6637 ?Vowel stem is removed and MATRA II takes a form that looks like MATRA AA
6638 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6639 @SYMPREQ 1766: Tamil for Sphinx
6640 @SYMREQ 8743:Tamil Text Rendering
6642 testText[38] = 0x0C2F;
6643 testText[39] = 0x0C3F;
6645 param.iPosInText = 38 ;
6646 param.iPen.iX = param.iPen.iY = 0;
6648 r = aFont->GetCharacterPosition2(param,shapeInfo);
6650 TEST(r && param.iPosInText == 40
6651 && param.iOutputGlyphs == 1
6652 && param.iOutput[0].iCode == 0x80000faa );
6654 #if defined __WINS__ || defined __WINSCW__
6655 TEST(r && param.iPen.iX == 19);
6658 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);
6659 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6661 INFO_PRINTF1(_L("Failed to record test result"));
6662 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4053"));
6664 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4053
6665 @SYMTestCaseDesc Automated GDI testing for Telugu
6666 @SYMTestPriority High
6667 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6668 ?Vowel sign attaches to the right of the consonant glyph, vowel stem remains intact
6669 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6670 @SYMPREQ 1766: Tamil for Sphinx
6671 @SYMREQ 8743:Tamil Text Rendering
6673 testText[40] = 0x0C15;
6674 testText[41] = 0x0C41;
6676 param.iPosInText = 40 ;
6677 param.iPen.iX = param.iPen.iY = 0;
6678 r = aFont->GetCharacterPosition2(param,shapeInfo);
6680 TEST(r && param.iPosInText ==42
6681 && param.iOutputGlyphs == 1
6682 && param.iOutput[0].iCode == 0x80000fd9 );
6684 #if defined __WINS__ || defined __WINSCW__
6685 TEST(r && param.iPen.iX == 14);
6688 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);
6689 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6691 INFO_PRINTF1(_L("Failed to record test result"));
6692 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4054"));
6694 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4054
6695 @SYMTestCaseDesc Automated GDI testing for Telugu
6696 @SYMTestPriority High
6697 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6698 ?Vowel sign takes a miniature form which attaches to the stroke at the top of the consonant glyph
6699 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6700 @SYMPREQ 1766: Tamil for Sphinx
6701 @SYMREQ 8743:Tamil Text Rendering
6703 testText[42] = 0x0C19;
6704 testText[43] = 0x0C41;
6706 param.iPosInText = 42 ;
6707 param.iPen.iX = param.iPen.iY = 0;
6709 r = aFont->GetCharacterPosition2(param,shapeInfo);
6711 TEST(r && param.iPosInText == 44
6712 && param.iOutputGlyphs == 1
6713 && param.iOutput[0].iCode == 0x80000fda );
6715 #if defined __WINS__ || defined __WINSCW__
6716 TEST(r && param.iPen.iX == 15);
6719 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);
6720 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6722 INFO_PRINTF1(_L("Failed to record test result"));
6723 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4055"));
6725 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4055
6726 @SYMTestCaseDesc Automated GDI testing for Telugu
6727 @SYMTestPriority High
6728 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6729 ?Vowel sign attaches the consonant sign from below. Vowel stem remains intact.
6730 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6731 @SYMPREQ 1766: Tamil for Sphinx
6732 @SYMREQ 8743:Tamil Text Rendering
6734 testText[44] = 0x0C2E;
6735 testText[45] = 0x0C41;
6737 param.iPosInText = 44 ;
6738 param.iPen.iX = param.iPen.iY = 0;
6739 r = aFont->GetCharacterPosition2(param,shapeInfo);
6741 TEST(r && param.iPosInText == 46
6742 && param.iOutputGlyphs == 2
6743 && param.iOutput[0].iCode == 0x80000f21 );
6745 #if defined __WINS__ || defined __WINSCW__
6746 TEST(r && param.iPen.iX == 21);
6749 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);
6751 testText[46] = 0x0C36;
6752 testText[47] = 0x0C41;
6754 param.iPosInText = 46 ;
6755 param.iPen.iX = param.iPen.iY = 0;
6756 r = aFont->GetCharacterPosition2(param,shapeInfo);
6758 TEST(r && param.iPosInText == 48
6759 && param.iOutputGlyphs == 2
6760 && param.iOutput[0].iCode == 0x80000f28 );
6762 #if defined __WINS__ || defined __WINSCW__
6763 TEST(r && param.iPen.iX == 14);
6766 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);
6767 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6769 INFO_PRINTF1(_L("Failed to record test result"));
6770 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4056"));
6772 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4056
6773 @SYMTestCaseDesc Automated GDI testing for Telugu
6774 @SYMTestPriority High
6775 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6776 ?Vowel sign replaces the vowel stem
6777 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6778 @SYMPREQ 1766: Tamil for Sphinx
6779 @SYMREQ 8743:Tamil Text Rendering
6782 testText[48] = 0x0C28;
6783 testText[49] = 0x0C46;
6785 param.iPosInText = 48 ;
6786 param.iPen.iX = param.iPen.iY = 0;
6787 r = aFont->GetCharacterPosition2(param,shapeInfo);
6789 TEST(r && param.iPosInText == 50
6790 && param.iOutputGlyphs == 1
6791 && param.iOutput[0].iCode == 0x80001000 );
6793 #if defined __WINS__ || defined __WINSCW__
6794 TEST(r && param.iPen.iX == 11);
6797 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);
6798 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6800 INFO_PRINTF1(_L("Failed to record test result"));
6801 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4057"));
6803 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4057
6804 @SYMTestCaseDesc Automated GDI testing for Telugu
6805 @SYMTestPriority High
6806 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6807 ?Vowel sign replaces the vowel stem
6808 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6809 @SYMPREQ 1766: Tamil for Sphinx
6810 @SYMREQ 8743:Tamil Text Rendering
6812 testText[50] = 0x0C1B;
6813 testText[51] = 0x0C47;
6815 param.iPosInText = 50 ;
6816 param.iPen.iX = param.iPen.iY = 0;
6817 r = aFont->GetCharacterPosition2(param,shapeInfo);
6819 TEST(r && param.iPosInText == 52
6820 && param.iOutputGlyphs == 1
6821 && param.iOutput[0].iCode == 0x80001017 );
6823 #if defined __WINS__ || defined __WINSCW__
6824 TEST(r && param.iPen.iX == 12);
6827 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);
6828 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6830 INFO_PRINTF1(_L("Failed to record test result"));
6831 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4058"));
6833 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4058
6834 @SYMTestCaseDesc Automated GDI testing for Telugu
6835 @SYMTestPriority High
6836 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6837 ?Vowel sign replaces the vowel stem
6838 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6839 @SYMPREQ 1766: Tamil for Sphinx
6840 @SYMREQ 8743:Tamil Text Rendering
6842 testText[52] = 0x0C1D;
6843 testText[53] = 0x0C48;
6845 param.iPosInText = 52 ;
6846 param.iPen.iX = param.iPen.iY = 0;
6847 r = aFont->GetCharacterPosition2(param,shapeInfo);
6849 TEST(r && param.iPosInText == 54
6850 && param.iOutputGlyphs == 2
6851 && param.iOutput[0].iCode == 0x80000ff5
6852 && param.iOutput[1].iCode == 0x80000f3b );
6854 #if defined __WINS__ || defined __WINSCW__
6855 TEST(r && param.iPen.iX == 19);
6858 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);
6859 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6861 INFO_PRINTF1(_L("Failed to record test result"));
6862 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4059"));
6864 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4059
6865 @SYMTestCaseDesc Automated GDI testing for Telugu
6866 @SYMTestPriority High
6867 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6868 ?Vowel sign replaces the vowel stem.
6869 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6870 @SYMPREQ 1766: Tamil for Sphinx
6871 @SYMREQ 8743:Tamil Text Rendering
6874 testText[54] = 0x0C15;
6875 testText[55] = 0x0C4A;
6877 param.iPosInText = 54 ;
6878 param.iPen.iX = param.iPen.iY = 0;
6880 r = aFont->GetCharacterPosition2(param,shapeInfo);
6882 TEST(r && param.iPosInText == 56
6883 && param.iOutputGlyphs == 1
6884 && param.iOutput[0].iCode == 0x80001059 );
6886 #if defined __WINS__ || defined __WINSCW__
6887 TEST(r && param.iPen.iX == 13);
6890 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);
6891 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6893 INFO_PRINTF1(_L("Failed to record test result"));
6894 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4060"));
6896 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4060
6897 @SYMTestCaseDesc Automated GDI testing for Telugu
6898 @SYMTestPriority High
6899 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6900 ?Vowel sign replaces the vowel stem.
6901 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6902 @SYMPREQ 1766: Tamil for Sphinx
6903 @SYMREQ 8743:Tamil Text Rendering
6906 testText[56] = 0x0C21;
6907 testText[57] = 0x0C4B;
6909 param.iPosInText = 56 ;
6910 param.iPen.iX = param.iPen.iY = 0;
6912 r = aFont->GetCharacterPosition2(param,shapeInfo);
6914 TEST(r && param.iPosInText == 58
6915 && param.iOutputGlyphs == 1
6916 && param.iOutput[0].iCode == 0x80001089 );
6918 #if defined __WINS__ || defined __WINSCW__
6919 TEST(r && param.iPen.iX == 14);
6922 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);
6923 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
6925 INFO_PRINTF1(_L("Failed to record test result"));
6926 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-4061"));
6928 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-4061
6929 @SYMTestCaseDesc Automated GDI testing for Telugu
6930 @SYMTestPriority High
6931 @SYMTestActions Attempt to compose various valid Telugu glyph clusters to test
6932 ?Vowel sign replaces the vowel stem.
6933 @@SYMTestExpectedResults The expected glyph clusters for given Unicode characters must be returned
6934 @SYMPREQ 1766: Tamil for Sphinx
6935 @SYMREQ 8743:Tamil Text Rendering
6937 testText[58] = 0x0C26;
6938 testText[59] = 0x0C4C;
6940 param.iPosInText = 58 ;
6941 param.iPen.iX = param.iPen.iY = 0;
6943 r = aFont->GetCharacterPosition2(param,shapeInfo);
6945 TEST(r && param.iPosInText == 60
6946 && param.iOutputGlyphs == 1
6947 && param.iOutput[0].iCode == 0x800010b2 );
6949 #if defined __WINS__ || defined __WINSCW__
6950 TEST(r && param.iPen.iX == 14);
6953 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);
6956 void CTGlyphSelection::TestIndicPunctuation(CFbsFont* aFont)
6958 INFO_PRINTF1(_L("Test Indic Punctuation"));
6960 CFont::TPositionParam param;
6961 param.iDirection = CFont::EHorizontal;
6962 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
6964 //INFO_PRINTF1(_L("// punctuation string after Kannada text"));
6965 TestGlyphs(aFont,param,_L("\xC95!?#@"),_L("\x7A8\x920\x93C\x922\x23"));
6966 //INFO_PRINTF1(_L("// punctuation string before Kannada text"));
6967 TestGlyphs(aFont,param,_L("!?#@\xC95"),_L("\x21\x3F\x23\x40\x7A8"));
6968 //INFO_PRINTF1(_L("// punctuation string before and after Kannada text"));
6969 TestGlyphs(aFont,param,_L(" \"\xC95\" "),_L("\x20\x20\x22\x7A8\x22\x20\x20"));
6970 //INFO_PRINTF1(_L("// punctuation before and after latin text followed by punctuation before and after kannada text"));
6971 TestGlyphs(aFont,param,_L("\x201c\x041\x201D (\xc95)"),_L("\x201c\x41\x201d\x20\x28\x7a8\x29"));
6972 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween"));
6973 TestGlyphs(aFont,param,_L("\xc95 , \x041"),_L("\x7a8\x20\x929\x20\x41"));
6974 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation surrounded by whitespace inbetween (reversed)"));
6975 TestGlyphs(aFont,param,_L("\x041 , \xc95"),_L("\x41\x20\x2C\x20\x7a8"));
6976 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin"));
6977 TestGlyphs(aFont,param,_L("\x041, \xc95"),_L("\x41\x2C\x20\x7a8"));
6978 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada"));
6979 TestGlyphs(aFont,param,_L("\x041 ,\xc95"),_L("\x41\x20\x2C\x7a8"));
6980 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to latin and seperating tab"));
6981 TestGlyphs(aFont,param,_L("\x041,\t\xc95"),_L("\x41\x2C\x9\x7a8"));
6982 //INFO_PRINTF1(_L("// mixed kannada/ latin with punctuation next to kannada and seperating tab"));
6983 TestGlyphs(aFont,param,_L("\x041\t,\xc95"),_L("\x41\x9\x2C\x7a8"));
6984 //INFO_PRINTF1(_L("// devanagari digits with colons"));
6985 TestGlyphs(aFont,param,_L("\x966\x03a\x967\x03a\x968\x03a\x969\x03a\x96a\x03a\x96b\x03a\x96c\x03a\x96d\x03a\x96e\x03a\x96f\x03a"),
6986 _L("\x582\x77e\x583\x77e\x584\x77e\x585\x77e\x586\x77e\x587\x77e\x588\x77e\x589\x77e\x58a\x77e\x58b\x77e"));
6987 //INFO_PRINTF1(_L("// string of only punctuation"));
6988 TestGlyphs(aFont,param,_L("\x002D\x002D\x002D\x002D\x002D\x002D"),_L("\x002D\x002D\x002D\x002D\x002D\x002D"));
6989 //INFO_PRINTF1(_L("// one Kannada character followed my multiple punctuation and non-punctuaion"));
6990 TestGlyphs(aFont,param,_L("\x0C95!\x0022\x00A3$%^&*()-={}[]:@~;'#<>?,./"),
6991 _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"));
6996 void CTGlyphSelection::TestIndicCharsL()
6998 // create a font store for testing
6999 CFontStore* fontStore = CFontStore::NewL(&User::Heap());
7001 //load all ecom implemented rasterizer dlls. installs the rasterizer.
7002 LoadOpenFontLibraries(fontStore);
7003 // test font preparation
7004 fontStore->iKPixelWidthInTwips = 11860; //This value is default
7006 //add any required font files
7007 TUid err = fontStore->AddFileL(KTestHindiFontFile);
7009 TFontSpec testHindiFontSpec(KTestHindiFontFaceName,200);
7011 TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
7013 TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
7015 CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
7017 TInt ret = bmp->Create(TSize(100,100),EGray2);
7018 if (ret == KErrNotSupported)
7021 User::LeaveIfError(ret);
7023 CFbsBitmapDevice* device = NULL;
7024 TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
7025 TEST(err2 == KErrNone);
7027 CFbsBitGc* gc = NULL;
7028 User::LeaveIfError(device->CreateContext(gc));
7029 // Font file Creation
7030 CFbsFont* hindiFont = NULL;
7031 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(hindiFont,testHindiFontSpec));
7032 gc->UseFont(hindiFont);
7033 CleanupStack::PushL(hindiFont);
7035 //Testcode for Hindi language
7036 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7037 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-1580"));
7038 TestHindiChars(hindiFont);
7039 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7041 CleanupStack::Pop(hindiFont);
7043 // Font file Creation
7044 CFbsFont* indicFont = NULL;
7045 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
7046 gc->UseFont(indicFont);
7047 CleanupStack::PushL(indicFont);
7049 //Testcode for Kannada, Marathi,Gujarati,Bengali language
7050 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3381"));
7051 TestKannadaChars(indicFont);
7052 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7053 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3360"));
7054 TestMarathiChars(indicFont);
7055 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7056 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-3417"));
7057 TestGujaratiChars(indicFont);
7058 TestBengaliChars(indicFont);
7059 TestTamilChars(indicFont);
7060 TestTeluguChars(indicFont);
7061 TestIndicPunctuation(indicFont);
7062 CleanupStack::Pop(indicFont);
7064 //Cleaning the memory
7068 fontStore->RemoveFile(err);
7069 fontStore->RemoveFile(err1);
7071 REComSession::FinalClose();
7076 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CT-0221
7077 @SYMTestCaseDesc Test support for Vietnamese characters.
7078 @SYMTestPriority High
7079 @SYMTestActions Attempt to compose various valid and invalid Vietnamese glyph clusters.
7080 @SYMTestExpectedResults The test must not fail.
7081 @SYMPREQ 402: GDI for Bravo.
7083 void CTGlyphSelection::TestVietnameseChars()
7086 This method is a test case to test GetCharacterPosition() correctly
7087 processes Vietnamese characters.
7090 TBuf<41> testText(0);
7091 CFont::TPositionParam param;
7092 param.iDirection = CFont::EHorizontal;
7093 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7095 testText.SetLength(41);
7097 testText[0] = 0x0055; // capital U
7098 testText[1] = 0x031B; // combining horn - expect 0x01AF (succeed)
7100 testText[2] = 0x0055; // capital U
7101 testText[3] = 0x0027; // apostrophe - expect 0x0055 (fail)
7103 testText[4] = 0x0055; // capital U
7104 testText[5] = 0x02B9; // modifier prime - expect 0x0055 (fail)
7106 testText[6] = 0x0055; // capital U
7107 testText[7] = 0x02BC; // modifier apostrophe - expect 0x0055 (fail)
7109 testText[8] = 0x0055; // capital U
7110 testText[9] = 0x0315; // combining comma above right - expect 0x0055, 0x0315 (fail)
7112 testText[10] = 0x0055; // capital U
7113 testText[11] = 0x2019; // right single quote mark - expect 0x0055 (fail)
7115 testText[12] = 0x01AF; // capital U with horn
7116 testText[13] = 0x0020; // space - expect 0x01AF (succeed)
7118 testText[14] = 0x0045; // capital E
7119 testText[15] = 0x031B; // combining horn - expect 0x0045, 0x031B (fail)
7121 testText[16] = 0x0041; // capital A
7122 testText[17] = 0x0306; // combining breve
7123 testText[18] = 0x0301; // combining acute - expect 0x1EAE (succeed)
7125 testText[19] = 0x0102; // capital A with breve
7126 testText[20] = 0x0301; // combining acute - expect 0x1EAE (succeed)
7128 testText[21] = 0x0041; // capital A
7129 testText[22] = 0x0301; // combining acute
7130 testText[23] = 0x0306; // combining breve - expect 0x0041, 0x0301, 0x0306 (fail)
7132 testText[24] = 0x0041; // capital A
7133 testText[25] = 0x0323; // combining dot below
7134 testText[26] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
7136 testText[27] = 0x1EA0; // capital A with dot below
7137 testText[28] = 0x0306; // combining breve - expect 0x1EB6 (succeed)
7139 testText[29] = 0x0102; // capital A with breve
7140 testText[30] = 0x0323; // combining dot below - expect 0x0102, 0x0323 (fail)
7142 testText[31] = 0x0045; // capital A
7143 testText[32] = 0x0302; // combining circumflex
7144 testText[33] = 0x0301; // combining acute - expect 0x1EBE (succeed)
7146 testText[34] = 0x00CA; // capital A with circumflex
7147 testText[35] = 0x0301; // combining acute - expect 0x1EBE (succeed)
7149 testText[36] = 0x004F; // capital O
7150 testText[37] = 0x031B; // combining horn
7151 testText[38] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
7153 testText[39] = 0x01A0; // capital O with horn
7154 testText[40] = 0x0309; // combining hook above - expect 0x1EDE (succeed)
7156 param.iText.Set(testText);
7158 // 1: Capital U with combining horn
7159 param.iPosInText = 0;
7160 param.iPen.iX = param.iPen.iY = 0;
7161 r = iTestFont->GetCharacterPosition(param);
7162 TEST(r && param.iPosInText == 2
7163 && param.iPen.iX == 10
7164 && param.iOutputGlyphs == 1
7165 && param.iOutput[0].iCode == 0x01AF);
7167 // 2: Capital U with apostrophe
7168 param.iPosInText = 2;
7169 param.iPen.iX = param.iPen.iY = 0;
7170 r = iTestFont->GetCharacterPosition(param);
7171 TEST(r && param.iPosInText == 3
7172 && param.iPen.iX == 10
7173 && param.iOutputGlyphs == 1
7174 && param.iOutput[0].iCode == 0x0055);
7176 // 3: Capital U with modifier prime
7177 param.iPosInText = 4;
7178 param.iPen.iX = param.iPen.iY = 0;
7179 r = iTestFont->GetCharacterPosition(param);
7180 TEST(r && param.iPosInText == 5
7181 && param.iPen.iX == 10
7182 && param.iOutputGlyphs == 1
7183 && param.iOutput[0].iCode == 0x0055);
7185 // 4: Capital U with modifier apostrophe
7186 param.iPosInText = 6;
7187 param.iPen.iX = param.iPen.iY = 0;
7188 r = iTestFont->GetCharacterPosition(param);
7189 TEST(r && param.iPosInText == 7
7190 && param.iPen.iX == 10
7191 && param.iOutputGlyphs == 1
7192 && param.iOutput[0].iCode == 0x0055);
7194 // 5: Capital U with combining comma above right
7195 param.iPosInText = 8;
7196 param.iPen.iX = param.iPen.iY = 0;
7197 r = iTestFont->GetCharacterPosition(param);
7198 TEST(r && param.iPosInText == 10
7199 && param.iPen.iX == 10
7200 && param.iOutputGlyphs == 2
7201 && param.iOutput[0].iCode == 0x0055
7202 && param.iOutput[1].iCode == 0x0315);
7204 // 6: Capital U with right single quote
7205 param.iPosInText = 10;
7206 param.iPen.iX = param.iPen.iY = 0;
7207 r = iTestFont->GetCharacterPosition(param);
7208 TEST(r && param.iPosInText == 11
7209 && param.iPen.iX == 10
7210 && param.iOutputGlyphs == 1
7211 && param.iOutput[0].iCode == 0x0055);
7213 // 7: Capital U with horn plus space
7214 param.iPosInText = 12;
7215 param.iPen.iX = param.iPen.iY = 0;
7216 r = iTestFont->GetCharacterPosition(param);
7217 TEST(r && param.iPosInText == 13
7218 && param.iPen.iX == 10
7219 && param.iOutputGlyphs == 1
7220 && param.iOutput[0].iCode == 0x01AF);
7222 // 8: Capital E with combining horn
7223 param.iPosInText = 14;
7224 param.iPen.iX = param.iPen.iY = 0;
7225 r = iTestFont->GetCharacterPosition(param);
7226 TEST(r && param.iPosInText == 16
7227 && param.iPen.iX == 10
7228 && param.iOutputGlyphs == 2
7229 && param.iOutput[0].iCode == 0x0045
7230 && param.iOutput[1].iCode == 0x031B);
7232 // 9: Capital A with combining breve with combining acute
7233 param.iPosInText = 16;
7234 param.iPen.iX = param.iPen.iY = 0;
7235 r = iTestFont->GetCharacterPosition(param);
7236 TEST(r && param.iPosInText == 19
7237 && param.iPen.iX == 10
7238 && param.iOutputGlyphs == 1
7239 && param.iOutput[0].iCode == 0x1EAE);
7241 // 10: Capital A with breve with combining acute
7242 param.iPosInText = 19;
7243 param.iPen.iX = param.iPen.iY = 0;
7244 r = iTestFont->GetCharacterPosition(param);
7245 TEST(r && param.iPosInText == 21
7246 && param.iPen.iX == 10
7247 && param.iOutputGlyphs == 1
7248 && param.iOutput[0].iCode == 0x1EAE);
7250 // 11: Capital A with combining acute with combining breve
7251 param.iPosInText = 21;
7252 param.iPen.iX = param.iPen.iY = 0;
7253 r = iTestFont->GetCharacterPosition(param);
7254 TEST(r && param.iPosInText == 24
7255 && param.iPen.iX == 10
7256 && param.iOutputGlyphs == 3
7257 && param.iOutput[0].iCode == 0x0041
7258 && param.iOutput[1].iCode == 0x0301
7259 && param.iOutput[2].iCode == 0x0306);
7261 // 12: Capital A with combining dot below with combining breve
7262 param.iPosInText = 24;
7263 param.iPen.iX = param.iPen.iY = 0;
7264 r = iTestFont->GetCharacterPosition(param);
7265 TEST(r && param.iPosInText == 27
7266 && param.iPen.iX == 10
7267 && param.iOutputGlyphs == 1
7268 && param.iOutput[0].iCode == 0x1EB6);
7270 // 13: Capital A with dot below with combining breve
7271 param.iPosInText = 27;
7272 param.iPen.iX = param.iPen.iY = 0;
7273 r = iTestFont->GetCharacterPosition(param);
7274 TEST(r && param.iPosInText == 29
7275 && param.iPen.iX == 10
7276 && param.iOutputGlyphs == 1
7277 && param.iOutput[0].iCode == 0x1EB6);
7279 // 14: Capital A with breve with combining dot below
7280 param.iPosInText = 29;
7281 param.iPen.iX = param.iPen.iY = 0;
7282 r = iTestFont->GetCharacterPosition(param);
7283 TEST(r && param.iPosInText == 31
7284 && param.iPen.iX == 10
7285 && param.iOutputGlyphs == 2
7286 && param.iOutput[0].iCode == 0x0102
7287 && param.iOutput[1].iCode == 0x0323);
7289 // 15: Capital A with combining circumflex with combining acute
7290 param.iPosInText = 31;
7291 param.iPen.iX = param.iPen.iY = 0;
7292 r = iTestFont->GetCharacterPosition(param);
7293 TEST(r && param.iPosInText == 34
7294 && param.iPen.iX == 10
7295 && param.iOutputGlyphs == 1
7296 && param.iOutput[0].iCode == 0x1EBE);
7298 // 16: Capital A with circumflex with combining acute
7299 param.iPosInText = 34;
7300 param.iPen.iX = param.iPen.iY = 0;
7301 r = iTestFont->GetCharacterPosition(param);
7302 TEST(r && param.iPosInText == 36
7303 && param.iPen.iX == 10
7304 && param.iOutputGlyphs == 1
7305 && param.iOutput[0].iCode == 0x1EBE);
7307 // 17: Capital O with combining horn with combing hook above
7308 param.iPosInText = 36;
7309 param.iPen.iX = param.iPen.iY = 0;
7310 r = iTestFont->GetCharacterPosition(param);
7311 TEST(r && param.iPosInText == 39
7312 && param.iPen.iX == 10
7313 && param.iOutputGlyphs == 1
7314 && param.iOutput[0].iCode == 0x1EDE);
7316 // 18: Capital O with horn with combing hook above
7317 param.iPosInText = 39;
7318 param.iPen.iX = param.iPen.iY = 0;
7319 r = iTestFont->GetCharacterPosition(param);
7320 TEST(r && param.iPosInText == 41
7321 && param.iPen.iX == 10
7322 && param.iOutputGlyphs == 1
7323 && param.iOutput[0].iCode == 0x1EDE);
7327 void CTGlyphSelection::TestNonBmpCharsL()
7329 // create a font store for testing
7330 CFontStore* fontStore = CFontStore::NewL(&User::Heap());
7332 //load all ecom implemented rasterizer dlls. installs the rasterizer.
7333 LoadOpenFontLibraries(fontStore);
7334 // test font preparation
7335 fontStore->iKPixelWidthInTwips = 11860; //This value is default
7337 //add any required font files
7338 TUid err = fontStore->AddFileL(KTestGB18030FontFile);
7340 TFontSpec testGB18030FontSpec(KTestGB18030FontFaceName,200);
7342 CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
7344 TInt ret = bmp->Create(TSize(100,100),EGray2);
7345 if (ret == KErrNotSupported)
7348 User::LeaveIfError(ret);
7350 CFbsBitmapDevice* device = NULL;
7351 TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
7352 TEST(err2 == KErrNone);
7354 CFbsBitGc* gc = NULL;
7355 User::LeaveIfError(device->CreateContext(gc));
7356 // Font file Creation
7357 CFbsFont* gb18030Font = NULL;
7358 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(gb18030Font,testGB18030FontSpec));
7359 gc->UseFont(gb18030Font);
7360 CleanupStack::PushL(gb18030Font);
7362 //Testcode for GB18030
7363 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7364 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("TI18N-GDI-CIT-4077"));
7365 TestNonBmpCharsInGB18030(gb18030Font);
7366 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7368 CleanupStack::Pop(gb18030Font);
7370 //Cleaning the memory
7374 fontStore->RemoveFile(err);
7376 REComSession::FinalClose();
7380 void CTGlyphSelection::TestTextDirection()
7382 This method is a test case to test GetCharacterPosition() correctly
7383 produces glyph bounding boxes and utilizes various pen offsets in
7384 a horizontal and vertical context.
7388 TBuf<20> testText(0);
7389 CFont::TPositionParam param;
7390 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7392 testText.SetLength(5);
7398 param.iText.Set(testText);
7400 // 1: Test horizontal text pen advancement & bounds
7401 param.iDirection = CFont::EHorizontal;
7402 param.iPosInText = 0;
7403 param.iPen.iX = param.iPen.iY = 0;
7404 r = iTestFont->GetCharacterPosition(param);
7405 TEST(r && param.iPosInText == 1
7406 && param.iPen == TPoint(10,0)
7407 && param.iOutputGlyphs == 1
7408 && param.iOutput[0].iCode == 'a'
7409 && param.iOutput[0].iBounds.iTl == TPoint(0,-10)
7410 && param.iOutput[0].iBounds.iBr == TPoint(10,2));
7411 // add check for bounds
7413 // 2: Test horizontal text pen advancement with +ve pen offset
7414 param.iPosInText = 4;
7417 r = iTestFont->GetCharacterPosition(param);
7418 TEST(r && param.iPosInText == 5
7419 && param.iPen == TPoint(30,12)
7420 && param.iOutputGlyphs == 1
7421 && param.iOutput[0].iCode == '1'
7422 && param.iOutput[0].iBounds.iTl == TPoint(20,2)
7423 && param.iOutput[0].iBounds.iBr == TPoint(30,14));
7425 // 3: Test horizontal text pen advancement with -ve pen offset
7426 param.iPosInText = 4;
7427 param.iPen.iX = -10;
7428 param.iPen.iY = -24;
7429 r = iTestFont->GetCharacterPosition(param);
7430 TEST(r && param.iPosInText == 5
7431 && param.iPen == TPoint(0,-24)
7432 && param.iOutputGlyphs == 1
7433 && param.iOutput[0].iCode == '1'
7434 && param.iOutput[0].iBounds.iTl == TPoint(-10,-34)
7435 && param.iOutput[0].iBounds.iBr == TPoint(0,-22));
7437 // 4: Test vertical text pen advancement & bounds
7438 param.iDirection = CFont::EVertical;
7439 param.iPosInText = 1;
7440 param.iPen.iX = param.iPen.iY = 0;
7441 r = iTestFont->GetCharacterPosition(param);
7442 TEST(r && param.iPosInText == 2
7443 && param.iPen == TPoint(0,12)
7444 && param.iOutputGlyphs == 1
7445 && param.iOutput[0].iCode == 'B'
7446 && param.iOutput[0].iBounds.iTl == TPoint(0,0)
7447 && param.iOutput[0].iBounds.iBr == TPoint(10,12));
7449 // 5: Test vertical text pen advancement with +ve pen offset
7450 param.iPosInText = 4;
7453 r = iTestFont->GetCharacterPosition(param);
7454 TEST(r && param.iPosInText == 5
7455 && param.iPen == TPoint(20,24)
7456 && param.iOutputGlyphs == 1
7457 && param.iOutput[0].iCode == '1'
7458 && param.iOutput[0].iBounds.iTl == TPoint(20,12)
7459 && param.iOutput[0].iBounds.iBr == TPoint(30,24));
7461 // 6: Test vertical text pen advancement with -ve pen offset
7462 param.iPosInText = 4;
7463 param.iPen.iX = -10;
7464 param.iPen.iY = -24;
7465 r = iTestFont->GetCharacterPosition(param);
7466 TEST(r && param.iPosInText == 5
7467 && param.iPen == TPoint(-10,-12)
7468 && param.iOutputGlyphs == 1
7469 && param.iOutput[0].iCode == '1'
7470 && param.iOutput[0].iBounds.iTl == TPoint(-10,-24)
7471 && param.iOutput[0].iBounds.iBr == TPoint(0,-12));
7474 void CTGlyphSelection::TestAllUnicodeChars()
7476 This method is a test case to test GetCharacterPosition() correctly
7477 processes all the characters in the Unicode code space 0x0000 to
7482 TBuf<8> testText(0);
7483 CFont::TPositionParam param;
7484 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7487 testText.SetLength(1);
7488 for (TUint i = 0xd802; i <= 0xffff; i++)
7490 testText[0] = (TText16) i;
7491 if (i==0x1b) continue; // Skip as CTestFont designed to fail here r==0.
7492 param.iText.Set(testText);
7493 param.iDirection = CFont::EHorizontal;
7494 param.iPosInText = 0;
7495 param.iPen.iX = param.iPen.iY = 0;
7496 r = iTestFont->GetCharacterPosition(param);
7497 if (!r || param.iPosInText != 1)
7500 //RDebug::Print(_L("%04x(%d,%d,%d), "), i, r, param.iPosInText, param.iOutputGlyphs );
7501 //if (errors%8 == 0)
7502 // RDebug::Print(_L("\n"));
7509 /** Tests that ligatures (presently just Lam-Alef in Arabic) work correctly
7510 when diacritics are required on one, both or neither character comprising the
7512 void CTGlyphSelection::TestLigaturesWithDiacritics()
7514 // independent letters
7515 const TText KAlef = 0x627;
7516 const TText KLam = 0x644;
7517 const TText KBeh = 0x628;
7519 const TText KFatha = 0x64E;
7520 const TText KDamma = 0x64F;
7522 const TText KLamAlefIsolated = 0xFEFB;
7523 const TText KLamAlefFinal = 0xFEFC;
7527 // Logical order input.
7529 // Visual order input, should be equivalent to iInputL.
7531 // Which cluster to test
7532 TInt iClusterUnderTestStartL;
7533 TInt iClusterUnderTestStartV;
7534 // Expected glyphs to appear (in any order, but...)
7536 // ...number of glyphs from the start of iGlyphs that
7537 // are in order of their expected x-coordinates (of their
7539 TInt iGlyphsInOrder;
7541 const TTestCase KTestCases[] =
7543 {{KLam, KAlef, 0}, {KAlef, KLam, 0},
7544 0, 0, {KLamAlefIsolated, 0}, 1},
7545 {{KBeh, KLam, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KBeh, 0},
7546 1, 1, {KLamAlefFinal, 0}, 1},
7547 {{KLam, KFatha, KAlef, 0}, {KAlef, KLam, KFatha, 0},
7548 0, 0, {KLamAlefIsolated, KFatha, 0}, 1},
7549 {{KBeh, KLam, KFatha, KAlef, KBeh, 0}, {KBeh, KAlef, KLam, KFatha, KBeh, 0},
7550 1, 1, {KLamAlefFinal, KFatha, 0}, 1},
7551 {{KLam, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, 0},
7552 0, 0, {KLamAlefIsolated, KDamma, 0}, 1},
7553 {{KBeh, KLam, KAlef, KDamma, KBeh, 0}, {KBeh, KAlef, KDamma, KLam, KBeh, 0},
7554 1, 1, {KLamAlefFinal, KDamma, 0}, 1},
7555 {{KLam, KFatha, KAlef, KDamma, 0}, {KAlef, KDamma, KLam, KFatha, 0},
7556 0, 0, {KDamma, KFatha, KLamAlefIsolated, 0}, 2},
7557 {{KBeh, KLam, KFatha, KAlef, KDamma, KBeh, 0},
7558 {KBeh, KAlef, KDamma, KLam, KFatha, KBeh, 0},
7559 1, 1, {KDamma, KFatha, KLamAlefFinal, 0}, 2},
7562 CFont::TPositionParam param;
7563 for (TInt testCase = 0;
7564 testCase != sizeof(KTestCases)/sizeof(KTestCases[0]);
7567 const TTestCase& t = KTestCases[testCase];
7568 for (TInt logical = 0; logical != 2; ++logical)
7570 const TText* in = logical?
7571 t.iInputL : t.iInputV;
7574 input.Append(*in++);
7575 param.iText.Set(input);
7576 param.iPosInText = logical?
7577 t.iClusterUnderTestStartL : t.iClusterUnderTestStartV;
7578 param.iFlags = static_cast<TUint16>(logical?
7579 CFont::TPositionParam::EFLogicalOrder : 0);
7580 param.iPen.SetXY(0, 0);
7581 TBool r = iTestFont->GetCharacterPosition(param);
7583 TInt currentX = KMinTInt;
7584 TInt expectedGlyphNo = 0;
7585 while (t.iGlyphs[expectedGlyphNo] != 0)
7587 // FInd the expected glyph in the output.
7588 TInt outputGlyph = 0;
7589 while (outputGlyph != param.iOutputGlyphs
7590 && static_cast<TInt>(param.iOutput[outputGlyph].iCode)
7591 != t.iGlyphs[expectedGlyphNo])
7595 TEST(outputGlyph < param.iOutputGlyphs);
7596 TInt x = param.iOutput[outputGlyph].iBounds.Center().iX;
7597 TEST(t.iGlyphsInOrder <= expectedGlyphNo
7602 TEST(expectedGlyphNo == param.iOutputGlyphs);
7607 #if defined(__GCC32__)
7608 typedef wchar_t __TText;
7609 #elif defined(__VC32__)
7610 typedef TUint16 __TText;
7611 #elif defined(__CW32__)
7612 typedef TUint16 __TText;
7613 #elif !defined(__TText_defined)
7614 #error no typedef for __TText
7616 const __TText* KLatinNoSideBearings = L"ABCDE";
7617 const __TText* KLatinLeftSideBearing = L"WABCD";
7618 const __TText* KLatinRightSideBearing = L"ABCDW";
7619 const __TText* KLatinBothSideBearings = L"WABCW";
7620 const __TText* KArabicAlefWaw = L"\x627\x648";
7621 const __TText* KArabicWawAlef = L"\x648\x627";
7622 const __TText* KGb18030NoSideBearings = L"\xD840\xDC00xyz\xD87E\xDE1D";
7623 const __TText* KGb18030LeftSideBearings = L"W\xD840\xDC00xy\xD87E\xDE1D";
7624 const __TText* KGb18030RightSideBearings = L"\xD840\xDC00xy\xD87E\xDE1DW";
7625 const __TText* KGb18030BothSideBearings = L"W\xD840\xDC00x\xD87E\xDE1DW";
7626 struct TMeasureTextTest
7628 const __TText* iText;
7629 TInt iExpectedAdvanceLogical;
7630 TInt iExpectedAdvanceL2R;
7631 TInt iExpectedBoundsL2RLeft;
7632 TInt iExpectedBoundsL2RRight;
7633 TInt iExpectedBoundsL2RTop;
7634 TInt iExpectedBoundsL2RBottom;
7635 TInt iExpectedAdvanceR2L;
7636 TInt iExpectedBoundsR2LLeft;
7637 TInt iExpectedBoundsR2LRight;
7638 TInt iExpectedBoundsR2LTop;
7639 TInt iExpectedBoundsR2LBottom;
7641 const TMeasureTextTest KMeasureTextResults[] =
7643 {KLatinNoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
7644 {KLatinLeftSideBearing, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
7645 {KLatinRightSideBearing, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
7646 {KLatinBothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
7647 {KArabicAlefWaw, 20, 20, 0, 20, -10, 2, 20, -5, 20, -10, 2},
7648 {KArabicWawAlef, 20, 20, -5, 20, -10, 2, 20, 0, 20, -10, 2},
7649 // ones containing surrogate pairs
7650 {KGb18030NoSideBearings, 50, 50, 0, 50, -10, 2, 50, 0, 50, -10, 2},
7651 {KGb18030LeftSideBearings, 50, 50, -1, 50, -10, 2, 50, 0, 51, -10, 2},
7652 {KGb18030RightSideBearings, 50, 50, 0, 51, -10, 2, 50, -1, 50, -10, 2},
7653 {KGb18030BothSideBearings, 50, 50, -1, 51, -10, 2, 50, -1, 51, -10, 2},
7655 /** Tests CFont::MeasureText */
7656 void CTGlyphSelection::TestMeasureText()
7658 CFont::TMeasureTextInput input;
7659 CFont::TMeasureTextOutput output;
7662 i != sizeof(KMeasureTextResults)/sizeof(KMeasureTextResults[0]); ++i)
7664 TPtrC text(reinterpret_cast<const TText16*>(
7665 KMeasureTextResults[i].iText));
7666 advance = iTestFont->MeasureText(text, &input, &output);
7667 TEST(advance == KMeasureTextResults[i].iExpectedAdvanceLogical);
7668 input.iFlags = CFont::TMeasureTextInput::EFVisualOrder;
7669 advance = iTestFont->MeasureText(text, &input, &output);
7670 TEST(advance == KMeasureTextResults[i].iExpectedAdvanceL2R);
7671 TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsL2RLeft);
7672 TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsL2RRight);
7673 TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsL2RTop);
7674 TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsL2RBottom);
7675 input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
7676 advance = iTestFont->MeasureText(text, &input, &output);
7677 TEST(advance == KMeasureTextResults[i].iExpectedAdvanceR2L);
7678 TEST(output.iBounds.iTl.iX == KMeasureTextResults[i].iExpectedBoundsR2LLeft);
7679 TEST(output.iBounds.iBr.iX == KMeasureTextResults[i].iExpectedBoundsR2LRight);
7680 TEST(output.iBounds.iTl.iY == KMeasureTextResults[i].iExpectedBoundsR2LTop);
7681 TEST(output.iBounds.iBr.iY == KMeasureTextResults[i].iExpectedBoundsR2LBottom);
7684 INFO_PRINTF1(_L("Test fix for INC086257 - EFIncludePenPositionInBoundsCheck"));
7685 // left-to-right w/o flag and bounds set to just fit string disregarding sidebearings
7687 input.iMaxBounds = 50;
7688 iTestFont->MeasureText(_L("XXXXX"), &input, &output);
7689 TEST(output.iChars == 5);
7690 // set flag, string should no longer fit (break happens)
7691 input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
7692 iTestFont->MeasureText(_L("XXXXX"), &input, &output);
7693 TEST(output.iChars == 4);
7694 // right-to-left w/o flag and bounds set to just fit string disregarding sidebearings
7695 input.iFlags = CFont::TMeasureTextInput::EFVisualOrderRightToLeft;
7696 iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
7697 TEST(output.iChars == 5);
7698 // set flag, string should no longer fit (break happens)
7699 input.iFlags |= CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
7700 iTestFont->MeasureText(_L("\x5EA\x5EA\x5EA\x5EA\x5EA"), &input, &output);
7701 TEST(output.iChars == 4);
7702 // top-to-bottom w/o flag and bounds set to just fit string disregarding endbearings
7704 input.iMaxBounds = 60;
7705 input.iDirection = CFont::EVertical;
7706 iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
7707 TEST(output.iChars == 5);
7708 // set flag, string should no longer fit (break happens)
7709 input.iFlags = CFont::TMeasureTextInput::EFIncludePenPositionInBoundsCheck;
7710 iTestFont->MeasureText(_L("\x304B\x304B\x304B\x304B\x304B"), &input, &output);
7711 TEST(output.iChars == 4);
7714 void CTGlyphSelection::RunTestCaseL(TInt aCurTestCase)
7716 This method will execute each test case method in the class
7717 logging its progress as it does so.
7720 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(KUnknownSYMTestCaseIDName);
7721 switch(aCurTestCase)
7725 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0200
7727 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0200"));
7728 INFO_PRINTF1(_L("Test API Boundaries"));
7729 TestApiBoundaries();
7733 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0201
7735 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0201"));
7736 INFO_PRINTF1(_L("Test CTRL Chars"));
7737 TestCtrlCharsIgnored();
7741 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0202
7743 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0202"));
7744 INFO_PRINTF1(_L("Test Latin Chars"));
7749 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0203
7751 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0203"));
7752 INFO_PRINTF1(_L("Test Soft Hypen Char"));
7757 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0204
7759 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0204"));
7760 INFO_PRINTF1(_L("Test Surrogate Pairs"));
7762 INFO_PRINTF1(_L("Test Supplementary Chars"));
7767 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0205
7769 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0205"));
7770 INFO_PRINTF1(_L("Test Combining Latin Chars"));
7771 TestCombiningLatinChars();
7774 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0221"));
7775 INFO_PRINTF1(_L("Test Vietnamese Chars"));
7776 TestVietnameseChars();
7780 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0206
7782 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0206"));
7783 INFO_PRINTF1(_L("Test Vertical/Horizontal Text Bounds"));
7784 TestTextDirection();
7788 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0207
7790 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0207"));
7791 INFO_PRINTF1(_L("Test All Unicode Characters"));
7792 TestAllUnicodeChars();
7796 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0208
7798 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0208"));
7799 INFO_PRINTF1(_L("Test Ligatures with Diacritics"));
7800 TestLigaturesWithDiacritics();
7804 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0209
7806 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0209"));
7807 INFO_PRINTF1(_L("Test CFont::MeasureText()"));
7812 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0210
7814 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0210"));
7815 INFO_PRINTF1(_L("Test Indic Glyphs"));
7820 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0211
7822 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0211"));
7823 INFO_PRINTF1(_L("Test Thai Rendering"));
7828 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0212
7830 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0212"));
7831 INFO_PRINTF1(_L("Test isolated Combining Latin Chars"));
7832 TestIsolatedCombiningLatinChars();
7836 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0213
7838 INFO_PRINTF1(_L("Test Indic Gurmukhi and Malayalam Chars"));
7839 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0213"));
7840 ExecuteIndicGurmukhiMalayalamTests();
7844 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CIT-0214
7846 INFO_PRINTF1(_L("Test Rendering Context"));
7847 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-SYSLIB-GDI-CIT-0214"));
7848 TestContextInShapeInfo();
7852 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(KNotATestSYMTestCaseIDName);
7853 ((CTGlyphSelectionStep*)iStep)->CloseTMSGraphicsStep();
7856 ((CTGlyphSelectionStep*)iStep)->RecordTestResultL();
7859 void CTGlyphSelection::TestPerformance()
7861 This method tests the performance of the API under test
7862 by executing a 10000 cycles of each test case.
7866 INFO_PRINTF1(_L("Test Performance..."));
7869 for (TInt i = 0; i < 10000; i++)
7871 TestCtrlCharsIgnored();
7875 TestCombiningLatinChars();
7876 TestTextDirection();
7879 TUint numMilliSecs = profile.Stop();
7881 INFO_PRINTF3(_L("Performance test end %d.%d s\n"),numMilliSecs/1000,numMilliSecs%1000);
7885 void CTGlyphSelection::TestThai_SimpleChars()
7887 This routine tests individual Thai base characters pumping them
7888 through the CFont::GetCharacterPosition() API.
7892 CFont::TPositionParam param;
7893 param.iDirection = CFont::EHorizontal;
7894 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7895 TBuf<5> testText(0);
7896 testText.SetLength(1);
7897 param.iText.Set(testText);
7899 for (TUint i=0; Thai_SimpleChars[i] != 0xFFFF; i++)
7901 testText[0] = Thai_SimpleChars[i];
7902 param.iPosInText = 0;
7903 param.iPen.iX = param.iPen.iY = 0;
7905 r = iTestFont->GetCharacterPosition(param);
7907 TEST(r && param.iPosInText == 1
7908 && param.iPen.iX == 10
7909 && param.iOutputGlyphs == 1
7910 && param.iOutput[0].iCode == Thai_SimpleChars[i]);
7915 void CTGlyphSelection::TestThai_ValidGlyphClusters()
7917 This routine tests combining sequences of Thai base & mark
7918 characters pumping them through the CFont::GetCharacterPosition() API.
7919 The sequences mainly test the correct formation of Thay Glyph clusters
7920 and the PUA substutions that take place.
7925 CFont::TPositionParam param;
7926 param.iDirection = CFont::EHorizontal;
7927 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7929 for (TUint i=0; Thai_ValidGlyphClusters[i].iTextLen != -1; i++)
7931 TBuf<8> testText(Thai_ValidGlyphClusters[i].iText);
7932 param.iText.Set(testText);
7933 param.iPosInText = Thai_ValidGlyphClusters[i].iPosInText;
7934 param.iPen.iX = param.iPen.iY = 0;
7936 r = iTestFont->GetCharacterPosition(param);
7938 if (r && param.iPosInText == Thai_ValidGlyphClusters[i].oPosInText
7939 && param.iOutputGlyphs == Thai_ValidGlyphClusters[i].oOutputLen)
7941 for (TInt j=0; j<Thai_ValidGlyphClusters[i].oOutputLen; j++)
7943 if (param.iOutput[j].iCode != Thai_ValidGlyphClusters[i].oOutput[j])
7945 INFO_PRINTF4(_L("FAILURE: Glyph code invariance, Complex TEST(%d), %x != %x\n"), i, param.iOutput[j].iCode, Thai_ValidGlyphClusters[i].oOutput[j]);
7953 INFO_PRINTF2(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d)\n"), i);
7958 TEST(failures == 0);
7962 void CTGlyphSelection::TestThai_InvalidGlyphClusters()
7964 This routine tests Thai base & mark cluster boundaries to ensure where
7965 requried the KUnicodeDottedCircle char is used when an invalid sequence is
7966 processed. Test data from the global Thai_GlyphClusterBoundaries
7967 variable is pumped through the CFont::GetCharacterPosition() API.
7972 CFont::TPositionParam param;
7973 param.iDirection = CFont::EHorizontal;
7974 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
7976 for (TUint i=0; Thai_GlyphClusterBoundaries[i].iTextLen != -1; i++)
7978 TBuf<8> testText(Thai_GlyphClusterBoundaries[i].iText);
7979 param.iText.Set(testText);
7981 for (TUint k=0; k<2; k++)
7983 if (Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText == -1)
7986 param.iPosInText = Thai_GlyphClusterBoundaries[i].oOut[k].iPosInText;
7987 param.iPen.iX = param.iPen.iY = 0;
7989 r = iTestFont->GetCharacterPosition(param);
7991 if (r && param.iPosInText == Thai_GlyphClusterBoundaries[i].oOut[k].oPosInText
7992 && param.iOutputGlyphs == Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen)
7994 for (TInt j=0; j<Thai_GlyphClusterBoundaries[i].oOut[k].oOutputLen; j++)
7996 if (!(param.iOutput[j].iCode == Thai_GlyphClusterBoundaries[i].oOut[k].oOutput[j]))
7998 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]);
8006 INFO_PRINTF3(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d)\n"), i, k);
8014 RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
8015 TEST(failures == 0);
8019 @SYMTestCaseID GRAPHICS-SYSLIB-GDI-CT-4062
8020 @SYMTestCaseDesc Tests that a punctuation character following the special-case
8021 character Thai SaraAm is rendered as a punctuation, not
8022 another SaraAm character.
8023 @SYMTestPriority High
8024 @SYMTestActions Compare input string and corresponding output glyph codes
8025 @SYMTestExpectedResults In this case, the string and the codes should match.
8028 void CTGlyphSelection::TestThai_INC118424()
8030 CFont::TPositionParam param;
8031 param.iDirection = CFont::EHorizontal;
8032 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
8034 //punctuation after SaraAm
8035 TestGlyphs(iTestFont,param,_L("\xE04\xE33:\?>"),_L("\xE04\xE33:\?>"));
8039 This fuction tests Indic Gurmukhi and Malayalam support
8041 void CTGlyphSelection::ExecuteIndicGurmukhiMalayalamTests()
8043 // create a font store for testing
8044 CFontStore* fontStore = CFontStore::NewL(&User::Heap());
8046 //load all ecom implemented rasterizer dlls. installs the rasterizer.
8047 LoadOpenFontLibraries(fontStore);
8048 // test font preparation
8049 fontStore->iKPixelWidthInTwips = 11860; //This value is default
8051 //add any required font files
8052 TUid err1 = fontStore->AddFileL(KTestIndicFontFile);
8054 TFontSpec testIndicFontSpec(KTestIndicFontFaceName,200);
8056 CFbsBitmap* bmp = new(ELeave) CFbsBitmap;
8058 TInt ret = bmp->Create(TSize(100,100),EGray2);
8059 if (ret == KErrNotSupported)
8062 User::LeaveIfError(ret);
8064 CFbsBitmapDevice* device = NULL;
8065 TRAPD(err2,device = CFbsBitmapDevice::NewL(bmp));
8066 TEST(err2 == KErrNone);
8068 CFbsBitGc* gc = NULL;
8069 User::LeaveIfError(device->CreateContext(gc));
8071 // Font file Creation
8072 CFbsFont* indicFont = NULL;
8073 User::LeaveIfError(device->GetNearestFontToDesignHeightInTwips(indicFont,testIndicFontSpec));
8074 gc->UseFont(indicFont);
8075 CleanupStack::PushL(indicFont);
8077 //Testcode for Kannada, Marathi,Gujarati,Bengali language
8078 // Test Indic Gurmukhi digit.
8080 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8082 INFO_PRINTF1(_L("Failed to record test result"));
8083 INFO_PRINTF1(_L("Test Indic Gurmukhi digits"));
8084 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4063"));
8085 TestGurmukhiDigit( *indicFont );
8086 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8088 INFO_PRINTF1(_L("Failed to record test result"));
8089 INFO_PRINTF1(_L("Test Indic Gurmukhi and Latin"));
8090 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4064"));
8091 TestGurmukhiAndLatin( *indicFont );
8092 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8094 INFO_PRINTF1(_L("Failed to record test result"));
8095 INFO_PRINTF1(_L("Test Indic DEF102858 on Gurmukhi"));
8096 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4065"));
8097 TestGurmukhiModifierAfterConsonantViramaZWJ( *indicFont );
8098 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8100 INFO_PRINTF1(_L("Failed to record test result"));
8101 INFO_PRINTF1(_L("Test Indic Gurmukhi consonant leading"));
8102 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4066"));
8103 TestGurmukhiWithConsonantInitial( *indicFont );
8104 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8106 INFO_PRINTF1(_L("Failed to record test result"));
8107 INFO_PRINTF1(_L("Test Indic Gurmukhi vowel leading"));
8108 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4068"));
8109 TestGurmukhiWithVowelInitial( *indicFont );
8110 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8112 INFO_PRINTF1(_L("Failed to record test result"));
8113 INFO_PRINTF1(_L("Test Indic Malayalam digits"));
8114 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4067"));
8115 TestMalayalamDigit( *indicFont );
8116 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8118 INFO_PRINTF1(_L("Failed to record test result"));
8119 INFO_PRINTF1(_L("Test Indic Malayalam and Latin"));
8120 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4069"));
8121 TestMalayalamAndLatin( *indicFont );
8122 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8124 INFO_PRINTF1(_L("Failed to record test result"));
8125 INFO_PRINTF1(_L("Test Indic DEF102858 on Malayalam"));
8126 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4070"));
8127 TestMalayalamModifierAfterConsonantViramaZWJ( *indicFont );
8128 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8130 INFO_PRINTF1(_L("Failed to record test result"));
8131 INFO_PRINTF1(_L("Test Indic Malayalam consonant leading"));
8132 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4071"));
8133 TestMalayalamWithConsonantInitial( *indicFont );
8134 TRAP(err,((CTGlyphSelectionStep*)iStep)->RecordTestResultL());
8136 INFO_PRINTF1(_L("Failed to record test result"));
8137 INFO_PRINTF1(_L("Test Indic Malayalam vowel leading"));
8138 ((CTGlyphSelectionStep*)iStep)->SetTestStepID(_L("GRAPHICS-TI18N-GDI-CIT-4072"));
8139 TestMalayalamWithVowelInitial( *indicFont );
8140 CleanupStack::Pop(indicFont);
8142 //Cleaning the memory
8146 fontStore->RemoveFile(err1);
8148 REComSession::FinalClose();
8151 This function tests the Thai Font Rendering feature of the CFont class
8152 in the GDI.dll and in particular the modifications made to
8153 CFont::GetCharacterPosition() to support the Unicocde Thai code page.
8154 First introduced during the Sirocco project (A3.1.1)
8155 @SYMFssID Graphics/GDI/GDI/1
8156 @SYMFssID Graphics/GDI/GDI/2
8159 void CTGlyphSelection::ExecuteThaiTests()
8161 // Test individual Thai digits, letters and sign characters.
8162 INFO_PRINTF1(_L("Test Thai simple charecters"));
8163 TestThai_SimpleChars();
8165 // Test complex Thai char sequences.
8166 INFO_PRINTF1(_L("Test valid Thai glyph clusters"));
8167 TestThai_ValidGlyphClusters();
8169 // Test Thai glyph cluster boundaries.
8170 INFO_PRINTF1(_L("Test invalid Thai glyph clusters"));
8171 TestThai_InvalidGlyphClusters();
8173 // Test Thai SaraAm-punctuation exception.
8174 INFO_PRINTF1(_L("Test fix for INC118424"));
8175 TestThai_INC118424();
8181 * This is just a easy way to help generate the test data info
8182 * Any new added test data should do manually check firstly to check the correction before using this function
8184 // #define GEN_GURMUKHIMALAYALAMTESTDATA
8185 void CTGlyphSelection::GenerateGurmukhiMalayalamData( const TDesC& filename, const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
8188 file.Replace( iFs, filename, EFileWrite );
8190 CFont::TPositionParam param;
8191 param.iDirection = CFont::EHorizontal;
8192 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
8193 RShapeInfo shapeInfo;
8200 for (TUint i = 0; testArray[i].iTextLen != -1; i++)
8202 TTestInput_PositionParam6 currentArray = testArray[i];
8203 TBuf<8> testText(testArray[i].iText);
8204 param.iText.Set(testText);
8206 TBuf8<256> datatext;
8207 datatext.SetLength(0);
8208 //{ 1, {0x0a66}, { {0, 1, 1, {0x12fe} }, {-1, 1, 1, {0} } } },
8209 datatext.Format(_L8("{ %d, {"), testArray[i].iTextLen); // 1,
8211 for (TUint i = 0; i<testText.Length(); i++)
8214 tmp.Format(_L8("0x%x, "), currentArray.iText[i]); // {0x0a66},
8215 datatext.Append(tmp);
8217 datatext = datatext.Left(datatext.Length()-2);
8218 datatext.Append(_L8("}, { "));
8220 if (shapeInfo.IsOpen())
8223 for (TUint k = 0; k < 6; k++)
8225 param.iPosInText = k;
8226 param.iPen.iX = param.iPen.iY = 0;
8227 TBool ret = aFont.GetCharacterPosition2(param, shapeInfo);
8228 if (0 == param.iOutputGlyphs)
8232 tmp.Format(_L8("{%d, %d, %d, {"), k, param.iPosInText, param.iOutputGlyphs);
8233 datatext.Append(tmp);
8235 for (TInt j = 0; j < param.iOutputGlyphs; j++)
8237 TText16 aCode = param.iOutput[j].iCode;
8239 tmp.Format(_L8("0x%x, "), aCode);
8240 datatext.Append(tmp);
8242 datatext = datatext.Left(datatext.Length()-2);
8243 datatext.Append(_L8("}}, "));
8245 datatext.Append(_L8(" {-1, 1, 1, {0}} } }, \n"));
8247 file.Write(datatext);
8254 void CTGlyphSelection::DoEachGurmukhiMalayalamCase( const TTestInput_PositionParam6* testArray, const CFbsFont& aFont )
8258 CFont::TPositionParam param;
8259 param.iDirection = CFont::EHorizontal;
8260 param.iFlags = CFont::TPositionParam::EFLogicalOrder;
8261 RShapeInfo shapeInfo;
8268 for (TUint i=0; testArray[i].iTextLen != -1; i++)
8270 TBuf<8> testText(testArray[i].iText);
8271 param.iText.Set(testText);
8272 if(shapeInfo.IsOpen())
8275 for (TUint k=0; k<6; k++)
8277 // If it's end of sequence
8278 if ( testArray[i].oOut[k].iPosInText == -1)
8281 param.iPosInText = testArray[i].oOut[k].iPosInText;
8282 param.iPen.iX = param.iPen.iY = 0;
8284 r = aFont.GetCharacterPosition2(param, shapeInfo);
8286 if (r && param.iPosInText == testArray[i].oOut[k].oPosInText
8287 && param.iOutputGlyphs == testArray[i].oOut[k].oOutputLen)
8289 for (TInt j=0; j<testArray[i].oOut[k].oOutputLen; j++)
8291 // Trim off the highest bit
8292 TText16 aCode = param.iOutput[j].iCode;
8293 if (!( aCode == testArray[i].oOut[k].oOutput[j]))
8295 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]);
8303 INFO_PRINTF4(_L("FAILURE: Bad output result from GetCharacterPosition, Complex TEST(%d,%d,%d)\n"), i, k, param.iOutputGlyphs);
8311 RDebug::Print(_L("TOTAL FAILURES: %d\n"), failures);
8312 TEST(failures == 0);
8315 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4063
8316 @SYMTestCaseDesc Case to check Gurmukhi digit support
8317 @SYMTestPriority High
8318 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8319 1.Pass Gurmukhi digit (0xa66 ~ 0x0a6f) sequence
8320 2.Pass any Consonant + Gurmukhi digit sequence
8321 3.Pass any Consonant + Gurmukhi digit + Matra sequence
8322 4.Repetitive callss with Unicode sequence from the first 3 action items
8323 5.Pass Modifer + digit sequence
8324 6.Pass Vowel and digit sequence
8325 7.Pass Virama and digit sequence
8326 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
8327 2.Digit is recognized as a separate syllable
8328 3.Matra and digit is not combined together
8329 4.The shaper returned the same result as first 3 results
8330 5.digit is recognized, and not combined with Modifier
8331 6.digit is recognized, and not combined with Vowel.
8332 7.digit is recognized, and not combined with Virama.
8333 @SYMPREQ 1922: Gurmukhi support
8335 void CTGlyphSelection::TestGurmukhiDigit( const CFbsFont& aFont )
8337 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8339 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8340 _LIT(KValidFontPath, "c:\\GurmukhiDigit.txt");
8341 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8346 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4064
8347 @SYMTestCaseDesc case to check if shaper can render Gurmukhi with other implemented Indic scripts and Latin
8348 @SYMTestPriority High
8349 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8350 1.Pass Gurmukhi sentence and Latin to the function
8351 2.Pass Latin and Gurmukhi setence.
8352 3.Pass syllable, Latin and syllable
8353 4.Pass phoneme, Latin and phoneme
8354 5.Pass Gurmukhi syllable and other Indic scripts together.
8355 6.Pass Gurmukhi phoneme and other Indic script phoneme
8356 @SYMTestExpectedResults Gurumuki and Latin characters donĄ¯t mess up. Gurmukhi phoneme doesnĄ¯t combine with Latin into a new syllable,
8357 Gurmukhi phoneme doesnĄ¯t form a syllable with other Indic script.
8358 @SYMPREQ 1922: Gurmukhi support
8360 void CTGlyphSelection::TestGurmukhiAndLatin( const CFbsFont& aFont )
8362 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiAndLatin, aFont );
8364 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8365 _LIT(KValidFontPath, "c:\\GurmukhiAndLatin.txt");
8366 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8371 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4065
8372 @SYMTestCaseDesc case to check Gurmukhi modifier after Consonant, Virama, ZWJ
8373 @SYMTestPriority High
8374 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8375 1.Pass Consonant + Virama + ZWJ + Modifier
8376 @SYMTestExpectedResults Modifier is part of the syllable.
8377 @SYMPREQ 1922: Gurmukhi support, make sure DEF102858 fixing does not cause side effect
8379 void CTGlyphSelection::TestGurmukhiModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
8381 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiModifierAfterConsonantViramaZWJ, aFont );
8383 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8384 _LIT(KValidFontPath, "c:\\GurmukhiModifierAfterConsonantViramaZWJ.txt");
8385 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8390 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4066
8391 @SYMTestCaseDesc case to check syllable with consonant in initial position
8392 @SYMTestPriority High
8393 @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.
8394 1.Pass consonant and Nukta sequence
8395 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..
8396 3.Pass consonant and matra /i/ t sequence
8397 4.Pass the following Consonant, Virama and HA sequence
8398 Another sequence: Consonant , Virama and RA
8399 Another sequence: Consonant, Virama and VA
8400 Another sequence: Consonant, Virama and YA
8401 5.Pass Consonant and Addak sequence to shaper
8402 Pass Consonant, Addak and Consonant to shaper
8403 6.Pass Consonant and BINDI sequence:
8404 Sequence1:Consonant and BINDI,
8405 Sequence2: Consonant, dependent vowel which is shown to the right of base consonant and BINDI,
8406 Sequence3: Consonant, dependent vowel which is shown to the top of the base consonant and BINDI
8407 Pass Consonant and TIPPI sequence:
8408 Sequence1: Consonant and TIPPI,
8409 Sequence2: Consonant, dependent vowel which is shown to the left of the base consonant and TIPPI.
8410 Sequence3: Consonant, dependent vowel which is shown to the bottom of the base consonant and TIPPI.
8411 7.Pass Nukta, equavalent consonant, Nukta sequence to shaper sepeartely, save both result
8412 @SYMTestExpectedResults 1.nukta is combined to the base consonant according to the returned shape info
8413 2.The matra position is different between two ShapeText calls according to the returned shaped info.
8414 3.matra /i/ is combined to the left of the base consonant in position
8415 4.HA, RA, VA is on bottom of the base consonant and subscripted, YA in final form according to the returned shape info.
8416 5.Addak is on top of consonant, addak belongs to the consonant precedes it.
8417 6.BINDI is on top, TIPPI is on bottom
8418 7.The combinationĄ¯s character count, glyph count, glyph indices info is the same as the single nuktaĄ¯s
8419 @SYMPREQ 1922: Gurmukhi support
8421 void CTGlyphSelection::TestGurmukhiWithConsonantInitial( const CFbsFont& aFont )
8423 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiConsonantLeading, aFont );
8425 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8426 _LIT(KValidFontPath, "c:\\GurmukhiWithConsonantInitial.txt");
8427 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8433 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4067
8434 @SYMTestCaseDesc Case to check Malayalam digit support
8435 @SYMTestPriority High
8436 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8437 1.Pass Malayalam digit (0xd66 ~ 0x0d6f) sequence
8438 2.Pass any Consonant + Malayalam digit sequence
8439 3.Pass any Consonant + Malayalam digit + Matra sequence
8440 4.Repetitive callss with Unicode sequence from the first 3 action items
8441 5.Pass Modifer + digit sequence
8442 6.Pass Vowel and digit sequence
8443 7.Pass Virama and digit sequence
8444 @SYMTestExpectedResults 1.Glyph count, character count for digit is 1 for each digit, and glyph indices depends on font
8445 2.Digit is recognized as a separate syllable
8446 3.Matra and digit is not combined together
8447 4.The shaper returned the same result as first 3 results
8448 5.digit is recognized, and not combined with Modifier
8449 6.digit is recognized, and not combined with Vowel.
8450 7.digit is recognized, and not combined with Virama.
8451 @SYMPREQ 1922: Malayalam support
8453 void CTGlyphSelection::TestMalayalamDigit( const CFbsFont& aFont )
8455 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamDigit, aFont );
8457 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8458 _LIT(KValidFontPath, "c:\\MalayalamDigit.txt");
8459 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8464 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4068
8465 @SYMTestCaseDesc case to check syllable with vowel in initial position
8466 @SYMTestPriority High
8467 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements,
8468 each requirement above gives a vowel leading Unicode sequence. Each sequence falls into one of the following structure,
8469 then pass it to the calling.
8470 1.Pass ARA, IRI to shaper, pass URA sequence
8471 2.Pass valid bearer and vowel pair sequence
8472 Pass invalid bearer and vowel pair sequence
8473 @SYMTestExpectedResults 1.ARA character count is 1, IRI, URA character count is 0
8474 2.valid combination is combined together, invalid is not combined together
8475 @SYMPREQ 1922: Gurmukhi support
8477 void CTGlyphSelection::TestGurmukhiWithVowelInitial( const CFbsFont& aFont )
8479 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_GurmukhiVowelLeading, aFont );
8481 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8482 _LIT(KValidFontPath, "c:\\GurmukhiWithVowelInitial.txt");
8483 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8488 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4069
8489 @SYMTestCaseDesc case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
8490 @SYMTestPriority High
8491 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8492 1.Pass Malayalam sentence and Latin to the function
8493 2.Pass Latin and Gurmukhi setence.
8494 3.Pass syllable, Latin and syllable
8495 4.Pass phoneme, Latin and phoneme
8496 5.Pass Malayalam syllable and other Indic scripts together.
8497 6.Pass Malayalam phoneme and other Indic script phoneme
8498 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable,
8499 Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
8500 @SYMPREQ 1922: Malayalam support
8502 void CTGlyphSelection::TestMalayalamAndLatin( const CFbsFont& aFont )
8504 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamAndLatin, aFont );
8506 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8507 _LIT(KValidFontPath, "c:\\MalayalamAndLatin.txt");
8508 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8513 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4070
8514 @SYMTestCaseDesc case to check Malayalam modifier after Consonant, Virama, ZWJ
8515 @SYMTestPriority High
8516 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8517 1. Pass Consonant + Virama + ZWJ + Modifier
8518 @SYMTestExpectedResults Modifier is part of the syllable.
8519 @SYMPREQ 1922: Malayalam support, make sure DEF102858 fixing does not cause side effect
8521 void CTGlyphSelection::TestMalayalamModifierAfterConsonantViramaZWJ( const CFbsFont& aFont )
8523 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamModifierAfterConsonantViramaZWJ, aFont );
8525 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8526 _LIT(KValidFontPath, "c:\\MalayalamModifierAfterConsonantViramaZWJ.txt");
8527 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8532 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4071
8533 @SYMTestCaseDesc case to check syllable with consonant in initial position
8534 @SYMTestPriority High
8535 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following using data from above requirements,
8536 each requirement above gives a consonant leading Unicode sequence. Each sequence falls into one of the following structure,
8537 then pass it to the calling.
8538 1.Pass consonant + vowel single code, and consonant + its split representation to shaper
8539 The following Single representation /Split representation is passed to shaper
8540 0x0d14/0x0d12 + 0x0d57, 0x0d4a/0x0d46 + 0x0d3e, 0x0d4b/0x0d47 + 0x0d3e
8541 0x0d4c/0x0d46 + 0x0d57
8542 2.Pass two Consonant and dependent Vowel sequences to shaper, save both returned results.
8543 The Consonant is first sequence is difference with that of the second sequence, and the dependent Vowel is identical.
8544 3.Pass Consonant and Matras /-e/, /-ee/, /-ai/ to shaper.
8545 4.Pass Consonant and Matras /-o/, /-oo/, /-au/ to shaper
8546 Pass Consonant and 0x0d4c (first form of Matra /-au/ ) to shaper,
8547 Pass Consonant, 0x0d46 and 0x0d57 (second form of Matra /-au/) to shaper002E
8548 5.Pass Consonant + 0x0d4d + Consonant to shaper
8549 Pass Consonant + Virama + Consonant + 0x0d4d to shaper
8550 6.Pass Consonant (NNA, NA, RA, LA, LLA) + Virama + ZWJ to shaper
8551 Pass KA + Virama + ZWJ to shaper.
8552 Pass other Consonant + Virama + ZWJ to shaper.
8553 7.Pass RA + Virama + ZWJ to shaper,
8554 Pass RRA + Viram + ZWJ to shaper.
8555 8.Pass Chillu ( one of 6 special consontants + Virama + ZWJ) and Vowel to shaper
8556 Pass Chillu and Modifier to shaper
8557 Pass Chillu and Virama to shaper
8558 9.Pass one of (KA, GA, PA, BA, MA, LA, SHA, SA, HA), Virama and LA to shaper
8559 10.Pass CA, Virama and CA to shaper
8560 Pass BA, Virama and BA to shaper
8561 Pass YA, Virama and YA to shaper
8562 Pass VA, Virama and VA to shaper
8563 PASS other Consonant, Virama and the same Consonant to shaper.
8564 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.
8565 12.Pass Consonant clusters from REQ1.3.11 to shaper.
8566 13.Pass S.RR.RRA to shaper,
8567 Pass N.RR.RRA to shaper
8568 @SYMTestExpectedResults 1.First sequence is equivalent to the second sequence
8569 2.The dependent vowel position is different between the two sequence
8570 3.The visual position of the Matras is different with the logical order (The same as Keyboard input order).
8571 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.
8572 5.0x0d4d is recognized as a Virama in first sequence, itĄ¯s recognized as MATRA (mid-u sound) in the second sequence
8573 6.Virama and ZWJ is interpreted as Chillaksharam for the 6 consonants, for others itĄ¯s not interpreted that way.
8574 7.Both sequences will interprete RA Chillu.
8575 8.The combining character should not combine with Chillu.
8576 9.LA takes subscript shape.
8577 10.CA, BA, YA, VA double should result in a ligature, other consonants donĄ¯t.
8578 11.The latter consonant in the cluster becomes a miniature subscript.
8579 12.sequence forms a ligature.
8580 13.sequence forms a ligature
8581 @SYMPREQ 1922: Malayalam support
8583 void CTGlyphSelection::TestMalayalamWithConsonantInitial( const CFbsFont& aFont )
8585 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamConsonantLeading, aFont );
8587 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8588 _LIT(KValidFontPath, "c:\\MalayalamWithConsonantInitial.txt");
8589 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8594 @SYMTestCaseID GRAPHICS-TI18N-GDI-CIT-4072
8595 @SYMTestCaseDesc case to check if shaper can render Malayalam with other implemented Indic scripts and Latin
8596 @SYMTestPriority High
8597 @SYMTestActions Call to CFont::GetCharacterPosition2/CFont::MeasureText to check the following
8598 1.Pass Malayalam sentence and Latin to the function
8599 2.Pass Latin and Malayalam setence.
8600 3.Pass syllable, Latin and syllable
8601 4.Pass phoneme, Latin and phoneme
8602 5.Pass Malayalam syllable and other Indic scripts together.
8603 6.Pass Malayalam phoneme and other Indic script phoneme
8604 @SYMTestExpectedResults Malayalam and Latin characters donĄ¯t mess up. Malayalam phoneme doesnĄ¯t combine with Latin into a new syllable,
8605 Malayalam phoneme doesnĄ¯t form a syllable with other Indic script.
8606 @SYMPREQ 1922: Malayalam support
8608 void CTGlyphSelection::TestMalayalamWithVowelInitial( const CFbsFont& aFont )
8610 DoEachGurmukhiMalayalamCase( (TTestInput_PositionParam6*)Indic_MalayalamVowelLeading, aFont );
8612 #ifdef GEN_GURMUKHIMALAYALAMTESTDATA
8613 _LIT(KValidFontPath, "c:\\MalayalamWithVowelInitial.txt");
8614 GenerateGurmukhiMalayalamData(KValidFontPath, (TTestInput_PositionParam6*)Indic_GurmukhiDigit, aFont );
8621 __CONSTRUCT_STEP__(GlyphSelection)
8623 void CTGlyphSelectionStep::TestSetupL()
8625 #ifdef _GLOWCODE_LAUNCH_DELAY
8626 INFO_PRINTF1(_L("Time delay...."));
8629 t1 += TTimeIntervalSeconds(15);