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/layouts/layout-engine.h>
23 #include <dali-toolkit/internal/text/layouts/layout-parameters.h>
24 #include <dali-toolkit/internal/text/text-run-container.h>
25 #include <dali-toolkit-test-suite-utils.h>
26 #include <dali-toolkit/dali-toolkit.h>
27 #include <toolkit-text-utils.h>
30 using namespace Toolkit;
33 // Tests the LayoutEngine methods.
35 //////////////////////////////////////////////////////////
40 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
44 std::string description;
47 unsigned int numberOfFonts;
48 FontDescriptionRun* fontDescriptions;
50 unsigned int totalNumberOfGlyphs;
52 unsigned int numberOfLines;
54 Layout::Engine::Type layout;
55 unsigned int startIndex;
56 unsigned int numberOfGlyphs;
58 DevelText::EllipsisPosition::Type ellipsisPosition;
62 void Print( const LineRun& line )
64 std::cout << " glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl;
65 std::cout << " character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl;
66 std::cout << " width : " << floor(line.width) << std::endl;
67 std::cout << " ascender : " << line.ascender << std::endl;
68 std::cout << " descender : " << line.descender << std::endl;
69 std::cout << " extraLength : " << line.extraLength << std::endl;
70 std::cout << " alignmentOffset : " << line.alignmentOffset << std::endl;
71 std::cout << " direction : " << line.direction << std::endl;
72 std::cout << " ellipsis : " << line.ellipsis << std::endl;
75 bool LayoutTextTest( const LayoutTextData& data )
78 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
79 fontClient.SetDpi( 96u, 96u );
81 char* pathNamePtr = get_current_dir_name();
82 const std::string pathName( pathNamePtr );
85 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
86 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
87 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
88 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHindiRegular.ttf" );
90 // 1) Create the model.
95 Vector<FontDescriptionRun> fontDescriptionRuns;
96 if( 0u != data.numberOfFonts )
98 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
99 data.fontDescriptions,
100 data.fontDescriptions + data.numberOfFonts );
103 LayoutOptions options;
104 options.align = false;
105 CreateTextModel( data.text,
115 Toolkit::DevelText::EllipsisPosition::END );
117 LogicalModelPtr logicalModel = textModel->mLogicalModel;
118 VisualModelPtr visualModel = textModel->mVisualModel;
120 // 2) Clear the layout.
121 Vector<LineRun>& lines = visualModel->mLines;
123 const Length numberOfCharacters = logicalModel->mText.Count();
124 const bool isLastNewParagraph = ( 0u == numberOfCharacters ) ? false : TextAbstraction::IsNewParagraph( *( logicalModel->mText.Begin() + ( numberOfCharacters - 1u ) ) );
125 const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u;
126 const bool removeLastLine = isLastNewParagraph && ( lastGlyphIndex + 1u == visualModel->mGlyphs.Count() );
128 LineIndex startRemoveIndex = 0u;
130 if( 0u != lines.Count() )
132 startRemoveIndex = lines.Count();
133 LineIndex endRemoveIndex = startRemoveIndex;
134 ClearGlyphRuns( data.startIndex,
135 lastGlyphIndex + ( removeLastLine ? 1u : 0u ),
140 // Update the character runs of the lines.
141 const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
142 const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin();
143 const CharacterIndex startCharacterIndex = *( glyphsToCharactersBuffer + data.startIndex );
144 const CharacterIndex lastCharacterIndex = *( glyphsToCharactersBuffer + lastGlyphIndex ) + *( charactersPerGlyph + lastGlyphIndex ) - 1u;
145 ClearCharacterRuns( startCharacterIndex,
146 lastCharacterIndex + ( removeLastLine ? 1u : 0u ),
151 lines.Erase( lines.Begin() + startRemoveIndex,
152 lines.Begin() + endRemoveIndex );
155 Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
157 glyphPositions.Erase( glyphPositions.Begin() + data.startIndex,
158 glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs );
161 Layout::Engine engine;
162 engine.SetMetrics( metrics );
163 engine.SetLayout( data.layout );
165 textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN;
166 textModel->mLineWrapMode = LineWrap::WORD;
167 textModel->mIgnoreSpacesAfterText = true;
168 Layout::Parameters layoutParameters( data.textArea,
171 layoutParameters.isLastNewParagraph = isLastNewParagraph;
173 // The initial glyph and the number of glyphs to layout.
174 layoutParameters.startGlyphIndex = data.startIndex;
175 layoutParameters.numberOfGlyphs = data.numberOfGlyphs;
176 layoutParameters.startLineIndex = startRemoveIndex;
177 layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
179 layoutSize = Vector2::ZERO;
181 bool isAutoScroll = false;
182 const bool updated = engine.LayoutText( layoutParameters,
186 data.ellipsisPosition );
188 // 4) Compare the results.
190 if( updated != data.updated )
192 std::cout << " Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
196 if( layoutSize != data.layoutSize )
198 std::cout << " Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
202 for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
204 const Vector2& position = *( glyphPositions.Begin() + index );
206 if( fabsf( std::round( position.x ) - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
208 std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
211 if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
213 std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
218 if( lines.Count() != data.numberOfLines )
220 std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
224 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
226 const LineRun& line = *( lines.Begin() + index );
227 const LineRun& expectedLine = *( data.lines + index );
229 if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex )
231 std::cout << " Different line info for line : " << index << std::endl;
233 std::cout << " expected" << std::endl;
234 Print( expectedLine );
237 if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs )
239 std::cout << " Different line info for line : " << index << std::endl;
241 std::cout << " expected" << std::endl;
242 Print( expectedLine );
246 if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex )
248 std::cout << " Different line info for line : " << index << std::endl;
250 std::cout << " expected" << std::endl;
251 Print( expectedLine );
254 if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters )
256 std::cout << " Different line info for line : " << index << std::endl;
258 std::cout << " expected" << std::endl;
259 Print( expectedLine );
263 if( fabsf( floor( line.width ) - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
265 std::cout << " Different line info for line : " << index << std::endl;
267 std::cout << " expected" << std::endl;
268 Print( expectedLine );
272 if( fabsf( line.ascender - expectedLine.ascender ) > Math::MACHINE_EPSILON_1 )
274 std::cout << " Different line info for line : " << index << std::endl;
276 std::cout << " expected" << std::endl;
277 Print( expectedLine );
281 if( fabsf( line.descender - expectedLine.descender ) > Math::MACHINE_EPSILON_1 )
283 std::cout << " Different line info for line : " << index << std::endl;
285 std::cout << " expected" << std::endl;
286 Print( expectedLine );
290 if( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 )
292 std::cout << " Different line info for line : " << index << std::endl;
294 std::cout << " expected" << std::endl;
295 Print( expectedLine );
299 if( line.ellipsis != expectedLine.ellipsis )
301 std::cout << " Different line info for line : " << index << std::endl;
303 std::cout << " expected" << std::endl;
304 Print( expectedLine );
308 // Do not compare the alignment offset as it's not calculated in the layout.
309 // Do not compare the line direction as it's not set in the layout.
315 //////////////////////////////////////////////////////////
319 std::string description;
322 unsigned int numberOfFonts;
323 FontDescriptionRun* fontDescriptions;
324 Text::HorizontalAlignment::Type horizontalAlignment;
325 Text::VerticalAlignment::Type verticalAlignment;
326 unsigned int startIndex;
327 unsigned int numberOfCharacters;
328 unsigned int numberOfLines;
330 Dali::LayoutDirection::Type layoutDirection;
331 bool matchSystemLanguageDirection;
334 bool AlignTest( const AlignData& data )
337 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
338 fontClient.SetDpi( 96u, 96u );
340 char* pathNamePtr = get_current_dir_name();
341 const std::string pathName( pathNamePtr );
344 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
345 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
346 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
348 // 1) Create the model.
353 Vector<FontDescriptionRun> fontDescriptionRuns;
354 if( 0u != data.numberOfFonts )
356 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
357 data.fontDescriptions,
358 data.fontDescriptions + data.numberOfFonts );
361 LayoutOptions options;
362 options.align = false;
363 CreateTextModel( data.text,
373 Toolkit::DevelText::EllipsisPosition::END );
375 LogicalModelPtr logicalModel = textModel->mLogicalModel;
376 VisualModelPtr visualModel = textModel->mVisualModel;
378 // Call the Align method.
379 Layout::Engine engine;
380 engine.SetMetrics( metrics );
382 float alignmentOffset = 0.f;
383 engine.Align( data.textArea,
385 data.numberOfCharacters,
386 data.horizontalAlignment,
389 data.layoutDirection,
390 data.matchSystemLanguageDirection );
393 if( data.numberOfLines != visualModel->mLines.Count() )
395 std::cout << " Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
399 const LineRun* const linesBuffer = visualModel->mLines.Begin();
400 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
402 const LineRun& line = *( linesBuffer + index );
404 if( line.alignmentOffset != *( data.lineOffsets + index ) )
406 std::cout << " different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl;
415 //////////////////////////////////////////////////////////
417 // UtcDaliTextLayoutSetGetLayout
418 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
419 // UtcDaliTextLayoutSetGetHorizontalAlignment
420 // UtcDaliTextLayoutSetGetVerticalAlignment
421 // UtcDaliTextLayoutSetGetCursorWidth
422 // UtcDaliTextLayoutNoText
423 // UtcDaliTextLayoutSmallTextArea01
424 // UtcDaliTextLayoutSmallTextArea02
425 // UtcDaliTextLayoutMultilineText01
426 // UtcDaliTextLayoutMultilineText02
427 // UtcDaliTextLayoutMultilineText03
428 // UtcDaliTextLayoutMultilineText04
429 // UtcDaliTextLayoutMultilineText05
430 // UtcDaliTextLayoutMultilineText06
431 // UtcDaliTextUpdateLayout01
432 // UtcDaliTextUpdateLayout02
433 // UtcDaliTextUpdateLayout03
434 // UtcDaliTextLayoutEllipsis01
435 // UtcDaliTextLayoutEllipsis02
436 // UtcDaliTextLayoutEllipsis03
437 // UtcDaliTextLayoutEllipsis04
438 // UtcDaliTextLayoutEllipsis04
439 // UtcDaliTextReorderLayout01
440 // UtcDaliTextReorderLayout02
441 // UtcDaliTextReorderLayout03
442 // UtcDaliTextReorderLayout04
443 // UtcDaliTextAlign01
444 // UtcDaliTextAlign02
445 // UtcDaliTextAlign03
446 // UtcDaliTextAlign04
447 // UtcDaliTextAlign05
448 // UtcDaliTextAlign06
449 // UtcDaliTextAlign07
450 // UtcDaliTextAlign08
451 // UtcDaliTextAlign09
453 //////////////////////////////////////////////////////////
455 int UtcDaliTextLayoutSetGetLayout(void)
457 ToolkitTestApplication application;
458 tet_infoline(" UtcDaliTextLayoutSetGetLayout");
460 Layout::Engine engine;
462 DALI_TEST_CHECK( Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout() );
464 engine.SetLayout( Layout::Engine::MULTI_LINE_BOX );
465 DALI_TEST_CHECK( Layout::Engine::MULTI_LINE_BOX == engine.GetLayout() );
467 tet_result(TET_PASS);
471 int UtcDaliTextLayoutSetGetCursorWidth(void)
473 ToolkitTestApplication application;
476 Layout::Engine engine;
478 DALI_TEST_EQUALS( 0, engine.GetCursorWidth(), TEST_LOCATION );
480 engine.SetCursorWidth( 2 );
481 DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
483 tet_result(TET_PASS);
487 int UtcDaliTextLayoutNoText(void)
489 ToolkitTestApplication application;
490 tet_infoline(" UtcDaliTextLayoutNoText");
492 Size textArea(100.f, 60.f);
493 Size layoutSize = Vector2::ZERO;
494 LayoutTextData data =
506 Layout::Engine::MULTI_LINE_BOX,
510 DevelText::EllipsisPosition::END,
514 if( !LayoutTextTest( data ) )
516 tet_result(TET_FAIL);
519 tet_result(TET_PASS);
523 int UtcDaliTextLayoutSmallTextArea01(void)
525 ToolkitTestApplication application;
526 tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
528 // Won't layout the text in multi-line if the width is too small.
530 const std::string fontFamily( "TizenSans" );
532 // Set a known font description
533 FontDescriptionRun fontDescriptionRun;
534 fontDescriptionRun.characterRun.characterIndex = 0u;
535 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
536 fontDescriptionRun.familyLength = fontFamily.size();
537 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
538 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
539 fontDescriptionRun.familyDefined = true;
540 fontDescriptionRun.weightDefined = false;
541 fontDescriptionRun.widthDefined = false;
542 fontDescriptionRun.slantDefined = false;
543 fontDescriptionRun.sizeDefined = false;
545 Vector<FontDescriptionRun> fontDescriptionRuns;
546 fontDescriptionRuns.PushBack( fontDescriptionRun );
547 Size textArea(1.f, 1.f);
548 Size layoutSize = Vector2::ZERO;
549 LayoutTextData data =
551 "Layout text in a small area",
555 fontDescriptionRuns.Begin(),
561 Layout::Engine::MULTI_LINE_BOX,
565 DevelText::EllipsisPosition::END,
569 if( !LayoutTextTest( data ) )
571 tet_result(TET_FAIL);
574 tet_result(TET_PASS);
578 int UtcDaliTextLayoutSmallTextArea02(void)
580 ToolkitTestApplication application;
581 tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
583 // Will layout the text in single line as it can be scrolled.
585 const std::string fontFamily( "TizenSans" );
587 // Set a known font description
588 FontDescriptionRun fontDescriptionRun;
589 fontDescriptionRun.characterRun.characterIndex = 0u;
590 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
591 fontDescriptionRun.familyLength = fontFamily.size();
592 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
593 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
594 fontDescriptionRun.familyDefined = true;
595 fontDescriptionRun.weightDefined = false;
596 fontDescriptionRun.widthDefined = false;
597 fontDescriptionRun.slantDefined = false;
598 fontDescriptionRun.sizeDefined = false;
600 Vector<FontDescriptionRun> fontDescriptionRuns;
601 fontDescriptionRuns.PushBack( fontDescriptionRun );
602 Size textArea(1.f, 1.f);
603 Size layoutSize(81.f, 19.f);
604 float positions[] = { 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f };
605 struct LineRun line =
618 Vector<LineRun> lines;
619 lines.PushBack( line );
621 LayoutTextData data =
623 "Layout text in a small area",
627 fontDescriptionRuns.Begin(),
633 Layout::Engine::SINGLE_LINE_BOX,
637 DevelText::EllipsisPosition::END,
641 if( !LayoutTextTest( data ) )
643 tet_result(TET_FAIL);
646 tet_result(TET_PASS);
650 int UtcDaliTextLayoutMultilineText01(void)
652 ToolkitTestApplication application;
653 tet_infoline(" UtcDaliTextLayoutMultilineText01");
655 // Layout some lines of left to right text.
657 const std::string fontFamily( "TizenSans" );
659 // Set a known font description
660 FontDescriptionRun fontDescriptionRun1;
661 fontDescriptionRun1.characterRun.characterIndex = 0u;
662 fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
663 fontDescriptionRun1.familyLength = fontFamily.size();
664 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
665 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
666 fontDescriptionRun1.familyDefined = true;
667 fontDescriptionRun1.weightDefined = false;
668 fontDescriptionRun1.widthDefined = false;
669 fontDescriptionRun1.slantDefined = false;
670 fontDescriptionRun1.sizeDefined = false;
672 FontDescriptionRun fontDescriptionRun2;
673 fontDescriptionRun2.characterRun.characterIndex = 18u;
674 fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
675 fontDescriptionRun2.familyLength = fontFamily.size();
676 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
677 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
678 fontDescriptionRun2.familyDefined = true;
679 fontDescriptionRun2.weightDefined = false;
680 fontDescriptionRun2.widthDefined = false;
681 fontDescriptionRun2.slantDefined = false;
682 fontDescriptionRun2.sizeDefined = false;
684 Vector<FontDescriptionRun> fontDescriptionRuns;
685 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
686 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
687 Size textArea(100.f, 300.f);
688 Size layoutSize(97.f, 95.f);
691 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f,
692 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, 45.f, -12.f,
693 0.f, -12.f, 9.f, -9.f, 18.f, -9.f, 28.f, -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f,
694 0.f, -12.f, 10.f, -12.f, 15.f, -12.f, 26.f, -9.f, 35.f, -9.f, 42.f, -9.f, 52.f, -9.f, 61.f, -11.f, 67.f, -0.f,
695 0.f, -12.f, 4.f, -12.f, 9.f, -9.f, 19.f, -9.f, 29.f, -9.f, 36.f, -0.f, 42.f, -9.f, 52.f, -12.f, 57.f, -0.f, 62.f, -11.f, 69.f, -9.f, 79.f, -9.f, 87.f, -11.f, 95.f, -2.f
697 struct LineRun line0 =
710 struct LineRun line1 =
723 struct LineRun line2 =
736 struct LineRun line3 =
749 struct LineRun line4 =
762 Vector<LineRun> lines;
763 lines.PushBack( line0 );
764 lines.PushBack( line1 );
765 lines.PushBack( line2 );
766 lines.PushBack( line3 );
767 lines.PushBack( line4 );
769 LayoutTextData data =
771 "Layout simple multi-line text",
772 "Hello world demo.\n"
773 "Layout different lines of text.",
776 fontDescriptionRuns.Begin(),
782 Layout::Engine::MULTI_LINE_BOX,
786 DevelText::EllipsisPosition::END,
790 if( !LayoutTextTest( data ) )
792 tet_result(TET_FAIL);
795 tet_result(TET_PASS);
799 int UtcDaliTextLayoutMultilineText02(void)
801 ToolkitTestApplication application;
802 tet_infoline(" UtcDaliTextLayoutMultilineText02");
804 // Layout some lines of bidirectional text.
806 const std::string fontFamily1( "TizenSans" );
808 // Set a known font description
809 FontDescriptionRun fontDescriptionRun1;
810 fontDescriptionRun1.characterRun.characterIndex = 0u;
811 fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
812 fontDescriptionRun1.familyLength = fontFamily1.size();
813 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
814 memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength );
815 fontDescriptionRun1.familyDefined = true;
816 fontDescriptionRun1.weightDefined = false;
817 fontDescriptionRun1.widthDefined = false;
818 fontDescriptionRun1.slantDefined = false;
819 fontDescriptionRun1.sizeDefined = false;
821 const std::string fontFamily2( "TizenSansHebrew" );
823 // Set a known font description
824 FontDescriptionRun fontDescriptionRun2;
825 fontDescriptionRun2.characterRun.characterIndex = 17u;
826 fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
827 fontDescriptionRun2.familyLength = fontFamily2.size();
828 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
829 memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
830 fontDescriptionRun2.familyDefined = true;
831 fontDescriptionRun2.weightDefined = false;
832 fontDescriptionRun2.widthDefined = false;
833 fontDescriptionRun2.slantDefined = false;
834 fontDescriptionRun2.sizeDefined = false;
836 const std::string fontFamily3( "TizenSans" );
838 // Set a known font description
839 FontDescriptionRun fontDescriptionRun3;
840 fontDescriptionRun3.characterRun.characterIndex = 26u;
841 fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
842 fontDescriptionRun3.familyLength = fontFamily3.size();
843 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
844 memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
845 fontDescriptionRun3.familyDefined = true;
846 fontDescriptionRun3.weightDefined = false;
847 fontDescriptionRun3.widthDefined = false;
848 fontDescriptionRun3.slantDefined = false;
849 fontDescriptionRun3.sizeDefined = false;
851 const std::string fontFamily4( "TizenSansHebrew" );
853 // Set a known font description
854 FontDescriptionRun fontDescriptionRun4;
855 fontDescriptionRun4.characterRun.characterIndex = 28u;
856 fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
857 fontDescriptionRun4.familyLength = fontFamily4.size();
858 fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
859 memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
860 fontDescriptionRun4.familyDefined = true;
861 fontDescriptionRun4.weightDefined = false;
862 fontDescriptionRun4.widthDefined = false;
863 fontDescriptionRun4.slantDefined = false;
864 fontDescriptionRun4.sizeDefined = false;
866 const std::string fontFamily5( "TizenSans" );
868 // Set a known font description
869 FontDescriptionRun fontDescriptionRun5;
870 fontDescriptionRun5.characterRun.characterIndex = 38u;
871 fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
872 fontDescriptionRun5.familyLength = fontFamily5.size();
873 fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
874 memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
875 fontDescriptionRun5.familyDefined = true;
876 fontDescriptionRun5.weightDefined = false;
877 fontDescriptionRun5.widthDefined = false;
878 fontDescriptionRun5.slantDefined = false;
879 fontDescriptionRun5.sizeDefined = false;
881 Vector<FontDescriptionRun> fontDescriptionRuns;
882 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
883 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
884 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
885 fontDescriptionRuns.PushBack( fontDescriptionRun4 );
886 fontDescriptionRuns.PushBack( fontDescriptionRun5 );
887 Size textArea(100.f, 300.f);
888 Size layoutSize(81.f, 114.f);
891 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11
892 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f, // 12 .. 21
893 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f, // 22 .. 27
894 63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 28 .. 37
895 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 38 .. 49
896 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, // 50 .. 54
898 struct LineRun line0 =
911 struct LineRun line1 =
924 struct LineRun line2 =
937 struct LineRun line3 =
950 struct LineRun line4 =
963 struct LineRun line5 =
976 Vector<LineRun> lines;
977 lines.PushBack( line0 );
978 lines.PushBack( line1 );
979 lines.PushBack( line2 );
980 lines.PushBack( line3 );
981 lines.PushBack( line4 );
982 lines.PushBack( line5 );
984 LayoutTextData data =
986 "Layout bidirectional text.",
987 "Hello world demo שלום עולם.\n"
988 "שלום עולם hello world demo.",
991 fontDescriptionRuns.Begin(),
997 Layout::Engine::MULTI_LINE_BOX,
1001 DevelText::EllipsisPosition::END,
1005 if( !LayoutTextTest( data ) )
1007 tet_result(TET_FAIL);
1010 tet_result(TET_PASS);
1014 int UtcDaliTextLayoutMultilineText03(void)
1016 ToolkitTestApplication application;
1017 tet_infoline(" UtcDaliTextLayoutMultilineText03");
1019 // Layout a long word which doesn't fit in the width of the text area.
1021 const std::string fontFamily( "TizenSans" );
1023 // Set a known font description
1024 FontDescriptionRun fontDescriptionRun;
1025 fontDescriptionRun.characterRun.characterIndex = 0u;
1026 fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1027 fontDescriptionRun.familyLength = fontFamily.size();
1028 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1029 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1030 fontDescriptionRun.familyDefined = true;
1031 fontDescriptionRun.weightDefined = false;
1032 fontDescriptionRun.widthDefined = false;
1033 fontDescriptionRun.slantDefined = false;
1034 fontDescriptionRun.sizeDefined = false;
1036 Vector<FontDescriptionRun> fontDescriptionRuns;
1037 fontDescriptionRuns.PushBack( fontDescriptionRun );
1038 Size textArea(100.f, 300.f);
1039 Size layoutSize(98.f, 57.f);
1042 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -9.f, 48.f, -9.f, 58.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -13.f, 86.f, -9.f,
1043 0.f, -9.f, 13.f, -9.f, 23.f, -13.f, 31.f, -9.f, 41.f, -13.f, 45.f, -13.f, 48.f, -9.f, 57.f, -9.f, 69.f, -9.f, 79.f, -9.f, 85.f, -13.f, 88.f, -13.f,
1044 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f,
1046 struct LineRun line0 =
1059 struct LineRun line1 =
1072 struct LineRun line2 =
1085 Vector<LineRun> lines;
1086 lines.PushBack( line0 );
1087 lines.PushBack( line1 );
1088 lines.PushBack( line2 );
1090 LayoutTextData data =
1092 "Layout a long word which doesn't fit in the width of the text area.",
1093 "Helloworlddemohelloworlddemo.",
1096 fontDescriptionRuns.Begin(),
1102 Layout::Engine::MULTI_LINE_BOX,
1106 DevelText::EllipsisPosition::END,
1110 if( !LayoutTextTest( data ) )
1112 tet_result(TET_FAIL);
1115 tet_result(TET_PASS);
1119 int UtcDaliTextLayoutMultilineText04(void)
1121 ToolkitTestApplication application;
1122 tet_infoline(" UtcDaliTextLayoutMultilineText04");
1124 // Layout simple text ending with a \n. It has to add a void line at the end.
1126 const std::string fontFamily( "TizenSans" );
1128 // Set a known font description
1129 FontDescriptionRun fontDescriptionRun;
1130 fontDescriptionRun.characterRun.characterIndex = 0u;
1131 fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1132 fontDescriptionRun.familyLength = fontFamily.size();
1133 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1134 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1135 fontDescriptionRun.familyDefined = true;
1136 fontDescriptionRun.weightDefined = false;
1137 fontDescriptionRun.widthDefined = false;
1138 fontDescriptionRun.slantDefined = false;
1139 fontDescriptionRun.sizeDefined = false;
1141 Vector<FontDescriptionRun> fontDescriptionRuns;
1142 fontDescriptionRuns.PushBack( fontDescriptionRun );
1143 Size textArea(100.f, 300.f);
1144 Size layoutSize(84.f, 38.f);
1147 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -2.f, 85.f, -12.f
1149 struct LineRun line0 =
1161 struct LineRun line1 =
1174 Vector<LineRun> lines;
1175 lines.PushBack( line0 );
1176 lines.PushBack( line1 );
1178 LayoutTextData data =
1180 "Layout simple text ending with a \n.",
1184 fontDescriptionRuns.Begin(),
1190 Layout::Engine::MULTI_LINE_BOX,
1194 DevelText::EllipsisPosition::END,
1198 if( !LayoutTextTest( data ) )
1200 tet_result(TET_FAIL);
1203 tet_result(TET_PASS);
1207 int UtcDaliTextLayoutMultilineText05(void)
1209 ToolkitTestApplication application;
1210 tet_infoline(" UtcDaliTextLayoutMultilineText05");
1212 // Layout simple text with one character with a different font size.
1214 const std::string fontFamily( "TizenSans" );
1216 // Set a known font description
1217 FontDescriptionRun fontDescriptionRun1;
1218 fontDescriptionRun1.characterRun.characterIndex = 0u;
1219 fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1220 fontDescriptionRun1.familyLength = fontFamily.size();
1221 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1222 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1223 fontDescriptionRun1.familyDefined = true;
1224 fontDescriptionRun1.weightDefined = false;
1225 fontDescriptionRun1.widthDefined = false;
1226 fontDescriptionRun1.slantDefined = false;
1227 fontDescriptionRun1.sizeDefined = false;
1229 FontDescriptionRun fontDescriptionRun2;
1230 fontDescriptionRun2.characterRun.characterIndex = 6u;
1231 fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1232 fontDescriptionRun2.familyLength = fontFamily.size();
1233 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1234 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1235 fontDescriptionRun2.size = 1280u;
1236 fontDescriptionRun2.familyDefined = true;
1237 fontDescriptionRun2.weightDefined = false;
1238 fontDescriptionRun2.widthDefined = false;
1239 fontDescriptionRun2.slantDefined = false;
1240 fontDescriptionRun2.sizeDefined = true;
1242 FontDescriptionRun fontDescriptionRun3;
1243 fontDescriptionRun3.characterRun.characterIndex = 7u;
1244 fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1245 fontDescriptionRun3.familyLength = fontFamily.size();
1246 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1247 memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1248 fontDescriptionRun3.familyDefined = true;
1249 fontDescriptionRun3.weightDefined = false;
1250 fontDescriptionRun3.widthDefined = false;
1251 fontDescriptionRun3.slantDefined = false;
1252 fontDescriptionRun3.sizeDefined = false;
1254 Vector<FontDescriptionRun> fontDescriptionRuns;
1255 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1256 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1257 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1258 Size textArea(100.f, 300.f);
1259 Size layoutSize(89.f, 51.f);
1262 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 60.f, -9.f, 71.f, -9.f, 77.f, -13.f, 80.f, -13.f, 89.f, -0.f,
1263 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f
1265 struct LineRun line0 =
1278 struct LineRun line1 =
1291 Vector<LineRun> lines;
1292 lines.PushBack( line0 );
1293 lines.PushBack( line1 );
1295 LayoutTextData data =
1297 "Layout simple text with one character with a different font size.",
1298 "Hello world demo.",
1301 fontDescriptionRuns.Begin(),
1307 Layout::Engine::MULTI_LINE_BOX,
1311 DevelText::EllipsisPosition::END,
1315 if( !LayoutTextTest( data ) )
1317 tet_result(TET_FAIL);
1320 tet_result(TET_PASS);
1324 int UtcDaliTextLayoutMultilineText06(void)
1326 ToolkitTestApplication application;
1327 tet_infoline(" UtcDaliTextLayoutMultilineText06");
1329 const std::string fontFamily( "TizenSansHebrew" );
1331 // Set a known font description
1332 FontDescriptionRun fontDescriptionRun;
1333 fontDescriptionRun.characterRun.characterIndex = 0u;
1334 fontDescriptionRun.characterRun.numberOfCharacters = 10u;
1335 fontDescriptionRun.familyLength = fontFamily.size();
1336 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1337 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1338 fontDescriptionRun.familyDefined = true;
1339 fontDescriptionRun.weightDefined = false;
1340 fontDescriptionRun.widthDefined = false;
1341 fontDescriptionRun.slantDefined = false;
1342 fontDescriptionRun.sizeDefined = false;
1344 Vector<FontDescriptionRun> fontDescriptionRuns;
1345 fontDescriptionRuns.PushBack( fontDescriptionRun );
1347 Size textArea(64.f, 100.f);
1348 Size layoutSize(33.f, 38.f);
1351 28.f, -13.f, 18.f, -10.f, 9.f, -10.f, 4.f, -10.f, 0.f, -0.f,
1352 23.f, -10.f, 18.f, -10.f, 12.f, -10.f, 4.f, -10.f, 0.f, -10.f
1354 struct LineRun line0 =
1367 struct LineRun line1 =
1380 Vector<LineRun> lines;
1381 lines.PushBack( line0 );
1382 lines.PushBack( line1 );
1384 LayoutTextData data =
1386 "Layout right to left text that doesn't fit in the text area after reordering.",
1387 "לכאן שנורו", // If this text is laid-out ltr the width is 64. When reordered, the length is 66. This might cause alignment issues.
1390 fontDescriptionRuns.Begin(),
1396 Layout::Engine::MULTI_LINE_BOX,
1400 DevelText::EllipsisPosition::END,
1404 if( !LayoutTextTest( data ) )
1406 tet_result(TET_FAIL);
1409 tet_result(TET_PASS);
1413 int UtcDaliTextLayoutMultilineText07(void)
1415 ToolkitTestApplication application;
1416 tet_infoline(" UtcDaliTextLayoutMultilineText07");
1418 const std::string fontFamily( "TizenSansHebrew" );
1420 // Set a known font description
1421 FontDescriptionRun fontDescriptionRun;
1422 fontDescriptionRun.characterRun.characterIndex = 0u;
1423 fontDescriptionRun.characterRun.numberOfCharacters = 9u;
1424 fontDescriptionRun.familyLength = fontFamily.size();
1425 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1426 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1427 fontDescriptionRun.familyDefined = true;
1428 fontDescriptionRun.weightDefined = false;
1429 fontDescriptionRun.widthDefined = false;
1430 fontDescriptionRun.slantDefined = false;
1431 fontDescriptionRun.sizeDefined = false;
1433 Vector<FontDescriptionRun> fontDescriptionRuns;
1434 fontDescriptionRuns.PushBack( fontDescriptionRun );
1436 Size textArea(26.f, 100.f);
1437 Size layoutSize(23.f, 57.f);
1440 11.f, -10.f, 5.f, -10.f, 0.f, -10.f,
1441 12.f, -10.f, 8.f, -10.f, 0.f, -13.f,
1442 14.f, -10.f, 4.f, -10.f, 0.f, -10.f
1444 struct LineRun line0 =
1457 struct LineRun line1 =
1470 struct LineRun line2 =
1483 Vector<LineRun> lines;
1484 lines.PushBack( line0 );
1485 lines.PushBack( line1 );
1486 lines.PushBack( line2 );
1488 LayoutTextData data =
1490 "Layout a single word of right to left text that doesn't fit in one single line. When layouting ltr a piece of word fits in the line but it doesn't after reordering.",
1491 "שנורולכאן", // If a piece of this text is laid-out ltr the width is 26. When reordered, the length is 27. This might cause alignment issues.
1494 fontDescriptionRuns.Begin(),
1500 Layout::Engine::MULTI_LINE_BOX,
1504 DevelText::EllipsisPosition::END,
1508 if( !LayoutTextTest( data ) )
1510 tet_result(TET_FAIL);
1513 tet_result(TET_PASS);
1517 int UtcDaliTextUpdateLayout01(void)
1519 ToolkitTestApplication application;
1520 tet_infoline(" UtcDaliTextUpdateLayout01");
1522 // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1524 const std::string fontLatin( "TizenSans" );
1525 const std::string fontHebrew( "TizenSansHebrew" );
1526 const std::string fontArabic( "TizenSansArabic" );
1528 // Set a known font description
1529 FontDescriptionRun fontDescriptionRun01;
1530 fontDescriptionRun01.characterRun.characterIndex = 0u;
1531 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1532 fontDescriptionRun01.familyLength = fontLatin.size();
1533 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1534 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1535 fontDescriptionRun01.familyDefined = true;
1536 fontDescriptionRun01.weightDefined = false;
1537 fontDescriptionRun01.widthDefined = false;
1538 fontDescriptionRun01.slantDefined = false;
1539 fontDescriptionRun01.sizeDefined = false;
1541 // Set a known font description
1542 FontDescriptionRun fontDescriptionRun02;
1543 fontDescriptionRun02.characterRun.characterIndex = 17u;
1544 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1545 fontDescriptionRun02.familyLength = fontHebrew.size();
1546 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1547 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1548 fontDescriptionRun02.familyDefined = true;
1549 fontDescriptionRun02.weightDefined = false;
1550 fontDescriptionRun02.widthDefined = false;
1551 fontDescriptionRun02.slantDefined = false;
1552 fontDescriptionRun02.sizeDefined = false;
1554 // Set a known font description
1555 FontDescriptionRun fontDescriptionRun03;
1556 fontDescriptionRun03.characterRun.characterIndex = 26u;
1557 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1558 fontDescriptionRun03.familyLength = fontLatin.size();
1559 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1560 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1561 fontDescriptionRun03.familyDefined = true;
1562 fontDescriptionRun03.weightDefined = false;
1563 fontDescriptionRun03.widthDefined = false;
1564 fontDescriptionRun03.slantDefined = false;
1565 fontDescriptionRun03.sizeDefined = false;
1567 // Set a known font description
1568 FontDescriptionRun fontDescriptionRun04;
1569 fontDescriptionRun04.characterRun.characterIndex = 28u;
1570 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1571 fontDescriptionRun04.familyLength = fontArabic.size();
1572 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1573 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
1574 fontDescriptionRun04.familyDefined = true;
1575 fontDescriptionRun04.weightDefined = false;
1576 fontDescriptionRun04.widthDefined = false;
1577 fontDescriptionRun04.slantDefined = false;
1578 fontDescriptionRun04.sizeDefined = false;
1580 // Set a known font description
1581 FontDescriptionRun fontDescriptionRun05;
1582 fontDescriptionRun05.characterRun.characterIndex = 42u;
1583 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1584 fontDescriptionRun05.familyLength = fontLatin.size();
1585 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1586 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
1587 fontDescriptionRun05.familyDefined = true;
1588 fontDescriptionRun05.weightDefined = false;
1589 fontDescriptionRun05.widthDefined = false;
1590 fontDescriptionRun05.slantDefined = false;
1591 fontDescriptionRun05.sizeDefined = false;
1593 // Set a known font description
1594 FontDescriptionRun fontDescriptionRun06;
1595 fontDescriptionRun06.characterRun.characterIndex = 54u;
1596 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1597 fontDescriptionRun06.familyLength = fontHebrew.size();
1598 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1599 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1600 fontDescriptionRun06.familyDefined = true;
1601 fontDescriptionRun06.weightDefined = false;
1602 fontDescriptionRun06.widthDefined = false;
1603 fontDescriptionRun06.slantDefined = false;
1604 fontDescriptionRun06.sizeDefined = false;
1606 // Set a known font description
1607 FontDescriptionRun fontDescriptionRun07;
1608 fontDescriptionRun07.characterRun.characterIndex = 64u;
1609 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1610 fontDescriptionRun07.familyLength = fontHebrew.size();
1611 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1612 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
1613 fontDescriptionRun07.familyDefined = true;
1614 fontDescriptionRun07.weightDefined = false;
1615 fontDescriptionRun07.widthDefined = false;
1616 fontDescriptionRun07.slantDefined = false;
1617 fontDescriptionRun07.sizeDefined = false;
1619 // Set a known font description
1620 FontDescriptionRun fontDescriptionRun08;
1621 fontDescriptionRun08.characterRun.characterIndex = 74u;
1622 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1623 fontDescriptionRun08.familyLength = fontLatin.size();
1624 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1625 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1626 fontDescriptionRun08.familyDefined = true;
1627 fontDescriptionRun08.weightDefined = false;
1628 fontDescriptionRun08.widthDefined = false;
1629 fontDescriptionRun08.slantDefined = false;
1630 fontDescriptionRun08.sizeDefined = false;
1632 // Set a known font description
1633 FontDescriptionRun fontDescriptionRun09;
1634 fontDescriptionRun09.characterRun.characterIndex = 92u;
1635 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1636 fontDescriptionRun09.familyLength = fontLatin.size();
1637 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1638 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
1639 fontDescriptionRun09.familyDefined = true;
1640 fontDescriptionRun09.weightDefined = false;
1641 fontDescriptionRun09.widthDefined = false;
1642 fontDescriptionRun09.slantDefined = false;
1643 fontDescriptionRun09.sizeDefined = false;
1645 // Set a known font description
1646 FontDescriptionRun fontDescriptionRun10;
1647 fontDescriptionRun10.characterRun.characterIndex = 104u;
1648 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1649 fontDescriptionRun10.familyLength = fontArabic.size();
1650 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1651 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
1652 fontDescriptionRun10.familyDefined = true;
1653 fontDescriptionRun10.weightDefined = false;
1654 fontDescriptionRun10.widthDefined = false;
1655 fontDescriptionRun10.slantDefined = false;
1656 fontDescriptionRun10.sizeDefined = false;
1658 // Set a known font description
1659 FontDescriptionRun fontDescriptionRun11;
1660 fontDescriptionRun11.characterRun.characterIndex = 118u;
1661 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1662 fontDescriptionRun11.familyLength = fontHebrew.size();
1663 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1664 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
1665 fontDescriptionRun11.familyDefined = true;
1666 fontDescriptionRun11.weightDefined = false;
1667 fontDescriptionRun11.widthDefined = false;
1668 fontDescriptionRun11.slantDefined = false;
1669 fontDescriptionRun11.sizeDefined = false;
1671 // Set a known font description
1672 FontDescriptionRun fontDescriptionRun12;
1673 fontDescriptionRun12.characterRun.characterIndex = 128u;
1674 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1675 fontDescriptionRun12.familyLength = fontLatin.size();
1676 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1677 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
1678 fontDescriptionRun12.familyDefined = true;
1679 fontDescriptionRun12.weightDefined = false;
1680 fontDescriptionRun12.widthDefined = false;
1681 fontDescriptionRun12.slantDefined = false;
1682 fontDescriptionRun12.sizeDefined = false;
1684 // Set a known font description
1685 FontDescriptionRun fontDescriptionRun13;
1686 fontDescriptionRun13.characterRun.characterIndex = 145u;
1687 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1688 fontDescriptionRun13.familyLength = fontHebrew.size();
1689 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1690 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1691 fontDescriptionRun13.familyDefined = true;
1692 fontDescriptionRun13.weightDefined = false;
1693 fontDescriptionRun13.widthDefined = false;
1694 fontDescriptionRun13.slantDefined = false;
1695 fontDescriptionRun13.sizeDefined = false;
1697 // Set a known font description
1698 FontDescriptionRun fontDescriptionRun14;
1699 fontDescriptionRun14.characterRun.characterIndex = 154u;
1700 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1701 fontDescriptionRun14.familyLength = fontLatin.size();
1702 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1703 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1704 fontDescriptionRun14.familyDefined = true;
1705 fontDescriptionRun14.weightDefined = false;
1706 fontDescriptionRun14.widthDefined = false;
1707 fontDescriptionRun14.slantDefined = false;
1708 fontDescriptionRun14.sizeDefined = false;
1710 // Set a known font description
1711 FontDescriptionRun fontDescriptionRun15;
1712 fontDescriptionRun15.characterRun.characterIndex = 156u;
1713 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1714 fontDescriptionRun15.familyLength = fontHebrew.size();
1715 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1716 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
1717 fontDescriptionRun15.familyDefined = true;
1718 fontDescriptionRun15.weightDefined = false;
1719 fontDescriptionRun15.widthDefined = false;
1720 fontDescriptionRun15.slantDefined = false;
1721 fontDescriptionRun15.sizeDefined = false;
1723 // Set a known font description
1724 FontDescriptionRun fontDescriptionRun16;
1725 fontDescriptionRun16.characterRun.characterIndex = 166u;
1726 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1727 fontDescriptionRun16.familyLength = fontLatin.size();
1728 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
1729 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
1730 fontDescriptionRun16.familyDefined = true;
1731 fontDescriptionRun16.weightDefined = false;
1732 fontDescriptionRun16.widthDefined = false;
1733 fontDescriptionRun16.slantDefined = false;
1734 fontDescriptionRun16.sizeDefined = false;
1736 // Set a known font description
1737 FontDescriptionRun fontDescriptionRun17;
1738 fontDescriptionRun17.characterRun.characterIndex = 178u;
1739 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1740 fontDescriptionRun17.familyLength = fontArabic.size();
1741 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
1742 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
1743 fontDescriptionRun17.familyDefined = true;
1744 fontDescriptionRun17.weightDefined = false;
1745 fontDescriptionRun17.widthDefined = false;
1746 fontDescriptionRun17.slantDefined = false;
1747 fontDescriptionRun17.sizeDefined = false;
1749 Vector<FontDescriptionRun> fontDescriptionRuns;
1750 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1751 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1752 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1753 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1754 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1755 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1756 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1757 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1758 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1759 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1760 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1761 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1762 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1763 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1764 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1765 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
1766 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
1767 Size textArea(100.f, 300.f);
1768 Size layoutSize(100.f, 361.f);
1771 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11
1772 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f, // 12 .. 21
1773 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f, // 22 .. 27
1774 58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, // 28 .. 47
1775 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 45.f, -10.f, 36.f, -10.f, 31.f, -0.f, // 48 .. 58
1776 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63
1777 63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 64 .. 73
1778 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 74 .. 85
1779 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f, // 86 .. 91
1780 0.f, -13.f, 8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f, // 92 .. 103
1781 91.f, -8.f, 85.f, -6.f, 78.f, -8.f, 74.f, -7.f, 72.f, -11.f, 67.f, -0.f, 63.f, -7.f, 61.f, -11.f, 56.f, -11.f, 49.f, -8.f, 48.f, -11.f, 42.f, -11.f, 37.f, -8.f, 33.f, -0.f, 23.f, -10.f, 14.f, -13.f, 9.f, -10.f, 0.f, -10.f, 98.f, -0.f, // 104 .. 122
1782 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f, // 123 .. 127
1783 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 128 .. 139
1784 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f, // 140 .. 149
1785 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f, // 150 .. 155
1786 63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 156 .. 165
1787 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 166 .. 177
1788 54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f, // 178 .. 191
1791 struct LineRun line01 =
1804 struct LineRun line02 =
1817 struct LineRun line03 =
1830 struct LineRun line04 =
1843 struct LineRun line05 =
1856 struct LineRun line06 =
1869 struct LineRun line07 =
1882 struct LineRun line08 =
1895 struct LineRun line09 =
1908 struct LineRun line10 =
1921 struct LineRun line11 =
1934 struct LineRun line12 =
1947 struct LineRun line13 =
1960 struct LineRun line14 =
1973 struct LineRun line15 =
1986 struct LineRun line16 =
1999 struct LineRun line17 =
2012 struct LineRun line18 =
2025 struct LineRun line19 =
2038 Vector<LineRun> lines;
2039 lines.PushBack( line01 );
2040 lines.PushBack( line02 );
2041 lines.PushBack( line03 );
2042 lines.PushBack( line04 );
2043 lines.PushBack( line05 );
2044 lines.PushBack( line06 );
2045 lines.PushBack( line07 );
2046 lines.PushBack( line08 );
2047 lines.PushBack( line09 );
2048 lines.PushBack( line10 );
2049 lines.PushBack( line11 );
2050 lines.PushBack( line12 );
2051 lines.PushBack( line13 );
2052 lines.PushBack( line14 );
2053 lines.PushBack( line15 );
2054 lines.PushBack( line16 );
2055 lines.PushBack( line17 );
2056 lines.PushBack( line18 );
2057 lines.PushBack( line19 );
2059 LayoutTextData data =
2061 "Layout bidirectional text.",
2062 "Hello world demo שלום עולם.\n"
2063 "مرحبا بالعالم hello world שלום עולם\n"
2064 "שלום עולם hello world demo.\n"
2065 "hello world مرحبا بالعالم שלום עולם\n"
2066 "Hello world demo שלום עולם.\n"
2067 "שלום עולם hello world مرحبا بالعالم\n",
2070 fontDescriptionRuns.Begin(),
2076 Layout::Engine::MULTI_LINE_BOX,
2080 DevelText::EllipsisPosition::END,
2084 if( !LayoutTextTest( data ) )
2086 tet_result(TET_FAIL);
2089 tet_result(TET_PASS);
2093 int UtcDaliTextUpdateLayout02(void)
2095 ToolkitTestApplication application;
2096 tet_infoline(" UtcDaliTextUpdateLayout02");
2098 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2100 const std::string fontLatin( "TizenSans" );
2101 const std::string fontHebrew( "TizenSansHebrew" );
2102 const std::string fontArabic( "TizenSansArabic" );
2104 // Set a known font description
2105 FontDescriptionRun fontDescriptionRun01;
2106 fontDescriptionRun01.characterRun.characterIndex = 0u;
2107 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2108 fontDescriptionRun01.familyLength = fontLatin.size();
2109 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2110 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2111 fontDescriptionRun01.familyDefined = true;
2112 fontDescriptionRun01.weightDefined = false;
2113 fontDescriptionRun01.widthDefined = false;
2114 fontDescriptionRun01.slantDefined = false;
2115 fontDescriptionRun01.sizeDefined = false;
2117 // Set a known font description
2118 FontDescriptionRun fontDescriptionRun02;
2119 fontDescriptionRun02.characterRun.characterIndex = 17u;
2120 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2121 fontDescriptionRun02.familyLength = fontHebrew.size();
2122 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2123 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2124 fontDescriptionRun02.familyDefined = true;
2125 fontDescriptionRun02.weightDefined = false;
2126 fontDescriptionRun02.widthDefined = false;
2127 fontDescriptionRun02.slantDefined = false;
2128 fontDescriptionRun02.sizeDefined = false;
2130 // Set a known font description
2131 FontDescriptionRun fontDescriptionRun03;
2132 fontDescriptionRun03.characterRun.characterIndex = 26u;
2133 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2134 fontDescriptionRun03.familyLength = fontLatin.size();
2135 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2136 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2137 fontDescriptionRun03.familyDefined = true;
2138 fontDescriptionRun03.weightDefined = false;
2139 fontDescriptionRun03.widthDefined = false;
2140 fontDescriptionRun03.slantDefined = false;
2141 fontDescriptionRun03.sizeDefined = false;
2143 // Set a known font description
2144 FontDescriptionRun fontDescriptionRun04;
2145 fontDescriptionRun04.characterRun.characterIndex = 28u;
2146 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2147 fontDescriptionRun04.familyLength = fontArabic.size();
2148 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2149 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2150 fontDescriptionRun04.familyDefined = true;
2151 fontDescriptionRun04.weightDefined = false;
2152 fontDescriptionRun04.widthDefined = false;
2153 fontDescriptionRun04.slantDefined = false;
2154 fontDescriptionRun04.sizeDefined = false;
2156 // Set a known font description
2157 FontDescriptionRun fontDescriptionRun05;
2158 fontDescriptionRun05.characterRun.characterIndex = 42u;
2159 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2160 fontDescriptionRun05.familyLength = fontLatin.size();
2161 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2162 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2163 fontDescriptionRun05.familyDefined = true;
2164 fontDescriptionRun05.weightDefined = false;
2165 fontDescriptionRun05.widthDefined = false;
2166 fontDescriptionRun05.slantDefined = false;
2167 fontDescriptionRun05.sizeDefined = false;
2169 // Set a known font description
2170 FontDescriptionRun fontDescriptionRun06;
2171 fontDescriptionRun06.characterRun.characterIndex = 54u;
2172 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2173 fontDescriptionRun06.familyLength = fontHebrew.size();
2174 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2175 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2176 fontDescriptionRun06.familyDefined = true;
2177 fontDescriptionRun06.weightDefined = false;
2178 fontDescriptionRun06.widthDefined = false;
2179 fontDescriptionRun06.slantDefined = false;
2180 fontDescriptionRun06.sizeDefined = false;
2182 // Set a known font description
2183 FontDescriptionRun fontDescriptionRun07;
2184 fontDescriptionRun07.characterRun.characterIndex = 64u;
2185 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2186 fontDescriptionRun07.familyLength = fontHebrew.size();
2187 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2188 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2189 fontDescriptionRun07.familyDefined = true;
2190 fontDescriptionRun07.weightDefined = false;
2191 fontDescriptionRun07.widthDefined = false;
2192 fontDescriptionRun07.slantDefined = false;
2193 fontDescriptionRun07.sizeDefined = false;
2195 // Set a known font description
2196 FontDescriptionRun fontDescriptionRun08;
2197 fontDescriptionRun08.characterRun.characterIndex = 74u;
2198 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2199 fontDescriptionRun08.familyLength = fontLatin.size();
2200 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2201 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2202 fontDescriptionRun08.familyDefined = true;
2203 fontDescriptionRun08.weightDefined = false;
2204 fontDescriptionRun08.widthDefined = false;
2205 fontDescriptionRun08.slantDefined = false;
2206 fontDescriptionRun08.sizeDefined = false;
2208 // Set a known font description
2209 FontDescriptionRun fontDescriptionRun09;
2210 fontDescriptionRun09.characterRun.characterIndex = 92u;
2211 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2212 fontDescriptionRun09.familyLength = fontLatin.size();
2213 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2214 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2215 fontDescriptionRun09.familyDefined = true;
2216 fontDescriptionRun09.weightDefined = false;
2217 fontDescriptionRun09.widthDefined = false;
2218 fontDescriptionRun09.slantDefined = false;
2219 fontDescriptionRun09.sizeDefined = false;
2221 // Set a known font description
2222 FontDescriptionRun fontDescriptionRun10;
2223 fontDescriptionRun10.characterRun.characterIndex = 104u;
2224 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2225 fontDescriptionRun10.familyLength = fontArabic.size();
2226 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2227 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2228 fontDescriptionRun10.familyDefined = true;
2229 fontDescriptionRun10.weightDefined = false;
2230 fontDescriptionRun10.widthDefined = false;
2231 fontDescriptionRun10.slantDefined = false;
2232 fontDescriptionRun10.sizeDefined = false;
2234 // Set a known font description
2235 FontDescriptionRun fontDescriptionRun11;
2236 fontDescriptionRun11.characterRun.characterIndex = 118u;
2237 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2238 fontDescriptionRun11.familyLength = fontHebrew.size();
2239 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2240 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2241 fontDescriptionRun11.familyDefined = true;
2242 fontDescriptionRun11.weightDefined = false;
2243 fontDescriptionRun11.widthDefined = false;
2244 fontDescriptionRun11.slantDefined = false;
2245 fontDescriptionRun11.sizeDefined = false;
2247 // Set a known font description
2248 FontDescriptionRun fontDescriptionRun12;
2249 fontDescriptionRun12.characterRun.characterIndex = 128u;
2250 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2251 fontDescriptionRun12.familyLength = fontLatin.size();
2252 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2253 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2254 fontDescriptionRun12.familyDefined = true;
2255 fontDescriptionRun12.weightDefined = false;
2256 fontDescriptionRun12.widthDefined = false;
2257 fontDescriptionRun12.slantDefined = false;
2258 fontDescriptionRun12.sizeDefined = false;
2260 // Set a known font description
2261 FontDescriptionRun fontDescriptionRun13;
2262 fontDescriptionRun13.characterRun.characterIndex = 145u;
2263 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2264 fontDescriptionRun13.familyLength = fontHebrew.size();
2265 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2266 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2267 fontDescriptionRun13.familyDefined = true;
2268 fontDescriptionRun13.weightDefined = false;
2269 fontDescriptionRun13.widthDefined = false;
2270 fontDescriptionRun13.slantDefined = false;
2271 fontDescriptionRun13.sizeDefined = false;
2273 // Set a known font description
2274 FontDescriptionRun fontDescriptionRun14;
2275 fontDescriptionRun14.characterRun.characterIndex = 154u;
2276 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2277 fontDescriptionRun14.familyLength = fontLatin.size();
2278 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2279 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2280 fontDescriptionRun14.familyDefined = true;
2281 fontDescriptionRun14.weightDefined = false;
2282 fontDescriptionRun14.widthDefined = false;
2283 fontDescriptionRun14.slantDefined = false;
2284 fontDescriptionRun14.sizeDefined = false;
2286 // Set a known font description
2287 FontDescriptionRun fontDescriptionRun15;
2288 fontDescriptionRun15.characterRun.characterIndex = 156u;
2289 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2290 fontDescriptionRun15.familyLength = fontHebrew.size();
2291 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2292 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2293 fontDescriptionRun15.familyDefined = true;
2294 fontDescriptionRun15.weightDefined = false;
2295 fontDescriptionRun15.widthDefined = false;
2296 fontDescriptionRun15.slantDefined = false;
2297 fontDescriptionRun15.sizeDefined = false;
2299 // Set a known font description
2300 FontDescriptionRun fontDescriptionRun16;
2301 fontDescriptionRun16.characterRun.characterIndex = 166u;
2302 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2303 fontDescriptionRun16.familyLength = fontLatin.size();
2304 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2305 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2306 fontDescriptionRun16.familyDefined = true;
2307 fontDescriptionRun16.weightDefined = false;
2308 fontDescriptionRun16.widthDefined = false;
2309 fontDescriptionRun16.slantDefined = false;
2310 fontDescriptionRun16.sizeDefined = false;
2312 // Set a known font description
2313 FontDescriptionRun fontDescriptionRun17;
2314 fontDescriptionRun17.characterRun.characterIndex = 178u;
2315 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2316 fontDescriptionRun17.familyLength = fontArabic.size();
2317 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2318 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2319 fontDescriptionRun17.familyDefined = true;
2320 fontDescriptionRun17.weightDefined = false;
2321 fontDescriptionRun17.widthDefined = false;
2322 fontDescriptionRun17.slantDefined = false;
2323 fontDescriptionRun17.sizeDefined = false;
2325 Vector<FontDescriptionRun> fontDescriptionRuns;
2326 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2327 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2328 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2329 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2330 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2331 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2332 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2333 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2334 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2335 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2336 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2337 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2338 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2339 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2340 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2341 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2342 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2343 Size textArea(100.f, 300.f);
2344 Size layoutSize(100.f, 361.f);
2347 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11
2348 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f, // 12 .. 21
2349 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f, // 22 .. 27
2350 58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, // 28 .. 47
2351 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 45.f, -10.f, 36.f, -10.f, 31.f, -0.f, // 48 .. 58
2352 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63
2353 63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 64 .. 73
2354 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 74 .. 85
2355 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f, // 86 .. 91
2356 0.f, -13.f, 8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f, // 92 .. 103
2357 91.f, -8.f, 85.f, -6.f, 78.f, -8.f, 74.f, -7.f, 72.f, -11.f, 67.f, -0.f, 63.f, -7.f, 61.f, -11.f, 56.f, -11.f, 49.f, -8.f, 48.f, -11.f, 42.f, -11.f, 37.f, -8.f, 33.f, -0.f, 23.f, -10.f, 14.f, -13.f, 9.f, -10.f, 0.f, -10.f, 98.f, -0.f, // 104 .. 122
2358 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f, // 123 .. 127
2359 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 128 .. 139
2360 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f, // 140 .. 149
2361 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f, // 150 .. 155
2362 63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 156 .. 165
2363 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 166 .. 177
2364 54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f, // 178 .. 191
2367 struct LineRun line01 =
2380 struct LineRun line02 =
2393 struct LineRun line03 =
2406 struct LineRun line04 =
2419 struct LineRun line05 =
2432 struct LineRun line06 =
2445 struct LineRun line07 =
2458 struct LineRun line08 =
2471 struct LineRun line09 =
2484 struct LineRun line10 =
2497 struct LineRun line11 =
2510 struct LineRun line12 =
2523 struct LineRun line13 =
2536 struct LineRun line14 =
2549 struct LineRun line15 =
2562 struct LineRun line16 =
2575 struct LineRun line17 =
2588 struct LineRun line18 =
2601 struct LineRun line19 =
2614 Vector<LineRun> lines;
2615 lines.PushBack( line01 );
2616 lines.PushBack( line02 );
2617 lines.PushBack( line03 );
2618 lines.PushBack( line04 );
2619 lines.PushBack( line05 );
2620 lines.PushBack( line06 );
2621 lines.PushBack( line07 );
2622 lines.PushBack( line08 );
2623 lines.PushBack( line09 );
2624 lines.PushBack( line10 );
2625 lines.PushBack( line11 );
2626 lines.PushBack( line12 );
2627 lines.PushBack( line13 );
2628 lines.PushBack( line14 );
2629 lines.PushBack( line15 );
2630 lines.PushBack( line16 );
2631 lines.PushBack( line17 );
2632 lines.PushBack( line18 );
2633 lines.PushBack( line19 );
2635 LayoutTextData data =
2637 "Layout bidirectional text.",
2638 "Hello world demo שלום עולם.\n"
2639 "مرحبا بالعالم hello world שלום עולם\n"
2640 "שלום עולם hello world demo.\n"
2641 "hello world مرحبا بالعالم שלום עולם\n"
2642 "Hello world demo שלום עולם.\n"
2643 "שלום עולם hello world مرحبا بالعالم\n",
2646 fontDescriptionRuns.Begin(),
2652 Layout::Engine::MULTI_LINE_BOX,
2656 DevelText::EllipsisPosition::END,
2660 if( !LayoutTextTest( data ) )
2662 tet_result(TET_FAIL);
2665 tet_result(TET_PASS);
2669 int UtcDaliTextUpdateLayout03(void)
2671 ToolkitTestApplication application;
2672 tet_infoline(" UtcDaliTextUpdateLayout03");
2674 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2676 const std::string fontLatin( "TizenSans" );
2677 const std::string fontHebrew( "TizenSansHebrew" );
2678 const std::string fontArabic( "TizenSansArabic" );
2680 // Set a known font description
2681 FontDescriptionRun fontDescriptionRun01;
2682 fontDescriptionRun01.characterRun.characterIndex = 0u;
2683 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2684 fontDescriptionRun01.familyLength = fontLatin.size();
2685 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2686 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2687 fontDescriptionRun01.familyDefined = true;
2688 fontDescriptionRun01.weightDefined = false;
2689 fontDescriptionRun01.widthDefined = false;
2690 fontDescriptionRun01.slantDefined = false;
2691 fontDescriptionRun01.sizeDefined = false;
2693 // Set a known font description
2694 FontDescriptionRun fontDescriptionRun02;
2695 fontDescriptionRun02.characterRun.characterIndex = 17u;
2696 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2697 fontDescriptionRun02.familyLength = fontHebrew.size();
2698 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2699 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2700 fontDescriptionRun02.familyDefined = true;
2701 fontDescriptionRun02.weightDefined = false;
2702 fontDescriptionRun02.widthDefined = false;
2703 fontDescriptionRun02.slantDefined = false;
2704 fontDescriptionRun02.sizeDefined = false;
2706 // Set a known font description
2707 FontDescriptionRun fontDescriptionRun03;
2708 fontDescriptionRun03.characterRun.characterIndex = 26u;
2709 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2710 fontDescriptionRun03.familyLength = fontLatin.size();
2711 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2712 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2713 fontDescriptionRun03.familyDefined = true;
2714 fontDescriptionRun03.weightDefined = false;
2715 fontDescriptionRun03.widthDefined = false;
2716 fontDescriptionRun03.slantDefined = false;
2717 fontDescriptionRun03.sizeDefined = false;
2719 // Set a known font description
2720 FontDescriptionRun fontDescriptionRun04;
2721 fontDescriptionRun04.characterRun.characterIndex = 28u;
2722 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2723 fontDescriptionRun04.familyLength = fontArabic.size();
2724 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2725 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2726 fontDescriptionRun04.familyDefined = true;
2727 fontDescriptionRun04.weightDefined = false;
2728 fontDescriptionRun04.widthDefined = false;
2729 fontDescriptionRun04.slantDefined = false;
2730 fontDescriptionRun04.sizeDefined = false;
2732 // Set a known font description
2733 FontDescriptionRun fontDescriptionRun05;
2734 fontDescriptionRun05.characterRun.characterIndex = 42u;
2735 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2736 fontDescriptionRun05.familyLength = fontLatin.size();
2737 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2738 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2739 fontDescriptionRun05.familyDefined = true;
2740 fontDescriptionRun05.weightDefined = false;
2741 fontDescriptionRun05.widthDefined = false;
2742 fontDescriptionRun05.slantDefined = false;
2743 fontDescriptionRun05.sizeDefined = false;
2745 // Set a known font description
2746 FontDescriptionRun fontDescriptionRun06;
2747 fontDescriptionRun06.characterRun.characterIndex = 54u;
2748 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2749 fontDescriptionRun06.familyLength = fontHebrew.size();
2750 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2751 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2752 fontDescriptionRun06.familyDefined = true;
2753 fontDescriptionRun06.weightDefined = false;
2754 fontDescriptionRun06.widthDefined = false;
2755 fontDescriptionRun06.slantDefined = false;
2756 fontDescriptionRun06.sizeDefined = false;
2758 // Set a known font description
2759 FontDescriptionRun fontDescriptionRun07;
2760 fontDescriptionRun07.characterRun.characterIndex = 64u;
2761 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2762 fontDescriptionRun07.familyLength = fontHebrew.size();
2763 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2764 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2765 fontDescriptionRun07.familyDefined = true;
2766 fontDescriptionRun07.weightDefined = false;
2767 fontDescriptionRun07.widthDefined = false;
2768 fontDescriptionRun07.slantDefined = false;
2769 fontDescriptionRun07.sizeDefined = false;
2771 // Set a known font description
2772 FontDescriptionRun fontDescriptionRun08;
2773 fontDescriptionRun08.characterRun.characterIndex = 74u;
2774 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2775 fontDescriptionRun08.familyLength = fontLatin.size();
2776 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2777 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2778 fontDescriptionRun08.familyDefined = true;
2779 fontDescriptionRun08.weightDefined = false;
2780 fontDescriptionRun08.widthDefined = false;
2781 fontDescriptionRun08.slantDefined = false;
2782 fontDescriptionRun08.sizeDefined = false;
2784 // Set a known font description
2785 FontDescriptionRun fontDescriptionRun09;
2786 fontDescriptionRun09.characterRun.characterIndex = 92u;
2787 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2788 fontDescriptionRun09.familyLength = fontLatin.size();
2789 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2790 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2791 fontDescriptionRun09.familyDefined = true;
2792 fontDescriptionRun09.weightDefined = false;
2793 fontDescriptionRun09.widthDefined = false;
2794 fontDescriptionRun09.slantDefined = false;
2795 fontDescriptionRun09.sizeDefined = false;
2797 // Set a known font description
2798 FontDescriptionRun fontDescriptionRun10;
2799 fontDescriptionRun10.characterRun.characterIndex = 104u;
2800 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2801 fontDescriptionRun10.familyLength = fontArabic.size();
2802 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2803 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2804 fontDescriptionRun10.familyDefined = true;
2805 fontDescriptionRun10.weightDefined = false;
2806 fontDescriptionRun10.widthDefined = false;
2807 fontDescriptionRun10.slantDefined = false;
2808 fontDescriptionRun10.sizeDefined = false;
2810 // Set a known font description
2811 FontDescriptionRun fontDescriptionRun11;
2812 fontDescriptionRun11.characterRun.characterIndex = 118u;
2813 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2814 fontDescriptionRun11.familyLength = fontHebrew.size();
2815 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2816 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2817 fontDescriptionRun11.familyDefined = true;
2818 fontDescriptionRun11.weightDefined = false;
2819 fontDescriptionRun11.widthDefined = false;
2820 fontDescriptionRun11.slantDefined = false;
2821 fontDescriptionRun11.sizeDefined = false;
2823 // Set a known font description
2824 FontDescriptionRun fontDescriptionRun12;
2825 fontDescriptionRun12.characterRun.characterIndex = 128u;
2826 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2827 fontDescriptionRun12.familyLength = fontLatin.size();
2828 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2829 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2830 fontDescriptionRun12.familyDefined = true;
2831 fontDescriptionRun12.weightDefined = false;
2832 fontDescriptionRun12.widthDefined = false;
2833 fontDescriptionRun12.slantDefined = false;
2834 fontDescriptionRun12.sizeDefined = false;
2836 // Set a known font description
2837 FontDescriptionRun fontDescriptionRun13;
2838 fontDescriptionRun13.characterRun.characterIndex = 145u;
2839 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2840 fontDescriptionRun13.familyLength = fontHebrew.size();
2841 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2842 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2843 fontDescriptionRun13.familyDefined = true;
2844 fontDescriptionRun13.weightDefined = false;
2845 fontDescriptionRun13.widthDefined = false;
2846 fontDescriptionRun13.slantDefined = false;
2847 fontDescriptionRun13.sizeDefined = false;
2849 // Set a known font description
2850 FontDescriptionRun fontDescriptionRun14;
2851 fontDescriptionRun14.characterRun.characterIndex = 154u;
2852 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2853 fontDescriptionRun14.familyLength = fontLatin.size();
2854 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2855 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2856 fontDescriptionRun14.familyDefined = true;
2857 fontDescriptionRun14.weightDefined = false;
2858 fontDescriptionRun14.widthDefined = false;
2859 fontDescriptionRun14.slantDefined = false;
2860 fontDescriptionRun14.sizeDefined = false;
2862 // Set a known font description
2863 FontDescriptionRun fontDescriptionRun15;
2864 fontDescriptionRun15.characterRun.characterIndex = 156u;
2865 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2866 fontDescriptionRun15.familyLength = fontHebrew.size();
2867 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2868 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2869 fontDescriptionRun15.familyDefined = true;
2870 fontDescriptionRun15.weightDefined = false;
2871 fontDescriptionRun15.widthDefined = false;
2872 fontDescriptionRun15.slantDefined = false;
2873 fontDescriptionRun15.sizeDefined = false;
2875 // Set a known font description
2876 FontDescriptionRun fontDescriptionRun16;
2877 fontDescriptionRun16.characterRun.characterIndex = 166u;
2878 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2879 fontDescriptionRun16.familyLength = fontLatin.size();
2880 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2881 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2882 fontDescriptionRun16.familyDefined = true;
2883 fontDescriptionRun16.weightDefined = false;
2884 fontDescriptionRun16.widthDefined = false;
2885 fontDescriptionRun16.slantDefined = false;
2886 fontDescriptionRun16.sizeDefined = false;
2888 // Set a known font description
2889 FontDescriptionRun fontDescriptionRun17;
2890 fontDescriptionRun17.characterRun.characterIndex = 178u;
2891 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2892 fontDescriptionRun17.familyLength = fontArabic.size();
2893 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2894 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2895 fontDescriptionRun17.familyDefined = true;
2896 fontDescriptionRun17.weightDefined = false;
2897 fontDescriptionRun17.widthDefined = false;
2898 fontDescriptionRun17.slantDefined = false;
2899 fontDescriptionRun17.sizeDefined = false;
2901 Vector<FontDescriptionRun> fontDescriptionRuns;
2902 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2903 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2904 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2905 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2906 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2907 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2908 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2909 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2910 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2911 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2912 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2913 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2914 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2915 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2916 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2917 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2918 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2919 Size textArea(100.f, 300.f);
2920 Size layoutSize(100.f, 361.f);
2923 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11
2924 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f, // 12 .. 21
2925 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f, // 22 .. 27
2926 58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, // 28 .. 47
2927 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 45.f, -10.f, 36.f, -10.f, 31.f, -0.f, // 48 .. 58
2928 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63
2929 63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 64 .. 73
2930 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 74 .. 85
2931 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f, // 86 .. 91
2932 0.f, -13.f, 8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f, // 92 .. 103
2933 91.f, -8.f, 85.f, -6.f, 78.f, -8.f, 74.f, -7.f, 72.f, -11.f, 67.f, -0.f, 63.f, -7.f, 61.f, -11.f, 56.f, -11.f, 49.f, -8.f, 48.f, -11.f, 42.f, -11.f, 37.f, -8.f, 33.f, -0.f, 23.f, -10.f, 14.f, -13.f, 9.f, -10.f, 0.f, -10.f, 98.f, -0.f, // 104 .. 122
2934 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f, // 123 .. 127
2935 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 128 .. 139
2936 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f, // 140 .. 149
2937 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f, // 150 .. 155
2938 63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 156 .. 165
2939 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 166 .. 177
2940 54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f, // 178 .. 191
2943 struct LineRun line01 =
2956 struct LineRun line02 =
2969 struct LineRun line03 =
2982 struct LineRun line04 =
2995 struct LineRun line05 =
3008 struct LineRun line06 =
3021 struct LineRun line07 =
3034 struct LineRun line08 =
3047 struct LineRun line09 =
3060 struct LineRun line10 =
3073 struct LineRun line11 =
3086 struct LineRun line12 =
3099 struct LineRun line13 =
3112 struct LineRun line14 =
3125 struct LineRun line15 =
3138 struct LineRun line16 =
3151 struct LineRun line17 =
3164 struct LineRun line18 =
3177 struct LineRun line19 =
3190 Vector<LineRun> lines;
3191 lines.PushBack( line01 );
3192 lines.PushBack( line02 );
3193 lines.PushBack( line03 );
3194 lines.PushBack( line04 );
3195 lines.PushBack( line05 );
3196 lines.PushBack( line06 );
3197 lines.PushBack( line07 );
3198 lines.PushBack( line08 );
3199 lines.PushBack( line09 );
3200 lines.PushBack( line10 );
3201 lines.PushBack( line11 );
3202 lines.PushBack( line12 );
3203 lines.PushBack( line13 );
3204 lines.PushBack( line14 );
3205 lines.PushBack( line15 );
3206 lines.PushBack( line16 );
3207 lines.PushBack( line17 );
3208 lines.PushBack( line18 );
3209 lines.PushBack( line19 );
3211 LayoutTextData data =
3213 "Layout bidirectional text.",
3214 "Hello world demo שלום עולם.\n"
3215 "مرحبا بالعالم hello world שלום עולם\n"
3216 "שלום עולם hello world demo.\n"
3217 "hello world مرحبا بالعالم שלום עולם\n"
3218 "Hello world demo שלום עולם.\n"
3219 "שלום עולם hello world مرحبا بالعالم\n",
3222 fontDescriptionRuns.Begin(),
3228 Layout::Engine::MULTI_LINE_BOX,
3232 DevelText::EllipsisPosition::END,
3236 if( !LayoutTextTest( data ) )
3238 tet_result(TET_FAIL);
3241 tet_result(TET_PASS);
3245 int UtcDaliTextLayoutEllipsis01(void)
3247 ToolkitTestApplication application;
3248 tet_infoline(" UtcDaliTextLayoutEllipsis01");
3250 // Layout single-line LTR text with ellipsis.
3252 const std::string fontLatin( "TizenSans" );
3254 // Set a known font description
3255 FontDescriptionRun fontDescriptionRun01;
3256 fontDescriptionRun01.characterRun.characterIndex = 0u;
3257 fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3258 fontDescriptionRun01.familyLength = fontLatin.size();
3259 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3260 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3261 fontDescriptionRun01.familyDefined = true;
3262 fontDescriptionRun01.weightDefined = false;
3263 fontDescriptionRun01.widthDefined = false;
3264 fontDescriptionRun01.slantDefined = false;
3265 fontDescriptionRun01.sizeDefined = false;
3267 Vector<FontDescriptionRun> fontDescriptionRuns;
3268 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3270 struct LineRun line01 =
3283 Vector<LineRun> lines;
3284 lines.PushBack( line01 );
3288 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, 85.f, -13.f,
3291 Size textArea( 100.f, 50.f );
3292 Size layoutSize( 100.f, 19.f );
3294 LayoutTextData data =
3296 "Layout single-line LTR text with ellipsis.",
3297 "Hello world demo hello world demo hello world demo.",
3300 fontDescriptionRuns.Begin(),
3306 Layout::Engine::SINGLE_LINE_BOX,
3310 DevelText::EllipsisPosition::END,
3314 if( !LayoutTextTest( data ) )
3316 tet_result(TET_FAIL);
3319 tet_result(TET_PASS);
3323 int UtcDaliTextLayoutEllipsis02(void)
3325 ToolkitTestApplication application;
3326 tet_infoline(" UtcDaliTextLayoutEllipsis02");
3328 // Layout multi-line LTR text with ellipsis.
3330 const std::string fontLatin( "TizenSans" );
3332 // Set a known font description
3333 FontDescriptionRun fontDescriptionRun01;
3334 fontDescriptionRun01.characterRun.characterIndex = 0u;
3335 fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3336 fontDescriptionRun01.familyLength = fontLatin.size();
3337 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3338 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3339 fontDescriptionRun01.familyDefined = true;
3340 fontDescriptionRun01.weightDefined = false;
3341 fontDescriptionRun01.widthDefined = false;
3342 fontDescriptionRun01.slantDefined = false;
3343 fontDescriptionRun01.sizeDefined = false;
3345 Vector<FontDescriptionRun> fontDescriptionRuns;
3346 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3348 struct LineRun line01 =
3361 struct LineRun line02 =
3374 Vector<LineRun> lines;
3375 lines.PushBack( line01 );
3376 lines.PushBack( line02 );
3380 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f,
3381 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 46.f, -13.f, 54.f, -9.f, 64.f, -13.f, 68.f, -13.f, 71.f, -9.f, 80.f, -0.f, 84.f, -9.f,
3384 Size textArea( 100.f, 50.f );
3385 Size layoutSize( 100.f, 38.f );
3387 LayoutTextData data =
3389 "Layout multi-line LTR text with ellipsis.",
3390 "Hello world demo hello world demo hello world demo.",
3393 fontDescriptionRuns.Begin(),
3399 Layout::Engine::MULTI_LINE_BOX,
3403 DevelText::EllipsisPosition::END,
3407 if( !LayoutTextTest( data ) )
3409 tet_result(TET_FAIL);
3412 tet_result(TET_PASS);
3416 int UtcDaliTextLayoutEllipsis03(void)