2 * Copyright (c) 2017 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 : " << 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" );
88 // 1) Create the model.
89 LogicalModelPtr logicalModel;
90 VisualModelPtr visualModel;
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.reorder = false;
104 options.align = false;
105 CreateTextModel( data.text,
114 // 2) Clear the layout.
115 Vector<LineRun>& lines = visualModel->mLines;
117 const Length numberOfCharacters = logicalModel->mText.Count();
118 const bool isLastNewParagraph = ( 0u == numberOfCharacters ) ? false : TextAbstraction::IsNewParagraph( *( logicalModel->mText.Begin() + ( numberOfCharacters - 1u ) ) );
119 const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u;
120 const bool removeLastLine = isLastNewParagraph && ( lastGlyphIndex + 1u == visualModel->mGlyphs.Count() );
122 LineIndex startRemoveIndex = 0u;
124 if( 0u != lines.Count() )
126 startRemoveIndex = lines.Count();
127 LineIndex endRemoveIndex = startRemoveIndex;
128 ClearGlyphRuns( data.startIndex,
129 lastGlyphIndex + ( removeLastLine ? 1u : 0u ),
134 // Update the character runs of the lines.
135 const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
136 const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin();
137 const CharacterIndex startCharacterIndex = *( glyphsToCharactersBuffer + data.startIndex );
138 const CharacterIndex lastCharacterIndex = *( glyphsToCharactersBuffer + lastGlyphIndex ) + *( charactersPerGlyph + lastGlyphIndex ) - 1u;
139 ClearCharacterRuns( startCharacterIndex,
140 lastCharacterIndex + ( removeLastLine ? 1u : 0u ),
145 lines.Erase( lines.Begin() + startRemoveIndex,
146 lines.Begin() + endRemoveIndex );
149 Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
151 glyphPositions.Erase( glyphPositions.Begin() + data.startIndex,
152 glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs );
155 Layout::Engine engine;
156 engine.SetMetrics( metrics );
157 engine.SetLayout( data.layout );
159 const Length totalNumberOfGlyphs = visualModel->mGlyphs.Count();
160 float outlineWidth = visualModel->GetOutlineWidth();
162 Layout::Parameters layoutParameters( data.textArea,
163 logicalModel->mText.Begin(),
164 logicalModel->mLineBreakInfo.Begin(),
165 logicalModel->mWordBreakInfo.Begin(),
166 ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
167 visualModel->mGlyphs.Begin(),
168 visualModel->mGlyphsToCharacters.Begin(),
169 visualModel->mCharactersPerGlyph.Begin(),
170 visualModel->mCharactersToGlyph.Begin(),
171 visualModel->mGlyphsPerCharacter.Begin(),
173 Text::HorizontalAlignment::BEGIN,
174 Text::LineWrap::WORD,
177 layoutParameters.isLastNewParagraph = isLastNewParagraph;
179 // The initial glyph and the number of glyphs to layout.
180 layoutParameters.startGlyphIndex = data.startIndex;
181 layoutParameters.numberOfGlyphs = data.numberOfGlyphs;
182 layoutParameters.startLineIndex = startRemoveIndex;
183 layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
185 layoutSize = Vector2::ZERO;
187 const bool updated = engine.LayoutText( layoutParameters,
193 // 4) Compare the results.
195 if( updated != data.updated )
197 std::cout << " Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
201 if( layoutSize != data.layoutSize )
203 std::cout << " Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
207 for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
209 const Vector2& position = *( glyphPositions.Begin() + index );
211 if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
213 std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
216 if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
218 std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
223 if( lines.Count() != data.numberOfLines )
225 std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
229 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
231 const LineRun& line = *( lines.Begin() + index );
232 const LineRun& expectedLine = *( data.lines + index );
234 if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex )
236 std::cout << " Different line info for line : " << index << std::endl;
238 std::cout << " expected" << std::endl;
239 Print( expectedLine );
242 if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs )
244 std::cout << " Different line info for line : " << index << std::endl;
246 std::cout << " expected" << std::endl;
247 Print( expectedLine );
251 if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex )
253 std::cout << " Different line info for line : " << index << std::endl;
255 std::cout << " expected" << std::endl;
256 Print( expectedLine );
259 if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters )
261 std::cout << " Different line info for line : " << index << std::endl;
263 std::cout << " expected" << std::endl;
264 Print( expectedLine );
268 if( fabsf( line.width - expectedLine.width ) > 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.ascender - expectedLine.ascender ) > 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.descender - expectedLine.descender ) > 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( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 )
297 std::cout << " Different line info for line : " << index << std::endl;
299 std::cout << " expected" << std::endl;
300 Print( expectedLine );
304 if( line.ellipsis != expectedLine.ellipsis )
306 std::cout << " Different line info for line : " << index << std::endl;
308 std::cout << " expected" << std::endl;
309 Print( expectedLine );
313 // Do not compare the alignment offset as it's not calculated in the layout.
314 // Do not compare the line direction as it's not set in the layout.
320 //////////////////////////////////////////////////////////
322 struct ReLayoutRightToLeftLinesData
324 std::string description;
327 unsigned int numberOfFonts;
328 FontDescriptionRun* fontDescriptions;
329 unsigned int totalNumberOfGlyphs;
331 unsigned int startIndex;
332 unsigned int numberOfCharacters;
335 bool ReLayoutRightToLeftLinesTest( const ReLayoutRightToLeftLinesData& data )
338 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
339 fontClient.SetDpi( 96u, 96u );
341 char* pathNamePtr = get_current_dir_name();
342 const std::string pathName( pathNamePtr );
345 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
346 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
347 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
349 // 1) Create the model.
350 LogicalModelPtr logicalModel;
351 VisualModelPtr visualModel;
355 Vector<FontDescriptionRun> fontDescriptionRuns;
356 if( 0u != data.numberOfFonts )
358 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
359 data.fontDescriptions,
360 data.fontDescriptions + data.numberOfFonts );
363 LayoutOptions options;
364 options.reorder = false;
365 options.align = false;
366 CreateTextModel( data.text,
375 // 2) Call the ReLayoutRightToLeftLines() method.
376 Layout::Engine engine;
377 engine.SetMetrics( metrics );
379 float outlineWidth = visualModel->GetOutlineWidth();
380 Layout::Parameters layoutParameters( data.textArea,
381 logicalModel->mText.Begin(),
382 logicalModel->mLineBreakInfo.Begin(),
383 logicalModel->mWordBreakInfo.Begin(),
384 ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
385 visualModel->mGlyphs.Begin(),
386 visualModel->mGlyphsToCharacters.Begin(),
387 visualModel->mCharactersPerGlyph.Begin(),
388 visualModel->mCharactersToGlyph.Begin(),
389 visualModel->mGlyphsPerCharacter.Begin(),
390 visualModel->mGlyphs.Count(),
391 Text::HorizontalAlignment::BEGIN,
392 Text::LineWrap::WORD,
395 layoutParameters.numberOfBidirectionalInfoRuns = logicalModel->mBidirectionalLineInfo.Count();
396 layoutParameters.lineBidirectionalInfoRunsBuffer = logicalModel->mBidirectionalLineInfo.Begin();
398 engine.ReLayoutRightToLeftLines( layoutParameters,
400 data.numberOfCharacters,
401 visualModel->mGlyphPositions );
403 // 3) Compare the results.
404 Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
406 if( data.totalNumberOfGlyphs != visualModel->mGlyphs.Count() )
408 std::cout << " Different number of glyphs : " << visualModel->mGlyphs.Count() << ", expected : " << data.totalNumberOfGlyphs << std::endl;
412 for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
414 const Vector2& position = *( glyphPositions.Begin() + index );
416 if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
418 std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
421 if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
423 std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
431 //////////////////////////////////////////////////////////
435 std::string description;
438 unsigned int numberOfFonts;
439 FontDescriptionRun* fontDescriptions;
440 Text::HorizontalAlignment::Type horizontalAlignment;
441 Text::VerticalAlignment::Type verticalAlignment;
442 unsigned int startIndex;
443 unsigned int numberOfCharacters;
444 unsigned int numberOfLines;
448 bool AlignTest( const AlignData& data )
451 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
452 fontClient.SetDpi( 96u, 96u );
454 char* pathNamePtr = get_current_dir_name();
455 const std::string pathName( pathNamePtr );
458 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
459 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
460 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
462 // 1) Create the model.
463 LogicalModelPtr logicalModel;
464 VisualModelPtr visualModel;
468 Vector<FontDescriptionRun> fontDescriptionRuns;
469 if( 0u != data.numberOfFonts )
471 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
472 data.fontDescriptions,
473 data.fontDescriptions + data.numberOfFonts );
476 LayoutOptions options;
477 options.align = false;
478 CreateTextModel( data.text,
487 // Call the Align method.
488 Layout::Engine engine;
489 engine.SetMetrics( metrics );
491 float alignmentOffset = 0.f;
492 engine.Align( data.textArea,
494 data.numberOfCharacters,
495 data.horizontalAlignment,
500 if( data.numberOfLines != visualModel->mLines.Count() )
502 std::cout << " Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
506 const LineRun* const linesBuffer = visualModel->mLines.Begin();
507 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
509 const LineRun& line = *( linesBuffer + index );
511 if( line.alignmentOffset != *( data.lineOffsets + index ) )
513 std::cout << " different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl;
523 //////////////////////////////////////////////////////////
525 // UtcDaliTextLayoutSetGetLayout
526 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
527 // UtcDaliTextLayoutSetGetHorizontalAlignment
528 // UtcDaliTextLayoutSetGetVerticalAlignment
529 // UtcDaliTextLayoutSetGetCursorWidth
530 // UtcDaliTextLayoutNoText
531 // UtcDaliTextLayoutSmallTextArea01
532 // UtcDaliTextLayoutSmallTextArea02
533 // UtcDaliTextLayoutMultilineText01
534 // UtcDaliTextLayoutMultilineText02
535 // UtcDaliTextLayoutMultilineText03
536 // UtcDaliTextLayoutMultilineText04
537 // UtcDaliTextLayoutMultilineText05
538 // UtcDaliTextUpdateLayout01
539 // UtcDaliTextUpdateLayout02
540 // UtcDaliTextUpdateLayout03
541 // UtcDaliTextLayoutEllipsis01
542 // UtcDaliTextLayoutEllipsis02
543 // UtcDaliTextLayoutEllipsis03
544 // UtcDaliTextLayoutEllipsis04
545 // UtcDaliTextLayoutEllipsis04
546 // UtcDaliTextReorderLayout01
547 // UtcDaliTextReorderLayout02
548 // UtcDaliTextReorderLayout03
549 // UtcDaliTextReorderLayout04
550 // UtcDaliTextAlign01
551 // UtcDaliTextAlign02
552 // UtcDaliTextAlign03
553 // UtcDaliTextAlign04
554 // UtcDaliTextAlign05
555 // UtcDaliTextAlign06
556 // UtcDaliTextAlign07
557 // UtcDaliTextAlign08
558 // UtcDaliTextAlign09
560 //////////////////////////////////////////////////////////
562 int UtcDaliTextLayoutSetGetLayout(void)
564 ToolkitTestApplication application;
565 tet_infoline(" UtcDaliTextLayoutSetGetLayout");
567 Layout::Engine engine;
569 DALI_TEST_CHECK( Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout() );
571 engine.SetLayout( Layout::Engine::MULTI_LINE_BOX );
572 DALI_TEST_CHECK( Layout::Engine::MULTI_LINE_BOX == engine.GetLayout() );
574 tet_result(TET_PASS);
578 int UtcDaliTextLayoutSetGetCursorWidth(void)
580 ToolkitTestApplication application;
583 Layout::Engine engine;
585 DALI_TEST_EQUALS( 1, engine.GetCursorWidth(), TEST_LOCATION );
587 engine.SetCursorWidth( 2 );
588 DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
590 tet_result(TET_PASS);
594 int UtcDaliTextLayoutNoText(void)
596 ToolkitTestApplication application;
597 tet_infoline(" UtcDaliTextLayoutNoText");
599 Size textArea(100.f, 60.f);
600 Size layoutSize = Vector2::ZERO;
601 LayoutTextData data =
613 Layout::Engine::MULTI_LINE_BOX,
620 if( !LayoutTextTest( data ) )
622 tet_result(TET_FAIL);
625 tet_result(TET_PASS);
629 int UtcDaliTextLayoutSmallTextArea01(void)
631 ToolkitTestApplication application;
632 tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
634 // Won't layout the text in multi-line if the width is too small.
636 const std::string fontFamily( "TizenSans" );
638 // Set a known font description
639 FontDescriptionRun fontDescriptionRun;
640 fontDescriptionRun.characterRun.characterIndex = 0u;
641 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
642 fontDescriptionRun.familyLength = fontFamily.size();
643 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
644 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
645 fontDescriptionRun.familyDefined = true;
646 fontDescriptionRun.weightDefined = false;
647 fontDescriptionRun.widthDefined = false;
648 fontDescriptionRun.slantDefined = false;
649 fontDescriptionRun.sizeDefined = false;
651 Vector<FontDescriptionRun> fontDescriptionRuns;
652 fontDescriptionRuns.PushBack( fontDescriptionRun );
653 Size textArea(1.f, 1.f);
654 Size layoutSize = Vector2::ZERO;
655 LayoutTextData data =
657 "Layout text in a small area",
661 fontDescriptionRuns.Begin(),
667 Layout::Engine::MULTI_LINE_BOX,
674 if( !LayoutTextTest( data ) )
676 tet_result(TET_FAIL);
679 tet_result(TET_PASS);
683 int UtcDaliTextLayoutSmallTextArea02(void)
685 ToolkitTestApplication application;
686 tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
688 // Will layout the text in single line as it can be scrolled.
690 const std::string fontFamily( "TizenSans" );
692 // Set a known font description
693 FontDescriptionRun fontDescriptionRun;
694 fontDescriptionRun.characterRun.characterIndex = 0u;
695 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
696 fontDescriptionRun.familyLength = fontFamily.size();
697 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
698 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
699 fontDescriptionRun.familyDefined = true;
700 fontDescriptionRun.weightDefined = false;
701 fontDescriptionRun.widthDefined = false;
702 fontDescriptionRun.slantDefined = false;
703 fontDescriptionRun.sizeDefined = false;
705 Vector<FontDescriptionRun> fontDescriptionRuns;
706 fontDescriptionRuns.PushBack( fontDescriptionRun );
707 Size textArea(1.f, 1.f);
708 Size layoutSize(80.f, 20.f);
709 float positions[] = { 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f };
710 struct LineRun line =
722 Vector<LineRun> lines;
723 lines.PushBack( line );
725 LayoutTextData data =
727 "Layout text in a small area",
731 fontDescriptionRuns.Begin(),
737 Layout::Engine::SINGLE_LINE_BOX,
744 if( !LayoutTextTest( data ) )
746 tet_result(TET_FAIL);
749 tet_result(TET_PASS);
753 int UtcDaliTextLayoutMultilineText01(void)
755 ToolkitTestApplication application;
756 tet_infoline(" UtcDaliTextLayoutMultilineText01");
758 // Layout some lines of left to right text.
760 const std::string fontFamily( "TizenSans" );
762 // Set a known font description
763 FontDescriptionRun fontDescriptionRun1;
764 fontDescriptionRun1.characterRun.characterIndex = 0u;
765 fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
766 fontDescriptionRun1.familyLength = fontFamily.size();
767 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
768 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
769 fontDescriptionRun1.familyDefined = true;
770 fontDescriptionRun1.weightDefined = false;
771 fontDescriptionRun1.widthDefined = false;
772 fontDescriptionRun1.slantDefined = false;
773 fontDescriptionRun1.sizeDefined = false;
775 FontDescriptionRun fontDescriptionRun2;
776 fontDescriptionRun2.characterRun.characterIndex = 18u;
777 fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
778 fontDescriptionRun2.familyLength = fontFamily.size();
779 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
780 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
781 fontDescriptionRun2.familyDefined = true;
782 fontDescriptionRun2.weightDefined = false;
783 fontDescriptionRun2.widthDefined = false;
784 fontDescriptionRun2.slantDefined = false;
785 fontDescriptionRun2.sizeDefined = false;
787 Vector<FontDescriptionRun> fontDescriptionRuns;
788 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
789 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
790 Size textArea(100.f, 300.f);
791 Size layoutSize(95.f, 97.f);
794 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
795 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
796 1.f, -12.f, 9.f, -9.f, 17.f, -9.f, 27.f, -9.f, 36.f, -9.f, 45.f, -11.f, 51.f, -0.f,
797 1.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f, -9.f, 35.f, -9.f, 41.f, -9.f, 50.f, -9.f, 59.f, -11.f, 65.f, -0.f,
798 1.f, -12.f, 5.f, -12.f, 9.f, -9.f, 19.f, -9.f, 28.f, -9.f, 35.f, -0.f, 41.f, -9.f, 50.f, -12.f, 54.f, -0.f, 59.f, -11.f, 66.f, -9.f, 75.f, -9.f, 83.f, -11.f, 91.f, -2.f
800 struct LineRun line0 =
812 struct LineRun line1 =
824 struct LineRun line2 =
836 struct LineRun line3 =
848 struct LineRun line4 =
860 Vector<LineRun> lines;
861 lines.PushBack( line0 );
862 lines.PushBack( line1 );
863 lines.PushBack( line2 );
864 lines.PushBack( line3 );
865 lines.PushBack( line4 );
867 LayoutTextData data =
869 "Layout simple multi-line text",
870 "Hello world demo.\n"
871 "Layout different lines of text.",
874 fontDescriptionRuns.Begin(),
880 Layout::Engine::MULTI_LINE_BOX,
887 if( !LayoutTextTest( data ) )
889 tet_result(TET_FAIL);
892 tet_result(TET_PASS);
896 int UtcDaliTextLayoutMultilineText02(void)
898 ToolkitTestApplication application;
899 tet_infoline(" UtcDaliTextLayoutMultilineText02");
901 // Layout some lines of bidirectional text.
903 const std::string fontFamily1( "TizenSans" );
905 // Set a known font description
906 FontDescriptionRun fontDescriptionRun1;
907 fontDescriptionRun1.characterRun.characterIndex = 0u;
908 fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
909 fontDescriptionRun1.familyLength = fontFamily1.size();
910 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
911 memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength );
912 fontDescriptionRun1.familyDefined = true;
913 fontDescriptionRun1.weightDefined = false;
914 fontDescriptionRun1.widthDefined = false;
915 fontDescriptionRun1.slantDefined = false;
916 fontDescriptionRun1.sizeDefined = false;
918 const std::string fontFamily2( "TizenSansHebrew" );
920 // Set a known font description
921 FontDescriptionRun fontDescriptionRun2;
922 fontDescriptionRun2.characterRun.characterIndex = 17u;
923 fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
924 fontDescriptionRun2.familyLength = fontFamily2.size();
925 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
926 memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
927 fontDescriptionRun2.familyDefined = true;
928 fontDescriptionRun2.weightDefined = false;
929 fontDescriptionRun2.widthDefined = false;
930 fontDescriptionRun2.slantDefined = false;
931 fontDescriptionRun2.sizeDefined = false;
933 const std::string fontFamily3( "TizenSans" );
935 // Set a known font description
936 FontDescriptionRun fontDescriptionRun3;
937 fontDescriptionRun3.characterRun.characterIndex = 26u;
938 fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
939 fontDescriptionRun3.familyLength = fontFamily3.size();
940 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
941 memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
942 fontDescriptionRun3.familyDefined = true;
943 fontDescriptionRun3.weightDefined = false;
944 fontDescriptionRun3.widthDefined = false;
945 fontDescriptionRun3.slantDefined = false;
946 fontDescriptionRun3.sizeDefined = false;
948 const std::string fontFamily4( "TizenSansHebrew" );
950 // Set a known font description
951 FontDescriptionRun fontDescriptionRun4;
952 fontDescriptionRun4.characterRun.characterIndex = 28u;
953 fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
954 fontDescriptionRun4.familyLength = fontFamily4.size();
955 fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
956 memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
957 fontDescriptionRun4.familyDefined = true;
958 fontDescriptionRun4.weightDefined = false;
959 fontDescriptionRun4.widthDefined = false;
960 fontDescriptionRun4.slantDefined = false;
961 fontDescriptionRun4.sizeDefined = false;
963 const std::string fontFamily5( "TizenSans" );
965 // Set a known font description
966 FontDescriptionRun fontDescriptionRun5;
967 fontDescriptionRun5.characterRun.characterIndex = 38u;
968 fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
969 fontDescriptionRun5.familyLength = fontFamily5.size();
970 fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
971 memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
972 fontDescriptionRun5.familyDefined = true;
973 fontDescriptionRun5.weightDefined = false;
974 fontDescriptionRun5.widthDefined = false;
975 fontDescriptionRun5.slantDefined = false;
976 fontDescriptionRun5.sizeDefined = false;
978 Vector<FontDescriptionRun> fontDescriptionRuns;
979 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
980 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
981 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
982 fontDescriptionRuns.PushBack( fontDescriptionRun4 );
983 fontDescriptionRuns.PushBack( fontDescriptionRun5 );
984 Size textArea(100.f, 300.f);
985 Size layoutSize(81.f, 120.f);
988 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
989 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
990 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
991 1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
992 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
993 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f,
995 struct LineRun line0 =
1007 struct LineRun line1 =
1019 struct LineRun line2 =
1031 struct LineRun line3 =
1043 struct LineRun line4 =
1055 struct LineRun line5 =
1067 Vector<LineRun> lines;
1068 lines.PushBack( line0 );
1069 lines.PushBack( line1 );
1070 lines.PushBack( line2 );
1071 lines.PushBack( line3 );
1072 lines.PushBack( line4 );
1073 lines.PushBack( line5 );
1075 LayoutTextData data =
1077 "Layout bidirectional text.",
1078 "Hello world demo שלום עולם.\n"
1079 "שלום עולם hello world demo.",
1082 fontDescriptionRuns.Begin(),
1088 Layout::Engine::MULTI_LINE_BOX,
1095 if( !LayoutTextTest( data ) )
1097 tet_result(TET_FAIL);
1100 tet_result(TET_PASS);
1104 int UtcDaliTextLayoutMultilineText03(void)
1106 ToolkitTestApplication application;
1107 tet_infoline(" UtcDaliTextLayoutMultilineText03");
1109 // Layout a long word which doesn't fit in the width of the text area.
1111 const std::string fontFamily( "TizenSans" );
1113 // Set a known font description
1114 FontDescriptionRun fontDescriptionRun;
1115 fontDescriptionRun.characterRun.characterIndex = 0u;
1116 fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1117 fontDescriptionRun.familyLength = fontFamily.size();
1118 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1119 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1120 fontDescriptionRun.familyDefined = true;
1121 fontDescriptionRun.weightDefined = false;
1122 fontDescriptionRun.widthDefined = false;
1123 fontDescriptionRun.slantDefined = false;
1124 fontDescriptionRun.sizeDefined = false;
1126 Vector<FontDescriptionRun> fontDescriptionRuns;
1127 fontDescriptionRuns.PushBack( fontDescriptionRun );
1128 Size textArea(100.f, 300.f);
1129 Size layoutSize(96.f, 60.f);
1132 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -9.f, 47.f, -9.f, 57.f, -9.f, 63.f, -13.f, 66.f, -13.f, 75.f, -13.f, 85.f, -9.f,
1133 1.f, -9.f, 13.f, -9.f, 23.f, -13.f, 32.f, -9.f, 40.f, -13.f, 44.f, -13.f, 47.f, -9.f, 56.f, -9.f, 67.f, -9.f, 77.f, -9.f, 83.f, -13.f, 86.f, -13.f,
1134 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f,
1136 struct LineRun line0 =
1148 struct LineRun line1 =
1160 struct LineRun line2 =
1172 Vector<LineRun> lines;
1173 lines.PushBack( line0 );
1174 lines.PushBack( line1 );
1175 lines.PushBack( line2 );
1177 LayoutTextData data =
1179 "Layout a long word which doesn't fit in the width of the text area.",
1180 "Helloworlddemohelloworlddemo.",
1183 fontDescriptionRuns.Begin(),
1189 Layout::Engine::MULTI_LINE_BOX,
1196 if( !LayoutTextTest( data ) )
1198 tet_result(TET_FAIL);
1201 tet_result(TET_PASS);
1205 int UtcDaliTextLayoutMultilineText04(void)
1207 ToolkitTestApplication application;
1208 tet_infoline(" UtcDaliTextLayoutMultilineText04");
1210 // Layout simple text ending with a \n. It has to add a void line at the end.
1212 const std::string fontFamily( "TizenSans" );
1214 // Set a known font description
1215 FontDescriptionRun fontDescriptionRun;
1216 fontDescriptionRun.characterRun.characterIndex = 0u;
1217 fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1218 fontDescriptionRun.familyLength = fontFamily.size();
1219 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1220 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1221 fontDescriptionRun.familyDefined = true;
1222 fontDescriptionRun.weightDefined = false;
1223 fontDescriptionRun.widthDefined = false;
1224 fontDescriptionRun.slantDefined = false;
1225 fontDescriptionRun.sizeDefined = false;
1227 Vector<FontDescriptionRun> fontDescriptionRuns;
1228 fontDescriptionRuns.PushBack( fontDescriptionRun );
1229 Size textArea(100.f, 300.f);
1230 Size layoutSize(83.f, 40.f);
1233 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -3.f, 82.f, -12.f
1235 struct LineRun line0 =
1247 struct LineRun line1 =
1259 Vector<LineRun> lines;
1260 lines.PushBack( line0 );
1261 lines.PushBack( line1 );
1263 LayoutTextData data =
1265 "Layout simple text ending with a \n.",
1269 fontDescriptionRuns.Begin(),
1275 Layout::Engine::MULTI_LINE_BOX,
1282 if( !LayoutTextTest( data ) )
1284 tet_result(TET_FAIL);
1287 tet_result(TET_PASS);
1291 int UtcDaliTextLayoutMultilineText05(void)
1293 ToolkitTestApplication application;
1294 tet_infoline(" UtcDaliTextLayoutMultilineText05");
1296 // Layout simple text with one character with a different font size.
1298 const std::string fontFamily( "TizenSans" );
1300 // Set a known font description
1301 FontDescriptionRun fontDescriptionRun1;
1302 fontDescriptionRun1.characterRun.characterIndex = 0u;
1303 fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1304 fontDescriptionRun1.familyLength = fontFamily.size();
1305 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1306 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1307 fontDescriptionRun1.familyDefined = true;
1308 fontDescriptionRun1.weightDefined = false;
1309 fontDescriptionRun1.widthDefined = false;
1310 fontDescriptionRun1.slantDefined = false;
1311 fontDescriptionRun1.sizeDefined = false;
1313 FontDescriptionRun fontDescriptionRun2;
1314 fontDescriptionRun2.characterRun.characterIndex = 6u;
1315 fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1316 fontDescriptionRun2.familyLength = fontFamily.size();
1317 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1318 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1319 fontDescriptionRun2.size = 1280u;
1320 fontDescriptionRun2.familyDefined = true;
1321 fontDescriptionRun2.weightDefined = false;
1322 fontDescriptionRun2.widthDefined = false;
1323 fontDescriptionRun2.slantDefined = false;
1324 fontDescriptionRun2.sizeDefined = true;
1326 FontDescriptionRun fontDescriptionRun3;
1327 fontDescriptionRun3.characterRun.characterIndex = 7u;
1328 fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1329 fontDescriptionRun3.familyLength = fontFamily.size();
1330 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1331 memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1332 fontDescriptionRun3.familyDefined = true;
1333 fontDescriptionRun3.weightDefined = false;
1334 fontDescriptionRun3.widthDefined = false;
1335 fontDescriptionRun3.slantDefined = false;
1336 fontDescriptionRun3.sizeDefined = false;
1338 Vector<FontDescriptionRun> fontDescriptionRuns;
1339 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1340 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1341 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1342 Size textArea(100.f, 300.f);
1343 Size layoutSize(88.f, 53.f);
1346 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 59.f, -9.f, 69.f, -9.f, 75.f, -13.f, 78.f, -13.f, 87.f, -0.f,
1347 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f
1349 struct LineRun line0 =
1361 struct LineRun line1 =
1373 Vector<LineRun> lines;
1374 lines.PushBack( line0 );
1375 lines.PushBack( line1 );
1377 LayoutTextData data =
1379 "Layout simple text with one character with a different font size.",
1380 "Hello world demo.",
1383 fontDescriptionRuns.Begin(),
1389 Layout::Engine::MULTI_LINE_BOX,
1396 if( !LayoutTextTest( data ) )
1398 tet_result(TET_FAIL);
1401 tet_result(TET_PASS);
1405 int UtcDaliTextUpdateLayout01(void)
1407 ToolkitTestApplication application;
1408 tet_infoline(" UtcDaliTextUpdateLayout01");
1410 // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1412 const std::string fontLatin( "TizenSans" );
1413 const std::string fontHebrew( "TizenSansHebrew" );
1414 const std::string fontArabic( "TizenSansArabic" );
1416 // Set a known font description
1417 FontDescriptionRun fontDescriptionRun01;
1418 fontDescriptionRun01.characterRun.characterIndex = 0u;
1419 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1420 fontDescriptionRun01.familyLength = fontLatin.size();
1421 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1422 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1423 fontDescriptionRun01.familyDefined = true;
1424 fontDescriptionRun01.weightDefined = false;
1425 fontDescriptionRun01.widthDefined = false;
1426 fontDescriptionRun01.slantDefined = false;
1427 fontDescriptionRun01.sizeDefined = false;
1429 // Set a known font description
1430 FontDescriptionRun fontDescriptionRun02;
1431 fontDescriptionRun02.characterRun.characterIndex = 17u;
1432 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1433 fontDescriptionRun02.familyLength = fontHebrew.size();
1434 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1435 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1436 fontDescriptionRun02.familyDefined = true;
1437 fontDescriptionRun02.weightDefined = false;
1438 fontDescriptionRun02.widthDefined = false;
1439 fontDescriptionRun02.slantDefined = false;
1440 fontDescriptionRun02.sizeDefined = false;
1442 // Set a known font description
1443 FontDescriptionRun fontDescriptionRun03;
1444 fontDescriptionRun03.characterRun.characterIndex = 26u;
1445 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1446 fontDescriptionRun03.familyLength = fontLatin.size();
1447 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1448 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1449 fontDescriptionRun03.familyDefined = true;
1450 fontDescriptionRun03.weightDefined = false;
1451 fontDescriptionRun03.widthDefined = false;
1452 fontDescriptionRun03.slantDefined = false;
1453 fontDescriptionRun03.sizeDefined = false;
1455 // Set a known font description
1456 FontDescriptionRun fontDescriptionRun04;
1457 fontDescriptionRun04.characterRun.characterIndex = 28u;
1458 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1459 fontDescriptionRun04.familyLength = fontArabic.size();
1460 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1461 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
1462 fontDescriptionRun04.familyDefined = true;
1463 fontDescriptionRun04.weightDefined = false;
1464 fontDescriptionRun04.widthDefined = false;
1465 fontDescriptionRun04.slantDefined = false;
1466 fontDescriptionRun04.sizeDefined = false;
1468 // Set a known font description
1469 FontDescriptionRun fontDescriptionRun05;
1470 fontDescriptionRun05.characterRun.characterIndex = 42u;
1471 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1472 fontDescriptionRun05.familyLength = fontLatin.size();
1473 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1474 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
1475 fontDescriptionRun05.familyDefined = true;
1476 fontDescriptionRun05.weightDefined = false;
1477 fontDescriptionRun05.widthDefined = false;
1478 fontDescriptionRun05.slantDefined = false;
1479 fontDescriptionRun05.sizeDefined = false;
1481 // Set a known font description
1482 FontDescriptionRun fontDescriptionRun06;
1483 fontDescriptionRun06.characterRun.characterIndex = 54u;
1484 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1485 fontDescriptionRun06.familyLength = fontHebrew.size();
1486 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1487 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1488 fontDescriptionRun06.familyDefined = true;
1489 fontDescriptionRun06.weightDefined = false;
1490 fontDescriptionRun06.widthDefined = false;
1491 fontDescriptionRun06.slantDefined = false;
1492 fontDescriptionRun06.sizeDefined = false;
1494 // Set a known font description
1495 FontDescriptionRun fontDescriptionRun07;
1496 fontDescriptionRun07.characterRun.characterIndex = 64u;
1497 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1498 fontDescriptionRun07.familyLength = fontHebrew.size();
1499 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1500 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
1501 fontDescriptionRun07.familyDefined = true;
1502 fontDescriptionRun07.weightDefined = false;
1503 fontDescriptionRun07.widthDefined = false;
1504 fontDescriptionRun07.slantDefined = false;
1505 fontDescriptionRun07.sizeDefined = false;
1507 // Set a known font description
1508 FontDescriptionRun fontDescriptionRun08;
1509 fontDescriptionRun08.characterRun.characterIndex = 74u;
1510 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1511 fontDescriptionRun08.familyLength = fontLatin.size();
1512 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1513 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1514 fontDescriptionRun08.familyDefined = true;
1515 fontDescriptionRun08.weightDefined = false;
1516 fontDescriptionRun08.widthDefined = false;
1517 fontDescriptionRun08.slantDefined = false;
1518 fontDescriptionRun08.sizeDefined = false;
1520 // Set a known font description
1521 FontDescriptionRun fontDescriptionRun09;
1522 fontDescriptionRun09.characterRun.characterIndex = 92u;
1523 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1524 fontDescriptionRun09.familyLength = fontLatin.size();
1525 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1526 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
1527 fontDescriptionRun09.familyDefined = true;
1528 fontDescriptionRun09.weightDefined = false;
1529 fontDescriptionRun09.widthDefined = false;
1530 fontDescriptionRun09.slantDefined = false;
1531 fontDescriptionRun09.sizeDefined = false;
1533 // Set a known font description
1534 FontDescriptionRun fontDescriptionRun10;
1535 fontDescriptionRun10.characterRun.characterIndex = 104u;
1536 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1537 fontDescriptionRun10.familyLength = fontArabic.size();
1538 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1539 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
1540 fontDescriptionRun10.familyDefined = true;
1541 fontDescriptionRun10.weightDefined = false;
1542 fontDescriptionRun10.widthDefined = false;
1543 fontDescriptionRun10.slantDefined = false;
1544 fontDescriptionRun10.sizeDefined = false;
1546 // Set a known font description
1547 FontDescriptionRun fontDescriptionRun11;
1548 fontDescriptionRun11.characterRun.characterIndex = 118u;
1549 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1550 fontDescriptionRun11.familyLength = fontHebrew.size();
1551 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1552 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
1553 fontDescriptionRun11.familyDefined = true;
1554 fontDescriptionRun11.weightDefined = false;
1555 fontDescriptionRun11.widthDefined = false;
1556 fontDescriptionRun11.slantDefined = false;
1557 fontDescriptionRun11.sizeDefined = false;
1559 // Set a known font description
1560 FontDescriptionRun fontDescriptionRun12;
1561 fontDescriptionRun12.characterRun.characterIndex = 128u;
1562 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1563 fontDescriptionRun12.familyLength = fontLatin.size();
1564 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1565 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
1566 fontDescriptionRun12.familyDefined = true;
1567 fontDescriptionRun12.weightDefined = false;
1568 fontDescriptionRun12.widthDefined = false;
1569 fontDescriptionRun12.slantDefined = false;
1570 fontDescriptionRun12.sizeDefined = false;
1572 // Set a known font description
1573 FontDescriptionRun fontDescriptionRun13;
1574 fontDescriptionRun13.characterRun.characterIndex = 145u;
1575 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1576 fontDescriptionRun13.familyLength = fontHebrew.size();
1577 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1578 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1579 fontDescriptionRun13.familyDefined = true;
1580 fontDescriptionRun13.weightDefined = false;
1581 fontDescriptionRun13.widthDefined = false;
1582 fontDescriptionRun13.slantDefined = false;
1583 fontDescriptionRun13.sizeDefined = false;
1585 // Set a known font description
1586 FontDescriptionRun fontDescriptionRun14;
1587 fontDescriptionRun14.characterRun.characterIndex = 154u;
1588 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1589 fontDescriptionRun14.familyLength = fontLatin.size();
1590 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1591 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1592 fontDescriptionRun14.familyDefined = true;
1593 fontDescriptionRun14.weightDefined = false;
1594 fontDescriptionRun14.widthDefined = false;
1595 fontDescriptionRun14.slantDefined = false;
1596 fontDescriptionRun14.sizeDefined = false;
1598 // Set a known font description
1599 FontDescriptionRun fontDescriptionRun15;
1600 fontDescriptionRun15.characterRun.characterIndex = 156u;
1601 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1602 fontDescriptionRun15.familyLength = fontHebrew.size();
1603 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1604 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
1605 fontDescriptionRun15.familyDefined = true;
1606 fontDescriptionRun15.weightDefined = false;
1607 fontDescriptionRun15.widthDefined = false;
1608 fontDescriptionRun15.slantDefined = false;
1609 fontDescriptionRun15.sizeDefined = false;
1611 // Set a known font description
1612 FontDescriptionRun fontDescriptionRun16;
1613 fontDescriptionRun16.characterRun.characterIndex = 166u;
1614 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1615 fontDescriptionRun16.familyLength = fontLatin.size();
1616 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
1617 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
1618 fontDescriptionRun16.familyDefined = true;
1619 fontDescriptionRun16.weightDefined = false;
1620 fontDescriptionRun16.widthDefined = false;
1621 fontDescriptionRun16.slantDefined = false;
1622 fontDescriptionRun16.sizeDefined = false;
1624 // Set a known font description
1625 FontDescriptionRun fontDescriptionRun17;
1626 fontDescriptionRun17.characterRun.characterIndex = 178u;
1627 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1628 fontDescriptionRun17.familyLength = fontArabic.size();
1629 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
1630 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
1631 fontDescriptionRun17.familyDefined = true;
1632 fontDescriptionRun17.weightDefined = false;
1633 fontDescriptionRun17.widthDefined = false;
1634 fontDescriptionRun17.slantDefined = false;
1635 fontDescriptionRun17.sizeDefined = false;
1637 Vector<FontDescriptionRun> fontDescriptionRuns;
1638 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1639 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1640 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1641 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1642 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1643 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1644 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1645 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1646 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1647 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1648 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1649 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1650 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1651 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1652 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1653 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
1654 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
1655 Size textArea(100.f, 300.f);
1656 Size layoutSize(92.f, 380.f);
1659 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1660 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1661 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1662 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
1663 0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1664 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1665 1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1666 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1667 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
1668 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1669 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
1670 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1671 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1672 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1673 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1674 1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1675 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1676 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
1679 struct LineRun line01 =
1691 struct LineRun line02 =
1703 struct LineRun line03 =
1715 struct LineRun line04 =
1727 struct LineRun line05 =
1739 struct LineRun line06 =
1751 struct LineRun line07 =
1763 struct LineRun line08 =
1775 struct LineRun line09 =
1787 struct LineRun line10 =
1799 struct LineRun line11 =
1811 struct LineRun line12 =
1823 struct LineRun line13 =
1835 struct LineRun line14 =
1847 struct LineRun line15 =
1859 struct LineRun line16 =
1871 struct LineRun line17 =
1883 struct LineRun line18 =
1895 struct LineRun line19 =
1907 Vector<LineRun> lines;
1908 lines.PushBack( line01 );
1909 lines.PushBack( line02 );
1910 lines.PushBack( line03 );
1911 lines.PushBack( line04 );
1912 lines.PushBack( line05 );
1913 lines.PushBack( line06 );
1914 lines.PushBack( line07 );
1915 lines.PushBack( line08 );
1916 lines.PushBack( line09 );
1917 lines.PushBack( line10 );
1918 lines.PushBack( line11 );
1919 lines.PushBack( line12 );
1920 lines.PushBack( line13 );
1921 lines.PushBack( line14 );
1922 lines.PushBack( line15 );
1923 lines.PushBack( line16 );
1924 lines.PushBack( line17 );
1925 lines.PushBack( line18 );
1926 lines.PushBack( line19 );
1928 LayoutTextData data =
1930 "Layout bidirectional text.",
1931 "Hello world demo שלום עולם.\n"
1932 "مرحبا بالعالم hello world שלום עולם\n"
1933 "שלום עולם hello world demo.\n"
1934 "hello world مرحبا بالعالم שלום עולם\n"
1935 "Hello world demo שלום עולם.\n"
1936 "שלום עולם hello world مرحبا بالعالم\n",
1939 fontDescriptionRuns.Begin(),
1945 Layout::Engine::MULTI_LINE_BOX,
1952 if( !LayoutTextTest( data ) )
1954 tet_result(TET_FAIL);
1957 tet_result(TET_PASS);
1961 int UtcDaliTextUpdateLayout02(void)
1963 ToolkitTestApplication application;
1964 tet_infoline(" UtcDaliTextUpdateLayout02");
1966 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
1968 const std::string fontLatin( "TizenSans" );
1969 const std::string fontHebrew( "TizenSansHebrew" );
1970 const std::string fontArabic( "TizenSansArabic" );
1972 // Set a known font description
1973 FontDescriptionRun fontDescriptionRun01;
1974 fontDescriptionRun01.characterRun.characterIndex = 0u;
1975 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1976 fontDescriptionRun01.familyLength = fontLatin.size();
1977 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1978 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1979 fontDescriptionRun01.familyDefined = true;
1980 fontDescriptionRun01.weightDefined = false;
1981 fontDescriptionRun01.widthDefined = false;
1982 fontDescriptionRun01.slantDefined = false;
1983 fontDescriptionRun01.sizeDefined = false;
1985 // Set a known font description
1986 FontDescriptionRun fontDescriptionRun02;
1987 fontDescriptionRun02.characterRun.characterIndex = 17u;
1988 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1989 fontDescriptionRun02.familyLength = fontHebrew.size();
1990 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1991 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1992 fontDescriptionRun02.familyDefined = true;
1993 fontDescriptionRun02.weightDefined = false;
1994 fontDescriptionRun02.widthDefined = false;
1995 fontDescriptionRun02.slantDefined = false;
1996 fontDescriptionRun02.sizeDefined = false;
1998 // Set a known font description
1999 FontDescriptionRun fontDescriptionRun03;
2000 fontDescriptionRun03.characterRun.characterIndex = 26u;
2001 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2002 fontDescriptionRun03.familyLength = fontLatin.size();
2003 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2004 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2005 fontDescriptionRun03.familyDefined = true;
2006 fontDescriptionRun03.weightDefined = false;
2007 fontDescriptionRun03.widthDefined = false;
2008 fontDescriptionRun03.slantDefined = false;
2009 fontDescriptionRun03.sizeDefined = false;
2011 // Set a known font description
2012 FontDescriptionRun fontDescriptionRun04;
2013 fontDescriptionRun04.characterRun.characterIndex = 28u;
2014 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2015 fontDescriptionRun04.familyLength = fontArabic.size();
2016 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2017 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2018 fontDescriptionRun04.familyDefined = true;
2019 fontDescriptionRun04.weightDefined = false;
2020 fontDescriptionRun04.widthDefined = false;
2021 fontDescriptionRun04.slantDefined = false;
2022 fontDescriptionRun04.sizeDefined = false;
2024 // Set a known font description
2025 FontDescriptionRun fontDescriptionRun05;
2026 fontDescriptionRun05.characterRun.characterIndex = 42u;
2027 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2028 fontDescriptionRun05.familyLength = fontLatin.size();
2029 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2030 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2031 fontDescriptionRun05.familyDefined = true;
2032 fontDescriptionRun05.weightDefined = false;
2033 fontDescriptionRun05.widthDefined = false;
2034 fontDescriptionRun05.slantDefined = false;
2035 fontDescriptionRun05.sizeDefined = false;
2037 // Set a known font description
2038 FontDescriptionRun fontDescriptionRun06;
2039 fontDescriptionRun06.characterRun.characterIndex = 54u;
2040 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2041 fontDescriptionRun06.familyLength = fontHebrew.size();
2042 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2043 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2044 fontDescriptionRun06.familyDefined = true;
2045 fontDescriptionRun06.weightDefined = false;
2046 fontDescriptionRun06.widthDefined = false;
2047 fontDescriptionRun06.slantDefined = false;
2048 fontDescriptionRun06.sizeDefined = false;
2050 // Set a known font description
2051 FontDescriptionRun fontDescriptionRun07;
2052 fontDescriptionRun07.characterRun.characterIndex = 64u;
2053 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2054 fontDescriptionRun07.familyLength = fontHebrew.size();
2055 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2056 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2057 fontDescriptionRun07.familyDefined = true;
2058 fontDescriptionRun07.weightDefined = false;
2059 fontDescriptionRun07.widthDefined = false;
2060 fontDescriptionRun07.slantDefined = false;
2061 fontDescriptionRun07.sizeDefined = false;
2063 // Set a known font description
2064 FontDescriptionRun fontDescriptionRun08;
2065 fontDescriptionRun08.characterRun.characterIndex = 74u;
2066 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2067 fontDescriptionRun08.familyLength = fontLatin.size();
2068 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2069 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2070 fontDescriptionRun08.familyDefined = true;
2071 fontDescriptionRun08.weightDefined = false;
2072 fontDescriptionRun08.widthDefined = false;
2073 fontDescriptionRun08.slantDefined = false;
2074 fontDescriptionRun08.sizeDefined = false;
2076 // Set a known font description
2077 FontDescriptionRun fontDescriptionRun09;
2078 fontDescriptionRun09.characterRun.characterIndex = 92u;
2079 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2080 fontDescriptionRun09.familyLength = fontLatin.size();
2081 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2082 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2083 fontDescriptionRun09.familyDefined = true;
2084 fontDescriptionRun09.weightDefined = false;
2085 fontDescriptionRun09.widthDefined = false;
2086 fontDescriptionRun09.slantDefined = false;
2087 fontDescriptionRun09.sizeDefined = false;
2089 // Set a known font description
2090 FontDescriptionRun fontDescriptionRun10;
2091 fontDescriptionRun10.characterRun.characterIndex = 104u;
2092 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2093 fontDescriptionRun10.familyLength = fontArabic.size();
2094 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2095 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2096 fontDescriptionRun10.familyDefined = true;
2097 fontDescriptionRun10.weightDefined = false;
2098 fontDescriptionRun10.widthDefined = false;
2099 fontDescriptionRun10.slantDefined = false;
2100 fontDescriptionRun10.sizeDefined = false;
2102 // Set a known font description
2103 FontDescriptionRun fontDescriptionRun11;
2104 fontDescriptionRun11.characterRun.characterIndex = 118u;
2105 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2106 fontDescriptionRun11.familyLength = fontHebrew.size();
2107 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2108 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2109 fontDescriptionRun11.familyDefined = true;
2110 fontDescriptionRun11.weightDefined = false;
2111 fontDescriptionRun11.widthDefined = false;
2112 fontDescriptionRun11.slantDefined = false;
2113 fontDescriptionRun11.sizeDefined = false;
2115 // Set a known font description
2116 FontDescriptionRun fontDescriptionRun12;
2117 fontDescriptionRun12.characterRun.characterIndex = 128u;
2118 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2119 fontDescriptionRun12.familyLength = fontLatin.size();
2120 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2121 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2122 fontDescriptionRun12.familyDefined = true;
2123 fontDescriptionRun12.weightDefined = false;
2124 fontDescriptionRun12.widthDefined = false;
2125 fontDescriptionRun12.slantDefined = false;
2126 fontDescriptionRun12.sizeDefined = false;
2128 // Set a known font description
2129 FontDescriptionRun fontDescriptionRun13;
2130 fontDescriptionRun13.characterRun.characterIndex = 145u;
2131 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2132 fontDescriptionRun13.familyLength = fontHebrew.size();
2133 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2134 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2135 fontDescriptionRun13.familyDefined = true;
2136 fontDescriptionRun13.weightDefined = false;
2137 fontDescriptionRun13.widthDefined = false;
2138 fontDescriptionRun13.slantDefined = false;
2139 fontDescriptionRun13.sizeDefined = false;
2141 // Set a known font description
2142 FontDescriptionRun fontDescriptionRun14;
2143 fontDescriptionRun14.characterRun.characterIndex = 154u;
2144 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2145 fontDescriptionRun14.familyLength = fontLatin.size();
2146 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2147 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2148 fontDescriptionRun14.familyDefined = true;
2149 fontDescriptionRun14.weightDefined = false;
2150 fontDescriptionRun14.widthDefined = false;
2151 fontDescriptionRun14.slantDefined = false;
2152 fontDescriptionRun14.sizeDefined = false;
2154 // Set a known font description
2155 FontDescriptionRun fontDescriptionRun15;
2156 fontDescriptionRun15.characterRun.characterIndex = 156u;
2157 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2158 fontDescriptionRun15.familyLength = fontHebrew.size();
2159 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2160 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2161 fontDescriptionRun15.familyDefined = true;
2162 fontDescriptionRun15.weightDefined = false;
2163 fontDescriptionRun15.widthDefined = false;
2164 fontDescriptionRun15.slantDefined = false;
2165 fontDescriptionRun15.sizeDefined = false;
2167 // Set a known font description
2168 FontDescriptionRun fontDescriptionRun16;
2169 fontDescriptionRun16.characterRun.characterIndex = 166u;
2170 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2171 fontDescriptionRun16.familyLength = fontLatin.size();
2172 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2173 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2174 fontDescriptionRun16.familyDefined = true;
2175 fontDescriptionRun16.weightDefined = false;
2176 fontDescriptionRun16.widthDefined = false;
2177 fontDescriptionRun16.slantDefined = false;
2178 fontDescriptionRun16.sizeDefined = false;
2180 // Set a known font description
2181 FontDescriptionRun fontDescriptionRun17;
2182 fontDescriptionRun17.characterRun.characterIndex = 178u;
2183 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2184 fontDescriptionRun17.familyLength = fontArabic.size();
2185 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2186 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2187 fontDescriptionRun17.familyDefined = true;
2188 fontDescriptionRun17.weightDefined = false;
2189 fontDescriptionRun17.widthDefined = false;
2190 fontDescriptionRun17.slantDefined = false;
2191 fontDescriptionRun17.sizeDefined = false;
2193 Vector<FontDescriptionRun> fontDescriptionRuns;
2194 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2195 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2196 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2197 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2198 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2199 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2200 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2201 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2202 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2203 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2204 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2205 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2206 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2207 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2208 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2209 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2210 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2211 Size textArea(100.f, 300.f);
2212 Size layoutSize(92.f, 380.f);
2215 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2216 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2217 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2218 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2219 0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2220 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2221 1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2222 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2223 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2224 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2225 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2226 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2227 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2228 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2229 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2230 1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2231 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2232 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2235 struct LineRun line01 =
2247 struct LineRun line02 =
2259 struct LineRun line03 =
2271 struct LineRun line04 =
2283 struct LineRun line05 =
2295 struct LineRun line06 =
2307 struct LineRun line07 =
2319 struct LineRun line08 =
2331 struct LineRun line09 =
2343 struct LineRun line10 =
2355 struct LineRun line11 =
2367 struct LineRun line12 =
2379 struct LineRun line13 =
2391 struct LineRun line14 =
2403 struct LineRun line15 =
2415 struct LineRun line16 =
2427 struct LineRun line17 =
2439 struct LineRun line18 =
2451 struct LineRun line19 =
2463 Vector<LineRun> lines;
2464 lines.PushBack( line01 );
2465 lines.PushBack( line02 );
2466 lines.PushBack( line03 );
2467 lines.PushBack( line04 );
2468 lines.PushBack( line05 );
2469 lines.PushBack( line06 );
2470 lines.PushBack( line07 );
2471 lines.PushBack( line08 );
2472 lines.PushBack( line09 );
2473 lines.PushBack( line10 );
2474 lines.PushBack( line11 );
2475 lines.PushBack( line12 );
2476 lines.PushBack( line13 );
2477 lines.PushBack( line14 );
2478 lines.PushBack( line15 );
2479 lines.PushBack( line16 );
2480 lines.PushBack( line17 );
2481 lines.PushBack( line18 );
2482 lines.PushBack( line19 );
2484 LayoutTextData data =
2486 "Layout bidirectional text.",
2487 "Hello world demo שלום עולם.\n"
2488 "مرحبا بالعالم hello world שלום עולם\n"
2489 "שלום עולם hello world demo.\n"
2490 "hello world مرحبا بالعالم שלום עולם\n"
2491 "Hello world demo שלום עולם.\n"
2492 "שלום עולם hello world مرحبا بالعالم\n",
2495 fontDescriptionRuns.Begin(),
2501 Layout::Engine::MULTI_LINE_BOX,
2508 if( !LayoutTextTest( data ) )
2510 tet_result(TET_FAIL);
2513 tet_result(TET_PASS);
2517 int UtcDaliTextUpdateLayout03(void)
2519 ToolkitTestApplication application;
2520 tet_infoline(" UtcDaliTextUpdateLayout03");
2522 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2524 const std::string fontLatin( "TizenSans" );
2525 const std::string fontHebrew( "TizenSansHebrew" );
2526 const std::string fontArabic( "TizenSansArabic" );
2528 // Set a known font description
2529 FontDescriptionRun fontDescriptionRun01;
2530 fontDescriptionRun01.characterRun.characterIndex = 0u;
2531 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2532 fontDescriptionRun01.familyLength = fontLatin.size();
2533 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2534 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2535 fontDescriptionRun01.familyDefined = true;
2536 fontDescriptionRun01.weightDefined = false;
2537 fontDescriptionRun01.widthDefined = false;
2538 fontDescriptionRun01.slantDefined = false;
2539 fontDescriptionRun01.sizeDefined = false;
2541 // Set a known font description
2542 FontDescriptionRun fontDescriptionRun02;
2543 fontDescriptionRun02.characterRun.characterIndex = 17u;
2544 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2545 fontDescriptionRun02.familyLength = fontHebrew.size();
2546 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2547 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2548 fontDescriptionRun02.familyDefined = true;
2549 fontDescriptionRun02.weightDefined = false;
2550 fontDescriptionRun02.widthDefined = false;
2551 fontDescriptionRun02.slantDefined = false;
2552 fontDescriptionRun02.sizeDefined = false;
2554 // Set a known font description
2555 FontDescriptionRun fontDescriptionRun03;
2556 fontDescriptionRun03.characterRun.characterIndex = 26u;
2557 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2558 fontDescriptionRun03.familyLength = fontLatin.size();
2559 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2560 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2561 fontDescriptionRun03.familyDefined = true;
2562 fontDescriptionRun03.weightDefined = false;
2563 fontDescriptionRun03.widthDefined = false;
2564 fontDescriptionRun03.slantDefined = false;
2565 fontDescriptionRun03.sizeDefined = false;
2567 // Set a known font description
2568 FontDescriptionRun fontDescriptionRun04;
2569 fontDescriptionRun04.characterRun.characterIndex = 28u;
2570 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2571 fontDescriptionRun04.familyLength = fontArabic.size();
2572 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2573 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2574 fontDescriptionRun04.familyDefined = true;
2575 fontDescriptionRun04.weightDefined = false;
2576 fontDescriptionRun04.widthDefined = false;
2577 fontDescriptionRun04.slantDefined = false;
2578 fontDescriptionRun04.sizeDefined = false;
2580 // Set a known font description
2581 FontDescriptionRun fontDescriptionRun05;
2582 fontDescriptionRun05.characterRun.characterIndex = 42u;
2583 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2584 fontDescriptionRun05.familyLength = fontLatin.size();
2585 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2586 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2587 fontDescriptionRun05.familyDefined = true;
2588 fontDescriptionRun05.weightDefined = false;
2589 fontDescriptionRun05.widthDefined = false;
2590 fontDescriptionRun05.slantDefined = false;
2591 fontDescriptionRun05.sizeDefined = false;
2593 // Set a known font description
2594 FontDescriptionRun fontDescriptionRun06;
2595 fontDescriptionRun06.characterRun.characterIndex = 54u;
2596 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2597 fontDescriptionRun06.familyLength = fontHebrew.size();
2598 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2599 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2600 fontDescriptionRun06.familyDefined = true;
2601 fontDescriptionRun06.weightDefined = false;
2602 fontDescriptionRun06.widthDefined = false;
2603 fontDescriptionRun06.slantDefined = false;
2604 fontDescriptionRun06.sizeDefined = false;
2606 // Set a known font description
2607 FontDescriptionRun fontDescriptionRun07;
2608 fontDescriptionRun07.characterRun.characterIndex = 64u;
2609 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2610 fontDescriptionRun07.familyLength = fontHebrew.size();
2611 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2612 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2613 fontDescriptionRun07.familyDefined = true;
2614 fontDescriptionRun07.weightDefined = false;
2615 fontDescriptionRun07.widthDefined = false;
2616 fontDescriptionRun07.slantDefined = false;
2617 fontDescriptionRun07.sizeDefined = false;
2619 // Set a known font description
2620 FontDescriptionRun fontDescriptionRun08;
2621 fontDescriptionRun08.characterRun.characterIndex = 74u;
2622 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2623 fontDescriptionRun08.familyLength = fontLatin.size();
2624 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2625 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2626 fontDescriptionRun08.familyDefined = true;
2627 fontDescriptionRun08.weightDefined = false;
2628 fontDescriptionRun08.widthDefined = false;
2629 fontDescriptionRun08.slantDefined = false;
2630 fontDescriptionRun08.sizeDefined = false;
2632 // Set a known font description
2633 FontDescriptionRun fontDescriptionRun09;
2634 fontDescriptionRun09.characterRun.characterIndex = 92u;
2635 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2636 fontDescriptionRun09.familyLength = fontLatin.size();
2637 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2638 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2639 fontDescriptionRun09.familyDefined = true;
2640 fontDescriptionRun09.weightDefined = false;
2641 fontDescriptionRun09.widthDefined = false;
2642 fontDescriptionRun09.slantDefined = false;
2643 fontDescriptionRun09.sizeDefined = false;
2645 // Set a known font description
2646 FontDescriptionRun fontDescriptionRun10;
2647 fontDescriptionRun10.characterRun.characterIndex = 104u;
2648 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2649 fontDescriptionRun10.familyLength = fontArabic.size();
2650 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2651 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2652 fontDescriptionRun10.familyDefined = true;
2653 fontDescriptionRun10.weightDefined = false;
2654 fontDescriptionRun10.widthDefined = false;
2655 fontDescriptionRun10.slantDefined = false;
2656 fontDescriptionRun10.sizeDefined = false;
2658 // Set a known font description
2659 FontDescriptionRun fontDescriptionRun11;
2660 fontDescriptionRun11.characterRun.characterIndex = 118u;
2661 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2662 fontDescriptionRun11.familyLength = fontHebrew.size();
2663 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2664 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2665 fontDescriptionRun11.familyDefined = true;
2666 fontDescriptionRun11.weightDefined = false;
2667 fontDescriptionRun11.widthDefined = false;
2668 fontDescriptionRun11.slantDefined = false;
2669 fontDescriptionRun11.sizeDefined = false;
2671 // Set a known font description
2672 FontDescriptionRun fontDescriptionRun12;
2673 fontDescriptionRun12.characterRun.characterIndex = 128u;
2674 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2675 fontDescriptionRun12.familyLength = fontLatin.size();
2676 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2677 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2678 fontDescriptionRun12.familyDefined = true;
2679 fontDescriptionRun12.weightDefined = false;
2680 fontDescriptionRun12.widthDefined = false;
2681 fontDescriptionRun12.slantDefined = false;
2682 fontDescriptionRun12.sizeDefined = false;
2684 // Set a known font description
2685 FontDescriptionRun fontDescriptionRun13;
2686 fontDescriptionRun13.characterRun.characterIndex = 145u;
2687 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2688 fontDescriptionRun13.familyLength = fontHebrew.size();
2689 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2690 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2691 fontDescriptionRun13.familyDefined = true;
2692 fontDescriptionRun13.weightDefined = false;
2693 fontDescriptionRun13.widthDefined = false;
2694 fontDescriptionRun13.slantDefined = false;
2695 fontDescriptionRun13.sizeDefined = false;
2697 // Set a known font description
2698 FontDescriptionRun fontDescriptionRun14;
2699 fontDescriptionRun14.characterRun.characterIndex = 154u;
2700 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2701 fontDescriptionRun14.familyLength = fontLatin.size();
2702 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2703 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2704 fontDescriptionRun14.familyDefined = true;
2705 fontDescriptionRun14.weightDefined = false;
2706 fontDescriptionRun14.widthDefined = false;
2707 fontDescriptionRun14.slantDefined = false;
2708 fontDescriptionRun14.sizeDefined = false;
2710 // Set a known font description
2711 FontDescriptionRun fontDescriptionRun15;
2712 fontDescriptionRun15.characterRun.characterIndex = 156u;
2713 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2714 fontDescriptionRun15.familyLength = fontHebrew.size();
2715 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2716 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2717 fontDescriptionRun15.familyDefined = true;
2718 fontDescriptionRun15.weightDefined = false;
2719 fontDescriptionRun15.widthDefined = false;
2720 fontDescriptionRun15.slantDefined = false;
2721 fontDescriptionRun15.sizeDefined = false;
2723 // Set a known font description
2724 FontDescriptionRun fontDescriptionRun16;
2725 fontDescriptionRun16.characterRun.characterIndex = 166u;
2726 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2727 fontDescriptionRun16.familyLength = fontLatin.size();
2728 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2729 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2730 fontDescriptionRun16.familyDefined = true;
2731 fontDescriptionRun16.weightDefined = false;
2732 fontDescriptionRun16.widthDefined = false;
2733 fontDescriptionRun16.slantDefined = false;
2734 fontDescriptionRun16.sizeDefined = false;
2736 // Set a known font description
2737 FontDescriptionRun fontDescriptionRun17;
2738 fontDescriptionRun17.characterRun.characterIndex = 178u;
2739 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2740 fontDescriptionRun17.familyLength = fontArabic.size();
2741 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2742 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2743 fontDescriptionRun17.familyDefined = true;
2744 fontDescriptionRun17.weightDefined = false;
2745 fontDescriptionRun17.widthDefined = false;
2746 fontDescriptionRun17.slantDefined = false;
2747 fontDescriptionRun17.sizeDefined = false;
2749 Vector<FontDescriptionRun> fontDescriptionRuns;
2750 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2751 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2752 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2753 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2754 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2755 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2756 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2757 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2758 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2759 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2760 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2761 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2762 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2763 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2764 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2765 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2766 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2767 Size textArea(100.f, 300.f);
2768 Size layoutSize(92.f, 380.f);
2771 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2772 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2773 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2774 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2775 0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2776 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2777 1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2778 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2779 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2780 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2781 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2782 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2783 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2784 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2785 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2786 1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2787 1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2788 0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2791 struct LineRun line01 =
2803 struct LineRun line02 =
2815 struct LineRun line03 =
2827 struct LineRun line04 =
2839 struct LineRun line05 =
2851 struct LineRun line06 =
2863 struct LineRun line07 =
2875 struct LineRun line08 =
2887 struct LineRun line09 =
2899 struct LineRun line10 =
2911 struct LineRun line11 =
2923 struct LineRun line12 =
2935 struct LineRun line13 =
2947 struct LineRun line14 =
2959 struct LineRun line15 =
2971 struct LineRun line16 =
2983 struct LineRun line17 =
2995 struct LineRun line18 =
3007 struct LineRun line19 =
3019 Vector<LineRun> lines;
3020 lines.PushBack( line01 );
3021 lines.PushBack( line02 );
3022 lines.PushBack( line03 );
3023 lines.PushBack( line04 );
3024 lines.PushBack( line05 );
3025 lines.PushBack( line06 );
3026 lines.PushBack( line07 );
3027 lines.PushBack( line08 );
3028 lines.PushBack( line09 );
3029 lines.PushBack( line10 );
3030 lines.PushBack( line11 );
3031 lines.PushBack( line12 );
3032 lines.PushBack( line13 );
3033 lines.PushBack( line14 );
3034 lines.PushBack( line15 );
3035 lines.PushBack( line16 );
3036 lines.PushBack( line17 );
3037 lines.PushBack( line18 );
3038 lines.PushBack( line19 );
3040 LayoutTextData data =
3042 "Layout bidirectional text.",
3043 "Hello world demo שלום עולם.\n"
3044 "مرحبا بالعالم hello world שלום עולם\n"
3045 "שלום עולם hello world demo.\n"
3046 "hello world مرحبا بالعالم שלום עולם\n"
3047 "Hello world demo שלום עולם.\n"
3048 "שלום עולם hello world مرحبا بالعالم\n",
3051 fontDescriptionRuns.Begin(),
3057 Layout::Engine::MULTI_LINE_BOX,