2 * Copyright (c) 2016 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();
161 Layout::Parameters layoutParameters( data.textArea,
162 logicalModel->mText.Begin(),
163 logicalModel->mLineBreakInfo.Begin(),
164 logicalModel->mWordBreakInfo.Begin(),
165 ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
166 visualModel->mGlyphs.Begin(),
167 visualModel->mGlyphsToCharacters.Begin(),
168 visualModel->mCharactersPerGlyph.Begin(),
169 visualModel->mCharactersToGlyph.Begin(),
170 visualModel->mGlyphsPerCharacter.Begin(),
172 Layout::HORIZONTAL_ALIGN_BEGIN );
174 layoutParameters.isLastNewParagraph = isLastNewParagraph;
176 // The initial glyph and the number of glyphs to layout.
177 layoutParameters.startGlyphIndex = data.startIndex;
178 layoutParameters.numberOfGlyphs = data.numberOfGlyphs;
179 layoutParameters.startLineIndex = startRemoveIndex;
180 layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
182 layoutSize = Vector2::ZERO;
184 const bool updated = engine.LayoutText( layoutParameters,
190 // 4) Compare the results.
192 if( updated != data.updated )
194 std::cout << " Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
198 if( layoutSize != data.layoutSize )
200 std::cout << " Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
204 for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
206 const Vector2& position = *( glyphPositions.Begin() + index );
208 if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
210 std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
213 if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
215 std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
220 if( lines.Count() != data.numberOfLines )
222 std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
226 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
228 const LineRun& line = *( lines.Begin() + index );
229 const LineRun& expectedLine = *( data.lines + index );
231 if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex )
233 std::cout << " Different line info for line : " << index << std::endl;
235 std::cout << " expected" << std::endl;
236 Print( expectedLine );
239 if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs )
241 std::cout << " Different line info for line : " << index << std::endl;
243 std::cout << " expected" << std::endl;
244 Print( expectedLine );
248 if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex )
250 std::cout << " Different line info for line : " << index << std::endl;
252 std::cout << " expected" << std::endl;
253 Print( expectedLine );
256 if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters )
258 std::cout << " Different line info for line : " << index << std::endl;
260 std::cout << " expected" << std::endl;
261 Print( expectedLine );
265 if( fabsf( line.width - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
267 std::cout << " Different line info for line : " << index << std::endl;
269 std::cout << " expected" << std::endl;
270 Print( expectedLine );
274 if( fabsf( line.ascender - expectedLine.ascender ) > Math::MACHINE_EPSILON_1 )
276 std::cout << " Different line info for line : " << index << std::endl;
278 std::cout << " expected" << std::endl;
279 Print( expectedLine );
283 if( fabsf( line.descender - expectedLine.descender ) > Math::MACHINE_EPSILON_1 )
285 std::cout << " Different line info for line : " << index << std::endl;
287 std::cout << " expected" << std::endl;
288 Print( expectedLine );
292 if( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 )
294 std::cout << " Different line info for line : " << index << std::endl;
296 std::cout << " expected" << std::endl;
297 Print( expectedLine );
301 if( line.ellipsis != expectedLine.ellipsis )
303 std::cout << " Different line info for line : " << index << std::endl;
305 std::cout << " expected" << std::endl;
306 Print( expectedLine );
310 // Do not compare the alignment offset as it's not calculated in the layout.
311 // Do not compare the line direction as it's not set in the layout.
317 //////////////////////////////////////////////////////////
319 struct ReLayoutRightToLeftLinesData
321 std::string description;
324 unsigned int numberOfFonts;
325 FontDescriptionRun* fontDescriptions;
326 unsigned int totalNumberOfGlyphs;
328 unsigned int startIndex;
329 unsigned int numberOfCharacters;
332 bool ReLayoutRightToLeftLinesTest( const ReLayoutRightToLeftLinesData& data )
335 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
336 fontClient.SetDpi( 96u, 96u );
338 char* pathNamePtr = get_current_dir_name();
339 const std::string pathName( pathNamePtr );
342 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
343 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
344 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
346 // 1) Create the model.
347 LogicalModelPtr logicalModel;
348 VisualModelPtr visualModel;
352 Vector<FontDescriptionRun> fontDescriptionRuns;
353 if( 0u != data.numberOfFonts )
355 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
356 data.fontDescriptions,
357 data.fontDescriptions + data.numberOfFonts );
360 LayoutOptions options;
361 options.reorder = false;
362 options.align = false;
363 CreateTextModel( data.text,
372 // 2) Call the ReLayoutRightToLeftLines() method.
373 Layout::Engine engine;
374 engine.SetMetrics( metrics );
376 Layout::Parameters layoutParameters( data.textArea,
377 logicalModel->mText.Begin(),
378 logicalModel->mLineBreakInfo.Begin(),
379 logicalModel->mWordBreakInfo.Begin(),
380 ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
381 visualModel->mGlyphs.Begin(),
382 visualModel->mGlyphsToCharacters.Begin(),
383 visualModel->mCharactersPerGlyph.Begin(),
384 visualModel->mCharactersToGlyph.Begin(),
385 visualModel->mGlyphsPerCharacter.Begin(),
386 visualModel->mGlyphs.Count(),
387 Layout::HORIZONTAL_ALIGN_BEGIN );
389 layoutParameters.numberOfBidirectionalInfoRuns = logicalModel->mBidirectionalLineInfo.Count();
390 layoutParameters.lineBidirectionalInfoRunsBuffer = logicalModel->mBidirectionalLineInfo.Begin();
392 engine.ReLayoutRightToLeftLines( layoutParameters,
394 data.numberOfCharacters,
395 visualModel->mGlyphPositions );
397 // 3) Compare the results.
398 Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
400 if( data.totalNumberOfGlyphs != visualModel->mGlyphs.Count() )
402 std::cout << " Different number of glyphs : " << visualModel->mGlyphs.Count() << ", expected : " << data.totalNumberOfGlyphs << std::endl;
406 for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
408 const Vector2& position = *( glyphPositions.Begin() + index );
410 if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
412 std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
415 if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
417 std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
425 //////////////////////////////////////////////////////////
429 std::string description;
432 unsigned int numberOfFonts;
433 FontDescriptionRun* fontDescriptions;
434 Layout::HorizontalAlignment horizontalAlignment;
435 Layout::VerticalAlignment verticalAlignment;
436 unsigned int startIndex;
437 unsigned int numberOfCharacters;
438 unsigned int numberOfLines;
442 bool AlignTest( const AlignData& data )
445 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
446 fontClient.SetDpi( 96u, 96u );
448 char* pathNamePtr = get_current_dir_name();
449 const std::string pathName( pathNamePtr );
452 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
453 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
454 fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
456 // 1) Create the model.
457 LogicalModelPtr logicalModel;
458 VisualModelPtr visualModel;
462 Vector<FontDescriptionRun> fontDescriptionRuns;
463 if( 0u != data.numberOfFonts )
465 fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
466 data.fontDescriptions,
467 data.fontDescriptions + data.numberOfFonts );
470 LayoutOptions options;
471 options.align = false;
472 CreateTextModel( data.text,
481 // Call the Align method.
482 Layout::Engine engine;
483 engine.SetMetrics( metrics );
485 float alignmentOffset = 0.f;
486 engine.Align( data.textArea,
488 data.numberOfCharacters,
489 data.horizontalAlignment,
494 if( data.numberOfLines != visualModel->mLines.Count() )
496 std::cout << " Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
500 const LineRun* const linesBuffer = visualModel->mLines.Begin();
501 for( unsigned int index = 0u; index < data.numberOfLines; ++index )
503 const LineRun& line = *( linesBuffer + index );
505 if( line.alignmentOffset != *( data.lineOffsets + index ) )
507 std::cout << " different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl;
517 //////////////////////////////////////////////////////////
519 // UtcDaliTextLayoutSetGetLayout
520 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
521 // UtcDaliTextLayoutSetGetHorizontalAlignment
522 // UtcDaliTextLayoutSetGetVerticalAlignment
523 // UtcDaliTextLayoutSetGetCursorWidth
524 // UtcDaliTextLayoutNoText
525 // UtcDaliTextLayoutSmallTextArea01
526 // UtcDaliTextLayoutSmallTextArea02
527 // UtcDaliTextLayoutMultilineText01
528 // UtcDaliTextLayoutMultilineText02
529 // UtcDaliTextLayoutMultilineText03
530 // UtcDaliTextLayoutMultilineText04
531 // UtcDaliTextLayoutMultilineText05
532 // UtcDaliTextUpdateLayout01
533 // UtcDaliTextUpdateLayout02
534 // UtcDaliTextUpdateLayout03
535 // UtcDaliTextLayoutEllipsis01
536 // UtcDaliTextLayoutEllipsis02
537 // UtcDaliTextLayoutEllipsis03
538 // UtcDaliTextLayoutEllipsis04
539 // UtcDaliTextLayoutEllipsis04
540 // UtcDaliTextReorderLayout01
541 // UtcDaliTextReorderLayout02
542 // UtcDaliTextReorderLayout03
543 // UtcDaliTextReorderLayout04
544 // UtcDaliTextAlign01
545 // UtcDaliTextAlign02
546 // UtcDaliTextAlign03
547 // UtcDaliTextAlign04
548 // UtcDaliTextAlign05
549 // UtcDaliTextAlign06
550 // UtcDaliTextAlign07
551 // UtcDaliTextAlign08
552 // UtcDaliTextAlign09
554 //////////////////////////////////////////////////////////
556 int UtcDaliTextLayoutSetGetLayout(void)
558 ToolkitTestApplication application;
559 tet_infoline(" UtcDaliTextLayoutSetGetLayout");
561 Layout::Engine engine;
563 DALI_TEST_CHECK( Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout() );
565 engine.SetLayout( Layout::Engine::MULTI_LINE_BOX );
566 DALI_TEST_CHECK( Layout::Engine::MULTI_LINE_BOX == engine.GetLayout() );
568 tet_result(TET_PASS);
572 int UtcDaliTextLayoutSetGetCursorWidth(void)
574 ToolkitTestApplication application;
577 Layout::Engine engine;
579 DALI_TEST_EQUALS( 1, engine.GetCursorWidth(), TEST_LOCATION );
581 engine.SetCursorWidth( 2 );
582 DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
584 tet_result(TET_PASS);
588 int UtcDaliTextLayoutNoText(void)
590 ToolkitTestApplication application;
591 tet_infoline(" UtcDaliTextLayoutNoText");
593 Size textArea(100.f, 60.f);
594 Size layoutSize = Vector2::ZERO;
595 LayoutTextData data =
607 Layout::Engine::MULTI_LINE_BOX,
614 if( !LayoutTextTest( data ) )
616 tet_result(TET_FAIL);
619 tet_result(TET_PASS);
623 int UtcDaliTextLayoutSmallTextArea01(void)
625 ToolkitTestApplication application;
626 tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
628 // Won't layout the text in multi-line if the width is too small.
630 const std::string fontFamily( "TizenSans" );
632 // Set a known font description
633 FontDescriptionRun fontDescriptionRun;
634 fontDescriptionRun.characterRun.characterIndex = 0u;
635 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
636 fontDescriptionRun.familyLength = fontFamily.size();
637 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
638 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
639 fontDescriptionRun.familyDefined = true;
640 fontDescriptionRun.weightDefined = false;
641 fontDescriptionRun.widthDefined = false;
642 fontDescriptionRun.slantDefined = false;
643 fontDescriptionRun.sizeDefined = false;
645 Vector<FontDescriptionRun> fontDescriptionRuns;
646 fontDescriptionRuns.PushBack( fontDescriptionRun );
647 Size textArea(1.f, 1.f);
648 Size layoutSize = Vector2::ZERO;
649 LayoutTextData data =
651 "Layout text in a small area",
655 fontDescriptionRuns.Begin(),
661 Layout::Engine::MULTI_LINE_BOX,
668 if( !LayoutTextTest( data ) )
670 tet_result(TET_FAIL);
673 tet_result(TET_PASS);
677 int UtcDaliTextLayoutSmallTextArea02(void)
679 ToolkitTestApplication application;
680 tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
682 // Will layout the text in single line as it can be scrolled.
684 const std::string fontFamily( "TizenSans" );
686 // Set a known font description
687 FontDescriptionRun fontDescriptionRun;
688 fontDescriptionRun.characterRun.characterIndex = 0u;
689 fontDescriptionRun.characterRun.numberOfCharacters = 11u;
690 fontDescriptionRun.familyLength = fontFamily.size();
691 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
692 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
693 fontDescriptionRun.familyDefined = true;
694 fontDescriptionRun.weightDefined = false;
695 fontDescriptionRun.widthDefined = false;
696 fontDescriptionRun.slantDefined = false;
697 fontDescriptionRun.sizeDefined = false;
699 Vector<FontDescriptionRun> fontDescriptionRuns;
700 fontDescriptionRuns.PushBack( fontDescriptionRun );
701 Size textArea(1.f, 1.f);
702 Size layoutSize(80.f, 20.f);
703 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 };
704 struct LineRun line =
716 Vector<LineRun> lines;
717 lines.PushBack( line );
719 LayoutTextData data =
721 "Layout text in a small area",
725 fontDescriptionRuns.Begin(),
731 Layout::Engine::SINGLE_LINE_BOX,
738 if( !LayoutTextTest( data ) )
740 tet_result(TET_FAIL);
743 tet_result(TET_PASS);
747 int UtcDaliTextLayoutMultilineText01(void)
749 ToolkitTestApplication application;
750 tet_infoline(" UtcDaliTextLayoutMultilineText01");
752 // Layout some lines of left to right text.
754 const std::string fontFamily( "TizenSans" );
756 // Set a known font description
757 FontDescriptionRun fontDescriptionRun1;
758 fontDescriptionRun1.characterRun.characterIndex = 0u;
759 fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
760 fontDescriptionRun1.familyLength = fontFamily.size();
761 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
762 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
763 fontDescriptionRun1.familyDefined = true;
764 fontDescriptionRun1.weightDefined = false;
765 fontDescriptionRun1.widthDefined = false;
766 fontDescriptionRun1.slantDefined = false;
767 fontDescriptionRun1.sizeDefined = false;
769 FontDescriptionRun fontDescriptionRun2;
770 fontDescriptionRun2.characterRun.characterIndex = 18u;
771 fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
772 fontDescriptionRun2.familyLength = fontFamily.size();
773 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
774 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
775 fontDescriptionRun2.familyDefined = true;
776 fontDescriptionRun2.weightDefined = false;
777 fontDescriptionRun2.widthDefined = false;
778 fontDescriptionRun2.slantDefined = false;
779 fontDescriptionRun2.sizeDefined = false;
781 Vector<FontDescriptionRun> fontDescriptionRuns;
782 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
783 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
784 Size textArea(100.f, 300.f);
785 Size layoutSize(95.f, 97.f);
788 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,
789 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
790 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,
791 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,
792 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
794 struct LineRun line0 =
806 struct LineRun line1 =
818 struct LineRun line2 =
830 struct LineRun line3 =
842 struct LineRun line4 =
854 Vector<LineRun> lines;
855 lines.PushBack( line0 );
856 lines.PushBack( line1 );
857 lines.PushBack( line2 );
858 lines.PushBack( line3 );
859 lines.PushBack( line4 );
861 LayoutTextData data =
863 "Layout simple multi-line text",
864 "Hello world demo.\n"
865 "Layout different lines of text.",
868 fontDescriptionRuns.Begin(),
874 Layout::Engine::MULTI_LINE_BOX,
881 if( !LayoutTextTest( data ) )
883 tet_result(TET_FAIL);
886 tet_result(TET_PASS);
890 int UtcDaliTextLayoutMultilineText02(void)
892 ToolkitTestApplication application;
893 tet_infoline(" UtcDaliTextLayoutMultilineText02");
895 // Layout some lines of bidirectional text.
897 const std::string fontFamily1( "TizenSans" );
899 // Set a known font description
900 FontDescriptionRun fontDescriptionRun1;
901 fontDescriptionRun1.characterRun.characterIndex = 0u;
902 fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
903 fontDescriptionRun1.familyLength = fontFamily1.size();
904 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
905 memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength );
906 fontDescriptionRun1.familyDefined = true;
907 fontDescriptionRun1.weightDefined = false;
908 fontDescriptionRun1.widthDefined = false;
909 fontDescriptionRun1.slantDefined = false;
910 fontDescriptionRun1.sizeDefined = false;
912 const std::string fontFamily2( "TizenSansHebrew" );
914 // Set a known font description
915 FontDescriptionRun fontDescriptionRun2;
916 fontDescriptionRun2.characterRun.characterIndex = 17u;
917 fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
918 fontDescriptionRun2.familyLength = fontFamily2.size();
919 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
920 memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
921 fontDescriptionRun2.familyDefined = true;
922 fontDescriptionRun2.weightDefined = false;
923 fontDescriptionRun2.widthDefined = false;
924 fontDescriptionRun2.slantDefined = false;
925 fontDescriptionRun2.sizeDefined = false;
927 const std::string fontFamily3( "TizenSans" );
929 // Set a known font description
930 FontDescriptionRun fontDescriptionRun3;
931 fontDescriptionRun3.characterRun.characterIndex = 26u;
932 fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
933 fontDescriptionRun3.familyLength = fontFamily3.size();
934 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
935 memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
936 fontDescriptionRun3.familyDefined = true;
937 fontDescriptionRun3.weightDefined = false;
938 fontDescriptionRun3.widthDefined = false;
939 fontDescriptionRun3.slantDefined = false;
940 fontDescriptionRun3.sizeDefined = false;
942 const std::string fontFamily4( "TizenSansHebrew" );
944 // Set a known font description
945 FontDescriptionRun fontDescriptionRun4;
946 fontDescriptionRun4.characterRun.characterIndex = 28u;
947 fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
948 fontDescriptionRun4.familyLength = fontFamily4.size();
949 fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
950 memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
951 fontDescriptionRun4.familyDefined = true;
952 fontDescriptionRun4.weightDefined = false;
953 fontDescriptionRun4.widthDefined = false;
954 fontDescriptionRun4.slantDefined = false;
955 fontDescriptionRun4.sizeDefined = false;
957 const std::string fontFamily5( "TizenSans" );
959 // Set a known font description
960 FontDescriptionRun fontDescriptionRun5;
961 fontDescriptionRun5.characterRun.characterIndex = 38u;
962 fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
963 fontDescriptionRun5.familyLength = fontFamily5.size();
964 fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
965 memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
966 fontDescriptionRun5.familyDefined = true;
967 fontDescriptionRun5.weightDefined = false;
968 fontDescriptionRun5.widthDefined = false;
969 fontDescriptionRun5.slantDefined = false;
970 fontDescriptionRun5.sizeDefined = false;
972 Vector<FontDescriptionRun> fontDescriptionRuns;
973 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
974 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
975 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
976 fontDescriptionRuns.PushBack( fontDescriptionRun4 );
977 fontDescriptionRuns.PushBack( fontDescriptionRun5 );
978 Size textArea(100.f, 300.f);
979 Size layoutSize(81.f, 120.f);
982 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,
983 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,
984 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
985 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,
986 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,
987 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f,
989 struct LineRun line0 =
1001 struct LineRun line1 =
1013 struct LineRun line2 =
1025 struct LineRun line3 =
1037 struct LineRun line4 =
1049 struct LineRun line5 =
1061 Vector<LineRun> lines;
1062 lines.PushBack( line0 );
1063 lines.PushBack( line1 );
1064 lines.PushBack( line2 );
1065 lines.PushBack( line3 );
1066 lines.PushBack( line4 );
1067 lines.PushBack( line5 );
1069 LayoutTextData data =
1071 "Layout bidirectional text.",
1072 "Hello world demo שלום עולם.\n"
1073 "שלום עולם hello world demo.",
1076 fontDescriptionRuns.Begin(),
1082 Layout::Engine::MULTI_LINE_BOX,
1089 if( !LayoutTextTest( data ) )
1091 tet_result(TET_FAIL);
1094 tet_result(TET_PASS);
1098 int UtcDaliTextLayoutMultilineText03(void)
1100 ToolkitTestApplication application;
1101 tet_infoline(" UtcDaliTextLayoutMultilineText03");
1103 // Layout a long word which doesn't fit in the width of the text area.
1105 const std::string fontFamily( "TizenSans" );
1107 // Set a known font description
1108 FontDescriptionRun fontDescriptionRun;
1109 fontDescriptionRun.characterRun.characterIndex = 0u;
1110 fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1111 fontDescriptionRun.familyLength = fontFamily.size();
1112 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1113 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1114 fontDescriptionRun.familyDefined = true;
1115 fontDescriptionRun.weightDefined = false;
1116 fontDescriptionRun.widthDefined = false;
1117 fontDescriptionRun.slantDefined = false;
1118 fontDescriptionRun.sizeDefined = false;
1120 Vector<FontDescriptionRun> fontDescriptionRuns;
1121 fontDescriptionRuns.PushBack( fontDescriptionRun );
1122 Size textArea(100.f, 300.f);
1123 Size layoutSize(96.f, 60.f);
1126 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,
1127 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,
1128 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f,
1130 struct LineRun line0 =
1142 struct LineRun line1 =
1154 struct LineRun line2 =
1166 Vector<LineRun> lines;
1167 lines.PushBack( line0 );
1168 lines.PushBack( line1 );
1169 lines.PushBack( line2 );
1171 LayoutTextData data =
1173 "Layout a long word which doesn't fit in the width of the text area.",
1174 "Helloworlddemohelloworlddemo.",
1177 fontDescriptionRuns.Begin(),
1183 Layout::Engine::MULTI_LINE_BOX,
1190 if( !LayoutTextTest( data ) )
1192 tet_result(TET_FAIL);
1195 tet_result(TET_PASS);
1199 int UtcDaliTextLayoutMultilineText04(void)
1201 ToolkitTestApplication application;
1202 tet_infoline(" UtcDaliTextLayoutMultilineText04");
1204 // Layout simple text ending with a \n. It has to add a void line at the end.
1206 const std::string fontFamily( "TizenSans" );
1208 // Set a known font description
1209 FontDescriptionRun fontDescriptionRun;
1210 fontDescriptionRun.characterRun.characterIndex = 0u;
1211 fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1212 fontDescriptionRun.familyLength = fontFamily.size();
1213 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1214 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1215 fontDescriptionRun.familyDefined = true;
1216 fontDescriptionRun.weightDefined = false;
1217 fontDescriptionRun.widthDefined = false;
1218 fontDescriptionRun.slantDefined = false;
1219 fontDescriptionRun.sizeDefined = false;
1221 Vector<FontDescriptionRun> fontDescriptionRuns;
1222 fontDescriptionRuns.PushBack( fontDescriptionRun );
1223 Size textArea(100.f, 300.f);
1224 Size layoutSize(83.f, 40.f);
1227 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
1229 struct LineRun line0 =
1241 struct LineRun line1 =
1253 Vector<LineRun> lines;
1254 lines.PushBack( line0 );
1255 lines.PushBack( line1 );
1257 LayoutTextData data =
1259 "Layout simple text ending with a \n.",
1263 fontDescriptionRuns.Begin(),
1269 Layout::Engine::MULTI_LINE_BOX,
1276 if( !LayoutTextTest( data ) )
1278 tet_result(TET_FAIL);
1281 tet_result(TET_PASS);
1285 int UtcDaliTextLayoutMultilineText05(void)
1287 ToolkitTestApplication application;
1288 tet_infoline(" UtcDaliTextLayoutMultilineText05");
1290 // Layout simple text with one character with a different font size.
1292 const std::string fontFamily( "TizenSans" );
1294 // Set a known font description
1295 FontDescriptionRun fontDescriptionRun1;
1296 fontDescriptionRun1.characterRun.characterIndex = 0u;
1297 fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1298 fontDescriptionRun1.familyLength = fontFamily.size();
1299 fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1300 memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1301 fontDescriptionRun1.familyDefined = true;
1302 fontDescriptionRun1.weightDefined = false;
1303 fontDescriptionRun1.widthDefined = false;
1304 fontDescriptionRun1.slantDefined = false;
1305 fontDescriptionRun1.sizeDefined = false;
1307 FontDescriptionRun fontDescriptionRun2;
1308 fontDescriptionRun2.characterRun.characterIndex = 6u;
1309 fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1310 fontDescriptionRun2.familyLength = fontFamily.size();
1311 fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1312 memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1313 fontDescriptionRun2.size = 1280u;
1314 fontDescriptionRun2.familyDefined = true;
1315 fontDescriptionRun2.weightDefined = false;
1316 fontDescriptionRun2.widthDefined = false;
1317 fontDescriptionRun2.slantDefined = false;
1318 fontDescriptionRun2.sizeDefined = true;
1320 FontDescriptionRun fontDescriptionRun3;
1321 fontDescriptionRun3.characterRun.characterIndex = 7u;
1322 fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1323 fontDescriptionRun3.familyLength = fontFamily.size();
1324 fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1325 memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1326 fontDescriptionRun3.familyDefined = true;
1327 fontDescriptionRun3.weightDefined = false;
1328 fontDescriptionRun3.widthDefined = false;
1329 fontDescriptionRun3.slantDefined = false;
1330 fontDescriptionRun3.sizeDefined = false;
1332 Vector<FontDescriptionRun> fontDescriptionRuns;
1333 fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1334 fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1335 fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1336 Size textArea(100.f, 300.f);
1337 Size layoutSize(88.f, 53.f);
1340 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,
1341 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f
1343 struct LineRun line0 =
1355 struct LineRun line1 =
1367 Vector<LineRun> lines;
1368 lines.PushBack( line0 );
1369 lines.PushBack( line1 );
1371 LayoutTextData data =
1373 "Layout simple text with one character with a different font size.",
1374 "Hello world demo.",
1377 fontDescriptionRuns.Begin(),
1383 Layout::Engine::MULTI_LINE_BOX,
1390 if( !LayoutTextTest( data ) )
1392 tet_result(TET_FAIL);
1395 tet_result(TET_PASS);
1399 int UtcDaliTextUpdateLayout01(void)
1401 ToolkitTestApplication application;
1402 tet_infoline(" UtcDaliTextUpdateLayout01");
1404 // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1406 const std::string fontLatin( "TizenSans" );
1407 const std::string fontHebrew( "TizenSansHebrew" );
1408 const std::string fontArabic( "TizenSansArabic" );
1410 // Set a known font description
1411 FontDescriptionRun fontDescriptionRun01;
1412 fontDescriptionRun01.characterRun.characterIndex = 0u;
1413 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1414 fontDescriptionRun01.familyLength = fontLatin.size();
1415 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1416 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1417 fontDescriptionRun01.familyDefined = true;
1418 fontDescriptionRun01.weightDefined = false;
1419 fontDescriptionRun01.widthDefined = false;
1420 fontDescriptionRun01.slantDefined = false;
1421 fontDescriptionRun01.sizeDefined = false;
1423 // Set a known font description
1424 FontDescriptionRun fontDescriptionRun02;
1425 fontDescriptionRun02.characterRun.characterIndex = 17u;
1426 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1427 fontDescriptionRun02.familyLength = fontHebrew.size();
1428 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1429 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1430 fontDescriptionRun02.familyDefined = true;
1431 fontDescriptionRun02.weightDefined = false;
1432 fontDescriptionRun02.widthDefined = false;
1433 fontDescriptionRun02.slantDefined = false;
1434 fontDescriptionRun02.sizeDefined = false;
1436 // Set a known font description
1437 FontDescriptionRun fontDescriptionRun03;
1438 fontDescriptionRun03.characterRun.characterIndex = 26u;
1439 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1440 fontDescriptionRun03.familyLength = fontLatin.size();
1441 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1442 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1443 fontDescriptionRun03.familyDefined = true;
1444 fontDescriptionRun03.weightDefined = false;
1445 fontDescriptionRun03.widthDefined = false;
1446 fontDescriptionRun03.slantDefined = false;
1447 fontDescriptionRun03.sizeDefined = false;
1449 // Set a known font description
1450 FontDescriptionRun fontDescriptionRun04;
1451 fontDescriptionRun04.characterRun.characterIndex = 28u;
1452 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1453 fontDescriptionRun04.familyLength = fontArabic.size();
1454 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1455 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
1456 fontDescriptionRun04.familyDefined = true;
1457 fontDescriptionRun04.weightDefined = false;
1458 fontDescriptionRun04.widthDefined = false;
1459 fontDescriptionRun04.slantDefined = false;
1460 fontDescriptionRun04.sizeDefined = false;
1462 // Set a known font description
1463 FontDescriptionRun fontDescriptionRun05;
1464 fontDescriptionRun05.characterRun.characterIndex = 42u;
1465 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1466 fontDescriptionRun05.familyLength = fontLatin.size();
1467 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1468 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
1469 fontDescriptionRun05.familyDefined = true;
1470 fontDescriptionRun05.weightDefined = false;
1471 fontDescriptionRun05.widthDefined = false;
1472 fontDescriptionRun05.slantDefined = false;
1473 fontDescriptionRun05.sizeDefined = false;
1475 // Set a known font description
1476 FontDescriptionRun fontDescriptionRun06;
1477 fontDescriptionRun06.characterRun.characterIndex = 54u;
1478 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1479 fontDescriptionRun06.familyLength = fontHebrew.size();
1480 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1481 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1482 fontDescriptionRun06.familyDefined = true;
1483 fontDescriptionRun06.weightDefined = false;
1484 fontDescriptionRun06.widthDefined = false;
1485 fontDescriptionRun06.slantDefined = false;
1486 fontDescriptionRun06.sizeDefined = false;
1488 // Set a known font description
1489 FontDescriptionRun fontDescriptionRun07;
1490 fontDescriptionRun07.characterRun.characterIndex = 64u;
1491 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1492 fontDescriptionRun07.familyLength = fontHebrew.size();
1493 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1494 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
1495 fontDescriptionRun07.familyDefined = true;
1496 fontDescriptionRun07.weightDefined = false;
1497 fontDescriptionRun07.widthDefined = false;
1498 fontDescriptionRun07.slantDefined = false;
1499 fontDescriptionRun07.sizeDefined = false;
1501 // Set a known font description
1502 FontDescriptionRun fontDescriptionRun08;
1503 fontDescriptionRun08.characterRun.characterIndex = 74u;
1504 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1505 fontDescriptionRun08.familyLength = fontLatin.size();
1506 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1507 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1508 fontDescriptionRun08.familyDefined = true;
1509 fontDescriptionRun08.weightDefined = false;
1510 fontDescriptionRun08.widthDefined = false;
1511 fontDescriptionRun08.slantDefined = false;
1512 fontDescriptionRun08.sizeDefined = false;
1514 // Set a known font description
1515 FontDescriptionRun fontDescriptionRun09;
1516 fontDescriptionRun09.characterRun.characterIndex = 92u;
1517 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1518 fontDescriptionRun09.familyLength = fontLatin.size();
1519 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1520 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
1521 fontDescriptionRun09.familyDefined = true;
1522 fontDescriptionRun09.weightDefined = false;
1523 fontDescriptionRun09.widthDefined = false;
1524 fontDescriptionRun09.slantDefined = false;
1525 fontDescriptionRun09.sizeDefined = false;
1527 // Set a known font description
1528 FontDescriptionRun fontDescriptionRun10;
1529 fontDescriptionRun10.characterRun.characterIndex = 104u;
1530 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1531 fontDescriptionRun10.familyLength = fontArabic.size();
1532 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1533 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
1534 fontDescriptionRun10.familyDefined = true;
1535 fontDescriptionRun10.weightDefined = false;
1536 fontDescriptionRun10.widthDefined = false;
1537 fontDescriptionRun10.slantDefined = false;
1538 fontDescriptionRun10.sizeDefined = false;
1540 // Set a known font description
1541 FontDescriptionRun fontDescriptionRun11;
1542 fontDescriptionRun11.characterRun.characterIndex = 118u;
1543 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1544 fontDescriptionRun11.familyLength = fontHebrew.size();
1545 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1546 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
1547 fontDescriptionRun11.familyDefined = true;
1548 fontDescriptionRun11.weightDefined = false;
1549 fontDescriptionRun11.widthDefined = false;
1550 fontDescriptionRun11.slantDefined = false;
1551 fontDescriptionRun11.sizeDefined = false;
1553 // Set a known font description
1554 FontDescriptionRun fontDescriptionRun12;
1555 fontDescriptionRun12.characterRun.characterIndex = 128u;
1556 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1557 fontDescriptionRun12.familyLength = fontLatin.size();
1558 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1559 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
1560 fontDescriptionRun12.familyDefined = true;
1561 fontDescriptionRun12.weightDefined = false;
1562 fontDescriptionRun12.widthDefined = false;
1563 fontDescriptionRun12.slantDefined = false;
1564 fontDescriptionRun12.sizeDefined = false;
1566 // Set a known font description
1567 FontDescriptionRun fontDescriptionRun13;
1568 fontDescriptionRun13.characterRun.characterIndex = 145u;
1569 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1570 fontDescriptionRun13.familyLength = fontHebrew.size();
1571 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1572 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1573 fontDescriptionRun13.familyDefined = true;
1574 fontDescriptionRun13.weightDefined = false;
1575 fontDescriptionRun13.widthDefined = false;
1576 fontDescriptionRun13.slantDefined = false;
1577 fontDescriptionRun13.sizeDefined = false;
1579 // Set a known font description
1580 FontDescriptionRun fontDescriptionRun14;
1581 fontDescriptionRun14.characterRun.characterIndex = 154u;
1582 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1583 fontDescriptionRun14.familyLength = fontLatin.size();
1584 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1585 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1586 fontDescriptionRun14.familyDefined = true;
1587 fontDescriptionRun14.weightDefined = false;
1588 fontDescriptionRun14.widthDefined = false;
1589 fontDescriptionRun14.slantDefined = false;
1590 fontDescriptionRun14.sizeDefined = false;
1592 // Set a known font description
1593 FontDescriptionRun fontDescriptionRun15;
1594 fontDescriptionRun15.characterRun.characterIndex = 156u;
1595 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1596 fontDescriptionRun15.familyLength = fontHebrew.size();
1597 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1598 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
1599 fontDescriptionRun15.familyDefined = true;
1600 fontDescriptionRun15.weightDefined = false;
1601 fontDescriptionRun15.widthDefined = false;
1602 fontDescriptionRun15.slantDefined = false;
1603 fontDescriptionRun15.sizeDefined = false;
1605 // Set a known font description
1606 FontDescriptionRun fontDescriptionRun16;
1607 fontDescriptionRun16.characterRun.characterIndex = 166u;
1608 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1609 fontDescriptionRun16.familyLength = fontLatin.size();
1610 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
1611 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
1612 fontDescriptionRun16.familyDefined = true;
1613 fontDescriptionRun16.weightDefined = false;
1614 fontDescriptionRun16.widthDefined = false;
1615 fontDescriptionRun16.slantDefined = false;
1616 fontDescriptionRun16.sizeDefined = false;
1618 // Set a known font description
1619 FontDescriptionRun fontDescriptionRun17;
1620 fontDescriptionRun17.characterRun.characterIndex = 178u;
1621 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1622 fontDescriptionRun17.familyLength = fontArabic.size();
1623 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
1624 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
1625 fontDescriptionRun17.familyDefined = true;
1626 fontDescriptionRun17.weightDefined = false;
1627 fontDescriptionRun17.widthDefined = false;
1628 fontDescriptionRun17.slantDefined = false;
1629 fontDescriptionRun17.sizeDefined = false;
1631 Vector<FontDescriptionRun> fontDescriptionRuns;
1632 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1633 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1634 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1635 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1636 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1637 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1638 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1639 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1640 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1641 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1642 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1643 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1644 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1645 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1646 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1647 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
1648 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
1649 Size textArea(100.f, 300.f);
1650 Size layoutSize(92.f, 380.f);
1653 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,
1654 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,
1655 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1656 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,
1657 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,
1658 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1659 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,
1660 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,
1661 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
1662 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,
1663 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,
1664 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1665 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,
1666 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,
1667 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1668 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,
1669 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,
1670 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,
1673 struct LineRun line01 =
1685 struct LineRun line02 =
1697 struct LineRun line03 =
1709 struct LineRun line04 =
1721 struct LineRun line05 =
1733 struct LineRun line06 =
1745 struct LineRun line07 =
1757 struct LineRun line08 =
1769 struct LineRun line09 =
1781 struct LineRun line10 =
1793 struct LineRun line11 =
1805 struct LineRun line12 =
1817 struct LineRun line13 =
1829 struct LineRun line14 =
1841 struct LineRun line15 =
1853 struct LineRun line16 =
1865 struct LineRun line17 =
1877 struct LineRun line18 =
1889 struct LineRun line19 =
1901 Vector<LineRun> lines;
1902 lines.PushBack( line01 );
1903 lines.PushBack( line02 );
1904 lines.PushBack( line03 );
1905 lines.PushBack( line04 );
1906 lines.PushBack( line05 );
1907 lines.PushBack( line06 );
1908 lines.PushBack( line07 );
1909 lines.PushBack( line08 );
1910 lines.PushBack( line09 );
1911 lines.PushBack( line10 );
1912 lines.PushBack( line11 );
1913 lines.PushBack( line12 );
1914 lines.PushBack( line13 );
1915 lines.PushBack( line14 );
1916 lines.PushBack( line15 );
1917 lines.PushBack( line16 );
1918 lines.PushBack( line17 );
1919 lines.PushBack( line18 );
1920 lines.PushBack( line19 );
1922 LayoutTextData data =
1924 "Layout bidirectional text.",
1925 "Hello world demo שלום עולם.\n"
1926 "مرحبا بالعالم hello world שלום עולם\n"
1927 "שלום עולם hello world demo.\n"
1928 "hello world مرحبا بالعالم שלום עולם\n"
1929 "Hello world demo שלום עולם.\n"
1930 "שלום עולם hello world مرحبا بالعالم\n",
1933 fontDescriptionRuns.Begin(),
1939 Layout::Engine::MULTI_LINE_BOX,
1946 if( !LayoutTextTest( data ) )
1948 tet_result(TET_FAIL);
1951 tet_result(TET_PASS);
1955 int UtcDaliTextUpdateLayout02(void)
1957 ToolkitTestApplication application;
1958 tet_infoline(" UtcDaliTextUpdateLayout02");
1960 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
1962 const std::string fontLatin( "TizenSans" );
1963 const std::string fontHebrew( "TizenSansHebrew" );
1964 const std::string fontArabic( "TizenSansArabic" );
1966 // Set a known font description
1967 FontDescriptionRun fontDescriptionRun01;
1968 fontDescriptionRun01.characterRun.characterIndex = 0u;
1969 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1970 fontDescriptionRun01.familyLength = fontLatin.size();
1971 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1972 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1973 fontDescriptionRun01.familyDefined = true;
1974 fontDescriptionRun01.weightDefined = false;
1975 fontDescriptionRun01.widthDefined = false;
1976 fontDescriptionRun01.slantDefined = false;
1977 fontDescriptionRun01.sizeDefined = false;
1979 // Set a known font description
1980 FontDescriptionRun fontDescriptionRun02;
1981 fontDescriptionRun02.characterRun.characterIndex = 17u;
1982 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1983 fontDescriptionRun02.familyLength = fontHebrew.size();
1984 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1985 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1986 fontDescriptionRun02.familyDefined = true;
1987 fontDescriptionRun02.weightDefined = false;
1988 fontDescriptionRun02.widthDefined = false;
1989 fontDescriptionRun02.slantDefined = false;
1990 fontDescriptionRun02.sizeDefined = false;
1992 // Set a known font description
1993 FontDescriptionRun fontDescriptionRun03;
1994 fontDescriptionRun03.characterRun.characterIndex = 26u;
1995 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1996 fontDescriptionRun03.familyLength = fontLatin.size();
1997 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1998 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1999 fontDescriptionRun03.familyDefined = true;
2000 fontDescriptionRun03.weightDefined = false;
2001 fontDescriptionRun03.widthDefined = false;
2002 fontDescriptionRun03.slantDefined = false;
2003 fontDescriptionRun03.sizeDefined = false;
2005 // Set a known font description
2006 FontDescriptionRun fontDescriptionRun04;
2007 fontDescriptionRun04.characterRun.characterIndex = 28u;
2008 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2009 fontDescriptionRun04.familyLength = fontArabic.size();
2010 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2011 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2012 fontDescriptionRun04.familyDefined = true;
2013 fontDescriptionRun04.weightDefined = false;
2014 fontDescriptionRun04.widthDefined = false;
2015 fontDescriptionRun04.slantDefined = false;
2016 fontDescriptionRun04.sizeDefined = false;
2018 // Set a known font description
2019 FontDescriptionRun fontDescriptionRun05;
2020 fontDescriptionRun05.characterRun.characterIndex = 42u;
2021 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2022 fontDescriptionRun05.familyLength = fontLatin.size();
2023 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2024 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2025 fontDescriptionRun05.familyDefined = true;
2026 fontDescriptionRun05.weightDefined = false;
2027 fontDescriptionRun05.widthDefined = false;
2028 fontDescriptionRun05.slantDefined = false;
2029 fontDescriptionRun05.sizeDefined = false;
2031 // Set a known font description
2032 FontDescriptionRun fontDescriptionRun06;
2033 fontDescriptionRun06.characterRun.characterIndex = 54u;
2034 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2035 fontDescriptionRun06.familyLength = fontHebrew.size();
2036 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2037 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2038 fontDescriptionRun06.familyDefined = true;
2039 fontDescriptionRun06.weightDefined = false;
2040 fontDescriptionRun06.widthDefined = false;
2041 fontDescriptionRun06.slantDefined = false;
2042 fontDescriptionRun06.sizeDefined = false;
2044 // Set a known font description
2045 FontDescriptionRun fontDescriptionRun07;
2046 fontDescriptionRun07.characterRun.characterIndex = 64u;
2047 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2048 fontDescriptionRun07.familyLength = fontHebrew.size();
2049 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2050 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2051 fontDescriptionRun07.familyDefined = true;
2052 fontDescriptionRun07.weightDefined = false;
2053 fontDescriptionRun07.widthDefined = false;
2054 fontDescriptionRun07.slantDefined = false;
2055 fontDescriptionRun07.sizeDefined = false;
2057 // Set a known font description
2058 FontDescriptionRun fontDescriptionRun08;
2059 fontDescriptionRun08.characterRun.characterIndex = 74u;
2060 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2061 fontDescriptionRun08.familyLength = fontLatin.size();
2062 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2063 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2064 fontDescriptionRun08.familyDefined = true;
2065 fontDescriptionRun08.weightDefined = false;
2066 fontDescriptionRun08.widthDefined = false;
2067 fontDescriptionRun08.slantDefined = false;
2068 fontDescriptionRun08.sizeDefined = false;
2070 // Set a known font description
2071 FontDescriptionRun fontDescriptionRun09;
2072 fontDescriptionRun09.characterRun.characterIndex = 92u;
2073 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2074 fontDescriptionRun09.familyLength = fontLatin.size();
2075 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2076 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2077 fontDescriptionRun09.familyDefined = true;
2078 fontDescriptionRun09.weightDefined = false;
2079 fontDescriptionRun09.widthDefined = false;
2080 fontDescriptionRun09.slantDefined = false;
2081 fontDescriptionRun09.sizeDefined = false;
2083 // Set a known font description
2084 FontDescriptionRun fontDescriptionRun10;
2085 fontDescriptionRun10.characterRun.characterIndex = 104u;
2086 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2087 fontDescriptionRun10.familyLength = fontArabic.size();
2088 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2089 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2090 fontDescriptionRun10.familyDefined = true;
2091 fontDescriptionRun10.weightDefined = false;
2092 fontDescriptionRun10.widthDefined = false;
2093 fontDescriptionRun10.slantDefined = false;
2094 fontDescriptionRun10.sizeDefined = false;
2096 // Set a known font description
2097 FontDescriptionRun fontDescriptionRun11;
2098 fontDescriptionRun11.characterRun.characterIndex = 118u;
2099 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2100 fontDescriptionRun11.familyLength = fontHebrew.size();
2101 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2102 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2103 fontDescriptionRun11.familyDefined = true;
2104 fontDescriptionRun11.weightDefined = false;
2105 fontDescriptionRun11.widthDefined = false;
2106 fontDescriptionRun11.slantDefined = false;
2107 fontDescriptionRun11.sizeDefined = false;
2109 // Set a known font description
2110 FontDescriptionRun fontDescriptionRun12;
2111 fontDescriptionRun12.characterRun.characterIndex = 128u;
2112 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2113 fontDescriptionRun12.familyLength = fontLatin.size();
2114 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2115 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2116 fontDescriptionRun12.familyDefined = true;
2117 fontDescriptionRun12.weightDefined = false;
2118 fontDescriptionRun12.widthDefined = false;
2119 fontDescriptionRun12.slantDefined = false;
2120 fontDescriptionRun12.sizeDefined = false;
2122 // Set a known font description
2123 FontDescriptionRun fontDescriptionRun13;
2124 fontDescriptionRun13.characterRun.characterIndex = 145u;
2125 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2126 fontDescriptionRun13.familyLength = fontHebrew.size();
2127 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2128 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2129 fontDescriptionRun13.familyDefined = true;
2130 fontDescriptionRun13.weightDefined = false;
2131 fontDescriptionRun13.widthDefined = false;
2132 fontDescriptionRun13.slantDefined = false;
2133 fontDescriptionRun13.sizeDefined = false;
2135 // Set a known font description
2136 FontDescriptionRun fontDescriptionRun14;
2137 fontDescriptionRun14.characterRun.characterIndex = 154u;
2138 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2139 fontDescriptionRun14.familyLength = fontLatin.size();
2140 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2141 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2142 fontDescriptionRun14.familyDefined = true;
2143 fontDescriptionRun14.weightDefined = false;
2144 fontDescriptionRun14.widthDefined = false;
2145 fontDescriptionRun14.slantDefined = false;
2146 fontDescriptionRun14.sizeDefined = false;
2148 // Set a known font description
2149 FontDescriptionRun fontDescriptionRun15;
2150 fontDescriptionRun15.characterRun.characterIndex = 156u;
2151 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2152 fontDescriptionRun15.familyLength = fontHebrew.size();
2153 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2154 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2155 fontDescriptionRun15.familyDefined = true;
2156 fontDescriptionRun15.weightDefined = false;
2157 fontDescriptionRun15.widthDefined = false;
2158 fontDescriptionRun15.slantDefined = false;
2159 fontDescriptionRun15.sizeDefined = false;
2161 // Set a known font description
2162 FontDescriptionRun fontDescriptionRun16;
2163 fontDescriptionRun16.characterRun.characterIndex = 166u;
2164 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2165 fontDescriptionRun16.familyLength = fontLatin.size();
2166 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2167 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2168 fontDescriptionRun16.familyDefined = true;
2169 fontDescriptionRun16.weightDefined = false;
2170 fontDescriptionRun16.widthDefined = false;
2171 fontDescriptionRun16.slantDefined = false;
2172 fontDescriptionRun16.sizeDefined = false;
2174 // Set a known font description
2175 FontDescriptionRun fontDescriptionRun17;
2176 fontDescriptionRun17.characterRun.characterIndex = 178u;
2177 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2178 fontDescriptionRun17.familyLength = fontArabic.size();
2179 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2180 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2181 fontDescriptionRun17.familyDefined = true;
2182 fontDescriptionRun17.weightDefined = false;
2183 fontDescriptionRun17.widthDefined = false;
2184 fontDescriptionRun17.slantDefined = false;
2185 fontDescriptionRun17.sizeDefined = false;
2187 Vector<FontDescriptionRun> fontDescriptionRuns;
2188 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2189 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2190 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2191 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2192 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2193 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2194 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2195 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2196 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2197 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2198 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2199 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2200 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2201 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2202 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2203 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2204 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2205 Size textArea(100.f, 300.f);
2206 Size layoutSize(92.f, 380.f);
2209 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,
2210 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,
2211 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2212 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,
2213 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,
2214 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2215 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,
2216 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,
2217 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2218 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,
2219 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,
2220 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2221 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,
2222 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,
2223 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2224 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,
2225 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,
2226 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,
2229 struct LineRun line01 =
2241 struct LineRun line02 =
2253 struct LineRun line03 =
2265 struct LineRun line04 =
2277 struct LineRun line05 =
2289 struct LineRun line06 =
2301 struct LineRun line07 =
2313 struct LineRun line08 =
2325 struct LineRun line09 =
2337 struct LineRun line10 =
2349 struct LineRun line11 =
2361 struct LineRun line12 =
2373 struct LineRun line13 =
2385 struct LineRun line14 =
2397 struct LineRun line15 =
2409 struct LineRun line16 =
2421 struct LineRun line17 =
2433 struct LineRun line18 =
2445 struct LineRun line19 =
2457 Vector<LineRun> lines;
2458 lines.PushBack( line01 );
2459 lines.PushBack( line02 );
2460 lines.PushBack( line03 );
2461 lines.PushBack( line04 );
2462 lines.PushBack( line05 );
2463 lines.PushBack( line06 );
2464 lines.PushBack( line07 );
2465 lines.PushBack( line08 );
2466 lines.PushBack( line09 );
2467 lines.PushBack( line10 );
2468 lines.PushBack( line11 );
2469 lines.PushBack( line12 );
2470 lines.PushBack( line13 );
2471 lines.PushBack( line14 );
2472 lines.PushBack( line15 );
2473 lines.PushBack( line16 );
2474 lines.PushBack( line17 );
2475 lines.PushBack( line18 );
2476 lines.PushBack( line19 );
2478 LayoutTextData data =
2480 "Layout bidirectional text.",
2481 "Hello world demo שלום עולם.\n"
2482 "مرحبا بالعالم hello world שלום עולם\n"
2483 "שלום עולם hello world demo.\n"
2484 "hello world مرحبا بالعالم שלום עולם\n"
2485 "Hello world demo שלום עולם.\n"
2486 "שלום עולם hello world مرحبا بالعالم\n",
2489 fontDescriptionRuns.Begin(),
2495 Layout::Engine::MULTI_LINE_BOX,
2502 if( !LayoutTextTest( data ) )
2504 tet_result(TET_FAIL);
2507 tet_result(TET_PASS);
2511 int UtcDaliTextUpdateLayout03(void)
2513 ToolkitTestApplication application;
2514 tet_infoline(" UtcDaliTextUpdateLayout03");
2516 // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2518 const std::string fontLatin( "TizenSans" );
2519 const std::string fontHebrew( "TizenSansHebrew" );
2520 const std::string fontArabic( "TizenSansArabic" );
2522 // Set a known font description
2523 FontDescriptionRun fontDescriptionRun01;
2524 fontDescriptionRun01.characterRun.characterIndex = 0u;
2525 fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2526 fontDescriptionRun01.familyLength = fontLatin.size();
2527 fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2528 memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2529 fontDescriptionRun01.familyDefined = true;
2530 fontDescriptionRun01.weightDefined = false;
2531 fontDescriptionRun01.widthDefined = false;
2532 fontDescriptionRun01.slantDefined = false;
2533 fontDescriptionRun01.sizeDefined = false;
2535 // Set a known font description
2536 FontDescriptionRun fontDescriptionRun02;
2537 fontDescriptionRun02.characterRun.characterIndex = 17u;
2538 fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2539 fontDescriptionRun02.familyLength = fontHebrew.size();
2540 fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2541 memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2542 fontDescriptionRun02.familyDefined = true;
2543 fontDescriptionRun02.weightDefined = false;
2544 fontDescriptionRun02.widthDefined = false;
2545 fontDescriptionRun02.slantDefined = false;
2546 fontDescriptionRun02.sizeDefined = false;
2548 // Set a known font description
2549 FontDescriptionRun fontDescriptionRun03;
2550 fontDescriptionRun03.characterRun.characterIndex = 26u;
2551 fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2552 fontDescriptionRun03.familyLength = fontLatin.size();
2553 fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2554 memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2555 fontDescriptionRun03.familyDefined = true;
2556 fontDescriptionRun03.weightDefined = false;
2557 fontDescriptionRun03.widthDefined = false;
2558 fontDescriptionRun03.slantDefined = false;
2559 fontDescriptionRun03.sizeDefined = false;
2561 // Set a known font description
2562 FontDescriptionRun fontDescriptionRun04;
2563 fontDescriptionRun04.characterRun.characterIndex = 28u;
2564 fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2565 fontDescriptionRun04.familyLength = fontArabic.size();
2566 fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2567 memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2568 fontDescriptionRun04.familyDefined = true;
2569 fontDescriptionRun04.weightDefined = false;
2570 fontDescriptionRun04.widthDefined = false;
2571 fontDescriptionRun04.slantDefined = false;
2572 fontDescriptionRun04.sizeDefined = false;
2574 // Set a known font description
2575 FontDescriptionRun fontDescriptionRun05;
2576 fontDescriptionRun05.characterRun.characterIndex = 42u;
2577 fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2578 fontDescriptionRun05.familyLength = fontLatin.size();
2579 fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2580 memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2581 fontDescriptionRun05.familyDefined = true;
2582 fontDescriptionRun05.weightDefined = false;
2583 fontDescriptionRun05.widthDefined = false;
2584 fontDescriptionRun05.slantDefined = false;
2585 fontDescriptionRun05.sizeDefined = false;
2587 // Set a known font description
2588 FontDescriptionRun fontDescriptionRun06;
2589 fontDescriptionRun06.characterRun.characterIndex = 54u;
2590 fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2591 fontDescriptionRun06.familyLength = fontHebrew.size();
2592 fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2593 memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2594 fontDescriptionRun06.familyDefined = true;
2595 fontDescriptionRun06.weightDefined = false;
2596 fontDescriptionRun06.widthDefined = false;
2597 fontDescriptionRun06.slantDefined = false;
2598 fontDescriptionRun06.sizeDefined = false;
2600 // Set a known font description
2601 FontDescriptionRun fontDescriptionRun07;
2602 fontDescriptionRun07.characterRun.characterIndex = 64u;
2603 fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2604 fontDescriptionRun07.familyLength = fontHebrew.size();
2605 fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2606 memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2607 fontDescriptionRun07.familyDefined = true;
2608 fontDescriptionRun07.weightDefined = false;
2609 fontDescriptionRun07.widthDefined = false;
2610 fontDescriptionRun07.slantDefined = false;
2611 fontDescriptionRun07.sizeDefined = false;
2613 // Set a known font description
2614 FontDescriptionRun fontDescriptionRun08;
2615 fontDescriptionRun08.characterRun.characterIndex = 74u;
2616 fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2617 fontDescriptionRun08.familyLength = fontLatin.size();
2618 fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2619 memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2620 fontDescriptionRun08.familyDefined = true;
2621 fontDescriptionRun08.weightDefined = false;
2622 fontDescriptionRun08.widthDefined = false;
2623 fontDescriptionRun08.slantDefined = false;
2624 fontDescriptionRun08.sizeDefined = false;
2626 // Set a known font description
2627 FontDescriptionRun fontDescriptionRun09;
2628 fontDescriptionRun09.characterRun.characterIndex = 92u;
2629 fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2630 fontDescriptionRun09.familyLength = fontLatin.size();
2631 fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2632 memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2633 fontDescriptionRun09.familyDefined = true;
2634 fontDescriptionRun09.weightDefined = false;
2635 fontDescriptionRun09.widthDefined = false;
2636 fontDescriptionRun09.slantDefined = false;
2637 fontDescriptionRun09.sizeDefined = false;
2639 // Set a known font description
2640 FontDescriptionRun fontDescriptionRun10;
2641 fontDescriptionRun10.characterRun.characterIndex = 104u;
2642 fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2643 fontDescriptionRun10.familyLength = fontArabic.size();
2644 fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2645 memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2646 fontDescriptionRun10.familyDefined = true;
2647 fontDescriptionRun10.weightDefined = false;
2648 fontDescriptionRun10.widthDefined = false;
2649 fontDescriptionRun10.slantDefined = false;
2650 fontDescriptionRun10.sizeDefined = false;
2652 // Set a known font description
2653 FontDescriptionRun fontDescriptionRun11;
2654 fontDescriptionRun11.characterRun.characterIndex = 118u;
2655 fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2656 fontDescriptionRun11.familyLength = fontHebrew.size();
2657 fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2658 memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2659 fontDescriptionRun11.familyDefined = true;
2660 fontDescriptionRun11.weightDefined = false;
2661 fontDescriptionRun11.widthDefined = false;
2662 fontDescriptionRun11.slantDefined = false;
2663 fontDescriptionRun11.sizeDefined = false;
2665 // Set a known font description
2666 FontDescriptionRun fontDescriptionRun12;
2667 fontDescriptionRun12.characterRun.characterIndex = 128u;
2668 fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2669 fontDescriptionRun12.familyLength = fontLatin.size();
2670 fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2671 memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2672 fontDescriptionRun12.familyDefined = true;
2673 fontDescriptionRun12.weightDefined = false;
2674 fontDescriptionRun12.widthDefined = false;
2675 fontDescriptionRun12.slantDefined = false;
2676 fontDescriptionRun12.sizeDefined = false;
2678 // Set a known font description
2679 FontDescriptionRun fontDescriptionRun13;
2680 fontDescriptionRun13.characterRun.characterIndex = 145u;
2681 fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2682 fontDescriptionRun13.familyLength = fontHebrew.size();
2683 fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2684 memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2685 fontDescriptionRun13.familyDefined = true;
2686 fontDescriptionRun13.weightDefined = false;
2687 fontDescriptionRun13.widthDefined = false;
2688 fontDescriptionRun13.slantDefined = false;
2689 fontDescriptionRun13.sizeDefined = false;
2691 // Set a known font description
2692 FontDescriptionRun fontDescriptionRun14;
2693 fontDescriptionRun14.characterRun.characterIndex = 154u;
2694 fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2695 fontDescriptionRun14.familyLength = fontLatin.size();
2696 fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2697 memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2698 fontDescriptionRun14.familyDefined = true;
2699 fontDescriptionRun14.weightDefined = false;
2700 fontDescriptionRun14.widthDefined = false;
2701 fontDescriptionRun14.slantDefined = false;
2702 fontDescriptionRun14.sizeDefined = false;
2704 // Set a known font description
2705 FontDescriptionRun fontDescriptionRun15;
2706 fontDescriptionRun15.characterRun.characterIndex = 156u;
2707 fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2708 fontDescriptionRun15.familyLength = fontHebrew.size();
2709 fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2710 memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2711 fontDescriptionRun15.familyDefined = true;
2712 fontDescriptionRun15.weightDefined = false;
2713 fontDescriptionRun15.widthDefined = false;
2714 fontDescriptionRun15.slantDefined = false;
2715 fontDescriptionRun15.sizeDefined = false;
2717 // Set a known font description
2718 FontDescriptionRun fontDescriptionRun16;
2719 fontDescriptionRun16.characterRun.characterIndex = 166u;
2720 fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2721 fontDescriptionRun16.familyLength = fontLatin.size();
2722 fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2723 memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2724 fontDescriptionRun16.familyDefined = true;
2725 fontDescriptionRun16.weightDefined = false;
2726 fontDescriptionRun16.widthDefined = false;
2727 fontDescriptionRun16.slantDefined = false;
2728 fontDescriptionRun16.sizeDefined = false;
2730 // Set a known font description
2731 FontDescriptionRun fontDescriptionRun17;
2732 fontDescriptionRun17.characterRun.characterIndex = 178u;
2733 fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2734 fontDescriptionRun17.familyLength = fontArabic.size();
2735 fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2736 memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2737 fontDescriptionRun17.familyDefined = true;
2738 fontDescriptionRun17.weightDefined = false;
2739 fontDescriptionRun17.widthDefined = false;
2740 fontDescriptionRun17.slantDefined = false;
2741 fontDescriptionRun17.sizeDefined = false;
2743 Vector<FontDescriptionRun> fontDescriptionRuns;
2744 fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2745 fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2746 fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2747 fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2748 fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2749 fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2750 fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2751 fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2752 fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2753 fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2754 fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2755 fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2756 fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2757 fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2758 fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2759 fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2760 fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2761 Size textArea(100.f, 300.f);
2762 Size layoutSize(92.f, 380.f);
2765 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,
2766 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,
2767 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2768 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,
2769 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,
2770 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2771 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,
2772 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,
2773 0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2774 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,
2775 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,
2776 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2777 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,
2778 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,
2779 1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2780 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,
2781 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,
2782 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,
2785 struct LineRun line01 =
2797 struct LineRun line02 =
2809 struct LineRun line03 =
2821 struct LineRun line04 =
2833 struct LineRun line05 =
2845 struct LineRun line06 =
2857 struct LineRun line07 =
2869 struct LineRun line08 =
2881 struct LineRun line09 =
2893 struct LineRun line10 =
2905 struct LineRun line11 =
2917 struct LineRun line12 =
2929 struct LineRun line13 =
2941 struct LineRun line14 =
2953 struct LineRun line15 =
2965 struct LineRun line16 =
2977 struct LineRun line17 =
2989 struct LineRun line18 =
3001 struct LineRun line19 =
3013 Vector<LineRun> lines;
3014 lines.PushBack( line01 );
3015 lines.PushBack( line02 );
3016 lines.PushBack( line03 );
3017 lines.PushBack( line04 );
3018 lines.PushBack( line05 );
3019 lines.PushBack( line06 );
3020 lines.PushBack( line07 );
3021 lines.PushBack( line08 );
3022 lines.PushBack( line09 );
3023 lines.PushBack( line10 );
3024 lines.PushBack( line11 );
3025 lines.PushBack( line12 );
3026 lines.PushBack( line13 );
3027 lines.PushBack( line14 );
3028 lines.PushBack( line15 );
3029 lines.PushBack( line16 );
3030 lines.PushBack( line17 );
3031 lines.PushBack( line18 );
3032 lines.PushBack( line19 );
3034 LayoutTextData data =
3036 "Layout bidirectional text.",
3037 "Hello world demo שלום עולם.\n"
3038 "مرحبا بالعالم hello world שלום עולם\n"
3039 "שלום עולם hello world demo.\n"
3040 "hello world مرحبا بالعالم שלום עולם\n"
3041 "Hello world demo שלום עולם.\n"
3042 "שלום עולם hello world مرحبا بالعالم\n",
3045 fontDescriptionRuns.Begin(),
3051 Layout::Engine::MULTI_LINE_BOX,
3058 if( !LayoutTextTest( data ) )
3060 tet_result(TET_FAIL);
3063 tet_result(TET_PASS);