2 * Copyright (c) 2022 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-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali-toolkit/internal/text/shaper.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,
149 0.0f // characterSpacing
152 LogicalModelPtr logicalModel = textModel->mLogicalModel;
153 VisualModelPtr visualModel = textModel->mVisualModel;
155 // 2) Clear the model.
157 Vector<GlyphInfo>& glyphs = visualModel->mGlyphs;
158 Vector<CharacterIndex>& glyphToCharacter = visualModel->mGlyphsToCharacters;
159 Vector<Length>& charactersPerGlyph = visualModel->mCharactersPerGlyph;
160 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
161 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
163 // Get the glyph index.
164 GlyphIndex glyphIndex = 0u;
165 if(0u != visualModel->mCharactersToGlyph.Count())
167 glyphIndex = *(visualModel->mCharactersToGlyph.Begin() + data.index);
169 const CharacterIndex lastCharacterIndex = data.index + data.numberOfCharacters - 1u;
170 const Length numberOfGlyphs = *(visualModel->mCharactersToGlyph.Begin() + lastCharacterIndex) + *(visualModel->mGlyphsPerCharacter.Begin() + lastCharacterIndex) - glyphIndex;
172 // Erase the glyph info from the text model.
173 // Got from the ShapeText() function.
174 glyphs.Erase(glyphs.Begin() + glyphIndex, glyphs.Begin() + glyphIndex + numberOfGlyphs);
175 glyphToCharacter.Erase(glyphToCharacter.Begin() + glyphIndex, glyphToCharacter.Begin() + glyphIndex + numberOfGlyphs);
176 charactersPerGlyph.Erase(charactersPerGlyph.Begin() + glyphIndex, charactersPerGlyph.Begin() + glyphIndex + numberOfGlyphs);
178 // Got from the VisualModel::CreateCharacterToGlyphTable() and the VisualModel::CreateGlyphsPerCharacterTable() methods.
179 charactersToGlyph.Erase(charactersToGlyph.Begin() + data.index,
180 charactersToGlyph.Begin() + data.index + data.numberOfCharacters);
181 glyphsPerCharacter.Erase(glyphsPerCharacter.Begin() + data.index,
182 glyphsPerCharacter.Begin() + data.index + data.numberOfCharacters);
184 // Update the glyph to character indices.
185 for(Vector<CharacterIndex>::Iterator it = glyphToCharacter.Begin() + glyphIndex,
186 endIt = glyphToCharacter.End();
190 CharacterIndex& index = *it;
191 index -= data.numberOfCharacters;
195 // Reset the metrics got from the model as the ShapeText() function doesn't retrieve them.
196 for(Vector<GlyphInfo>::Iterator it = glyphs.Begin(),
197 endIt = glyphs.End();
201 GlyphInfo& info = *it;
206 info.scaleFactor = 0.f;
209 // 3) Call the ShapeText() function.
211 Vector<GlyphIndex> newParagraphGlyphs;
213 ShapeText(logicalModel->mText,
214 logicalModel->mLineBreakInfo,
215 logicalModel->mScriptRuns,
216 logicalModel->mFontRuns,
219 data.numberOfCharacters,
225 // Clear the advance of the new paragraph glyphs.
226 for(Vector<GlyphIndex>::Iterator it = newParagraphGlyphs.Begin(),
227 endIt = newParagraphGlyphs.End();
231 GlyphInfo& info = *(glyphs.Begin() + *it);
235 // 4) Compare the results.
237 if(data.expectedNumberOfGlyphs != glyphs.Count())
239 std::cout << " Different number of glyphs : " << glyphs.Count() << ", expected : " << data.expectedNumberOfGlyphs << std::endl;
243 for(unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index)
245 if(!IsEqualGlyph(data.glyphs[index], glyphs[index]))
247 std::cout << " different glyph info, index : " << index << std::endl;
249 const GlyphInfo& glyphInfo = glyphs[index];
250 std::cout << " fontId : " << glyphInfo.fontId << std::endl;
251 std::cout << " index : " << glyphInfo.index << std::endl;
252 std::cout << " width : " << glyphInfo.width << std::endl;
253 std::cout << " height : " << glyphInfo.height << std::endl;
254 std::cout << " xBearing : " << glyphInfo.xBearing << std::endl;
255 std::cout << " yBearing : " << glyphInfo.yBearing << std::endl;
256 std::cout << " advance : " << floor(glyphInfo.advance) << std::endl;
257 std::cout << " scaleFactor : " << glyphInfo.scaleFactor << std::endl;
258 std::cout << " isItalicRequired : " << glyphInfo.isItalicRequired << std::endl;
259 std::cout << " isBoldRequired : " << glyphInfo.isBoldRequired << std::endl;
261 std::cout << " Expected : " << std::endl;
262 const GlyphInfoData& expectedGlyphInfo = data.glyphs[index];
263 std::cout << " fontId : " << expectedGlyphInfo.fontId << std::endl;
264 std::cout << " index : " << expectedGlyphInfo.index << std::endl;
265 std::cout << " width : " << expectedGlyphInfo.width << std::endl;
266 std::cout << " height : " << expectedGlyphInfo.height << std::endl;
267 std::cout << " xBearing : " << expectedGlyphInfo.xBearing << std::endl;
268 std::cout << " yBearing : " << expectedGlyphInfo.yBearing << std::endl;
269 std::cout << " advance : " << expectedGlyphInfo.advance << std::endl;
270 std::cout << " scaleFactor : " << expectedGlyphInfo.scaleFactor << std::endl;
271 std::cout << " isItalicRequired : " << expectedGlyphInfo.isItalicRequired << std::endl;
272 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);
352 TextAbstraction::FontDescription fontDescriptionText;
353 fontDescriptionText.path = "";
354 fontDescriptionText.family = "DejaVuSans";
355 fontDescriptionText.width = TextAbstraction::FontWidth::NONE;
356 fontDescriptionText.weight = TextAbstraction::FontWeight::NORMAL;
357 fontDescriptionText.slant = TextAbstraction::FontSlant::NONE;
358 fontClient.GetFontId(fontDescriptionText, TextAbstraction::FontClient::DEFAULT_POINT_SIZE);
360 TextAbstraction::FontDescription fontDescriptionEmoji;
361 fontDescriptionEmoji.path = "";
362 fontDescriptionEmoji.family = "NotoColorEmoji";
363 fontDescriptionEmoji.width = TextAbstraction::FontWidth::NONE;
364 fontDescriptionEmoji.weight = TextAbstraction::FontWeight::NORMAL;
365 fontDescriptionEmoji.slant = TextAbstraction::FontSlant::NONE;
366 fontClient.GetFontId(fontDescriptionEmoji, TextAbstraction::FontClient::DEFAULT_POINT_SIZE);
371 //////////////////////////////////////////////////////////
373 int UtcDaliTextShape(void)
375 tet_infoline(" UtcDaliTextShape");
377 struct GlyphInfoData glyphs02[] =
379 {1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f},
380 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
381 {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
382 {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
383 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
384 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
385 {1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f},
386 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
387 {1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f},
388 {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
389 {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
392 CharacterIndex characterIndices02[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u};
393 Length charactersPerGlyph02[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u};
395 struct GlyphInfoData glyphs03[] =
397 {1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f},
398 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
399 {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
400 {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
401 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
402 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
403 {1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f},
404 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
405 {1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f},
406 {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
407 {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
408 {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
409 {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
410 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
411 {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f},
412 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
413 {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
416 CharacterIndex characterIndices03[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u};
417 Length charactersPerGlyph03[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u};
418 CharacterIndex newParagraphGlyphs03[] = {11u, 16u};
420 struct GlyphInfoData glyphs04[] =
422 {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
423 {2u, 27u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f},
424 {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
425 {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
426 {2u, 55u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f},
427 {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
428 {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
429 {2u, 56u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f},
430 {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
431 {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
432 {2u, 52u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f},
433 {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
436 CharacterIndex characterIndices04[] = {0u, 0u, 0u, 2u, 2u, 2u, 4u, 4u, 4u, 6u, 6u, 6u};
437 Length charactersPerGlyph04[] = {0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u};
439 struct GlyphInfoData glyphs05[] =
441 {1u, 280u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
442 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
443 {1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f},
444 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
445 {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f},
446 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
447 {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
448 {1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
449 {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f},
450 {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
451 {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f},
452 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
453 {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
454 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
455 {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
456 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
457 {1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f},
458 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
459 {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f},
460 {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
461 {1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f},
462 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
463 {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
464 {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f},
465 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
466 {1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f},
467 {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
468 {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
469 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
470 {1u, 311u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
471 {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
472 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
473 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
474 {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
475 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
476 {1u, 403u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
477 {1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
478 {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
479 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
480 {1u, 296u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
481 {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
482 {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f},
483 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
484 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
485 {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
486 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
487 {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f},
488 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
489 {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
490 {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
491 {1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
492 {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
493 {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f},
494 {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f},
495 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
496 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
497 {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
498 {1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f},
499 {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
500 {1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f},
501 {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
502 {1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
503 {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
504 {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
505 {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
506 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
507 {1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f},
508 {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
509 {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f},
510 {1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f},
511 {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f},
512 {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f},
513 {1u, 4u, 0.f, 0.f, 0.f, 0.f, 3.f, 0.f},
514 {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f},
517 CharacterIndex characterIndices05[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, 72u, 73u, 74u};
518 Length charactersPerGlyph05[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u};
519 CharacterIndex newParagraphGlyphs05[] = {26u};
520 CharacterIndex newParagraphGlyphs06[] = {49u};
521 CharacterIndex newParagraphGlyphs07[] = {73u};
523 Vector<FontDescriptionRun> fontDescriptions01;
524 Vector<FontDescriptionRun> fontDescriptions02;
525 Vector<FontDescriptionRun> fontDescriptions03;
526 Vector<FontDescriptionRun> fontDescriptions04;
527 Vector<FontDescriptionRun> fontDescriptions05;
528 Vector<FontDescriptionRun> fontDescriptions06;
530 const std::string fontFamily("TizenSans");
531 const std::string fontFamilyMalayalam("Noto Sans Malayalam");
533 FontDescriptionRun fontDescriptionRun01 =
539 TextAbstraction::FontWeight::NONE,
540 TextAbstraction::FontWidth::NONE,
541 TextAbstraction::FontSlant::NONE,
542 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
548 fontDescriptionRun01.familyLength = fontFamily.size();
549 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
550 memcpy(fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength);
552 fontDescriptions01.PushBack(fontDescriptionRun01);
554 FontDescriptionRun fontDescriptionRun02 =
560 TextAbstraction::FontWeight::NONE,
561 TextAbstraction::FontWidth::NONE,
562 TextAbstraction::FontSlant::NONE,
563 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
569 fontDescriptionRun02.familyLength = fontFamily.size();
570 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
571 memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength);
573 fontDescriptions02.PushBack(fontDescriptionRun02);
575 FontDescriptionRun fontDescriptionRun03 =
581 TextAbstraction::FontWeight::NONE,
582 TextAbstraction::FontWidth::NONE,
583 TextAbstraction::FontSlant::NONE,
584 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
590 fontDescriptionRun03.familyLength = fontFamilyMalayalam.size();
591 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
592 memcpy(fontDescriptionRun03.familyName, fontFamilyMalayalam.c_str(), fontDescriptionRun03.familyLength);
594 fontDescriptions03.PushBack(fontDescriptionRun03);
596 FontDescriptionRun fontDescriptionRun04 =
602 TextAbstraction::FontWeight::NONE,
603 TextAbstraction::FontWidth::NONE,
604 TextAbstraction::FontSlant::NONE,
605 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
611 fontDescriptionRun04.familyLength = fontFamily.size();
612 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
613 memcpy(fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength);
615 fontDescriptions04.PushBack(fontDescriptionRun04);
617 FontDescriptionRun fontDescriptionRun05 =
623 TextAbstraction::FontWeight::NONE,
624 TextAbstraction::FontWidth::NONE,
625 TextAbstraction::FontSlant::NONE,
626 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
632 fontDescriptionRun05.familyLength = fontFamily.size();
633 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
634 memcpy(fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength);
636 fontDescriptions05.PushBack(fontDescriptionRun05);
638 FontDescriptionRun fontDescriptionRun06 =
644 TextAbstraction::FontWeight::NONE,
645 TextAbstraction::FontWidth::NONE,
646 TextAbstraction::FontSlant::NONE,
647 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
653 fontDescriptionRun06.familyLength = fontFamily.size();
654 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
655 memcpy(fontDescriptionRun06.familyName, fontFamily.c_str(), fontDescriptionRun06.familyLength);
657 fontDescriptions06.PushBack(fontDescriptionRun06);
659 struct ShapeInfoData data[] =
681 charactersPerGlyph02,
686 {"Latin script. Some paragraphs.",
687 "Hello world\ndemo\n",
693 charactersPerGlyph03,
695 newParagraphGlyphs03,
698 {"Malayalam script. More glyphs than characters.",
699 "ജോസോഹോവോ",
705 charactersPerGlyph04,
711 "Latin script with some paragraphs. Update initial paragraph.",
712 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
718 charactersPerGlyph05,
720 newParagraphGlyphs05,
724 {"Latin script with some paragraphs. Update mid paragraph.",
725 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
731 charactersPerGlyph05,
733 newParagraphGlyphs06,
736 {"Latin script with some paragraphs. Update final paragraph.",
737 "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
743 charactersPerGlyph05,
745 newParagraphGlyphs07,
749 const unsigned int numberOfTests = 7u;
751 for(unsigned int index = 0u; index < numberOfTests; ++index)
753 ToolkitTestApplication application;
754 LoadTextShapeFonts();
756 if(!ShapeInfoTest(data[index]))
758 tet_result(TET_FAIL);
762 tet_result(TET_PASS);
766 int UtcDaliTextSoftwareStyling(void)
768 tet_infoline(" UtcDaliTextSoftwareStyling");
770 struct GlyphInfoData glyphs01[] =
772 {4u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true},
773 {4u, 39u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f, true, true},
774 {4u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true},
775 {4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true},
777 struct GlyphInfoData glyphs02[] =
779 {1u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, false},
780 {2u, 39u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, true},
781 {3u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, false},
782 {4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true},
785 CharacterIndex characterIndices[] = {0u, 1u, 2u, 3u};
786 Length charactersPerGlyph[] = {1u, 1u, 1u, 1u};
788 Vector<FontDescriptionRun> fontDescriptions01;
789 Vector<FontDescriptionRun> fontDescriptions02;
791 const std::string fontFamily("Roboto");
793 FontDescriptionRun fontDescriptionRun01 =
799 TextAbstraction::FontWeight::BOLD,
800 TextAbstraction::FontWidth::NONE,
801 TextAbstraction::FontSlant::ITALIC,
802 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
808 fontDescriptionRun01.familyLength = fontFamily.size();
809 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
810 memcpy(fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength);
812 fontDescriptions01.PushBack(fontDescriptionRun01);
814 FontDescriptionRun fontDescriptionRun02 =
820 TextAbstraction::FontWeight::NONE,
821 TextAbstraction::FontWidth::NONE,
822 TextAbstraction::FontSlant::NONE,
823 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
829 fontDescriptionRun02.familyLength = fontFamily.size();
830 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
831 memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength);
833 FontDescriptionRun fontDescriptionRun03 =
839 TextAbstraction::FontWeight::BOLD,
840 TextAbstraction::FontWidth::NONE,
841 TextAbstraction::FontSlant::NONE,
842 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
848 fontDescriptionRun03.familyLength = fontFamily.size();
849 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
850 memcpy(fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength);
852 FontDescriptionRun fontDescriptionRun04 =
858 TextAbstraction::FontWeight::NONE,
859 TextAbstraction::FontWidth::NONE,
860 TextAbstraction::FontSlant::ITALIC,
861 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
867 fontDescriptionRun04.familyLength = fontFamily.size();
868 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
869 memcpy(fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength);
871 FontDescriptionRun fontDescriptionRun05 =
877 TextAbstraction::FontWeight::BOLD,
878 TextAbstraction::FontWidth::NONE,
879 TextAbstraction::FontSlant::ITALIC,
880 TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
886 fontDescriptionRun05.familyLength = fontFamily.size();
887 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
888 memcpy(fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength);
890 fontDescriptions02.PushBack(fontDescriptionRun02);
891 fontDescriptions02.PushBack(fontDescriptionRun03);
892 fontDescriptions02.PushBack(fontDescriptionRun04);
893 fontDescriptions02.PushBack(fontDescriptionRun05);
895 struct ShapeInfoData data[] =
897 {"Latin script. Characters have same font description",
909 {"Latin script. Each character has different font description.",
920 fontDescriptions02}};
922 const unsigned int numberOfTests = 2u;
924 for(unsigned int index = 0u; index < numberOfTests; ++index)
926 ToolkitTestApplication application;
927 LoadSoftwareStylingFonts();
929 if(!ShapeInfoTest(data[index]))
931 tet_result(TET_FAIL);
935 tet_result(TET_PASS);
939 int UtcDaliTextShapeEmojiSequences(void)
941 ToolkitTestApplication application;
943 tet_infoline(" UtcDaliTextShapeEmojiSequences");
945 const std::string colorFontFamily("NotoColorEmoji");
946 const std::string textFontFamily("DejaVuSans");
950 //Common attributes for font Descriptions
951 CharacterRun characterRun = {0u, 2u};
952 FontWeight weight = TextAbstraction::FontWeight::NORMAL;
953 FontWidth width = TextAbstraction::FontWidth::NORMAL;
954 FontSlant slant = TextAbstraction::FontSlant::ITALIC;
955 PointSize26Dot6 size = TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
957 bool familyDefined = true;
958 bool weightDefined = false;
959 bool widthDefined = false;
960 bool slantDefined = false;
961 bool sizeDefined = false;
963 // variation selector 16 (Emoji)
964 struct GlyphInfoData glyphsVS16[] =
966 {2u, 74u, 0.f, 0.f, 0.f, 0.f, 39.0f, 0.f, false, false},
968 CharacterIndex characterIndicesVS16[] = {0u, 1u};
969 Length charactersPerGlyphVS16[] = {2u};
971 // variation selector 15 (Text)
972 struct GlyphInfoData glyphsVS15[] =
974 {1u, 3842u, 0.f, 0.f, 0.f, 0.f, 14.0f, 0.f, false, false},
975 {1u, 8203u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, false, false},
977 CharacterIndex characterIndicesVS15[] = {0u, 0u};
978 Length charactersPerGlyphVS15[] = {0u, 2u};
981 Vector<FontDescriptionRun> fontDescriptionsColorVS16 =
982 CreateSingleFontDescription(characterRun, colorFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
984 Vector<FontDescriptionRun> fontDescriptionsColorVS15 =
985 CreateSingleFontDescription(characterRun, colorFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
987 Vector<FontDescriptionRun> fontDescriptionsTextVS16 =
988 CreateSingleFontDescription(characterRun, textFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
990 Vector<FontDescriptionRun> fontDescriptionsTextVS15 =
991 CreateSingleFontDescription(characterRun, textFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined);
993 struct ShapeInfoData data[] =
995 {"EMOJI Sequence: Color Font with VS16",
1001 characterIndicesVS16,
1002 charactersPerGlyphVS16,
1006 fontDescriptionsColorVS16},
1007 {"EMOJI Sequence: Color Font with VS15",
1013 characterIndicesVS15,
1014 charactersPerGlyphVS15,
1018 fontDescriptionsColorVS15},
1019 {"EMOJI Sequence: Text Font with VS16",
1025 characterIndicesVS16,
1026 charactersPerGlyphVS16,
1030 fontDescriptionsTextVS16},
1031 {"EMOJI Sequence: Text Font with VS15",
1037 characterIndicesVS15,
1038 charactersPerGlyphVS15,
1042 fontDescriptionsTextVS15},
1045 const unsigned int numberOfTests = 4u;
1047 for(unsigned int index = 0u; index < numberOfTests; ++index)
1049 tet_infoline(data[index].description.c_str());
1050 if(!ShapeInfoTest(data[index]))
1052 tet_result(TET_FAIL);
1056 tet_result(TET_PASS);