2 * Copyright (c) 2021 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.
22 #include <dali-toolkit/internal/text/shaper.h>
23 #include <dali-toolkit-test-suite-utils.h>
24 #include <dali-toolkit/dali-toolkit.h>
25 #include <toolkit-text-utils.h>
28 using namespace Toolkit;
31 // Tests the following function.
32 // void ShapeText( const Vector<Character>& text,
33 // const Vector<LineBreakInfo>& lineBreakInfo,
34 // const Vector<ScriptRun>& scripts,
35 // const Vector<FontRun>& fonts,
36 // CharacterIndex startCharacterIndex,
37 // GlyphIndex startGlyphIndex,
38 // Length numberOfCharacters,
39 // Vector<GlyphInfo>& glyphs,
40 // Vector<CharacterIndex>& glyphToCharacterMap,
41 // Vector<Length>& charactersPerGlyph,
42 // Vector<GlyphIndex>& newParagraphGlyphs );
44 //////////////////////////////////////////////////////////
48 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
52 FontId fontId; ///< Identifies the font containing the glyph
53 GlyphIndex index; ///< Uniquely identifies a glyph for a given FontId
54 float width; ///< The width of the glyph
55 float height; ///< The height of the glyph
56 float xBearing; ///< The distance from the cursor position to the leftmost border of the glyph
57 float yBearing; ///< The distance from the baseline to the topmost border of the glyph
58 float advance; ///< The distance to move the cursor for this glyph
59 float scaleFactor; ///< The scaling applied (fixed-size fonts only)
60 bool isItalicRequired; ///< Whether the italic style is required.
61 bool isBoldRequired; ///< Whether the bold style is required.
64 bool IsEqualGlyph ( const GlyphInfoData& glyphData, const GlyphInfo& glyph )
66 if( glyphData.fontId != glyph.fontId )
70 if( glyphData.index != glyph.index )
74 if( fabsf( glyphData.width - glyph.width ) > Math::MACHINE_EPSILON_1000 )
78 if( fabsf( glyphData.height - glyph.height ) > Math::MACHINE_EPSILON_1000 )
82 if( fabsf( glyphData.xBearing - glyph.xBearing ) > Math::MACHINE_EPSILON_1000 )
86 if( fabsf( glyphData.yBearing - glyph.yBearing ) > Math::MACHINE_EPSILON_1000 )
90 if( fabsf( glyphData.advance - floor(glyph.advance) ) > Math::MACHINE_EPSILON_1000 )
94 if( fabsf( glyphData.scaleFactor - glyph.scaleFactor ) > Math::MACHINE_EPSILON_1000 )
98 if( glyphData.isItalicRequired != glyph.isItalicRequired )
102 if( glyphData.isBoldRequired != glyph.isBoldRequired )
112 std::string description; ///< Description of the test.
113 std::string text; ///< input text.
114 uint32_t index; ///< The index from where to start to query the break info.
115 uint32_t numberOfCharacters; ///< The requested number of characters.
116 uint32_t expectedNumberOfGlyphs; ///< The expected number of glyphs.
117 GlyphInfoData* glyphs; ///< The glyphs.
118 CharacterIndex* characterIndices; ///< The character index for each glyph.
119 Length* charactersPerGlyph; ///< The characters per glyph.
120 uint32_t expectedNumberOfNewParagraphGlyphs; ///< The expected number of glyphs.
121 GlyphIndex* newParagraphGlyphs; ///< Indices to the new paragraphs glyphs.
122 bool markupProcessorEnabled; //< Enable markup processor to use markup text.
123 Vector<FontDescriptionRun> fontDescriptions; ///< Fonts which is used for text.
126 bool ShapeInfoTest( const ShapeInfoData& data )
128 // 1) Create the model.
131 Size textArea(100.f, 60.f);
134 const Vector<FontDescriptionRun> fontDescriptions;
135 const LayoutOptions options;
137 CreateTextModel( data.text,
139 data.fontDescriptions,
144 data.markupProcessorEnabled,
147 Toolkit::DevelText::EllipsisPosition::END,
150 LogicalModelPtr logicalModel = textModel->mLogicalModel;
151 VisualModelPtr visualModel = textModel->mVisualModel;
153 // 2) Clear the model.
155 Vector<GlyphInfo>& glyphs = visualModel->mGlyphs;
156 Vector<CharacterIndex>& glyphToCharacter = visualModel->mGlyphsToCharacters;
157 Vector<Length>& charactersPerGlyph = visualModel->mCharactersPerGlyph;
158 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
159 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
161 // Get the glyph index.
162 GlyphIndex glyphIndex = 0u;
163 if( 0u != visualModel->mCharactersToGlyph.Count() )
165 glyphIndex = *( visualModel->mCharactersToGlyph.Begin() + data.index );
167 const CharacterIndex lastCharacterIndex = data.index + data.numberOfCharacters - 1u;
168 const Length numberOfGlyphs = *( visualModel->mCharactersToGlyph.Begin() + lastCharacterIndex ) + *( visualModel->mGlyphsPerCharacter.Begin() + lastCharacterIndex ) - glyphIndex;
170 // Erase the glyph info from the text model.
171 // Got from the ShapeText() function.
172 glyphs.Erase( glyphs.Begin() + glyphIndex, glyphs.Begin() + glyphIndex + numberOfGlyphs );
173 glyphToCharacter.Erase( glyphToCharacter.Begin() + glyphIndex, glyphToCharacter.Begin() + glyphIndex + numberOfGlyphs );
174 charactersPerGlyph.Erase( charactersPerGlyph.Begin() + glyphIndex, charactersPerGlyph.Begin() + glyphIndex + numberOfGlyphs );
176 // Got from the VisualModel::CreateCharacterToGlyphTable() and the VisualModel::CreateGlyphsPerCharacterTable() methods.
177 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.index,
178 charactersToGlyph.Begin() + data.index + data.numberOfCharacters );
179 glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.index,
180 glyphsPerCharacter.Begin() + data.index + data.numberOfCharacters );
182 // Update the glyph to character indices.
183 for( Vector<CharacterIndex>::Iterator it = glyphToCharacter.Begin() + glyphIndex,
184 endIt = glyphToCharacter.End();
188 CharacterIndex& index = *it;
189 index -= data.numberOfCharacters;
194 // Reset the metrics got from the model as the ShapeText() function doesn't retrieve them.
195 for( Vector<GlyphInfo>::Iterator it = glyphs.Begin(),
196 endIt = glyphs.End();
200 GlyphInfo& info = *it;
205 info.scaleFactor = 0.f;
208 // 3) Call the ShapeText() function.
210 Vector<GlyphIndex> newParagraphGlyphs;
212 ShapeText( logicalModel->mText,
213 logicalModel->mLineBreakInfo,
214 logicalModel->mScriptRuns,
215 logicalModel->mFontRuns,
218 data.numberOfCharacters,
222 newParagraphGlyphs );
224 // Clear the advance of the new paragraph glyphs.
225 for( Vector<GlyphIndex>::Iterator it = newParagraphGlyphs.Begin(),
226 endIt = newParagraphGlyphs.End();
230 GlyphInfo& info = *( glyphs.Begin() + *it );
234 // 4) Compare the results.
236 if( data.expectedNumberOfGlyphs != glyphs.Count() )
238 std::cout << " Different number of glyphs : " << glyphs.Count() << ", expected : " << data.expectedNumberOfGlyphs << std::endl;
242 for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
244 if( !IsEqualGlyph( data.glyphs[index], glyphs[index] ) )
246 std::cout << " different glyph info, index : " << index << std::endl;
248 const GlyphInfo& glyphInfo = glyphs[index];
249 std::cout << " fontId : " << glyphInfo.fontId << std::endl;
250 std::cout << " index : " << glyphInfo.index << std::endl;
251 std::cout << " width : " << glyphInfo.width << std::endl;
252 std::cout << " height : " << glyphInfo.height << std::endl;
253 std::cout << " xBearing : " << glyphInfo.xBearing << std::endl;
254 std::cout << " yBearing : " << glyphInfo.yBearing << std::endl;
255 std::cout << " advance : " << floor(glyphInfo.advance) << std::endl;
256 std::cout << " scaleFactor : " << glyphInfo.scaleFactor << std::endl;
257 std::cout << " isItalicRequired : " << glyphInfo.isItalicRequired << std::endl;
258 std::cout << " isBoldRequired : " << glyphInfo.isBoldRequired << std::endl;
260 std::cout << " Expected : " << std::endl;
261 const GlyphInfoData& expectedGlyphInfo = data.glyphs[index];
262 std::cout << " fontId : " << expectedGlyphInfo.fontId << std::endl;
263 std::cout << " index : " << expectedGlyphInfo.index << std::endl;
264 std::cout << " width : " << expectedGlyphInfo.width << std::endl;
265 std::cout << " height : " << expectedGlyphInfo.height << std::endl;
266 std::cout << " xBearing : " << expectedGlyphInfo.xBearing << std::endl;
267 std::cout << " yBearing : " << expectedGlyphInfo.yBearing << std::endl;
268 std::cout << " advance : " << expectedGlyphInfo.advance << std::endl;
269 std::cout << " scaleFactor : " << expectedGlyphInfo.scaleFactor << std::endl;
270 std::cout << " isItalicRequired : " << expectedGlyphInfo.isItalicRequired << std::endl;
271 std::cout << " isBoldRequired : " << expectedGlyphInfo.isBoldRequired << std::endl;
278 for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
280 if( data.characterIndices[index] != glyphToCharacter[index] )
282 std::cout << " different character index, index : " << index << std::endl;
287 for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
289 if( data.charactersPerGlyph[index] != charactersPerGlyph[index] )
291 std::cout << " different character per glyph, index : " << index << std::endl;
296 if( data.expectedNumberOfNewParagraphGlyphs != newParagraphGlyphs.Count() )
298 std::cout << " Different number of new paragraph glyphs : " << newParagraphGlyphs.Count() << ", expected : " << data.expectedNumberOfNewParagraphGlyphs << std::endl;
302 for( unsigned int index = 0u; index < data.expectedNumberOfNewParagraphGlyphs; ++index )
304 if( data.newParagraphGlyphs[index] != newParagraphGlyphs[index] )
306 std::cout << " different new paragraph glyph, index : " << index << std::endl;
314 void LoadTextShapeFonts()
316 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
317 fontClient.SetDpi( 96u, 96u );
319 char* pathNamePtr = get_current_dir_name();
320 const std::string pathName( pathNamePtr );
323 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
324 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/noto/NotoSansMalayalam-Regular.ttf" );
327 void LoadSoftwareStylingFonts()
329 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
330 fontClient.SetDpi( 96u, 96u );
332 char* pathNamePtr = get_current_dir_name();
333 const std::string pathName( pathNamePtr );
336 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Regular.ttf" );
337 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Bold.ttf" );
338 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Italic.ttf" );
339 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-BoldItalic.ttf" );
342 void LoadEmojiFonts()
344 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
345 fontClient.ClearCache();
346 fontClient.SetDpi( 96u, 96u );
348 char* pathNamePtr = get_current_dir_name();
349 const std::string pathName( pathNamePtr );
353 TextAbstraction::FontDescription fontDescriptionText;
354 fontDescriptionText.path = "";
355 fontDescriptionText.family = "DejaVuSans";
356 fontDescriptionText.width = TextAbstraction::FontWidth::NONE;
357 fontDescriptionText.weight = TextAbstraction::FontWeight::NORMAL;
358 fontDescriptionText.slant = TextAbstraction::FontSlant::NONE;
359 fontClient.GetFontId(fontDescriptionText, TextAbstraction::FontClient::DEFAULT_POINT_SIZE);
361 TextAbstraction::FontDescription fontDescriptionEmoji;
362 fontDescriptionEmoji.path = "";
363 fontDescriptionEmoji.family = "NotoColorEmoji";
364 fontDescriptionEmoji.width = TextAbstraction::FontWidth::NONE;
365 fontDescriptionEmoji.weight = TextAbstraction::FontWeight::NORMAL;
366 fontDescriptionEmoji.slant = TextAbstraction::FontSlant::NONE;
367 fontClient.GetFontId(fontDescriptionEmoji, TextAbstraction::FontClient::DEFAULT_POINT_SIZE);
372 //////////////////////////////////////////////////////////
374 int UtcDaliTextShape(void)
376 tet_infoline(" UtcDaliTextShape");
378 struct GlyphInfoData glyphs02[] =
380 { 1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f },
381 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
382 { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
383 { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
384 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
385 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
386 { 1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f },
387 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
388 { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
389 { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
390 { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
393 CharacterIndex characterIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
394 Length charactersPerGlyph02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
396 struct GlyphInfoData glyphs03[] =
398 { 1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f },
399 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
400 { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
401 { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
402 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
403 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
404 { 1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f },
405 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
406 { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
407 { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
408 { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
409 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
410 { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
411 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
412 { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
413 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
414 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
417 CharacterIndex characterIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u };
418 Length charactersPerGlyph03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
419 CharacterIndex newParagraphGlyphs03[] = { 11u, 16u };
421 struct GlyphInfoData glyphs04[] =
423 { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
424 { 2u, 27u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
425 { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
426 { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
427 { 2u, 55u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f },
428 { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
429 { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
430 { 2u, 56u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f },
431 { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
432 { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
433 { 2u, 52u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
434 { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
437 CharacterIndex characterIndices04[] = { 0u, 0u, 0u, 2u, 2u, 2u, 4u, 4u, 4u, 6u, 6u, 6u };
438 Length charactersPerGlyph04[] = { 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u };
440 struct GlyphInfoData glyphs05[] =
442 { 1u, 280u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
443 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
444 { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
445 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
446 { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
447 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
448 { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
449 { 1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
450 { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f },
451 { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
452 { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
453 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
454 { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
455 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
456 { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
457 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
458 { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
459 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
460 { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f },
461 { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
462 { 1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
463 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
464 { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
465 { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
466 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
467 { 1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f },
468 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
469 { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
470 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
471 { 1u, 311u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
472 { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
473 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
474 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
475 { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
476 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
477 { 1u, 403u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
478 { 1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
479 { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
480 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
481 { 1u, 296u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
482 { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
483 { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f },
484 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
485 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
486 { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
487 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
488 { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
489 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
490 { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
491 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
492 { 1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
493 { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
494 { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f },
495 { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f },
496 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
497 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
498 { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
499 { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f },
500 { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
501 { 1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f },
502 { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
503 { 1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
504 { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
505 { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
506 { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
507 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
508 { 1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f },
509 { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
510 { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f },
511 { 1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f },
512 { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f },
513 { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
514 { 1u, 4u, 0.f, 0.f, 0.f, 0.f, 3.f, 0.f },
515 { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f },
518 CharacterIndex characterIndices05[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u,
519 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u,
520 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u,
521 30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, 40u,
522 41u, 42u, 43u, 44u, 45u, 46u, 47u, 48u, 49u, 50u,
523 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u,
524 61u, 62u, 63u, 64u, 65u, 66u, 67u, 68u, 69u, 70u,
525 71u, 72u, 73u, 74u };
526 Length charactersPerGlyph05[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
527 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
528 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
529 1u, 1u, 1u, 1u, 1u, 2u, 1u, 1u, 1u, 1u,
530 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
531 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
532 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
534 CharacterIndex newParagraphGlyphs05[] = { 26u };
535 CharacterIndex newParagraphGlyphs06[] = { 49u };
536 CharacterIndex newParagraphGlyphs07[] = { 73u };
538 Vector<FontDescriptionRun> fontDescriptions01;
539 Vector<FontDescriptionRun> fontDescriptions02;
540 Vector<FontDescriptionRun> fontDescriptions03;
541 Vector<FontDescriptionRun> fontDescriptions04;
542 Vector<FontDescriptionRun> fontDescriptions05;
543 Vector<FontDescriptionRun> fontDescriptions06;
545 const std::string fontFamily( "TizenSans" );
546 const std::string fontFamilyMalayalam( "Noto Sans Malayalam" );
548 FontDescriptionRun fontDescriptionRun01 =
556 TextAbstraction::FontWeight::NONE,
557 TextAbstraction::FontWidth::NONE,
558 TextAbstraction::FontSlant::NONE,
559 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
566 fontDescriptionRun01.familyLength = fontFamily.size();
567 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
568 memcpy( fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength );
570 fontDescriptions01.PushBack( fontDescriptionRun01 );
572 FontDescriptionRun fontDescriptionRun02 =
580 TextAbstraction::FontWeight::NONE,
581 TextAbstraction::FontWidth::NONE,
582 TextAbstraction::FontSlant::NONE,
583 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
590 fontDescriptionRun02.familyLength = fontFamily.size();
591 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
592 memcpy( fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength );
594 fontDescriptions02.PushBack( fontDescriptionRun02 );
596 FontDescriptionRun fontDescriptionRun03 =
604 TextAbstraction::FontWeight::NONE,
605 TextAbstraction::FontWidth::NONE,
606 TextAbstraction::FontSlant::NONE,
607 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
614 fontDescriptionRun03.familyLength = fontFamilyMalayalam.size();
615 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
616 memcpy( fontDescriptionRun03.familyName, fontFamilyMalayalam.c_str(), fontDescriptionRun03.familyLength );
618 fontDescriptions03.PushBack( fontDescriptionRun03 );
620 FontDescriptionRun fontDescriptionRun04 =
628 TextAbstraction::FontWeight::NONE,
629 TextAbstraction::FontWidth::NONE,
630 TextAbstraction::FontSlant::NONE,
631 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
638 fontDescriptionRun04.familyLength = fontFamily.size();
639 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
640 memcpy( fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength );
642 fontDescriptions04.PushBack( fontDescriptionRun04 );
644 FontDescriptionRun fontDescriptionRun05 =
652 TextAbstraction::FontWeight::NONE,
653 TextAbstraction::FontWidth::NONE,
654 TextAbstraction::FontSlant::NONE,
655 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
662 fontDescriptionRun05.familyLength = fontFamily.size();
663 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
664 memcpy( fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength );
666 fontDescriptions05.PushBack( fontDescriptionRun05 );
668 FontDescriptionRun fontDescriptionRun06 =
676 TextAbstraction::FontWeight::NONE,
677 TextAbstraction::FontWidth::NONE,
678 TextAbstraction::FontSlant::NONE,
679 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
686 fontDescriptionRun06.familyLength = fontFamily.size();
687 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
688 memcpy( fontDescriptionRun06.familyName, fontFamily.c_str(), fontDescriptionRun06.familyLength );
690 fontDescriptions06.PushBack( fontDescriptionRun06 );
692 struct ShapeInfoData data[] =
715 charactersPerGlyph02,
722 "Latin script. Some paragraphs.",
723 "Hello world\ndemo\n",
729 charactersPerGlyph03,
731 newParagraphGlyphs03,
736 "Malayalam script. More glyphs than characters.",
737 "ജോസോഹോവോ",
743 charactersPerGlyph04,
750 "Latin script with some paragraphs. Update initial paragraph.",
751 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
757 charactersPerGlyph05,
759 newParagraphGlyphs05,
764 "Latin script with some paragraphs. Update mid paragraph.",
765 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
771 charactersPerGlyph05,
773 newParagraphGlyphs06,
778 "Latin script with some paragraphs. Update final paragraph.",
779 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
785 charactersPerGlyph05,
787 newParagraphGlyphs07,
792 const unsigned int numberOfTests = 7u;
794 for( unsigned int index = 0u; index < numberOfTests; ++index )
796 ToolkitTestApplication application;
797 LoadTextShapeFonts();
799 if( !ShapeInfoTest( data[index] ) )
801 tet_result(TET_FAIL);
805 tet_result(TET_PASS);
809 int UtcDaliTextSoftwareStyling(void)
811 tet_infoline(" UtcDaliTextSoftwareStyling");
813 struct GlyphInfoData glyphs01[] =
815 { 4u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true },
816 { 4u, 39u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f, true, true },
817 { 4u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true },
818 { 4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true },
820 struct GlyphInfoData glyphs02[] =
822 { 1u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, false },
823 { 2u, 39u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, true },
824 { 3u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, false },
825 { 4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true },
828 CharacterIndex characterIndices[] = { 0u, 1u, 2u, 3u };
829 Length charactersPerGlyph[] = { 1u, 1u, 1u, 1u };
831 Vector<FontDescriptionRun> fontDescriptions01;
832 Vector<FontDescriptionRun> fontDescriptions02;
834 const std::string fontFamily( "Roboto" );
836 FontDescriptionRun fontDescriptionRun01 =
844 TextAbstraction::FontWeight::BOLD,
845 TextAbstraction::FontWidth::NONE,
846 TextAbstraction::FontSlant::ITALIC,
847 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
854 fontDescriptionRun01.familyLength = fontFamily.size();
855 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
856 memcpy( fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength );
858 fontDescriptions01.PushBack(fontDescriptionRun01);
860 FontDescriptionRun fontDescriptionRun02 =
868 TextAbstraction::FontWeight::NONE,
869 TextAbstraction::FontWidth::NONE,
870 TextAbstraction::FontSlant::NONE,
871 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
878 fontDescriptionRun02.familyLength = fontFamily.size();
879 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
880 memcpy( fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength );
882 FontDescriptionRun fontDescriptionRun03 =
890 TextAbstraction::FontWeight::BOLD,
891 TextAbstraction::FontWidth::NONE,
892 TextAbstraction::FontSlant::NONE,
893 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
900 fontDescriptionRun03.familyLength = fontFamily.size();
901 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
902 memcpy( fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength );
904 FontDescriptionRun fontDescriptionRun04 =
912 TextAbstraction::FontWeight::NONE,
913 TextAbstraction::FontWidth::NONE,
914 TextAbstraction::FontSlant::ITALIC,
915 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
922 fontDescriptionRun04.familyLength = fontFamily.size();
923 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
924 memcpy( fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength );
926 FontDescriptionRun fontDescriptionRun05 =
934 TextAbstraction::FontWeight::BOLD,
935 TextAbstraction::FontWidth::NONE,
936 TextAbstraction::FontSlant::ITALIC,
937 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
944 fontDescriptionRun05.familyLength = fontFamily.size();
945 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
946 memcpy( fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength );
948 fontDescriptions02.PushBack(fontDescriptionRun02);
949 fontDescriptions02.PushBack(fontDescriptionRun03);
950 fontDescriptions02.PushBack(fontDescriptionRun04);
951 fontDescriptions02.PushBack(fontDescriptionRun05);
954 struct ShapeInfoData data[] =
957 "Latin script. Characters have same font description",
971 "Latin script. Each character has different font description.",
986 const unsigned int numberOfTests = 2u;
988 for( unsigned int index = 0u; index < numberOfTests; ++index )
990 ToolkitTestApplication application;
991 LoadSoftwareStylingFonts();
993 if( !ShapeInfoTest( data[index] ) )
995 tet_result(TET_FAIL);
999 tet_result(TET_PASS);
1004 int UtcDaliTextShapeEmojiSequences(void)
1007 ToolkitTestApplication application;
1009 tet_infoline(" UtcDaliTextShapeEmojiSequences");
1011 const std::string colorFontFamily( "NotoColorEmoji" );
1012 const std::string textFontFamily( "DejaVuSans" );
1016 //Common attributes for font Descriptions
1017 CharacterRun characterRun = {0u, 2u};
1018 FontWeight weight = TextAbstraction::FontWeight::NORMAL;
1019 FontWidth width = TextAbstraction::FontWidth::NORMAL;
1020 FontSlant slant = TextAbstraction::FontSlant::ITALIC;
1021 PointSize26Dot6 size = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
1023 bool familyDefined = true;
1024 bool weightDefined = false;
1025 bool widthDefined = false;
1026 bool slantDefined = false;
1027 bool sizeDefined = false;
1030 // variation selector 16 (Emoji)
1031 struct GlyphInfoData glyphsVS16[] =
1033 { 2u, 74u, 0.f, 0.f, 0.f, 0.f, 39.0f, 0.f, false, false },
1035 CharacterIndex characterIndicesVS16[] = { 0u, 1u};
1036 Length charactersPerGlyphVS16[] = { 2u };
1040 // variation selector 15 (Text)
1041 struct GlyphInfoData glyphsVS15[] =
1043 { 1u, 3842u, 0.f, 0.f, 0.f, 0.f, 14.0f, 0.f, false, false },
1044 { 1u, 8203u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, false, false },
1046 CharacterIndex characterIndicesVS15[] = { 0u, 0u};
1047 Length charactersPerGlyphVS15[] = { 0u, 2u };
1050 Vector<FontDescriptionRun> fontDescriptionsColorVS16 =
1051 CreateSingleFontDescription (characterRun, colorFontFamily, weight, width,
1052 slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
1054 Vector<FontDescriptionRun> fontDescriptionsColorVS15 =
1055 CreateSingleFontDescription (characterRun, colorFontFamily, weight, width,
1056 slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
1058 Vector<FontDescriptionRun> fontDescriptionsTextVS16 =
1059 CreateSingleFontDescription (characterRun, textFontFamily, weight, width,
1060 slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
1062 Vector<FontDescriptionRun> fontDescriptionsTextVS15 =
1063 CreateSingleFontDescription (characterRun, textFontFamily, weight, width,
1064 slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
1067 struct ShapeInfoData data[] =
1070 "EMOJI Sequence: Color Font with VS16",
1076 characterIndicesVS16,
1077 charactersPerGlyphVS16,
1081 fontDescriptionsColorVS16
1084 "EMOJI Sequence: Color Font with VS15",
1090 characterIndicesVS15,
1091 charactersPerGlyphVS15,
1095 fontDescriptionsColorVS15
1098 "EMOJI Sequence: Text Font with VS16",
1104 characterIndicesVS16,
1105 charactersPerGlyphVS16,
1109 fontDescriptionsTextVS16
1112 "EMOJI Sequence: Text Font with VS15",
1118 characterIndicesVS15,
1119 charactersPerGlyphVS15,
1123 fontDescriptionsTextVS15
1127 const unsigned int numberOfTests = 4u;
1129 for( unsigned int index = 0u; index < numberOfTests; ++index )
1131 tet_infoline( data[index].description.c_str());
1132 if( !ShapeInfoTest( data[index] ) )
1134 tet_result(TET_FAIL);
1138 tet_result(TET_PASS);