2 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
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;
61 void Print( const LineRun& line )
63 std::cout << " glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl;
64 std::cout << " character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl;
65 std::cout << " width : " << floor(line.width) << std::endl;
66 std::cout << " ascender : " << line.ascender << std::endl;
67 std::cout << " descender : " << line.descender << std::endl;
68 std::cout << " extraLength : " << line.extraLength << std::endl;
69 std::cout << " alignmentOffset : " << line.alignmentOffset << std::endl;
70 std::cout << " direction : " << line.direction << std::endl;
71 std::cout << " ellipsis : " << line.ellipsis << std::endl;
74 bool LayoutTextTest( const LayoutTextData& data )
77 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
78 fontClient.SetDpi( 96u, 96u );
80 char* pathNamePtr = get_current_dir_name();
81 const std::string pathName( pathNamePtr );
84 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
85 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
86 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
87 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHindiRegular.ttf" );
89 // 1) Create the model.
94 Vector<FontDescriptionRun> fontDescriptionRuns;
95 if( 0u != data.numberOfFonts )
97 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
98 data.fontDescriptions,
99 data.fontDescriptions + data.numberOfFonts );
102 LayoutOptions options;
103 options.align = false;
104 CreateTextModel( data.text,
113 LogicalModelPtr logicalModel = textModel->mLogicalModel;
114 VisualModelPtr visualModel = textModel->mVisualModel;
116 // 2) Clear the layout.
117 Vector<LineRun>& lines = visualModel->mLines;
119 const Length numberOfCharacters = logicalModel->mText.Count();
120 const bool isLastNewParagraph = ( 0u == numberOfCharacters ) ? false : TextAbstraction::IsNewParagraph( *( logicalModel->mText.Begin() + ( numberOfCharacters - 1u ) ) );
121 const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u;
122 const bool removeLastLine = isLastNewParagraph && ( lastGlyphIndex + 1u == visualModel->mGlyphs.Count() );
124 LineIndex startRemoveIndex = 0u;
126 if( 0u != lines.Count() )
128 startRemoveIndex = lines.Count();
129 LineIndex endRemoveIndex = startRemoveIndex;
130 ClearGlyphRuns( data.startIndex,
131 lastGlyphIndex + ( removeLastLine ? 1u : 0u ),
136 // Update the character runs of the lines.
137 const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
138 const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin();
139 const CharacterIndex startCharacterIndex = *( glyphsToCharactersBuffer + data.startIndex );
140 const CharacterIndex lastCharacterIndex = *( glyphsToCharactersBuffer + lastGlyphIndex ) + *( charactersPerGlyph + lastGlyphIndex ) - 1u;
141 ClearCharacterRuns( startCharacterIndex,
142 lastCharacterIndex + ( removeLastLine ? 1u : 0u ),
147 lines.Erase( lines.Begin() + startRemoveIndex,
148 lines.Begin() + endRemoveIndex );
151 Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
153 glyphPositions.Erase( glyphPositions.Begin() + data.startIndex,
154 glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs );
157 Layout::Engine engine;
158 engine.SetMetrics( metrics );
159 engine.SetLayout( data.layout );
161 textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN;
162 textModel->mLineWrapMode = LineWrap::WORD;
163 textModel->mIgnoreSpacesAfterText = true;
164 textModel->mMatchSystemLanguageDirection = false;
165 Layout::Parameters layoutParameters( data.textArea,
168 layoutParameters.isLastNewParagraph = isLastNewParagraph;
170 // The initial glyph and the number of glyphs to layout.
171 layoutParameters.startGlyphIndex = data.startIndex;
172 layoutParameters.numberOfGlyphs = data.numberOfGlyphs;
173 layoutParameters.startLineIndex = startRemoveIndex;
174 layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
176 layoutSize = Vector2::ZERO;
178 bool isAutoScroll = false;
179 const bool updated = engine.LayoutText( layoutParameters,
184 // 4) Compare the results.
186 if( updated != data.updated )
188 std::cout << " Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
192 if( layoutSize != data.layoutSize )
194 std::cout << " Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
198 for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
200 const Vector2& position = *( glyphPositions.Begin() + index );
202 if( fabsf( std::round( position.x ) - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
204 std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
207 if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
209 std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
214 if( lines.Count() != data.numberOfLines )
216 std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
220 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
222 const LineRun& line = *( lines.Begin() + index );
223 const LineRun& expectedLine = *( data.lines + index );
225 if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex )
227 std::cout << " Different line info for line : " << index << std::endl;
229 std::cout << " expected" << std::endl;
230 Print( expectedLine );
233 if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs )
235 std::cout << " Different line info for line : " << index << std::endl;
237 std::cout << " expected" << std::endl;
238 Print( expectedLine );
242 if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex )
244 std::cout << " Different line info for line : " << index << std::endl;
246 std::cout << " expected" << std::endl;
247 Print( expectedLine );
250 if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters )
252 std::cout << " Different line info for line : " << index << std::endl;
254 std::cout << " expected" << std::endl;
255 Print( expectedLine );
259 if( fabsf( floor( line.width ) - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
261 std::cout << " Different line info for line : " << index << std::endl;
263 std::cout << " expected" << std::endl;
264 Print( expectedLine );
268 if( fabsf( line.ascender - expectedLine.ascender ) > Math::MACHINE_EPSILON_1 )
270 std::cout << " Different line info for line : " << index << std::endl;
272 std::cout << " expected" << std::endl;
273 Print( expectedLine );
277 if( fabsf( line.descender - expectedLine.descender ) > Math::MACHINE_EPSILON_1 )
279 std::cout << " Different line info for line : " << index << std::endl;
281 std::cout << " expected" << std::endl;
282 Print( expectedLine );
286 if( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 )
288 std::cout << " Different line info for line : " << index << std::endl;
290 std::cout << " expected" << std::endl;
291 Print( expectedLine );
295 if( line.ellipsis != expectedLine.ellipsis )
297 std::cout << " Different line info for line : " << index << std::endl;
299 std::cout << " expected" << std::endl;
300 Print( expectedLine );
304 // Do not compare the alignment offset as it's not calculated in the layout.
305 // Do not compare the line direction as it's not set in the layout.
311 //////////////////////////////////////////////////////////
315 std::string description;
318 unsigned int numberOfFonts;
319 FontDescriptionRun* fontDescriptions;
320 Text::HorizontalAlignment::Type horizontalAlignment;
321 Text::VerticalAlignment::Type verticalAlignment;
322 unsigned int startIndex;
323 unsigned int numberOfCharacters;
324 unsigned int numberOfLines;
326 Dali::LayoutDirection::Type layoutDirection;
327 bool matchSystemLanguageDirection;
330 bool AlignTest( const AlignData& data )
333 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
334 fontClient.SetDpi( 96u, 96u );
336 char* pathNamePtr = get_current_dir_name();
337 const std::string pathName( pathNamePtr );
340 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
341 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
342 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
344 // 1) Create the model.
349 Vector<FontDescriptionRun> fontDescriptionRuns;
350 if( 0u != data.numberOfFonts )
352 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
353 data.fontDescriptions,
354 data.fontDescriptions + data.numberOfFonts );
357 LayoutOptions options;
358 options.align = false;
359 CreateTextModel( data.text,
368 LogicalModelPtr logicalModel = textModel->mLogicalModel;
369 VisualModelPtr visualModel = textModel->mVisualModel;
371 // Call the Align method.
372 Layout::Engine engine;
373 engine.SetMetrics( metrics );
375 float alignmentOffset = 0.f;
376 engine.Align( data.textArea,
378 data.numberOfCharacters,
379 data.horizontalAlignment,
382 data.layoutDirection,
383 data.matchSystemLanguageDirection );
386 if( data.numberOfLines != visualModel->mLines.Count() )
388 std::cout << " Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
392 const LineRun* const linesBuffer = visualModel->mLines.Begin();
393 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
395 const LineRun& line = *( linesBuffer + index );
397 if( line.alignmentOffset != *( data.lineOffsets + index ) )
399 std::cout << " different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl;
408 //////////////////////////////////////////////////////////
410 // UtcDaliTextLayoutSetGetLayout
411 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
412 // UtcDaliTextLayoutSetGetHorizontalAlignment
413 // UtcDaliTextLayoutSetGetVerticalAlignment
414 // UtcDaliTextLayoutSetGetCursorWidth
415 // UtcDaliTextLayoutNoText
416 // UtcDaliTextLayoutSmallTextArea01
417 // UtcDaliTextLayoutSmallTextArea02
418 // UtcDaliTextLayoutMultilineText01
419 // UtcDaliTextLayoutMultilineText02
420 // UtcDaliTextLayoutMultilineText03
421 // UtcDaliTextLayoutMultilineText04
422 // UtcDaliTextLayoutMultilineText05
423 // UtcDaliTextLayoutMultilineText06
424 // UtcDaliTextUpdateLayout01
425 // UtcDaliTextUpdateLayout02
426 // UtcDaliTextUpdateLayout03
427 // UtcDaliTextLayoutEllipsis01
428 // UtcDaliTextLayoutEllipsis02
429 // UtcDaliTextLayoutEllipsis03
430 // UtcDaliTextLayoutEllipsis04
431 // UtcDaliTextLayoutEllipsis04
432 // UtcDaliTextReorderLayout01
433 // UtcDaliTextReorderLayout02
434 // UtcDaliTextReorderLayout03
435 // UtcDaliTextReorderLayout04
436 // UtcDaliTextAlign01
437 // UtcDaliTextAlign02
438 // UtcDaliTextAlign03
439 // UtcDaliTextAlign04
440 // UtcDaliTextAlign05
441 // UtcDaliTextAlign06
442 // UtcDaliTextAlign07
443 // UtcDaliTextAlign08
444 // UtcDaliTextAlign09
446 //////////////////////////////////////////////////////////
448 int UtcDaliTextLayoutSetGetLayout(void)
450 ToolkitTestApplication application;
451 tet_infoline(" UtcDaliTextLayoutSetGetLayout");
453 Layout::Engine engine;
455 DALI_TEST_CHECK( Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout() );
457 engine.SetLayout( Layout::Engine::MULTI_LINE_BOX );
458 DALI_TEST_CHECK( Layout::Engine::MULTI_LINE_BOX == engine.GetLayout() );
460 tet_result(TET_PASS);
464 int UtcDaliTextLayoutSetGetCursorWidth(void)
466 ToolkitTestApplication application;
469 Layout::Engine engine;
471 DALI_TEST_EQUALS( 0, engine.GetCursorWidth(), TEST_LOCATION );
473 engine.SetCursorWidth( 2 );
474 DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
476 tet_result(TET_PASS);
480 int UtcDaliTextLayoutNoText(void)
482 ToolkitTestApplication application;
483 tet_infoline(" UtcDaliTextLayoutNoText");
485 Size textArea(100.f, 60.f);
486 Size layoutSize = Vector2::ZERO;
487 LayoutTextData data =
499 Layout::Engine::MULTI_LINE_BOX,
506 if( !LayoutTextTest( data ) )
508 tet_result(TET_FAIL);
511 tet_result(TET_PASS);
515 int UtcDaliTextLayoutSmallTextArea01(void)
517 ToolkitTestApplication application;
518 tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
520 // Won't layout the text in multi-line if the width is too small.
522 const std::string fontFamily( "TizenSans" );
524 // Set a known font description
525 FontDescriptionRun fontDescriptionRun;
526 fontDescriptionRun.characterRun.characterIndex = 0u;
527 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
528 fontDescriptionRun.familyLength = fontFamily.size();
529 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
530 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
531 fontDescriptionRun.familyDefined = true;
532 fontDescriptionRun.weightDefined = false;
533 fontDescriptionRun.widthDefined = false;
534 fontDescriptionRun.slantDefined = false;
535 fontDescriptionRun.sizeDefined = false;
537 Vector<FontDescriptionRun> fontDescriptionRuns;
538 fontDescriptionRuns.PushBack( fontDescriptionRun );
539 Size textArea(1.f, 1.f);
540 Size layoutSize = Vector2::ZERO;
541 LayoutTextData data =
543 "Layout text in a small area",
547 fontDescriptionRuns.Begin(),
553 Layout::Engine::MULTI_LINE_BOX,
560 if( !LayoutTextTest( data ) )
562 tet_result(TET_FAIL);
565 tet_result(TET_PASS);
569 int UtcDaliTextLayoutSmallTextArea02(void)
571 ToolkitTestApplication application;
572 tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
574 // Will layout the text in single line as it can be scrolled.
576 const std::string fontFamily( "TizenSans" );
578 // Set a known font description
579 FontDescriptionRun fontDescriptionRun;
580 fontDescriptionRun.characterRun.characterIndex = 0u;
581 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
582 fontDescriptionRun.familyLength = fontFamily.size();
583 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
584 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
585 fontDescriptionRun.familyDefined = true;
586 fontDescriptionRun.weightDefined = false;
587 fontDescriptionRun.widthDefined = false;
588 fontDescriptionRun.slantDefined = false;
589 fontDescriptionRun.sizeDefined = false;
591 Vector<FontDescriptionRun> fontDescriptionRuns;
592 fontDescriptionRuns.PushBack( fontDescriptionRun );
593 Size textArea(1.f, 1.f);
594 Size layoutSize(81.f, 19.f);
595 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 };
596 struct LineRun line =
609 Vector<LineRun> lines;
610 lines.PushBack( line );
612 LayoutTextData data =
614 "Layout text in a small area",
618 fontDescriptionRuns.Begin(),
624 Layout::Engine::SINGLE_LINE_BOX,
631 if( !LayoutTextTest( data ) )
633 tet_result(TET_FAIL);
636 tet_result(TET_PASS);
640 int UtcDaliTextLayoutMultilineText01(void)
642 ToolkitTestApplication application;
643 tet_infoline(" UtcDaliTextLayoutMultilineText01");
645 // Layout some lines of left to right text.
647 const std::string fontFamily( "TizenSans" );
649 // Set a known font description
650 FontDescriptionRun fontDescriptionRun1;
651 fontDescriptionRun1.characterRun.characterIndex = 0u;
652 fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
653 fontDescriptionRun1.familyLength = fontFamily.size();
654 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
655 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
656 fontDescriptionRun1.familyDefined = true;
657 fontDescriptionRun1.weightDefined = false;
658 fontDescriptionRun1.widthDefined = false;
659 fontDescriptionRun1.slantDefined = false;
660 fontDescriptionRun1.sizeDefined = false;
662 FontDescriptionRun fontDescriptionRun2;
663 fontDescriptionRun2.characterRun.characterIndex = 18u;
664 fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
665 fontDescriptionRun2.familyLength = fontFamily.size();
666 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
667 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
668 fontDescriptionRun2.familyDefined = true;
669 fontDescriptionRun2.weightDefined = false;
670 fontDescriptionRun2.widthDefined = false;
671 fontDescriptionRun2.slantDefined = false;
672 fontDescriptionRun2.sizeDefined = false;
674 Vector<FontDescriptionRun> fontDescriptionRuns;
675 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
676 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
677 Size textArea(100.f, 300.f);
678 Size layoutSize(97.f, 95.f);
681 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,
682 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, 45.f, -12.f,
683 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,
684 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,
685 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
687 struct LineRun line0 =
700 struct LineRun line1 =
713 struct LineRun line2 =
726 struct LineRun line3 =
739 struct LineRun line4 =
752 Vector<LineRun> lines;
753 lines.PushBack( line0 );
754 lines.PushBack( line1 );
755 lines.PushBack( line2 );
756 lines.PushBack( line3 );
757 lines.PushBack( line4 );
759 LayoutTextData data =
761 "Layout simple multi-line text",
762 "Hello world demo.\n"
763 "Layout different lines of text.",
766 fontDescriptionRuns.Begin(),
772 Layout::Engine::MULTI_LINE_BOX,
779 if( !LayoutTextTest( data ) )
781 tet_result(TET_FAIL);
784 tet_result(TET_PASS);
788 int UtcDaliTextLayoutMultilineText02(void)
790 ToolkitTestApplication application;
791 tet_infoline(" UtcDaliTextLayoutMultilineText02");
793 // Layout some lines of bidirectional text.
795 const std::string fontFamily1( "TizenSans" );
797 // Set a known font description
798 FontDescriptionRun fontDescriptionRun1;
799 fontDescriptionRun1.characterRun.characterIndex = 0u;
800 fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
801 fontDescriptionRun1.familyLength = fontFamily1.size();
802 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
803 memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength );
804 fontDescriptionRun1.familyDefined = true;
805 fontDescriptionRun1.weightDefined = false;
806 fontDescriptionRun1.widthDefined = false;
807 fontDescriptionRun1.slantDefined = false;
808 fontDescriptionRun1.sizeDefined = false;
810 const std::string fontFamily2( "TizenSansHebrew" );
812 // Set a known font description
813 FontDescriptionRun fontDescriptionRun2;
814 fontDescriptionRun2.characterRun.characterIndex = 17u;
815 fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
816 fontDescriptionRun2.familyLength = fontFamily2.size();
817 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
818 memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
819 fontDescriptionRun2.familyDefined = true;
820 fontDescriptionRun2.weightDefined = false;
821 fontDescriptionRun2.widthDefined = false;
822 fontDescriptionRun2.slantDefined = false;
823 fontDescriptionRun2.sizeDefined = false;
825 const std::string fontFamily3( "TizenSans" );
827 // Set a known font description
828 FontDescriptionRun fontDescriptionRun3;
829 fontDescriptionRun3.characterRun.characterIndex = 26u;
830 fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
831 fontDescriptionRun3.familyLength = fontFamily3.size();
832 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
833 memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
834 fontDescriptionRun3.familyDefined = true;
835 fontDescriptionRun3.weightDefined = false;
836 fontDescriptionRun3.widthDefined = false;
837 fontDescriptionRun3.slantDefined = false;
838 fontDescriptionRun3.sizeDefined = false;
840 const std::string fontFamily4( "TizenSansHebrew" );
842 // Set a known font description
843 FontDescriptionRun fontDescriptionRun4;
844 fontDescriptionRun4.characterRun.characterIndex = 28u;
845 fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
846 fontDescriptionRun4.familyLength = fontFamily4.size();
847 fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
848 memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
849 fontDescriptionRun4.familyDefined = true;
850 fontDescriptionRun4.weightDefined = false;
851 fontDescriptionRun4.widthDefined = false;
852 fontDescriptionRun4.slantDefined = false;
853 fontDescriptionRun4.sizeDefined = false;
855 const std::string fontFamily5( "TizenSans" );
857 // Set a known font description
858 FontDescriptionRun fontDescriptionRun5;
859 fontDescriptionRun5.characterRun.characterIndex = 38u;
860 fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
861 fontDescriptionRun5.familyLength = fontFamily5.size();
862 fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
863 memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
864 fontDescriptionRun5.familyDefined = true;
865 fontDescriptionRun5.weightDefined = false;
866 fontDescriptionRun5.widthDefined = false;
867 fontDescriptionRun5.slantDefined = false;
868 fontDescriptionRun5.sizeDefined = false;
870 Vector<FontDescriptionRun> fontDescriptionRuns;
871 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
872 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
873 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
874 fontDescriptionRuns.PushBack( fontDescriptionRun4 );
875 fontDescriptionRuns.PushBack( fontDescriptionRun5 );
876 Size textArea(100.f, 300.f);
877 Size layoutSize(81.f, 114.f);
880 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
881 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
882 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
883 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
884 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
885 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, // 50 .. 54
887 struct LineRun line0 =
900 struct LineRun line1 =
913 struct LineRun line2 =
926 struct LineRun line3 =
939 struct LineRun line4 =
952 struct LineRun line5 =
965 Vector<LineRun> lines;
966 lines.PushBack( line0 );
967 lines.PushBack( line1 );
968 lines.PushBack( line2 );
969 lines.PushBack( line3 );
970 lines.PushBack( line4 );
971 lines.PushBack( line5 );
973 LayoutTextData data =
975 "Layout bidirectional text.",
976 "Hello world demo שלום עולם.\n"
977 "שלום עולם hello world demo.",
980 fontDescriptionRuns.Begin(),
986 Layout::Engine::MULTI_LINE_BOX,
993 if( !LayoutTextTest( data ) )
995 tet_result(TET_FAIL);
998 tet_result(TET_PASS);
1002 int UtcDaliTextLayoutMultilineText03(void)
1004 ToolkitTestApplication application;
1005 tet_infoline(" UtcDaliTextLayoutMultilineText03");
1007 // Layout a long word which doesn't fit in the width of the text area.
1009 const std::string fontFamily( "TizenSans" );
1011 // Set a known font description
1012 FontDescriptionRun fontDescriptionRun;
1013 fontDescriptionRun.characterRun.characterIndex = 0u;
1014 fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1015 fontDescriptionRun.familyLength = fontFamily.size();
1016 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1017 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1018 fontDescriptionRun.familyDefined = true;
1019 fontDescriptionRun.weightDefined = false;
1020 fontDescriptionRun.widthDefined = false;
1021 fontDescriptionRun.slantDefined = false;
1022 fontDescriptionRun.sizeDefined = false;
1024 Vector<FontDescriptionRun> fontDescriptionRuns;
1025 fontDescriptionRuns.PushBack( fontDescriptionRun );
1026 Size textArea(100.f, 300.f);
1027 Size layoutSize(98.f, 57.f);
1030 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,
1031 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,
1032 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f,
1034 struct LineRun line0 =
1047 struct LineRun line1 =
1060 struct LineRun line2 =
1073 Vector<LineRun> lines;
1074 lines.PushBack( line0 );
1075 lines.PushBack( line1 );
1076 lines.PushBack( line2 );
1078 LayoutTextData data =
1080 "Layout a long word which doesn't fit in the width of the text area.",
1081 "Helloworlddemohelloworlddemo.",
1084 fontDescriptionRuns.Begin(),
1090 Layout::Engine::MULTI_LINE_BOX,
1097 if( !LayoutTextTest( data ) )
1099 tet_result(TET_FAIL);
1102 tet_result(TET_PASS);
1106 int UtcDaliTextLayoutMultilineText04(void)
1108 ToolkitTestApplication application;
1109 tet_infoline(" UtcDaliTextLayoutMultilineText04");
1111 // Layout simple text ending with a \n. It has to add a void line at the end.
1113 const std::string fontFamily( "TizenSans" );
1115 // Set a known font description
1116 FontDescriptionRun fontDescriptionRun;
1117 fontDescriptionRun.characterRun.characterIndex = 0u;
1118 fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1119 fontDescriptionRun.familyLength = fontFamily.size();
1120 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1121 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1122 fontDescriptionRun.familyDefined = true;
1123 fontDescriptionRun.weightDefined = false;
1124 fontDescriptionRun.widthDefined = false;
1125 fontDescriptionRun.slantDefined = false;
1126 fontDescriptionRun.sizeDefined = false;
1128 Vector<FontDescriptionRun> fontDescriptionRuns;
1129 fontDescriptionRuns.PushBack( fontDescriptionRun );
1130 Size textArea(100.f, 300.f);
1131 Size layoutSize(84.f, 38.f);
1134 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
1136 struct LineRun line0 =
1148 struct LineRun line1 =
1161 Vector<LineRun> lines;
1162 lines.PushBack( line0 );
1163 lines.PushBack( line1 );
1165 LayoutTextData data =
1167 "Layout simple text ending with a \n.",
1171 fontDescriptionRuns.Begin(),
1177 Layout::Engine::MULTI_LINE_BOX,
1184 if( !LayoutTextTest( data ) )
1186 tet_result(TET_FAIL);
1189 tet_result(TET_PASS);
1193 int UtcDaliTextLayoutMultilineText05(void)
1195 ToolkitTestApplication application;
1196 tet_infoline(" UtcDaliTextLayoutMultilineText05");
1198 // Layout simple text with one character with a different font size.
1200 const std::string fontFamily( "TizenSans" );
1202 // Set a known font description
1203 FontDescriptionRun fontDescriptionRun1;
1204 fontDescriptionRun1.characterRun.characterIndex = 0u;
1205 fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1206 fontDescriptionRun1.familyLength = fontFamily.size();
1207 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1208 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1209 fontDescriptionRun1.familyDefined = true;
1210 fontDescriptionRun1.weightDefined = false;
1211 fontDescriptionRun1.widthDefined = false;
1212 fontDescriptionRun1.slantDefined = false;
1213 fontDescriptionRun1.sizeDefined = false;
1215 FontDescriptionRun fontDescriptionRun2;
1216 fontDescriptionRun2.characterRun.characterIndex = 6u;
1217 fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1218 fontDescriptionRun2.familyLength = fontFamily.size();
1219 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1220 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1221 fontDescriptionRun2.size = 1280u;
1222 fontDescriptionRun2.familyDefined = true;
1223 fontDescriptionRun2.weightDefined = false;
1224 fontDescriptionRun2.widthDefined = false;
1225 fontDescriptionRun2.slantDefined = false;
1226 fontDescriptionRun2.sizeDefined = true;
1228 FontDescriptionRun fontDescriptionRun3;
1229 fontDescriptionRun3.characterRun.characterIndex = 7u;
1230 fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1231 fontDescriptionRun3.familyLength = fontFamily.size();
1232 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1233 memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1234 fontDescriptionRun3.familyDefined = true;
1235 fontDescriptionRun3.weightDefined = false;
1236 fontDescriptionRun3.widthDefined = false;
1237 fontDescriptionRun3.slantDefined = false;
1238 fontDescriptionRun3.sizeDefined = false;
1240 Vector<FontDescriptionRun> fontDescriptionRuns;
1241 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1242 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1243 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1244 Size textArea(100.f, 300.f);
1245 Size layoutSize(89.f, 51.f);
1248 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,
1249 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f
1251 struct LineRun line0 =
1264 struct LineRun line1 =
1277 Vector<LineRun> lines;
1278 lines.PushBack( line0 );
1279 lines.PushBack( line1 );
1281 LayoutTextData data =
1283 "Layout simple text with one character with a different font size.",
1284 "Hello world demo.",
1287 fontDescriptionRuns.Begin(),
1293 Layout::Engine::MULTI_LINE_BOX,
1300 if( !LayoutTextTest( data ) )
1302 tet_result(TET_FAIL);
1305 tet_result(TET_PASS);
1309 int UtcDaliTextLayoutMultilineText06(void)
1311 ToolkitTestApplication application;
1312 tet_infoline(" UtcDaliTextLayoutMultilineText06");
1314 const std::string fontFamily( "TizenSansHebrew" );
1316 // Set a known font description
1317 FontDescriptionRun fontDescriptionRun;
1318 fontDescriptionRun.characterRun.characterIndex = 0u;
1319 fontDescriptionRun.characterRun.numberOfCharacters = 10u;
1320 fontDescriptionRun.familyLength = fontFamily.size();
1321 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1322 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1323 fontDescriptionRun.familyDefined = true;
1324 fontDescriptionRun.weightDefined = false;
1325 fontDescriptionRun.widthDefined = false;
1326 fontDescriptionRun.slantDefined = false;
1327 fontDescriptionRun.sizeDefined = false;
1329 Vector<FontDescriptionRun> fontDescriptionRuns;
1330 fontDescriptionRuns.PushBack( fontDescriptionRun );
1332 Size textArea(64.f, 100.f);
1333 Size layoutSize(33.f, 38.f);
1336 28.f, -13.f, 18.f, -10.f, 9.f, -10.f, 4.f, -10.f, 0.f, -0.f,
1337 23.f, -10.f, 18.f, -10.f, 12.f, -10.f, 4.f, -10.f, 0.f, -10.f
1339 struct LineRun line0 =
1352 struct LineRun line1 =
1365 Vector<LineRun> lines;
1366 lines.PushBack( line0 );
1367 lines.PushBack( line1 );
1369 LayoutTextData data =
1371 "Layout right to left text that doesn't fit in the text area after reordering.",
1372 "לכאן שנורו", // If this text is laid-out ltr the width is 64. When reordered, the length is 66. This might cause alignment issues.
1375 fontDescriptionRuns.Begin(),
1381 Layout::Engine::MULTI_LINE_BOX,
1388 if( !LayoutTextTest( data ) )
1390 tet_result(TET_FAIL);
1393 tet_result(TET_PASS);
1397 int UtcDaliTextLayoutMultilineText07(void)
1399 ToolkitTestApplication application;
1400 tet_infoline(" UtcDaliTextLayoutMultilineText07");
1402 const std::string fontFamily( "TizenSansHebrew" );
1404 // Set a known font description
1405 FontDescriptionRun fontDescriptionRun;
1406 fontDescriptionRun.characterRun.characterIndex = 0u;
1407 fontDescriptionRun.characterRun.numberOfCharacters = 9u;
1408 fontDescriptionRun.familyLength = fontFamily.size();
1409 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1410 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1411 fontDescriptionRun.familyDefined = true;
1412 fontDescriptionRun.weightDefined = false;
1413 fontDescriptionRun.widthDefined = false;
1414 fontDescriptionRun.slantDefined = false;
1415 fontDescriptionRun.sizeDefined = false;
1417 Vector<FontDescriptionRun> fontDescriptionRuns;
1418 fontDescriptionRuns.PushBack( fontDescriptionRun );
1420 Size textArea(26.f, 100.f);
1421 Size layoutSize(23.f, 57.f);
1424 11.f, -10.f, 5.f, -10.f, 0.f, -10.f,
1425 12.f, -10.f, 8.f, -10.f, 0.f, -13.f,
1426 14.f, -10.f, 4.f, -10.f, 0.f, -10.f
1428 struct LineRun line0 =
1441 struct LineRun line1 =
1454 struct LineRun line2 =
1467 Vector<LineRun> lines;
1468 lines.PushBack( line0 );
1469 lines.PushBack( line1 );
1470 lines.PushBack( line2 );
1472 LayoutTextData data =
1474 "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.",
1475 "שנורולכאן", // 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.
1478 fontDescriptionRuns.Begin(),
1484 Layout::Engine::MULTI_LINE_BOX,
1491 if( !LayoutTextTest( data ) )
1493 tet_result(TET_FAIL);
1496 tet_result(TET_PASS);
1500 int UtcDaliTextUpdateLayout01(void)
1502 ToolkitTestApplication application;
1503 tet_infoline(" UtcDaliTextUpdateLayout01");
1505 // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1507 const std::string fontLatin( "TizenSans" );
1508 const std::string fontHebrew( "TizenSansHebrew" );
1509 const std::string fontArabic( "TizenSansArabic" );
1511 // Set a known font description
1512 FontDescriptionRun fontDescriptionRun01;
1513 fontDescriptionRun01.characterRun.characterIndex = 0u;
1514 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1515 fontDescriptionRun01.familyLength = fontLatin.size();
1516 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1517 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1518 fontDescriptionRun01.familyDefined = true;
1519 fontDescriptionRun01.weightDefined = false;
1520 fontDescriptionRun01.widthDefined = false;
1521 fontDescriptionRun01.slantDefined = false;
1522 fontDescriptionRun01.sizeDefined = false;
1524 // Set a known font description
1525 FontDescriptionRun fontDescriptionRun02;
1526 fontDescriptionRun02.characterRun.characterIndex = 17u;
1527 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1528 fontDescriptionRun02.familyLength = fontHebrew.size();
1529 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1530 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1531 fontDescriptionRun02.familyDefined = true;
1532 fontDescriptionRun02.weightDefined = false;
1533 fontDescriptionRun02.widthDefined = false;
1534 fontDescriptionRun02.slantDefined = false;
1535 fontDescriptionRun02.sizeDefined = false;
1537 // Set a known font description
1538 FontDescriptionRun fontDescriptionRun03;
1539 fontDescriptionRun03.characterRun.characterIndex = 26u;
1540 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1541 fontDescriptionRun03.familyLength = fontLatin.size();
1542 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1543 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1544 fontDescriptionRun03.familyDefined = true;
1545 fontDescriptionRun03.weightDefined = false;
1546 fontDescriptionRun03.widthDefined = false;
1547 fontDescriptionRun03.slantDefined = false;
1548 fontDescriptionRun03.sizeDefined = false;
1550 // Set a known font description
1551 FontDescriptionRun fontDescriptionRun04;
1552 fontDescriptionRun04.characterRun.characterIndex = 28u;
1553 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1554 fontDescriptionRun04.familyLength = fontArabic.size();
1555 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1556 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
1557 fontDescriptionRun04.familyDefined = true;
1558 fontDescriptionRun04.weightDefined = false;
1559 fontDescriptionRun04.widthDefined = false;
1560 fontDescriptionRun04.slantDefined = false;
1561 fontDescriptionRun04.sizeDefined = false;
1563 // Set a known font description
1564 FontDescriptionRun fontDescriptionRun05;
1565 fontDescriptionRun05.characterRun.characterIndex = 42u;
1566 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1567 fontDescriptionRun05.familyLength = fontLatin.size();
1568 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1569 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
1570 fontDescriptionRun05.familyDefined = true;
1571 fontDescriptionRun05.weightDefined = false;
1572 fontDescriptionRun05.widthDefined = false;
1573 fontDescriptionRun05.slantDefined = false;
1574 fontDescriptionRun05.sizeDefined = false;
1576 // Set a known font description
1577 FontDescriptionRun fontDescriptionRun06;
1578 fontDescriptionRun06.characterRun.characterIndex = 54u;
1579 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1580 fontDescriptionRun06.familyLength = fontHebrew.size();
1581 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1582 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1583 fontDescriptionRun06.familyDefined = true;
1584 fontDescriptionRun06.weightDefined = false;
1585 fontDescriptionRun06.widthDefined = false;
1586 fontDescriptionRun06.slantDefined = false;
1587 fontDescriptionRun06.sizeDefined = false;
1589 // Set a known font description
1590 FontDescriptionRun fontDescriptionRun07;
1591 fontDescriptionRun07.characterRun.characterIndex = 64u;
1592 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1593 fontDescriptionRun07.familyLength = fontHebrew.size();
1594 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1595 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
1596 fontDescriptionRun07.familyDefined = true;
1597 fontDescriptionRun07.weightDefined = false;
1598 fontDescriptionRun07.widthDefined = false;
1599 fontDescriptionRun07.slantDefined = false;
1600 fontDescriptionRun07.sizeDefined = false;
1602 // Set a known font description
1603 FontDescriptionRun fontDescriptionRun08;
1604 fontDescriptionRun08.characterRun.characterIndex = 74u;
1605 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1606 fontDescriptionRun08.familyLength = fontLatin.size();
1607 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1608 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1609 fontDescriptionRun08.familyDefined = true;
1610 fontDescriptionRun08.weightDefined = false;
1611 fontDescriptionRun08.widthDefined = false;
1612 fontDescriptionRun08.slantDefined = false;
1613 fontDescriptionRun08.sizeDefined = false;
1615 // Set a known font description
1616 FontDescriptionRun fontDescriptionRun09;
1617 fontDescriptionRun09.characterRun.characterIndex = 92u;
1618 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1619 fontDescriptionRun09.familyLength = fontLatin.size();
1620 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1621 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
1622 fontDescriptionRun09.familyDefined = true;
1623 fontDescriptionRun09.weightDefined = false;
1624 fontDescriptionRun09.widthDefined = false;
1625 fontDescriptionRun09.slantDefined = false;
1626 fontDescriptionRun09.sizeDefined = false;
1628 // Set a known font description
1629 FontDescriptionRun fontDescriptionRun10;
1630 fontDescriptionRun10.characterRun.characterIndex = 104u;
1631 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1632 fontDescriptionRun10.familyLength = fontArabic.size();
1633 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1634 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
1635 fontDescriptionRun10.familyDefined = true;
1636 fontDescriptionRun10.weightDefined = false;
1637 fontDescriptionRun10.widthDefined = false;
1638 fontDescriptionRun10.slantDefined = false;
1639 fontDescriptionRun10.sizeDefined = false;
1641 // Set a known font description
1642 FontDescriptionRun fontDescriptionRun11;
1643 fontDescriptionRun11.characterRun.characterIndex = 118u;
1644 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1645 fontDescriptionRun11.familyLength = fontHebrew.size();
1646 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1647 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
1648 fontDescriptionRun11.familyDefined = true;
1649 fontDescriptionRun11.weightDefined = false;
1650 fontDescriptionRun11.widthDefined = false;
1651 fontDescriptionRun11.slantDefined = false;
1652 fontDescriptionRun11.sizeDefined = false;
1654 // Set a known font description
1655 FontDescriptionRun fontDescriptionRun12;
1656 fontDescriptionRun12.characterRun.characterIndex = 128u;
1657 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1658 fontDescriptionRun12.familyLength = fontLatin.size();
1659 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1660 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
1661 fontDescriptionRun12.familyDefined = true;
1662 fontDescriptionRun12.weightDefined = false;
1663 fontDescriptionRun12.widthDefined = false;
1664 fontDescriptionRun12.slantDefined = false;
1665 fontDescriptionRun12.sizeDefined = false;
1667 // Set a known font description
1668 FontDescriptionRun fontDescriptionRun13;
1669 fontDescriptionRun13.characterRun.characterIndex = 145u;
1670 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1671 fontDescriptionRun13.familyLength = fontHebrew.size();
1672 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1673 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1674 fontDescriptionRun13.familyDefined = true;
1675 fontDescriptionRun13.weightDefined = false;
1676 fontDescriptionRun13.widthDefined = false;
1677 fontDescriptionRun13.slantDefined = false;
1678 fontDescriptionRun13.sizeDefined = false;
1680 // Set a known font description
1681 FontDescriptionRun fontDescriptionRun14;
1682 fontDescriptionRun14.characterRun.characterIndex = 154u;
1683 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1684 fontDescriptionRun14.familyLength = fontLatin.size();
1685 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1686 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1687 fontDescriptionRun14.familyDefined = true;
1688 fontDescriptionRun14.weightDefined = false;
1689 fontDescriptionRun14.widthDefined = false;
1690 fontDescriptionRun14.slantDefined = false;
1691 fontDescriptionRun14.sizeDefined = false;
1693 // Set a known font description
1694 FontDescriptionRun fontDescriptionRun15;
1695 fontDescriptionRun15.characterRun.characterIndex = 156u;
1696 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1697 fontDescriptionRun15.familyLength = fontHebrew.size();
1698 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1699 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
1700 fontDescriptionRun15.familyDefined = true;
1701 fontDescriptionRun15.weightDefined = false;
1702 fontDescriptionRun15.widthDefined = false;
1703 fontDescriptionRun15.slantDefined = false;
1704 fontDescriptionRun15.sizeDefined = false;
1706 // Set a known font description
1707 FontDescriptionRun fontDescriptionRun16;
1708 fontDescriptionRun16.characterRun.characterIndex = 166u;
1709 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1710 fontDescriptionRun16.familyLength = fontLatin.size();
1711 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
1712 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
1713 fontDescriptionRun16.familyDefined = true;
1714 fontDescriptionRun16.weightDefined = false;
1715 fontDescriptionRun16.widthDefined = false;
1716 fontDescriptionRun16.slantDefined = false;
1717 fontDescriptionRun16.sizeDefined = false;
1719 // Set a known font description
1720 FontDescriptionRun fontDescriptionRun17;
1721 fontDescriptionRun17.characterRun.characterIndex = 178u;
1722 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1723 fontDescriptionRun17.familyLength = fontArabic.size();
1724 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
1725 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
1726 fontDescriptionRun17.familyDefined = true;
1727 fontDescriptionRun17.weightDefined = false;
1728 fontDescriptionRun17.widthDefined = false;
1729 fontDescriptionRun17.slantDefined = false;
1730 fontDescriptionRun17.sizeDefined = false;
1732 Vector<FontDescriptionRun> fontDescriptionRuns;
1733 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1734 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1735 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1736 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1737 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1738 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1739 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1740 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1741 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1742 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1743 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1744 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1745 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1746 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1747 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1748 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
1749 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
1750 Size textArea(100.f, 300.f);
1751 Size layoutSize(100.f, 361.f);
1754 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
1755 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
1756 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
1757 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
1758 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
1759 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63
1760 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
1761 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
1762 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
1763 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
1764 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
1765 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f, // 123 .. 127
1766 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
1767 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
1768 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
1769 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
1770 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
1771 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
1774 struct LineRun line01 =
1787 struct LineRun line02 =
1800 struct LineRun line03 =
1813 struct LineRun line04 =
1826 struct LineRun line05 =
1839 struct LineRun line06 =
1852 struct LineRun line07 =
1865 struct LineRun line08 =
1878 struct LineRun line09 =
1891 struct LineRun line10 =
1904 struct LineRun line11 =
1917 struct LineRun line12 =
1930 struct LineRun line13 =
1943 struct LineRun line14 =
1956 struct LineRun line15 =
1969 struct LineRun line16 =
1982 struct LineRun line17 =
1995 struct LineRun line18 =
2008 struct LineRun line19 =
2021 Vector<LineRun> lines;
2022 lines.PushBack( line01 );
2023 lines.PushBack( line02 );
2024 lines.PushBack( line03 );
2025 lines.PushBack( line04 );
2026 lines.PushBack( line05 );
2027 lines.PushBack( line06 );
2028 lines.PushBack( line07 );
2029 lines.PushBack( line08 );
2030 lines.PushBack( line09 );
2031 lines.PushBack( line10 );
2032 lines.PushBack( line11 );
2033 lines.PushBack( line12 );
2034 lines.PushBack( line13 );
2035 lines.PushBack( line14 );
2036 lines.PushBack( line15 );
2037 lines.PushBack( line16 );
2038 lines.PushBack( line17 );
2039 lines.PushBack( line18 );
2040 lines.PushBack( line19 );
2042 LayoutTextData data =
2044 "Layout bidirectional text.",
2045 "Hello world demo שלום עולם.\n"
2046 "مرحبا بالعالم hello world שלום עולם\n"
2047 "שלום עולם hello world demo.\n"
2048 "hello world مرحبا بالعالم שלום עולם\n"
2049 "Hello world demo שלום עולם.\n"
2050 "שלום עולם hello world مرحبا بالعالم\n",
2053 fontDescriptionRuns.Begin(),
2059 Layout::Engine::MULTI_LINE_BOX,
2066 if( !LayoutTextTest( data ) )
2068 tet_result(TET_FAIL);
2071 tet_result(TET_PASS);
2075 int UtcDaliTextUpdateLayout02(void)
2077 ToolkitTestApplication application;
2078 tet_infoline(" UtcDaliTextUpdateLayout02");
2080 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2082 const std::string fontLatin( "TizenSans" );
2083 const std::string fontHebrew( "TizenSansHebrew" );
2084 const std::string fontArabic( "TizenSansArabic" );
2086 // Set a known font description
2087 FontDescriptionRun fontDescriptionRun01;
2088 fontDescriptionRun01.characterRun.characterIndex = 0u;
2089 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2090 fontDescriptionRun01.familyLength = fontLatin.size();
2091 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2092 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2093 fontDescriptionRun01.familyDefined = true;
2094 fontDescriptionRun01.weightDefined = false;
2095 fontDescriptionRun01.widthDefined = false;
2096 fontDescriptionRun01.slantDefined = false;
2097 fontDescriptionRun01.sizeDefined = false;
2099 // Set a known font description
2100 FontDescriptionRun fontDescriptionRun02;
2101 fontDescriptionRun02.characterRun.characterIndex = 17u;
2102 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2103 fontDescriptionRun02.familyLength = fontHebrew.size();
2104 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2105 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2106 fontDescriptionRun02.familyDefined = true;
2107 fontDescriptionRun02.weightDefined = false;
2108 fontDescriptionRun02.widthDefined = false;
2109 fontDescriptionRun02.slantDefined = false;
2110 fontDescriptionRun02.sizeDefined = false;
2112 // Set a known font description
2113 FontDescriptionRun fontDescriptionRun03;
2114 fontDescriptionRun03.characterRun.characterIndex = 26u;
2115 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2116 fontDescriptionRun03.familyLength = fontLatin.size();
2117 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2118 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2119 fontDescriptionRun03.familyDefined = true;
2120 fontDescriptionRun03.weightDefined = false;
2121 fontDescriptionRun03.widthDefined = false;
2122 fontDescriptionRun03.slantDefined = false;
2123 fontDescriptionRun03.sizeDefined = false;
2125 // Set a known font description
2126 FontDescriptionRun fontDescriptionRun04;
2127 fontDescriptionRun04.characterRun.characterIndex = 28u;
2128 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2129 fontDescriptionRun04.familyLength = fontArabic.size();
2130 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2131 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2132 fontDescriptionRun04.familyDefined = true;
2133 fontDescriptionRun04.weightDefined = false;
2134 fontDescriptionRun04.widthDefined = false;
2135 fontDescriptionRun04.slantDefined = false;
2136 fontDescriptionRun04.sizeDefined = false;
2138 // Set a known font description
2139 FontDescriptionRun fontDescriptionRun05;
2140 fontDescriptionRun05.characterRun.characterIndex = 42u;
2141 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2142 fontDescriptionRun05.familyLength = fontLatin.size();
2143 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2144 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2145 fontDescriptionRun05.familyDefined = true;
2146 fontDescriptionRun05.weightDefined = false;
2147 fontDescriptionRun05.widthDefined = false;
2148 fontDescriptionRun05.slantDefined = false;
2149 fontDescriptionRun05.sizeDefined = false;
2151 // Set a known font description
2152 FontDescriptionRun fontDescriptionRun06;
2153 fontDescriptionRun06.characterRun.characterIndex = 54u;
2154 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2155 fontDescriptionRun06.familyLength = fontHebrew.size();
2156 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2157 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2158 fontDescriptionRun06.familyDefined = true;
2159 fontDescriptionRun06.weightDefined = false;
2160 fontDescriptionRun06.widthDefined = false;
2161 fontDescriptionRun06.slantDefined = false;
2162 fontDescriptionRun06.sizeDefined = false;
2164 // Set a known font description
2165 FontDescriptionRun fontDescriptionRun07;
2166 fontDescriptionRun07.characterRun.characterIndex = 64u;
2167 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2168 fontDescriptionRun07.familyLength = fontHebrew.size();
2169 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2170 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2171 fontDescriptionRun07.familyDefined = true;
2172 fontDescriptionRun07.weightDefined = false;
2173 fontDescriptionRun07.widthDefined = false;
2174 fontDescriptionRun07.slantDefined = false;
2175 fontDescriptionRun07.sizeDefined = false;
2177 // Set a known font description
2178 FontDescriptionRun fontDescriptionRun08;
2179 fontDescriptionRun08.characterRun.characterIndex = 74u;
2180 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2181 fontDescriptionRun08.familyLength = fontLatin.size();
2182 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2183 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2184 fontDescriptionRun08.familyDefined = true;
2185 fontDescriptionRun08.weightDefined = false;
2186 fontDescriptionRun08.widthDefined = false;
2187 fontDescriptionRun08.slantDefined = false;
2188 fontDescriptionRun08.sizeDefined = false;
2190 // Set a known font description
2191 FontDescriptionRun fontDescriptionRun09;
2192 fontDescriptionRun09.characterRun.characterIndex = 92u;
2193 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2194 fontDescriptionRun09.familyLength = fontLatin.size();
2195 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2196 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2197 fontDescriptionRun09.familyDefined = true;
2198 fontDescriptionRun09.weightDefined = false;
2199 fontDescriptionRun09.widthDefined = false;
2200 fontDescriptionRun09.slantDefined = false;
2201 fontDescriptionRun09.sizeDefined = false;
2203 // Set a known font description
2204 FontDescriptionRun fontDescriptionRun10;
2205 fontDescriptionRun10.characterRun.characterIndex = 104u;
2206 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2207 fontDescriptionRun10.familyLength = fontArabic.size();
2208 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2209 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2210 fontDescriptionRun10.familyDefined = true;
2211 fontDescriptionRun10.weightDefined = false;
2212 fontDescriptionRun10.widthDefined = false;
2213 fontDescriptionRun10.slantDefined = false;
2214 fontDescriptionRun10.sizeDefined = false;
2216 // Set a known font description
2217 FontDescriptionRun fontDescriptionRun11;
2218 fontDescriptionRun11.characterRun.characterIndex = 118u;
2219 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2220 fontDescriptionRun11.familyLength = fontHebrew.size();
2221 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2222 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2223 fontDescriptionRun11.familyDefined = true;
2224 fontDescriptionRun11.weightDefined = false;
2225 fontDescriptionRun11.widthDefined = false;
2226 fontDescriptionRun11.slantDefined = false;
2227 fontDescriptionRun11.sizeDefined = false;
2229 // Set a known font description
2230 FontDescriptionRun fontDescriptionRun12;
2231 fontDescriptionRun12.characterRun.characterIndex = 128u;
2232 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2233 fontDescriptionRun12.familyLength = fontLatin.size();
2234 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2235 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2236 fontDescriptionRun12.familyDefined = true;
2237 fontDescriptionRun12.weightDefined = false;
2238 fontDescriptionRun12.widthDefined = false;
2239 fontDescriptionRun12.slantDefined = false;
2240 fontDescriptionRun12.sizeDefined = false;
2242 // Set a known font description
2243 FontDescriptionRun fontDescriptionRun13;
2244 fontDescriptionRun13.characterRun.characterIndex = 145u;
2245 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2246 fontDescriptionRun13.familyLength = fontHebrew.size();
2247 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2248 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2249 fontDescriptionRun13.familyDefined = true;
2250 fontDescriptionRun13.weightDefined = false;
2251 fontDescriptionRun13.widthDefined = false;
2252 fontDescriptionRun13.slantDefined = false;
2253 fontDescriptionRun13.sizeDefined = false;
2255 // Set a known font description
2256 FontDescriptionRun fontDescriptionRun14;
2257 fontDescriptionRun14.characterRun.characterIndex = 154u;
2258 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2259 fontDescriptionRun14.familyLength = fontLatin.size();
2260 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2261 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2262 fontDescriptionRun14.familyDefined = true;
2263 fontDescriptionRun14.weightDefined = false;
2264 fontDescriptionRun14.widthDefined = false;
2265 fontDescriptionRun14.slantDefined = false;
2266 fontDescriptionRun14.sizeDefined = false;
2268 // Set a known font description
2269 FontDescriptionRun fontDescriptionRun15;
2270 fontDescriptionRun15.characterRun.characterIndex = 156u;
2271 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2272 fontDescriptionRun15.familyLength = fontHebrew.size();
2273 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2274 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2275 fontDescriptionRun15.familyDefined = true;
2276 fontDescriptionRun15.weightDefined = false;
2277 fontDescriptionRun15.widthDefined = false;
2278 fontDescriptionRun15.slantDefined = false;
2279 fontDescriptionRun15.sizeDefined = false;
2281 // Set a known font description
2282 FontDescriptionRun fontDescriptionRun16;
2283 fontDescriptionRun16.characterRun.characterIndex = 166u;
2284 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2285 fontDescriptionRun16.familyLength = fontLatin.size();
2286 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2287 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2288 fontDescriptionRun16.familyDefined = true;
2289 fontDescriptionRun16.weightDefined = false;
2290 fontDescriptionRun16.widthDefined = false;
2291 fontDescriptionRun16.slantDefined = false;
2292 fontDescriptionRun16.sizeDefined = false;
2294 // Set a known font description
2295 FontDescriptionRun fontDescriptionRun17;
2296 fontDescriptionRun17.characterRun.characterIndex = 178u;
2297 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2298 fontDescriptionRun17.familyLength = fontArabic.size();
2299 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2300 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2301 fontDescriptionRun17.familyDefined = true;
2302 fontDescriptionRun17.weightDefined = false;
2303 fontDescriptionRun17.widthDefined = false;
2304 fontDescriptionRun17.slantDefined = false;
2305 fontDescriptionRun17.sizeDefined = false;
2307 Vector<FontDescriptionRun> fontDescriptionRuns;
2308 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2309 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2310 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2311 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2312 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2313 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2314 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2315 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2316 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2317 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2318 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2319 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2320 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2321 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2322 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2323 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2324 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2325 Size textArea(100.f, 300.f);
2326 Size layoutSize(100.f, 361.f);
2329 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
2330 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
2331 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
2332 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
2333 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
2334 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63
2335 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
2336 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
2337 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
2338 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
2339 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
2340 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f, // 123 .. 127
2341 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
2342 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
2343 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
2344 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
2345 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
2346 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
2349 struct LineRun line01 =
2362 struct LineRun line02 =
2375 struct LineRun line03 =
2388 struct LineRun line04 =
2401 struct LineRun line05 =
2414 struct LineRun line06 =
2427 struct LineRun line07 =
2440 struct LineRun line08 =
2453 struct LineRun line09 =
2466 struct LineRun line10 =
2479 struct LineRun line11 =
2492 struct LineRun line12 =
2505 struct LineRun line13 =
2518 struct LineRun line14 =
2531 struct LineRun line15 =
2544 struct LineRun line16 =
2557 struct LineRun line17 =
2570 struct LineRun line18 =
2583 struct LineRun line19 =
2596 Vector<LineRun> lines;
2597 lines.PushBack( line01 );
2598 lines.PushBack( line02 );
2599 lines.PushBack( line03 );
2600 lines.PushBack( line04 );
2601 lines.PushBack( line05 );
2602 lines.PushBack( line06 );
2603 lines.PushBack( line07 );
2604 lines.PushBack( line08 );
2605 lines.PushBack( line09 );
2606 lines.PushBack( line10 );
2607 lines.PushBack( line11 );
2608 lines.PushBack( line12 );
2609 lines.PushBack( line13 );
2610 lines.PushBack( line14 );
2611 lines.PushBack( line15 );
2612 lines.PushBack( line16 );
2613 lines.PushBack( line17 );
2614 lines.PushBack( line18 );
2615 lines.PushBack( line19 );
2617 LayoutTextData data =
2619 "Layout bidirectional text.",
2620 "Hello world demo שלום עולם.\n"
2621 "مرحبا بالعالم hello world שלום עולם\n"
2622 "שלום עולם hello world demo.\n"
2623 "hello world مرحبا بالعالم שלום עולם\n"
2624 "Hello world demo שלום עולם.\n"
2625 "שלום עולם hello world مرحبا بالعالم\n",
2628 fontDescriptionRuns.Begin(),
2634 Layout::Engine::MULTI_LINE_BOX,
2641 if( !LayoutTextTest( data ) )
2643 tet_result(TET_FAIL);
2646 tet_result(TET_PASS);
2650 int UtcDaliTextUpdateLayout03(void)
2652 ToolkitTestApplication application;
2653 tet_infoline(" UtcDaliTextUpdateLayout03");
2655 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2657 const std::string fontLatin( "TizenSans" );
2658 const std::string fontHebrew( "TizenSansHebrew" );
2659 const std::string fontArabic( "TizenSansArabic" );
2661 // Set a known font description
2662 FontDescriptionRun fontDescriptionRun01;
2663 fontDescriptionRun01.characterRun.characterIndex = 0u;
2664 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2665 fontDescriptionRun01.familyLength = fontLatin.size();
2666 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2667 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2668 fontDescriptionRun01.familyDefined = true;
2669 fontDescriptionRun01.weightDefined = false;
2670 fontDescriptionRun01.widthDefined = false;
2671 fontDescriptionRun01.slantDefined = false;
2672 fontDescriptionRun01.sizeDefined = false;
2674 // Set a known font description
2675 FontDescriptionRun fontDescriptionRun02;
2676 fontDescriptionRun02.characterRun.characterIndex = 17u;
2677 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2678 fontDescriptionRun02.familyLength = fontHebrew.size();
2679 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2680 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2681 fontDescriptionRun02.familyDefined = true;
2682 fontDescriptionRun02.weightDefined = false;
2683 fontDescriptionRun02.widthDefined = false;
2684 fontDescriptionRun02.slantDefined = false;
2685 fontDescriptionRun02.sizeDefined = false;
2687 // Set a known font description
2688 FontDescriptionRun fontDescriptionRun03;
2689 fontDescriptionRun03.characterRun.characterIndex = 26u;
2690 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2691 fontDescriptionRun03.familyLength = fontLatin.size();
2692 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2693 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2694 fontDescriptionRun03.familyDefined = true;
2695 fontDescriptionRun03.weightDefined = false;
2696 fontDescriptionRun03.widthDefined = false;
2697 fontDescriptionRun03.slantDefined = false;
2698 fontDescriptionRun03.sizeDefined = false;
2700 // Set a known font description
2701 FontDescriptionRun fontDescriptionRun04;
2702 fontDescriptionRun04.characterRun.characterIndex = 28u;
2703 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2704 fontDescriptionRun04.familyLength = fontArabic.size();
2705 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2706 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2707 fontDescriptionRun04.familyDefined = true;
2708 fontDescriptionRun04.weightDefined = false;
2709 fontDescriptionRun04.widthDefined = false;
2710 fontDescriptionRun04.slantDefined = false;
2711 fontDescriptionRun04.sizeDefined = false;
2713 // Set a known font description
2714 FontDescriptionRun fontDescriptionRun05;
2715 fontDescriptionRun05.characterRun.characterIndex = 42u;
2716 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2717 fontDescriptionRun05.familyLength = fontLatin.size();
2718 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2719 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2720 fontDescriptionRun05.familyDefined = true;
2721 fontDescriptionRun05.weightDefined = false;
2722 fontDescriptionRun05.widthDefined = false;
2723 fontDescriptionRun05.slantDefined = false;
2724 fontDescriptionRun05.sizeDefined = false;
2726 // Set a known font description
2727 FontDescriptionRun fontDescriptionRun06;
2728 fontDescriptionRun06.characterRun.characterIndex = 54u;
2729 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2730 fontDescriptionRun06.familyLength = fontHebrew.size();
2731 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2732 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2733 fontDescriptionRun06.familyDefined = true;
2734 fontDescriptionRun06.weightDefined = false;
2735 fontDescriptionRun06.widthDefined = false;
2736 fontDescriptionRun06.slantDefined = false;
2737 fontDescriptionRun06.sizeDefined = false;
2739 // Set a known font description
2740 FontDescriptionRun fontDescriptionRun07;
2741 fontDescriptionRun07.characterRun.characterIndex = 64u;
2742 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2743 fontDescriptionRun07.familyLength = fontHebrew.size();
2744 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2745 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2746 fontDescriptionRun07.familyDefined = true;
2747 fontDescriptionRun07.weightDefined = false;
2748 fontDescriptionRun07.widthDefined = false;
2749 fontDescriptionRun07.slantDefined = false;
2750 fontDescriptionRun07.sizeDefined = false;
2752 // Set a known font description
2753 FontDescriptionRun fontDescriptionRun08;
2754 fontDescriptionRun08.characterRun.characterIndex = 74u;
2755 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2756 fontDescriptionRun08.familyLength = fontLatin.size();
2757 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2758 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2759 fontDescriptionRun08.familyDefined = true;
2760 fontDescriptionRun08.weightDefined = false;
2761 fontDescriptionRun08.widthDefined = false;
2762 fontDescriptionRun08.slantDefined = false;
2763 fontDescriptionRun08.sizeDefined = false;
2765 // Set a known font description
2766 FontDescriptionRun fontDescriptionRun09;
2767 fontDescriptionRun09.characterRun.characterIndex = 92u;
2768 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2769 fontDescriptionRun09.familyLength = fontLatin.size();
2770 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2771 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2772 fontDescriptionRun09.familyDefined = true;
2773 fontDescriptionRun09.weightDefined = false;
2774 fontDescriptionRun09.widthDefined = false;
2775 fontDescriptionRun09.slantDefined = false;
2776 fontDescriptionRun09.sizeDefined = false;
2778 // Set a known font description
2779 FontDescriptionRun fontDescriptionRun10;
2780 fontDescriptionRun10.characterRun.characterIndex = 104u;
2781 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2782 fontDescriptionRun10.familyLength = fontArabic.size();
2783 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2784 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2785 fontDescriptionRun10.familyDefined = true;
2786 fontDescriptionRun10.weightDefined = false;
2787 fontDescriptionRun10.widthDefined = false;
2788 fontDescriptionRun10.slantDefined = false;
2789 fontDescriptionRun10.sizeDefined = false;
2791 // Set a known font description
2792 FontDescriptionRun fontDescriptionRun11;
2793 fontDescriptionRun11.characterRun.characterIndex = 118u;
2794 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2795 fontDescriptionRun11.familyLength = fontHebrew.size();
2796 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2797 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2798 fontDescriptionRun11.familyDefined = true;
2799 fontDescriptionRun11.weightDefined = false;
2800 fontDescriptionRun11.widthDefined = false;
2801 fontDescriptionRun11.slantDefined = false;
2802 fontDescriptionRun11.sizeDefined = false;
2804 // Set a known font description
2805 FontDescriptionRun fontDescriptionRun12;
2806 fontDescriptionRun12.characterRun.characterIndex = 128u;
2807 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2808 fontDescriptionRun12.familyLength = fontLatin.size();
2809 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2810 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2811 fontDescriptionRun12.familyDefined = true;
2812 fontDescriptionRun12.weightDefined = false;
2813 fontDescriptionRun12.widthDefined = false;
2814 fontDescriptionRun12.slantDefined = false;
2815 fontDescriptionRun12.sizeDefined = false;
2817 // Set a known font description
2818 FontDescriptionRun fontDescriptionRun13;
2819 fontDescriptionRun13.characterRun.characterIndex = 145u;
2820 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2821 fontDescriptionRun13.familyLength = fontHebrew.size();
2822 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2823 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2824 fontDescriptionRun13.familyDefined = true;
2825 fontDescriptionRun13.weightDefined = false;
2826 fontDescriptionRun13.widthDefined = false;
2827 fontDescriptionRun13.slantDefined = false;
2828 fontDescriptionRun13.sizeDefined = false;
2830 // Set a known font description
2831 FontDescriptionRun fontDescriptionRun14;
2832 fontDescriptionRun14.characterRun.characterIndex = 154u;
2833 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2834 fontDescriptionRun14.familyLength = fontLatin.size();
2835 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2836 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2837 fontDescriptionRun14.familyDefined = true;
2838 fontDescriptionRun14.weightDefined = false;
2839 fontDescriptionRun14.widthDefined = false;
2840 fontDescriptionRun14.slantDefined = false;
2841 fontDescriptionRun14.sizeDefined = false;
2843 // Set a known font description
2844 FontDescriptionRun fontDescriptionRun15;
2845 fontDescriptionRun15.characterRun.characterIndex = 156u;
2846 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2847 fontDescriptionRun15.familyLength = fontHebrew.size();
2848 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2849 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2850 fontDescriptionRun15.familyDefined = true;
2851 fontDescriptionRun15.weightDefined = false;
2852 fontDescriptionRun15.widthDefined = false;
2853 fontDescriptionRun15.slantDefined = false;
2854 fontDescriptionRun15.sizeDefined = false;
2856 // Set a known font description
2857 FontDescriptionRun fontDescriptionRun16;
2858 fontDescriptionRun16.characterRun.characterIndex = 166u;
2859 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2860 fontDescriptionRun16.familyLength = fontLatin.size();
2861 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2862 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2863 fontDescriptionRun16.familyDefined = true;
2864 fontDescriptionRun16.weightDefined = false;
2865 fontDescriptionRun16.widthDefined = false;
2866 fontDescriptionRun16.slantDefined = false;
2867 fontDescriptionRun16.sizeDefined = false;
2869 // Set a known font description
2870 FontDescriptionRun fontDescriptionRun17;
2871 fontDescriptionRun17.characterRun.characterIndex = 178u;
2872 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2873 fontDescriptionRun17.familyLength = fontArabic.size();
2874 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2875 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2876 fontDescriptionRun17.familyDefined = true;
2877 fontDescriptionRun17.weightDefined = false;
2878 fontDescriptionRun17.widthDefined = false;
2879 fontDescriptionRun17.slantDefined = false;
2880 fontDescriptionRun17.sizeDefined = false;
2882 Vector<FontDescriptionRun> fontDescriptionRuns;
2883 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2884 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2885 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2886 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2887 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2888 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2889 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2890 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2891 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2892 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2893 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2894 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2895 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2896 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2897 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2898 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2899 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2900 Size textArea(100.f, 300.f);
2901 Size layoutSize(100.f, 361.f);
2904 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
2905 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
2906 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
2907 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
2908 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
2909 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63
2910 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
2911 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
2912 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
2913 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
2914 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
2915 23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f, // 123 .. 127
2916 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
2917 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
2918 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
2919 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
2920 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
2921 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
2924 struct LineRun line01 =
2937 struct LineRun line02 =
2950 struct LineRun line03 =