2 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
21 #include <dali-toolkit/internal/text/shaper.h>
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <toolkit-text-utils.h>
27 using namespace Toolkit;
30 // Tests the following function.
31 // void ShapeText( const Vector<Character>& text,
32 // const Vector<LineBreakInfo>& lineBreakInfo,
33 // const Vector<ScriptRun>& scripts,
34 // const Vector<FontRun>& fonts,
35 // CharacterIndex startCharacterIndex,
36 // GlyphIndex startGlyphIndex,
37 // Length numberOfCharacters,
38 // Vector<GlyphInfo>& glyphs,
39 // Vector<CharacterIndex>& glyphToCharacterMap,
40 // Vector<Length>& charactersPerGlyph,
41 // Vector<GlyphIndex>& newParagraphGlyphs );
43 //////////////////////////////////////////////////////////
50 FontId fontId; ///< Identifies the font containing the glyph
51 GlyphIndex index; ///< Uniquely identifies a glyph for a given FontId
52 float width; ///< The width of the glyph
53 float height; ///< The height of the glyph
54 float xBearing; ///< The distance from the cursor position to the leftmost border of the glyph
55 float yBearing; ///< The distance from the baseline to the topmost border of the glyph
56 float advance; ///< The distance to move the cursor for this glyph
57 float scaleFactor; ///< The scaling applied (fixed-size fonts only)
58 bool isItalicRequired; ///< Whether the italic style is required.
59 bool isBoldRequired; ///< Whether the bold style is required.
62 bool IsEqualGlyph ( const GlyphInfoData& glyphData, const GlyphInfo& glyph )
64 if( glyphData.fontId != glyph.fontId )
68 if( glyphData.index != glyph.index )
72 if( fabsf( glyphData.width - glyph.width ) > Math::MACHINE_EPSILON_1000 )
76 if( fabsf( glyphData.height - glyph.height ) > Math::MACHINE_EPSILON_1000 )
80 if( fabsf( glyphData.xBearing - glyph.xBearing ) > Math::MACHINE_EPSILON_1000 )
84 if( fabsf( glyphData.yBearing - glyph.yBearing ) > Math::MACHINE_EPSILON_1000 )
88 if( fabsf( glyphData.advance - glyph.advance ) > Math::MACHINE_EPSILON_1000 )
92 if( fabsf( glyphData.scaleFactor - glyph.scaleFactor ) > Math::MACHINE_EPSILON_1000 )
96 if( glyphData.isItalicRequired != glyph.isItalicRequired )
100 if( glyphData.isBoldRequired != glyph.isBoldRequired )
110 std::string description; ///< Description of the test.
111 std::string text; ///< input text.
112 uint32_t index; ///< The index from where to start to query the break info.
113 uint32_t numberOfCharacters; ///< The requested number of characters.
114 uint32_t expectedNumberOfGlyphs; ///< The expected number of glyphs.
115 GlyphInfoData* glyphs; ///< The glyphs.
116 CharacterIndex* characterIndices; ///< The character index for each glyph.
117 Length* charactersPerGlyph; ///< The characters per glyph.
118 uint32_t expectedNumberOfNewParagraphGlyphs; ///< The expected number of glyphs.
119 GlyphIndex* newParagraphGlyphs; ///< Indices to the new paragraphs glyphs.
120 Vector<FontDescriptionRun> fontDescriptions; ///< Fonts which is used for text.
123 bool ShapeInfoTest( const ShapeInfoData& data )
125 // 1) Create the model.
128 Size textArea(100.f, 60.f);
131 const Vector<FontDescriptionRun> fontDescriptions;
132 const LayoutOptions options;
133 CreateTextModel( data.text,
135 data.fontDescriptions,
142 LogicalModelPtr logicalModel = textModel->mLogicalModel;
143 VisualModelPtr visualModel = textModel->mVisualModel;
145 // 2) Clear the model.
147 Vector<GlyphInfo>& glyphs = visualModel->mGlyphs;
148 Vector<CharacterIndex>& glyphToCharacter = visualModel->mGlyphsToCharacters;
149 Vector<Length>& charactersPerGlyph = visualModel->mCharactersPerGlyph;
150 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
151 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
153 // Get the glyph index.
154 GlyphIndex glyphIndex = 0u;
155 if( 0u != visualModel->mCharactersToGlyph.Count() )
157 glyphIndex = *( visualModel->mCharactersToGlyph.Begin() + data.index );
159 const CharacterIndex lastCharacterIndex = data.index + data.numberOfCharacters - 1u;
160 const Length numberOfGlyphs = *( visualModel->mCharactersToGlyph.Begin() + lastCharacterIndex ) + *( visualModel->mGlyphsPerCharacter.Begin() + lastCharacterIndex ) - glyphIndex;
162 // Erase the glyph info from the text model.
163 // Got from the ShapeText() function.
164 glyphs.Erase( glyphs.Begin() + glyphIndex, glyphs.Begin() + glyphIndex + numberOfGlyphs );
165 glyphToCharacter.Erase( glyphToCharacter.Begin() + glyphIndex, glyphToCharacter.Begin() + glyphIndex + numberOfGlyphs );
166 charactersPerGlyph.Erase( charactersPerGlyph.Begin() + glyphIndex, charactersPerGlyph.Begin() + glyphIndex + numberOfGlyphs );
168 // Got from the VisualModel::CreateCharacterToGlyphTable() and the VisualModel::CreateGlyphsPerCharacterTable() methods.
169 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.index,
170 charactersToGlyph.Begin() + data.index + data.numberOfCharacters );
171 glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.index,
172 glyphsPerCharacter.Begin() + data.index + data.numberOfCharacters );
174 // Update the glyph to character indices.
175 for( Vector<CharacterIndex>::Iterator it = glyphToCharacter.Begin() + glyphIndex,
176 endIt = glyphToCharacter.End();
180 CharacterIndex& index = *it;
181 index -= data.numberOfCharacters;
186 // Reset the metrics got from the model as the ShapeText() function doesn't retrieve them.
187 for( Vector<GlyphInfo>::Iterator it = glyphs.Begin(),
188 endIt = glyphs.End();
192 GlyphInfo& info = *it;
197 info.scaleFactor = 0.f;
200 // 3) Call the ShapeText() function.
202 Vector<GlyphIndex> newParagraphGlyphs;
204 ShapeText( logicalModel->mText,
205 logicalModel->mLineBreakInfo,
206 logicalModel->mScriptRuns,
207 logicalModel->mFontRuns,
210 data.numberOfCharacters,
214 newParagraphGlyphs );
216 // Clear the advance of the new paragraph glyphs.
217 for( Vector<GlyphIndex>::Iterator it = newParagraphGlyphs.Begin(),
218 endIt = newParagraphGlyphs.End();
222 GlyphInfo& info = *( glyphs.Begin() + *it );
226 // 4) Compare the results.
228 if( data.expectedNumberOfGlyphs != glyphs.Count() )
230 std::cout << " Different number of glyphs : " << glyphs.Count() << ", expected : " << data.expectedNumberOfGlyphs << std::endl;
234 for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
236 if( !IsEqualGlyph( data.glyphs[index], glyphs[index] ) )
238 std::cout << " different glyph info, index : " << index << std::endl;
243 for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
245 if( data.characterIndices[index] != glyphToCharacter[index] )
247 std::cout << " different character index, index : " << index << std::endl;
252 for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
254 if( data.charactersPerGlyph[index] != charactersPerGlyph[index] )
256 std::cout << " different character per glyph, index : " << index << std::endl;
261 if( data.expectedNumberOfNewParagraphGlyphs != newParagraphGlyphs.Count() )
263 std::cout << " Different number of new paragraph glyphs : " << newParagraphGlyphs.Count() << ", expected : " << data.expectedNumberOfNewParagraphGlyphs << std::endl;
267 for( unsigned int index = 0u; index < data.expectedNumberOfNewParagraphGlyphs; ++index )
269 if( data.newParagraphGlyphs[index] != newParagraphGlyphs[index] )
271 std::cout << " different new paragraph glyph, index : " << index << std::endl;
281 //////////////////////////////////////////////////////////
283 int UtcDaliTextShape(void)
285 tet_infoline(" UtcDaliTextShape");
287 struct GlyphInfoData glyphs02[] =
289 { 1u, 43u, 0.f, 0.f, 0.f, 0.f, 12.f, 0.f },
290 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
291 { 1u, 79u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
292 { 1u, 79u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
293 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
294 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
295 { 1u, 90u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
296 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
297 { 1u, 85u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
298 { 1u, 79u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
299 { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
302 CharacterIndex characterIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
303 Length charactersPerGlyph02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
305 struct GlyphInfoData glyphs03[] =
307 { 1u, 43u, 0.f, 0.f, 0.f, 0.f, 12.f, 0.f },
308 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
309 { 1u, 79u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
310 { 1u, 79u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
311 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
312 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
313 { 1u, 90u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
314 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
315 { 1u, 85u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
316 { 1u, 79u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
317 { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
318 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
319 { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
320 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
321 { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
322 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
323 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
326 CharacterIndex characterIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u };
327 Length charactersPerGlyph03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
328 CharacterIndex newParagraphGlyphs03[] = { 11u, 16u };
330 struct GlyphInfoData glyphs04[] =
332 { 2u, 1733u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
333 { 2u, 1693u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
334 { 2u, 1725u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
335 { 2u, 1733u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
336 { 2u, 1721u, 0.f, 0.f, 0.f, 0.f, 20.f, 0.f },
337 { 2u, 1725u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
338 { 2u, 1733u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
339 { 2u, 1722u, 0.f, 0.f, 0.f, 0.f, 18.f, 0.f },
340 { 2u, 1725u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
341 { 2u, 1733u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
342 { 2u, 1718u, 0.f, 0.f, 0.f, 0.f, 14.f, 0.f },
343 { 2u, 1725u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
346 CharacterIndex characterIndices04[] = { 0u, 0u, 0u, 2u, 2u, 2u, 4u, 4u, 4u, 6u, 6u, 6u };
347 Length charactersPerGlyph04[] = { 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u };
349 struct GlyphInfoData glyphs05[] =
351 { 1u, 47u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
352 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
353 { 1u, 85u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
354 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
355 { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
356 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
357 { 1u, 76u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
358 { 1u, 83u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
359 { 1u, 86u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
360 { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
361 { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
362 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
363 { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
364 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
365 { 1u, 79u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
366 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
367 { 1u, 85u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
368 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
369 { 1u, 86u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
370 { 1u, 76u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
371 { 1u, 87u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
372 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
373 { 1u, 68u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
374 { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
375 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
376 { 1u, 87u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
377 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
378 { 1u, 68u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
379 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
380 { 1u, 84u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
381 { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
382 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
383 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
384 { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
385 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
386 { 1u, 5039u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
387 { 1u, 81u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
388 { 1u, 76u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
389 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
390 { 1u, 69u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
391 { 1u, 68u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
392 { 1u, 86u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
393 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
394 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
395 { 1u, 68u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
396 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
397 { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
398 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
399 { 1u, 76u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
400 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
401 { 1u, 83u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
402 { 1u, 82u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
403 { 1u, 86u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
404 { 1u, 86u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
405 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
406 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
407 { 1u, 76u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
408 { 1u, 85u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
409 { 1u, 68u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
410 { 1u, 70u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
411 { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
412 { 1u, 81u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
413 { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
414 { 1u, 76u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
415 { 1u, 68u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
416 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
417 { 1u, 81u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
418 { 1u, 72u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
419 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
420 { 1u, 70u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
421 { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
422 { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
423 { 1u, 17u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
424 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
427 CharacterIndex characterIndices05[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u,
428 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u,
429 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u,
430 30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, 40u,
431 41u, 42u, 43u, 44u, 45u, 46u, 47u, 48u, 49u, 50u,
432 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u,
433 61u, 62u, 63u, 64u, 65u, 66u, 67u, 68u, 69u, 70u,
434 71u, 72u, 73u, 74u };
435 Length charactersPerGlyph05[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
436 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
437 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
438 1u, 1u, 1u, 1u, 1u, 2u, 1u, 1u, 1u, 1u,
439 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
440 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
441 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
443 CharacterIndex newParagraphGlyphs05[] = { 26u };
444 CharacterIndex newParagraphGlyphs06[] = { 49u };
445 CharacterIndex newParagraphGlyphs07[] = { 73u };
447 struct ShapeInfoData data[] =
469 charactersPerGlyph02,
474 "Latin script. Some paragraphs.",
475 "Hello world\ndemo\n",
481 charactersPerGlyph03,
486 "Malayalam script. More glyphs than characters.",
493 charactersPerGlyph04,
498 "Latin script with some paragraphs. Update initial paragraph.",
499 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
505 charactersPerGlyph05,
510 "Latin script with some paragraphs. Update mid paragraph.",
511 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
517 charactersPerGlyph05,
522 "Latin script with some paragraphs. Update final paragraph.",
523 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
529 charactersPerGlyph05,
534 const unsigned int numberOfTests = 7u;
536 for( unsigned int index = 0u; index < numberOfTests; ++index )
538 ToolkitTestApplication application;
539 if( !ShapeInfoTest( data[index] ) )
541 tet_result(TET_FAIL);
545 tet_result(TET_PASS);
549 int UtcDaliTextSoftwareStyling(void)
551 tet_infoline(" UtcDaliTextSoftwareStyling");
553 struct GlyphInfoData glyphs01[] =
555 { 2u, 21154u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
556 { 2u, 12298u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
557 { 2u, 17828u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
559 struct GlyphInfoData glyphs02[] =
561 { 2u, 21154u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, false, false },
562 { 2u, 12298u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, false, true },
563 { 2u, 17828u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, false },
566 CharacterIndex characterIndices[] = { 0u, 1u, 2u };
567 Length charactersPerGlyph[] = { 1u, 1u, 1u };
569 Vector<FontDescriptionRun> fontDescriptions01;
570 Vector<FontDescriptionRun> fontDescriptions02;
572 FontDescriptionRun fontDescriptionRun01 =
580 TextAbstraction::FontWeight::BOLD,
581 TextAbstraction::FontWidth::NONE,
582 TextAbstraction::FontSlant::ITALIC,
583 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
590 fontDescriptions01.PushBack(fontDescriptionRun01);
592 FontDescriptionRun fontDescriptionRun02 =
600 TextAbstraction::FontWeight::NONE,
601 TextAbstraction::FontWidth::NONE,
602 TextAbstraction::FontSlant::NONE,
603 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
610 FontDescriptionRun fontDescriptionRun03 =
618 TextAbstraction::FontWeight::BOLD,
619 TextAbstraction::FontWidth::NONE,
620 TextAbstraction::FontSlant::NONE,
621 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
628 FontDescriptionRun fontDescriptionRun04 =
636 TextAbstraction::FontWeight::NONE,
637 TextAbstraction::FontWidth::NONE,
638 TextAbstraction::FontSlant::ITALIC,
639 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
647 fontDescriptions02.PushBack(fontDescriptionRun02);
648 fontDescriptions02.PushBack(fontDescriptionRun03);
649 fontDescriptions02.PushBack(fontDescriptionRun04);
652 struct ShapeInfoData data[] =
655 "Chiness script. Characters have same font description",
668 "Chiness script. Each character has different font description.",
682 const unsigned int numberOfTests = 2u;
684 for( unsigned int index = 0u; index < numberOfTests; ++index )
686 ToolkitTestApplication application;
687 if( !ShapeInfoTest( data[index] ) )
689 tet_result(TET_FAIL);
693 tet_result(TET_PASS);