From 895806b4ad86de88dcc731aeb8e3dbe453ce4202 Mon Sep 17 00:00:00 2001 From: Sara Samara Date: Tue, 6 Jul 2021 11:48:26 +0300 Subject: [PATCH] Adding Character Spacing *********************************************************** Description: Adding the CHARACTER_SPACING for text-editor, text-field and text-label. CHARACTER_SPACING determines the spaces between characters. A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). The sample code below can be used to test the CHARACTER_SPACING. *********************************************************** using namespace Dali; using namespace Dali::Toolkit; class SimpleApp : public ConnectionTracker { public: SimpleApp(Application &application) : mApplication(application) { mApplication.InitSignal().Connect(this, &SimpleApp::Create); } void Create(Application &application) { Window window = application.GetWindow(); window.SetBackgroundColor(Vector4(0.04f, 0.345f, 0.392f, 1.0f)); mEditor = TextEditor::New(); mEditor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER); mEditor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER); mEditor.SetProperty(Actor::Property::POSITION, Vector3(0.f, 0.0f, 0.f)); mEditor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 100.0f)); mEditor.SetBackgroundColor(Vector4(0.04f, 0.345f, 0.392f, 1.0f)); mEditor.SetProperty(TextEditor::Property::TEXT, "A long text that exceeds the editor's width."); mEditor.SetProperty(DevelTextEditor::Property::CHARACTER_SPACING, 15.0f); // mLabel = TextLabel::New(); // mLabel.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER); // mLabel.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER); // mLabel.SetProperty(Actor::Property::POSITION, Vector3(0.f, 0.0f, 0.f)); // mLabel.SetProperty(Actor::Property::SIZE, Vector2(400.f, 200.0f)); // mLabel.SetProperty(TextLabel::Property::TEXT_COLOR, Color::BLACK); // mLabel.SetProperty(TextLabel::Property::TEXT, "A long text text text that exceeds the label's width."); // mLabel.SetProperty(DevelTextLabel::Property::CHARACTER_SPACING, 10.0f); // mLabel.SetProperty(TextLabel::Property::ELLIPSIS, false); // mField = TextField::New(); // mField.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_CENTER); // mField.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER); // mField.SetProperty(Actor::Property::POSITION, Vector3(0.f, 0.0f, 0.f)); // mField.SetProperty(Actor::Property::SIZE, Vector2(200.f, 100.0f)); // mField.SetProperty(TextField::Property::TEXT, "A long text text text that exceeds the field's width."); // mField.SetProperty(DevelTextField::Property::CHARACTER_SPACING, 10.0f); // mField.SetProperty(TextField::Property::ELLIPSIS, false); //window.Add(mLabel); window.Add(mEditor); //window.Add(mField); } bool OnButtonClicked(Button button) { if (button == mButton) { Vector3 originalSize = mEditor.GetNaturalSize(); } return true; } private: Application &mApplication; TextEditor mEditor; PushButton mButton; TextField mField; TextLabel mLabel; }; int DALI_EXPORT_API main(int argc, char **argv) { Application application = Application::New(&argc, &argv); SimpleApp test(application); application.MainLoop(); return 0; } Change-Id: Ibd89f1398e391dc56e3a230c7a136cfe07edc37a --- .../src/dali-toolkit-internal/CMakeLists.txt | 1 + .../dali-toolkit-test-utils/toolkit-text-utils.cpp | 5 +- .../dali-toolkit-test-utils/toolkit-text-utils.h | 67 +- .../utc-Dali-BidirectionalSupport.cpp | 769 +- .../utc-Dali-LogicalModel.cpp | 1430 ++-- .../utc-Dali-Text-CharacterSpacing.cpp | 856 ++ .../dali-toolkit-internal/utc-Dali-Text-Cursor.cpp | 1058 ++- .../utc-Dali-Text-Hyphen-Wrapping.cpp | 302 +- .../dali-toolkit-internal/utc-Dali-Text-Layout.cpp | 8192 +++++++++++--------- .../utc-Dali-Text-Shaping.cpp | 1350 ++-- .../dali-toolkit-internal/utc-Dali-VisualModel.cpp | 376 +- .../src/dali-toolkit/utc-Dali-TextEditor.cpp | 26 +- .../src/dali-toolkit/utc-Dali-TextField.cpp | 26 +- .../src/dali-toolkit/utc-Dali-TextLabel.cpp | 25 +- .../controls/text-controls/text-editor-devel.h | 9 + .../controls/text-controls/text-field-devel.h | 9 + .../controls/text-controls/text-label-devel.h | 9 + dali-toolkit/devel-api/text/text-utils-devel.cpp | 14 +- .../visuals/text-visual-properties-devel.h | 7 +- .../controls/text-controls/text-editor-impl.cpp | 1 + .../text-controls/text-editor-property-handler.cpp | 12 + .../controls/text-controls/text-field-impl.cpp | 1 + .../text-controls/text-field-property-handler.cpp | 13 + .../controls/text-controls/text-label-impl.cpp | 12 + dali-toolkit/internal/file.list | 1 + .../internal/text/cursor-helper-functions.cpp | 42 +- .../internal/text/glyph-metrics-helper.cpp | 42 +- dali-toolkit/internal/text/glyph-metrics-helper.h | 40 +- .../layouts/layout-engine-helper-functions.cpp | 148 + .../text/layouts/layout-engine-helper-functions.h | 106 + .../internal/text/layouts/layout-engine.cpp | 194 +- .../text/rendering/atlas/text-atlas-renderer.cpp | 13 +- .../internal/text/rendering/text-typesetter.cpp | 17 +- .../internal/text/rendering/view-model.cpp | 26 +- dali-toolkit/internal/text/rendering/view-model.h | 15 + .../text/text-controller-background-actor.cpp | 27 +- .../text/text-controller-background-actor.h | 10 +- .../internal/text/text-controller-impl.cpp | 8 +- dali-toolkit/internal/text/text-controller-impl.h | 12 +- dali-toolkit/internal/text/text-controller.cpp | 15 +- dali-toolkit/internal/text/text-controller.h | 18 + dali-toolkit/internal/text/text-model-interface.h | 23 + dali-toolkit/internal/text/text-model.cpp | 15 + dali-toolkit/internal/text/text-model.h | 14 + .../text/text-selection-handle-controller.cpp | 22 +- dali-toolkit/internal/text/text-view-interface.h | 26 + dali-toolkit/internal/text/text-view.cpp | 36 +- dali-toolkit/internal/text/text-view.h | 23 + dali-toolkit/internal/text/visual-model-impl.cpp | 18 +- dali-toolkit/internal/text/visual-model-impl.h | 25 + 50 files changed, 8990 insertions(+), 6516 deletions(-) create mode 100644 automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSpacing.cpp create mode 100644 dali-toolkit/internal/text/layouts/layout-engine-helper-functions.cpp create mode 100644 dali-toolkit/internal/text/layouts/layout-engine-helper-functions.h diff --git a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt index c1b0ae6..6ea7182 100755 --- a/automated-tests/src/dali-toolkit-internal/CMakeLists.txt +++ b/automated-tests/src/dali-toolkit-internal/CMakeLists.txt @@ -38,6 +38,7 @@ SET(TC_SOURCES utc-Dali-VisualUrl.cpp utc-Dali-Text-Hyphen-Wrapping.cpp utc-Dali-Text-Ellipsis.cpp + utc-Dali-Text-CharacterSpacing.cpp ) IF(ELDBUS_AVAILABLE) diff --git a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp index e9d0ef0..065e5fd 100644 --- a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp +++ b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp @@ -102,7 +102,8 @@ void CreateTextModel(const std::string& text, LineWrap::Mode wrapMode, bool ellipsisEnabled, DevelText::EllipsisPosition::Type ellipsisPosition, - float lineSpacing) + float lineSpacing, + float characterSpacing) { textModel = Model::New(); ///< Pointer to the text's model. LogicalModelPtr logicalModel = textModel->mLogicalModel; @@ -299,6 +300,8 @@ void CreateTextModel(const std::string& text, visualModel->CreateGlyphsPerCharacterTable(0u, 0u, characterCount); visualModel->CreateCharacterToGlyphTable(0u, 0u, characterCount); + visualModel->SetCharacterSpacing(characterSpacing); + const Length numberOfGlyphs = glyphs.Count(); // 8) Get the glyph metrics diff --git a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.h b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.h index 389d72d..00bf3d5 100644 --- a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.h +++ b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_TEXT_UTILS_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,23 +25,21 @@ namespace Dali { - namespace Toolkit { - namespace Text { - /** * @brief Some layout options. */ struct LayoutOptions { LayoutOptions() - : align{ true } - {} + : align{true} + { + } - bool align : 1; ///< Whether to align the lines. + bool align : 1; ///< Whether to align the lines. }; /** @@ -60,41 +58,42 @@ struct LayoutOptions * @param[in] ellipsisEnabled Whether the ellipsis layout option is enabled. * @param[in] ellipsisPosition Where is the location the text elide. * @param[in] lineSpacing The height of the line in points. + * @param[in] characterSpacing The spacing between the characters. */ -void CreateTextModel( const std::string& text, - const Size& textArea, - const Vector& fontDescriptions, - const LayoutOptions& options, - Size& layoutSize, - ModelPtr& textModel, - MetricsPtr& metrics, - bool markupProcessorEnabled, - LineWrap::Mode wrapMode, - bool ellipsisEnabled, - DevelText::EllipsisPosition::Type ellipsisPosition, - float lineSpacing); +void CreateTextModel(const std::string& text, + const Size& textArea, + const Vector& fontDescriptions, + const LayoutOptions& options, + Size& layoutSize, + ModelPtr& textModel, + MetricsPtr& metrics, + bool markupProcessorEnabled, + LineWrap::Mode wrapMode, + bool ellipsisEnabled, + DevelText::EllipsisPosition::Type ellipsisPosition, + float lineSpacing, + float characterSpacing); /** * @brief Configures the text @p controller similarly to the one configured by the text-label. * * @param[in,out] The text controller to configure. */ -void ConfigureTextLabel( ControllerPtr controller ); +void ConfigureTextLabel(ControllerPtr controller); /** * @brief Configures the text @p controller similarly to the one configured by the text-field. * * @param[in,out] The text controller to configure. */ -void ConfigureTextField( ControllerPtr controller ); +void ConfigureTextField(ControllerPtr controller); /** * @brief Configures the text @p controller similarly to the one configured by the text-editor. * * @param[in,out] The text controller to configure. */ -void ConfigureTextEditor( ControllerPtr controller ); - +void ConfigureTextEditor(ControllerPtr controller); /** * @brief Creates one FontDescriptionRun then add it to FontDescription list. @@ -114,17 +113,17 @@ void ConfigureTextEditor( ControllerPtr controller ); * @return vector contains one FontDescriptionRun. */ Vector CreateSingleFontDescription( - const CharacterRun& characterRun, - const std::string fontFamilyName, - const FontWeight weight, - const FontWidth width, - const FontSlant slant, - const PointSize26Dot6 size, - const bool familyDefined, - const bool weightDefined, - const bool widthDefined, - const bool slantDefined, - const bool sizeDefined); + const CharacterRun& characterRun, + const std::string fontFamilyName, + const FontWeight weight, + const FontWidth width, + const FontSlant slant, + const PointSize26Dot6 size, + const bool familyDefined, + const bool weightDefined, + const bool widthDefined, + const bool slantDefined, + const bool sizeDefined); } // namespace Text diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp index 9f1d5da..a20c4bb 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,15 +15,15 @@ * */ -#include #include +#include -#include +#include +#include #include #include #include -#include -#include +#include #include using namespace Dali; @@ -54,7 +54,6 @@ using namespace Text; namespace { - struct SetBidirectionalInfoData { std::string description; ///< Description of the test. @@ -93,66 +92,68 @@ struct GetCharactersDirectionData bool markupProcessorEnabled; ///< Enable markup processor to use markup text. }; -bool SetBidirectionalInfoTest( const SetBidirectionalInfoData& data ) +bool SetBidirectionalInfoTest(const SetBidirectionalInfoData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; // Create the model. const Vector fontDescriptions; - const LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptions, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptions, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; // 2) Clear the bidirectional paragraph info data. Vector& bidirectionalInfo = logicalModel->mBidirectionalParagraphInfo; - if( 0u != data.numberOfCharacters ) + if(0u != data.numberOfCharacters) { - ClearCharacterRuns( data.startIndex, - data.startIndex + data.numberOfCharacters - 1u, - bidirectionalInfo ); + ClearCharacterRuns(data.startIndex, + data.startIndex + data.numberOfCharacters - 1u, + bidirectionalInfo); } // 3) Call the SetBidirectionalInfo() function. - SetBidirectionalInfo( logicalModel->mText, - logicalModel->mScriptRuns, - logicalModel->mLineBreakInfo, - data.startIndex, - data.numberOfCharacters, - bidirectionalInfo ); + SetBidirectionalInfo(logicalModel->mText, + logicalModel->mScriptRuns, + logicalModel->mLineBreakInfo, + data.startIndex, + data.numberOfCharacters, + bidirectionalInfo); // 4) Compare with the expected results. TextAbstraction::BidirectionalSupport bidirectionalSupport = TextAbstraction::BidirectionalSupport::Get(); - if( data.numberOfParagraphs != bidirectionalInfo.Count() ) + if(data.numberOfParagraphs != bidirectionalInfo.Count()) { // Different number of expected bidirectional paragraphs. std::cout << " Different number of bidi paragraphs : " << bidirectionalInfo.Count() << ", expected : " << data.numberOfParagraphs << std::endl; return false; } - for( unsigned int index = 0u; index < data.numberOfParagraphs; ++index ) + for(unsigned int index = 0u; index < data.numberOfParagraphs; ++index) { const BidirectionalParagraphInfoRun& run = bidirectionalInfo[index]; - const CharacterDirection direction = bidirectionalSupport.GetParagraphDirection( run.bidirectionalInfoIndex ); - if( direction != data.directions[index] ) + const CharacterDirection direction = bidirectionalSupport.GetParagraphDirection(run.bidirectionalInfoIndex); + if(direction != data.directions[index]) { std::cout << " Different direction" << std::endl; std::cout << " paragraph : " << index << std::endl; @@ -161,7 +162,7 @@ bool SetBidirectionalInfoTest( const SetBidirectionalInfoData& data ) return false; } - if( run.characterRun.characterIndex != data.indices[index] ) + if(run.characterRun.characterIndex != data.indices[index]) { std::cout << " Different index" << std::endl; std::cout << " paragraph : " << index << std::endl; @@ -169,7 +170,7 @@ bool SetBidirectionalInfoTest( const SetBidirectionalInfoData& data ) std::cout << " expected, index : " << data.indices[index] << ", num chars : " << data.numberOfParagraphCharacters[index] << ", direction : " << data.directions[index] << std::endl; return false; } - if( run.characterRun.numberOfCharacters != data.numberOfParagraphCharacters[index] ) + if(run.characterRun.numberOfCharacters != data.numberOfParagraphCharacters[index]) { std::cout << " Different number of characters" << std::endl; std::cout << " paragraph : " << index << std::endl; @@ -182,60 +183,62 @@ bool SetBidirectionalInfoTest( const SetBidirectionalInfoData& data ) return true; } -bool GetMirroredTextTest( const GetMirroredTextData& data ) +bool GetMirroredTextTest(const GetMirroredTextData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; // Create the model. const Vector fontDescriptions; - const LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptions, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptions, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; // 2) Call the GetMirroredText() function for the whole text Vector mirroredText; - bool mirrored = false; - mirrored = GetMirroredText( logicalModel->mText, - logicalModel->mCharacterDirections, - logicalModel->mBidirectionalParagraphInfo, - 0u, - logicalModel->mText.Count(), - mirroredText ); + bool mirrored = false; + mirrored = GetMirroredText(logicalModel->mText, + logicalModel->mCharacterDirections, + logicalModel->mBidirectionalParagraphInfo, + 0u, + logicalModel->mText.Count(), + mirroredText); // 3) Call the GetMirroredText() function for the given index + number of characters - mirrored = GetMirroredText( logicalModel->mText, - logicalModel->mCharacterDirections, - logicalModel->mBidirectionalParagraphInfo, - data.startIndex, - data.numberOfCharacters, - mirroredText ); + mirrored = GetMirroredText(logicalModel->mText, + logicalModel->mCharacterDirections, + logicalModel->mBidirectionalParagraphInfo, + data.startIndex, + data.numberOfCharacters, + mirroredText); // 4) Compare the results. // Convert to utf8 std::string mirroredString; - Utf32ToUtf8( mirroredText.Begin(), - mirroredText.Count(), - mirroredString ); + Utf32ToUtf8(mirroredText.Begin(), + mirroredText.Count(), + mirroredString); - if( !mirrored && ( mirroredString != data.text ) ) + if(!mirrored && (mirroredString != data.text)) { std::cout << " No mirrored text and mirroredString != data.text." << std::endl; std::cout << " mirrored string : [" << mirroredString << "]" << std::endl; @@ -243,7 +246,7 @@ bool GetMirroredTextTest( const GetMirroredTextData& data ) return false; } - if( mirrored && ( mirroredString == data.text ) ) + if(mirrored && (mirroredString == data.text)) { std::cout << " Mirrored text and mirroredString == data.text." << std::endl; std::cout << " mirrored string : [" << mirroredString << "]" << std::endl; @@ -251,7 +254,7 @@ bool GetMirroredTextTest( const GetMirroredTextData& data ) return false; } - if( mirrored && ( mirroredString != data.mirroredText ) ) + if(mirrored && (mirroredString != data.mirroredText)) { std::cout << " Mirrored text and mirroredString != data.mirroredText." << std::endl; std::cout << " mirrored string : [" << mirroredString << "]" << std::endl; @@ -262,55 +265,57 @@ bool GetMirroredTextTest( const GetMirroredTextData& data ) return true; } -bool GetCharactersDirectionTest( const GetCharactersDirectionData& data ) +bool GetCharactersDirectionTest(const GetCharactersDirectionData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; // Create the model. const Vector fontDescriptions; - const LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptions, - options, - layoutSize, - textModel, - metrics, - data.markupProcessorEnabled, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptions, + options, + layoutSize, + textModel, + metrics, + data.markupProcessorEnabled, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; Vector& bidirectionalInfo = logicalModel->mBidirectionalParagraphInfo; // 2) Clear the direction info data. Vector& directions = logicalModel->mCharacterDirections; - if( directions.Count() >= data.startIndex + data.numberOfCharacters ) + if(directions.Count() >= data.startIndex + data.numberOfCharacters) { - directions.Erase( directions.Begin() + data.startIndex, - directions.Begin() + data.startIndex + data.numberOfCharacters ); + directions.Erase(directions.Begin() + data.startIndex, + directions.Begin() + data.startIndex + data.numberOfCharacters); } // 3) Call GetCharactersDirection() function. - GetCharactersDirection( bidirectionalInfo, - logicalModel->mText.Count(), - data.startIndex, - data.numberOfCharacters, - directions ); + GetCharactersDirection(bidirectionalInfo, + logicalModel->mText.Count(), + data.startIndex, + data.numberOfCharacters, + directions); - for( unsigned int index = 0u; index < logicalModel->mText.Count(); ++index ) + for(unsigned int index = 0u; index < logicalModel->mText.Count(); ++index) { - if( data.directions[index] != directions[index] ) + if(data.directions[index] != directions[index]) { return false; } @@ -327,140 +332,129 @@ int UtcDaliSetBidirectionalInfo(void) { tet_infoline(" UtcDaliSetBidirectionalInfo"); - unsigned int indices01[] = {}; + unsigned int indices01[] = {}; unsigned int numberOfCharacters01[] = {}; - bool direction01[] = {}; - unsigned int indices02[] = {}; + bool direction01[] = {}; + unsigned int indices02[] = {}; unsigned int numberOfCharacters02[] = {}; - bool direction02[] = {}; - unsigned int indices03[] = { 17u, 48u }; - unsigned int numberOfCharacters03[] = { 14u, 14u }; - bool direction03[] = { true, true }; - unsigned int indices04[] = { 17u, 31u, 79u }; - unsigned int numberOfCharacters04[] = { 14u, 48u, 31u }; - bool direction04[] = { true, false, true }; - unsigned int indices05[] = { 17u, 41u, 117u }; - unsigned int numberOfCharacters05[] = { 24u, 76u, 49u }; - bool direction05[] = { true, false, true }; - unsigned int indices06[] = { 17u, 48u }; - unsigned int numberOfCharacters06[] = { 14u, 14u }; - bool direction06[] = { true, true }; - unsigned int indices07[] = { 17u, 31u, 79u }; - unsigned int numberOfCharacters07[] = { 14u, 48u, 31u }; - bool direction07[] = { true, false, true }; - unsigned int indices08[] = { 17u, 41u, 117u }; - unsigned int numberOfCharacters08[] = { 24u, 76u, 49u }; - bool direction08[] = { true, false, true }; + bool direction02[] = {}; + unsigned int indices03[] = {17u, 48u}; + unsigned int numberOfCharacters03[] = {14u, 14u}; + bool direction03[] = {true, true}; + unsigned int indices04[] = {17u, 31u, 79u}; + unsigned int numberOfCharacters04[] = {14u, 48u, 31u}; + bool direction04[] = {true, false, true}; + unsigned int indices05[] = {17u, 41u, 117u}; + unsigned int numberOfCharacters05[] = {24u, 76u, 49u}; + bool direction05[] = {true, false, true}; + unsigned int indices06[] = {17u, 48u}; + unsigned int numberOfCharacters06[] = {14u, 14u}; + bool direction06[] = {true, true}; + unsigned int indices07[] = {17u, 31u, 79u}; + unsigned int numberOfCharacters07[] = {14u, 48u, 31u}; + bool direction07[] = {true, false, true}; + unsigned int indices08[] = {17u, 41u, 117u}; + unsigned int numberOfCharacters08[] = {24u, 76u, 49u}; + bool direction08[] = {true, false, true}; struct SetBidirectionalInfoData data[] = - { { - "Zero characters", - "", - 0u, - 0u, - 0u, - indices01, - numberOfCharacters01, - direction01 - }, - { - "Some left to right paragraphs", - "Hello world\ndemo\n\n", - 0u, - 18u, - 0u, - indices02, - numberOfCharacters02, - direction02 - }, - { - "A mix of left to right and right to left paragraphs.", - "Hello world demo\nمرحبا بالعالم\nhello world demo\nمرحبا بالعالم\nhello world demo", - 0u, - 78u, - 2u, - indices03, - numberOfCharacters03, - direction03 - }, - { - "A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text.", - "Hello world demo\nمرحبا بالعالم\nhello world demo مرحبا بالعالم hello world demo\nمرحبا hello world demo بالعالم\nhello world demo", - 0u, - 126u, - 3u, - indices04, - numberOfCharacters04, - direction04 - }, - { - "A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts.", - "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", - 0u, - 182u, - 3u, - indices05, - numberOfCharacters05, - direction05 - }, - { - "A mix of left to right and right to left paragraphs. Updates a left to right paragraph.", - "Hello world demo\nمرحبا بالعالم\nhello world demo\nمرحبا بالعالم\nhello world demo", - 31u, - 17u, - 2u, - indices06, - numberOfCharacters06, - direction06 - }, - { - "A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text.", - "Hello world demo\nمرحبا بالعالم\nhello world demo مرحبا بالعالم hello world demo\nمرحبا hello world demo بالعالم\nhello world demo", - 0u, - 126u, - 3u, - indices07, - numberOfCharacters07, - direction07 - }, - { - "A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts. Updates initial paragraphs.", - "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", - 0u, - 41u, - 3u, - indices08, - numberOfCharacters08, - direction08 - }, - { - "A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts. Updates mid paragraphs.", - "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", - 41u, - 76u, - 3u, - indices08, - numberOfCharacters08, - direction08 - }, - { - "A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts. Updates from character 85", - "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", - 117u, - 65u, - 3u, - indices08, - numberOfCharacters08, - direction08 - }, - }; + {"Zero characters", + "", + 0u, + 0u, + 0u, + indices01, + numberOfCharacters01, + direction01}, + + {"Some left to right paragraphs", + "Hello world\ndemo\n\n", + 0u, + 18u, + 0u, + indices02, + numberOfCharacters02, + direction02}, + + {"A mix of left to right and right to left paragraphs.", + "Hello world demo\nمرحبا بالعالم\nhello world demo\nمرحبا بالعالم\nhello world demo", + 0u, + 78u, + 2u, + indices03, + numberOfCharacters03, + direction03}, + + {"A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text.", + "Hello world demo\nمرحبا بالعالم\nhello world demo مرحبا بالعالم hello world demo\nمرحبا hello world demo بالعالم\nhello world demo", + 0u, + 126u, + 3u, + indices04, + numberOfCharacters04, + direction04}, + + {"A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts.", + "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", + 0u, + 182u, + 3u, + indices05, + numberOfCharacters05, + direction05}, + + {"A mix of left to right and right to left paragraphs. Updates a left to right paragraph.", + "Hello world demo\nمرحبا بالعالم\nhello world demo\nمرحبا بالعالم\nhello world demo", + 31u, + 17u, + 2u, + indices06, + numberOfCharacters06, + direction06}, + + {"A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text.", + "Hello world demo\nمرحبا بالعالم\nhello world demo مرحبا بالعالم hello world demo\nمرحبا hello world demo بالعالم\nhello world demo", + 0u, + 126u, + 3u, + indices07, + numberOfCharacters07, + direction07}, + + {"A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts. Updates initial paragraphs.", + "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", + 0u, + 41u, + 3u, + indices08, + numberOfCharacters08, + direction08}, + + {"A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts. Updates mid paragraphs.", + "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", + 41u, + 76u, + 3u, + indices08, + numberOfCharacters08, + direction08}, + + {"A mix of left to right and right to left paragraphs. Paragraphs also contain a mix of bidirectional text and a mix of right to left scripts. Updates from character 85", + "Hello world demo\nمرحبا שלום עולם بالعالم\nhello world שלום بالعالم עולם demo مرحبا שלום עולם بالعالم hello world demo\nمرحبا hello שלום بالعالم עולם world demo بالعالم\nhello world demo", + 117u, + 65u, + 3u, + indices08, + numberOfCharacters08, + direction08}, + }; const unsigned int numberOfTests = 10u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !SetBidirectionalInfoTest( data[index] ) ) + if(!SetBidirectionalInfoTest(data[index])) { tet_result(TET_FAIL); } @@ -475,76 +469,67 @@ int UtcDaliGetMirroredText(void) tet_infoline(" UtcDaliGetMirroredText"); struct GetMirroredTextData data[] = - { { - "Zero characters.", - "", - 0u, - 0u, - "" - }, - { - "Left to right characters only.", - "Hello world\nhello world demo.", - 0u, - 29u, - "Hello world\nhello world demo." - }, - { - "Right to left characters but with no characters to mirror.", - "שלום עולם\nمرحبا بالعالم", - 0u, - 23u, - "שלום עולם\nمرحبا بالعالم" - }, - { - "Right to left characters with some characters to mirror.", - "שלום עולם\n(مرحبا بالعالم)", - 0u, - 25u, - "שלום עולם\n)مرحبا بالعالم(" - }, - { - "Right to left characters with some characters to mirror. Update last paragraph.", - "שלום עולם\n(مرحبا بالعالم)", - 10u, - 15u, - "שלום עולם\n)مرحبا بالعالم(" - }, - { - "Mix of bidirectional text. With more paragraphs.", - "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)", - 0u, - 239u, - "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום( עולם\nשלום مرحبا بالعالم עולם )hello( مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום )hello) world demo )עולם(\nשלום )مرحبا بالعالم עולם( )hello(" - }, - { - "Mix of bidirectional text. With more paragraphs. Update middle paragraphs.", - "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)", - 29u, - 38u, - "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום( עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)" - }, - { - "Mix of bidirectional text. With more paragraphs. Update middle paragraphs (2).", - "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)", - 67u, - 100u, - "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם )hello( مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)" - }, - }; + {"Zero characters.", + "", + 0u, + 0u, + ""}, + + {"Left to right characters only.", + "Hello world\nhello world demo.", + 0u, + 29u, + "Hello world\nhello world demo."}, + + {"Right to left characters but with no characters to mirror.", + "שלום עולם\nمرحبا بالعالم", + 0u, + 23u, + "שלום עולם\nمرحبا بالعالم"}, + + {"Right to left characters with some characters to mirror.", + "שלום עולם\n(مرحبا بالعالم)", + 0u, + 25u, + "שלום עולם\n)مرحبا بالعالم("}, + + {"Right to left characters with some characters to mirror. Update last paragraph.", + "שלום עולם\n(مرحبا بالعالم)", + 10u, + 15u, + "שלום עולם\n)مرحبا بالعالم("}, + + {"Mix of bidirectional text. With more paragraphs.", + "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)", + 0u, + 239u, + "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום( עולם\nשלום مرحبا بالعالم עולם )hello( مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום )hello) world demo )עולם(\nשלום )مرحبا بالعالم עולם( )hello("}, + + {"Mix of bidirectional text. With more paragraphs. Update middle paragraphs.", + "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)", + 29u, + 38u, + "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום( עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)"}, + + {"Mix of bidirectional text. With more paragraphs. Update middle paragraphs (2).", + "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם (hello) مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)", + 67u, + 100u, + "Hello world demo\nhello world\nhello world (مرحبا بالعالم שלום) עולם\nשלום مرحبا بالعالم עולם )hello( مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום (hello) world demo (עולם)\nשלום (مرحبا بالعالم עולם) (hello)"}, + }; const unsigned int numberOfTests = 8u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !GetMirroredTextTest( data[index] ) ) + if(!GetMirroredTextTest(data[index])) { tet_result(TET_FAIL); } @@ -560,134 +545,92 @@ int UtcDaliGetCharactersDirection(void) bool directions01[] = {}; bool directions02[] = { - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false }; + false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}; bool directions03[] = { - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true }; + true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true}; bool directions04[] = { - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, true, true, true, true, true, true, - true, true, true, false, true, true, true, true, true, true, - true, true, true, true, false, false, false, false, false, false, - false, false, false, false, false }; + false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false}; bool directions05[] = { - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, false, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, false, - false, false, false, false, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, false, - false, false, false, false, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, false, - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, false, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, false, false, false, false, - false, false, false, false, false, false, false, false, false, false, - false, false, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, true, true, true, true, true, true, true, true, - true, true, false, false, false, false, false }; - - bool directions06[] = { - true, true, true, true, true, true, true, true, true, true, - false, false, false, false, false, false, false, false, false, false, - false, false, false, false, false, false }; + false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, false, false, false, false, false}; + + bool directions06[] = { + true, true, true, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false, false}; struct GetCharactersDirectionData data[] = - { - { - "Zero characters", - "", - 0u, - 0u, - directions01, - false - }, { - "Left to right characters only", - "Hello world\nhello world demo", - 0u, - 28u, - directions02, - false - }, - { - "Right to left characters only", - "שלום עולם\nשלום עולם", - 0u, - 19u, - directions03, - false - }, - { - "Mix of bidirectional text", - "Hello world\nhello world שלום עולם\nשלום עולם hello world", - 0u, - 55u, - directions04, - false - }, - { - "Mix of bidirectional text. With more paragraphs.", - "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", - 0u, - 227u, - directions05, - false - }, - { - "Mix of bidirectional text. With more paragraphs. Update first paragraph.", - "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", - 0u, - 17u, - directions05, - false - }, - { - "Mix of bidirectional text. With more paragraphs. Update from character 29", - "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", - 29u, - 134u, - directions05, - false - }, - { - "Mix of bidirectional text. With more paragraphs. Update from character 163", - "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" - " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", - 163u, - 35u, - directions05, - false - }, - { - "Mix of bidirectional text. With brackets and LRM", - "שלום עולם ‎(hello)[world]‎", - 0u, - 26u, - directions06, - true - } - }; + {"Zero characters", + "", + 0u, + 0u, + directions01, + false}, + + {"Left to right characters only", + "Hello world\nhello world demo", + 0u, + 28u, + directions02, + false}, + + {"Right to left characters only", + "שלום עולם\nשלום עולם", + 0u, + 19u, + directions03, + false}, + + {"Mix of bidirectional text", + "Hello world\nhello world שלום עולם\nשלום עולם hello world", + 0u, + 55u, + directions04, + false}, + + {"Mix of bidirectional text. With more paragraphs.", + "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", + 0u, + 227u, + directions05, + false}, + + {"Mix of bidirectional text. With more paragraphs. Update first paragraph.", + "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", + 0u, + 17u, + directions05, + false}, + + {"Mix of bidirectional text. With more paragraphs. Update from character 29", + "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", + 29u, + 134u, + directions05, + false}, + + {"Mix of bidirectional text. With more paragraphs. Update from character 163", + "Hello world demo\nhello world\nhello world مرحبا بالعالم שלום עולם\nשלום مرحبا بالعالم עולם hello مرحبا بالعالم world" + " مرحبا بالعالم שלום עולם hello world hello world\nبالعالم שלום hello world demo עולם\nשלום مرحبا بالعالم עולם hello", + 163u, + 35u, + directions05, + false}, + + {"Mix of bidirectional text. With brackets and LRM", + "שלום עולם ‎(hello)[world]‎", + 0u, + 26u, + directions06, + true}}; + const unsigned int numberOfTests = 9u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !GetCharactersDirectionTest( data[index] ) ) + if(!GetCharactersDirectionTest(data[index])) { tet_result(TET_FAIL); } diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-LogicalModel.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-LogicalModel.cpp index 8b15ad3..ca775c0 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-LogicalModel.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-LogicalModel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,16 +15,15 @@ * */ -#include #include #include +#include #include -#include #include +#include #include - using namespace Dali; using namespace Toolkit; using namespace Text; @@ -44,7 +43,7 @@ using namespace Text; namespace { -const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); +const std::string DEFAULT_FONT_DIR("/resources/fonts"); struct CreateParagraphData { @@ -79,12 +78,12 @@ struct FetchBidirectionalLineInfoData struct GetLogicalCharacterIndexData { - std::string description; ///< Description of the test. - std::string text; ///< Input text. - Size textArea; ///< The text area. - unsigned int numberOfIndices; ///< The number of characters to set. - unsigned int* visualToLogical; ///< The expected visual to logical conversion table. - unsigned int* cachedBidiLine; ///< The cached bidi line index for each character. + std::string description; ///< Description of the test. + std::string text; ///< Input text. + Size textArea; ///< The text area. + unsigned int numberOfIndices; ///< The number of characters to set. + unsigned int* visualToLogical; ///< The expected visual to logical conversion table. + unsigned int* cachedBidiLine; ///< The cached bidi line index for each character. }; struct GetLogicalCursorIndexData @@ -101,63 +100,65 @@ struct GetLogicalCursorIndexData unsigned int* cachedBidiLine; ///< The cached bidi line index for each character. }; -bool CreateParagraphTest( const CreateParagraphData& data ) +bool CreateParagraphTest(const CreateParagraphData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; Vector fontDescriptionRuns; - LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; // 2) Clear the paragraphs. Vector& paragraphs = logicalModel->mParagraphInfo; - ClearCharacterRuns( data.index, - data.index + data.numberOfCharacters - 1u, - paragraphs ); + ClearCharacterRuns(data.index, + data.index + data.numberOfCharacters - 1u, + paragraphs); // 3) Call the LogicalModel::CreateParagraphInfo() method - logicalModel->CreateParagraphInfo( data.index, - data.numberOfCharacters ); + logicalModel->CreateParagraphInfo(data.index, + data.numberOfCharacters); // 4) Compare the results. - if( data.numberOfParagraphs != paragraphs.Count() ) + if(data.numberOfParagraphs != paragraphs.Count()) { std::cout << " Different number of paragraphs : " << paragraphs.Count() << ", expected : " << data.numberOfParagraphs << std::endl; return false; } unsigned int index = 0u; - for( Vector::ConstIterator it = paragraphs.Begin(), - endIt = paragraphs.End(); - it != endIt; - ++it, ++index ) + for(Vector::ConstIterator it = paragraphs.Begin(), + endIt = paragraphs.End(); + it != endIt; + ++it, ++index) { - const ParagraphRun& paragraph( *it ); + const ParagraphRun& paragraph(*it); - if( data.indices[index] != paragraph.characterRun.characterIndex ) + if(data.indices[index] != paragraph.characterRun.characterIndex) { std::cout << " Different character index for paragraph : " << index << ", " << paragraph.characterRun.characterIndex << ", expected : " << data.indices[index] << std::endl; return false; } - if( data.numberOfCharactersPerParagraph[index] != paragraph.characterRun.numberOfCharacters ) + if(data.numberOfCharactersPerParagraph[index] != paragraph.characterRun.numberOfCharacters) { std::cout << " Different number of characters for paragraph : " << index << ", " << paragraph.characterRun.numberOfCharacters << ", expected : " << data.numberOfCharactersPerParagraph[index] << std::endl; return false; @@ -167,51 +168,53 @@ bool CreateParagraphTest( const CreateParagraphData& data ) return true; } -bool FindParagraphTest( const FindParagraphData& data ) +bool FindParagraphTest(const FindParagraphData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; Vector fontDescriptionRuns; - LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; // 2) Find the paragraphs. Vector paragraphs; - logicalModel->FindParagraphs( data.index, data.numberOfCharacters, paragraphs ); + logicalModel->FindParagraphs(data.index, data.numberOfCharacters, paragraphs); // 3) compare the results. - if( data.numberOfParagraphs != paragraphs.Count() ) + if(data.numberOfParagraphs != paragraphs.Count()) { return false; } unsigned int index = 0u; - for( Vector::ConstIterator it = paragraphs.Begin(), - endIt = paragraphs.End(); - it != endIt; - ++it, ++index ) + for(Vector::ConstIterator it = paragraphs.Begin(), + endIt = paragraphs.End(); + it != endIt; + ++it, ++index) { const ParagraphRunIndex paragraphIndex = *it; - if( paragraphIndex != data.paragraphs[index] ) + if(paragraphIndex != data.paragraphs[index]) { return false; } @@ -220,47 +223,49 @@ bool FindParagraphTest( const FindParagraphData& data ) return true; } -bool FetchBidirectionalLineInfoTest( const FetchBidirectionalLineInfoData& data ) +bool FetchBidirectionalLineInfoTest(const FetchBidirectionalLineInfoData& data) { std::cout << " testing : " << data.description << std::endl; // Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea( 100.f, 300.f ); - Size layoutSize; + Size textArea(100.f, 300.f); + Size layoutSize; // Create the model with the whole text. const Vector fontDescriptions; - const LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptions, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptions, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - for( unsigned int index = 0; index < data.numberOfTests; ++index ) + for(unsigned int index = 0; index < data.numberOfTests; ++index) { - const bool fetched = logicalModel->FetchBidirectionalLineInfo( data.characterIndex[index] ); + const bool fetched = logicalModel->FetchBidirectionalLineInfo(data.characterIndex[index]); - if( fetched != data.fetched[index] ) + if(fetched != data.fetched[index]) { std::cout << " Different fetched result : " << fetched << ", expected : " << data.fetched[index] << std::endl; return false; } - if( fetched ) + if(fetched) { - if( logicalModel->mBidirectionalLineIndex != data.bidiLineIndex[index] ) + if(logicalModel->mBidirectionalLineIndex != data.bidiLineIndex[index]) { std::cout << " Different bidi line index : " << logicalModel->mBidirectionalLineIndex << ", expected : " << data.bidiLineIndex << std::endl; return false; @@ -271,46 +276,48 @@ bool FetchBidirectionalLineInfoTest( const FetchBidirectionalLineInfoData& data return true; } -bool GetLogicalCharacterIndexTest( const GetLogicalCharacterIndexData& data ) +bool GetLogicalCharacterIndexTest(const GetLogicalCharacterIndexData& data) { std::cout << " testing : " << data.description << std::endl; // Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size layoutSize; + Size layoutSize; // Create the model with the whole text. const Vector fontDescriptions; - const LayoutOptions options; - CreateTextModel( data.text, - data.textArea, - fontDescriptions, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + CreateTextModel(data.text, + data.textArea, + fontDescriptions, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - for( unsigned int index = 0u; index < data.numberOfIndices; ++index ) + for(unsigned int index = 0u; index < data.numberOfIndices; ++index) { // Check the current cached bidi line index. (Check it before call the GetLogicalCharacterIndex() method ) - if( data.cachedBidiLine[index] != logicalModel->mBidirectionalLineIndex ) + if(data.cachedBidiLine[index] != logicalModel->mBidirectionalLineIndex) { std::cout << " index : " << index << ", different cached bidi index : " << logicalModel->mBidirectionalLineIndex << ", expected : " << data.cachedBidiLine[index] << std::endl; return false; } - const bool fetched = logicalModel->FetchBidirectionalLineInfo( index ); - const Character logicalIndex = fetched ? logicalModel->GetLogicalCharacterIndex( index ) : index; + const bool fetched = logicalModel->FetchBidirectionalLineInfo(index); + const Character logicalIndex = fetched ? logicalModel->GetLogicalCharacterIndex(index) : index; - if( data.visualToLogical[index] != logicalIndex ) + if(data.visualToLogical[index] != logicalIndex) { std::cout << " visual index : " << index << ", different logical index : " << logicalIndex << ", expected : " << data.visualToLogical[index] << std::endl; return false; @@ -319,70 +326,72 @@ bool GetLogicalCharacterIndexTest( const GetLogicalCharacterIndexData& data ) return true; } -bool GetLogicalCursorIndexTest( const GetLogicalCursorIndexData& data ) +bool GetLogicalCursorIndexTest(const GetLogicalCursorIndexData& data) { - tet_printf( " testing : %s\n", data.description.c_str() ); + tet_printf(" testing : %s\n", data.description.c_str()); // Load some fonts. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 96u, 96u ); + fontClient.SetDpi(96u, 96u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" ); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf"); // Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size layoutSize; + Size layoutSize; // Create the model with the whole text. Vector fontDescriptionRuns; - if( 0u != data.numberOfFonts ) + if(0u != data.numberOfFonts) { - fontDescriptionRuns.Insert( fontDescriptionRuns.End(), - data.fontDescriptions, - data.fontDescriptions + data.numberOfFonts ); + fontDescriptionRuns.Insert(fontDescriptionRuns.End(), + data.fontDescriptions, + data.fontDescriptions + data.numberOfFonts); } const LayoutOptions options; - CreateTextModel( data.text, - data.textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + CreateTextModel(data.text, + data.textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - for( unsigned int index = 0u; index < data.numberOfIndices; ++index ) + for(unsigned int index = 0u; index < data.numberOfIndices; ++index) { - const bool fetched = logicalModel->FetchBidirectionalLineInfo( data.characterIndex[index] ); - tet_printf(" fetched %d, line index %d, expected line index %d\n", fetched, logicalModel->mBidirectionalLineIndex, data.cachedBidiLine[index] ); + const bool fetched = logicalModel->FetchBidirectionalLineInfo(data.characterIndex[index]); + tet_printf(" fetched %d, line index %d, expected line index %d\n", fetched, logicalModel->mBidirectionalLineIndex, data.cachedBidiLine[index]); - if( logicalModel->mBidirectionalLineIndex != data.cachedBidiLine[index] ) + if(logicalModel->mBidirectionalLineIndex != data.cachedBidiLine[index]) { - tet_printf( " test : %d, different cached line index : %d, expected : %d\n", index, logicalModel->mBidirectionalLineIndex, data.cachedBidiLine[index] ); + tet_printf(" test : %d, different cached line index : %d, expected : %d\n", index, logicalModel->mBidirectionalLineIndex, data.cachedBidiLine[index]); return false; } const CharacterIndex visualCharacterIndex = data.visualCursorIndex[index]; - const CharacterIndex logicalCursorIndex = fetched ? logicalModel->GetLogicalCursorIndex( visualCharacterIndex ) : visualCharacterIndex; + const CharacterIndex logicalCursorIndex = fetched ? logicalModel->GetLogicalCursorIndex(visualCharacterIndex) : visualCharacterIndex; tet_printf(" visual index %d, logical index %d\n", visualCharacterIndex, logicalCursorIndex); - if( logicalCursorIndex != data.logicalCursorIndex[index] ) + if(logicalCursorIndex != data.logicalCursorIndex[index]) { - tet_printf( " test : %d, visual index : %d, different logical cursor index :%d, expected : %d\n", index, visualCharacterIndex, logicalCursorIndex, data.logicalCursorIndex[index] ); + tet_printf(" test : %d, visual index : %d, different logical cursor index :%d, expected : %d\n", index, visualCharacterIndex, logicalCursorIndex, data.logicalCursorIndex[index]); return false; } } @@ -406,67 +415,67 @@ int UtcDaliCreateParagraph(void) { tet_infoline(" UtcDaliCreateParagraph"); - unsigned int paragraphsIndices01[] = { 0u }; - unsigned int paragraphsNumberOfCharacters01[] = { 0u }; - unsigned int paragraphsIndices02[] = { 0u, 12u, 17u }; - unsigned int paragraphsNumberOfCharacters02[] = { 12u, 5u, 1u }; - unsigned int paragraphsIndices03[] = { 0u, 12u, 17u, 34u }; - unsigned int paragraphsNumberOfCharacters03[] = { 12u, 5u, 17u ,1u }; + unsigned int paragraphsIndices01[] = {0u}; + unsigned int paragraphsNumberOfCharacters01[] = {0u}; + unsigned int paragraphsIndices02[] = {0u, 12u, 17u}; + unsigned int paragraphsNumberOfCharacters02[] = {12u, 5u, 1u}; + unsigned int paragraphsIndices03[] = {0u, 12u, 17u, 34u}; + unsigned int paragraphsNumberOfCharacters03[] = {12u, 5u, 17u, 1u}; struct CreateParagraphData data[] = - { - { - "Zero characters", - "", - 0u, - 0u, - 0u, - paragraphsIndices01, - paragraphsNumberOfCharacters01, - }, { - "Some paragraphs", - "Hello world\ndemo\n\n", - 0u, - 18u, - 3u, - paragraphsIndices02, - paragraphsNumberOfCharacters02, - }, - { - "Some paragraphs. Update the initial paragraphs.", - "Hello world\ndemo\nhello world demo\n\n", - 0u, - 17u, - 4u, - paragraphsIndices03, - paragraphsNumberOfCharacters03, - }, - { - "Some paragraphs. Update the mid paragraphs.", - "Hello world\ndemo\nhello world demo\n\n", - 12u, - 5u, - 4u, - paragraphsIndices03, - paragraphsNumberOfCharacters03, - }, - { - "Some paragraphs. Update the final paragraphs.", - "Hello world\ndemo\nhello world demo\n\n", - 17u, - 18u, - 4u, - paragraphsIndices03, - paragraphsNumberOfCharacters03, - }, - }; + { + "Zero characters", + "", + 0u, + 0u, + 0u, + paragraphsIndices01, + paragraphsNumberOfCharacters01, + }, + { + "Some paragraphs", + "Hello world\ndemo\n\n", + 0u, + 18u, + 3u, + paragraphsIndices02, + paragraphsNumberOfCharacters02, + }, + { + "Some paragraphs. Update the initial paragraphs.", + "Hello world\ndemo\nhello world demo\n\n", + 0u, + 17u, + 4u, + paragraphsIndices03, + paragraphsNumberOfCharacters03, + }, + { + "Some paragraphs. Update the mid paragraphs.", + "Hello world\ndemo\nhello world demo\n\n", + 12u, + 5u, + 4u, + paragraphsIndices03, + paragraphsNumberOfCharacters03, + }, + { + "Some paragraphs. Update the final paragraphs.", + "Hello world\ndemo\nhello world demo\n\n", + 17u, + 18u, + 4u, + paragraphsIndices03, + paragraphsNumberOfCharacters03, + }, + }; const unsigned int numberOfTests = 5u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !CreateParagraphTest( data[index] ) ) + if(!CreateParagraphTest(data[index])) { tet_result(TET_FAIL); } @@ -481,60 +490,52 @@ int UtcDaliFindParagraph(void) tet_infoline(" UtcDaliFindParagraph"); unsigned int paragraphs01[] = {}; - unsigned int paragraphs02[] = { 0u, 1u, 2u }; - unsigned int paragraphs03[] = { 0u }; - unsigned int paragraphs04[] = { 1u }; - unsigned int paragraphs05[] = { 0u, 1u, 2u }; + unsigned int paragraphs02[] = {0u, 1u, 2u}; + unsigned int paragraphs03[] = {0u}; + unsigned int paragraphs04[] = {1u}; + unsigned int paragraphs05[] = {0u, 1u, 2u}; struct FindParagraphData data[] = - { - { - "Zero characters", - "", - 0u, - 100u, - 0u, - paragraphs01, - }, - { - "Some paragraphs", - "Hello world\ndemo\n\n", - 0u, - 18u, - 3u, - paragraphs02 - }, { - "Some paragraphs", - "Hello world\ndemo\n\n", - 0u, - 12u, - 1u, - paragraphs03 - }, - { - "Some paragraphs", - "Hello world\ndemo\n\n", - 12u, - 5u, - 1u, - paragraphs04 - }, - { - "Some paragraphs", - "Hello world\ndemo\n\n", - 3u, - 15u, - 3u, - paragraphs05 - }, - }; + { + "Zero characters", + "", + 0u, + 100u, + 0u, + paragraphs01, + }, + {"Some paragraphs", + "Hello world\ndemo\n\n", + 0u, + 18u, + 3u, + paragraphs02}, + {"Some paragraphs", + "Hello world\ndemo\n\n", + 0u, + 12u, + 1u, + paragraphs03}, + {"Some paragraphs", + "Hello world\ndemo\n\n", + 12u, + 5u, + 1u, + paragraphs04}, + {"Some paragraphs", + "Hello world\ndemo\n\n", + 3u, + 15u, + 3u, + paragraphs05}, + }; const unsigned int numberOfTests = 5u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !FindParagraphTest( data[index] ) ) + if(!FindParagraphTest(data[index])) { tet_result(TET_FAIL); } @@ -548,51 +549,44 @@ int UtcDaliFetchBidirectionalLineInfo(void) { tet_infoline(" UtcDaliFetchBidirectionalLineInfo"); - unsigned int logicalIndex01[] = { 0u }; - bool fetched01[] = { false }; - unsigned int bidiLine01[] = { 0u }; + unsigned int logicalIndex01[] = {0u}; + bool fetched01[] = {false}; + unsigned int bidiLine01[] = {0u}; - unsigned int logicalIndex02[] = { 3u }; - bool fetched02[] = { false }; - unsigned int bidiLine02[] = { 0u }; + unsigned int logicalIndex02[] = {3u}; + bool fetched02[] = {false}; + unsigned int bidiLine02[] = {0u}; - unsigned int logicalIndex03[] = { 0u, 11u, 12u, 21u, 22u, 33u, 34u, 43u, 44u, 54u}; - bool fetched03[] = { false, false, true, true, false, false, true, true, false, false }; - unsigned int bidiLine03[] = { 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 0u, 0u }; + unsigned int logicalIndex03[] = {0u, 11u, 12u, 21u, 22u, 33u, 34u, 43u, 44u, 54u}; + bool fetched03[] = {false, false, true, true, false, false, true, true, false, false}; + unsigned int bidiLine03[] = {0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 0u, 0u}; struct FetchBidirectionalLineInfoData data[] = - { - { - "Void text", - "", - 1u, - logicalIndex01, - fetched01, - bidiLine01 - }, { - "LTR text", - "Hello world", - 1u, - logicalIndex02, - fetched02, - bidiLine02 - }, - { - "Bidi text", - "Hello world\nשלום עולם\nhello world\nשלום עולם\nhello world", - 10u, - logicalIndex03, - fetched03, - bidiLine03 - } - }; + {"Void text", + "", + 1u, + logicalIndex01, + fetched01, + bidiLine01}, + {"LTR text", + "Hello world", + 1u, + logicalIndex02, + fetched02, + bidiLine02}, + {"Bidi text", + "Hello world\nשלום עולם\nhello world\nשלום עולם\nhello world", + 10u, + logicalIndex03, + fetched03, + bidiLine03}}; const unsigned int numberOfTests = 3u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !FetchBidirectionalLineInfoTest( data[index] ) ) + if(!FetchBidirectionalLineInfoTest(data[index])) { tet_result(TET_FAIL); } @@ -607,183 +601,159 @@ int UtcDaliGetLogicalCharacterIndex(void) tet_infoline(" UtcDaliSetVisualToLogicalMap"); unsigned int visualToLogical01[] = {}; - unsigned int cachedBidiLine01[] = {}; - unsigned int visualToLogical02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u }; - unsigned int cachedBidiLine02[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u }; - unsigned int visualToLogical03[] = { 12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u }; - unsigned int cachedBidiLine03[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u }; - - unsigned int visualToLogical04[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 25u, 24u, 23u, 22u, 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 81u, 80u, 79u, 78u, 77u, 76u, 75u, 74u, 73u, 72u, 71u, 70u, 69u, 68u, 67u, 66u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u, 43u, 42u, 41u, 40u, 95u, 94u, 93u, 92u, 91u, 90u, 89u, 88u, 87u, 86u, 85u, 84u, 83u, 82u, 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, 104u, 105u, 106u }; - unsigned int cachedBidiLine04[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u }; - -// size 300, 300 -// LO H e l l o _ w o r l d , _ م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ h e l l o _ w o r l d \n -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 -// VO H e l l o _ w o r l d , _ م ل ا ع ل ا ب _ ا ب Ø­ ر م , _ h e l l o _ w o r l d \n -// 0 1 2 3 4 5 6 7 8 9 10 11 12 25 24 23 22 21 20 19 18 17 16 15 14 13 26 27 28 29 30 31 32 33 34 35 36 37 38 39 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ h e l l o _ w o r l d , _ م ر Ø­ ب ا _ ب ا ل ع ا ل م \n -// 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 -// VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م _ , h e l l o _ w o r l d _ , م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 55 56 57 58 59 60 61 62 63 64 65 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n -// 82 83 84 85 86 87 88 89 90 91 92 93 94 95 -// VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 95 94 93 92 91 90 89 88 87 86 85 84 83 82 - - -// LO h e l l o _ w o r l d -// 96 97 98 99 100 101 102 103 104 105 106 -// VO h e l l o _ w o r l d -// 96 97 98 99 100 101 102 103 104 105 106 - - unsigned int visualToLogical05[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 25u, 24u, 23u, 22u, 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 67u, 66u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u, 43u, 42u, 41u, 40u, 81u, 80u, 79u, 78u, 77u, 76u, 75u, 74u, 73u, 72u, 71u, 70u, 69u, 68u, 95u, 94u, 93u, 92u, 91u, 90u, 89u, 88u, 87u, 86u, 85u, 84u, 83u, 82u, 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, 104u, 105u, 106u }; - unsigned int cachedBidiLine05[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u }; - -// size 300, 300 -// LO H e l l o _ w o r l d , _ م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ -// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 -// VO H e l l o _ w o r l d , _ م ل ا ع ل ا ب _ ا ب Ø­ ر م , _ -// 0 1 2 3 4 5 6 7 8 9 10 11 12 25 24 23 22 21 20 19 18 17 16 15 14 13 26 27 - -// LO h e l l o _ w o r l d \n -// 28 29 30 31 32 33 34 35 36 37 38 39 -// VO h e l l o _ w o r l d \n -// 28 29 30 31 32 33 34 35 36 37 38 39 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ h e l l o _ w o r l d , _ -// 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 -// VO _ , h e l l o _ w o r l d _ , م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 67 66 55 56 57 58 59 60 61 62 63 64 65 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n -// 68 69 70 71 72 73 74 75 76 77 78 79 80 81 -// VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 81 80 79 78 77 76 75 74 73 72 71 70 69 68 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n -// 82 83 84 85 86 87 88 89 90 91 92 93 94 95 -// VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 95 94 93 92 91 90 89 88 87 86 85 84 83 82 - - -// LO h e l l o _ w o r l d -// 96 97 98 99 100 101 102 103 104 105 106 -// VO h e l l o _ w o r l d -// 96 97 98 99 100 101 102 103 104 105 106 - - unsigned int visualToLogical06[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 25u, 24u, 23u, 22u, 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u, 43u, 42u, 41u, 40u, 67u, 66u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 81u, 80u, 79u, 78u, 77u, 76u, 75u, 74u, 73u, 72u, 71u, 70u, 69u, 68u, 95u, 94u, 93u, 92u, 91u, 90u, 89u, 88u, 87u, 86u, 85u, 84u, 83u, 82u, 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, 104u, 105u, 106u }; - unsigned int cachedBidiLine06[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, - 2u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, - 3u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, - 4u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, - 5u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, - 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u }; - -// size 100, 600 -// LO H e l l o _ w o r l d , _ -// 0 1 2 3 4 5 6 7 8 9 10 11 12 -// VO H e l l o _ w o r l d , _ -// 0 1 2 3 4 5 6 7 8 9 10 11 12 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ -// 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 -// VO م ل ا ع ل ا ب _ ا ب Ø­ ر م , _ -// 25 24 23 22 21 20 19 18 17 16 15 14 13 26 27 - -// LO h e l l o _ w o r l d \n -// 28 29 30 31 32 33 34 35 36 37 38 39 -// VO h e l l o _ w o r l d \n -// 28 29 30 31 32 33 34 35 36 37 38 39 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ -// 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 -// VO _ , م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 - -// LO h e l l o _ w o r l d , _ -// 55 56 57 58 59 60 61 62 63 64 65 66 67 -// VO _ , h e l l o _ w o r l d -// 67 66 55 56 57 58 59 60 61 62 63 64 65 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n -// 68 69 70 71 72 73 74 75 76 77 78 79 80 81 -// VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 81 80 79 78 77 76 75 74 73 72 71 70 69 68 - -// LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n -// 82 83 84 85 86 87 88 89 90 91 92 93 94 95 -// VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م -// 95 94 93 92 91 90 89 88 87 86 85 84 83 82 - - -// LO h e l l o _ w o r l d -// 96 97 98 99 100 101 102 103 104 105 106 -// VO h e l l o _ w o r l d -// 96 97 98 99 100 101 102 103 104 105 106 + unsigned int cachedBidiLine01[] = {}; + unsigned int visualToLogical02[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u}; + unsigned int cachedBidiLine02[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}; + unsigned int visualToLogical03[] = {12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u}; + unsigned int cachedBidiLine03[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}; + + unsigned int visualToLogical04[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 25u, 24u, 23u, 22u, 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 81u, 80u, 79u, 78u, 77u, 76u, 75u, 74u, 73u, 72u, 71u, 70u, 69u, 68u, 67u, 66u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u, 43u, 42u, 41u, 40u, 95u, 94u, 93u, 92u, 91u, 90u, 89u, 88u, 87u, 86u, 85u, 84u, 83u, 82u, 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, 104u, 105u, 106u}; + unsigned int cachedBidiLine04[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u}; + + // size 300, 300 + // LO H e l l o _ w o r l d , _ م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ h e l l o _ w o r l d \n + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 + // VO H e l l o _ w o r l d , _ م ل ا ع ل ا ب _ ا ب Ø­ ر م , _ h e l l o _ w o r l d \n + // 0 1 2 3 4 5 6 7 8 9 10 11 12 25 24 23 22 21 20 19 18 17 16 15 14 13 26 27 28 29 30 31 32 33 34 35 36 37 38 39 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ h e l l o _ w o r l d , _ م ر Ø­ ب ا _ ب ا ل ع ا ل م \n + // 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 + // VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م _ , h e l l o _ w o r l d _ , م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 81 80 79 78 77 76 75 74 73 72 71 70 69 68 67 66 55 56 57 58 59 60 61 62 63 64 65 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n + // 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + // VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 95 94 93 92 91 90 89 88 87 86 85 84 83 82 + + // LO h e l l o _ w o r l d + // 96 97 98 99 100 101 102 103 104 105 106 + // VO h e l l o _ w o r l d + // 96 97 98 99 100 101 102 103 104 105 106 + + unsigned int visualToLogical05[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 25u, 24u, 23u, 22u, 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 67u, 66u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u, 43u, 42u, 41u, 40u, 81u, 80u, 79u, 78u, 77u, 76u, 75u, 74u, 73u, 72u, 71u, 70u, 69u, 68u, 95u, 94u, 93u, 92u, 91u, 90u, 89u, 88u, 87u, 86u, 85u, 84u, 83u, 82u, 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, 104u, 105u, 106u}; + unsigned int cachedBidiLine05[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u}; + + // size 300, 300 + // LO H e l l o _ w o r l d , _ م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 + // VO H e l l o _ w o r l d , _ م ل ا ع ل ا ب _ ا ب Ø­ ر م , _ + // 0 1 2 3 4 5 6 7 8 9 10 11 12 25 24 23 22 21 20 19 18 17 16 15 14 13 26 27 + + // LO h e l l o _ w o r l d \n + // 28 29 30 31 32 33 34 35 36 37 38 39 + // VO h e l l o _ w o r l d \n + // 28 29 30 31 32 33 34 35 36 37 38 39 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ h e l l o _ w o r l d , _ + // 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 + // VO _ , h e l l o _ w o r l d _ , م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 67 66 55 56 57 58 59 60 61 62 63 64 65 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n + // 68 69 70 71 72 73 74 75 76 77 78 79 80 81 + // VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 81 80 79 78 77 76 75 74 73 72 71 70 69 68 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n + // 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + // VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 95 94 93 92 91 90 89 88 87 86 85 84 83 82 + + // LO h e l l o _ w o r l d + // 96 97 98 99 100 101 102 103 104 105 106 + // VO h e l l o _ w o r l d + // 96 97 98 99 100 101 102 103 104 105 106 + + unsigned int visualToLogical06[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 25u, 24u, 23u, 22u, 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u, 43u, 42u, 41u, 40u, 67u, 66u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 81u, 80u, 79u, 78u, 77u, 76u, 75u, 74u, 73u, 72u, 71u, 70u, 69u, 68u, 95u, 94u, 93u, 92u, 91u, 90u, 89u, 88u, 87u, 86u, 85u, 84u, 83u, 82u, 96u, 97u, 98u, 99u, 100u, 101u, 102u, 103u, 104u, 105u, 106u}; + unsigned int cachedBidiLine06[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 3u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 4u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 5u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u, 6u}; + + // size 100, 600 + // LO H e l l o _ w o r l d , _ + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + // VO H e l l o _ w o r l d , _ + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ + // 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 + // VO م ل ا ع ل ا ب _ ا ب Ø­ ر م , _ + // 25 24 23 22 21 20 19 18 17 16 15 14 13 26 27 + + // LO h e l l o _ w o r l d \n + // 28 29 30 31 32 33 34 35 36 37 38 39 + // VO h e l l o _ w o r l d \n + // 28 29 30 31 32 33 34 35 36 37 38 39 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م , _ + // 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 + // VO _ , م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 + + // LO h e l l o _ w o r l d , _ + // 55 56 57 58 59 60 61 62 63 64 65 66 67 + // VO _ , h e l l o _ w o r l d + // 67 66 55 56 57 58 59 60 61 62 63 64 65 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n + // 68 69 70 71 72 73 74 75 76 77 78 79 80 81 + // VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 81 80 79 78 77 76 75 74 73 72 71 70 69 68 + + // LO م ر Ø­ ب ا _ ب ا ل ع ا ل م \n + // 82 83 84 85 86 87 88 89 90 91 92 93 94 95 + // VO \n م ل ا ع ل ا ب _ ا ب Ø­ ر م + // 95 94 93 92 91 90 89 88 87 86 85 84 83 82 + + // LO h e l l o _ w o r l d + // 96 97 98 99 100 101 102 103 104 105 106 + // VO h e l l o _ w o r l d + // 96 97 98 99 100 101 102 103 104 105 106 struct GetLogicalCharacterIndexData data[] = - { - { - "Zero characters text", - "", - Size( 300.f, 300.f ), - 0u, - visualToLogical01, - cachedBidiLine01 - }, - { - "Left to right text only", - "Hello world", - Size( 300.f, 300.f ), - 11u, - visualToLogical02, - cachedBidiLine02 - }, { - "Right to left text only", - "مرحبا بالعالم", - Size( 300.f, 300.f ), - 13u, - visualToLogical03, - cachedBidiLine03 - }, - { - "Mix of left to right and right to left text.", - "Hello world, مرحبا بالعالم, hello world\nمرحبا بالعالم, hello world, مرحبا بالعالم\nمرحبا بالعالم\nhello world", - Size( 300.f, 300.f ), - 107u, - visualToLogical04, - cachedBidiLine04 - }, - { - "Mix of left to right and right to left text.", - "Hello world, مرحبا بالعالم, hello world\nمرحبا بالعالم, hello world, مرحبا بالعالم\nمرحبا بالعالم\nhello world", - Size( 200.f, 400.f ), - 107u, - visualToLogical05, - cachedBidiLine05 - }, - { - "Mix of left to right and right to left text.", - "Hello world, مرحبا بالعالم, hello world\nمرحبا بالعالم, hello world, مرحبا بالعالم\nمرحبا بالعالم\nhello world", - Size( 100.f, 600.f ), - 107u, - visualToLogical06, - cachedBidiLine06 - }, - }; + {"Zero characters text", + "", + Size(300.f, 300.f), + 0u, + visualToLogical01, + cachedBidiLine01}, + {"Left to right text only", + "Hello world", + Size(300.f, 300.f), + 11u, + visualToLogical02, + cachedBidiLine02}, + {"Right to left text only", + "مرحبا بالعالم", + Size(300.f, 300.f), + 13u, + visualToLogical03, + cachedBidiLine03}, + {"Mix of left to right and right to left text.", + "Hello world, مرحبا بالعالم, hello world\nمرحبا بالعالم, hello world, مرحبا بالعالم\nمرحبا بالعالم\nhello world", + Size(300.f, 300.f), + 107u, + visualToLogical04, + cachedBidiLine04}, + {"Mix of left to right and right to left text.", + "Hello world, مرحبا بالعالم, hello world\nمرحبا بالعالم, hello world, مرحبا بالعالم\nمرحبا بالعالم\nhello world", + Size(200.f, 400.f), + 107u, + visualToLogical05, + cachedBidiLine05}, + {"Mix of left to right and right to left text.", + "Hello world, مرحبا بالعالم, hello world\nمرحبا بالعالم, hello world, مرحبا بالعالم\nمرحبا بالعالم\nhello world", + Size(100.f, 600.f), + 107u, + visualToLogical06, + cachedBidiLine06}, + }; const unsigned int numberOfTests = 6u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !GetLogicalCharacterIndexTest( data[index] ) ) + if(!GetLogicalCharacterIndexTest(data[index])) { tet_result(TET_FAIL); } @@ -797,15 +767,13 @@ int UtcDaliGetLogicalCursorIndex(void) { tet_infoline(" UtcDaliGetLogicalCursorIndex"); - const std::string fontFamily( "TizenSans" ); - const std::string fontFamilyHebrew( "TizenSansHebrew" ); + const std::string fontFamily("TizenSans"); + const std::string fontFamilyHebrew("TizenSansHebrew"); - - - unsigned int visualIndex01[] = { 10u }; - unsigned int characterIndex01[] = { 0u }; - unsigned int logicalIndex01[] = { 10u }; - unsigned int bidirectionalLineIndex01[] = { 0u }; + unsigned int visualIndex01[] = {10u}; + unsigned int characterIndex01[] = {0u}; + unsigned int logicalIndex01[] = {10u}; + unsigned int bidirectionalLineIndex01[] = {0u}; // 0 11 // Hello world \n @@ -814,390 +782,374 @@ int UtcDaliGetLogicalCursorIndex(void) // Set a known font description FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 0u; + fontDescriptionRun02.characterRun.characterIndex = 0u; fontDescriptionRun02.characterRun.numberOfCharacters = 11u; - fontDescriptionRun02.familyLength = fontFamily.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontFamily.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; Vector fontDescriptionRuns02; - fontDescriptionRuns02.PushBack( fontDescriptionRun02 ); + fontDescriptionRuns02.PushBack(fontDescriptionRun02); - unsigned int visualIndex02[] = { 0u, 16u, 11u, 12u }; - unsigned int characterIndex02[] = { 0u, 0u, 0u, 0u }; - unsigned int logicalIndex02[] = { 0u, 16u, 11u, 12u }; - unsigned int bidirectionalLineIndex02[] = { 0u, 0u, 0u, 0u }; + unsigned int visualIndex02[] = {0u, 16u, 11u, 12u}; + unsigned int characterIndex02[] = {0u, 0u, 0u, 0u}; + unsigned int logicalIndex02[] = {0u, 16u, 11u, 12u}; + unsigned int bidirectionalLineIndex02[] = {0u, 0u, 0u, 0u}; -// LO H e l l o _ w o r l d \n -// 0 1 2 3 4 5 6 7 8 9 10 11 12 -// VO H e l l o _ w o r l d \n + // LO H e l l o _ w o r l d \n + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + // VO H e l l o _ w o r l d \n -// LO ש ל ו ם _ ×¢ ו ל ם \n -// 12 13 14 15 16 17 18 19 20 21 22 -// VO \n ם ל ו ×¢ _ ם ו ל ש + // LO ש ל ו ם _ ×¢ ו ל ם \n + // 12 13 14 15 16 17 18 19 20 21 22 + // VO \n ם ל ו ×¢ _ ם ו ל ש -// LO h e l l o _ w o r l d _ ש ל ו ם _ ×¢ ו ל ם \n -// 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 -// VO h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש \n - -// LO ש ל ו ם _ ×¢ ו ל ם _ h e l l o _ w o r l d \n -// 44 45 46 47 48 49 50 51 52 52 54 55 56 57 58 59 60 61 62 63 64 65 66 -// VO \n h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש + // LO h e l l o _ w o r l d _ ש ל ו ם _ ×¢ ו ל ם \n + // 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 + // VO h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש \n + // LO ש ל ו ם _ ×¢ ו ל ם _ h e l l o _ w o r l d \n + // 44 45 46 47 48 49 50 51 52 52 54 55 56 57 58 59 60 61 62 63 64 65 66 + // VO \n h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש // Set a known font description FontDescriptionRun fontDescriptionRun0301; - fontDescriptionRun0301.characterRun.characterIndex = 0u; + fontDescriptionRun0301.characterRun.characterIndex = 0u; fontDescriptionRun0301.characterRun.numberOfCharacters = 12u; - fontDescriptionRun0301.familyLength = fontFamily.size(); - fontDescriptionRun0301.familyName = new char[fontDescriptionRun0301.familyLength]; - memcpy( fontDescriptionRun0301.familyName, fontFamily.c_str(), fontDescriptionRun0301.familyLength ); + fontDescriptionRun0301.familyLength = fontFamily.size(); + fontDescriptionRun0301.familyName = new char[fontDescriptionRun0301.familyLength]; + memcpy(fontDescriptionRun0301.familyName, fontFamily.c_str(), fontDescriptionRun0301.familyLength); fontDescriptionRun0301.familyDefined = true; fontDescriptionRun0301.weightDefined = false; - fontDescriptionRun0301.widthDefined = false; - fontDescriptionRun0301.slantDefined = false; - fontDescriptionRun0301.sizeDefined = false; + fontDescriptionRun0301.widthDefined = false; + fontDescriptionRun0301.slantDefined = false; + fontDescriptionRun0301.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun0302; - fontDescriptionRun0302.characterRun.characterIndex = 12u; + fontDescriptionRun0302.characterRun.characterIndex = 12u; fontDescriptionRun0302.characterRun.numberOfCharacters = 10u; - fontDescriptionRun0302.familyLength = fontFamilyHebrew.size(); - fontDescriptionRun0302.familyName = new char[fontDescriptionRun0302.familyLength]; - memcpy( fontDescriptionRun0302.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0302.familyLength ); + fontDescriptionRun0302.familyLength = fontFamilyHebrew.size(); + fontDescriptionRun0302.familyName = new char[fontDescriptionRun0302.familyLength]; + memcpy(fontDescriptionRun0302.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0302.familyLength); fontDescriptionRun0302.familyDefined = true; fontDescriptionRun0302.weightDefined = false; - fontDescriptionRun0302.widthDefined = false; - fontDescriptionRun0302.slantDefined = false; - fontDescriptionRun0302.sizeDefined = false; + fontDescriptionRun0302.widthDefined = false; + fontDescriptionRun0302.slantDefined = false; + fontDescriptionRun0302.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun0303; - fontDescriptionRun0303.characterRun.characterIndex = 22u; + fontDescriptionRun0303.characterRun.characterIndex = 22u; fontDescriptionRun0303.characterRun.numberOfCharacters = 12u; - fontDescriptionRun0303.familyLength = fontFamily.size(); - fontDescriptionRun0303.familyName = new char[fontDescriptionRun0303.familyLength]; - memcpy( fontDescriptionRun0303.familyName, fontFamily.c_str(), fontDescriptionRun0303.familyLength ); + fontDescriptionRun0303.familyLength = fontFamily.size(); + fontDescriptionRun0303.familyName = new char[fontDescriptionRun0303.familyLength]; + memcpy(fontDescriptionRun0303.familyName, fontFamily.c_str(), fontDescriptionRun0303.familyLength); fontDescriptionRun0303.familyDefined = true; fontDescriptionRun0303.weightDefined = false; - fontDescriptionRun0303.widthDefined = false; - fontDescriptionRun0303.slantDefined = false; - fontDescriptionRun0303.sizeDefined = false; + fontDescriptionRun0303.widthDefined = false; + fontDescriptionRun0303.slantDefined = false; + fontDescriptionRun0303.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun0304; - fontDescriptionRun0304.characterRun.characterIndex = 34u; + fontDescriptionRun0304.characterRun.characterIndex = 34u; fontDescriptionRun0304.characterRun.numberOfCharacters = 20u; - fontDescriptionRun0304.familyLength = fontFamilyHebrew.size(); - fontDescriptionRun0304.familyName = new char[fontDescriptionRun0304.familyLength]; - memcpy( fontDescriptionRun0304.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0304.familyLength ); + fontDescriptionRun0304.familyLength = fontFamilyHebrew.size(); + fontDescriptionRun0304.familyName = new char[fontDescriptionRun0304.familyLength]; + memcpy(fontDescriptionRun0304.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0304.familyLength); fontDescriptionRun0304.familyDefined = true; fontDescriptionRun0304.weightDefined = false; - fontDescriptionRun0304.widthDefined = false; - fontDescriptionRun0304.slantDefined = false; - fontDescriptionRun0304.sizeDefined = false; + fontDescriptionRun0304.widthDefined = false; + fontDescriptionRun0304.slantDefined = false; + fontDescriptionRun0304.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun0305; - fontDescriptionRun0305.characterRun.characterIndex = 54u; + fontDescriptionRun0305.characterRun.characterIndex = 54u; fontDescriptionRun0305.characterRun.numberOfCharacters = 12u; - fontDescriptionRun0305.familyLength = fontFamily.size(); - fontDescriptionRun0305.familyName = new char[fontDescriptionRun0305.familyLength]; - memcpy( fontDescriptionRun0305.familyName, fontFamily.c_str(), fontDescriptionRun0305.familyLength ); + fontDescriptionRun0305.familyLength = fontFamily.size(); + fontDescriptionRun0305.familyName = new char[fontDescriptionRun0305.familyLength]; + memcpy(fontDescriptionRun0305.familyName, fontFamily.c_str(), fontDescriptionRun0305.familyLength); fontDescriptionRun0305.familyDefined = true; fontDescriptionRun0305.weightDefined = false; - fontDescriptionRun0305.widthDefined = false; - fontDescriptionRun0305.slantDefined = false; - fontDescriptionRun0305.sizeDefined = false; + fontDescriptionRun0305.widthDefined = false; + fontDescriptionRun0305.slantDefined = false; + fontDescriptionRun0305.sizeDefined = false; Vector fontDescriptionRuns03; - fontDescriptionRuns03.PushBack( fontDescriptionRun0301 ); - fontDescriptionRuns03.PushBack( fontDescriptionRun0302 ); - fontDescriptionRuns03.PushBack( fontDescriptionRun0303 ); - fontDescriptionRuns03.PushBack( fontDescriptionRun0304 ); - fontDescriptionRuns03.PushBack( fontDescriptionRun0305 ); - - unsigned int visualIndex03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, - 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, 22u, - 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 40u, 41u, 42u, 43u, - 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 66u }; + fontDescriptionRuns03.PushBack(fontDescriptionRun0301); + fontDescriptionRuns03.PushBack(fontDescriptionRun0302); + fontDescriptionRuns03.PushBack(fontDescriptionRun0303); + fontDescriptionRuns03.PushBack(fontDescriptionRun0304); + fontDescriptionRuns03.PushBack(fontDescriptionRun0305); - unsigned int characterIndex03[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 12u, 12u, 12u, 12u, 12u, 12u, 12u, 12u, 12u, 12u, - 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, - 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u}; + unsigned int visualIndex03[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, 22u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 40u, 41u, 42u, 43u, 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 66u}; - unsigned int logicalIndex03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, - 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 12u, - 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 42u, 41u, 40u, 39u, 38u, 37u, 36u, 35u, 43u, - 65u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u }; + unsigned int characterIndex03[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 12u, 12u, 12u, 12u, 12u, 12u, 12u, 12u, 12u, 12u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u}; - unsigned int bidirectionalLineIndex03[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u }; + unsigned int logicalIndex03[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 21u, 20u, 19u, 18u, 17u, 16u, 15u, 14u, 13u, 12u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 42u, 41u, 40u, 39u, 38u, 37u, 36u, 35u, 43u, 65u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 54u, 53u, 52u, 51u, 50u, 49u, 48u, 47u, 46u, 45u, 44u}; + unsigned int bidirectionalLineIndex03[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u}; -// LO ש ל ו ם _ ×¢ ו ל ם \n -// 0 1 2 3 4 5 6 7 8 9 10 -// VO \n ם ל ו ×¢ _ ם ו ל ש + // LO ש ל ו ם _ ×¢ ו ל ם \n + // 0 1 2 3 4 5 6 7 8 9 10 + // VO \n ם ל ו ×¢ _ ם ו ל ש -// h e l l o _ w o r l d \n -// LO 10 11 12 13 14 15 16 17 18 19 20 21 22 -// h e l l o _ w o r l d \n + // h e l l o _ w o r l d \n + // LO 10 11 12 13 14 15 16 17 18 19 20 21 22 + // h e l l o _ w o r l d \n -// ש ל ו ם _ ×¢ ו ל ם _ h e l l o _ w o r l d \n -// LO 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 -// \n h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש + // ש ל ו ם _ ×¢ ו ל ם _ h e l l o _ w o r l d \n + // LO 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 + // \n h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש -// h e l l o _ w o r l d _ ש ל ו ם _ ×¢ ו ל ם \n -// LO 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 -// h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש \n + // h e l l o _ w o r l d _ ש ל ו ם _ ×¢ ו ל ם \n + // LO 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 + // h e l l o _ w o r l d _ ם ל ו ×¢ _ ם ו ל ש \n // Set a known font description FontDescriptionRun fontDescriptionRun0401; - fontDescriptionRun0401.characterRun.characterIndex = 0u; + fontDescriptionRun0401.characterRun.characterIndex = 0u; fontDescriptionRun0401.characterRun.numberOfCharacters = 10u; - fontDescriptionRun0401.familyLength = fontFamilyHebrew.size(); - fontDescriptionRun0401.familyName = new char[fontDescriptionRun0401.familyLength]; - memcpy( fontDescriptionRun0401.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0401.familyLength ); + fontDescriptionRun0401.familyLength = fontFamilyHebrew.size(); + fontDescriptionRun0401.familyName = new char[fontDescriptionRun0401.familyLength]; + memcpy(fontDescriptionRun0401.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0401.familyLength); fontDescriptionRun0401.familyDefined = true; fontDescriptionRun0401.weightDefined = false; - fontDescriptionRun0401.widthDefined = false; - fontDescriptionRun0401.slantDefined = false; - fontDescriptionRun0401.sizeDefined = false; + fontDescriptionRun0401.widthDefined = false; + fontDescriptionRun0401.slantDefined = false; + fontDescriptionRun0401.sizeDefined = false; FontDescriptionRun fontDescriptionRun0402; - fontDescriptionRun0402.characterRun.characterIndex = 10u; + fontDescriptionRun0402.characterRun.characterIndex = 10u; fontDescriptionRun0402.characterRun.numberOfCharacters = 12u; - fontDescriptionRun0402.familyLength = fontFamily.size(); - fontDescriptionRun0402.familyName = new char[fontDescriptionRun0402.familyLength]; - memcpy( fontDescriptionRun0402.familyName, fontFamily.c_str(), fontDescriptionRun0402.familyLength ); + fontDescriptionRun0402.familyLength = fontFamily.size(); + fontDescriptionRun0402.familyName = new char[fontDescriptionRun0402.familyLength]; + memcpy(fontDescriptionRun0402.familyName, fontFamily.c_str(), fontDescriptionRun0402.familyLength); fontDescriptionRun0402.familyDefined = true; fontDescriptionRun0402.weightDefined = false; - fontDescriptionRun0402.widthDefined = false; - fontDescriptionRun0402.slantDefined = false; - fontDescriptionRun0402.sizeDefined = false; + fontDescriptionRun0402.widthDefined = false; + fontDescriptionRun0402.slantDefined = false; + fontDescriptionRun0402.sizeDefined = false; FontDescriptionRun fontDescriptionRun0403; - fontDescriptionRun0403.characterRun.characterIndex = 22u; + fontDescriptionRun0403.characterRun.characterIndex = 22u; fontDescriptionRun0403.characterRun.numberOfCharacters = 10u; - fontDescriptionRun0403.familyLength = fontFamilyHebrew.size(); - fontDescriptionRun0403.familyName = new char[fontDescriptionRun0403.familyLength]; - memcpy( fontDescriptionRun0403.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0403.familyLength ); + fontDescriptionRun0403.familyLength = fontFamilyHebrew.size(); + fontDescriptionRun0403.familyName = new char[fontDescriptionRun0403.familyLength]; + memcpy(fontDescriptionRun0403.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0403.familyLength); fontDescriptionRun0403.familyDefined = true; fontDescriptionRun0403.weightDefined = false; - fontDescriptionRun0403.widthDefined = false; - fontDescriptionRun0403.slantDefined = false; - fontDescriptionRun0403.sizeDefined = false; + fontDescriptionRun0403.widthDefined = false; + fontDescriptionRun0403.slantDefined = false; + fontDescriptionRun0403.sizeDefined = false; FontDescriptionRun fontDescriptionRun0404; - fontDescriptionRun0404.characterRun.characterIndex = 32u; + fontDescriptionRun0404.characterRun.characterIndex = 32u; fontDescriptionRun0404.characterRun.numberOfCharacters = 24u; - fontDescriptionRun0404.familyLength = fontFamily.size(); - fontDescriptionRun0404.familyName = new char[fontDescriptionRun0404.familyLength]; - memcpy( fontDescriptionRun0404.familyName, fontFamily.c_str(), fontDescriptionRun0404.familyLength ); + fontDescriptionRun0404.familyLength = fontFamily.size(); + fontDescriptionRun0404.familyName = new char[fontDescriptionRun0404.familyLength]; + memcpy(fontDescriptionRun0404.familyName, fontFamily.c_str(), fontDescriptionRun0404.familyLength); fontDescriptionRun0404.familyDefined = true; fontDescriptionRun0404.weightDefined = false; - fontDescriptionRun0404.widthDefined = false; - fontDescriptionRun0404.slantDefined = false; - fontDescriptionRun0404.sizeDefined = false; + fontDescriptionRun0404.widthDefined = false; + fontDescriptionRun0404.slantDefined = false; + fontDescriptionRun0404.sizeDefined = false; FontDescriptionRun fontDescriptionRun0405; - fontDescriptionRun0405.characterRun.characterIndex = 56u; + fontDescriptionRun0405.characterRun.characterIndex = 56u; fontDescriptionRun0405.characterRun.numberOfCharacters = 10u; - fontDescriptionRun0405.familyLength = fontFamilyHebrew.size(); - fontDescriptionRun0405.familyName = new char[fontDescriptionRun0405.familyLength]; - memcpy( fontDescriptionRun0405.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0405.familyLength ); + fontDescriptionRun0405.familyLength = fontFamilyHebrew.size(); + fontDescriptionRun0405.familyName = new char[fontDescriptionRun0405.familyLength]; + memcpy(fontDescriptionRun0405.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0405.familyLength); fontDescriptionRun0405.familyDefined = true; fontDescriptionRun0405.weightDefined = false; - fontDescriptionRun0405.widthDefined = false; - fontDescriptionRun0405.slantDefined = false; - fontDescriptionRun0405.sizeDefined = false; + fontDescriptionRun0405.widthDefined = false; + fontDescriptionRun0405.slantDefined = false; + fontDescriptionRun0405.sizeDefined = false; Vector fontDescriptionRuns04; - fontDescriptionRuns04.PushBack( fontDescriptionRun0401 ); - fontDescriptionRuns04.PushBack( fontDescriptionRun0402 ); - fontDescriptionRuns04.PushBack( fontDescriptionRun0403 ); - fontDescriptionRuns04.PushBack( fontDescriptionRun0404 ); - fontDescriptionRuns04.PushBack( fontDescriptionRun0405 ); - - unsigned int visualIndex04[] = { 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, - 10u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, - 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 40u, 41u, 42u, 43u, 44u, - 44u, 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u }; - - unsigned int characterIndex04[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, - 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, - 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u }; - - unsigned int logicalIndex04[] = { 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u, - 10u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, - 43u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 40u, 41u, 42u, 32u, 31u, 30u, 29u, 28u, 27u, 26u, 25u, 24u, 23u, 22u, - 44u, 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 64u, 63u, 62u, 61u, 60u, 59u, 58u, 57u, 65u }; - - unsigned int bidirectionalLineIndex04[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u }; - -// LO A B C D E F G H I J K -// 0 1 2 3 4 5 6 7 8 9 10 11 -// LO L M N -// 11 12 13 14 + fontDescriptionRuns04.PushBack(fontDescriptionRun0401); + fontDescriptionRuns04.PushBack(fontDescriptionRun0402); + fontDescriptionRuns04.PushBack(fontDescriptionRun0403); + fontDescriptionRuns04.PushBack(fontDescriptionRun0404); + fontDescriptionRuns04.PushBack(fontDescriptionRun0405); + + unsigned int visualIndex04[] = {1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 10u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 40u, 41u, 42u, 43u, 44u, 44u, 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u}; + + unsigned int characterIndex04[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 10u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 22u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u, 44u}; + + unsigned int logicalIndex04[] = {9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u, 10u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, 43u, 33u, 34u, 35u, 36u, 37u, 38u, 39u, 40u, 41u, 42u, 32u, 31u, 30u, 29u, 28u, 27u, 26u, 25u, 24u, 23u, 22u, 44u, 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 64u, 63u, 62u, 61u, 60u, 59u, 58u, 57u, 65u}; + + unsigned int bidirectionalLineIndex04[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u, 2u}; + + // LO A B C D E F G H I J K + // 0 1 2 3 4 5 6 7 8 9 10 11 + // LO L M N + // 11 12 13 14 // Set a known font description FontDescriptionRun fontDescriptionRun0501; - fontDescriptionRun0501.characterRun.characterIndex = 0u; + fontDescriptionRun0501.characterRun.characterIndex = 0u; fontDescriptionRun0501.characterRun.numberOfCharacters = 14u; - fontDescriptionRun0501.familyLength = fontFamily.size(); - fontDescriptionRun0501.familyName = new char[fontDescriptionRun0501.familyLength]; - memcpy( fontDescriptionRun0501.familyName, fontFamily.c_str(), fontDescriptionRun0501.familyLength ); + fontDescriptionRun0501.familyLength = fontFamily.size(); + fontDescriptionRun0501.familyName = new char[fontDescriptionRun0501.familyLength]; + memcpy(fontDescriptionRun0501.familyName, fontFamily.c_str(), fontDescriptionRun0501.familyLength); fontDescriptionRun0501.familyDefined = true; fontDescriptionRun0501.weightDefined = false; - fontDescriptionRun0501.widthDefined = false; - fontDescriptionRun0501.slantDefined = false; - fontDescriptionRun0501.sizeDefined = false; + fontDescriptionRun0501.widthDefined = false; + fontDescriptionRun0501.slantDefined = false; + fontDescriptionRun0501.sizeDefined = false; Vector fontDescriptionRuns05; - fontDescriptionRuns05.PushBack( fontDescriptionRun0501 ); - - unsigned int visualIndex05[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, - 11u, 12u, 13u, 14u }; + fontDescriptionRuns05.PushBack(fontDescriptionRun0501); - unsigned int characterIndex05[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 11u, 11u, 11u, 11u }; + unsigned int visualIndex05[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u}; - unsigned int logicalIndex05[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, - 11u, 12u, 13u, 14u }; + unsigned int characterIndex05[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 11u, 11u, 11u, 11u}; - unsigned int bidirectionalLineIndex05[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 0u, 0u, 0u, 0u }; + unsigned int logicalIndex05[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u}; -// LO ק ר א ט ו ן ם פ ש ד ג כ -// 0 1 2 3 4 5 6 7 8 9 10 11 12 -// VO כ ג ד ש פ ם ן ו ט א ר ק + unsigned int bidirectionalLineIndex05[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u}; -// LO ×¢ י ח ל -// 12 13 14 15 16 -// VO ל ח י ×¢ + // LO ק ר א ט ו ן ם פ ש ד ג כ + // 0 1 2 3 4 5 6 7 8 9 10 11 12 + // VO כ ג ד ש פ ם ן ו ט א ר ק + // LO ×¢ י ח ל + // 12 13 14 15 16 + // VO ל ח י ×¢ // Set a known font description FontDescriptionRun fontDescriptionRun0601; - fontDescriptionRun0601.characterRun.characterIndex = 0u; + fontDescriptionRun0601.characterRun.characterIndex = 0u; fontDescriptionRun0601.characterRun.numberOfCharacters = 16u; - fontDescriptionRun0601.familyLength = fontFamilyHebrew.size(); - fontDescriptionRun0601.familyName = new char[fontDescriptionRun0601.familyLength]; - memcpy( fontDescriptionRun0601.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0601.familyLength ); + fontDescriptionRun0601.familyLength = fontFamilyHebrew.size(); + fontDescriptionRun0601.familyName = new char[fontDescriptionRun0601.familyLength]; + memcpy(fontDescriptionRun0601.familyName, fontFamilyHebrew.c_str(), fontDescriptionRun0601.familyLength); fontDescriptionRun0601.familyDefined = true; fontDescriptionRun0601.weightDefined = false; - fontDescriptionRun0601.widthDefined = false; - fontDescriptionRun0601.slantDefined = false; - fontDescriptionRun0601.sizeDefined = false; + fontDescriptionRun0601.widthDefined = false; + fontDescriptionRun0601.slantDefined = false; + fontDescriptionRun0601.sizeDefined = false; Vector fontDescriptionRuns06; - fontDescriptionRuns06.PushBack( fontDescriptionRun0601 ); - - unsigned int visualIndex06[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, - 12u, 13u, 14u, 15u, 16u }; - - unsigned int characterIndex06[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 12u, 12u, 12u, 12u, 12u }; - - unsigned int logicalIndex06[] = { 12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u, - 16u, 15u, 14u, 13u, 12u }; - - unsigned int bidirectionalLineIndex06[] = { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, - 1u, 1u, 1u, 1u, 1u, }; + fontDescriptionRuns06.PushBack(fontDescriptionRun0601); + + unsigned int visualIndex06[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 12u, 13u, 14u, 15u, 16u}; + + unsigned int characterIndex06[] = {0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u, 12u, 12u, 12u, 12u, 12u}; + + unsigned int logicalIndex06[] = {12u, 11u, 10u, 9u, 8u, 7u, 6u, 5u, 4u, 3u, 2u, 1u, 0u, 16u, 15u, 14u, 13u, 12u}; + + unsigned int bidirectionalLineIndex06[] = { + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 0u, + 1u, + 1u, + 1u, + 1u, + 1u, + }; struct GetLogicalCursorIndexData data[] = - { - { - "Zero characters text", - "", - Size( 300.f, 300.f ), - 0u, - nullptr, - 1u, - visualIndex01, - characterIndex01, - logicalIndex01, - bidirectionalLineIndex01, - }, - { - "All left to right text 01.", - "Hello world\ndemo", - Size( 300.f, 300.f ), - 1u, - fontDescriptionRuns02.Begin(), - 4u, - visualIndex02, - characterIndex02, - logicalIndex02, - bidirectionalLineIndex02, - }, - { - "bidirectional text 01.", - "Hello world\nשלום עולם\nhello world שלום עולם\nשלום עולם hello world\n", - Size( 300.f, 300.f ), - 5u, - fontDescriptionRuns03.Begin(), - 65u, - visualIndex03, - characterIndex03, - logicalIndex03, - bidirectionalLineIndex03, - }, - { - "bidirectional text 02.", - "שלום עולם\nhello world\nשלום עולם hello world\nhello world שלום עולם\n", - Size( 300.f, 300.f ), - 5u, - fontDescriptionRuns04.Begin(), - 65u, - visualIndex04, - characterIndex04, - logicalIndex04, - bidirectionalLineIndex04, - }, { - "long line 01.", - "ABCDEFGHIJKLMN", - Size( 100.f, 300.f ), - 1u, - fontDescriptionRuns05.Begin(), - 13u, - visualIndex05, - characterIndex05, - logicalIndex05, - bidirectionalLineIndex05, - }, - { - "bidirectional text 03.", - "קראטוןםפשדגכעיחל", - Size( 100.f, 300.f ), - 1u, - fontDescriptionRuns06.Begin(), - 18u, - visualIndex06, - characterIndex06, - logicalIndex06, - bidirectionalLineIndex06, - }, - }; + { + "Zero characters text", + "", + Size(300.f, 300.f), + 0u, + nullptr, + 1u, + visualIndex01, + characterIndex01, + logicalIndex01, + bidirectionalLineIndex01, + }, + { + "All left to right text 01.", + "Hello world\ndemo", + Size(300.f, 300.f), + 1u, + fontDescriptionRuns02.Begin(), + 4u, + visualIndex02, + characterIndex02, + logicalIndex02, + bidirectionalLineIndex02, + }, + { + "bidirectional text 01.", + "Hello world\nשלום עולם\nhello world שלום עולם\nשלום עולם hello world\n", + Size(300.f, 300.f), + 5u, + fontDescriptionRuns03.Begin(), + 65u, + visualIndex03, + characterIndex03, + logicalIndex03, + bidirectionalLineIndex03, + }, + { + "bidirectional text 02.", + "שלום עולם\nhello world\nשלום עולם hello world\nhello world שלום עולם\n", + Size(300.f, 300.f), + 5u, + fontDescriptionRuns04.Begin(), + 65u, + visualIndex04, + characterIndex04, + logicalIndex04, + bidirectionalLineIndex04, + }, + { + "long line 01.", + "ABCDEFGHIJKLMN", + Size(100.f, 300.f), + 1u, + fontDescriptionRuns05.Begin(), + 13u, + visualIndex05, + characterIndex05, + logicalIndex05, + bidirectionalLineIndex05, + }, + { + "bidirectional text 03.", + "קראטוןםפשדגכעיחל", + Size(100.f, 300.f), + 1u, + fontDescriptionRuns06.Begin(), + 18u, + visualIndex06, + characterIndex06, + logicalIndex06, + bidirectionalLineIndex06, + }, + }; const unsigned int numberOfTests = 6u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !GetLogicalCursorIndexTest( data[index] ) ) + if(!GetLogicalCursorIndexTest(data[index])) { tet_printf("Test %d failed : [%s]\n", index, data[index].description.c_str()); tet_result(TET_FAIL); diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSpacing.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSpacing.cpp new file mode 100644 index 0000000..f636a19 --- /dev/null +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-CharacterSpacing.cpp @@ -0,0 +1,856 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +using namespace Dali; +using namespace Toolkit; +using namespace Text; + +// Tests the LayoutEngine methods. + +////////////////////////////////////////////////////////// + +namespace +{ +const std::string DEFAULT_FONT_DIR("/resources/fonts"); + +struct LayoutTextData +{ + std::string description; + std::string text; + Size textArea; + unsigned int numberOfFonts; + FontDescriptionRun* fontDescriptions; + Size layoutSize; + unsigned int totalNumberOfGlyphs; + float* positions; + unsigned int numberOfLines; + LineRun* lines; + Layout::Engine::Type layout; + unsigned int startIndex; + unsigned int numberOfGlyphs; + bool ellipsis : 1; + bool updated : 1; + float characterSpacing; +}; + +void Print(const LineRun& line) +{ + std::cout << " glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl; + std::cout << " character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl; + std::cout << " width : " << floor(line.width) << std::endl; + std::cout << " ascender : " << line.ascender << std::endl; + std::cout << " descender : " << line.descender << std::endl; + std::cout << " extraLength : " << line.extraLength << std::endl; + std::cout << " alignmentOffset : " << line.alignmentOffset << std::endl; + std::cout << " direction : " << line.direction << std::endl; + std::cout << " ellipsis : " << line.ellipsis << std::endl; +} + +bool LayoutTextTest(const LayoutTextData& data) +{ + // Load some fonts. + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.SetDpi(96u, 96u); + + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); + + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHindiRegular.ttf"); + + // 1) Create the model. + ModelPtr textModel; + MetricsPtr metrics; + Size layoutSize; + + Vector fontDescriptionRuns; + if(0u != data.numberOfFonts) + { + fontDescriptionRuns.Insert(fontDescriptionRuns.End(), + data.fontDescriptions, + data.fontDescriptions + data.numberOfFonts); + } + + LayoutOptions options; + options.align = false; + CreateTextModel(data.text, + data.textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + data.characterSpacing); + + LogicalModelPtr logicalModel = textModel->mLogicalModel; + VisualModelPtr visualModel = textModel->mVisualModel; + + // 2) Clear the layout. + Vector& lines = visualModel->mLines; + + const Length numberOfCharacters = logicalModel->mText.Count(); + const bool isLastNewParagraph = (0u == numberOfCharacters) ? false : TextAbstraction::IsNewParagraph(*(logicalModel->mText.Begin() + (numberOfCharacters - 1u))); + const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u; + const bool removeLastLine = isLastNewParagraph && (lastGlyphIndex + 1u == visualModel->mGlyphs.Count()); + + LineIndex startRemoveIndex = 0u; + + if(0u != lines.Count()) + { + startRemoveIndex = lines.Count(); + LineIndex endRemoveIndex = startRemoveIndex; + ClearGlyphRuns(data.startIndex, + lastGlyphIndex + (removeLastLine ? 1u : 0u), + lines, + startRemoveIndex, + endRemoveIndex); + + // Update the character runs of the lines. + const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin(); + const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin(); + const CharacterIndex startCharacterIndex = *(glyphsToCharactersBuffer + data.startIndex); + const CharacterIndex lastCharacterIndex = *(glyphsToCharactersBuffer + lastGlyphIndex) + *(charactersPerGlyph + lastGlyphIndex) - 1u; + ClearCharacterRuns(startCharacterIndex, + lastCharacterIndex + (removeLastLine ? 1u : 0u), + lines, + startRemoveIndex, + endRemoveIndex); + + lines.Erase(lines.Begin() + startRemoveIndex, + lines.Begin() + endRemoveIndex); + } + + Vector& glyphPositions = visualModel->mGlyphPositions; + + glyphPositions.Erase(glyphPositions.Begin() + data.startIndex, + glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs); + + // 3) Layout + Layout::Engine engine; + engine.SetMetrics(metrics); + engine.SetLayout(data.layout); + + textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN; + textModel->mLineWrapMode = LineWrap::WORD; + textModel->mIgnoreSpacesAfterText = true; + //textModel->mMatchSystemLanguageDirection = false; + Layout::Parameters layoutParameters(data.textArea, + textModel); + + layoutParameters.isLastNewParagraph = isLastNewParagraph; + + // The initial glyph and the number of glyphs to layout. + layoutParameters.startGlyphIndex = data.startIndex; + layoutParameters.numberOfGlyphs = data.numberOfGlyphs; + layoutParameters.startLineIndex = startRemoveIndex; + layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count(); + + layoutSize = Vector2::ZERO; + + bool isAutoScroll = false; + const bool updated = engine.LayoutText(layoutParameters, + layoutSize, + data.ellipsis, + isAutoScroll, + DevelText::EllipsisPosition::END); + + // 4) Compare the results. + + if(updated != data.updated) + { + std::cout << " Different updated bool : " << updated << ", expected : " << data.updated << std::endl; + return false; + } + + if(layoutSize != data.layoutSize) + { + std::cout << " Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl; + return false; + } + + for(unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index) + { + const Vector2& position = *(glyphPositions.Begin() + index); + + if(fabsf(std::round(position.x) - std::round(*(data.positions + 2u * index))) > Math::MACHINE_EPSILON_1000) + { + std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *(data.positions + 2u * index) << std::endl; + return false; + } + if(fabsf(position.y - *(data.positions + 2u * index + 1u)) > Math::MACHINE_EPSILON_1000) + { + std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *(data.positions + 2u * index + 1u) << std::endl; + return false; + } + } + + if(lines.Count() != data.numberOfLines) + { + std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl; + return false; + } + + for(unsigned int index = 0u; index < data.numberOfLines; ++index) + { + const LineRun& line = *(lines.Begin() + index); + const LineRun& expectedLine = *(data.lines + index); + + if(line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + if(line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + + if(line.characterRun.characterIndex != expectedLine.characterRun.characterIndex) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + if(line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + + if(fabsf(floor(line.width) - expectedLine.width) > Math::MACHINE_EPSILON_1) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + + if(fabsf(line.ascender - expectedLine.ascender) > Math::MACHINE_EPSILON_1) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + + if(fabsf(line.descender - expectedLine.descender) > Math::MACHINE_EPSILON_1) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + + if(fabsf(line.extraLength - expectedLine.extraLength) > Math::MACHINE_EPSILON_1) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + + if(line.ellipsis != expectedLine.ellipsis) + { + std::cout << " Different line info for line : " << index << std::endl; + Print(line); + std::cout << " expected" << std::endl; + Print(expectedLine); + return false; + } + + // Do not compare the alignment offset as it's not calculated in the layout. + // Do not compare the line direction as it's not set in the layout. + } + + return true; +} + +//////////////////////////////////////////////////////// + +} // namespace + +////////////////////////////////////////////////////////// +// +// UtcDaliTextCharacterSpacingSingleLineTextArea1 +// UtcDaliTextCharacterSpacingSingleLineTextArea2 +// UtcDaliTextCharacterSpacingSingleLineTextArea3 +// UtcDaliTextCharacterSpacingMultilineText1 +// UtcDaliTextCharacterSpacingMultilineText2 +// +////////////////////////////////////////////////////////// + +int UtcDaliTextCharacterSpacingSingleLineTextArea1(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextCharacterSpacingSingleLineTextArea1"); + + // Will layout the text in single line as it can be scrolled. + + const std::string fontFamily("TizenSans"); + + // Set a known font description + FontDescriptionRun fontDescriptionRun; + fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.numberOfCharacters = 11u; + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); + fontDescriptionRun.familyDefined = true; + fontDescriptionRun.weightDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; + + Vector fontDescriptionRuns; + fontDescriptionRuns.PushBack(fontDescriptionRun); + Size textArea(1.f, 1.f); + + //******* characterSpacing = 0.0f *******// + float positions[] = { + 0.f, -12.f, 10.f, -9.f, 19.875f, -13.f, 23.8906f, -13.f, 26.9062f, -9.f, 36.1875f, -0.f, 40.1875f, -9.f, 52.1562f, -9.f, 62.4375f, -9.f, 68.5f, -13.f, 71.5156f, -13.f}; + Size layoutSize(81.f, 20.f); + //************************************// + + struct LineRun line = + { + {0u, 11u}, + {0u, 11u}, + 81.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; + Vector lines; + lines.PushBack(line); + + LayoutTextData data = + { + "Layout text in a small area", + "Hello world", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 11u, + positions, + 1u, + lines.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 11u, + false, + true, + 0.0f}; + + if(!LayoutTextTest(data)) + { + tet_result(TET_FAIL); + } + + tet_result(TET_PASS); + END_TEST; +} + +int UtcDaliTextCharacterSpacingSingleLineTextArea2(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextCharacterSpacingSingleLineTextArea2"); + + // Will layout the text in single line as it can be scrolled. + + const std::string fontFamily("TizenSans"); + + // Set a known font description + FontDescriptionRun fontDescriptionRun; + fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.numberOfCharacters = 11u; + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); + fontDescriptionRun.familyDefined = true; + fontDescriptionRun.weightDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; + + Vector fontDescriptionRuns; + fontDescriptionRuns.PushBack(fontDescriptionRun); + Size textArea(1.f, 1.f); + + //******* characterSpacing = 2.0f *******// + float positions[] = { + 0.f, -12.f, 12.f, -9.f, 23.875f, -13.f, 29.8906f, -13.f, 34.9062f, -9.f, 46.1875f, -0.f, 52.1875f, -9.f, 66.1562f, -9.f, 78.4375f, -9.f, 86.5f, -13.f, 91.5156f, -13.f}; + Size layoutSize(101.f, 20.f); + //************************************// + + struct LineRun line = + { + {0u, 11u}, + {0u, 11u}, + 101.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; + Vector lines; + lines.PushBack(line); + + LayoutTextData data = + { + "Layout text in a small area", + "Hello world", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 11u, + positions, + 1u, + lines.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 11u, + false, + true, + 2.0f}; + + if(!LayoutTextTest(data)) + { + tet_result(TET_FAIL); + } + + tet_result(TET_PASS); + END_TEST; +} + +int UtcDaliTextCharacterSpacingSingleLineTextArea3(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextCharacterSpacingSingleLineTextArea3"); + + // Will layout the text in single line as it can be scrolled. + + const std::string fontFamily("TizenSans"); + + // Set a known font description + FontDescriptionRun fontDescriptionRun; + fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.numberOfCharacters = 11u; + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); + fontDescriptionRun.familyDefined = true; + fontDescriptionRun.weightDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; + + Vector fontDescriptionRuns; + fontDescriptionRuns.PushBack(fontDescriptionRun); + Size textArea(1.f, 1.f); + + //******* characterSpacing = 4.0f *******// + float positions[] = { + 0.f, -12.f, 14.f, -9.f, 27.875f, -13.f, 35.8906f, -13.f, 42.9062f, -9.f, 56.1875f, -0.f, 64.1875f, -9.f, 80.1562f, -9.f, 94.4375f, -9.f, 104.5f, -13.f, 111.5156f, -13.f}; + Size layoutSize(121.f, 20.f); + //************************************// + + struct LineRun line = + { + {0u, 11u}, + {0u, 11u}, + 121.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; + Vector lines; + lines.PushBack(line); + + LayoutTextData data = + { + "Layout text in a small area", + "Hello world", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 11u, + positions, + 1u, + lines.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 11u, + false, + true, + 4.0f}; + + if(!LayoutTextTest(data)) + { + tet_result(TET_FAIL); + } + + tet_result(TET_PASS); + END_TEST; +} + +int UtcDaliTextCharacterSpacingMultilineText1(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextCharacterSpacingMultilineText1"); + + // Layout some lines of left to right text. + + const std::string fontFamily("TizenSans"); + + // Set a known font description + FontDescriptionRun fontDescriptionRun1; + fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.numberOfCharacters = 18u; + fontDescriptionRun1.familyLength = fontFamily.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength); + fontDescriptionRun1.familyDefined = true; + fontDescriptionRun1.weightDefined = false; + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = false; + + FontDescriptionRun fontDescriptionRun2; + fontDescriptionRun2.characterRun.characterIndex = 18u; + fontDescriptionRun2.characterRun.numberOfCharacters = 31u; + fontDescriptionRun2.familyLength = fontFamily.size(); + fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; + memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength); + fontDescriptionRun2.familyDefined = true; + fontDescriptionRun2.weightDefined = false; + fontDescriptionRun2.widthDefined = false; + fontDescriptionRun2.slantDefined = false; + fontDescriptionRun2.sizeDefined = false; + + Vector fontDescriptionRuns; + fontDescriptionRuns.PushBack(fontDescriptionRun1); + fontDescriptionRuns.PushBack(fontDescriptionRun2); + Size textArea(100.f, 300.f); + Size layoutSize(98.f, 97.f); + float positions[] = + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, 45.f, -12.f, 0.f, -12.f, 7.92188f, -9.f, 18.f, -9.f, 27.2031f, -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f, 0.f, -12.f, 11.1562f, -12.f, 15.f, -12.f, 26.f, -9.f, 36.4844f, -9.f, 42.f, -9.f, 52.5469f, -9.f, 61.6875f, -11.f, 67.9688f, -0.f, 0.f, -12.f, 4.f, -12.f, 9.f, -9.f, 18.0469f, -9.f, 27.8906f, -9.f, 36.f, -0.f, 41.3281f, -9.f, 51.125f, -12.f, 57.f, -0.f, 62.f, -11.f, 68.1406f, -9.f, 77.7031f, -9.f, 87.f, -11.f, 94.4531f, -2.f}; + struct LineRun line0 = + { + {0u, 12u}, + {0u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line1 = + { + {12u, 6u}, + {12u, 6u}, + 44.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line2 = + { + {18u, 7u}, + {18u, 7u}, + 54.f, + 15.f, + -4.f, + 6.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line3 = + { + {25u, 9u}, + {25u, 10u}, + 68.f, + 15.f, + -4.f, + 6.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line4 = + { + {34u, 14u}, + {35u, 14u}, + 98.f, + 15.f, + -4.f, + 0.f, + 0.f, + 0.f, + false, + false}; + Vector lines; + lines.PushBack(line0); + lines.PushBack(line1); + lines.PushBack(line2); + lines.PushBack(line3); + lines.PushBack(line4); + + LayoutTextData data = + { + "Layout simple multiline text", + "Hello world demo.\n" + "Layout different lines of text.", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 48u, + positions, + 5u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 48u, + false, + true, + 0.0f}; + + if(!LayoutTextTest(data)) + { + tet_result(TET_FAIL); + } + + tet_result(TET_PASS); + END_TEST; +} + +int UtcDaliTextCharacterSpacingMultilineText2(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextCharacterSpacingMultilineText2"); + + // Layout some lines of left to right text. + + const std::string fontFamily("TizenSans"); + + // Set a known font description + FontDescriptionRun fontDescriptionRun1; + fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.numberOfCharacters = 18u; + fontDescriptionRun1.familyLength = fontFamily.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength); + fontDescriptionRun1.familyDefined = true; + fontDescriptionRun1.weightDefined = false; + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = false; + + FontDescriptionRun fontDescriptionRun2; + fontDescriptionRun2.characterRun.characterIndex = 18u; + fontDescriptionRun2.characterRun.numberOfCharacters = 31u; + fontDescriptionRun2.familyLength = fontFamily.size(); + fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; + memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength); + fontDescriptionRun2.familyDefined = true; + fontDescriptionRun2.weightDefined = false; + fontDescriptionRun2.widthDefined = false; + fontDescriptionRun2.slantDefined = false; + fontDescriptionRun2.sizeDefined = false; + + Vector fontDescriptionRuns; + fontDescriptionRuns.PushBack(fontDescriptionRun1); + fontDescriptionRuns.PushBack(fontDescriptionRun2); + Size textArea(100.f, 300.f); + Size layoutSize(82.f, 136.f); + float positions[] = + { + 0.f, -12.f, 12.f, -9.f, 24.f, -13.f, 30.f, -13.f, 35.f, -9.f, 46.f, -0.f, 0.f, -9.f, 13.9688f, -9.f, 26.25f, -9.f, 34.3125f, -13.f, 39.3281f, -13.f, 50.6406f, -0.f, 0.f, -13.f, 11.3125f, -9.f, 22.7031f, -9.f, 37.5625, -9.f, 48.8438f, -2.f, 54.8125, -12.f, 0.f, -12.f, 9.92188f, -9.f, 21.7344, -9.f, 33.2031f, -9.f, 46.f, -9.f, 57.1406f, -11.f, 65.4219f, -0.f, 0.f, -12.f, 13.1562f, -12.f, 18.6094f, -12.f, 31.6406f, -9.f, 44.4844f, -9.f, 51.7031f, -9.f, 64.5469f, -9.f, 75.6875f, -11.f, 83.9688, -0.f, 0.f, -12.f, 6.45312f, -12.f, 12.9062f, -9.f, 24.0469f, -9.f, 35.8906f, -9.f, 46.2344f, -0.f, 53.3281f, -9.f, 65.125f, -12.f, 72.7656f, -0.f, 0.f, -11.f, 8.28125f, -9.f, 19.8438f, -9.f, 31.3125f, -11.f, 40.5938f, -2.f}; + struct LineRun line0 = + { + {0u, 6u}, + {0u, 6u}, + 44.f, + 15.f, + -5.f, + 6.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line1 = + { + {6u, 6u}, + {6u, 6u}, + 49.f, + 15.f, + -5.f, + 6.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line2 = + { + {12u, 6u}, + {12u, 6u}, + 52.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line3 = + { + {18u, 7u}, + {18u, 7u}, + 64.f, + 15.f, + -4.f, + 8.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line4 = + { + {25u, 9u}, + {25u, 10u}, + 82.f, + 15.f, + -4.f, + 8.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line5 = + { + {34u, 9u}, + {35u, 9u}, + 72.f, + 15.f, + -4.f, + 8.f, + 0.f, + 0.f, + false, + false}; + struct LineRun line6 = + { + {43u, 5u}, + {44u, 5u}, + 44.f, + 15.f, + -4.f, + 0.f, + 0.f, + 0.f, + false, + false}; + Vector lines; + lines.PushBack(line0); + lines.PushBack(line1); + lines.PushBack(line2); + lines.PushBack(line3); + lines.PushBack(line4); + lines.PushBack(line5); + lines.PushBack(line6); + + LayoutTextData data = + { + "Layout simple multiline text", + "Hello world demo.\n" + "Layout different lines of text.", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 48u, + positions, + 7u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 48u, + false, + true, + 2.0f}; + + if(!LayoutTextTest(data)) + { + tet_result(TET_FAIL); + } + + tet_result(TET_PASS); + END_TEST; +} diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Cursor.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Cursor.cpp index 920a826..11c6343 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Cursor.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Cursor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,16 +15,15 @@ * */ -#include #include #include +#include #include -#include #include +#include #include - using namespace Dali; using namespace Toolkit; using namespace Text; @@ -46,104 +45,106 @@ using namespace Text; namespace { - const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); - const unsigned int DEFAULT_FONT_SIZE = 1152u; +const std::string DEFAULT_FONT_DIR("/resources/fonts"); +const unsigned int DEFAULT_FONT_SIZE = 1152u; struct GetClosestLineData { - std::string description; ///< Description of the test. - std::string text; ///< Input text. - unsigned int numberOfTests; ///< The number of tests. - float* visualY; ///< The visual 'y' position for each test. - LineIndex* lineIndex; ///< The expected line index for each test. - bool* isLineHit; ///< The expected line hit value for each test. + std::string description; ///< Description of the test. + std::string text; ///< Input text. + unsigned int numberOfTests; ///< The number of tests. + float* visualY; ///< The visual 'y' position for each test. + LineIndex* lineIndex; ///< The expected line index for each test. + bool* isLineHit; ///< The expected line hit value for each test. }; struct GetClosestCursorIndexData { - std::string description; ///< Description of the test. - std::string text; ///< Input text. - unsigned int numberOfTests; ///< The number of tests. - float* visualX; ///< The visual 'x' position for each test. - float* visualY; ///< The visual 'y' position for each test. - CharacterHitTest::Mode* mode; ///< The type of hit test. - CharacterIndex* logicalIndex; ///< The expected logical cursor index for each test. - bool* isCharacterHit; ///< The expected character hit value for each test. + std::string description; ///< Description of the test. + std::string text; ///< Input text. + unsigned int numberOfTests; ///< The number of tests. + float* visualX; ///< The visual 'x' position for each test. + float* visualY; ///< The visual 'y' position for each test. + CharacterHitTest::Mode* mode; ///< The type of hit test. + CharacterIndex* logicalIndex; ///< The expected logical cursor index for each test. + bool* isCharacterHit; ///< The expected character hit value for each test. }; struct GetCursorPositionData { - std::string description; ///< Description of the test. - std::string text; ///< Input text. - unsigned int numberOfTests; ///< The number of tests. - CharacterIndex* logicalIndex; ///< The logical cursor index for each test. - float* visualX; ///< The expected visual 'x' position for each test. - float* visualY; ///< The expected visual 'y' position for each test. + std::string description; ///< Description of the test. + std::string text; ///< Input text. + unsigned int numberOfTests; ///< The number of tests. + CharacterIndex* logicalIndex; ///< The logical cursor index for each test. + float* visualX; ///< The expected visual 'x' position for each test. + float* visualY; ///< The expected visual 'y' position for each test. }; struct FindSelectionIndicesData { - std::string description; ///< Description of the test. - std::string text; ///< Input text. - unsigned int numberOfTests; ///< The number of tests. - float* visualX; ///< The visual 'x' position for each test. - float* visualY; ///< The visual 'y' position for each test. - bool* found; ///< Whether selection indices are found. - CharacterIndex* startIndex; ///< The expected start cursor index for each test. - CharacterIndex* endIndex; ///< The expected end cursor index for each test. - CharacterIndex* noTextHitIndex; ///< The expected character index when there is no hit. + std::string description; ///< Description of the test. + std::string text; ///< Input text. + unsigned int numberOfTests; ///< The number of tests. + float* visualX; ///< The visual 'x' position for each test. + float* visualY; ///< The visual 'y' position for each test. + bool* found; ///< Whether selection indices are found. + CharacterIndex* startIndex; ///< The expected start cursor index for each test. + CharacterIndex* endIndex; ///< The expected end cursor index for each test. + CharacterIndex* noTextHitIndex; ///< The expected character index when there is no hit. }; struct PrimaryCursorHeightData { - std::string description; ///< Description of the test. - std::string text; ///< Input text. - unsigned int numberOfTests; ///< The number of tests. - CharacterIndex* logicalIndex; ///< The logical cursor index for each test. - float* heights; ///< The expected primary cursor height for each test. + std::string description; ///< Description of the test. + std::string text; ///< Input text. + unsigned int numberOfTests; ///< The number of tests. + CharacterIndex* logicalIndex; ///< The logical cursor index for each test. + float* heights; ///< The expected primary cursor height for each test. }; -bool GetClosestLineTest( const GetClosestLineData& data ) +bool GetClosestLineTest(const GetClosestLineData& data) { std::cout << " testing : " << data.description << std::endl; // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(400.f, 600.f); - Size layoutSize; + Size textArea(400.f, 600.f); + Size layoutSize; Vector fontDescriptionRuns; - LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - for( unsigned int index = 0; index < data.numberOfTests; ++index ) + for(unsigned int index = 0; index < data.numberOfTests; ++index) { - bool isLineHit = false; - const LineIndex lineIndex = GetClosestLine( visualModel, - data.visualY[index], - isLineHit ); + bool isLineHit = false; + const LineIndex lineIndex = GetClosestLine(visualModel, + data.visualY[index], + isLineHit); - if( lineIndex != data.lineIndex[index] ) + if(lineIndex != data.lineIndex[index]) { std::cout << " test " << index << " failed. Different line index : " << lineIndex << ", expected : " << data.lineIndex[index] << std::endl; return false; } - if( isLineHit != data.isLineHit[index] ) + if(isLineHit != data.isLineHit[index]) { std::cout << " test " << index << " failed. Different line hit value : " << isLineHit << ", expected : " << data.isLineHit[index] << std::endl; return false; @@ -153,51 +154,53 @@ bool GetClosestLineTest( const GetClosestLineData& data ) return true; } -bool GetClosestCursorIndexTest( const GetClosestCursorIndexData& data ) +bool GetClosestCursorIndexTest(const GetClosestCursorIndexData& data) { std::cout << " testing : " << data.description << std::endl; // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(400.f, 600.f); - Size layoutSize; + Size textArea(400.f, 600.f); + Size layoutSize; Vector fontDescriptionRuns; - LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - for( unsigned int index = 0; index < data.numberOfTests; ++index ) + for(unsigned int index = 0; index < data.numberOfTests; ++index) { - bool isCharacterHit = false; - const CharacterIndex logicalCursorIndex = GetClosestCursorIndex( visualModel, - logicalModel, - metrics, - data.visualX[index], - data.visualY[index], - data.mode[index], - isCharacterHit ); - - if( logicalCursorIndex != data.logicalIndex[index] ) + bool isCharacterHit = false; + const CharacterIndex logicalCursorIndex = GetClosestCursorIndex(visualModel, + logicalModel, + metrics, + data.visualX[index], + data.visualY[index], + data.mode[index], + isCharacterHit); + + if(logicalCursorIndex != data.logicalIndex[index]) { std::cout << " test " << index << " failed. Different logical cursor index : " << logicalCursorIndex << ", expected : " << data.logicalIndex[index] << std::endl; return false; } - if( isCharacterHit != data.isCharacterHit[index] ) + if(isCharacterHit != data.isCharacterHit[index]) { std::cout << " test " << index << " failed. Different character hit value : " << isCharacterHit << ", expected : " << data.isCharacterHit[index] << std::endl; return false; @@ -207,55 +210,57 @@ bool GetClosestCursorIndexTest( const GetClosestCursorIndexData& data ) return true; } -bool GetCursorPositionTest( const GetCursorPositionData& data ) +bool GetCursorPositionTest(const GetCursorPositionData& data) { std::cout << " testing : " << data.description << std::endl; // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(400.f, 600.f); - Size layoutSize; + Size textArea(400.f, 600.f); + Size layoutSize; Vector fontDescriptionRuns; - LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; GetCursorPositionParameters parameters; - parameters.visualModel = visualModel; + parameters.visualModel = visualModel; parameters.logicalModel = logicalModel; - parameters.metrics = metrics; - parameters.isMultiline = true; + parameters.metrics = metrics; + parameters.isMultiline = true; - for( unsigned int index = 0; index < data.numberOfTests; ++index ) + for(unsigned int index = 0; index < data.numberOfTests; ++index) { CursorInfo cursorInfo; parameters.logical = data.logicalIndex[index]; - GetCursorPosition( parameters, - 0.f,// Since this test case is not testing the primary cursor height, the default font line height can be set to 0.f. - cursorInfo ); + GetCursorPosition(parameters, + 0.f, // Since this test case is not testing the primary cursor height, the default font line height can be set to 0.f. + cursorInfo); - if( floor(cursorInfo.primaryPosition.x) != data.visualX[index] ) + if(floor(cursorInfo.primaryPosition.x) != data.visualX[index]) { std::cout << " test " << index << " failed. Different 'x' cursor position : " << cursorInfo.primaryPosition.x << ", expected : " << data.visualX[index] << std::endl; return false; } - if( floor(cursorInfo.primaryPosition.y) != data.visualY[index] ) + if(floor(cursorInfo.primaryPosition.y) != data.visualY[index]) { std::cout << " test " << index << " failed. Different 'y' cursor position : " << cursorInfo.primaryPosition.y << ", expected : " << data.visualY[index] << std::endl; return false; @@ -265,64 +270,66 @@ bool GetCursorPositionTest( const GetCursorPositionData& data ) return true; } -bool FindSelectionIndicesTest( const FindSelectionIndicesData& data ) +bool FindSelectionIndicesTest(const FindSelectionIndicesData& data) { std::cout << " testing : " << data.description << std::endl; // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(400.f, 600.f); - Size layoutSize; + Size textArea(400.f, 600.f); + Size layoutSize; Vector fontDescriptionRuns; - LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - for( unsigned int index = 0; index < data.numberOfTests; ++index ) + for(unsigned int index = 0; index < data.numberOfTests; ++index) { - CharacterIndex startIndex = 0; - CharacterIndex endIndex = 0; + CharacterIndex startIndex = 0; + CharacterIndex endIndex = 0; CharacterIndex noTextHitIndex = 0; - const bool found = FindSelectionIndices( visualModel, - logicalModel, - metrics, - data.visualX[index], - data.visualY[index], - startIndex, - endIndex, - noTextHitIndex ); - - if( found != data.found[index] ) - { - std::cout << " test " << index << " failed. Different found value : " << found << ", expected : " << data.found[index] << std::endl; + const bool found = FindSelectionIndices(visualModel, + logicalModel, + metrics, + data.visualX[index], + data.visualY[index], + startIndex, + endIndex, + noTextHitIndex); + + if(found != data.found[index]) + { + std::cout << " test " << index << " failed. Different found value : " << found << ", expected : " << data.found[index] << std::endl; return false; } - if( startIndex != data.startIndex[index] ) + if(startIndex != data.startIndex[index]) { std::cout << " test " << index << " failed. Different start index : " << startIndex << ", expected : " << data.startIndex[index] << std::endl; return false; } - if( endIndex != data.endIndex[index] ) + if(endIndex != data.endIndex[index]) { std::cout << " test " << index << " failed. Different end index : " << endIndex << ", expected : " << data.endIndex[index] << std::endl; return false; } - if( noTextHitIndex != data.noTextHitIndex[index] ) + if(noTextHitIndex != data.noTextHitIndex[index]) { std::cout << " test " << index << " failed. Different no text hit index : " << noTextHitIndex << ", expected : " << data.noTextHitIndex[index] << std::endl; return false; @@ -331,84 +338,86 @@ bool FindSelectionIndicesTest( const FindSelectionIndicesData& data ) return true; } -bool PrimaryCursorHeightTest( const PrimaryCursorHeightData& data ) +bool PrimaryCursorHeightTest(const PrimaryCursorHeightData& data) { std::cout << " testing : " << data.description << std::endl; // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(400.f, 600.f); - Size layoutSize; + Size textArea(400.f, 600.f); + Size layoutSize; Vector fontDescriptionRuns; - const std::string fontFamily( "DejaVuSans" ); + const std::string fontFamily("DejaVuSans"); // Set a known font description FontDescriptionRun fontDescriptionRun1; - fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.characterIndex = 0u; fontDescriptionRun1.characterRun.numberOfCharacters = 13u; - fontDescriptionRun1.familyLength = fontFamily.size(); - fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; - memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength ); + fontDescriptionRun1.familyLength = fontFamily.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength); fontDescriptionRun1.familyDefined = true; fontDescriptionRun1.weightDefined = false; - fontDescriptionRun1.widthDefined = false; - fontDescriptionRun1.slantDefined = false; - fontDescriptionRun1.sizeDefined = true; - fontDescriptionRun1.size = 768u;//Font size = 12.0f (768/64 = 12) + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = true; + fontDescriptionRun1.size = 768u; //Font size = 12.0f (768/64 = 12) - fontDescriptionRuns.PushBack( fontDescriptionRun1 ); + fontDescriptionRuns.PushBack(fontDescriptionRun1); LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 50.f ); + CreateTextModel(data.text, + textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 50.0f, // lineSpacing + 50.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; GetCursorPositionParameters parameters; - parameters.visualModel = visualModel; + parameters.visualModel = visualModel; parameters.logicalModel = logicalModel; - parameters.metrics = metrics; - parameters.isMultiline = true; + parameters.metrics = metrics; + parameters.isMultiline = true; - for( unsigned int index = 0; index < data.numberOfTests; ++index ) + for(unsigned int index = 0; index < data.numberOfTests; ++index) { CursorInfo cursorInfo; parameters.logical = data.logicalIndex[index]; // Load some fonts. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 93u, 93u ); + fontClient.SetDpi(93u, 93u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - FontId fontID = fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSans.ttf" ); + FontId fontID = fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSans.ttf"); Text::FontMetrics fontMetrics; - MetricsPtr mMetrics = Metrics::New(fontClient); + MetricsPtr mMetrics = Metrics::New(fontClient); mMetrics->GetFontMetrics(fontID, fontMetrics); float defaultFontLineHeight = (fontMetrics.ascender - fontMetrics.descender); - GetCursorPosition( parameters, - defaultFontLineHeight, - cursorInfo ); + GetCursorPosition(parameters, + defaultFontLineHeight, + cursorInfo); - if( floor(cursorInfo.primaryCursorHeight) != data.heights[index] ) + if(floor(cursorInfo.primaryCursorHeight) != data.heights[index]) { std::cout << " test " << index << " failed. Different primaryCursorHeight : " << cursorInfo.primaryCursorHeight << ", expected : " << data.heights[index] << std::endl; return false; @@ -434,56 +443,49 @@ int UtcDaliGetClosestLine(void) { tet_infoline(" UtcDaliGetClosestLine"); - float visualY01[] = { -4.f, 3.f, 1000.f }; - LineIndex lineIndices01[] = { 0, 0, 0 }; - bool isLineHit01[] = { false, false, false }; + float visualY01[] = {-4.f, 3.f, 1000.f}; + LineIndex lineIndices01[] = {0, 0, 0}; + bool isLineHit01[] = {false, false, false}; - float visualY02[] = { -4.f, 3.f, 1000.f }; - LineIndex lineIndices02[] = { 0, 0, 0 }; - bool isLineHit02[] = { false, true, false }; + float visualY02[] = {-4.f, 3.f, 1000.f}; + LineIndex lineIndices02[] = {0, 0, 0}; + bool isLineHit02[] = {false, true, false}; - float visualY03[] = { -4.f, 11.f, 30.f, 51.f, 68.f, 87.f, 109.f, 130.f }; - LineIndex lineIndices03[] = { 0, 0, 1u, 2u, 3u, 4u, 5u, 5u }; - bool isLineHit03[] = { false, true, true, true, true, true, true, false }; + float visualY03[] = {-4.f, 11.f, 30.f, 51.f, 68.f, 87.f, 109.f, 130.f}; + LineIndex lineIndices03[] = {0, 0, 1u, 2u, 3u, 4u, 5u, 5u}; + bool isLineHit03[] = {false, true, true, true, true, true, true, false}; struct GetClosestLineData data[] = - { - { - "void text.", - "", - 3u, - visualY01, - lineIndices01, - isLineHit01 - }, - { - "Single line text.", - "hello world", - 3u, - visualY02, - lineIndices02, - isLineHit02 - }, { - "Multi-line text.", - "abcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuדאוvwxה" - "סתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuד" - "אוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqr" - "פרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmno" - "צמםpqrפרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjkl" - "חלךmnoצמםpqrפרףstuדאוvwxהסתyzטזץ", - 8u, - visualY03, - lineIndices03, - isLineHit03 - } - }; + {"void text.", + "", + 3u, + visualY01, + lineIndices01, + isLineHit01}, + {"Single line text.", + "hello world", + 3u, + visualY02, + lineIndices02, + isLineHit02}, + {"Multi-line text.", + "abcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuדאוvwxה" + "סתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuד" + "אוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqr" + "פרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmno" + "צמםpqrפרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjkl" + "חלךmnoצמםpqrפרףstuדאוvwxהסתyzטזץ", + 8u, + visualY03, + lineIndices03, + isLineHit03}}; const unsigned int numberOfTests = 3u; - for( unsigned int index = 0; index < numberOfTests; ++index ) + for(unsigned int index = 0; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !GetClosestLineTest( data[index] ) ) + if(!GetClosestLineTest(data[index])) { tet_result(TET_FAIL); } @@ -497,23 +499,23 @@ int UtcDaliGetClosestCursorIndex(void) { tet_infoline(" UtcDaliGetClosestCursorIndex"); - float visualX01[] = { -100.f }; - float visualY01[] = { -100.f }; - CharacterHitTest::Mode mode01[] = { CharacterHitTest::TAP }; - CharacterIndex logicalIndex01[] = { 0 }; - bool isCharacterHit01[] = { false }; + float visualX01[] = {-100.f}; + float visualY01[] = {-100.f}; + CharacterHitTest::Mode mode01[] = {CharacterHitTest::TAP}; + CharacterIndex logicalIndex01[] = {0}; + bool isCharacterHit01[] = {false}; - float visualX02[] = { -100.f, 1000.f, 60.f, 79.f, 83.f, 148.f, 99.f }; - float visualY02[] = { -100.f, 1000.f, 12.f, 12.f, 12.f, 12.f, 12.f }; - CharacterHitTest::Mode mode02[] = { CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP }; - CharacterIndex logicalIndex02[] = { 0, 21u, 7u, 10u, 10u, 14u, 12u }; - bool isCharacterHit02[] = { false, false, true, true, true, true, true }; + float visualX02[] = {-100.f, 1000.f, 60.f, 79.f, 83.f, 148.f, 99.f}; + float visualY02[] = {-100.f, 1000.f, 12.f, 12.f, 12.f, 12.f, 12.f}; + CharacterHitTest::Mode mode02[] = {CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP}; + CharacterIndex logicalIndex02[] = {0, 21u, 7u, 10u, 10u, 14u, 12u}; + bool isCharacterHit02[] = {false, false, true, true, true, true, true}; - float visualX03[] = { 19.f, 104.f, -2.f, 127.f }; - float visualY03[] = { 12.f, 12.f, 12.f, 12.f }; - CharacterHitTest::Mode mode03[] = { CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP }; - CharacterIndex logicalIndex03[] = { 3u, 13u, 0, 18u }; - bool isCharacterHit03[] = { true, true, false, false }; + float visualX03[] = {19.f, 104.f, -2.f, 127.f}; + float visualY03[] = {12.f, 12.f, 12.f, 12.f}; + CharacterHitTest::Mode mode03[] = {CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP}; + CharacterIndex logicalIndex03[] = {3u, 13u, 0, 18u}; + bool isCharacterHit03[] = {true, true, false, false}; // 0 5 _ 6 11 12 // Hello world \n @@ -521,22 +523,11 @@ int UtcDaliGetClosestCursorIndex(void) // שלום עולם \n // 22 31_32 40 41 // different الأربعاء \n - float visualX04[] = { -100.f, 40.f, 44.f, 85.f, 500.f, - 500.f, 367.f, 359.f, 329.f, -100.f, - -100.f, 19.f, 64.f, 72.f, 104.f, 111.f, 500.f}; - float visualY04[] = { -100.f, 12.f, 12.f, 12.f, 12.f, - 30.f, 30.f, 30.f, 30.f, 30.f, - 50.f, 50.f, 50.f, 50.f, 50.f, 50.f, 50.f }; - CharacterHitTest::Mode mode04[] = { CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP }; - CharacterIndex logicalIndex04[] = { 0, 5u, 6u, 11u, 11u, - 12u, 16u, 17u, 21u, 21u, - 22u, 25u, 30u, 32u, 35u, 34u, 40u, - 41u }; - bool isCharacterHit04[] = { false, true, true, true, false, - false, true, true, true, false, - false, true, true, true, true, true, false }; + float visualX04[] = {-100.f, 40.f, 44.f, 85.f, 500.f, 500.f, 367.f, 359.f, 329.f, -100.f, -100.f, 19.f, 64.f, 72.f, 104.f, 111.f, 500.f}; + float visualY04[] = {-100.f, 12.f, 12.f, 12.f, 12.f, 30.f, 30.f, 30.f, 30.f, 30.f, 50.f, 50.f, 50.f, 50.f, 50.f, 50.f, 50.f}; + CharacterHitTest::Mode mode04[] = {CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP}; + CharacterIndex logicalIndex04[] = {0, 5u, 6u, 11u, 11u, 12u, 16u, 17u, 21u, 21u, 22u, 25u, 30u, 32u, 35u, 34u, 40u, 41u}; + bool isCharacterHit04[] = {false, true, true, true, false, false, true, true, true, false, false, true, true, true, true, true, false}; // 0 10 20 30 40 46 // abcשנבdefג קכghiעיןjk lחלךmnoצמם pqrפרףstuד אוvwxה @@ -551,36 +542,11 @@ int UtcDaliGetClosestCursorIndex(void) // 233 240 250 260 265 // חלךmnoצ מםpqrפרףst uדאוvwxהסת yzטזץ - float visualX05[] = { -100.f, 96.f, 155.f, 250.f, 344.f, 500.f, - -100.f, 36.f, 124.f, 190.f, 280.f, 500.f, - -100.f, 56.f, 158.f, 237.f, 303.f, 500.f, - -100.f, 98.f, 184.f, 261.f, 337.f, 500.f, - -100.f, 40.f, 113.f, 223.f, 302.f, 500.f, - -100.f, 82.f, 160.f, 253.f, 500.f }; - float visualY05[] = { -100.f, 12.f, 12.f, 12.f, 12.f, 12.f, - 30.f, 30.f, 30.f, 30.f, 30.f, 30.f, - 50.f, 50.f, 50.f, 50.f, 50.f, 50.f, - 67.f, 67.f, 67.f, 67.f, 67.f, 67.f, - 87.f, 87.f, 87.f, 87.f, 87.f, 87.f, - 107.f, 107.f, 107.f, 107.f, 107.f }; - CharacterHitTest::Mode mode05[] = { CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP }; - CharacterIndex logicalIndex05[] = { 0, 10u, 19u, 28u, 39u, 44u, - 45u, 48u, 59u, 66u, 78u, 87u, - 89u, 96u, 106u, 115u, 124u, 133u, - 134u, 145u, 154u, 162u, 171u, 179u, - 180u, 184u, 191u, 203u, 212u, - 221u, 222u, 233u, 241u, 251u, 265u }; - bool isCharacterHit05[] = { false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, false }; + float visualX05[] = {-100.f, 96.f, 155.f, 250.f, 344.f, 500.f, -100.f, 36.f, 124.f, 190.f, 280.f, 500.f, -100.f, 56.f, 158.f, 237.f, 303.f, 500.f, -100.f, 98.f, 184.f, 261.f, 337.f, 500.f, -100.f, 40.f, 113.f, 223.f, 302.f, 500.f, -100.f, 82.f, 160.f, 253.f, 500.f}; + float visualY05[] = {-100.f, 12.f, 12.f, 12.f, 12.f, 12.f, 30.f, 30.f, 30.f, 30.f, 30.f, 30.f, 50.f, 50.f, 50.f, 50.f, 50.f, 50.f, 67.f, 67.f, 67.f, 67.f, 67.f, 67.f, 87.f, 87.f, 87.f, 87.f, 87.f, 87.f, 107.f, 107.f, 107.f, 107.f, 107.f}; + CharacterHitTest::Mode mode05[] = {CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP}; + CharacterIndex logicalIndex05[] = {0, 10u, 19u, 28u, 39u, 44u, 45u, 48u, 59u, 66u, 78u, 87u, 89u, 96u, 106u, 115u, 124u, 133u, 134u, 145u, 154u, 162u, 171u, 179u, 180u, 184u, 191u, 203u, 212u, 221u, 222u, 233u, 241u, 251u, 265u}; + bool isCharacterHit05[] = {false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, false}; // 0 10 20 30 40 46 // שנבabcגקכd efעיןghiחל ךjklצמםmno פרףpqrדאוs tuהסתv @@ -595,150 +561,108 @@ int UtcDaliGetClosestCursorIndex(void) // 232 240 250 260 265 // ךjklצמםm noפרףpqrדא וstuהסתvwx טזץyz - float visualX06[] = { 500.f, 307.f, 237.f, 148.f, 55.f, -100.f, - 500.f, 362.f, 276.f, 213.f, 121.f, -100.f, - 500.f, 344.f, 238.f, 167.f, 93.f, -100.f, - 500.f, 306.f, 216.f, 142.f, 58.f, -100.f, - 500.f, 355.f, 279.f, 182.f, 92.f, -100.f, - 500.f, 326.f, 238.f, 150.f, -100.f }; - float visualY06[] = { -100.f, 12.f, 12.f, 12.f, 12.f, 12.f, - 30.f, 30.f, 30.f, 30.f, 30.f, 30.f, - 50.f, 50.f, 50.f, 50.f, 50.f, 50.f, - 67.f, 67.f, 67.f, 67.f, 67.f, 67.f, - 87.f, 87.f, 87.f, 87.f, 87.f, 87.f, - 107.f, 107.f, 107.f, 107.f, 107.f }; - CharacterHitTest::Mode mode06[] = { CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, - CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP }; - CharacterIndex logicalIndex06[] = { 0, 11u, 19u, 28u, 39u, 44u, - 45u, 48u, 57u, 65u, 78u, 87u, - 89u, 96u, 107u, 114u, 124u, 133u, - 134u, 144u, 154u, 162u, 171u, 178u, - 179u, 185u, 192u, 203u, 212u, 221u, - 222u, 232u, 240u, 251u, 265u }; - bool isCharacterHit06[] = { false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, true, false, - false, true, true, true, false }; - - float visualX07[] = { 395.f }; - float visualY07[] = { 12.f }; - CharacterHitTest::Mode mode07[] = { CharacterHitTest::TAP }; - CharacterIndex logicalIndex07[] = { 1u }; - bool isCharacterHit07[] = { true }; - - float visualX08[] = { 7.f }; - float visualY08[] = { 12.f }; - CharacterHitTest::Mode mode08[] = { CharacterHitTest::TAP }; - CharacterIndex logicalIndex08[] = { 1u }; - bool isCharacterHit08[] = { true }; + float visualX06[] = {500.f, 307.f, 237.f, 148.f, 55.f, -100.f, 500.f, 362.f, 276.f, 213.f, 121.f, -100.f, 500.f, 344.f, 238.f, 167.f, 93.f, -100.f, 500.f, 306.f, 216.f, 142.f, 58.f, -100.f, 500.f, 355.f, 279.f, 182.f, 92.f, -100.f, 500.f, 326.f, 238.f, 150.f, -100.f}; + float visualY06[] = {-100.f, 12.f, 12.f, 12.f, 12.f, 12.f, 30.f, 30.f, 30.f, 30.f, 30.f, 30.f, 50.f, 50.f, 50.f, 50.f, 50.f, 50.f, 67.f, 67.f, 67.f, 67.f, 67.f, 67.f, 87.f, 87.f, 87.f, 87.f, 87.f, 87.f, 107.f, 107.f, 107.f, 107.f, 107.f}; + CharacterHitTest::Mode mode06[] = {CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP, CharacterHitTest::TAP}; + CharacterIndex logicalIndex06[] = {0, 11u, 19u, 28u, 39u, 44u, 45u, 48u, 57u, 65u, 78u, 87u, 89u, 96u, 107u, 114u, 124u, 133u, 134u, 144u, 154u, 162u, 171u, 178u, 179u, 185u, 192u, 203u, 212u, 221u, 222u, 232u, 240u, 251u, 265u}; + bool isCharacterHit06[] = {false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, true, false, false, true, true, true, false}; + + float visualX07[] = {395.f}; + float visualY07[] = {12.f}; + CharacterHitTest::Mode mode07[] = {CharacterHitTest::TAP}; + CharacterIndex logicalIndex07[] = {1u}; + bool isCharacterHit07[] = {true}; + + float visualX08[] = {7.f}; + float visualY08[] = {12.f}; + CharacterHitTest::Mode mode08[] = {CharacterHitTest::TAP}; + CharacterIndex logicalIndex08[] = {1u}; + bool isCharacterHit08[] = {true}; struct GetClosestCursorIndexData data[] = - { { - "Void text.", - "", - 1u, - visualX01, - visualY01, - mode01, - logicalIndex01, - isCharacterHit01 - }, - { - "Single line text.", - "Hello world שלום עולם", - 7u, - visualX02, - visualY02, - mode02, - logicalIndex02, - isCharacterHit02 - }, - { - "Single line with ligatures", - "different الأربعاء", - 4u, - visualX03, - visualY03, - mode03, - logicalIndex03, - isCharacterHit03 - }, - { - "Multiline. Single line paragraphs", - "Hello world\n" - "שלום עולם\n" - "different الأربعاء\n", - 17u, - visualX04, - visualY04, - mode04, - logicalIndex04, - isCharacterHit04 - }, - { - "Multiline. Single bidirectional paragraph, starts LTR, wrapped lines", - "abcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuדאוvwxה" - "סתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuד" - "אוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqr" - "פרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmno" - "צמםpqrפרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjkl" - "חלךmnoצמםpqrפרףstuדאוvwxהסתyzטזץ", - 35u, - visualX05, - visualY05, - mode05, - logicalIndex05, - isCharacterHit05 - }, - { - "Multiline. Single bidirectional paragraph, starts RTL, wrapped lines", - "שנבabcגקכdefעיןghiחלךjklצמםmnoפרףpqrדאוstuהסתv" - "wxטזץyzשנבabcגקכdefעיןghiחלךjklצמםmnoפרףpqrדאוs" - "tuהסתvwxטזץyzשנבabcגקכdefעיןghiחלךjklצמםmnoפרף" - "pqrדאוstuהסתvwxטזץyzשנבabcגקכdefעיןghiחלךjklצמם" - "mnoפרףpqrדאוstuהסתvwxטזץyzשנבabcגקכdefעיןghiחל" - "ךjklצמםmnoפרףpqrדאוstuהסתvwxטזץyz", - 35u, - visualX06, - visualY06, - mode06, - logicalIndex06, - isCharacterHit06 - }, - { - "Testing complex characters. Arabic ligatures", - "الأَبْجَدِيَّة العَرَبِيَّة", - 1u, - visualX07, - visualY07, - mode07, - logicalIndex07, - isCharacterHit07 - }, - { - "Testing complex characters. Latin ligatures", - "fi ligature", - 1u, - visualX08, - visualY08, - mode08, - logicalIndex08, - isCharacterHit08 - } - }; + {"Void text.", + "", + 1u, + visualX01, + visualY01, + mode01, + logicalIndex01, + isCharacterHit01}, + {"Single line text.", + "Hello world שלום עולם", + 7u, + visualX02, + visualY02, + mode02, + logicalIndex02, + isCharacterHit02}, + {"Single line with ligatures", + "different الأربعاء", + 4u, + visualX03, + visualY03, + mode03, + logicalIndex03, + isCharacterHit03}, + {"Multiline. Single line paragraphs", + "Hello world\n" + "שלום עולם\n" + "different الأربعاء\n", + 17u, + visualX04, + visualY04, + mode04, + logicalIndex04, + isCharacterHit04}, + {"Multiline. Single bidirectional paragraph, starts LTR, wrapped lines", + "abcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuדאוvwxה" + "סתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqrפרףstuד" + "אוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmnoצמםpqr" + "פרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjklחלךmno" + "צמםpqrפרףstuדאוvwxהסתyzטזץabcשנבdefגקכghiעיןjkl" + "חלךmnoצמםpqrפרףstuדאוvwxהסתyzטזץ", + 35u, + visualX05, + visualY05, + mode05, + logicalIndex05, + isCharacterHit05}, + {"Multiline. Single bidirectional paragraph, starts RTL, wrapped lines", + "שנבabcגקכdefעיןghiחלךjklצמםmnoפרףpqrדאוstuהסתv" + "wxטזץyzשנבabcגקכdefעיןghiחלךjklצמםmnoפרףpqrדאוs" + "tuהסתvwxטזץyzשנבabcגקכdefעיןghiחלךjklצמםmnoפרף" + "pqrדאוstuהסתvwxטזץyzשנבabcגקכdefעיןghiחלךjklצמם" + "mnoפרףpqrדאוstuהסתvwxטזץyzשנבabcגקכdefעיןghiחל" + "ךjklצמםmnoפרףpqrדאוstuהסתvwxטזץyz", + 35u, + visualX06, + visualY06, + mode06, + logicalIndex06, + isCharacterHit06}, + {"Testing complex characters. Arabic ligatures", + "الأَبْجَدِيَّة العَرَبِيَّة", + 1u, + visualX07, + visualY07, + mode07, + logicalIndex07, + isCharacterHit07}, + {"Testing complex characters. Latin ligatures", + "fi ligature", + 1u, + visualX08, + visualY08, + mode08, + logicalIndex08, + isCharacterHit08}}; const unsigned int numberOfTests = 8u; - for( unsigned int index = 0; index < numberOfTests; ++index ) + for(unsigned int index = 0; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !GetClosestCursorIndexTest( data[index] ) ) + if(!GetClosestCursorIndexTest(data[index])) { tet_result(TET_FAIL); } @@ -752,27 +676,26 @@ int UtcDaliGetCursorPosition(void) { tet_infoline(" UtcDaliGetCursorPosition"); - float visualX08[] = { 5.f }; - float visualY08[] = { 0.f }; - CharacterIndex logicalIndex08[] = { 1u }; + float visualX08[] = {5.f}; + float visualY08[] = {0.f}; + CharacterIndex logicalIndex08[] = {1u}; struct GetCursorPositionData data[] = - { { - "Testing complex characters. Latin ligatures", - "fi ligature", - 1u, - logicalIndex08, - visualX08, - visualY08, - } - }; + { + "Testing complex characters. Latin ligatures", + "fi ligature", + 1u, + logicalIndex08, + visualX08, + visualY08, + }}; const unsigned int numberOfTests = 1u; - for( unsigned int index = 0; index < numberOfTests; ++index ) + for(unsigned int index = 0; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !GetCursorPositionTest( data[index] ) ) + if(!GetCursorPositionTest(data[index])) { tet_result(TET_FAIL); } @@ -786,123 +709,111 @@ int UtcDaliFindSelectionIndices(void) { tet_infoline(" UtcDaliFindSelectionIndices"); - float visualX01[] = { -100.f }; - float visualY01[] = { -100.f }; - bool found01[] = { false }; - CharacterIndex startIndex01[] = { 0 }; - CharacterIndex endIndex01[] = { 0 }; - CharacterIndex noHitText01[] = { 0 }; - - float visualX02[] = { -100.f, 1000.f, 1000.f }; - float visualY02[] = { -100.f, 12.f, 1000.f }; - bool found02[] = { false, false, false }; - CharacterIndex startIndex02[] = { 0, 6u, 6u }; - CharacterIndex endIndex02[] = { 5u, 11u, 11u }; - CharacterIndex noHitText02[] = { 0, 11u, 11u }; - - float visualX03[] = { 70.f }; - float visualY03[] = { 12.f }; - bool found03[] = { true }; - CharacterIndex startIndex03[] = { 6u }; - CharacterIndex endIndex03[] = { 11u }; - CharacterIndex noHitText03[] = { 0u }; - - float visualX04[] = { 131.f }; - float visualY04[] = { 12.f }; - bool found04[] = { true }; - CharacterIndex startIndex04[] = { 12u }; - CharacterIndex endIndex04[] = { 16u }; - CharacterIndex noHitText04[] = { 0u }; - - float visualX05[] = { 0.f }; - float visualY05[] = { 12.f }; - bool found05[] = { true }; - CharacterIndex startIndex05[] = { 0 }; - CharacterIndex endIndex05[] = { 1u }; - CharacterIndex noHitText05[] = { 0 }; - - float visualX06[] = { 10.f }; - float visualY06[] = { 12.f }; - bool found06[] = { true }; - CharacterIndex startIndex06[] = { 0 }; - CharacterIndex endIndex06[] = { 1u }; - CharacterIndex noHitText06[] = { 0u }; + float visualX01[] = {-100.f}; + float visualY01[] = {-100.f}; + bool found01[] = {false}; + CharacterIndex startIndex01[] = {0}; + CharacterIndex endIndex01[] = {0}; + CharacterIndex noHitText01[] = {0}; + + float visualX02[] = {-100.f, 1000.f, 1000.f}; + float visualY02[] = {-100.f, 12.f, 1000.f}; + bool found02[] = {false, false, false}; + CharacterIndex startIndex02[] = {0, 6u, 6u}; + CharacterIndex endIndex02[] = {5u, 11u, 11u}; + CharacterIndex noHitText02[] = {0, 11u, 11u}; + + float visualX03[] = {70.f}; + float visualY03[] = {12.f}; + bool found03[] = {true}; + CharacterIndex startIndex03[] = {6u}; + CharacterIndex endIndex03[] = {11u}; + CharacterIndex noHitText03[] = {0u}; + + float visualX04[] = {131.f}; + float visualY04[] = {12.f}; + bool found04[] = {true}; + CharacterIndex startIndex04[] = {12u}; + CharacterIndex endIndex04[] = {16u}; + CharacterIndex noHitText04[] = {0u}; + + float visualX05[] = {0.f}; + float visualY05[] = {12.f}; + bool found05[] = {true}; + CharacterIndex startIndex05[] = {0}; + CharacterIndex endIndex05[] = {1u}; + CharacterIndex noHitText05[] = {0}; + + float visualX06[] = {10.f}; + float visualY06[] = {12.f}; + bool found06[] = {true}; + CharacterIndex startIndex06[] = {0}; + CharacterIndex endIndex06[] = {1u}; + CharacterIndex noHitText06[] = {0u}; struct FindSelectionIndicesData data[] = - { - { - "void text", - "", - 1u, - visualX01, - visualY01, - found01, - startIndex01, - endIndex01, - noHitText01 - }, - { - "touch out of text's boundaries", - "Hello world", - 3u, - visualX02, - visualY02, - found02, - startIndex02, - endIndex02, - noHitText02 - }, - { - "touch on the text", - "Hello world demo", - 1u, - visualX03, - visualY03, - found03, - startIndex03, - endIndex03, - noHitText03 - }, { - "touch on the new paragraph character at the end of line", - "Hello world demo\n", - 1u, - visualX04, - visualY04, - found04, - startIndex04, - endIndex04, - noHitText04 - }, - { - "touch on a white space character. is the unique character of the line", - " ", - 1u, - visualX05, - visualY05, - found05, - startIndex05, - endIndex05, - noHitText05 - }, - { - "touch on a white space character. is between two words", - "h ello", - 1u, - visualX06, - visualY06, - found06, - startIndex06, - endIndex06, - noHitText06 - }, - }; + {"void text", + "", + 1u, + visualX01, + visualY01, + found01, + startIndex01, + endIndex01, + noHitText01}, + {"touch out of text's boundaries", + "Hello world", + 3u, + visualX02, + visualY02, + found02, + startIndex02, + endIndex02, + noHitText02}, + {"touch on the text", + "Hello world demo", + 1u, + visualX03, + visualY03, + found03, + startIndex03, + endIndex03, + noHitText03}, + {"touch on the new paragraph character at the end of line", + "Hello world demo\n", + 1u, + visualX04, + visualY04, + found04, + startIndex04, + endIndex04, + noHitText04}, + {"touch on a white space character. is the unique character of the line", + " ", + 1u, + visualX05, + visualY05, + found05, + startIndex05, + endIndex05, + noHitText05}, + {"touch on a white space character. is between two words", + "h ello", + 1u, + visualX06, + visualY06, + found06, + startIndex06, + endIndex06, + noHitText06}, + }; const unsigned int numberOfTests = 6u; - for( unsigned int index = 0; index < numberOfTests; ++index ) + for(unsigned int index = 0; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !FindSelectionIndicesTest( data[index] ) ) + if(!FindSelectionIndicesTest(data[index])) { tet_result(TET_FAIL); } @@ -916,25 +827,24 @@ int UtcDaliPrimaryCursorHeight(void) { tet_infoline(" UtcDaliPrimaryCursorHeight"); - float heights[] = { 19.f }; - CharacterIndex logicalIndex[] = { 1u }; + float heights[] = {19.f}; + CharacterIndex logicalIndex[] = {1u}; struct PrimaryCursorHeightData data[] = - { { - "Testing primary cursor height when line spacing is used.", - "Hello World", - 1u, - logicalIndex, - heights, - } - }; + { + "Testing primary cursor height when line spacing is used.", + "Hello World", + 1u, + logicalIndex, + heights, + }}; const unsigned int numberOfTests = 1u; - for( unsigned int index = 0; index < numberOfTests; ++index ) + for(unsigned int index = 0; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !PrimaryCursorHeightTest( data[index] ) ) + if(!PrimaryCursorHeightTest(data[index])) { tet_result(TET_FAIL); } diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Hyphen-Wrapping.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Hyphen-Wrapping.cpp index 4f1d0f5..60781d0 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Hyphen-Wrapping.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Hyphen-Wrapping.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,33 +15,31 @@ * */ -#include #include #include +#include +#include +#include #include #include #include -#include -#include #include using namespace Dali; using namespace Toolkit; using namespace Text; - namespace { - -const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); +const std::string DEFAULT_FONT_DIR("/resources/fonts"); struct LayoutTextData { std::string text; Size textArea; unsigned int numberOfFonts; - FontDescriptionRun *fontDescriptions; + FontDescriptionRun* fontDescriptions; unsigned int numberOfLines; LineRun* lines; Layout::Engine::Type layout; @@ -50,81 +48,83 @@ struct LayoutTextData Text::LineWrap::Mode wrapMode; }; -void Print( const LineRun& line ) +void Print(const LineRun& line) { std::cout << " glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl; std::cout << " character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl; } -bool LayoutTextTest( const LayoutTextData& data ) +bool LayoutTextTest(const LayoutTextData& data) { // Load some fonts. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 96u, 96u ); + fontClient.SetDpi(96u, 96u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" ); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf"); // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size layoutSize; + Size layoutSize; Vector fontDescriptionRuns; - if( 0u != data.numberOfFonts ) + if(0u != data.numberOfFonts) { - fontDescriptionRuns.Insert( fontDescriptionRuns.End(), - data.fontDescriptions, - data.fontDescriptions + data.numberOfFonts ); + fontDescriptionRuns.Insert(fontDescriptionRuns.End(), + data.fontDescriptions, + data.fontDescriptions + data.numberOfFonts); } LayoutOptions options; options.align = false; - CreateTextModel( data.text, - data.textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - data.wrapMode, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + CreateTextModel(data.text, + data.textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + data.wrapMode, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); Vector& lines = textModel->mVisualModel->mLines; // 4) Compare the results. - if( lines.Count() != data.numberOfLines ) + if(lines.Count() != data.numberOfLines) { std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl; return false; } - for( unsigned int index = 0u; index < data.numberOfLines; ++index ) + for(unsigned int index = 0u; index < data.numberOfLines; ++index) { - const LineRun& line = *( lines.Begin() + index ); - const LineRun& expectedLine = *( data.lines + index ); + const LineRun& line = *(lines.Begin() + index); + const LineRun& expectedLine = *(data.lines + index); - if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex ) + if(line.characterRun.characterIndex != expectedLine.characterRun.characterIndex) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters ) + if(line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } } @@ -134,7 +134,6 @@ bool LayoutTextTest( const LayoutTextData& data ) } // namespace - int UtcDaliTextHyphenWrapping(void) { ToolkitTestApplication application; @@ -142,71 +141,68 @@ int UtcDaliTextHyphenWrapping(void) // Layout some lines of left to right text. - const std::string fontFamily( "TizenSans" ); + const std::string fontFamily("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun1; - fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.characterIndex = 0u; fontDescriptionRun1.characterRun.numberOfCharacters = 13u; - fontDescriptionRun1.familyLength = fontFamily.size(); - fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; - memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength ); + fontDescriptionRun1.familyLength = fontFamily.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength); fontDescriptionRun1.familyDefined = true; fontDescriptionRun1.weightDefined = false; - fontDescriptionRun1.widthDefined = false; - fontDescriptionRun1.slantDefined = false; - fontDescriptionRun1.sizeDefined = false; + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun1 ); + fontDescriptionRuns.PushBack(fontDescriptionRun1); Size textArea(65.0f, 200.f); LineRun line1 = - { - { 0u, 5u }, - { 0u, 5u }, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 5u}, + {0u, 5u}, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + false, + false}; LineRun line2 = - { - { 5u, 8u }, - { 5u, 8u }, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {5u, 8u}, + {5u, 8u}, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line1 ); - lines.PushBack( line2 ); + lines.PushBack(line1); + lines.PushBack(line2); LayoutTextData data = - { - "Hi Experiment", - textArea, - 1u, - fontDescriptionRuns.Begin(), - 2u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 13u, - (Text::LineWrap::Mode)DevelText::LineWrap::HYPHENATION - }; - - if( !LayoutTextTest( data ) ) + { + "Hi Experiment", + textArea, + 1u, + fontDescriptionRuns.Begin(), + 2u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 13u, + (Text::LineWrap::Mode)DevelText::LineWrap::HYPHENATION}; + + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -222,85 +218,81 @@ int UtcDaliTextMixedWrapping(void) // Layout some lines of left to right text. - const std::string fontFamily( "DejaVuSans" ); + const std::string fontFamily("DejaVuSans"); // Set a known font description FontDescriptionRun fontDescriptionRun1; - fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.characterIndex = 0u; fontDescriptionRun1.characterRun.numberOfCharacters = 13u; - fontDescriptionRun1.familyLength = fontFamily.size(); - fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; - memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength ); + fontDescriptionRun1.familyLength = fontFamily.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength); fontDescriptionRun1.familyDefined = true; fontDescriptionRun1.weightDefined = false; - fontDescriptionRun1.widthDefined = false; - fontDescriptionRun1.slantDefined = false; - fontDescriptionRun1.sizeDefined = false; + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun1 ); + fontDescriptionRuns.PushBack(fontDescriptionRun1); Size textArea(72.0f, 200.f); LineRun line1 = - { - { 0u, 3u }, - { 0u, 3u }, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 3u}, + {0u, 3u}, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + false, + false}; LineRun line2 = - { - { 3u, 6u }, - { 3u, 6u }, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {3u, 6u}, + {3u, 6u}, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + false, + false}; LineRun line3 = - { - { 9u, 4u }, - { 9u, 4u }, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {9u, 4u}, + {9u, 4u}, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line1 ); - lines.PushBack( line2 ); - lines.PushBack( line3 ); + lines.PushBack(line1); + lines.PushBack(line2); + lines.PushBack(line3); LayoutTextData data = - { - "Hi Experiment", - textArea, - 1u, - fontDescriptionRuns.Begin(), - 3u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 13u, - (Text::LineWrap::Mode)DevelText::LineWrap::MIXED - }; - - if( !LayoutTextTest( data ) ) + { + "Hi Experiment", + textArea, + 1u, + fontDescriptionRuns.Begin(), + 3u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 13u, + (Text::LineWrap::Mode)DevelText::LineWrap::MIXED}; + + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp index b50ab83..9b71156 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Layout.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,15 +15,15 @@ * */ -#include #include #include +#include +#include +#include #include #include #include -#include -#include #include using namespace Dali; @@ -36,30 +36,29 @@ using namespace Text; namespace { - -const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); +const std::string DEFAULT_FONT_DIR("/resources/fonts"); struct LayoutTextData { - std::string description; - std::string text; - Size textArea; - unsigned int numberOfFonts; - FontDescriptionRun* fontDescriptions; - Size layoutSize; - unsigned int totalNumberOfGlyphs; - float* positions; - unsigned int numberOfLines; - LineRun* lines; - Layout::Engine::Type layout; - unsigned int startIndex; - unsigned int numberOfGlyphs; - bool ellipsis:1; - DevelText::EllipsisPosition::Type ellipsisPosition; - bool updated:1; + std::string description; + std::string text; + Size textArea; + unsigned int numberOfFonts; + FontDescriptionRun* fontDescriptions; + Size layoutSize; + unsigned int totalNumberOfGlyphs; + float* positions; + unsigned int numberOfLines; + LineRun* lines; + Layout::Engine::Type layout; + unsigned int startIndex; + unsigned int numberOfGlyphs; + bool ellipsis : 1; + DevelText::EllipsisPosition::Type ellipsisPosition; + bool updated : 1; }; -void Print( const LineRun& line ) +void Print(const LineRun& line) { std::cout << " glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl; std::cout << " character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl; @@ -72,237 +71,239 @@ void Print( const LineRun& line ) std::cout << " ellipsis : " << line.ellipsis << std::endl; } -bool LayoutTextTest( const LayoutTextData& data ) +bool LayoutTextTest(const LayoutTextData& data) { // Load some fonts. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 96u, 96u ); + fontClient.SetDpi(96u, 96u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHindiRegular.ttf" ); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHindiRegular.ttf"); // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size layoutSize; + Size layoutSize; Vector fontDescriptionRuns; - if( 0u != data.numberOfFonts ) + if(0u != data.numberOfFonts) { - fontDescriptionRuns.Insert( fontDescriptionRuns.End(), - data.fontDescriptions, - data.fontDescriptions + data.numberOfFonts ); + fontDescriptionRuns.Insert(fontDescriptionRuns.End(), + data.fontDescriptions, + data.fontDescriptions + data.numberOfFonts); } LayoutOptions options; options.align = false; - CreateTextModel( data.text, - data.textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + CreateTextModel(data.text, + data.textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; // 2) Clear the layout. Vector& lines = visualModel->mLines; - const Length numberOfCharacters = logicalModel->mText.Count(); - const bool isLastNewParagraph = ( 0u == numberOfCharacters ) ? false : TextAbstraction::IsNewParagraph( *( logicalModel->mText.Begin() + ( numberOfCharacters - 1u ) ) ); - const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u; - const bool removeLastLine = isLastNewParagraph && ( lastGlyphIndex + 1u == visualModel->mGlyphs.Count() ); + const Length numberOfCharacters = logicalModel->mText.Count(); + const bool isLastNewParagraph = (0u == numberOfCharacters) ? false : TextAbstraction::IsNewParagraph(*(logicalModel->mText.Begin() + (numberOfCharacters - 1u))); + const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u; + const bool removeLastLine = isLastNewParagraph && (lastGlyphIndex + 1u == visualModel->mGlyphs.Count()); LineIndex startRemoveIndex = 0u; - if( 0u != lines.Count() ) + if(0u != lines.Count()) { - startRemoveIndex = lines.Count(); + startRemoveIndex = lines.Count(); LineIndex endRemoveIndex = startRemoveIndex; - ClearGlyphRuns( data.startIndex, - lastGlyphIndex + ( removeLastLine ? 1u : 0u ), - lines, - startRemoveIndex, - endRemoveIndex ); + ClearGlyphRuns(data.startIndex, + lastGlyphIndex + (removeLastLine ? 1u : 0u), + lines, + startRemoveIndex, + endRemoveIndex); // Update the character runs of the lines. const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin(); - const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin(); - const CharacterIndex startCharacterIndex = *( glyphsToCharactersBuffer + data.startIndex ); - const CharacterIndex lastCharacterIndex = *( glyphsToCharactersBuffer + lastGlyphIndex ) + *( charactersPerGlyph + lastGlyphIndex ) - 1u; - ClearCharacterRuns( startCharacterIndex, - lastCharacterIndex + ( removeLastLine ? 1u : 0u ), - lines, - startRemoveIndex, - endRemoveIndex ); - - lines.Erase( lines.Begin() + startRemoveIndex, - lines.Begin() + endRemoveIndex ); + const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin(); + const CharacterIndex startCharacterIndex = *(glyphsToCharactersBuffer + data.startIndex); + const CharacterIndex lastCharacterIndex = *(glyphsToCharactersBuffer + lastGlyphIndex) + *(charactersPerGlyph + lastGlyphIndex) - 1u; + ClearCharacterRuns(startCharacterIndex, + lastCharacterIndex + (removeLastLine ? 1u : 0u), + lines, + startRemoveIndex, + endRemoveIndex); + + lines.Erase(lines.Begin() + startRemoveIndex, + lines.Begin() + endRemoveIndex); } Vector& glyphPositions = visualModel->mGlyphPositions; - glyphPositions.Erase( glyphPositions.Begin() + data.startIndex, - glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs ); + glyphPositions.Erase(glyphPositions.Begin() + data.startIndex, + glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs); // 3) Layout Layout::Engine engine; - engine.SetMetrics( metrics ); - engine.SetLayout( data.layout ); + engine.SetMetrics(metrics); + engine.SetLayout(data.layout); - textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN; - textModel->mLineWrapMode = LineWrap::WORD; + textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN; + textModel->mLineWrapMode = LineWrap::WORD; textModel->mIgnoreSpacesAfterText = true; - Layout::Parameters layoutParameters( data.textArea, - textModel ); + Layout::Parameters layoutParameters(data.textArea, + textModel); layoutParameters.isLastNewParagraph = isLastNewParagraph; // The initial glyph and the number of glyphs to layout. - layoutParameters.startGlyphIndex = data.startIndex; - layoutParameters.numberOfGlyphs = data.numberOfGlyphs; - layoutParameters.startLineIndex = startRemoveIndex; + layoutParameters.startGlyphIndex = data.startIndex; + layoutParameters.numberOfGlyphs = data.numberOfGlyphs; + layoutParameters.startLineIndex = startRemoveIndex; layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count(); layoutSize = Vector2::ZERO; - bool isAutoScroll = false; - const bool updated = engine.LayoutText( layoutParameters, - layoutSize, - data.ellipsis, - isAutoScroll, - data.ellipsisPosition ); + bool isAutoScroll = false; + const bool updated = engine.LayoutText(layoutParameters, + layoutSize, + data.ellipsis, + isAutoScroll, + data.ellipsisPosition); // 4) Compare the results. - if( updated != data.updated ) + if(updated != data.updated) { std::cout << " Different updated bool : " << updated << ", expected : " << data.updated << std::endl; return false; } - if( layoutSize != data.layoutSize ) + if(layoutSize != data.layoutSize) { std::cout << " Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl; return false; } - for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index ) + for(unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index) { - const Vector2& position = *( glyphPositions.Begin() + index ); + const Vector2& position = *(glyphPositions.Begin() + index); - if( fabsf( std::round( position.x ) - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(std::round(position.x) - *(data.positions + 2u * index)) > Math::MACHINE_EPSILON_1000) { - std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl; + std::cout << " Different position for glyph " << index << " x : " << position.x << ", expected : " << *(data.positions + 2u * index) << std::endl; return false; } - if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(position.y - *(data.positions + 2u * index + 1u)) > Math::MACHINE_EPSILON_1000) { - std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl; + std::cout << " Different position for glyph " << index << " y : " << position.y << ", expected : " << *(data.positions + 2u * index + 1u) << std::endl; return false; } } - if( lines.Count() != data.numberOfLines ) + if(lines.Count() != data.numberOfLines) { std::cout << " Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl; return false; } - for( unsigned int index = 0u; index < data.numberOfLines; ++index ) + for(unsigned int index = 0u; index < data.numberOfLines; ++index) { - const LineRun& line = *( lines.Begin() + index ); - const LineRun& expectedLine = *( data.lines + index ); + const LineRun& line = *(lines.Begin() + index); + const LineRun& expectedLine = *(data.lines + index); - if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex ) + if(line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs ) + if(line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex ) + if(line.characterRun.characterIndex != expectedLine.characterRun.characterIndex) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters ) + if(line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( fabsf( floor( line.width ) - expectedLine.width ) > Math::MACHINE_EPSILON_1 ) + if(fabsf(floor(line.width) - expectedLine.width) > Math::MACHINE_EPSILON_1) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( fabsf( line.ascender - expectedLine.ascender ) > Math::MACHINE_EPSILON_1 ) + if(fabsf(line.ascender - expectedLine.ascender) > Math::MACHINE_EPSILON_1) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( fabsf( line.descender - expectedLine.descender ) > Math::MACHINE_EPSILON_1 ) + if(fabsf(line.descender - expectedLine.descender) > Math::MACHINE_EPSILON_1) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 ) + if(fabsf(line.extraLength - expectedLine.extraLength) > Math::MACHINE_EPSILON_1) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } - if( line.ellipsis != expectedLine.ellipsis ) + if(line.ellipsis != expectedLine.ellipsis) { std::cout << " Different line info for line : " << index << std::endl; - Print( line ); + Print(line); std::cout << " expected" << std::endl; - Print( expectedLine ); + Print(expectedLine); return false; } @@ -317,95 +318,97 @@ bool LayoutTextTest( const LayoutTextData& data ) struct AlignData { - std::string description; - std::string text; - Size textArea; - unsigned int numberOfFonts; - FontDescriptionRun* fontDescriptions; - Text::HorizontalAlignment::Type horizontalAlignment; - Text::VerticalAlignment::Type verticalAlignment; - unsigned int startIndex; - unsigned int numberOfCharacters; - unsigned int numberOfLines; - float* lineOffsets; - Dali::LayoutDirection::Type layoutDirection; - bool matchSystemLanguageDirection; + std::string description; + std::string text; + Size textArea; + unsigned int numberOfFonts; + FontDescriptionRun* fontDescriptions; + Text::HorizontalAlignment::Type horizontalAlignment; + Text::VerticalAlignment::Type verticalAlignment; + unsigned int startIndex; + unsigned int numberOfCharacters; + unsigned int numberOfLines; + float* lineOffsets; + Dali::LayoutDirection::Type layoutDirection; + bool matchSystemLanguageDirection; }; -bool AlignTest( const AlignData& data ) +bool AlignTest(const AlignData& data) { // Load some fonts. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 96u, 96u ); + fontClient.SetDpi(96u, 96u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" ); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf"); // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size layoutSize; + Size layoutSize; Vector fontDescriptionRuns; - if( 0u != data.numberOfFonts ) + if(0u != data.numberOfFonts) { - fontDescriptionRuns.Insert( fontDescriptionRuns.End(), - data.fontDescriptions, - data.fontDescriptions + data.numberOfFonts ); + fontDescriptionRuns.Insert(fontDescriptionRuns.End(), + data.fontDescriptions, + data.fontDescriptions + data.numberOfFonts); } LayoutOptions options; options.align = false; - CreateTextModel( data.text, - data.textArea, - fontDescriptionRuns, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + CreateTextModel(data.text, + data.textArea, + fontDescriptionRuns, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; // Call the Align method. Layout::Engine engine; - engine.SetMetrics( metrics ); + engine.SetMetrics(metrics); float alignmentOffset = 0.f; - engine.Align( data.textArea, - data.startIndex, - data.numberOfCharacters, - data.horizontalAlignment, - visualModel->mLines, - alignmentOffset, - data.layoutDirection, - data.matchSystemLanguageDirection ); + engine.Align(data.textArea, + data.startIndex, + data.numberOfCharacters, + data.horizontalAlignment, + visualModel->mLines, + alignmentOffset, + data.layoutDirection, + data.matchSystemLanguageDirection); // Compare results. - if( data.numberOfLines != visualModel->mLines.Count() ) + if(data.numberOfLines != visualModel->mLines.Count()) { std::cout << " Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl; return false; } const LineRun* const linesBuffer = visualModel->mLines.Begin(); - for( unsigned int index = 0u; index < data.numberOfLines; ++index ) + for(unsigned int index = 0u; index < data.numberOfLines; ++index) { - const LineRun& line = *( linesBuffer + index ); + const LineRun& line = *(linesBuffer + index); - if( line.alignmentOffset != *( data.lineOffsets + index ) ) + if(line.alignmentOffset != *(data.lineOffsets + index)) { - std::cout << " different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl; + std::cout << " different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *(data.lineOffsets + index) << std::endl; return false; } } @@ -461,10 +464,10 @@ int UtcDaliTextLayoutSetGetLayout(void) Layout::Engine engine; - DALI_TEST_CHECK( Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout() ); + DALI_TEST_CHECK(Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout()); - engine.SetLayout( Layout::Engine::MULTI_LINE_BOX ); - DALI_TEST_CHECK( Layout::Engine::MULTI_LINE_BOX == engine.GetLayout() ); + engine.SetLayout(Layout::Engine::MULTI_LINE_BOX); + DALI_TEST_CHECK(Layout::Engine::MULTI_LINE_BOX == engine.GetLayout()); tet_result(TET_PASS); END_TEST; @@ -477,10 +480,10 @@ int UtcDaliTextLayoutSetGetCursorWidth(void) Layout::Engine engine; - DALI_TEST_EQUALS( 0, engine.GetCursorWidth(), TEST_LOCATION ); + DALI_TEST_EQUALS(0, engine.GetCursorWidth(), TEST_LOCATION); - engine.SetCursorWidth( 2 ); - DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION ); + engine.SetCursorWidth(2); + DALI_TEST_EQUALS(2, engine.GetCursorWidth(), TEST_LOCATION); tet_result(TET_PASS); END_TEST; @@ -491,29 +494,28 @@ int UtcDaliTextLayoutNoText(void) ToolkitTestApplication application; tet_infoline(" UtcDaliTextLayoutNoText"); - Size textArea(100.f, 60.f); - Size layoutSize = Vector2::ZERO; + Size textArea(100.f, 60.f); + Size layoutSize = Vector2::ZERO; LayoutTextData data = - { - "No text", - "", - textArea, - 0u, - NULL, - layoutSize, - 0u, - NULL, - 0u, - NULL, - Layout::Engine::MULTI_LINE_BOX, - 0u, - 0u, - false, - DevelText::EllipsisPosition::END, - false - }; + { + "No text", + "", + textArea, + 0u, + NULL, + layoutSize, + 0u, + NULL, + 0u, + NULL, + Layout::Engine::MULTI_LINE_BOX, + 0u, + 0u, + false, + DevelText::EllipsisPosition::END, + false}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -529,46 +531,45 @@ int UtcDaliTextLayoutSmallTextArea01(void) // Won't layout the text in multi-line if the width is too small. - const std::string fontFamily( "TizenSans" ); + const std::string fontFamily("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun; - fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.characterIndex = 0u; fontDescriptionRun.characterRun.numberOfCharacters = 11u; - fontDescriptionRun.familyLength = fontFamily.size(); - fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; - memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength ); + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); fontDescriptionRun.familyDefined = true; fontDescriptionRun.weightDefined = false; - fontDescriptionRun.widthDefined = false; - fontDescriptionRun.slantDefined = false; - fontDescriptionRun.sizeDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun ); - Size textArea(1.f, 1.f); - Size layoutSize = Vector2::ZERO; + fontDescriptionRuns.PushBack(fontDescriptionRun); + Size textArea(1.f, 1.f); + Size layoutSize = Vector2::ZERO; LayoutTextData data = - { - "Layout text in a small area", - "Hello world", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 0u, - NULL, - 0u, - NULL, - Layout::Engine::MULTI_LINE_BOX, - 0u, - 11u, - false, - DevelText::EllipsisPosition::END, - false - }; + { + "Layout text in a small area", + "Hello world", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 0u, + NULL, + 0u, + NULL, + Layout::Engine::MULTI_LINE_BOX, + 0u, + 11u, + false, + DevelText::EllipsisPosition::END, + false}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -584,63 +585,61 @@ int UtcDaliTextLayoutSmallTextArea02(void) // Will layout the text in single line as it can be scrolled. - const std::string fontFamily( "TizenSans" ); + const std::string fontFamily("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun; - fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.characterIndex = 0u; fontDescriptionRun.characterRun.numberOfCharacters = 11u; - fontDescriptionRun.familyLength = fontFamily.size(); - fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; - memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength ); + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); fontDescriptionRun.familyDefined = true; fontDescriptionRun.weightDefined = false; - fontDescriptionRun.widthDefined = false; - fontDescriptionRun.slantDefined = false; - fontDescriptionRun.sizeDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun ); - Size textArea(1.f, 1.f); - Size layoutSize(81.f, 20.f); - float positions[] = { 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f }; + fontDescriptionRuns.PushBack(fontDescriptionRun); + Size textArea(1.f, 1.f); + Size layoutSize(81.f, 20.f); + float positions[] = {0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f}; struct LineRun line = - { - { 0u, 11u }, - { 0u, 11u }, - 81.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 11u}, + {0u, 11u}, + 81.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line ); + lines.PushBack(line); LayoutTextData data = - { - "Layout text in a small area", - "Hello world", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 11u, - positions, - 1u, - lines.Begin(), - Layout::Engine::SINGLE_LINE_BOX, - 0u, - 11u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout text in a small area", + "Hello world", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 11u, + positions, + 1u, + lines.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 11u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -656,140 +655,129 @@ int UtcDaliTextLayoutMultilineText01(void) // Layout some lines of left to right text. - const std::string fontFamily( "TizenSans" ); + const std::string fontFamily("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun1; - fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.characterIndex = 0u; fontDescriptionRun1.characterRun.numberOfCharacters = 18u; - fontDescriptionRun1.familyLength = fontFamily.size(); - fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; - memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength ); + fontDescriptionRun1.familyLength = fontFamily.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength); fontDescriptionRun1.familyDefined = true; fontDescriptionRun1.weightDefined = false; - fontDescriptionRun1.widthDefined = false; - fontDescriptionRun1.slantDefined = false; - fontDescriptionRun1.sizeDefined = false; + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = false; FontDescriptionRun fontDescriptionRun2; - fontDescriptionRun2.characterRun.characterIndex = 18u; + fontDescriptionRun2.characterRun.characterIndex = 18u; fontDescriptionRun2.characterRun.numberOfCharacters = 31u; - fontDescriptionRun2.familyLength = fontFamily.size(); - fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; - memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength ); + fontDescriptionRun2.familyLength = fontFamily.size(); + fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; + memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength); fontDescriptionRun2.familyDefined = true; fontDescriptionRun2.weightDefined = false; - fontDescriptionRun2.widthDefined = false; - fontDescriptionRun2.slantDefined = false; - fontDescriptionRun2.sizeDefined = false; + fontDescriptionRun2.widthDefined = false; + fontDescriptionRun2.slantDefined = false; + fontDescriptionRun2.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun1 ); - fontDescriptionRuns.PushBack( fontDescriptionRun2 ); - Size textArea(100.f, 300.f); - Size layoutSize(98.f, 97.f); + fontDescriptionRuns.PushBack(fontDescriptionRun1); + fontDescriptionRuns.PushBack(fontDescriptionRun2); + Size textArea(100.f, 300.f); + Size layoutSize(98.f, 97.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, 45.f, -12.f, - 0.f, -12.f, 8.f, -9.f, 18.f, -9.f, 27.f, -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f, - 0.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f, -9.f, 36.f, -9.f, 42.f, -9.f, 53.f, -9.f, 62.f, -11.f, 68.f, -0.f, - 0.f, -12.f, 4.f, -12.f, 9.f, -9.f, 18.f, -9.f, 28.f, -9.f, 36.f, -0.f, 41.f, -9.f, 51.f, -12.f, 57.f, -0.f, 62.f, -11.f, 68.f, -9.f, 78.f, -9.f, 87.f, -11.f, 94.f, -2.f - }; + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, 45.f, -12.f, 0.f, -12.f, 8.f, -9.f, 18.f, -9.f, 27.f, -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f, 0.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f, -9.f, 36.f, -9.f, 42.f, -9.f, 53.f, -9.f, 62.f, -11.f, 68.f, -0.f, 0.f, -12.f, 4.f, -12.f, 9.f, -9.f, 18.f, -9.f, 28.f, -9.f, 36.f, -0.f, 41.f, -9.f, 51.f, -12.f, 57.f, -0.f, 62.f, -11.f, 68.f, -9.f, 78.f, -9.f, 87.f, -11.f, 94.f, -2.f}; struct LineRun line0 = - { - { 0u, 12u }, - { 0u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line1 = - { - { 12u, 6u }, - { 12u, 6u }, - 44.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {12u, 6u}, + {12u, 6u}, + 44.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line2 = - { - { 18u, 7u }, - { 18u, 7u }, - 54.f, - 15.f, - -4.f, - 6.f, - 0.f, - 0.f, - false, - false - }; + { + {18u, 7u}, + {18u, 7u}, + 54.f, + 15.f, + -4.f, + 6.f, + 0.f, + 0.f, + false, + false}; struct LineRun line3 = - { - { 25u, 9u }, - { 25u, 10u }, - 68.f, - 15.f, - -4.f, - 6.f, - 0.f, - 0.f, - false, - false - }; + { + {25u, 9u}, + {25u, 10u}, + 68.f, + 15.f, + -4.f, + 6.f, + 0.f, + 0.f, + false, + false}; struct LineRun line4 = - { - { 34u, 14u }, - { 35u, 14u }, - 98.f, - 15.f, - -4.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {34u, 14u}, + {35u, 14u}, + 98.f, + 15.f, + -4.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line0 ); - lines.PushBack( line1 ); - lines.PushBack( line2 ); - lines.PushBack( line3 ); - lines.PushBack( line4 ); + lines.PushBack(line0); + lines.PushBack(line1); + lines.PushBack(line2); + lines.PushBack(line3); + lines.PushBack(line4); LayoutTextData data = - { - "Layout simple multi-line text", - "Hello world demo.\n" - "Layout different lines of text.", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 48u, - positions, - 5u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 48u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout simple multi-line text", + "Hello world demo.\n" + "Layout different lines of text.", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 48u, + positions, + 5u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 48u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -805,206 +793,280 @@ int UtcDaliTextLayoutMultilineText02(void) // Layout some lines of bidirectional text. - const std::string fontFamily1( "TizenSans" ); + const std::string fontFamily1("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun1; - fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.characterIndex = 0u; fontDescriptionRun1.characterRun.numberOfCharacters = 17u; - fontDescriptionRun1.familyLength = fontFamily1.size(); - fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; - memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength ); + fontDescriptionRun1.familyLength = fontFamily1.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength); fontDescriptionRun1.familyDefined = true; fontDescriptionRun1.weightDefined = false; - fontDescriptionRun1.widthDefined = false; - fontDescriptionRun1.slantDefined = false; - fontDescriptionRun1.sizeDefined = false; + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = false; - const std::string fontFamily2( "TizenSansHebrew" ); + const std::string fontFamily2("TizenSansHebrew"); // Set a known font description FontDescriptionRun fontDescriptionRun2; - fontDescriptionRun2.characterRun.characterIndex = 17u; + fontDescriptionRun2.characterRun.characterIndex = 17u; fontDescriptionRun2.characterRun.numberOfCharacters = 9u; - fontDescriptionRun2.familyLength = fontFamily2.size(); - fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; - memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength ); + fontDescriptionRun2.familyLength = fontFamily2.size(); + fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; + memcpy(fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength); fontDescriptionRun2.familyDefined = true; fontDescriptionRun2.weightDefined = false; - fontDescriptionRun2.widthDefined = false; - fontDescriptionRun2.slantDefined = false; - fontDescriptionRun2.sizeDefined = false; + fontDescriptionRun2.widthDefined = false; + fontDescriptionRun2.slantDefined = false; + fontDescriptionRun2.sizeDefined = false; - const std::string fontFamily3( "TizenSans" ); + const std::string fontFamily3("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun3; - fontDescriptionRun3.characterRun.characterIndex = 26u; + fontDescriptionRun3.characterRun.characterIndex = 26u; fontDescriptionRun3.characterRun.numberOfCharacters = 2u; - fontDescriptionRun3.familyLength = fontFamily3.size(); - fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength]; - memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength ); + fontDescriptionRun3.familyLength = fontFamily3.size(); + fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength]; + memcpy(fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength); fontDescriptionRun3.familyDefined = true; fontDescriptionRun3.weightDefined = false; - fontDescriptionRun3.widthDefined = false; - fontDescriptionRun3.slantDefined = false; - fontDescriptionRun3.sizeDefined = false; + fontDescriptionRun3.widthDefined = false; + fontDescriptionRun3.slantDefined = false; + fontDescriptionRun3.sizeDefined = false; - const std::string fontFamily4( "TizenSansHebrew" ); + const std::string fontFamily4("TizenSansHebrew"); // Set a known font description FontDescriptionRun fontDescriptionRun4; - fontDescriptionRun4.characterRun.characterIndex = 28u; + fontDescriptionRun4.characterRun.characterIndex = 28u; fontDescriptionRun4.characterRun.numberOfCharacters = 10u; - fontDescriptionRun4.familyLength = fontFamily4.size(); - fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength]; - memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength ); + fontDescriptionRun4.familyLength = fontFamily4.size(); + fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength]; + memcpy(fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength); fontDescriptionRun4.familyDefined = true; fontDescriptionRun4.weightDefined = false; - fontDescriptionRun4.widthDefined = false; - fontDescriptionRun4.slantDefined = false; - fontDescriptionRun4.sizeDefined = false; + fontDescriptionRun4.widthDefined = false; + fontDescriptionRun4.slantDefined = false; + fontDescriptionRun4.sizeDefined = false; - const std::string fontFamily5( "TizenSans" ); + const std::string fontFamily5("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun5; - fontDescriptionRun5.characterRun.characterIndex = 38u; + fontDescriptionRun5.characterRun.characterIndex = 38u; fontDescriptionRun5.characterRun.numberOfCharacters = 17u; - fontDescriptionRun5.familyLength = fontFamily5.size(); - fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength]; - memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength ); + fontDescriptionRun5.familyLength = fontFamily5.size(); + fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength]; + memcpy(fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength); fontDescriptionRun5.familyDefined = true; fontDescriptionRun5.weightDefined = false; - fontDescriptionRun5.widthDefined = false; - fontDescriptionRun5.slantDefined = false; - fontDescriptionRun5.sizeDefined = false; + fontDescriptionRun5.widthDefined = false; + fontDescriptionRun5.slantDefined = false; + fontDescriptionRun5.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun1 ); - fontDescriptionRuns.PushBack( fontDescriptionRun2 ); - fontDescriptionRuns.PushBack( fontDescriptionRun3 ); - fontDescriptionRuns.PushBack( fontDescriptionRun4 ); - fontDescriptionRuns.PushBack( fontDescriptionRun5 ); - Size textArea(100.f, 300.f); - Size layoutSize(81.f, 120.f); + fontDescriptionRuns.PushBack(fontDescriptionRun1); + fontDescriptionRuns.PushBack(fontDescriptionRun2); + fontDescriptionRuns.PushBack(fontDescriptionRun3); + fontDescriptionRuns.PushBack(fontDescriptionRun4); + fontDescriptionRuns.PushBack(fontDescriptionRun5); + Size textArea(100.f, 300.f); + Size layoutSize(81.f, 120.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 68.f, -10.f, 59.f, -13.f, 54.f, -10.f, 45.f, -10.f, 79.f, -0.f, // 12 .. 21 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, // 22 .. 27 - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 28 .. 37 - 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 38 .. 49 - 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, // 50 .. 54 - }; + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 68.f, + -10.f, + 59.f, + -13.f, + 54.f, + -10.f, + 45.f, + -10.f, + 79.f, + -0.f, // 12 .. 21 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -2.f, + 36.f, + -12.f, // 22 .. 27 + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, // 28 .. 37 + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, // 38 .. 49 + 4.f, + -13.f, + 13.f, + -9.f, + 23.f, + -9.f, + 36.f, + -9.f, + 0.f, + -2.f, // 50 .. 54 + }; struct LineRun line0 = - { - { 0u, 12u }, - { 0u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line1 = - { - { 12u, 10u }, - { 12u, 10u }, - 79.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {12u, 10u}, + {12u, 10u}, + 79.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line2 = - { - { 22u, 6u }, - { 22u, 6u }, - 35.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {22u, 6u}, + {22u, 6u}, + 35.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line3 = - { - { 28u, 10u }, - { 28u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {28u, 10u}, + {28u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line4 = - { - { 38u, 12u }, - { 38u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {38u, 12u}, + {38u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line5 = - { - { 50u, 5u }, - { 50u, 5u }, - 45.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {50u, 5u}, + {50u, 5u}, + 45.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line0 ); - lines.PushBack( line1 ); - lines.PushBack( line2 ); - lines.PushBack( line3 ); - lines.PushBack( line4 ); - lines.PushBack( line5 ); + lines.PushBack(line0); + lines.PushBack(line1); + lines.PushBack(line2); + lines.PushBack(line3); + lines.PushBack(line4); + lines.PushBack(line5); LayoutTextData data = - { - "Layout bidirectional text.", - "Hello world demo שלום עולם.\n" - "שלום עולם hello world demo.", - textArea, - 5u, - fontDescriptionRuns.Begin(), - layoutSize, - 55u, - positions, - 6u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 55u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout bidirectional text.", + "Hello world demo שלום עולם.\n" + "שלום עולם hello world demo.", + textArea, + 5u, + fontDescriptionRuns.Begin(), + layoutSize, + 55u, + positions, + 6u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 55u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -1020,96 +1082,147 @@ int UtcDaliTextLayoutMultilineText03(void) // Layout a long word which doesn't fit in the width of the text area. - const std::string fontFamily( "TizenSans" ); + const std::string fontFamily("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun; - fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.characterIndex = 0u; fontDescriptionRun.characterRun.numberOfCharacters = 29u; - fontDescriptionRun.familyLength = fontFamily.size(); - fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; - memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength ); + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); fontDescriptionRun.familyDefined = true; fontDescriptionRun.weightDefined = false; - fontDescriptionRun.widthDefined = false; - fontDescriptionRun.slantDefined = false; - fontDescriptionRun.sizeDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun ); - Size textArea(100.f, 300.f); - Size layoutSize(98.f, 60.f); + fontDescriptionRuns.PushBack(fontDescriptionRun); + Size textArea(100.f, 300.f); + Size layoutSize(98.f, 60.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -9.f, 48.f, -9.f, 58.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -13.f, 86.f, -9.f, - 0.f, -9.f, 13.f, -9.f, 23.f, -13.f, 31.f, -9.f, 41.f, -13.f, 45.f, -13.f, 48.f, -9.f, 57.f, -9.f, 69.f, -9.f, 79.f, -9.f, 85.f, -13.f, 88.f, -13.f, - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, - }; + { + 0.f, + -12.f, + 10.f, + -9.f, + 20.f, + -13.f, + 24.f, + -13.f, + 27.f, + -9.f, + 36.f, + -9.f, + 48.f, + -9.f, + 58.f, + -9.f, + 65.f, + -13.f, + 68.f, + -13.f, + 77.f, + -13.f, + 86.f, + -9.f, + 0.f, + -9.f, + 13.f, + -9.f, + 23.f, + -13.f, + 31.f, + -9.f, + 41.f, + -13.f, + 45.f, + -13.f, + 48.f, + -9.f, + 57.f, + -9.f, + 69.f, + -9.f, + 79.f, + -9.f, + 85.f, + -13.f, + 88.f, + -13.f, + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -2.f, + }; struct LineRun line0 = - { - { 0u, 12u }, - { 0u, 12u }, - 95.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 95.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line1 = - { - { 12u, 12u }, - { 12u, 12u }, - 98.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {12u, 12u}, + {12u, 12u}, + 98.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line2 = - { - { 24u, 5u }, - { 24u, 5u }, - 44.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {24u, 5u}, + {24u, 5u}, + 44.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line0 ); - lines.PushBack( line1 ); - lines.PushBack( line2 ); + lines.PushBack(line0); + lines.PushBack(line1); + lines.PushBack(line2); LayoutTextData data = - { - "Layout a long word which doesn't fit in the width of the text area.", - "Helloworlddemohelloworlddemo.", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 29u, - positions, - 3u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 29u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout a long word which doesn't fit in the width of the text area.", + "Helloworlddemohelloworlddemo.", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 29u, + positions, + 3u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 29u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -1125,79 +1238,75 @@ int UtcDaliTextLayoutMultilineText04(void) // Layout simple text ending with a \n. It has to add a void line at the end. - const std::string fontFamily( "TizenSans" ); + const std::string fontFamily("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun; - fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.characterIndex = 0u; fontDescriptionRun.characterRun.numberOfCharacters = 13u; - fontDescriptionRun.familyLength = fontFamily.size(); - fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; - memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength ); + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); fontDescriptionRun.familyDefined = true; fontDescriptionRun.weightDefined = false; - fontDescriptionRun.widthDefined = false; - fontDescriptionRun.slantDefined = false; - fontDescriptionRun.sizeDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun ); - Size textArea(100.f, 300.f); - Size layoutSize(84.f, 40.f); + fontDescriptionRuns.PushBack(fontDescriptionRun); + Size textArea(100.f, 300.f); + Size layoutSize(84.f, 40.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -2.f, 85.f, -12.f - }; + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -2.f, 85.f, -12.f}; struct LineRun line0 = - { - { 0u, 13u }, - { 0u, 13u }, - 84.f, - 15.f, - -5.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 13u}, + {0u, 13u}, + 84.f, + 15.f, + -5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line1 = - { - { 13u, 0u }, - { 13u, 0u }, - 0.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {13u, 0u}, + {13u, 0u}, + 0.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line0 ); - lines.PushBack( line1 ); + lines.PushBack(line0); + lines.PushBack(line1); LayoutTextData data = - { - "Layout simple text ending with a \n.", - "Hello world.\n", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 13u, - positions, - 2u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 13u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout simple text ending with a \n.", + "Hello world.\n", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 13u, + positions, + 2u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 13u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -1213,108 +1322,103 @@ int UtcDaliTextLayoutMultilineText05(void) // Layout simple text with one character with a different font size. - const std::string fontFamily( "TizenSans" ); + const std::string fontFamily("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun1; - fontDescriptionRun1.characterRun.characterIndex = 0u; + fontDescriptionRun1.characterRun.characterIndex = 0u; fontDescriptionRun1.characterRun.numberOfCharacters = 6u; - fontDescriptionRun1.familyLength = fontFamily.size(); - fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; - memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength ); + fontDescriptionRun1.familyLength = fontFamily.size(); + fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength]; + memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength); fontDescriptionRun1.familyDefined = true; fontDescriptionRun1.weightDefined = false; - fontDescriptionRun1.widthDefined = false; - fontDescriptionRun1.slantDefined = false; - fontDescriptionRun1.sizeDefined = false; + fontDescriptionRun1.widthDefined = false; + fontDescriptionRun1.slantDefined = false; + fontDescriptionRun1.sizeDefined = false; FontDescriptionRun fontDescriptionRun2; - fontDescriptionRun2.characterRun.characterIndex = 6u; + fontDescriptionRun2.characterRun.characterIndex = 6u; fontDescriptionRun2.characterRun.numberOfCharacters = 1u; - fontDescriptionRun2.familyLength = fontFamily.size(); - fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; - memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength ); - fontDescriptionRun2.size = 1280u; + fontDescriptionRun2.familyLength = fontFamily.size(); + fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength]; + memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength); + fontDescriptionRun2.size = 1280u; fontDescriptionRun2.familyDefined = true; fontDescriptionRun2.weightDefined = false; - fontDescriptionRun2.widthDefined = false; - fontDescriptionRun2.slantDefined = false; - fontDescriptionRun2.sizeDefined = true; + fontDescriptionRun2.widthDefined = false; + fontDescriptionRun2.slantDefined = false; + fontDescriptionRun2.sizeDefined = true; FontDescriptionRun fontDescriptionRun3; - fontDescriptionRun3.characterRun.characterIndex = 7u; + fontDescriptionRun3.characterRun.characterIndex = 7u; fontDescriptionRun3.characterRun.numberOfCharacters = 10u; - fontDescriptionRun3.familyLength = fontFamily.size(); - fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength]; - memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength ); + fontDescriptionRun3.familyLength = fontFamily.size(); + fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength]; + memcpy(fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength); fontDescriptionRun3.familyDefined = true; fontDescriptionRun3.weightDefined = false; - fontDescriptionRun3.widthDefined = false; - fontDescriptionRun3.slantDefined = false; - fontDescriptionRun3.sizeDefined = false; + fontDescriptionRun3.widthDefined = false; + fontDescriptionRun3.slantDefined = false; + fontDescriptionRun3.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun1 ); - fontDescriptionRuns.PushBack( fontDescriptionRun2 ); - fontDescriptionRuns.PushBack( fontDescriptionRun3 ); - Size textArea(100.f, 300.f); - Size layoutSize(89.f, 53.f); + fontDescriptionRuns.PushBack(fontDescriptionRun1); + fontDescriptionRuns.PushBack(fontDescriptionRun2); + fontDescriptionRuns.PushBack(fontDescriptionRun3); + Size textArea(100.f, 300.f); + Size layoutSize(89.f, 53.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 60.f, -9.f, 70.f, -9.f, 76.f, -13.f, 80.f, -13.f, 89.f, -0.f, - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f - }; + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 60.f, -9.f, 70.f, -9.f, 76.f, -13.f, 80.f, -13.f, 89.f, -0.f, 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f}; struct LineRun line0 = - { - { 0u, 12u }, - { 0u, 12u }, - 89.f, - 25.f, - -8.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 89.f, + 25.f, + -8.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line1 = - { - { 12u, 5u }, - { 12u, 5u }, - 44.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {12u, 5u}, + {12u, 5u}, + 44.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line0 ); - lines.PushBack( line1 ); + lines.PushBack(line0); + lines.PushBack(line1); LayoutTextData data = - { - "Layout simple text with one character with a different font size.", - "Hello world demo.", - textArea, - 3u, - fontDescriptionRuns.Begin(), - layoutSize, - 17u, - positions, - 2u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 17u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout simple text with one character with a different font size.", + "Hello world demo.", + textArea, + 3u, + fontDescriptionRuns.Begin(), + layoutSize, + 17u, + positions, + 2u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 17u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -1328,82 +1432,77 @@ int UtcDaliTextLayoutMultilineText06(void) ToolkitTestApplication application; tet_infoline(" UtcDaliTextLayoutMultilineText06"); - const std::string fontFamily( "TizenSansHebrew" ); + const std::string fontFamily("TizenSansHebrew"); // Set a known font description FontDescriptionRun fontDescriptionRun; - fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.characterIndex = 0u; fontDescriptionRun.characterRun.numberOfCharacters = 10u; - fontDescriptionRun.familyLength = fontFamily.size(); - fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; - memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength ); + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); fontDescriptionRun.familyDefined = true; fontDescriptionRun.weightDefined = false; - fontDescriptionRun.widthDefined = false; - fontDescriptionRun.slantDefined = false; - fontDescriptionRun.sizeDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun ); + fontDescriptionRuns.PushBack(fontDescriptionRun); - Size textArea(64.f, 100.f); - Size layoutSize(34.f, 40.f); + Size textArea(64.f, 100.f); + Size layoutSize(34.f, 40.f); float positions[] = - { - 27.f, -13.f, 18.f, -10.f, 9.f, -10.f, 4.f, -10.f, 0.f, -0.f, - 22.f, -10.f, 17.f, -10.f, 12.f, -10.f, 4.f, -10.f, 0.f, -10.f - }; + { + 27.f, -13.f, 18.f, -10.f, 9.f, -10.f, 4.f, -10.f, 0.f, -0.f, 22.f, -10.f, 17.f, -10.f, 12.f, -10.f, 4.f, -10.f, 0.f, -10.f}; struct LineRun line0 = - { - { 0u, 5u }, - { 0u, 5u }, - 32.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - true, - false - }; + { + {0u, 5u}, + {0u, 5u}, + 32.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + true, + false}; struct LineRun line1 = - { - { 5u, 5u }, - { 5u, 5u }, - 34.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - true, - false - }; + { + {5u, 5u}, + {5u, 5u}, + 34.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + true, + false}; Vector lines; - lines.PushBack( line0 ); - lines.PushBack( line1 ); + lines.PushBack(line0); + lines.PushBack(line1); LayoutTextData data = - { - "Layout right to left text that doesn't fit in the text area after reordering.", - "לכאן שנורו", // If this text is laid-out ltr the width is 64. When reordered, the length is 66. This might cause alignment issues. - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 10u, - positions, - 2u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 10u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout right to left text that doesn't fit in the text area after reordering.", + "לכאן שנורו", // If this text is laid-out ltr the width is 64. When reordered, the length is 66. This might cause alignment issues. + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 10u, + positions, + 2u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 10u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -1417,97 +1516,90 @@ int UtcDaliTextLayoutMultilineText07(void) ToolkitTestApplication application; tet_infoline(" UtcDaliTextLayoutMultilineText07"); - const std::string fontFamily( "TizenSansHebrew" ); + const std::string fontFamily("TizenSansHebrew"); // Set a known font description FontDescriptionRun fontDescriptionRun; - fontDescriptionRun.characterRun.characterIndex = 0u; + fontDescriptionRun.characterRun.characterIndex = 0u; fontDescriptionRun.characterRun.numberOfCharacters = 9u; - fontDescriptionRun.familyLength = fontFamily.size(); - fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; - memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength ); + fontDescriptionRun.familyLength = fontFamily.size(); + fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength]; + memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength); fontDescriptionRun.familyDefined = true; fontDescriptionRun.weightDefined = false; - fontDescriptionRun.widthDefined = false; - fontDescriptionRun.slantDefined = false; - fontDescriptionRun.sizeDefined = false; + fontDescriptionRun.widthDefined = false; + fontDescriptionRun.slantDefined = false; + fontDescriptionRun.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun ); + fontDescriptionRuns.PushBack(fontDescriptionRun); - Size textArea(26.f, 100.f); - Size layoutSize(24.f, 60.f); + Size textArea(26.f, 100.f); + Size layoutSize(24.f, 60.f); float positions[] = - { - 10.f, -10.f, 4.f, -10.f, 0.f, -10.f, - 13.f, -10.f, 9.f, -10.f, 0.f, -13.f, - 14.f, -10.f, 4.f, -10.f, 0.f, -10.f - }; + { + 10.f, -10.f, 4.f, -10.f, 0.f, -10.f, 13.f, -10.f, 9.f, -10.f, 0.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -10.f}; struct LineRun line0 = - { - { 0u, 3u }, - { 0u, 3u }, - 21.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - true, - false - }; + { + {0u, 3u}, + {0u, 3u}, + 21.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + true, + false}; struct LineRun line1 = - { - { 3u, 3u }, - { 3u, 3u }, - 22.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - true, - false - }; + { + {3u, 3u}, + {3u, 3u}, + 22.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + true, + false}; struct LineRun line2 = - { - { 6u, 3u }, - { 6u, 3u }, - 24.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - true, - false - }; + { + {6u, 3u}, + {6u, 3u}, + 24.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + true, + false}; Vector lines; - lines.PushBack( line0 ); - lines.PushBack( line1 ); - lines.PushBack( line2 ); + lines.PushBack(line0); + lines.PushBack(line1); + lines.PushBack(line2); LayoutTextData data = - { - "Layout a single word of right to left text that doesn't fit in one single line. When layouting ltr a piece of word fits in the line but it doesn't after reordering.", - "שנורולכאן", // If a piece of this text is laid-out ltr the width is 26. When reordered, the length is 27. This might cause alignment issues. - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 9u, - positions, - 3u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 9u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout a single word of right to left text that doesn't fit in one single line. When layouting ltr a piece of word fits in the line but it doesn't after reordering.", + "שנורולכאן", // If a piece of this text is laid-out ltr the width is 26. When reordered, the length is 27. This might cause alignment issues. + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 9u, + positions, + 3u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 9u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -1523,567 +1615,890 @@ int UtcDaliTextUpdateLayout01(void) // Layout some lines of bidirectional text. Update the paragraphs at the beginning. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 17u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 17u; + fontDescriptionRun02.characterRun.characterIndex = 17u; fontDescriptionRun02.characterRun.numberOfCharacters = 9u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 26u; + fontDescriptionRun03.characterRun.characterIndex = 26u; fontDescriptionRun03.characterRun.numberOfCharacters = 2u; - fontDescriptionRun03.familyLength = fontLatin.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontLatin.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 28u; + fontDescriptionRun04.characterRun.characterIndex = 28u; fontDescriptionRun04.characterRun.numberOfCharacters = 14u; - fontDescriptionRun04.familyLength = fontArabic.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontArabic.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 42u; + fontDescriptionRun05.characterRun.characterIndex = 42u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 54u; + fontDescriptionRun06.characterRun.characterIndex = 54u; fontDescriptionRun06.characterRun.numberOfCharacters = 10u; - fontDescriptionRun06.familyLength = fontHebrew.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontHebrew.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun07; - fontDescriptionRun07.characterRun.characterIndex = 64u; + fontDescriptionRun07.characterRun.characterIndex = 64u; fontDescriptionRun07.characterRun.numberOfCharacters = 10u; - fontDescriptionRun07.familyLength = fontHebrew.size(); - fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength]; - memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength ); + fontDescriptionRun07.familyLength = fontHebrew.size(); + fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength]; + memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength); fontDescriptionRun07.familyDefined = true; fontDescriptionRun07.weightDefined = false; - fontDescriptionRun07.widthDefined = false; - fontDescriptionRun07.slantDefined = false; - fontDescriptionRun07.sizeDefined = false; + fontDescriptionRun07.widthDefined = false; + fontDescriptionRun07.slantDefined = false; + fontDescriptionRun07.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun08; - fontDescriptionRun08.characterRun.characterIndex = 74u; + fontDescriptionRun08.characterRun.characterIndex = 74u; fontDescriptionRun08.characterRun.numberOfCharacters = 18u; - fontDescriptionRun08.familyLength = fontLatin.size(); - fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength]; - memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength ); + fontDescriptionRun08.familyLength = fontLatin.size(); + fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength]; + memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength); fontDescriptionRun08.familyDefined = true; fontDescriptionRun08.weightDefined = false; - fontDescriptionRun08.widthDefined = false; - fontDescriptionRun08.slantDefined = false; - fontDescriptionRun08.sizeDefined = false; + fontDescriptionRun08.widthDefined = false; + fontDescriptionRun08.slantDefined = false; + fontDescriptionRun08.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun09; - fontDescriptionRun09.characterRun.characterIndex = 92u; + fontDescriptionRun09.characterRun.characterIndex = 92u; fontDescriptionRun09.characterRun.numberOfCharacters = 12u; - fontDescriptionRun09.familyLength = fontLatin.size(); - fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength]; - memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength ); + fontDescriptionRun09.familyLength = fontLatin.size(); + fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength]; + memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength); fontDescriptionRun09.familyDefined = true; fontDescriptionRun09.weightDefined = false; - fontDescriptionRun09.widthDefined = false; - fontDescriptionRun09.slantDefined = false; - fontDescriptionRun09.sizeDefined = false; + fontDescriptionRun09.widthDefined = false; + fontDescriptionRun09.slantDefined = false; + fontDescriptionRun09.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun10; - fontDescriptionRun10.characterRun.characterIndex = 104u; + fontDescriptionRun10.characterRun.characterIndex = 104u; fontDescriptionRun10.characterRun.numberOfCharacters = 14u; - fontDescriptionRun10.familyLength = fontArabic.size(); - fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength]; - memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength ); + fontDescriptionRun10.familyLength = fontArabic.size(); + fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength]; + memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength); fontDescriptionRun10.familyDefined = true; fontDescriptionRun10.weightDefined = false; - fontDescriptionRun10.widthDefined = false; - fontDescriptionRun10.slantDefined = false; - fontDescriptionRun10.sizeDefined = false; + fontDescriptionRun10.widthDefined = false; + fontDescriptionRun10.slantDefined = false; + fontDescriptionRun10.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun11; - fontDescriptionRun11.characterRun.characterIndex = 118u; + fontDescriptionRun11.characterRun.characterIndex = 118u; fontDescriptionRun11.characterRun.numberOfCharacters = 10u; - fontDescriptionRun11.familyLength = fontHebrew.size(); - fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength]; - memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength ); + fontDescriptionRun11.familyLength = fontHebrew.size(); + fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength]; + memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength); fontDescriptionRun11.familyDefined = true; fontDescriptionRun11.weightDefined = false; - fontDescriptionRun11.widthDefined = false; - fontDescriptionRun11.slantDefined = false; - fontDescriptionRun11.sizeDefined = false; + fontDescriptionRun11.widthDefined = false; + fontDescriptionRun11.slantDefined = false; + fontDescriptionRun11.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun12; - fontDescriptionRun12.characterRun.characterIndex = 128u; + fontDescriptionRun12.characterRun.characterIndex = 128u; fontDescriptionRun12.characterRun.numberOfCharacters = 17u; - fontDescriptionRun12.familyLength = fontLatin.size(); - fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength]; - memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength ); + fontDescriptionRun12.familyLength = fontLatin.size(); + fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength]; + memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength); fontDescriptionRun12.familyDefined = true; fontDescriptionRun12.weightDefined = false; - fontDescriptionRun12.widthDefined = false; - fontDescriptionRun12.slantDefined = false; - fontDescriptionRun12.sizeDefined = false; + fontDescriptionRun12.widthDefined = false; + fontDescriptionRun12.slantDefined = false; + fontDescriptionRun12.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun13; - fontDescriptionRun13.characterRun.characterIndex = 145u; + fontDescriptionRun13.characterRun.characterIndex = 145u; fontDescriptionRun13.characterRun.numberOfCharacters = 9u; - fontDescriptionRun13.familyLength = fontHebrew.size(); - fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength]; - memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength ); + fontDescriptionRun13.familyLength = fontHebrew.size(); + fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength]; + memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength); fontDescriptionRun13.familyDefined = true; fontDescriptionRun13.weightDefined = false; - fontDescriptionRun13.widthDefined = false; - fontDescriptionRun13.slantDefined = false; - fontDescriptionRun13.sizeDefined = false; + fontDescriptionRun13.widthDefined = false; + fontDescriptionRun13.slantDefined = false; + fontDescriptionRun13.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun14; - fontDescriptionRun14.characterRun.characterIndex = 154u; + fontDescriptionRun14.characterRun.characterIndex = 154u; fontDescriptionRun14.characterRun.numberOfCharacters = 2u; - fontDescriptionRun14.familyLength = fontLatin.size(); - fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength]; - memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength ); + fontDescriptionRun14.familyLength = fontLatin.size(); + fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength]; + memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength); fontDescriptionRun14.familyDefined = true; fontDescriptionRun14.weightDefined = false; - fontDescriptionRun14.widthDefined = false; - fontDescriptionRun14.slantDefined = false; - fontDescriptionRun14.sizeDefined = false; + fontDescriptionRun14.widthDefined = false; + fontDescriptionRun14.slantDefined = false; + fontDescriptionRun14.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun15; - fontDescriptionRun15.characterRun.characterIndex = 156u; + fontDescriptionRun15.characterRun.characterIndex = 156u; fontDescriptionRun15.characterRun.numberOfCharacters = 10u; - fontDescriptionRun15.familyLength = fontHebrew.size(); - fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength]; - memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength ); + fontDescriptionRun15.familyLength = fontHebrew.size(); + fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength]; + memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength); fontDescriptionRun15.familyDefined = true; fontDescriptionRun15.weightDefined = false; - fontDescriptionRun15.widthDefined = false; - fontDescriptionRun15.slantDefined = false; - fontDescriptionRun15.sizeDefined = false; + fontDescriptionRun15.widthDefined = false; + fontDescriptionRun15.slantDefined = false; + fontDescriptionRun15.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun16; - fontDescriptionRun16.characterRun.characterIndex = 166u; + fontDescriptionRun16.characterRun.characterIndex = 166u; fontDescriptionRun16.characterRun.numberOfCharacters = 12u; - fontDescriptionRun16.familyLength = fontLatin.size(); - fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength]; - memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength ); + fontDescriptionRun16.familyLength = fontLatin.size(); + fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength]; + memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength); fontDescriptionRun16.familyDefined = true; fontDescriptionRun16.weightDefined = false; - fontDescriptionRun16.widthDefined = false; - fontDescriptionRun16.slantDefined = false; - fontDescriptionRun16.sizeDefined = false; + fontDescriptionRun16.widthDefined = false; + fontDescriptionRun16.slantDefined = false; + fontDescriptionRun16.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun17; - fontDescriptionRun17.characterRun.characterIndex = 178u; + fontDescriptionRun17.characterRun.characterIndex = 178u; fontDescriptionRun17.characterRun.numberOfCharacters = 14u; - fontDescriptionRun17.familyLength = fontArabic.size(); - fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength]; - memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength ); + fontDescriptionRun17.familyLength = fontArabic.size(); + fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength]; + memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength); fontDescriptionRun17.familyDefined = true; fontDescriptionRun17.weightDefined = false; - fontDescriptionRun17.widthDefined = false; - fontDescriptionRun17.slantDefined = false; - fontDescriptionRun17.sizeDefined = false; + fontDescriptionRun17.widthDefined = false; + fontDescriptionRun17.slantDefined = false; + fontDescriptionRun17.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); - fontDescriptionRuns.PushBack( fontDescriptionRun07 ); - fontDescriptionRuns.PushBack( fontDescriptionRun08 ); - fontDescriptionRuns.PushBack( fontDescriptionRun09 ); - fontDescriptionRuns.PushBack( fontDescriptionRun10 ); - fontDescriptionRuns.PushBack( fontDescriptionRun11 ); - fontDescriptionRuns.PushBack( fontDescriptionRun12 ); - fontDescriptionRuns.PushBack( fontDescriptionRun13 ); - fontDescriptionRuns.PushBack( fontDescriptionRun14 ); - fontDescriptionRuns.PushBack( fontDescriptionRun15 ); - fontDescriptionRuns.PushBack( fontDescriptionRun16 ); - fontDescriptionRuns.PushBack( fontDescriptionRun17 ); - Size textArea(100.f, 300.f); - Size layoutSize(100.f, 380.f); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); + fontDescriptionRuns.PushBack(fontDescriptionRun07); + fontDescriptionRuns.PushBack(fontDescriptionRun08); + fontDescriptionRuns.PushBack(fontDescriptionRun09); + fontDescriptionRuns.PushBack(fontDescriptionRun10); + fontDescriptionRuns.PushBack(fontDescriptionRun11); + fontDescriptionRuns.PushBack(fontDescriptionRun12); + fontDescriptionRuns.PushBack(fontDescriptionRun13); + fontDescriptionRuns.PushBack(fontDescriptionRun14); + fontDescriptionRuns.PushBack(fontDescriptionRun15); + fontDescriptionRuns.PushBack(fontDescriptionRun16); + fontDescriptionRuns.PushBack(fontDescriptionRun17); + Size textArea(100.f, 300.f); + Size layoutSize(100.f, 380.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 68.f, -10.f, 59.f, -13.f, 54.f, -10.f, 45.f, -10.f, 79.f, -0.f, // 12 .. 21 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, // 22 .. 27 - 58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, // 28 .. 47 - 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 46.f, -10.f, 36.f, -10.f, 32.f, -0.f, // 48 .. 58 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63 - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 64 .. 73 - 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 74 .. 85 - 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f, // 86 .. 91 - 0.f, -13.f, 8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f, // 92 .. 103 - 92.f, -8.f, 86.f, -6.f, 79.f, -8.f, 75.f, -7.f, 73.f, -11.f, 68.f, -0.f, 64.f, -7.f, 62.f, -11.f, 57.f, -11.f, 50.f, -8.f, 49.f, -11.f, 43.f, -11.f, 38.f, -8.f, 34.f, -0.f, 23.f, -10.f, 14.f, -13.f, 10.f, -10.f, 0.f, -10.f, 99.f, -0.f, // 104 .. 122 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -0.f, // 123 .. 127 - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 128 .. 139 - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 68.f, -10.f, 59.f, -13.f, 54.f, -10.f, 45.f, -10.f, 79.f, -0.f, // 140 .. 149 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, // 150 .. 155 - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 156 .. 165 - 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 166 .. 177 - 54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f, // 178 .. 191 - }; + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 68.f, + -10.f, + 59.f, + -13.f, + 54.f, + -10.f, + 45.f, + -10.f, + 79.f, + -0.f, // 12 .. 21 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -2.f, + 36.f, + -12.f, // 22 .. 27 + 58.f, + -8.f, + 52.f, + -6.f, + 45.f, + -8.f, + 41.f, + -7.f, + 39.f, + -11.f, + 34.f, + -0.f, + 30.f, + -7.f, + 28.f, + -11.f, + 23.f, + -11.f, + 16.f, + -8.f, + 15.f, + -11.f, + 9.f, + -11.f, + 4.f, + -8.f, + 0.f, + -0.f, + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, // 28 .. 47 + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, + 59.f, + -10.f, + 50.f, + -13.f, + 46.f, + -10.f, + 36.f, + -10.f, + 32.f, + -0.f, // 48 .. 58 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 0.f, + -0.f, // 59 .. 63 + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, // 64 .. 73 + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, // 74 .. 85 + 4.f, + -13.f, + 13.f, + -9.f, + 23.f, + -9.f, + 36.f, + -9.f, + 0.f, + -2.f, + 0.f, + -12.f, // 86 .. 91 + 0.f, + -13.f, + 8.f, + -9.f, + 18.f, + -13.f, + 22.f, + -13.f, + 25.f, + -9.f, + 34.f, + -0.f, + 38.f, + -9.f, + 50.f, + -9.f, + 60.f, + -9.f, + 66.f, + -13.f, + 69.f, + -13.f, + 79.f, + -0.f, // 92 .. 103 + 92.f, + -8.f, + 86.f, + -6.f, + 79.f, + -8.f, + 75.f, + -7.f, + 73.f, + -11.f, + 68.f, + -0.f, + 64.f, + -7.f, + 62.f, + -11.f, + 57.f, + -11.f, + 50.f, + -8.f, + 49.f, + -11.f, + 43.f, + -11.f, + 38.f, + -8.f, + 34.f, + -0.f, + 23.f, + -10.f, + 14.f, + -13.f, + 10.f, + -10.f, + 0.f, + -10.f, + 99.f, + -0.f, // 104 .. 122 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -0.f, // 123 .. 127 + 0.f, + -12.f, + 10.f, + -9.f, + 20.f, + -13.f, + 24.f, + -13.f, + 27.f, + -9.f, + 36.f, + -0.f, + 40.f, + -9.f, + 52.f, + -9.f, + 62.f, + -9.f, + 69.f, + -13.f, + 72.f, + -13.f, + 81.f, + -0.f, // 128 .. 139 + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 68.f, + -10.f, + 59.f, + -13.f, + 54.f, + -10.f, + 45.f, + -10.f, + 79.f, + -0.f, // 140 .. 149 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -2.f, + 36.f, + -12.f, // 150 .. 155 + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, // 156 .. 165 + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, // 166 .. 177 + 54.f, + -8.f, + 49.f, + -6.f, + 41.f, + -8.f, + 37.f, + -7.f, + 35.f, + -11.f, + 31.f, + -0.f, + 26.f, + -7.f, + 24.f, + -11.f, + 19.f, + -11.f, + 12.f, + -8.f, + 11.f, + -11.f, + 5.f, + -11.f, + 0.f, + -8.f, + 0.f, + -0.f, // 178 .. 191 + }; struct LineRun line01 = - { - { 0u, 12u }, - { 0u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line02 = - { - { 12u, 10u }, - { 12u, 10u }, - 79.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {12u, 10u}, + {12u, 10u}, + 79.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line03 = - { - { 22u, 6u }, - { 22u, 6u }, - 35.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {22u, 6u}, + {22u, 6u}, + 35.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line04 = - { - { 28u, 14u }, - { 28u, 14u }, - 63.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - true, - false - }; + { + {28u, 14u}, + {28u, 14u}, + 63.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + true, + false}; struct LineRun line05 = - { - { 42, 12u }, - { 42, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - true, - false - }; + { + {42, 12u}, + {42, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + true, + false}; struct LineRun line06 = - { - { 54u, 10u }, - { 54u, 10u }, - 70.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {54u, 10u}, + {54u, 10u}, + 70.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line07 = - { - { 64u, 10u }, - { 64u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - true, - false - }; + { + {64u, 10u}, + {64u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + true, + false}; struct LineRun line08 = - { - { 74u, 12u }, - { 74u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - true, - false - }; + { + {74u, 12u}, + {74u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + true, + false}; struct LineRun line09 = - { - { 86u, 6u }, - { 86u, 6u }, - 45.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {86u, 6u}, + {86u, 6u}, + 45.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line10 = - { - { 92u, 12u }, - { 92u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {92u, 12u}, + {92u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line11 = - { - { 104u, 19u }, - { 104u, 19u }, - 100.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {104u, 19u}, + {104u, 19u}, + 100.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line12 = - { - { 123u, 5u }, - { 123u, 5u }, - 32.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {123u, 5u}, + {123u, 5u}, + 32.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line13 = - { - { 128u, 12u }, - { 128u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {128u, 12u}, + {128u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line14 = - { - { 140u, 10u }, - { 140u, 10u }, - 79.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {140u, 10u}, + {140u, 10u}, + 79.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line15 = - { - { 150u, 6u }, - { 150u, 6u }, - 35.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {150u, 6u}, + {150u, 6u}, + 35.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line16 = - { - { 156u, 10u }, - { 156u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - true, - false - }; + { + {156u, 10u}, + {156u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + true, + false}; struct LineRun line17 = - { - { 166u, 12u }, - { 166u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {166u, 12u}, + {166u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line18 = - { - { 178u, 14u }, - { 178u, 14u }, - 63.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {178u, 14u}, + {178u, 14u}, + 63.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line19 = - { - { 192u, 0u }, - { 192u, 0u }, - 0.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {192u, 0u}, + {192u, 0u}, + 0.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line01 ); - lines.PushBack( line02 ); - lines.PushBack( line03 ); - lines.PushBack( line04 ); - lines.PushBack( line05 ); - lines.PushBack( line06 ); - lines.PushBack( line07 ); - lines.PushBack( line08 ); - lines.PushBack( line09 ); - lines.PushBack( line10 ); - lines.PushBack( line11 ); - lines.PushBack( line12 ); - lines.PushBack( line13 ); - lines.PushBack( line14 ); - lines.PushBack( line15 ); - lines.PushBack( line16 ); - lines.PushBack( line17 ); - lines.PushBack( line18 ); - lines.PushBack( line19 ); + lines.PushBack(line01); + lines.PushBack(line02); + lines.PushBack(line03); + lines.PushBack(line04); + lines.PushBack(line05); + lines.PushBack(line06); + lines.PushBack(line07); + lines.PushBack(line08); + lines.PushBack(line09); + lines.PushBack(line10); + lines.PushBack(line11); + lines.PushBack(line12); + lines.PushBack(line13); + lines.PushBack(line14); + lines.PushBack(line15); + lines.PushBack(line16); + lines.PushBack(line17); + lines.PushBack(line18); + lines.PushBack(line19); LayoutTextData data = - { - "Layout bidirectional text.", - "Hello world demo שלום עולם.\n" - "مرحبا بالعالم hello world שלום עולם\n" - "שלום עולם hello world demo.\n" - "hello world مرحبا بالعالم שלום עולם\n" - "Hello world demo שלום עולם.\n" - "שלום עולם hello world مرحبا بالعالم\n", - textArea, - 17u, - fontDescriptionRuns.Begin(), - layoutSize, - 192u, - positions, - 19u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 64u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout bidirectional text.", + "Hello world demo שלום עולם.\n" + "مرحبا بالعالم hello world שלום עולם\n" + "שלום עולם hello world demo.\n" + "hello world مرحبا بالعالم שלום עולם\n" + "Hello world demo שלום עולם.\n" + "שלום עולם hello world مرحبا بالعالم\n", + textArea, + 17u, + fontDescriptionRuns.Begin(), + layoutSize, + 192u, + positions, + 19u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 64u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -2099,567 +2514,890 @@ int UtcDaliTextUpdateLayout02(void) // Layout some lines of bidirectional text. Update the paragraphs at the middle. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 17u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 17u; + fontDescriptionRun02.characterRun.characterIndex = 17u; fontDescriptionRun02.characterRun.numberOfCharacters = 9u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 26u; + fontDescriptionRun03.characterRun.characterIndex = 26u; fontDescriptionRun03.characterRun.numberOfCharacters = 2u; - fontDescriptionRun03.familyLength = fontLatin.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontLatin.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 28u; + fontDescriptionRun04.characterRun.characterIndex = 28u; fontDescriptionRun04.characterRun.numberOfCharacters = 14u; - fontDescriptionRun04.familyLength = fontArabic.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontArabic.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 42u; + fontDescriptionRun05.characterRun.characterIndex = 42u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 54u; + fontDescriptionRun06.characterRun.characterIndex = 54u; fontDescriptionRun06.characterRun.numberOfCharacters = 10u; - fontDescriptionRun06.familyLength = fontHebrew.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontHebrew.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun07; - fontDescriptionRun07.characterRun.characterIndex = 64u; + fontDescriptionRun07.characterRun.characterIndex = 64u; fontDescriptionRun07.characterRun.numberOfCharacters = 10u; - fontDescriptionRun07.familyLength = fontHebrew.size(); - fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength]; - memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength ); + fontDescriptionRun07.familyLength = fontHebrew.size(); + fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength]; + memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength); fontDescriptionRun07.familyDefined = true; fontDescriptionRun07.weightDefined = false; - fontDescriptionRun07.widthDefined = false; - fontDescriptionRun07.slantDefined = false; - fontDescriptionRun07.sizeDefined = false; + fontDescriptionRun07.widthDefined = false; + fontDescriptionRun07.slantDefined = false; + fontDescriptionRun07.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun08; - fontDescriptionRun08.characterRun.characterIndex = 74u; + fontDescriptionRun08.characterRun.characterIndex = 74u; fontDescriptionRun08.characterRun.numberOfCharacters = 18u; - fontDescriptionRun08.familyLength = fontLatin.size(); - fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength]; - memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength ); + fontDescriptionRun08.familyLength = fontLatin.size(); + fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength]; + memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength); fontDescriptionRun08.familyDefined = true; fontDescriptionRun08.weightDefined = false; - fontDescriptionRun08.widthDefined = false; - fontDescriptionRun08.slantDefined = false; - fontDescriptionRun08.sizeDefined = false; + fontDescriptionRun08.widthDefined = false; + fontDescriptionRun08.slantDefined = false; + fontDescriptionRun08.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun09; - fontDescriptionRun09.characterRun.characterIndex = 92u; + fontDescriptionRun09.characterRun.characterIndex = 92u; fontDescriptionRun09.characterRun.numberOfCharacters = 12u; - fontDescriptionRun09.familyLength = fontLatin.size(); - fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength]; - memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength ); + fontDescriptionRun09.familyLength = fontLatin.size(); + fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength]; + memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength); fontDescriptionRun09.familyDefined = true; fontDescriptionRun09.weightDefined = false; - fontDescriptionRun09.widthDefined = false; - fontDescriptionRun09.slantDefined = false; - fontDescriptionRun09.sizeDefined = false; + fontDescriptionRun09.widthDefined = false; + fontDescriptionRun09.slantDefined = false; + fontDescriptionRun09.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun10; - fontDescriptionRun10.characterRun.characterIndex = 104u; + fontDescriptionRun10.characterRun.characterIndex = 104u; fontDescriptionRun10.characterRun.numberOfCharacters = 14u; - fontDescriptionRun10.familyLength = fontArabic.size(); - fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength]; - memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength ); + fontDescriptionRun10.familyLength = fontArabic.size(); + fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength]; + memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength); fontDescriptionRun10.familyDefined = true; fontDescriptionRun10.weightDefined = false; - fontDescriptionRun10.widthDefined = false; - fontDescriptionRun10.slantDefined = false; - fontDescriptionRun10.sizeDefined = false; + fontDescriptionRun10.widthDefined = false; + fontDescriptionRun10.slantDefined = false; + fontDescriptionRun10.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun11; - fontDescriptionRun11.characterRun.characterIndex = 118u; + fontDescriptionRun11.characterRun.characterIndex = 118u; fontDescriptionRun11.characterRun.numberOfCharacters = 10u; - fontDescriptionRun11.familyLength = fontHebrew.size(); - fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength]; - memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength ); + fontDescriptionRun11.familyLength = fontHebrew.size(); + fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength]; + memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength); fontDescriptionRun11.familyDefined = true; fontDescriptionRun11.weightDefined = false; - fontDescriptionRun11.widthDefined = false; - fontDescriptionRun11.slantDefined = false; - fontDescriptionRun11.sizeDefined = false; + fontDescriptionRun11.widthDefined = false; + fontDescriptionRun11.slantDefined = false; + fontDescriptionRun11.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun12; - fontDescriptionRun12.characterRun.characterIndex = 128u; + fontDescriptionRun12.characterRun.characterIndex = 128u; fontDescriptionRun12.characterRun.numberOfCharacters = 17u; - fontDescriptionRun12.familyLength = fontLatin.size(); - fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength]; - memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength ); + fontDescriptionRun12.familyLength = fontLatin.size(); + fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength]; + memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength); fontDescriptionRun12.familyDefined = true; fontDescriptionRun12.weightDefined = false; - fontDescriptionRun12.widthDefined = false; - fontDescriptionRun12.slantDefined = false; - fontDescriptionRun12.sizeDefined = false; + fontDescriptionRun12.widthDefined = false; + fontDescriptionRun12.slantDefined = false; + fontDescriptionRun12.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun13; - fontDescriptionRun13.characterRun.characterIndex = 145u; + fontDescriptionRun13.characterRun.characterIndex = 145u; fontDescriptionRun13.characterRun.numberOfCharacters = 9u; - fontDescriptionRun13.familyLength = fontHebrew.size(); - fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength]; - memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength ); + fontDescriptionRun13.familyLength = fontHebrew.size(); + fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength]; + memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength); fontDescriptionRun13.familyDefined = true; fontDescriptionRun13.weightDefined = false; - fontDescriptionRun13.widthDefined = false; - fontDescriptionRun13.slantDefined = false; - fontDescriptionRun13.sizeDefined = false; + fontDescriptionRun13.widthDefined = false; + fontDescriptionRun13.slantDefined = false; + fontDescriptionRun13.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun14; - fontDescriptionRun14.characterRun.characterIndex = 154u; + fontDescriptionRun14.characterRun.characterIndex = 154u; fontDescriptionRun14.characterRun.numberOfCharacters = 2u; - fontDescriptionRun14.familyLength = fontLatin.size(); - fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength]; - memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength ); + fontDescriptionRun14.familyLength = fontLatin.size(); + fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength]; + memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength); fontDescriptionRun14.familyDefined = true; fontDescriptionRun14.weightDefined = false; - fontDescriptionRun14.widthDefined = false; - fontDescriptionRun14.slantDefined = false; - fontDescriptionRun14.sizeDefined = false; + fontDescriptionRun14.widthDefined = false; + fontDescriptionRun14.slantDefined = false; + fontDescriptionRun14.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun15; - fontDescriptionRun15.characterRun.characterIndex = 156u; + fontDescriptionRun15.characterRun.characterIndex = 156u; fontDescriptionRun15.characterRun.numberOfCharacters = 10u; - fontDescriptionRun15.familyLength = fontHebrew.size(); - fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength]; - memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength ); + fontDescriptionRun15.familyLength = fontHebrew.size(); + fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength]; + memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength); fontDescriptionRun15.familyDefined = true; fontDescriptionRun15.weightDefined = false; - fontDescriptionRun15.widthDefined = false; - fontDescriptionRun15.slantDefined = false; - fontDescriptionRun15.sizeDefined = false; + fontDescriptionRun15.widthDefined = false; + fontDescriptionRun15.slantDefined = false; + fontDescriptionRun15.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun16; - fontDescriptionRun16.characterRun.characterIndex = 166u; + fontDescriptionRun16.characterRun.characterIndex = 166u; fontDescriptionRun16.characterRun.numberOfCharacters = 12u; - fontDescriptionRun16.familyLength = fontLatin.size(); - fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength]; - memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength ); + fontDescriptionRun16.familyLength = fontLatin.size(); + fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength]; + memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength); fontDescriptionRun16.familyDefined = true; fontDescriptionRun16.weightDefined = false; - fontDescriptionRun16.widthDefined = false; - fontDescriptionRun16.slantDefined = false; - fontDescriptionRun16.sizeDefined = false; + fontDescriptionRun16.widthDefined = false; + fontDescriptionRun16.slantDefined = false; + fontDescriptionRun16.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun17; - fontDescriptionRun17.characterRun.characterIndex = 178u; + fontDescriptionRun17.characterRun.characterIndex = 178u; fontDescriptionRun17.characterRun.numberOfCharacters = 14u; - fontDescriptionRun17.familyLength = fontArabic.size(); - fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength]; - memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength ); + fontDescriptionRun17.familyLength = fontArabic.size(); + fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength]; + memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength); fontDescriptionRun17.familyDefined = true; fontDescriptionRun17.weightDefined = false; - fontDescriptionRun17.widthDefined = false; - fontDescriptionRun17.slantDefined = false; - fontDescriptionRun17.sizeDefined = false; + fontDescriptionRun17.widthDefined = false; + fontDescriptionRun17.slantDefined = false; + fontDescriptionRun17.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); - fontDescriptionRuns.PushBack( fontDescriptionRun07 ); - fontDescriptionRuns.PushBack( fontDescriptionRun08 ); - fontDescriptionRuns.PushBack( fontDescriptionRun09 ); - fontDescriptionRuns.PushBack( fontDescriptionRun10 ); - fontDescriptionRuns.PushBack( fontDescriptionRun11 ); - fontDescriptionRuns.PushBack( fontDescriptionRun12 ); - fontDescriptionRuns.PushBack( fontDescriptionRun13 ); - fontDescriptionRuns.PushBack( fontDescriptionRun14 ); - fontDescriptionRuns.PushBack( fontDescriptionRun15 ); - fontDescriptionRuns.PushBack( fontDescriptionRun16 ); - fontDescriptionRuns.PushBack( fontDescriptionRun17 ); - Size textArea(100.f, 300.f); - Size layoutSize(100.f, 380.f); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); + fontDescriptionRuns.PushBack(fontDescriptionRun07); + fontDescriptionRuns.PushBack(fontDescriptionRun08); + fontDescriptionRuns.PushBack(fontDescriptionRun09); + fontDescriptionRuns.PushBack(fontDescriptionRun10); + fontDescriptionRuns.PushBack(fontDescriptionRun11); + fontDescriptionRuns.PushBack(fontDescriptionRun12); + fontDescriptionRuns.PushBack(fontDescriptionRun13); + fontDescriptionRuns.PushBack(fontDescriptionRun14); + fontDescriptionRuns.PushBack(fontDescriptionRun15); + fontDescriptionRuns.PushBack(fontDescriptionRun16); + fontDescriptionRuns.PushBack(fontDescriptionRun17); + Size textArea(100.f, 300.f); + Size layoutSize(100.f, 380.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 68.f, -10.f, 59.f, -13.f, 54.f, -10.f, 45.f, -10.f, 79.f, -0.f, // 12 .. 21 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, // 22 .. 27 - 58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, // 28 .. 47 - 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 46.f, -10.f, 36.f, -10.f, 32.f, -0.f, // 48 .. 58 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63 - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 64 .. 73 - 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 74 .. 85 - 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f, // 86 .. 91 - 0.f, -13.f, 8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f, // 92 .. 103 - 92.f, -8.f, 86.f, -6.f, 79.f, -8.f, 75.f, -7.f, 73.f, -11.f, 68.f, -0.f, 64.f, -7.f, 62.f, -11.f, 57.f, -11.f, 50.f, -8.f, 49.f, -11.f, 43.f, -11.f, 38.f, -8.f, 34.f, -0.f, 23.f, -10.f, 14.f, -13.f, 10.f, -10.f, 0.f, -10.f, 99.f, -0.f, // 104 .. 122 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -0.f, // 123 .. 127 - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 128 .. 139 - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 68.f, -10.f, 59.f, -13.f, 54.f, -10.f, 45.f, -10.f, 79.f, -0.f, // 140 .. 149 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, // 150 .. 155 - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 156 .. 165 - 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 166 .. 177 - 54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f, // 178 .. 191 - }; + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 68.f, + -10.f, + 59.f, + -13.f, + 54.f, + -10.f, + 45.f, + -10.f, + 79.f, + -0.f, // 12 .. 21 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -2.f, + 36.f, + -12.f, // 22 .. 27 + 58.f, + -8.f, + 52.f, + -6.f, + 45.f, + -8.f, + 41.f, + -7.f, + 39.f, + -11.f, + 34.f, + -0.f, + 30.f, + -7.f, + 28.f, + -11.f, + 23.f, + -11.f, + 16.f, + -8.f, + 15.f, + -11.f, + 9.f, + -11.f, + 4.f, + -8.f, + 0.f, + -0.f, + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, // 28 .. 47 + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, + 59.f, + -10.f, + 50.f, + -13.f, + 46.f, + -10.f, + 36.f, + -10.f, + 32.f, + -0.f, // 48 .. 58 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 0.f, + -0.f, // 59 .. 63 + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, // 64 .. 73 + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, // 74 .. 85 + 4.f, + -13.f, + 13.f, + -9.f, + 23.f, + -9.f, + 36.f, + -9.f, + 0.f, + -2.f, + 0.f, + -12.f, // 86 .. 91 + 0.f, + -13.f, + 8.f, + -9.f, + 18.f, + -13.f, + 22.f, + -13.f, + 25.f, + -9.f, + 34.f, + -0.f, + 38.f, + -9.f, + 50.f, + -9.f, + 60.f, + -9.f, + 66.f, + -13.f, + 69.f, + -13.f, + 79.f, + -0.f, // 92 .. 103 + 92.f, + -8.f, + 86.f, + -6.f, + 79.f, + -8.f, + 75.f, + -7.f, + 73.f, + -11.f, + 68.f, + -0.f, + 64.f, + -7.f, + 62.f, + -11.f, + 57.f, + -11.f, + 50.f, + -8.f, + 49.f, + -11.f, + 43.f, + -11.f, + 38.f, + -8.f, + 34.f, + -0.f, + 23.f, + -10.f, + 14.f, + -13.f, + 10.f, + -10.f, + 0.f, + -10.f, + 99.f, + -0.f, // 104 .. 122 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -0.f, // 123 .. 127 + 0.f, + -12.f, + 10.f, + -9.f, + 20.f, + -13.f, + 24.f, + -13.f, + 27.f, + -9.f, + 36.f, + -0.f, + 40.f, + -9.f, + 52.f, + -9.f, + 62.f, + -9.f, + 69.f, + -13.f, + 72.f, + -13.f, + 81.f, + -0.f, // 128 .. 139 + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 68.f, + -10.f, + 59.f, + -13.f, + 54.f, + -10.f, + 45.f, + -10.f, + 79.f, + -0.f, // 140 .. 149 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -2.f, + 36.f, + -12.f, // 150 .. 155 + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, // 156 .. 165 + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, // 166 .. 177 + 54.f, + -8.f, + 49.f, + -6.f, + 41.f, + -8.f, + 37.f, + -7.f, + 35.f, + -11.f, + 31.f, + -0.f, + 26.f, + -7.f, + 24.f, + -11.f, + 19.f, + -11.f, + 12.f, + -8.f, + 11.f, + -11.f, + 5.f, + -11.f, + 0.f, + -8.f, + 0.f, + -0.f, // 178 .. 191 + }; struct LineRun line01 = - { - { 0u, 12u }, - { 0u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line02 = - { - { 12u, 10u }, - { 12u, 10u }, - 79.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {12u, 10u}, + {12u, 10u}, + 79.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line03 = - { - { 22u, 6u }, - { 22u, 6u }, - 35.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {22u, 6u}, + {22u, 6u}, + 35.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line04 = - { - { 28u, 14u }, - { 28u, 14u }, - 63.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - true, - false - }; + { + {28u, 14u}, + {28u, 14u}, + 63.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + true, + false}; struct LineRun line05 = - { - { 42u, 12u }, - { 42u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {42u, 12u}, + {42u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line06 = - { - { 54u, 10u }, - { 54u, 10u }, - 70.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {54u, 10u}, + {54u, 10u}, + 70.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line07 = - { - { 64u, 10u }, - { 64u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {64u, 10u}, + {64u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line08 = - { - { 74u, 12u }, - { 74u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 1.f, - 0.f, - false, - false - }; + { + {74u, 12u}, + {74u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 1.f, + 0.f, + false, + false}; struct LineRun line09 = - { - { 86u, 6u }, - { 86u, 6u }, - 45.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {86u, 6u}, + {86u, 6u}, + 45.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line10 = - { - { 92u, 12u }, - { 92u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {92u, 12u}, + {92u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line11 = - { - { 104u, 19u }, - { 104u, 19u }, - 100.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {104u, 19u}, + {104u, 19u}, + 100.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line12 = - { - { 123u, 5u }, - { 123u, 5u }, - 32.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {123u, 5u}, + {123u, 5u}, + 32.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line13 = - { - { 128u, 12u }, - { 128u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {128u, 12u}, + {128u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line14 = - { - { 140u, 10u }, - { 140u, 10u }, - 79.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {140u, 10u}, + {140u, 10u}, + 79.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line15 = - { - { 150u, 6u }, - { 150u, 6u }, - 35.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {150u, 6u}, + {150u, 6u}, + 35.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line16 = - { - { 156u, 10u }, - { 156u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {156u, 10u}, + {156u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line17 = - { - { 166u, 12u }, - { 166u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {166u, 12u}, + {166u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line18 = - { - { 178u, 14u }, - { 178u, 14u }, - 63.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {178u, 14u}, + {178u, 14u}, + 63.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line19 = - { - { 192u, 0u }, - { 192u, 0u }, - 0.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {192u, 0u}, + {192u, 0u}, + 0.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line01 ); - lines.PushBack( line02 ); - lines.PushBack( line03 ); - lines.PushBack( line04 ); - lines.PushBack( line05 ); - lines.PushBack( line06 ); - lines.PushBack( line07 ); - lines.PushBack( line08 ); - lines.PushBack( line09 ); - lines.PushBack( line10 ); - lines.PushBack( line11 ); - lines.PushBack( line12 ); - lines.PushBack( line13 ); - lines.PushBack( line14 ); - lines.PushBack( line15 ); - lines.PushBack( line16 ); - lines.PushBack( line17 ); - lines.PushBack( line18 ); - lines.PushBack( line19 ); + lines.PushBack(line01); + lines.PushBack(line02); + lines.PushBack(line03); + lines.PushBack(line04); + lines.PushBack(line05); + lines.PushBack(line06); + lines.PushBack(line07); + lines.PushBack(line08); + lines.PushBack(line09); + lines.PushBack(line10); + lines.PushBack(line11); + lines.PushBack(line12); + lines.PushBack(line13); + lines.PushBack(line14); + lines.PushBack(line15); + lines.PushBack(line16); + lines.PushBack(line17); + lines.PushBack(line18); + lines.PushBack(line19); LayoutTextData data = - { - "Layout bidirectional text.", - "Hello world demo שלום עולם.\n" - "مرحبا بالعالم hello world שלום עולם\n" - "שלום עולם hello world demo.\n" - "hello world مرحبا بالعالم שלום עולם\n" - "Hello world demo שלום עולם.\n" - "שלום עולם hello world مرحبا بالعالم\n", - textArea, - 17u, - fontDescriptionRuns.Begin(), - layoutSize, - 192u, - positions, - 19u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 64u, - 64u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout bidirectional text.", + "Hello world demo שלום עולם.\n" + "مرحبا بالعالم hello world שלום עולם\n" + "שלום עולם hello world demo.\n" + "hello world مرحبا بالعالم שלום עולם\n" + "Hello world demo שלום עולם.\n" + "שלום עולם hello world مرحبا بالعالم\n", + textArea, + 17u, + fontDescriptionRuns.Begin(), + layoutSize, + 192u, + positions, + 19u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 64u, + 64u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -2675,567 +3413,890 @@ int UtcDaliTextUpdateLayout03(void) // Layout some lines of bidirectional text. Update the paragraphs at the middle. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 17u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 17u; + fontDescriptionRun02.characterRun.characterIndex = 17u; fontDescriptionRun02.characterRun.numberOfCharacters = 9u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 26u; + fontDescriptionRun03.characterRun.characterIndex = 26u; fontDescriptionRun03.characterRun.numberOfCharacters = 2u; - fontDescriptionRun03.familyLength = fontLatin.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontLatin.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 28u; + fontDescriptionRun04.characterRun.characterIndex = 28u; fontDescriptionRun04.characterRun.numberOfCharacters = 14u; - fontDescriptionRun04.familyLength = fontArabic.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontArabic.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 42u; + fontDescriptionRun05.characterRun.characterIndex = 42u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 54u; + fontDescriptionRun06.characterRun.characterIndex = 54u; fontDescriptionRun06.characterRun.numberOfCharacters = 10u; - fontDescriptionRun06.familyLength = fontHebrew.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontHebrew.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun07; - fontDescriptionRun07.characterRun.characterIndex = 64u; + fontDescriptionRun07.characterRun.characterIndex = 64u; fontDescriptionRun07.characterRun.numberOfCharacters = 10u; - fontDescriptionRun07.familyLength = fontHebrew.size(); - fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength]; - memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength ); + fontDescriptionRun07.familyLength = fontHebrew.size(); + fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength]; + memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength); fontDescriptionRun07.familyDefined = true; fontDescriptionRun07.weightDefined = false; - fontDescriptionRun07.widthDefined = false; - fontDescriptionRun07.slantDefined = false; - fontDescriptionRun07.sizeDefined = false; + fontDescriptionRun07.widthDefined = false; + fontDescriptionRun07.slantDefined = false; + fontDescriptionRun07.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun08; - fontDescriptionRun08.characterRun.characterIndex = 74u; + fontDescriptionRun08.characterRun.characterIndex = 74u; fontDescriptionRun08.characterRun.numberOfCharacters = 18u; - fontDescriptionRun08.familyLength = fontLatin.size(); - fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength]; - memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength ); + fontDescriptionRun08.familyLength = fontLatin.size(); + fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength]; + memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength); fontDescriptionRun08.familyDefined = true; fontDescriptionRun08.weightDefined = false; - fontDescriptionRun08.widthDefined = false; - fontDescriptionRun08.slantDefined = false; - fontDescriptionRun08.sizeDefined = false; + fontDescriptionRun08.widthDefined = false; + fontDescriptionRun08.slantDefined = false; + fontDescriptionRun08.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun09; - fontDescriptionRun09.characterRun.characterIndex = 92u; + fontDescriptionRun09.characterRun.characterIndex = 92u; fontDescriptionRun09.characterRun.numberOfCharacters = 12u; - fontDescriptionRun09.familyLength = fontLatin.size(); - fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength]; - memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength ); + fontDescriptionRun09.familyLength = fontLatin.size(); + fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength]; + memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength); fontDescriptionRun09.familyDefined = true; fontDescriptionRun09.weightDefined = false; - fontDescriptionRun09.widthDefined = false; - fontDescriptionRun09.slantDefined = false; - fontDescriptionRun09.sizeDefined = false; + fontDescriptionRun09.widthDefined = false; + fontDescriptionRun09.slantDefined = false; + fontDescriptionRun09.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun10; - fontDescriptionRun10.characterRun.characterIndex = 104u; + fontDescriptionRun10.characterRun.characterIndex = 104u; fontDescriptionRun10.characterRun.numberOfCharacters = 14u; - fontDescriptionRun10.familyLength = fontArabic.size(); - fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength]; - memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength ); + fontDescriptionRun10.familyLength = fontArabic.size(); + fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength]; + memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength); fontDescriptionRun10.familyDefined = true; fontDescriptionRun10.weightDefined = false; - fontDescriptionRun10.widthDefined = false; - fontDescriptionRun10.slantDefined = false; - fontDescriptionRun10.sizeDefined = false; + fontDescriptionRun10.widthDefined = false; + fontDescriptionRun10.slantDefined = false; + fontDescriptionRun10.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun11; - fontDescriptionRun11.characterRun.characterIndex = 118u; + fontDescriptionRun11.characterRun.characterIndex = 118u; fontDescriptionRun11.characterRun.numberOfCharacters = 10u; - fontDescriptionRun11.familyLength = fontHebrew.size(); - fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength]; - memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength ); + fontDescriptionRun11.familyLength = fontHebrew.size(); + fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength]; + memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength); fontDescriptionRun11.familyDefined = true; fontDescriptionRun11.weightDefined = false; - fontDescriptionRun11.widthDefined = false; - fontDescriptionRun11.slantDefined = false; - fontDescriptionRun11.sizeDefined = false; + fontDescriptionRun11.widthDefined = false; + fontDescriptionRun11.slantDefined = false; + fontDescriptionRun11.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun12; - fontDescriptionRun12.characterRun.characterIndex = 128u; + fontDescriptionRun12.characterRun.characterIndex = 128u; fontDescriptionRun12.characterRun.numberOfCharacters = 17u; - fontDescriptionRun12.familyLength = fontLatin.size(); - fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength]; - memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength ); + fontDescriptionRun12.familyLength = fontLatin.size(); + fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength]; + memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength); fontDescriptionRun12.familyDefined = true; fontDescriptionRun12.weightDefined = false; - fontDescriptionRun12.widthDefined = false; - fontDescriptionRun12.slantDefined = false; - fontDescriptionRun12.sizeDefined = false; + fontDescriptionRun12.widthDefined = false; + fontDescriptionRun12.slantDefined = false; + fontDescriptionRun12.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun13; - fontDescriptionRun13.characterRun.characterIndex = 145u; + fontDescriptionRun13.characterRun.characterIndex = 145u; fontDescriptionRun13.characterRun.numberOfCharacters = 9u; - fontDescriptionRun13.familyLength = fontHebrew.size(); - fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength]; - memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength ); + fontDescriptionRun13.familyLength = fontHebrew.size(); + fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength]; + memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength); fontDescriptionRun13.familyDefined = true; fontDescriptionRun13.weightDefined = false; - fontDescriptionRun13.widthDefined = false; - fontDescriptionRun13.slantDefined = false; - fontDescriptionRun13.sizeDefined = false; + fontDescriptionRun13.widthDefined = false; + fontDescriptionRun13.slantDefined = false; + fontDescriptionRun13.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun14; - fontDescriptionRun14.characterRun.characterIndex = 154u; + fontDescriptionRun14.characterRun.characterIndex = 154u; fontDescriptionRun14.characterRun.numberOfCharacters = 2u; - fontDescriptionRun14.familyLength = fontLatin.size(); - fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength]; - memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength ); + fontDescriptionRun14.familyLength = fontLatin.size(); + fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength]; + memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength); fontDescriptionRun14.familyDefined = true; fontDescriptionRun14.weightDefined = false; - fontDescriptionRun14.widthDefined = false; - fontDescriptionRun14.slantDefined = false; - fontDescriptionRun14.sizeDefined = false; + fontDescriptionRun14.widthDefined = false; + fontDescriptionRun14.slantDefined = false; + fontDescriptionRun14.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun15; - fontDescriptionRun15.characterRun.characterIndex = 156u; + fontDescriptionRun15.characterRun.characterIndex = 156u; fontDescriptionRun15.characterRun.numberOfCharacters = 10u; - fontDescriptionRun15.familyLength = fontHebrew.size(); - fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength]; - memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength ); + fontDescriptionRun15.familyLength = fontHebrew.size(); + fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength]; + memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength); fontDescriptionRun15.familyDefined = true; fontDescriptionRun15.weightDefined = false; - fontDescriptionRun15.widthDefined = false; - fontDescriptionRun15.slantDefined = false; - fontDescriptionRun15.sizeDefined = false; + fontDescriptionRun15.widthDefined = false; + fontDescriptionRun15.slantDefined = false; + fontDescriptionRun15.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun16; - fontDescriptionRun16.characterRun.characterIndex = 166u; + fontDescriptionRun16.characterRun.characterIndex = 166u; fontDescriptionRun16.characterRun.numberOfCharacters = 12u; - fontDescriptionRun16.familyLength = fontLatin.size(); - fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength]; - memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength ); + fontDescriptionRun16.familyLength = fontLatin.size(); + fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength]; + memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength); fontDescriptionRun16.familyDefined = true; fontDescriptionRun16.weightDefined = false; - fontDescriptionRun16.widthDefined = false; - fontDescriptionRun16.slantDefined = false; - fontDescriptionRun16.sizeDefined = false; + fontDescriptionRun16.widthDefined = false; + fontDescriptionRun16.slantDefined = false; + fontDescriptionRun16.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun17; - fontDescriptionRun17.characterRun.characterIndex = 178u; + fontDescriptionRun17.characterRun.characterIndex = 178u; fontDescriptionRun17.characterRun.numberOfCharacters = 14u; - fontDescriptionRun17.familyLength = fontArabic.size(); - fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength]; - memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength ); + fontDescriptionRun17.familyLength = fontArabic.size(); + fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength]; + memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength); fontDescriptionRun17.familyDefined = true; fontDescriptionRun17.weightDefined = false; - fontDescriptionRun17.widthDefined = false; - fontDescriptionRun17.slantDefined = false; - fontDescriptionRun17.sizeDefined = false; + fontDescriptionRun17.widthDefined = false; + fontDescriptionRun17.slantDefined = false; + fontDescriptionRun17.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); - fontDescriptionRuns.PushBack( fontDescriptionRun07 ); - fontDescriptionRuns.PushBack( fontDescriptionRun08 ); - fontDescriptionRuns.PushBack( fontDescriptionRun09 ); - fontDescriptionRuns.PushBack( fontDescriptionRun10 ); - fontDescriptionRuns.PushBack( fontDescriptionRun11 ); - fontDescriptionRuns.PushBack( fontDescriptionRun12 ); - fontDescriptionRuns.PushBack( fontDescriptionRun13 ); - fontDescriptionRuns.PushBack( fontDescriptionRun14 ); - fontDescriptionRuns.PushBack( fontDescriptionRun15 ); - fontDescriptionRuns.PushBack( fontDescriptionRun16 ); - fontDescriptionRuns.PushBack( fontDescriptionRun17 ); - Size textArea(100.f, 300.f); - Size layoutSize(100.f, 380.f); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); + fontDescriptionRuns.PushBack(fontDescriptionRun07); + fontDescriptionRuns.PushBack(fontDescriptionRun08); + fontDescriptionRuns.PushBack(fontDescriptionRun09); + fontDescriptionRuns.PushBack(fontDescriptionRun10); + fontDescriptionRuns.PushBack(fontDescriptionRun11); + fontDescriptionRuns.PushBack(fontDescriptionRun12); + fontDescriptionRuns.PushBack(fontDescriptionRun13); + fontDescriptionRuns.PushBack(fontDescriptionRun14); + fontDescriptionRuns.PushBack(fontDescriptionRun15); + fontDescriptionRuns.PushBack(fontDescriptionRun16); + fontDescriptionRuns.PushBack(fontDescriptionRun17); + Size textArea(100.f, 300.f); + Size layoutSize(100.f, 380.f); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 68.f, -10.f, 59.f, -13.f, 54.f, -10.f, 45.f, -10.f, 79.f, -0.f, // 12 .. 21 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, // 22 .. 27 - 58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, // 28 .. 47 - 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 46.f, -10.f, 36.f, -10.f, 32.f, -0.f, // 48 .. 58 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f, // 59 .. 63 - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 64 .. 73 - 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 74 .. 85 - 4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f, // 86 .. 91 - 0.f, -13.f, 8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f, // 92 .. 103 - 92.f, -8.f, 86.f, -6.f, 79.f, -8.f, 75.f, -7.f, 73.f, -11.f, 68.f, -0.f, 64.f, -7.f, 62.f, -11.f, 57.f, -11.f, 50.f, -8.f, 49.f, -11.f, 43.f, -11.f, 38.f, -8.f, 34.f, -0.f, 23.f, -10.f, 14.f, -13.f, 10.f, -10.f, 0.f, -10.f, 99.f, -0.f, // 104 .. 122 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -0.f, // 123 .. 127 - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 128 .. 139 - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 68.f, -10.f, 59.f, -13.f, 54.f, -10.f, 45.f, -10.f, 79.f, -0.f, // 140 .. 149 - 23.f, -10.f, 19.f, -10.f, 10.f, -13.f, 0.f, -10.f, 32.f, -2.f, 36.f, -12.f, // 150 .. 155 - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, // 156 .. 165 - 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, // 166 .. 177 - 54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f, // 178 .. 191 - }; + { + 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, // 0 .. 11 + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 68.f, + -10.f, + 59.f, + -13.f, + 54.f, + -10.f, + 45.f, + -10.f, + 79.f, + -0.f, // 12 .. 21 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -2.f, + 36.f, + -12.f, // 22 .. 27 + 58.f, + -8.f, + 52.f, + -6.f, + 45.f, + -8.f, + 41.f, + -7.f, + 39.f, + -11.f, + 34.f, + -0.f, + 30.f, + -7.f, + 28.f, + -11.f, + 23.f, + -11.f, + 16.f, + -8.f, + 15.f, + -11.f, + 9.f, + -11.f, + 4.f, + -8.f, + 0.f, + -0.f, + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, // 28 .. 47 + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, + 59.f, + -10.f, + 50.f, + -13.f, + 46.f, + -10.f, + 36.f, + -10.f, + 32.f, + -0.f, // 48 .. 58 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 0.f, + -0.f, // 59 .. 63 + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, // 64 .. 73 + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, // 74 .. 85 + 4.f, + -13.f, + 13.f, + -9.f, + 23.f, + -9.f, + 36.f, + -9.f, + 0.f, + -2.f, + 0.f, + -12.f, // 86 .. 91 + 0.f, + -13.f, + 8.f, + -9.f, + 18.f, + -13.f, + 22.f, + -13.f, + 25.f, + -9.f, + 34.f, + -0.f, + 38.f, + -9.f, + 50.f, + -9.f, + 60.f, + -9.f, + 66.f, + -13.f, + 69.f, + -13.f, + 79.f, + -0.f, // 92 .. 103 + 92.f, + -8.f, + 86.f, + -6.f, + 79.f, + -8.f, + 75.f, + -7.f, + 73.f, + -11.f, + 68.f, + -0.f, + 64.f, + -7.f, + 62.f, + -11.f, + 57.f, + -11.f, + 50.f, + -8.f, + 49.f, + -11.f, + 43.f, + -11.f, + 38.f, + -8.f, + 34.f, + -0.f, + 23.f, + -10.f, + 14.f, + -13.f, + 10.f, + -10.f, + 0.f, + -10.f, + 99.f, + -0.f, // 104 .. 122 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -0.f, // 123 .. 127 + 0.f, + -12.f, + 10.f, + -9.f, + 20.f, + -13.f, + 24.f, + -13.f, + 27.f, + -9.f, + 36.f, + -0.f, + 40.f, + -9.f, + 52.f, + -9.f, + 62.f, + -9.f, + 69.f, + -13.f, + 72.f, + -13.f, + 81.f, + -0.f, // 128 .. 139 + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 68.f, + -10.f, + 59.f, + -13.f, + 54.f, + -10.f, + 45.f, + -10.f, + 79.f, + -0.f, // 140 .. 149 + 23.f, + -10.f, + 19.f, + -10.f, + 10.f, + -13.f, + 0.f, + -10.f, + 32.f, + -2.f, + 36.f, + -12.f, // 150 .. 155 + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, // 156 .. 165 + 4.f, + -13.f, + 12.f, + -9.f, + 22.f, + -13.f, + 26.f, + -13.f, + 29.f, + -9.f, + 38.f, + -0.f, + 42.f, + -9.f, + 54.f, + -9.f, + 64.f, + -9.f, + 70.f, + -13.f, + 73.f, + -13.f, + 0.f, + -0.f, // 166 .. 177 + 54.f, + -8.f, + 49.f, + -6.f, + 41.f, + -8.f, + 37.f, + -7.f, + 35.f, + -11.f, + 31.f, + -0.f, + 26.f, + -7.f, + 24.f, + -11.f, + 19.f, + -11.f, + 12.f, + -8.f, + 11.f, + -11.f, + 5.f, + -11.f, + 0.f, + -8.f, + 0.f, + -0.f, // 178 .. 191 + }; struct LineRun line01 = - { - { 0u, 12u }, - { 0u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line02 = - { - { 12u, 10u }, - { 12u, 10u }, - 79.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {12u, 10u}, + {12u, 10u}, + 79.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line03 = - { - { 22u, 6u }, - { 22u, 6u }, - 35.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {22u, 6u}, + {22u, 6u}, + 35.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line04 = - { - { 28u, 14u }, - { 28u, 14u }, - 63.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {28u, 14u}, + {28u, 14u}, + 63.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line05 = - { - { 42u, 12u }, - { 42u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {42u, 12u}, + {42u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line06 = - { - { 54u, 10u }, - { 54u, 10u }, - 70.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {54u, 10u}, + {54u, 10u}, + 70.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line07 = - { - { 64u, 10u }, - { 64u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {64u, 10u}, + {64u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line08 = - { - { 74u, 12u }, - { 74u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 1.f, - 0.f, - false, - false - }; + { + {74u, 12u}, + {74u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 1.f, + 0.f, + false, + false}; struct LineRun line09 = - { - { 86u, 6u }, - { 86u, 6u }, - 45.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {86u, 6u}, + {86u, 6u}, + 45.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line10 = - { - { 92u, 12u }, - { 92u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {92u, 12u}, + {92u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line11 = - { - { 104u, 19u }, - { 104u, 19u }, - 100.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {104u, 19u}, + {104u, 19u}, + 100.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line12 = - { - { 123u, 5u }, - { 123u, 5u }, - 32.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {123u, 5u}, + {123u, 5u}, + 32.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line13 = - { - { 128u, 12u }, - { 128u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {128u, 12u}, + {128u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line14 = - { - { 140u, 10u }, - { 140u, 10u }, - 79.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {140u, 10u}, + {140u, 10u}, + 79.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line15 = - { - { 150u, 6u }, - { 150u, 6u }, - 35.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {150u, 6u}, + {150u, 6u}, + 35.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line16 = - { - { 156u, 10u }, - { 156u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {156u, 10u}, + {156u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line17 = - { - { 166u, 12u }, - { 166u, 12u }, - 79.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {166u, 12u}, + {166u, 12u}, + 79.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line18 = - { - { 178u, 14u }, - { 178u, 14u }, - 63.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {178u, 14u}, + {178u, 14u}, + 63.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; struct LineRun line19 = - { - { 192u, 0u }, - { 192u, 0u }, - 0.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {192u, 0u}, + {192u, 0u}, + 0.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines; - lines.PushBack( line01 ); - lines.PushBack( line02 ); - lines.PushBack( line03 ); - lines.PushBack( line04 ); - lines.PushBack( line05 ); - lines.PushBack( line06 ); - lines.PushBack( line07 ); - lines.PushBack( line08 ); - lines.PushBack( line09 ); - lines.PushBack( line10 ); - lines.PushBack( line11 ); - lines.PushBack( line12 ); - lines.PushBack( line13 ); - lines.PushBack( line14 ); - lines.PushBack( line15 ); - lines.PushBack( line16 ); - lines.PushBack( line17 ); - lines.PushBack( line18 ); - lines.PushBack( line19 ); + lines.PushBack(line01); + lines.PushBack(line02); + lines.PushBack(line03); + lines.PushBack(line04); + lines.PushBack(line05); + lines.PushBack(line06); + lines.PushBack(line07); + lines.PushBack(line08); + lines.PushBack(line09); + lines.PushBack(line10); + lines.PushBack(line11); + lines.PushBack(line12); + lines.PushBack(line13); + lines.PushBack(line14); + lines.PushBack(line15); + lines.PushBack(line16); + lines.PushBack(line17); + lines.PushBack(line18); + lines.PushBack(line19); LayoutTextData data = - { - "Layout bidirectional text.", - "Hello world demo שלום עולם.\n" - "مرحبا بالعالم hello world שלום עולם\n" - "שלום עולם hello world demo.\n" - "hello world مرحبا بالعالم שלום עולם\n" - "Hello world demo שלום עולם.\n" - "שלום עולם hello world مرحبا بالعالم\n", - textArea, - 17u, - fontDescriptionRuns.Begin(), - layoutSize, - 192u, - positions, - 19u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 128u, - 64u, - false, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout bidirectional text.", + "Hello world demo שלום עולם.\n" + "مرحبا بالعالم hello world שלום עולם\n" + "שלום עולם hello world demo.\n" + "hello world مرحبا بالعالم שלום עולם\n" + "Hello world demo שלום עולם.\n" + "שלום עולם hello world مرحبا بالعالم\n", + textArea, + 17u, + fontDescriptionRuns.Begin(), + layoutSize, + 192u, + positions, + 19u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 128u, + 64u, + false, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -3251,69 +4312,92 @@ int UtcDaliTextLayoutEllipsis01(void) // Layout single-line LTR text with ellipsis. - const std::string fontLatin( "TizenSans" ); + const std::string fontLatin("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 51u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); struct LineRun line01 = - { - { 0u, 13u }, - { 0u, 13u }, - 93.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - true - }; + { + {0u, 13u}, + {0u, 13u}, + 93.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + true}; Vector lines; - lines.PushBack( line01 ); + lines.PushBack(line01); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, 85.f, -13.f, - }; - - Size textArea( 100.f, 50.f ); - Size layoutSize( 100.f, 20.f ); + { + 0.f, + -12.f, + 10.f, + -9.f, + 20.f, + -13.f, + 24.f, + -13.f, + 27.f, + -9.f, + 36.f, + -0.f, + 40.f, + -9.f, + 52.f, + -9.f, + 62.f, + -9.f, + 69.f, + -13.f, + 72.f, + -13.f, + 81.f, + -0.f, + 85.f, + -13.f, + }; + + Size textArea(100.f, 50.f); + Size layoutSize(100.f, 20.f); LayoutTextData data = - { - "Layout single-line LTR text with ellipsis.", - "Hello world demo hello world demo hello world demo.", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 13u, - positions, - 1u, - lines.Begin(), - Layout::Engine::SINGLE_LINE_BOX, - 0u, - 51u, - true, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout single-line LTR text with ellipsis.", + "Hello world demo hello world demo hello world demo.", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 13u, + positions, + 1u, + lines.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 51u, + true, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -3329,84 +4413,127 @@ int UtcDaliTextLayoutEllipsis02(void) // Layout multi-line LTR text with ellipsis. - const std::string fontLatin( "TizenSans" ); + const std::string fontLatin("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 51u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); struct LineRun line01 = - { - { 0u, 12u }, - { 0u, 12u }, - 81.f, - 15.f, - -5.f, - 4.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 12u}, + {0u, 12u}, + 81.f, + 15.f, + -5.f, + 4.f, + 0.f, + 0.f, + false, + false}; struct LineRun line02 = - { - { 12u, 12u }, - { 12u, 12u }, - 95.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - true - }; + { + {12u, 12u}, + {12u, 12u}, + 95.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + true}; Vector lines; - lines.PushBack( line01 ); - lines.PushBack( line02 ); + lines.PushBack(line01); + lines.PushBack(line02); float positions[] = - { - 0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, - 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 46.f, -13.f, 54.f, -9.f, 64.f, -13.f, 68.f, -13.f, 71.f, -9.f, 80.f, -0.f, 84.f, -9.f, - }; - - Size textArea( 100.f, 50.f ); - Size layoutSize( 100.f, 40.f ); + { + 0.f, + -12.f, + 10.f, + -9.f, + 20.f, + -13.f, + 24.f, + -13.f, + 27.f, + -9.f, + 36.f, + -0.f, + 40.f, + -9.f, + 52.f, + -9.f, + 62.f, + -9.f, + 69.f, + -13.f, + 72.f, + -13.f, + 81.f, + -0.f, + 0.f, + -13.f, + 9.f, + -9.f, + 19.f, + -9.f, + 32.f, + -9.f, + 41.f, + -0.f, + 46.f, + -13.f, + 54.f, + -9.f, + 64.f, + -13.f, + 68.f, + -13.f, + 71.f, + -9.f, + 80.f, + -0.f, + 84.f, + -9.f, + }; + + Size textArea(100.f, 50.f); + Size layoutSize(100.f, 40.f); LayoutTextData data = - { - "Layout multi-line LTR text with ellipsis.", - "Hello world demo hello world demo hello world demo.", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 24u, - positions, - 2u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 51u, - true, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout multi-line LTR text with ellipsis.", + "Hello world demo hello world demo hello world demo.", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 24u, + positions, + 2u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 51u, + true, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -3422,135 +4549,164 @@ int UtcDaliTextLayoutEllipsis03(void) // Layout single-line RTL text with ellipsis. - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 10u; - fontDescriptionRun01.familyLength = fontHebrew.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontHebrew.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 10u; + fontDescriptionRun02.characterRun.characterIndex = 10u; fontDescriptionRun02.characterRun.numberOfCharacters = 14u; - fontDescriptionRun02.familyLength = fontArabic.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontArabic.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 24u; + fontDescriptionRun03.characterRun.characterIndex = 24u; fontDescriptionRun03.characterRun.numberOfCharacters = 10u; - fontDescriptionRun03.familyLength = fontHebrew.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontHebrew.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 34u; + fontDescriptionRun04.characterRun.characterIndex = 34u; fontDescriptionRun04.characterRun.numberOfCharacters = 14u; - fontDescriptionRun04.familyLength = fontArabic.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontArabic.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 10u; - fontDescriptionRun05.familyLength = fontHebrew.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontHebrew.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 58u; + fontDescriptionRun06.characterRun.characterIndex = 58u; fontDescriptionRun06.characterRun.numberOfCharacters = 15u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); struct LineRun line01 = - { - { 0u, 14u }, - { 0u, 14u }, - 98.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - true - }; + { + {0u, 14u}, + {0u, 14u}, + 98.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + true}; Vector lines; - lines.PushBack( line01 ); + lines.PushBack(line01); float positions[] = - { - 87.f, -10.f, 79.f, -13.f, 74.f, -10.f, 65.f, -10.f, 60.f, -0.f, 51.f, -10.f, 47.f, -10.f, 38.f, -13.f, 29.f, -10.f, 24.f, -0.f, 17.f, -8.f, 12.f, -6.f, 4.f, -8.f, 0.f, -7.f, 78.f, -11.f, 73.f, -0.f, - }; - - Size textArea( 100.f, 50.f ); - Size layoutSize( 100.f, 20.f ); + { + 87.f, + -10.f, + 79.f, + -13.f, + 74.f, + -10.f, + 65.f, + -10.f, + 60.f, + -0.f, + 51.f, + -10.f, + 47.f, + -10.f, + 38.f, + -13.f, + 29.f, + -10.f, + 24.f, + -0.f, + 17.f, + -8.f, + 12.f, + -6.f, + 4.f, + -8.f, + 0.f, + -7.f, + 78.f, + -11.f, + 73.f, + -0.f, + }; + + Size textArea(100.f, 50.f); + Size layoutSize(100.f, 20.f); LayoutTextData data = - { - "Layout single-line RTL text with ellipsis.", - "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - layoutSize, - 16u, - positions, - 1u, - lines.Begin(), - Layout::Engine::SINGLE_LINE_BOX, - 0u, - 72u, - true, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout single-line RTL text with ellipsis.", + "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + layoutSize, + 16u, + positions, + 1u, + lines.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 72u, + true, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -3566,150 +4722,213 @@ int UtcDaliTextLayoutEllipsis04(void) // Layout multi-line RTL text with ellipsis. - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 10u; - fontDescriptionRun01.familyLength = fontHebrew.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontHebrew.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 10u; + fontDescriptionRun02.characterRun.characterIndex = 10u; fontDescriptionRun02.characterRun.numberOfCharacters = 14u; - fontDescriptionRun02.familyLength = fontArabic.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontArabic.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 24u; + fontDescriptionRun03.characterRun.characterIndex = 24u; fontDescriptionRun03.characterRun.numberOfCharacters = 10u; - fontDescriptionRun03.familyLength = fontHebrew.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontHebrew.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 34u; + fontDescriptionRun04.characterRun.characterIndex = 34u; fontDescriptionRun04.characterRun.numberOfCharacters = 14u; - fontDescriptionRun04.familyLength = fontArabic.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontArabic.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 10u; - fontDescriptionRun05.familyLength = fontHebrew.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontHebrew.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 58u; + fontDescriptionRun06.characterRun.characterIndex = 58u; fontDescriptionRun06.characterRun.numberOfCharacters = 15u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); struct LineRun line01 = - { - { 0u, 10u }, - { 0u, 10u }, - 70.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 10u}, + {0u, 10u}, + 70.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + false}; struct LineRun line02 = - { - { 10u, 19u }, - { 10u, 19u }, - 99.f, - 15.f, - -5.f, - 5.f, - 0.f, - 0.f, - false, - true - }; + { + {10u, 19u}, + {10u, 19u}, + 99.f, + 15.f, + -5.f, + 5.f, + 0.f, + 0.f, + false, + true}; Vector lines; - lines.PushBack( line01 ); - lines.PushBack( line02 ); + lines.PushBack(line01); + lines.PushBack(line02); float positions[] = - { - 63.f, -10.f, 54.f, -13.f, 50.f, -10.f, 41.f, -10.f, 36.f, -0.f, 27.f, -10.f, 23.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 96.f, -8.f, 91.f, -6.f, 83.f, -8.f, 79.f, -7.f, 78.f, -11.f, 73.f, -0.f, - 68.f, -7.f, 67.f, -11.f, 61.f, -11.f, 55.f, -8.f, 53.f, -11.f, 47.f, -11.f, 42.f, -8.f, 38.f, -0.f, 27.f, -10.f, 18.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -0.f, 92.f, -10.f, 88.f, -10.f, 79.f, -13.f, 70.f, -10.f, 65.f, -0.f, - }; - - Size textArea( 100.f, 50.f ); - Size layoutSize( 100.f, 40.f ); + { + 63.f, + -10.f, + 54.f, + -13.f, + 50.f, + -10.f, + 41.f, + -10.f, + 36.f, + -0.f, + 27.f, + -10.f, + 23.f, + -10.f, + 14.f, + -13.f, + 4.f, + -10.f, + 0.f, + -0.f, + 96.f, + -8.f, + 91.f, + -6.f, + 83.f, + -8.f, + 79.f, + -7.f, + 78.f, + -11.f, + 73.f, + -0.f, + 68.f, + -7.f, + 67.f, + -11.f, + 61.f, + -11.f, + 55.f, + -8.f, + 53.f, + -11.f, + 47.f, + -11.f, + 42.f, + -8.f, + 38.f, + -0.f, + 27.f, + -10.f, + 18.f, + -13.f, + 14.f, + -10.f, + 4.f, + -10.f, + 0.f, + -0.f, + 92.f, + -10.f, + 88.f, + -10.f, + 79.f, + -13.f, + 70.f, + -10.f, + 65.f, + -0.f, + }; + + Size textArea(100.f, 50.f); + Size layoutSize(100.f, 40.f); LayoutTextData data = - { - "Layout multi-line RTL text with ellipsis.", - "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - layoutSize, - 34u, - positions, - 2u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 72u, - true, - DevelText::EllipsisPosition::END, - true - }; + { + "Layout multi-line RTL text with ellipsis.", + "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + layoutSize, + 34u, + positions, + 2u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 72u, + true, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -3723,69 +4942,66 @@ int UtcDaliTextLayoutEllipsis05(void) ToolkitTestApplication application; tet_infoline(" UtcDaliTextLayoutEllipsis05"); - const std::string fontLatin( "TizenSans" ); + const std::string fontLatin("TizenSans"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 51u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); struct LineRun line01 = - { - { 0u, 11u }, - { 0u, 11u }, - 80.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - true - }; + { + {0u, 11u}, + {0u, 11u}, + 80.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + true}; Vector lines; - lines.PushBack( line01 ); + lines.PushBack(line01); float positions[] = - { - 0.f, -12.f - }; + { + 0.f, -12.f}; - Size textArea( 100.f, 19.f ); - Size layoutSize( 100.f, 20.f ); + Size textArea(100.f, 19.f); + Size layoutSize(100.f, 20.f); LayoutTextData data = - { - "Not enough height.", - "Hello world", - textArea, - 1u, - fontDescriptionRuns.Begin(), - layoutSize, - 1u, - positions, - 1u, - lines.Begin(), - Layout::Engine::MULTI_LINE_BOX, - 0u, - 11u, - true, - DevelText::EllipsisPosition::END, - true - }; + { + "Not enough height.", + "Hello world", + textArea, + 1u, + fontDescriptionRuns.Begin(), + layoutSize, + 1u, + positions, + 1u, + lines.Begin(), + Layout::Engine::MULTI_LINE_BOX, + 0u, + 11u, + true, + DevelText::EllipsisPosition::END, + true}; - if( !LayoutTextTest( data ) ) + if(!LayoutTextTest(data)) { tet_result(TET_FAIL); } @@ -3801,112 +5017,111 @@ int UtcDaliTextAlign01(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }; + float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Begin alignment for the first paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::BEGIN, - Text::VerticalAlignment::TOP, - 0u, - 22u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; + { + "Begin alignment for the first paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::BEGIN, + Text::VerticalAlignment::TOP, + 0u, + 22u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; - if( !AlignTest( data ) ) + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -3922,112 +5137,111 @@ int UtcDaliTextAlign02(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 33.f, 19.f, 0.f, 0.f }; + float positions[] = {0.f, 0.f, 33.f, 19.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Begin alignment for the mid paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::BEGIN, - Text::VerticalAlignment::TOP, - 22u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; - - if( !AlignTest( data ) ) + { + "Begin alignment for the mid paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::BEGIN, + Text::VerticalAlignment::TOP, + 22u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; + + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4043,112 +5257,111 @@ int UtcDaliTextAlign03(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }; + float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Begin alignment for the last paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::BEGIN, - Text::VerticalAlignment::TOP, - 48u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; - - if( !AlignTest( data ) ) + { + "Begin alignment for the last paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::BEGIN, + Text::VerticalAlignment::TOP, + 48u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; + + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4164,112 +5377,111 @@ int UtcDaliTextAlign04(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 9.f, 15.f, 0.f, 0.f, 0.f, 0.f }; + float positions[] = {9.f, 15.f, 0.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Center alignment for the first paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::CENTER, - Text::VerticalAlignment::TOP, - 0u, - 22u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; + { + "Center alignment for the first paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::CENTER, + Text::VerticalAlignment::TOP, + 0u, + 22u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; - if( !AlignTest( data ) ) + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4285,112 +5497,111 @@ int UtcDaliTextAlign05(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 14.f, 9.f, 0.f, 0.f }; + float positions[] = {0.f, 0.f, 14.f, 9.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Center alignment for the mid paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::CENTER, - Text::VerticalAlignment::TOP, - 22u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; - - if( !AlignTest( data ) ) + { + "Center alignment for the mid paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::CENTER, + Text::VerticalAlignment::TOP, + 22u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; + + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4406,112 +5617,111 @@ int UtcDaliTextAlign06(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 0.f, 0.f, 9.f, 16.f }; + float positions[] = {0.f, 0.f, 0.f, 0.f, 9.f, 16.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Center alignment for the last paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::CENTER, - Text::VerticalAlignment::TOP, - 48u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; - - if( !AlignTest( data ) ) + { + "Center alignment for the last paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::CENTER, + Text::VerticalAlignment::TOP, + 48u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; + + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4527,112 +5737,111 @@ int UtcDaliTextAlign07(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 19.f, 30.f, 0.f, 0.f, 0.f, 0.f }; + float positions[] = {19.f, 30.f, 0.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "End alignment for the first paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::END, - Text::VerticalAlignment::TOP, - 0u, - 22u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; + { + "End alignment for the first paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::END, + Text::VerticalAlignment::TOP, + 0u, + 22u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; - if( !AlignTest( data ) ) + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4648,112 +5857,111 @@ int UtcDaliTextAlign08(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, -4.f, 0.f, 0.f, 0.f }; + float positions[] = {0.f, 0.f, -4.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "End alignment for the mid paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::END, - Text::VerticalAlignment::TOP, - 22u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; - - if( !AlignTest( data ) ) + { + "End alignment for the mid paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::END, + Text::VerticalAlignment::TOP, + 22u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; + + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4769,112 +5977,111 @@ int UtcDaliTextAlign09(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 0.f, 0.f, 19.f, 33.f }; + float positions[] = {0.f, 0.f, 0.f, 0.f, 19.f, 33.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "End alignment for the last paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::END, - Text::VerticalAlignment::TOP, - 48u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - false - }; - - if( !AlignTest( data ) ) + { + "End alignment for the last paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::END, + Text::VerticalAlignment::TOP, + 48u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false}; + + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -4890,112 +6097,111 @@ int UtcDaliTextAlign10(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }; + float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Begin alignment for the first paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::END, - Text::VerticalAlignment::TOP, - 0u, - 22u, - 6u, - positions, - Dali::LayoutDirection::RIGHT_TO_LEFT, - true - }; + { + "Begin alignment for the first paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::END, + Text::VerticalAlignment::TOP, + 0u, + 22u, + 6u, + positions, + Dali::LayoutDirection::RIGHT_TO_LEFT, + true}; - if( !AlignTest( data ) ) + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -5011,112 +6217,111 @@ int UtcDaliTextAlign11(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 19.f, 30.f, 33.f, 0.f, 0.f, 0.f }; + float positions[] = {19.f, 30.f, 33.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "End alignment for the last paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::END, - Text::VerticalAlignment::TOP, - 0u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - true - }; + { + "End alignment for the last paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::END, + Text::VerticalAlignment::TOP, + 0u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + true}; - if( !AlignTest( data ) ) + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -5132,112 +6337,111 @@ int UtcDaliTextAlign12(void) // Calculate text alignment. - const std::string fontLatin( "TizenSans" ); - const std::string fontHebrew( "TizenSansHebrew" ); - const std::string fontArabic( "TizenSansArabic" ); + const std::string fontLatin("TizenSans"); + const std::string fontHebrew("TizenSansHebrew"); + const std::string fontArabic("TizenSansArabic"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 12u; - fontDescriptionRun01.familyLength = fontLatin.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontLatin.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 12u; + fontDescriptionRun02.characterRun.characterIndex = 12u; fontDescriptionRun02.characterRun.numberOfCharacters = 10u; - fontDescriptionRun02.familyLength = fontHebrew.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontHebrew.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 22u; + fontDescriptionRun03.characterRun.characterIndex = 22u; fontDescriptionRun03.characterRun.numberOfCharacters = 14u; - fontDescriptionRun03.familyLength = fontArabic.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontArabic.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; FontDescriptionRun fontDescriptionRun04; - fontDescriptionRun04.characterRun.characterIndex = 36u; + fontDescriptionRun04.characterRun.characterIndex = 36u; fontDescriptionRun04.characterRun.numberOfCharacters = 12u; - fontDescriptionRun04.familyLength = fontLatin.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyLength = fontLatin.size(); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength); fontDescriptionRun04.familyDefined = true; fontDescriptionRun04.weightDefined = false; - fontDescriptionRun04.widthDefined = false; - fontDescriptionRun04.slantDefined = false; - fontDescriptionRun04.sizeDefined = false; + fontDescriptionRun04.widthDefined = false; + fontDescriptionRun04.slantDefined = false; + fontDescriptionRun04.sizeDefined = false; FontDescriptionRun fontDescriptionRun05; - fontDescriptionRun05.characterRun.characterIndex = 48u; + fontDescriptionRun05.characterRun.characterIndex = 48u; fontDescriptionRun05.characterRun.numberOfCharacters = 12u; - fontDescriptionRun05.familyLength = fontLatin.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyLength = fontLatin.size(); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength); fontDescriptionRun05.familyDefined = true; fontDescriptionRun05.weightDefined = false; - fontDescriptionRun05.widthDefined = false; - fontDescriptionRun05.slantDefined = false; - fontDescriptionRun05.sizeDefined = false; + fontDescriptionRun05.widthDefined = false; + fontDescriptionRun05.slantDefined = false; + fontDescriptionRun05.sizeDefined = false; FontDescriptionRun fontDescriptionRun06; - fontDescriptionRun06.characterRun.characterIndex = 60u; + fontDescriptionRun06.characterRun.characterIndex = 60u; fontDescriptionRun06.characterRun.numberOfCharacters = 14u; - fontDescriptionRun06.familyLength = fontArabic.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength ); + fontDescriptionRun06.familyLength = fontArabic.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength); fontDescriptionRun06.familyDefined = true; fontDescriptionRun06.weightDefined = false; - fontDescriptionRun06.widthDefined = false; - fontDescriptionRun06.slantDefined = false; - fontDescriptionRun06.sizeDefined = false; + fontDescriptionRun06.widthDefined = false; + fontDescriptionRun06.slantDefined = false; + fontDescriptionRun06.sizeDefined = false; Vector fontDescriptionRuns; - fontDescriptionRuns.PushBack( fontDescriptionRun01 ); - fontDescriptionRuns.PushBack( fontDescriptionRun02 ); - fontDescriptionRuns.PushBack( fontDescriptionRun03 ); - fontDescriptionRuns.PushBack( fontDescriptionRun04 ); - fontDescriptionRuns.PushBack( fontDescriptionRun05 ); - fontDescriptionRuns.PushBack( fontDescriptionRun06 ); + fontDescriptionRuns.PushBack(fontDescriptionRun01); + fontDescriptionRuns.PushBack(fontDescriptionRun02); + fontDescriptionRuns.PushBack(fontDescriptionRun03); + fontDescriptionRuns.PushBack(fontDescriptionRun04); + fontDescriptionRuns.PushBack(fontDescriptionRun05); + fontDescriptionRuns.PushBack(fontDescriptionRun06); - float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }; + float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f}; - Size textArea( 100.f, 300.f ); + Size textArea(100.f, 300.f); AlignData data = - { - "Begin alignment for the first paragraph.", - "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", - textArea, - 6u, - fontDescriptionRuns.Begin(), - Text::HorizontalAlignment::BEGIN, - Text::VerticalAlignment::TOP, - 48u, - 26u, - 6u, - positions, - Dali::LayoutDirection::LEFT_TO_RIGHT, - true - }; - - if( !AlignTest( data ) ) + { + "Begin alignment for the first paragraph.", + "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.", + textArea, + 6u, + fontDescriptionRuns.Begin(), + Text::HorizontalAlignment::BEGIN, + Text::VerticalAlignment::TOP, + 48u, + 26u, + 6u, + positions, + Dali::LayoutDirection::LEFT_TO_RIGHT, + true}; + + if(!AlignTest(data)) { tet_result(TET_FAIL); } @@ -5252,10 +6456,10 @@ int UtcDaliTextLayoutSetGetDefaultLineSpacing(void) tet_infoline(" UtcDaliTextLayoutSetGetDefaultLineSpacing"); Layout::Engine engine; - DALI_TEST_EQUALS( 0.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + DALI_TEST_EQUALS(0.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION); - engine.SetDefaultLineSpacing( 10.f ); - DALI_TEST_EQUALS( 10.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + engine.SetDefaultLineSpacing(10.f); + DALI_TEST_EQUALS(10.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION); tet_result(TET_PASS); END_TEST; @@ -5267,188 +6471,182 @@ int UtcDaliTextLayoutGetGlyphMetrics(void) // Test retrieving metrics from group of characters - const std::string fontFamily( "TizenSansHindi" ); + const std::string fontFamily("TizenSansHindi"); // Set a known font description FontDescriptionRun fontDescriptionRun01; - fontDescriptionRun01.characterRun.characterIndex = 0u; + fontDescriptionRun01.characterRun.characterIndex = 0u; fontDescriptionRun01.characterRun.numberOfCharacters = 2u; - fontDescriptionRun01.familyLength = fontFamily.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyLength = fontFamily.size(); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength); fontDescriptionRun01.familyDefined = true; fontDescriptionRun01.weightDefined = false; - fontDescriptionRun01.widthDefined = false; - fontDescriptionRun01.slantDefined = false; - fontDescriptionRun01.sizeDefined = false; + fontDescriptionRun01.widthDefined = false; + fontDescriptionRun01.slantDefined = false; + fontDescriptionRun01.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun02; - fontDescriptionRun02.characterRun.characterIndex = 0u; + fontDescriptionRun02.characterRun.characterIndex = 0u; fontDescriptionRun02.characterRun.numberOfCharacters = 2u; - fontDescriptionRun02.familyLength = fontFamily.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyLength = fontFamily.size(); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength); fontDescriptionRun02.familyDefined = true; fontDescriptionRun02.weightDefined = false; - fontDescriptionRun02.widthDefined = false; - fontDescriptionRun02.slantDefined = false; - fontDescriptionRun02.sizeDefined = false; + fontDescriptionRun02.widthDefined = false; + fontDescriptionRun02.slantDefined = false; + fontDescriptionRun02.sizeDefined = false; // Set a known font description FontDescriptionRun fontDescriptionRun03; - fontDescriptionRun03.characterRun.characterIndex = 0u; + fontDescriptionRun03.characterRun.characterIndex = 0u; fontDescriptionRun03.characterRun.numberOfCharacters = 2u; - fontDescriptionRun03.familyLength = fontFamily.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyLength = fontFamily.size(); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength); fontDescriptionRun03.familyDefined = true; fontDescriptionRun03.weightDefined = false; - fontDescriptionRun03.widthDefined = false; - fontDescriptionRun03.slantDefined = false; - fontDescriptionRun03.sizeDefined = false; + fontDescriptionRun03.widthDefined = false; + fontDescriptionRun03.slantDefined = false; + fontDescriptionRun03.sizeDefined = false; Vector fontDescriptionRuns01; - fontDescriptionRuns01.PushBack( fontDescriptionRun01 ); + fontDescriptionRuns01.PushBack(fontDescriptionRun01); Vector fontDescriptionRuns02; - fontDescriptionRuns02.PushBack( fontDescriptionRun02 ); + fontDescriptionRuns02.PushBack(fontDescriptionRun02); Vector fontDescriptionRuns03; - fontDescriptionRuns03.PushBack( fontDescriptionRun03 ); + fontDescriptionRuns03.PushBack(fontDescriptionRun03); // Set a text area. Size textArea(100.f, 100.f); - // Group: second glyph doesn't exceed the width of the first glyph - float positions01[] = { 0.f, -11.f }; + float positions01[] = {0.f, -11.f}; struct LineRun line01 = - { - { 0u, 1u }, - { 0u, 1u }, - 11.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 1u}, + {0u, 1u}, + 11.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines01; - lines01.PushBack( line01 ); + lines01.PushBack(line01); Size layoutSize01 = Vector2(11.f, 20.f); // Group: second glyph doesn't exceed the width of the first glyph - float positions02[] = { 0.f, -11.f, 7.f, -15.f, }; - - struct LineRun line02 = - { - { 0u, 2u }, - { 0u, 2u }, - 16.f, - 15.f, - -5.f, - 0.f, + float positions02[] = { 0.f, - 0.f, - false, - false + -11.f, + 7.f, + -15.f, }; + + struct LineRun line02 = + { + {0u, 2u}, + {0u, 2u}, + 16.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines02; - lines02.PushBack( line02 ); + lines02.PushBack(line02); Size layoutSize02 = Vector2(16.f, 20.f); // Group: second glyph doesn't exceed the width of the first glyph - float positions03[] = { 0.f, -11.f , 2.f, -15.f }; + float positions03[] = {0.f, -11.f, 2.f, -15.f}; struct LineRun line03 = - { - { 0u, 2u }, - { 0u, 2u }, - 11.f, - 15.f, - -5.f, - 0.f, - 0.f, - 0.f, - false, - false - }; + { + {0u, 2u}, + {0u, 2u}, + 11.f, + 15.f, + -5.f, + 0.f, + 0.f, + 0.f, + false, + false}; Vector lines03; - lines03.PushBack( line03 ); + lines03.PushBack(line03); Size layoutSize03 = Vector2(11.f, 20.f); - ///////////////////////////// + ///////////////////////////// struct LayoutTextData data[] = - { - { - "Single glyph", - "प", - textArea, - 1u, - fontDescriptionRuns01.Begin(), - layoutSize01, - 1u, - positions01, - 1u, - lines01.Begin(), - Layout::Engine::SINGLE_LINE_BOX, - 0u, - 1u, - false, - DevelText::EllipsisPosition::END, - true - }, { - "Group: second glyph exceeds the width of the first glyph", - "पो", - textArea, - 1u, - fontDescriptionRuns02.Begin(), - layoutSize02, - 2u, - positions02, - 1u, - lines02.Begin(), - Layout::Engine::SINGLE_LINE_BOX, - 0u, - 2u, - false, - DevelText::EllipsisPosition::END, - true - }, - { - "Group: second glyph doesn't exceed the width of the first glyph", - "पे", - textArea, - 1u, - fontDescriptionRuns03.Begin(), - layoutSize03, - 2u, - positions03, - 1u, - lines03.Begin(), - Layout::Engine::SINGLE_LINE_BOX, - 0u, - 2u, - false, - DevelText::EllipsisPosition::END, - true - } - }; - const unsigned int numberOfTests = sizeof(data)/sizeof(LayoutTextData); - - for( unsigned int index = 0u; index < numberOfTests; ++index ) + {"Single glyph", + "प", + textArea, + 1u, + fontDescriptionRuns01.Begin(), + layoutSize01, + 1u, + positions01, + 1u, + lines01.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 1u, + false, + DevelText::EllipsisPosition::END, + true}, + {"Group: second glyph exceeds the width of the first glyph", + "पो", + textArea, + 1u, + fontDescriptionRuns02.Begin(), + layoutSize02, + 2u, + positions02, + 1u, + lines02.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 2u, + false, + DevelText::EllipsisPosition::END, + true}, + {"Group: second glyph doesn't exceed the width of the first glyph", + "पे", + textArea, + 1u, + fontDescriptionRuns03.Begin(), + layoutSize03, + 2u, + positions03, + 1u, + lines03.Begin(), + Layout::Engine::SINGLE_LINE_BOX, + 0u, + 2u, + false, + DevelText::EllipsisPosition::END, + true}}; + const unsigned int numberOfTests = sizeof(data) / sizeof(LayoutTextData); + + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !LayoutTextTest( data[index] ) ) + if(!LayoutTextTest(data[index])) { tet_result(TET_FAIL); } diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Shaping.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Shaping.cpp index 59a0dfd..80624a8 100755 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Shaping.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Shaping.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,13 +15,13 @@ * */ -#include #include #include +#include -#include #include #include +#include #include using namespace Dali; @@ -45,61 +45,61 @@ using namespace Text; namespace { -const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); +const std::string DEFAULT_FONT_DIR("/resources/fonts"); struct GlyphInfoData { - FontId fontId; ///< Identifies the font containing the glyph - GlyphIndex index; ///< Uniquely identifies a glyph for a given FontId - float width; ///< The width of the glyph - float height; ///< The height of the glyph - float xBearing; ///< The distance from the cursor position to the leftmost border of the glyph - float yBearing; ///< The distance from the baseline to the topmost border of the glyph - float advance; ///< The distance to move the cursor for this glyph - float scaleFactor; ///< The scaling applied (fixed-size fonts only) - bool isItalicRequired; ///< Whether the italic style is required. - bool isBoldRequired; ///< Whether the bold style is required. + FontId fontId; ///< Identifies the font containing the glyph + GlyphIndex index; ///< Uniquely identifies a glyph for a given FontId + float width; ///< The width of the glyph + float height; ///< The height of the glyph + float xBearing; ///< The distance from the cursor position to the leftmost border of the glyph + float yBearing; ///< The distance from the baseline to the topmost border of the glyph + float advance; ///< The distance to move the cursor for this glyph + float scaleFactor; ///< The scaling applied (fixed-size fonts only) + bool isItalicRequired; ///< Whether the italic style is required. + bool isBoldRequired; ///< Whether the bold style is required. }; -bool IsEqualGlyph ( const GlyphInfoData& glyphData, const GlyphInfo& glyph ) +bool IsEqualGlyph(const GlyphInfoData& glyphData, const GlyphInfo& glyph) { - if( glyphData.fontId != glyph.fontId ) + if(glyphData.fontId != glyph.fontId) { return false; } - if( glyphData.index != glyph.index ) + if(glyphData.index != glyph.index) { return false; } - if( fabsf( glyphData.width - glyph.width ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(glyphData.width - glyph.width) > Math::MACHINE_EPSILON_1000) { return false; } - if( fabsf( glyphData.height - glyph.height ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(glyphData.height - glyph.height) > Math::MACHINE_EPSILON_1000) { return false; } - if( fabsf( glyphData.xBearing - glyph.xBearing ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(glyphData.xBearing - glyph.xBearing) > Math::MACHINE_EPSILON_1000) { return false; } - if( fabsf( glyphData.yBearing - glyph.yBearing ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(glyphData.yBearing - glyph.yBearing) > Math::MACHINE_EPSILON_1000) { return false; } - if( fabsf( glyphData.advance - floor(glyph.advance) ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(glyphData.advance - floor(glyph.advance)) > Math::MACHINE_EPSILON_1000) { return false; } - if( fabsf( glyphData.scaleFactor - glyph.scaleFactor ) > Math::MACHINE_EPSILON_1000 ) + if(fabsf(glyphData.scaleFactor - glyph.scaleFactor) > Math::MACHINE_EPSILON_1000) { return false; } - if( glyphData.isItalicRequired != glyph.isItalicRequired ) + if(glyphData.isItalicRequired != glyph.isItalicRequired) { return false; } - if( glyphData.isBoldRequired != glyph.isBoldRequired ) + if(glyphData.isBoldRequired != glyph.isBoldRequired) { return false; } @@ -109,99 +109,100 @@ bool IsEqualGlyph ( const GlyphInfoData& glyphData, const GlyphInfo& glyph ) struct ShapeInfoData { - std::string description; ///< Description of the test. - std::string text; ///< input text. - uint32_t index; ///< The index from where to start to query the break info. - uint32_t numberOfCharacters; ///< The requested number of characters. - uint32_t expectedNumberOfGlyphs; ///< The expected number of glyphs. - GlyphInfoData* glyphs; ///< The glyphs. - CharacterIndex* characterIndices; ///< The character index for each glyph. - Length* charactersPerGlyph; ///< The characters per glyph. - uint32_t expectedNumberOfNewParagraphGlyphs; ///< The expected number of glyphs. - GlyphIndex* newParagraphGlyphs; ///< Indices to the new paragraphs glyphs. - bool markupProcessorEnabled; //< Enable markup processor to use markup text. - Vector fontDescriptions; ///< Fonts which is used for text. + std::string description; ///< Description of the test. + std::string text; ///< input text. + uint32_t index; ///< The index from where to start to query the break info. + uint32_t numberOfCharacters; ///< The requested number of characters. + uint32_t expectedNumberOfGlyphs; ///< The expected number of glyphs. + GlyphInfoData* glyphs; ///< The glyphs. + CharacterIndex* characterIndices; ///< The character index for each glyph. + Length* charactersPerGlyph; ///< The characters per glyph. + uint32_t expectedNumberOfNewParagraphGlyphs; ///< The expected number of glyphs. + GlyphIndex* newParagraphGlyphs; ///< Indices to the new paragraphs glyphs. + bool markupProcessorEnabled; //< Enable markup processor to use markup text. + Vector fontDescriptions; ///< Fonts which is used for text. }; -bool ShapeInfoTest( const ShapeInfoData& data ) +bool ShapeInfoTest(const ShapeInfoData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; const Vector fontDescriptions; - const LayoutOptions options; - - CreateTextModel( data.text, - textArea, - data.fontDescriptions, - options, - layoutSize, - textModel, - metrics, - data.markupProcessorEnabled, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + + CreateTextModel(data.text, + textArea, + data.fontDescriptions, + options, + layoutSize, + textModel, + metrics, + data.markupProcessorEnabled, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; // 2) Clear the model. - Vector& glyphs = visualModel->mGlyphs; - Vector& glyphToCharacter = visualModel->mGlyphsToCharacters; - Vector& charactersPerGlyph = visualModel->mCharactersPerGlyph; - Vector& charactersToGlyph = visualModel->mCharactersToGlyph; - Vector& glyphsPerCharacter = visualModel->mGlyphsPerCharacter; + Vector& glyphs = visualModel->mGlyphs; + Vector& glyphToCharacter = visualModel->mGlyphsToCharacters; + Vector& charactersPerGlyph = visualModel->mCharactersPerGlyph; + Vector& charactersToGlyph = visualModel->mCharactersToGlyph; + Vector& glyphsPerCharacter = visualModel->mGlyphsPerCharacter; // Get the glyph index. GlyphIndex glyphIndex = 0u; - if( 0u != visualModel->mCharactersToGlyph.Count() ) + if(0u != visualModel->mCharactersToGlyph.Count()) { - glyphIndex = *( visualModel->mCharactersToGlyph.Begin() + data.index ); + glyphIndex = *(visualModel->mCharactersToGlyph.Begin() + data.index); const CharacterIndex lastCharacterIndex = data.index + data.numberOfCharacters - 1u; - const Length numberOfGlyphs = *( visualModel->mCharactersToGlyph.Begin() + lastCharacterIndex ) + *( visualModel->mGlyphsPerCharacter.Begin() + lastCharacterIndex ) - glyphIndex; + const Length numberOfGlyphs = *(visualModel->mCharactersToGlyph.Begin() + lastCharacterIndex) + *(visualModel->mGlyphsPerCharacter.Begin() + lastCharacterIndex) - glyphIndex; // Erase the glyph info from the text model. // Got from the ShapeText() function. - glyphs.Erase( glyphs.Begin() + glyphIndex, glyphs.Begin() + glyphIndex + numberOfGlyphs ); - glyphToCharacter.Erase( glyphToCharacter.Begin() + glyphIndex, glyphToCharacter.Begin() + glyphIndex + numberOfGlyphs ); - charactersPerGlyph.Erase( charactersPerGlyph.Begin() + glyphIndex, charactersPerGlyph.Begin() + glyphIndex + numberOfGlyphs ); + glyphs.Erase(glyphs.Begin() + glyphIndex, glyphs.Begin() + glyphIndex + numberOfGlyphs); + glyphToCharacter.Erase(glyphToCharacter.Begin() + glyphIndex, glyphToCharacter.Begin() + glyphIndex + numberOfGlyphs); + charactersPerGlyph.Erase(charactersPerGlyph.Begin() + glyphIndex, charactersPerGlyph.Begin() + glyphIndex + numberOfGlyphs); // Got from the VisualModel::CreateCharacterToGlyphTable() and the VisualModel::CreateGlyphsPerCharacterTable() methods. - charactersToGlyph.Erase( charactersToGlyph.Begin() + data.index, - charactersToGlyph.Begin() + data.index + data.numberOfCharacters ); - glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.index, - glyphsPerCharacter.Begin() + data.index + data.numberOfCharacters ); + charactersToGlyph.Erase(charactersToGlyph.Begin() + data.index, + charactersToGlyph.Begin() + data.index + data.numberOfCharacters); + glyphsPerCharacter.Erase(glyphsPerCharacter.Begin() + data.index, + glyphsPerCharacter.Begin() + data.index + data.numberOfCharacters); // Update the glyph to character indices. - for( Vector::Iterator it = glyphToCharacter.Begin() + glyphIndex, - endIt = glyphToCharacter.End(); - it != endIt; - ++it ) + for(Vector::Iterator it = glyphToCharacter.Begin() + glyphIndex, + endIt = glyphToCharacter.End(); + it != endIt; + ++it) { CharacterIndex& index = *it; index -= data.numberOfCharacters; } - } // Reset the metrics got from the model as the ShapeText() function doesn't retrieve them. - for( Vector::Iterator it = glyphs.Begin(), - endIt = glyphs.End(); - it != endIt; - ++it ) + for(Vector::Iterator it = glyphs.Begin(), + endIt = glyphs.End(); + it != endIt; + ++it) { - GlyphInfo& info = *it; - info.width = 0.f; - info.height = 0.f; - info.xBearing = 0.f; - info.yBearing = 0.f; + GlyphInfo& info = *it; + info.width = 0.f; + info.height = 0.f; + info.xBearing = 0.f; + info.yBearing = 0.f; info.scaleFactor = 0.f; } @@ -209,39 +210,39 @@ bool ShapeInfoTest( const ShapeInfoData& data ) Vector newParagraphGlyphs; - ShapeText( logicalModel->mText, - logicalModel->mLineBreakInfo, - logicalModel->mScriptRuns, - logicalModel->mFontRuns, - data.index, - glyphIndex, - data.numberOfCharacters, - glyphs, - glyphToCharacter, - charactersPerGlyph, - newParagraphGlyphs ); + ShapeText(logicalModel->mText, + logicalModel->mLineBreakInfo, + logicalModel->mScriptRuns, + logicalModel->mFontRuns, + data.index, + glyphIndex, + data.numberOfCharacters, + glyphs, + glyphToCharacter, + charactersPerGlyph, + newParagraphGlyphs); // Clear the advance of the new paragraph glyphs. - for( Vector::Iterator it = newParagraphGlyphs.Begin(), - endIt = newParagraphGlyphs.End(); - it != endIt; - ++it ) + for(Vector::Iterator it = newParagraphGlyphs.Begin(), + endIt = newParagraphGlyphs.End(); + it != endIt; + ++it) { - GlyphInfo& info = *( glyphs.Begin() + *it ); - info.advance = 0.f; + GlyphInfo& info = *(glyphs.Begin() + *it); + info.advance = 0.f; } // 4) Compare the results. - if( data.expectedNumberOfGlyphs != glyphs.Count() ) + if(data.expectedNumberOfGlyphs != glyphs.Count()) { std::cout << " Different number of glyphs : " << glyphs.Count() << ", expected : " << data.expectedNumberOfGlyphs << std::endl; return false; } - for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index ) + for(unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index) { - if( !IsEqualGlyph( data.glyphs[index], glyphs[index] ) ) + if(!IsEqualGlyph(data.glyphs[index], glyphs[index])) { std::cout << " different glyph info, index : " << index << std::endl; @@ -270,38 +271,37 @@ bool ShapeInfoTest( const ShapeInfoData& data ) std::cout << " isItalicRequired : " << expectedGlyphInfo.isItalicRequired << std::endl; std::cout << " isBoldRequired : " << expectedGlyphInfo.isBoldRequired << std::endl; - return false; } } - for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index ) + for(unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index) { - if( data.characterIndices[index] != glyphToCharacter[index] ) + if(data.characterIndices[index] != glyphToCharacter[index]) { std::cout << " different character index, index : " << index << std::endl; return false; } } - for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index ) + for(unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index) { - if( data.charactersPerGlyph[index] != charactersPerGlyph[index] ) + if(data.charactersPerGlyph[index] != charactersPerGlyph[index]) { std::cout << " different character per glyph, index : " << index << std::endl; return false; } } - if( data.expectedNumberOfNewParagraphGlyphs != newParagraphGlyphs.Count() ) + if(data.expectedNumberOfNewParagraphGlyphs != newParagraphGlyphs.Count()) { std::cout << " Different number of new paragraph glyphs : " << newParagraphGlyphs.Count() << ", expected : " << data.expectedNumberOfNewParagraphGlyphs << std::endl; return false; } - for( unsigned int index = 0u; index < data.expectedNumberOfNewParagraphGlyphs; ++index ) + for(unsigned int index = 0u; index < data.expectedNumberOfNewParagraphGlyphs; ++index) { - if( data.newParagraphGlyphs[index] != newParagraphGlyphs[index] ) + if(data.newParagraphGlyphs[index] != newParagraphGlyphs[index]) { std::cout << " different new paragraph glyph, index : " << index << std::endl; return false; @@ -314,41 +314,40 @@ bool ShapeInfoTest( const ShapeInfoData& data ) void LoadTextShapeFonts() { TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 96u, 96u ); + fontClient.SetDpi(96u, 96u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/noto/NotoSansMalayalam-Regular.ttf" ); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/noto/NotoSansMalayalam-Regular.ttf"); } void LoadSoftwareStylingFonts() { TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.SetDpi( 96u, 96u ); + fontClient.SetDpi(96u, 96u); - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Regular.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Bold.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Italic.ttf" ); - fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-BoldItalic.ttf" ); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Regular.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Bold.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-Italic.ttf"); + fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/roboto/Roboto-BoldItalic.ttf"); } void LoadEmojiFonts() { TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); fontClient.ClearCache(); - fontClient.SetDpi( 96u, 96u ); - - char* pathNamePtr = get_current_dir_name(); - const std::string pathName( pathNamePtr ); - free( pathNamePtr ); + fontClient.SetDpi(96u, 96u); + char* pathNamePtr = get_current_dir_name(); + const std::string pathName(pathNamePtr); + free(pathNamePtr); TextAbstraction::FontDescription fontDescriptionText; fontDescriptionText.path = ""; @@ -376,164 +375,150 @@ int UtcDaliTextShape(void) tet_infoline(" UtcDaliTextShape"); struct GlyphInfoData glyphs02[] = - { - { 1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f }, - { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - }; - - CharacterIndex characterIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u }; - Length charactersPerGlyph02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u }; + { + {1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f}, + {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + }; + + CharacterIndex characterIndices02[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u}; + Length charactersPerGlyph02[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u}; struct GlyphInfoData glyphs03[] = - { - { 1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f }, - { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }, - { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }, - }; - - CharacterIndex characterIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u }; - Length charactersPerGlyph03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u }; - CharacterIndex newParagraphGlyphs03[] = { 11u, 16u }; + { + {1u, 276u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 317u, 0.f, 0.f, 0.f, 0.f, 11.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f}, + {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, + {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, + }; + + CharacterIndex characterIndices03[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u}; + Length charactersPerGlyph03[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u}; + CharacterIndex newParagraphGlyphs03[] = {11u, 16u}; struct GlyphInfoData glyphs04[] = - { - { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 2u, 27u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f }, - { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 2u, 55u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f }, - { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 2u, 56u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f }, - { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 2u, 52u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f }, - { 2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - }; - - CharacterIndex characterIndices04[] = { 0u, 0u, 0u, 2u, 2u, 2u, 4u, 4u, 4u, 6u, 6u, 6u }; - Length charactersPerGlyph04[] = { 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u }; + { + {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {2u, 27u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f}, + {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {2u, 55u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f}, + {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {2u, 56u, 0.f, 0.f, 0.f, 0.f, 19.f, 0.f}, + {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {2u, 67u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {2u, 52u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f}, + {2u, 59u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + }; + + CharacterIndex characterIndices04[] = {0u, 0u, 0u, 2u, 2u, 2u, 4u, 4u, 4u, 6u, 6u, 6u}; + Length charactersPerGlyph04[] = {0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u}; struct GlyphInfoData glyphs05[] = - { - { 1u, 280u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f }, - { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f }, - { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f }, - { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }, - { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 311u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 403u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 296u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }, - { 1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f }, - { 1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f }, - { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f }, - { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f }, - { 1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f }, - { 1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f }, - { 1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f }, - { 1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f }, - { 1u, 4u, 0.f, 0.f, 0.f, 0.f, 3.f, 0.f }, - { 1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f }, - }; - - CharacterIndex characterIndices05[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, - 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, - 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, - 30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, 40u, - 41u, 42u, 43u, 44u, 45u, 46u, 47u, 48u, 49u, 50u, - 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u, - 61u, 62u, 63u, 64u, 65u, 66u, 67u, 68u, 69u, 70u, - 71u, 72u, 73u, 74u }; - Length charactersPerGlyph05[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u, 1u, 2u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u }; - CharacterIndex newParagraphGlyphs05[] = { 26u }; - CharacterIndex newParagraphGlyphs06[] = { 49u }; - CharacterIndex newParagraphGlyphs07[] = { 73u }; + { + {1u, 280u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f}, + {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 306u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 312u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f}, + {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 314u, 0.f, 0.f, 0.f, 0.f, 6.f, 0.f}, + {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, + {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 311u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 403u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 296u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, + {1u, 310u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 309u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f}, + {1u, 313u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 312u, 0.f, 0.f, 0.f, 0.f, 5.f, 0.f}, + {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f}, + {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 298u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 303u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 295u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 308u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f}, + {1u, 299u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 3u, 0.f, 0.f, 0.f, 0.f, 4.f, 0.f}, + {1u, 297u, 0.f, 0.f, 0.f, 0.f, 7.f, 0.f}, + {1u, 315u, 0.f, 0.f, 0.f, 0.f, 8.f, 0.f}, + {1u, 307u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f}, + {1u, 4u, 0.f, 0.f, 0.f, 0.f, 3.f, 0.f}, + {1u, 0u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}, + }; + + CharacterIndex characterIndices05[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u, 30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 43u, 44u, 45u, 46u, 47u, 48u, 49u, 50u, 51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u, 61u, 62u, 63u, 64u, 65u, 66u, 67u, 68u, 69u, 70u, 71u, 72u, 73u, 74u}; + Length charactersPerGlyph05[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 2u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u}; + CharacterIndex newParagraphGlyphs05[] = {26u}; + CharacterIndex newParagraphGlyphs06[] = {49u}; + CharacterIndex newParagraphGlyphs07[] = {73u}; Vector fontDescriptions01; Vector fontDescriptions02; @@ -542,261 +527,233 @@ int UtcDaliTextShape(void) Vector fontDescriptions05; Vector fontDescriptions06; - const std::string fontFamily( "TizenSans" ); - const std::string fontFamilyMalayalam( "Noto Sans Malayalam" ); + const std::string fontFamily("TizenSans"); + const std::string fontFamilyMalayalam("Noto Sans Malayalam"); FontDescriptionRun fontDescriptionRun01 = - { { + {0u, + 11u}, + nullptr, 0u, - 11u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - false, - false - }; + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + false, + false, + false, + false}; fontDescriptionRun01.familyLength = fontFamily.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength); - fontDescriptions01.PushBack( fontDescriptionRun01 ); + fontDescriptions01.PushBack(fontDescriptionRun01); FontDescriptionRun fontDescriptionRun02 = - { { + {0u, + 17u}, + nullptr, 0u, - 17u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - false, - false - }; + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + false, + false, + false, + false}; fontDescriptionRun02.familyLength = fontFamily.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength); - fontDescriptions02.PushBack( fontDescriptionRun02 ); + fontDescriptions02.PushBack(fontDescriptionRun02); FontDescriptionRun fontDescriptionRun03 = - { { + {0u, + 8u}, + nullptr, 0u, - 8u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - false, - false - }; + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + false, + false, + false, + false}; fontDescriptionRun03.familyLength = fontFamilyMalayalam.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontFamilyMalayalam.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontFamilyMalayalam.c_str(), fontDescriptionRun03.familyLength); - fontDescriptions03.PushBack( fontDescriptionRun03 ); + fontDescriptions03.PushBack(fontDescriptionRun03); FontDescriptionRun fontDescriptionRun04 = - { { + {0u, + 75u}, + nullptr, 0u, - 75u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - false, - false - }; + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + false, + false, + false, + false}; fontDescriptionRun04.familyLength = fontFamily.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength); - fontDescriptions04.PushBack( fontDescriptionRun04 ); + fontDescriptions04.PushBack(fontDescriptionRun04); FontDescriptionRun fontDescriptionRun05 = - { { + {0u, + 75u}, + nullptr, 0u, - 75u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - false, - false - }; + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + false, + false, + false, + false}; fontDescriptionRun05.familyLength = fontFamily.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength); - fontDescriptions05.PushBack( fontDescriptionRun05 ); + fontDescriptions05.PushBack(fontDescriptionRun05); FontDescriptionRun fontDescriptionRun06 = - { - { - 0u, - 75u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - false, - false - }; - fontDescriptionRun06.familyLength = fontFamily.size(); - fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; - memcpy( fontDescriptionRun06.familyName, fontFamily.c_str(), fontDescriptionRun06.familyLength ); - - fontDescriptions06.PushBack( fontDescriptionRun06 ); - - struct ShapeInfoData data[] = - { - { - "Zero characters", - "", - 0u, - 0u, - 0u, - nullptr, - nullptr, - nullptr, - 0u, - nullptr, - false, - }, { - "Latin script", - "Hello world", - 0u, - 11u, - 11u, - glyphs02, - characterIndices02, - charactersPerGlyph02, - 0u, + {0u, + 75u}, nullptr, - false, - fontDescriptions01 - }, - { - "Latin script. Some paragraphs.", - "Hello world\ndemo\n", - 0u, - 17u, - 17u, - glyphs03, - characterIndices03, - charactersPerGlyph03, - 2u, - newParagraphGlyphs03, - false, - fontDescriptions02 - }, - { - "Malayalam script. More glyphs than characters.", - "ജോസോഹോവോ", - 0u, - 8u, - 12u, - glyphs04, - characterIndices04, - charactersPerGlyph04, 0u, - nullptr, + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, false, - fontDescriptions03 - }, - { - "Latin script with some paragraphs. Update initial paragraph.", - "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n", - 0u, - 27u, - 74u, - glyphs05, - characterIndices05, - charactersPerGlyph05, - 1u, - newParagraphGlyphs05, false, - fontDescriptions04, - }, - { - "Latin script with some paragraphs. Update mid paragraph.", - "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n", - 27u, - 24u, - 74u, - glyphs05, - characterIndices05, - charactersPerGlyph05, - 1u, - newParagraphGlyphs06, false, - fontDescriptions05 - }, + false}; + fontDescriptionRun06.familyLength = fontFamily.size(); + fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength]; + memcpy(fontDescriptionRun06.familyName, fontFamily.c_str(), fontDescriptionRun06.familyLength); + + fontDescriptions06.PushBack(fontDescriptionRun06); + + struct ShapeInfoData data[] = { - "Latin script with some paragraphs. Update final paragraph.", - "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n", - 51u, - 24u, - 74u, - glyphs05, - characterIndices05, - charactersPerGlyph05, - 1u, - newParagraphGlyphs07, - false, - fontDescriptions06 - }, - }; + { + "Zero characters", + "", + 0u, + 0u, + 0u, + nullptr, + nullptr, + nullptr, + 0u, + nullptr, + false, + }, + {"Latin script", + "Hello world", + 0u, + 11u, + 11u, + glyphs02, + characterIndices02, + charactersPerGlyph02, + 0u, + nullptr, + false, + fontDescriptions01}, + {"Latin script. Some paragraphs.", + "Hello world\ndemo\n", + 0u, + 17u, + 17u, + glyphs03, + characterIndices03, + charactersPerGlyph03, + 2u, + newParagraphGlyphs03, + false, + fontDescriptions02}, + {"Malayalam script. More glyphs than characters.", + "ജോസോഹോവോ", + 0u, + 8u, + 12u, + glyphs04, + characterIndices04, + charactersPerGlyph04, + 0u, + nullptr, + false, + fontDescriptions03}, + { + "Latin script with some paragraphs. Update initial paragraph.", + "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n", + 0u, + 27u, + 74u, + glyphs05, + characterIndices05, + charactersPerGlyph05, + 1u, + newParagraphGlyphs05, + false, + fontDescriptions04, + }, + {"Latin script with some paragraphs. Update mid paragraph.", + "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n", + 27u, + 24u, + 74u, + glyphs05, + characterIndices05, + charactersPerGlyph05, + 1u, + newParagraphGlyphs06, + false, + fontDescriptions05}, + {"Latin script with some paragraphs. Update final paragraph.", + "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n", + 51u, + 24u, + 74u, + glyphs05, + characterIndices05, + charactersPerGlyph05, + 1u, + newParagraphGlyphs07, + false, + fontDescriptions06}, + }; const unsigned int numberOfTests = 7u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; LoadTextShapeFonts(); - if( !ShapeInfoTest( data[index] ) ) + if(!ShapeInfoTest(data[index])) { tet_result(TET_FAIL); } @@ -811,186 +768,165 @@ int UtcDaliTextSoftwareStyling(void) tet_infoline(" UtcDaliTextSoftwareStyling"); struct GlyphInfoData glyphs01[] = - { - { 4u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true }, - { 4u, 39u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f, true, true }, - { 4u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true }, - { 4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true }, - }; + { + {4u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true}, + {4u, 39u, 0.f, 0.f, 0.f, 0.f, 9.f, 0.f, true, true}, + {4u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true}, + {4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true}, + }; struct GlyphInfoData glyphs02[] = - { - { 1u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, false }, - { 2u, 39u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, true }, - { 3u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, false }, - { 4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true }, - }; + { + {1u, 38u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, false}, + {2u, 39u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, false, true}, + {3u, 40u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, false}, + {4u, 41u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f, true, true}, + }; - CharacterIndex characterIndices[] = { 0u, 1u, 2u, 3u }; - Length charactersPerGlyph[] = { 1u, 1u, 1u, 1u }; + CharacterIndex characterIndices[] = {0u, 1u, 2u, 3u}; + Length charactersPerGlyph[] = {1u, 1u, 1u, 1u}; Vector fontDescriptions01; Vector fontDescriptions02; - const std::string fontFamily( "Roboto" ); + const std::string fontFamily("Roboto"); FontDescriptionRun fontDescriptionRun01 = - { { + {0u, + 4u}, + nullptr, 0u, - 4u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::BOLD, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::ITALIC, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - true, - false, - true, - false - }; + TextAbstraction::FontWeight::BOLD, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::ITALIC, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + true, + false, + true, + false}; fontDescriptionRun01.familyLength = fontFamily.size(); - fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; - memcpy( fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength ); + fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength]; + memcpy(fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength); fontDescriptions01.PushBack(fontDescriptionRun01); FontDescriptionRun fontDescriptionRun02 = - { { + {0u, + 1u}, + nullptr, 0u, - 1u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - false, - false - }; + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + false, + false, + false, + false}; fontDescriptionRun02.familyLength = fontFamily.size(); - fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; - memcpy( fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength ); + fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength]; + memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength); FontDescriptionRun fontDescriptionRun03 = - { { - 1u, - 1u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::BOLD, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::NONE, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - true, - false, - false, - false - }; + {1u, + 1u}, + nullptr, + 0u, + TextAbstraction::FontWeight::BOLD, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::NONE, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + true, + false, + false, + false}; fontDescriptionRun03.familyLength = fontFamily.size(); - fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; - memcpy( fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength ); + fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength]; + memcpy(fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength); FontDescriptionRun fontDescriptionRun04 = - { { - 2u, - 1u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::NONE, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::ITALIC, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - false, - false, - true, - false - }; + {2u, + 1u}, + nullptr, + 0u, + TextAbstraction::FontWeight::NONE, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::ITALIC, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + false, + false, + true, + false}; fontDescriptionRun04.familyLength = fontFamily.size(); - fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; - memcpy( fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength ); + fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength]; + memcpy(fontDescriptionRun04.familyName, fontFamily.c_str(), fontDescriptionRun04.familyLength); FontDescriptionRun fontDescriptionRun05 = - { { - 3u, - 1u - }, - nullptr, - 0u, - TextAbstraction::FontWeight::BOLD, - TextAbstraction::FontWidth::NONE, - TextAbstraction::FontSlant::ITALIC, - TextAbstraction::FontClient::DEFAULT_POINT_SIZE, - true, - true, - false, - true, - false - }; + {3u, + 1u}, + nullptr, + 0u, + TextAbstraction::FontWeight::BOLD, + TextAbstraction::FontWidth::NONE, + TextAbstraction::FontSlant::ITALIC, + TextAbstraction::FontClient::DEFAULT_POINT_SIZE, + true, + true, + false, + true, + false}; fontDescriptionRun05.familyLength = fontFamily.size(); - fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; - memcpy( fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength ); + fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength]; + memcpy(fontDescriptionRun05.familyName, fontFamily.c_str(), fontDescriptionRun05.familyLength); fontDescriptions02.PushBack(fontDescriptionRun02); fontDescriptions02.PushBack(fontDescriptionRun03); fontDescriptions02.PushBack(fontDescriptionRun04); fontDescriptions02.PushBack(fontDescriptionRun05); - struct ShapeInfoData data[] = - { - { - "Latin script. Characters have same font description", - "ABCD", - 0u, - 4u, - 4u, - glyphs01, - characterIndices, - charactersPerGlyph, - 0u, - nullptr, - false, - fontDescriptions01 - }, { - "Latin script. Each character has different font description.", - "ABCD", - 0u, - 4u, - 4u, - glyphs02, - characterIndices, - charactersPerGlyph, - 0u, - nullptr, - false, - fontDescriptions02 - } - }; + {"Latin script. Characters have same font description", + "ABCD", + 0u, + 4u, + 4u, + glyphs01, + characterIndices, + charactersPerGlyph, + 0u, + nullptr, + false, + fontDescriptions01}, + {"Latin script. Each character has different font description.", + "ABCD", + 0u, + 4u, + 4u, + glyphs02, + characterIndices, + charactersPerGlyph, + 0u, + nullptr, + false, + fontDescriptions02}}; const unsigned int numberOfTests = 2u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; LoadSoftwareStylingFonts(); - if( !ShapeInfoTest( data[index] ) ) + if(!ShapeInfoTest(data[index])) { tet_result(TET_FAIL); } @@ -1000,16 +936,14 @@ int UtcDaliTextSoftwareStyling(void) END_TEST; } - int UtcDaliTextShapeEmojiSequences(void) { - ToolkitTestApplication application; tet_infoline(" UtcDaliTextShapeEmojiSequences"); - const std::string colorFontFamily( "NotoColorEmoji" ); - const std::string textFontFamily( "DejaVuSans" ); + const std::string colorFontFamily("NotoColorEmoji"); + const std::string textFontFamily("DejaVuSans"); LoadEmojiFonts(); @@ -1026,110 +960,94 @@ int UtcDaliTextShapeEmojiSequences(void) bool slantDefined = false; bool sizeDefined = false; - // variation selector 16 (Emoji) struct GlyphInfoData glyphsVS16[] = - { - { 2u, 74u, 0.f, 0.f, 0.f, 0.f, 39.0f, 0.f, false, false }, - }; - CharacterIndex characterIndicesVS16[] = { 0u, 1u}; - Length charactersPerGlyphVS16[] = { 2u }; - - + { + {2u, 74u, 0.f, 0.f, 0.f, 0.f, 39.0f, 0.f, false, false}, + }; + CharacterIndex characterIndicesVS16[] = {0u, 1u}; + Length charactersPerGlyphVS16[] = {2u}; // variation selector 15 (Text) struct GlyphInfoData glyphsVS15[] = - { - { 1u, 3842u, 0.f, 0.f, 0.f, 0.f, 14.0f, 0.f, false, false }, - { 1u, 8203u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, false, false }, - }; - CharacterIndex characterIndicesVS15[] = { 0u, 0u}; - Length charactersPerGlyphVS15[] = { 0u, 2u }; + { + {1u, 3842u, 0.f, 0.f, 0.f, 0.f, 14.0f, 0.f, false, false}, + {1u, 8203u, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, false, false}, + }; + CharacterIndex characterIndicesVS15[] = {0u, 0u}; + Length charactersPerGlyphVS15[] = {0u, 2u}; //Font Descriptions Vector fontDescriptionsColorVS16 = - CreateSingleFontDescription (characterRun, colorFontFamily, weight, width, - slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); + CreateSingleFontDescription(characterRun, colorFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); Vector fontDescriptionsColorVS15 = - CreateSingleFontDescription (characterRun, colorFontFamily, weight, width, - slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); + CreateSingleFontDescription(characterRun, colorFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); Vector fontDescriptionsTextVS16 = - CreateSingleFontDescription (characterRun, textFontFamily, weight, width, - slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); + CreateSingleFontDescription(characterRun, textFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); Vector fontDescriptionsTextVS15 = - CreateSingleFontDescription (characterRun, textFontFamily, weight, width, - slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); - + CreateSingleFontDescription(characterRun, textFontFamily, weight, width, slant, size, familyDefined, weightDefined, widthDefined, slantDefined, sizeDefined); struct ShapeInfoData data[] = - { - { - "EMOJI Sequence: Color Font with VS16", - "☪️", - 0u, - 2u, - 1u, - glyphsVS16, - characterIndicesVS16, - charactersPerGlyphVS16, - 0u, - nullptr, - true, - fontDescriptionsColorVS16 - }, - { - "EMOJI Sequence: Color Font with VS15", - "☪︎", - 0u, - 2u, - 2u, - glyphsVS15, - characterIndicesVS15, - charactersPerGlyphVS15, - 0u, - nullptr, - true, - fontDescriptionsColorVS15 - }, - { - "EMOJI Sequence: Text Font with VS16", - "☪️", - 0u, - 2u, - 1u, - glyphsVS16, - characterIndicesVS16, - charactersPerGlyphVS16, - 0u, - nullptr, - true, - fontDescriptionsTextVS16 - }, { - "EMOJI Sequence: Text Font with VS15", - "☪︎", - 0u, - 2u, - 2u, - glyphsVS15, - characterIndicesVS15, - charactersPerGlyphVS15, - 0u, - nullptr, - true, - fontDescriptionsTextVS15 - }, - }; + {"EMOJI Sequence: Color Font with VS16", + "☪️", + 0u, + 2u, + 1u, + glyphsVS16, + characterIndicesVS16, + charactersPerGlyphVS16, + 0u, + nullptr, + true, + fontDescriptionsColorVS16}, + {"EMOJI Sequence: Color Font with VS15", + "☪︎", + 0u, + 2u, + 2u, + glyphsVS15, + characterIndicesVS15, + charactersPerGlyphVS15, + 0u, + nullptr, + true, + fontDescriptionsColorVS15}, + {"EMOJI Sequence: Text Font with VS16", + "☪️", + 0u, + 2u, + 1u, + glyphsVS16, + characterIndicesVS16, + charactersPerGlyphVS16, + 0u, + nullptr, + true, + fontDescriptionsTextVS16}, + {"EMOJI Sequence: Text Font with VS15", + "☪︎", + 0u, + 2u, + 2u, + glyphsVS15, + characterIndicesVS15, + charactersPerGlyphVS15, + 0u, + nullptr, + true, + fontDescriptionsTextVS15}, + }; const unsigned int numberOfTests = 4u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { - tet_infoline( data[index].description.c_str()); - if( !ShapeInfoTest( data[index] ) ) + tet_infoline(data[index].description.c_str()); + if(!ShapeInfoTest(data[index])) { tet_result(TET_FAIL); } diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-VisualModel.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-VisualModel.cpp index a88a85d..c0e6a76 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-VisualModel.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-VisualModel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,7 +23,6 @@ #include #include - using namespace Dali; using namespace Toolkit; using namespace Text; @@ -36,12 +35,10 @@ using namespace Text; // void CreateGlyphsPerCharacterTable( CharacterIndex startIndex, // Length numberOfCharacters ) - ////////////////////////////////////////////////////////// namespace { - struct SetGlyphsPerCharacterData { std::string description; ///< Description of the test. @@ -62,83 +59,85 @@ struct SetCharacterToGlyphData unsigned int* glyphsIndices; ///< The glyph indices. }; -bool SetGlyphsPerCharacterTest( const SetGlyphsPerCharacterData& data ) +bool SetGlyphsPerCharacterTest(const SetGlyphsPerCharacterData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; const Vector fontDescriptions; - const LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptions, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptions, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - Vector& charactersToGlyph = visualModel->mCharactersToGlyph; - Vector& glyphsPerCharacter = visualModel->mGlyphsPerCharacter; + Vector& charactersToGlyph = visualModel->mCharactersToGlyph; + Vector& glyphsPerCharacter = visualModel->mGlyphsPerCharacter; // 2) Clear the model. GlyphIndex startGlyphIndex = 0u; - if( 0u != charactersToGlyph.Count() ) + if(0u != charactersToGlyph.Count()) { // The number of glyphs to be removed. const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex]; - startGlyphIndex = charactersToGlyph[data.startIndex]; + startGlyphIndex = charactersToGlyph[data.startIndex]; - charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex, - charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters ); - glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.startIndex, - glyphsPerCharacter.Begin() + data.startIndex + data.numberOfCharacters ); + charactersToGlyph.Erase(charactersToGlyph.Begin() + data.startIndex, + charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters); + glyphsPerCharacter.Erase(glyphsPerCharacter.Begin() + data.startIndex, + glyphsPerCharacter.Begin() + data.startIndex + data.numberOfCharacters); // Update the character to glyph indices. - for( Vector::Iterator it = charactersToGlyph.Begin() + data.startIndex, - endIt = charactersToGlyph.End(); - it != endIt; - ++it ) + for(Vector::Iterator it = charactersToGlyph.Begin() + data.startIndex, + endIt = charactersToGlyph.End(); + it != endIt; + ++it) { *it -= numberOfGlyphs; } } // 3) Call the CreateGlyphsPerCharacterTable() function - visualModel->CreateGlyphsPerCharacterTable( data.startIndex, - startGlyphIndex, - data.numberOfCharacters ); + visualModel->CreateGlyphsPerCharacterTable(data.startIndex, + startGlyphIndex, + data.numberOfCharacters); // 4) Compare the results. - if( data.totalNumberOfCharacters != glyphsPerCharacter.Count() ) + if(data.totalNumberOfCharacters != glyphsPerCharacter.Count()) { std::cout << " Different number of characters : " << glyphsPerCharacter.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl; return false; } - for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i ) + for(unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i) { - if( data.glyphsPerCharacter[i] != glyphsPerCharacter[i] ) + if(data.glyphsPerCharacter[i] != glyphsPerCharacter[i]) { std::cout << " Different number of glyphs for index " << i << std::endl; - for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j ) + for(unsigned int j = 0; j < data.totalNumberOfCharacters; ++j) { std::cout << glyphsPerCharacter[j] << " "; } std::cout << std::endl; std::cout << " expected" << std::endl; - for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j ) + for(unsigned int j = 0; j < data.totalNumberOfCharacters; ++j) { std::cout << data.glyphsPerCharacter[j] << " "; } @@ -150,81 +149,83 @@ bool SetGlyphsPerCharacterTest( const SetGlyphsPerCharacterData& data ) return true; } -bool SetCharacterToGlyphTest( const SetCharacterToGlyphData& data ) +bool SetCharacterToGlyphTest(const SetCharacterToGlyphData& data) { // 1) Create the model. - ModelPtr textModel; + ModelPtr textModel; MetricsPtr metrics; - Size textArea(100.f, 60.f); - Size layoutSize; + Size textArea(100.f, 60.f); + Size layoutSize; const Vector fontDescriptions; - const LayoutOptions options; - CreateTextModel( data.text, - textArea, - fontDescriptions, - options, - layoutSize, - textModel, - metrics, - false, - LineWrap::WORD, - false, - Toolkit::DevelText::EllipsisPosition::END, - 0.f ); + const LayoutOptions options; + CreateTextModel(data.text, + textArea, + fontDescriptions, + options, + layoutSize, + textModel, + metrics, + false, + LineWrap::WORD, + false, + Toolkit::DevelText::EllipsisPosition::END, + 0.0f, // lineSpacing + 0.0f // characterSpacing + ); LogicalModelPtr logicalModel = textModel->mLogicalModel; - VisualModelPtr visualModel = textModel->mVisualModel; + VisualModelPtr visualModel = textModel->mVisualModel; - Vector& charactersToGlyph = visualModel->mCharactersToGlyph; - Vector& glyphsPerCharacter = visualModel->mGlyphsPerCharacter; + Vector& charactersToGlyph = visualModel->mCharactersToGlyph; + Vector& glyphsPerCharacter = visualModel->mGlyphsPerCharacter; // 2) Clear the model. GlyphIndex startGlyphIndex = 0u; - if( 0u != charactersToGlyph.Count() ) + if(0u != charactersToGlyph.Count()) { // The number of glyphs to be removed. const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex]; - startGlyphIndex = charactersToGlyph[data.startIndex]; + startGlyphIndex = charactersToGlyph[data.startIndex]; - charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex, - charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters ); + charactersToGlyph.Erase(charactersToGlyph.Begin() + data.startIndex, + charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters); // Update the character to glyph indices. - for( Vector::Iterator it = charactersToGlyph.Begin() + data.startIndex, - endIt = charactersToGlyph.End(); - it != endIt; - ++it ) + for(Vector::Iterator it = charactersToGlyph.Begin() + data.startIndex, + endIt = charactersToGlyph.End(); + it != endIt; + ++it) { *it -= numberOfGlyphs; } } // 3) Call the CreateCharacterToGlyphTable() function - visualModel->CreateCharacterToGlyphTable( data.startIndex, - startGlyphIndex, - data.numberOfCharacters ); + visualModel->CreateCharacterToGlyphTable(data.startIndex, + startGlyphIndex, + data.numberOfCharacters); // 4) Compare the results. - if( data.totalNumberOfCharacters != charactersToGlyph.Count() ) + if(data.totalNumberOfCharacters != charactersToGlyph.Count()) { std::cout << " Different number of character : " << charactersToGlyph.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl; return false; } - for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i ) + for(unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i) { - if( data.glyphsIndices[i] != charactersToGlyph[i] ) + if(data.glyphsIndices[i] != charactersToGlyph[i]) { std::cout << " Different number of character to glyph index " << i << std::endl; - for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j ) + for(unsigned int j = 0; j < data.totalNumberOfCharacters; ++j) { std::cout << charactersToGlyph[j] << " "; } std::cout << std::endl; std::cout << " expected" << std::endl; - for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j ) + for(unsigned int j = 0; j < data.totalNumberOfCharacters; ++j) { std::cout << data.glyphsIndices[j] << " "; } @@ -244,72 +245,65 @@ int UtcDaliSetGlyphsPerCharacter(void) { tet_infoline(" UtcDaliSetGlyphsPerCharacter"); - Length glyphsPerCharacter02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u }; - Length glyphsPerCharacter03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u }; - Length glyphsPerCharacter04[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, - 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, - 1u, 1u, 1u, 1u, 0u, 1u, 0u, 2u, 1u, 0u, - 2u, 0u, 2u, 0u, 2u, 1u, 1u, 0u, 0u, 0u, - 2u, 1u, 1u, 1u, 1u, 1u, 0u, 0u, 2u, 1u, - 0u, 2u, 1u, 1u }; + Length glyphsPerCharacter02[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u}; + Length glyphsPerCharacter03[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u}; + Length glyphsPerCharacter04[] = {1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 0u, 2u, 1u, 0u, 2u, 0u, 2u, 0u, 2u, 1u, 1u, 0u, 0u, 0u, 2u, 1u, 1u, 1u, 1u, 1u, 0u, 0u, 2u, 1u, 0u, 2u, 1u, 1u}; struct SetGlyphsPerCharacterData data[] = - { - { - "Zero characters text", - "", - 0u, - 0u, - 0u, - NULL - }, - { - "Simple 1 to 1 text", - "Hello world", - 0u, - 11u, - 11u, - glyphsPerCharacter02, - }, - { - "Text with different number of glyphs and characters.", - "Hello different world", - 0u, - 21u, - 21u, - glyphsPerCharacter03, - }, { - "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.", - "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", - 0u, - 22u, - 54u, - glyphsPerCharacter04, - }, - { - "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.", - "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", - 22u, - 14u, - 54u, - glyphsPerCharacter04, - }, - { - "Text paragraphs with different number of glyphs and characters. Update final paragraphs.", - "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", - 36u, - 18u, - 54u, - glyphsPerCharacter04, - }, - }; + {"Zero characters text", + "", + 0u, + 0u, + 0u, + NULL}, + { + "Simple 1 to 1 text", + "Hello world", + 0u, + 11u, + 11u, + glyphsPerCharacter02, + }, + { + "Text with different number of glyphs and characters.", + "Hello different world", + 0u, + 21u, + 21u, + glyphsPerCharacter03, + }, + { + "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.", + "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", + 0u, + 22u, + 54u, + glyphsPerCharacter04, + }, + { + "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.", + "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", + 22u, + 14u, + 54u, + glyphsPerCharacter04, + }, + { + "Text paragraphs with different number of glyphs and characters. Update final paragraphs.", + "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", + 36u, + 18u, + 54u, + glyphsPerCharacter04, + }, + }; const unsigned int numberOfTests = 6u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !SetGlyphsPerCharacterTest( data[index] ) ) + if(!SetGlyphsPerCharacterTest(data[index])) { tet_result(TET_FAIL); } @@ -323,70 +317,66 @@ int UtcDaliSetCharacterToGlyph(void) { tet_infoline(" UtcDaliSetGlyphsPerCharacter"); - GlyphIndex glyphIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u }; - GlyphIndex glyphIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u }; - GlyphIndex glyphIndices04[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, - 21u, 22u, 23u, 23u, 24u, 24u, 26u, 27u, 27u, 29u, 29u, 31u, 31u, 33u, - 34u, 35u, 35u, 35u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 42u, 42u, 44u, 45u, 45u, 47u, 48u }; + GlyphIndex glyphIndices02[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u}; + GlyphIndex glyphIndices03[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u}; + GlyphIndex glyphIndices04[] = {0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u, 21u, 22u, 23u, 23u, 24u, 24u, 26u, 27u, 27u, 29u, 29u, 31u, 31u, 33u, 34u, 35u, 35u, 35u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 42u, 42u, 44u, 45u, 45u, 47u, 48u}; struct SetCharacterToGlyphData data[] = - { - { - "Zero characters text", - "", - 0u, - 0u, - 0u, - NULL - }, - { - "Simple 1 to 1 text", - "Hello world", - 0u, - 11u, - 11u, - glyphIndices02, - }, - { - "Text with different number of glyphs and characters.", - "Hello different world", - 0u, - 21u, - 21u, - glyphIndices03, - }, - { - "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.", - "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", - 0u, - 22u, - 54u, - glyphIndices04, - }, { - "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.", - "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", - 22u, - 14u, - 54u, - glyphIndices04, - }, - { - "Text paragraphs with different number of glyphs and characters. Update final paragraphs.", - "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", - 36u, - 18u, - 54u, - glyphIndices04, - }, - }; + {"Zero characters text", + "", + 0u, + 0u, + 0u, + NULL}, + { + "Simple 1 to 1 text", + "Hello world", + 0u, + 11u, + 11u, + glyphIndices02, + }, + { + "Text with different number of glyphs and characters.", + "Hello different world", + 0u, + 21u, + 21u, + glyphIndices03, + }, + { + "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.", + "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", + 0u, + 22u, + 54u, + glyphIndices04, + }, + { + "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.", + "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", + 22u, + 14u, + 54u, + glyphIndices04, + }, + { + "Text paragraphs with different number of glyphs and characters. Update final paragraphs.", + "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက", + 36u, + 18u, + 54u, + glyphIndices04, + }, + }; const unsigned int numberOfTests = 6u; - for( unsigned int index = 0u; index < numberOfTests; ++index ) + for(unsigned int index = 0u; index < numberOfTests; ++index) { ToolkitTestApplication application; - if( !SetCharacterToGlyphTest( data[index] ) ) + if(!SetCharacterToGlyphTest(data[index])) { tet_result(TET_FAIL); } diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index e38ca01..728134f 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -5645,6 +5645,30 @@ int UtcDaliToolkitTextEditorUnderlineTypesGeneration3(void) DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet1, underlineMapSet1), true, TEST_LOCATION); application.GetScene().Add(textEditor1); + + application.SendNotification(); + application.Render(); + + END_TEST; +} + +int UtcDaliTextEditorCharacterSpacing(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextEditorCharacterSpacing "); + + TextEditor textEditor = TextEditor::New(); + + textEditor.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 300.f)); + + application.GetScene().Add(textEditor); + application.SendNotification(); + application.Render(); + + textEditor.SetProperty(TextEditor::Property::TEXT, "Hi Experiment"); + textEditor.SetProperty(DevelTextEditor::Property::CHARACTER_SPACING, 10.f); + DALI_TEST_EQUALS(textEditor.GetProperty(DevelTextEditor::Property::CHARACTER_SPACING), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION); + application.SendNotification(); application.Render(); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp index aca0054..892fc99 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -5142,6 +5142,30 @@ int UtcDaliToolkitTextFieldUnderlineTypesGeneration2(void) DALI_TEST_EQUALS(DaliTestCheckMaps(underlineMapGet3, underlineMapSet3), true, TEST_LOCATION); application.GetScene().Add(field3); + + application.SendNotification(); + application.Render(); + + END_TEST; +} + +int UtcDaliTextFieldCharacterSpacing(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextFieldCharacterSpacing "); + + TextField textField = TextField::New(); + + textField.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 300.f)); + + application.GetScene().Add(textField); + application.SendNotification(); + application.Render(); + + textField.SetProperty(TextField::Property::TEXT, "Hi Experiment"); + textField.SetProperty(DevelTextField::Property::CHARACTER_SPACING, 10.f); + DALI_TEST_EQUALS(textField.GetProperty(DevelTextField::Property::CHARACTER_SPACING), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION); + application.SendNotification(); application.Render(); diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp index 66148f2..95d0689 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -2630,4 +2630,27 @@ int UtcDaliToolkitTextLabelStrikethroughGeneration(void) strikethroughMapGet.Clear(); END_TEST; +} + +int UtcDaliTextLabelCharacterSpacing(void) +{ + ToolkitTestApplication application; + tet_infoline(" UtcDaliTextLabelCharacterSpacing "); + + TextLabel textLabel = TextLabel::New(); + + textLabel.SetProperty(Actor::Property::SIZE, Vector2(150.0f, 300.f)); + + application.GetScene().Add(textLabel); + application.SendNotification(); + application.Render(); + + textLabel.SetProperty(TextLabel::Property::TEXT, "Hi Experiment"); + textLabel.SetProperty(DevelTextLabel::Property::CHARACTER_SPACING, 10.f); + DALI_TEST_EQUALS(textLabel.GetProperty(DevelTextLabel::Property::CHARACTER_SPACING), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + END_TEST; } \ No newline at end of file diff --git a/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h index 5a35e2d..309a4f8 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-editor-devel.h @@ -294,6 +294,15 @@ enum Type * @details Name "inputStrikethrough", type Property::MAP. */ INPUT_STRIKETHROUGH, + + /** + * @brief The spaces between characters in Pixels. + * @details Name "characterSpacing", type Property::FLOAT. + * @note + * A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * The default value is 0.f which does nothing. + */ + CHARACTER_SPACING, }; } // namespace Property diff --git a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h index 9bc6fc1..1c711a8 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-field-devel.h @@ -233,6 +233,15 @@ enum * @details Name "inputStrikethrough", type Property::MAP. */ INPUT_STRIKETHROUGH, + + /** + * @brief The spaces between characters in Pixels. + * @details Name "characterSpacing", type Property::FLOAT. + * @note + * A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * The default value is 0.f which does nothing. + */ + CHARACTER_SPACING, }; } // namespace Property diff --git a/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h b/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h index 47c41a8..205950c 100644 --- a/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h +++ b/dali-toolkit/devel-api/controls/text-controls/text-label-devel.h @@ -185,6 +185,15 @@ enum Type * */ STRIKETHROUGH, + + /** + * @brief The spaces between characters in Pixels. + * @details Name "characterSpacing", type Property::FLOAT. + * @note + * A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * The default value is 0.f which does nothing. + */ + CHARACTER_SPACING, }; } // namespace Property diff --git a/dali-toolkit/devel-api/text/text-utils-devel.cpp b/dali-toolkit/devel-api/text/text-utils-devel.cpp index b4abff2..7242687 100644 --- a/dali-toolkit/devel-api/text/text-utils-devel.cpp +++ b/dali-toolkit/devel-api/text/text-utils-devel.cpp @@ -40,6 +40,7 @@ #include #include #include +#include namespace Dali { @@ -814,9 +815,13 @@ void Ellipsis(const RendererParameters& textParameters, TextAbstraction::TextRen Text::ModelPtr& textModel = internalDataModel.textModel; FontClient& fontClient = internalDataModel.fontClient; - Vector& lines = textModel->mVisualModel->mLines; // The laid out lines. - Vector& isEmoji = internalDataModel.isEmoji; - const Size textLayoutArea = internalDataModel.textLayoutArea; + Vector& lines = textModel->mVisualModel->mLines; // The laid out lines. + Vector& isEmoji = internalDataModel.isEmoji; + const Size textLayoutArea = internalDataModel.textLayoutArea; + const float characterSpacing = textModel->mVisualModel->GetCharacterSpacing(); + float calculatedAdvance = 0.f; + Vector& glyphToCharacterMap = textModel->mVisualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); //////////////////////////////////////////////////////////////////////////////// // Ellipsis the text. //////////////////////////////////////////////////////////////////////////////// @@ -902,7 +907,8 @@ void Ellipsis(const RendererParameters& textParameters, TextAbstraction::TextRen firstPenSet = true; } - removedGlypsWidth += std::min(glyphToRemove.advance, (glyphToRemove.xBearing + glyphToRemove.width)); + calculatedAdvance = GetCalculatedAdvance(*(textModel->mLogicalModel->mText.Begin() + (*(glyphToCharacterMapBuffer + index))), characterSpacing, glyphToRemove.advance); + removedGlypsWidth += std::min(calculatedAdvance, (glyphToRemove.xBearing + glyphToRemove.width)); // Calculate the width of the ellipsis glyph and check if it fits. const float ellipsisGlyphWidth = ellipsisGlyph.width + ellipsisGlyph.xBearing; diff --git a/dali-toolkit/devel-api/visuals/text-visual-properties-devel.h b/dali-toolkit/devel-api/visuals/text-visual-properties-devel.h index a8c79d6..2966b95 100644 --- a/dali-toolkit/devel-api/visuals/text-visual-properties-devel.h +++ b/dali-toolkit/devel-api/visuals/text-visual-properties-devel.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_DEVEL_API_VISUALS_TEXT_VISUAL_PROPERTIES_DEVEL_H /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -61,6 +61,11 @@ enum * @copydoc Dali::Toolkit::DevelTextLabel::Property::STRIKETHROUGH */ STRIKETHROUGH = UNDERLINE + 3, + + /** + * @copydoc Dali::Toolkit::DevelTextLabel::Property::CHARACTER_SPACING + */ + CHARACTER_SPACING = UNDERLINE + 4, }; } // namespace Property diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index a75e21c..5f7a01c 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -157,6 +157,7 @@ DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextEditor, "ellipsisPositio DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextEditor, "minLineSize", FLOAT, MIN_LINE_SIZE ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextEditor, "strikethrough", MAP, STRIKETHROUGH ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextEditor, "inputStrikethrough", MAP, INPUT_STRIKETHROUGH ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextEditor, "characterSpacing", FLOAT, CHARACTER_SPACING ) DALI_SIGNAL_REGISTRATION(Toolkit, TextEditor, "textChanged", SIGNAL_TEXT_CHANGED ) DALI_SIGNAL_REGISTRATION(Toolkit, TextEditor, "inputStyleChanged", SIGNAL_INPUT_STYLE_CHANGED ) diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-property-handler.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-property-handler.cpp index c6698ff..3cb9df0 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-property-handler.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-property-handler.cpp @@ -716,6 +716,13 @@ void TextEditor::PropertyHandler::SetProperty(Toolkit::TextEditor textEditor, Pr } break; } + case Toolkit::DevelTextEditor::Property::CHARACTER_SPACING: + { + const float characterSpacing = value.Get(); + impl.mController->SetCharacterSpacing(characterSpacing); + impl.mRenderer.Reset(); + break; + } } } @@ -1118,6 +1125,11 @@ Property::Value TextEditor::PropertyHandler::GetProperty(Toolkit::TextEditor tex value = impl.mController->GetDefaultLineSize(); break; } + case Toolkit::DevelTextEditor::Property::CHARACTER_SPACING: + { + value = impl.mController->GetCharacterSpacing(); + break; + } } //switch return value; } diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index 3475b36..626dcf2 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -144,6 +144,7 @@ DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "inputFilter", DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "ellipsisPosition", INTEGER, ELLIPSIS_POSITION ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "strikethrough", MAP, STRIKETHROUGH ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "inputStrikethrough", MAP, INPUT_STRIKETHROUGH ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextField, "characterSpacing", FLOAT, CHARACTER_SPACING ) DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "textChanged", SIGNAL_TEXT_CHANGED ) DALI_SIGNAL_REGISTRATION(Toolkit, TextField, "maxLengthReached", SIGNAL_MAX_LENGTH_REACHED ) diff --git a/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp b/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp index 6020ba7..c4080b7 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp @@ -692,6 +692,14 @@ void TextField::PropertyHandler::SetProperty(Toolkit::TextField textField, Prope } break; } + case Toolkit::DevelTextField::Property::CHARACTER_SPACING: + { + const float characterSpacing = value.Get(); + DALI_LOG_INFO(gTextFieldLogFilter, Debug::General, "TextField %p CHARACTER_SPACING %d\n", impl.mController.Get(), characterSpacing); + + impl.mController->SetCharacterSpacing(characterSpacing); + break; + } } } @@ -1067,6 +1075,11 @@ Property::Value TextField::PropertyHandler::GetProperty(Toolkit::TextField textF GetStrikethroughProperties(impl.mController, value, Text::EffectStyle::INPUT); break; } + case Toolkit::DevelTextField::Property::CHARACTER_SPACING: + { + value = impl.mController->GetCharacterSpacing(); + break; + } } //switch return value; } diff --git a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp index 9ef8ed1..fb91c6f 100644 --- a/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-label-impl.cpp @@ -139,6 +139,7 @@ DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "fontSizeScale", DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "enableFontSizeScale", BOOLEAN, ENABLE_FONT_SIZE_SCALE ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "ellipsisPosition", INTEGER, ELLIPSIS_POSITION ) DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "strikethrough", MAP, STRIKETHROUGH ) +DALI_DEVEL_PROPERTY_REGISTRATION(Toolkit, TextLabel, "characterSpacing", FLOAT, CHARACTER_SPACING ) DALI_ANIMATABLE_PROPERTY_REGISTRATION_WITH_DEFAULT(Toolkit, TextLabel, "textColor", Color::BLACK, TEXT_COLOR ) DALI_ANIMATABLE_PROPERTY_COMPONENT_REGISTRATION(Toolkit, TextLabel, "textColorRed", TEXT_COLOR_RED, TEXT_COLOR, 0) @@ -534,6 +535,12 @@ void TextLabel::SetProperty(BaseObject* object, Property::Index index, const Pro impl.mTextUpdateNeeded = SetStrikethroughProperties(impl.mController, value, Text::EffectStyle::DEFAULT) || impl.mTextUpdateNeeded; break; } + case Toolkit::DevelTextLabel::Property::CHARACTER_SPACING: + { + const float characterSpacing = value.Get(); + impl.mController->SetCharacterSpacing(characterSpacing); + break; + } } // Request relayout when text update is needed. It's necessary to call it @@ -787,6 +794,11 @@ Property::Value TextLabel::GetProperty(BaseObject* object, Property::Index index GetStrikethroughProperties(impl.mController, value, Text::EffectStyle::DEFAULT); break; } + case Toolkit::DevelTextLabel::Property::CHARACTER_SPACING: + { + value = impl.mController->GetCharacterSpacing(); + break; + } } } diff --git a/dali-toolkit/internal/file.list b/dali-toolkit/internal/file.list index ddddf9a..e57fa31 100644 --- a/dali-toolkit/internal/file.list +++ b/dali-toolkit/internal/file.list @@ -181,6 +181,7 @@ SET( toolkit_src_files ${toolkit_src_dir}/text/text-view-interface.cpp ${toolkit_src_dir}/text/visual-model-impl.cpp ${toolkit_src_dir}/text/decorator/text-decorator.cpp + ${toolkit_src_dir}/text/layouts/layout-engine-helper-functions.cpp ${toolkit_src_dir}/text/layouts/layout-engine.cpp ${toolkit_src_dir}/text/multi-language-helper-functions.cpp ${toolkit_src_dir}/text/multi-language-support-impl.cpp diff --git a/dali-toolkit/internal/text/cursor-helper-functions.cpp b/dali-toolkit/internal/text/cursor-helper-functions.cpp index 2379bcc..c70d530 100644 --- a/dali-toolkit/internal/text/cursor-helper-functions.cpp +++ b/dali-toolkit/internal/text/cursor-helper-functions.cpp @@ -212,6 +212,7 @@ CharacterIndex GetClosestCursorIndex(VisualModelPtr visualModel, { return logicalIndex; } + const float characterSpacing = visualModel->GetCharacterSpacing(); // Whether there is a hit on a line. bool matchedLine = false; @@ -262,8 +263,11 @@ CharacterIndex GetClosestCursorIndex(VisualModelPtr visualModel, bool isBeforeFirstGlyph = false; // Traverses glyphs in visual order. To do that use the visual to logical conversion table. - CharacterIndex visualIndex = startCharacter; - Length numberOfVisualCharacters = 0; + CharacterIndex visualIndex = startCharacter; + Length numberOfVisualCharacters = 0; + float calculatedAdvance = 0.f; + Vector& glyphToCharacterMap = visualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); for(; visualIndex < endCharacter; ++visualIndex) { // The character in logical order. @@ -283,11 +287,13 @@ CharacterIndex GetClosestCursorIndex(VisualModelPtr visualModel, // Get the metrics for the group of glyphs. GlyphMetrics glyphMetrics; + calculatedAdvance = GetCalculatedAdvance(*(logicalModel->mText.Begin() + (*(glyphToCharacterMapBuffer + firstLogicalGlyphIndex))), characterSpacing, (*(visualModel->mGlyphs.Begin() + firstLogicalGlyphIndex)).advance); GetGlyphsMetrics(firstLogicalGlyphIndex, numberOfGlyphs, glyphMetrics, glyphInfoBuffer, - metrics); + metrics, + calculatedAdvance); // Get the position of the first glyph. const Vector2& position = *(positionsBuffer + firstLogicalGlyphIndex); @@ -480,14 +486,11 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, const LineIndex lineIndex = parameters.visualModel->GetLineOfCharacter(characterOfLine); const LineRun& line = *(modelLines + lineIndex); - const GlyphIndex* const charactersToGlyphBuffer = parameters.visualModel->mCharactersToGlyph.Begin(); - const Length* const glyphsPerCharacterBuffer = parameters.visualModel->mGlyphsPerCharacter.Begin(); - const GlyphInfo* const glyphInfoBuffer = parameters.visualModel->mGlyphs.Begin(); - CharacterIndex index; - GlyphMetrics glyphMetrics; - MetricsPtr& metrics = parameters.metrics; - GlyphIndex glyphIndex = 0u; - Length numberOfGlyphs = 0u; + CharacterIndex index; + GlyphMetrics glyphMetrics; + MetricsPtr& metrics = parameters.metrics; + GlyphIndex glyphIndex = 0u; + Length numberOfGlyphs = 0u; if(isLastNewParagraph) { @@ -510,7 +513,7 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, index = totalNumberOfCharacters - 1u; } - GetGlyphMetricsFromCharacterIndex(index, glyphInfoBuffer, charactersToGlyphBuffer, glyphsPerCharacterBuffer, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + GetGlyphMetricsFromCharacterIndex(index, parameters.visualModel, parameters.logicalModel, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); // Set the primary cursor's height. // The primary cursor height will take the font height of the last character and if there are no characters, it'll take the default font line height. @@ -597,8 +600,12 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, const Length* const charactersPerGlyphBuffer = parameters.visualModel->mCharactersPerGlyph.Begin(); const CharacterIndex* const glyphsToCharactersBuffer = parameters.visualModel->mGlyphsToCharacters.Begin(); const Vector2* const glyphPositionsBuffer = parameters.visualModel->mGlyphPositions.Begin(); + const float characterSpacing = parameters.visualModel->GetCharacterSpacing(); - GetGlyphMetricsFromCharacterIndex(index, glyphInfoBuffer, charactersToGlyphBuffer, glyphsPerCharacterBuffer, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + // Get the metrics for the group of glyphs. + GetGlyphMetricsFromCharacterIndex(index, parameters.visualModel, parameters.logicalModel, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + + // Convert the cursor position into the glyph position. const GlyphIndex primaryGlyphIndex = glyphIndex; const Length primaryNumberOfCharacters = *(charactersPerGlyphBuffer + primaryGlyphIndex); @@ -636,7 +643,7 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, (isFirstPositionOfLine && isRightToLeftParagraph) || (!isFirstPositionOfLine && !isLastPosition && !isCurrentRightToLeft)); - float glyphAdvance = addGlyphAdvance ? glyphMetrics.advance : 0.f; + float glyphAdvance = addGlyphAdvance ? (glyphMetrics.advance) : 0.f; if(!isLastPositionOfLine && (primaryNumberOfCharacters > 1u)) @@ -655,7 +662,7 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, numberOfGlyphAdvance = primaryNumberOfCharacters - numberOfGlyphAdvance; } - glyphAdvance = static_cast(numberOfGlyphAdvance) * glyphMetrics.advance / static_cast(primaryNumberOfCharacters); + glyphAdvance = static_cast(numberOfGlyphAdvance) * (glyphMetrics.advance) / static_cast(primaryNumberOfCharacters); } // Get the glyph position and x bearing (in the line's coords). @@ -684,7 +691,8 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, index = (isRightToLeftParagraph == isCurrentRightToLeft) ? nextCharacterIndex : characterIndex; } - GetGlyphMetricsFromCharacterIndex(index, glyphInfoBuffer, charactersToGlyphBuffer, glyphsPerCharacterBuffer, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + GetGlyphMetricsFromCharacterIndex(index, parameters.visualModel, parameters.logicalModel, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + const GlyphIndex secondaryGlyphIndex = glyphIndex; const Vector2& secondaryPosition = *(glyphPositionsBuffer + secondaryGlyphIndex); @@ -709,7 +717,7 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, const bool addGlyphAdvance = ((!isFirstPositionOfLine && !isCurrentRightToLeft) || (isFirstPositionOfLine && !isRightToLeftParagraph)); - cursorInfo.secondaryPosition.x = -glyphMetrics.xBearing + secondaryPosition.x + (addGlyphAdvance ? glyphMetrics.advance : 0.f); + cursorInfo.secondaryPosition.x = -glyphMetrics.xBearing + secondaryPosition.x + (addGlyphAdvance ? (glyphMetrics.advance + characterSpacing) : 0.f); cursorInfo.secondaryPosition.y = cursorInfo.lineOffset + cursorInfo.lineHeight - cursorInfo.secondaryCursorHeight; // Transform the cursor info from line's coords to text's coords. diff --git a/dali-toolkit/internal/text/glyph-metrics-helper.cpp b/dali-toolkit/internal/text/glyph-metrics-helper.cpp index f87555e..01c62c7 100644 --- a/dali-toolkit/internal/text/glyph-metrics-helper.cpp +++ b/dali-toolkit/internal/text/glyph-metrics-helper.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -50,7 +50,8 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, Length numberOfGlyphs, GlyphMetrics& glyphMetrics, const GlyphInfo* const glyphsBuffer, - MetricsPtr& metrics) + MetricsPtr& metrics, + float calculatedAdvance) { const GlyphInfo& firstGlyph = *(glyphsBuffer + glyphIndex); @@ -72,7 +73,7 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, glyphMetrics.fontId = firstGlyph.fontId; glyphMetrics.fontHeight = fontMetrics.height; glyphMetrics.width = firstGlyph.width; - glyphMetrics.advance = firstGlyph.advance; + glyphMetrics.advance = calculatedAdvance; glyphMetrics.ascender = fontMetrics.ascender; glyphMetrics.xBearing = firstGlyph.xBearing; @@ -91,7 +92,7 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, const float currentMaxGlyphWidthEdge = glyphMetrics.advance + glyphInfo.xBearing + glyphInfo.width; maxWidthEdge = std::max(maxWidthEdge, currentMaxGlyphWidthEdge); - glyphMetrics.advance += glyphInfo.advance; + glyphMetrics.advance += (glyphInfo.advance); } glyphMetrics.width = maxWidthEdge - glyphMetrics.xBearing; @@ -100,18 +101,47 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, glyphMetrics.width += (firstGlyph.isItalicRequired && !isItalicFont) ? TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE * firstGlyph.height : 0.f; } -void GetGlyphMetricsFromCharacterIndex(CharacterIndex index, const GlyphInfo* const glyphInfoBuffer, const GlyphIndex* const charactersToGlyphBuffer, const Length* const glyphsPerCharacterBuffer, MetricsPtr& metrics, GlyphMetrics& glyphMetrics, GlyphIndex& glyphIndex, Length& numberOfGlyphs) +void GetGlyphMetricsFromCharacterIndex(CharacterIndex index, + const VisualModelPtr& visualModel, + const LogicalModelPtr& logicalModel, + MetricsPtr& metrics, + GlyphMetrics& glyphMetrics, + GlyphIndex& glyphIndex, + Length& numberOfGlyphs) { + const GlyphIndex* const charactersToGlyphBuffer = visualModel->mCharactersToGlyph.Begin(); + const Length* const glyphsPerCharacterBuffer = visualModel->mGlyphsPerCharacter.Begin(); + const GlyphInfo* const glyphInfoBuffer = visualModel->mGlyphs.Begin(); + Vector& glyphToCharacterMap = visualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); + const float characterSpacing = visualModel->GetCharacterSpacing(); + //Takes the character index, obtains the glyph index (and the number of Glyphs) from it and finally gets the glyph metrics. glyphIndex = *(charactersToGlyphBuffer + index); numberOfGlyphs = *(glyphsPerCharacterBuffer + index); + float calculatedAdvance = 0.f; + + calculatedAdvance = GetCalculatedAdvance(*(logicalModel->mText.Begin() + (*(glyphToCharacterMapBuffer + glyphIndex))), characterSpacing, (*(visualModel->mGlyphs.Begin() + glyphIndex)).advance); + // Get the metrics for the group of glyphs. GetGlyphsMetrics(glyphIndex, numberOfGlyphs, glyphMetrics, glyphInfoBuffer, - metrics); + metrics, + calculatedAdvance); +} + +float GetCalculatedAdvance(unsigned int character, float characterSpacing, float advance) +{ + //Gets the final advance value by adding the CharacterSpacing value to it + //In some cases the CharacterSpacing should not be added. Ex: when the glyph is a ZWSP (Zero Width Space) + return (TextAbstraction::IsZeroWidthNonJoiner(character) || TextAbstraction::IsZeroWidthJoiner(character) || + TextAbstraction::IsZeroWidthSpace(character) || TextAbstraction::IsNewParagraph(character) || + TextAbstraction::IsLeftToRightMark(character) || TextAbstraction::IsRightToLeftMark(character)) + ? advance + : advance + characterSpacing; } } // namespace Text diff --git a/dali-toolkit/internal/text/glyph-metrics-helper.h b/dali-toolkit/internal/text/glyph-metrics-helper.h index dac57f0..0c996db 100644 --- a/dali-toolkit/internal/text/glyph-metrics-helper.h +++ b/dali-toolkit/internal/text/glyph-metrics-helper.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_TEXT_GLYPH_METRICS_HELPER_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,9 @@ */ // INTERNAL INCLUDES +#include #include +#include namespace Dali { @@ -76,34 +78,46 @@ Length GetNumberOfGlyphsOfGroup(GlyphIndex glyphIndex, * @param[out] glyphMetrics Some glyph metrics (font height, advance, ascender and x bearing). * @param[in] glyphsBuffer The glyphs buffer. * @param[in] metrics Used to access metrics from FontClient. + * @param[in] calculatedAdvance The final advance value obtained by adding the CharacterSpacing value to the original advance. In some cases the CharacterSpacing should not be added. Ex: when the glyph is a ZWSP (Zero Width Space) */ void GetGlyphsMetrics(GlyphIndex glyphIndex, Length numberOfGlyphs, GlyphMetrics& glyphMetrics, const GlyphInfo* const glyphsBuffer, - MetricsPtr& metrics); + MetricsPtr& metrics, + float calculatedAdvance); + +/** + * @brief Gets the final advance value by adding the CharacterSpacing value to it + *In some cases the CharacterSpacing should not be added. Ex: when the glyph is a ZWSP (Zero Width Space) + * + * @param[in] character The character of which the advance is to be calculated. + * @param[in] characterSpacing The character spacing to be added to the advance. + * @param[in] advance The original advance. + * + * @return The calculated advance + */ +float GetCalculatedAdvance(unsigned int character, float characterSpacing, float advance); /** * @brief Takes the character index, obtains the glyph index (and the number of Glyphs) from it and finally gets the glyph metrics. * * @param[in] index The character index. - * @param[in] glyphInfoBuffer The glyphs buffer. - * @param[in] charactersToGlyphBuffer A vector containing the glyph index for each character. - * @param[in] glyphsPerCharacterBuffer A vector containing the number of glyphs in each character. + * @param[in] visualModel The visual model. + * @param[in] logicalModel The logical model. * @param[in] metrics Used to access metrics from FontClient. * @param[out] glyphMetrics Some glyph metrics (font height, advance, ascender and x bearing). * @param[out] glyphIndex The glyph index obtained from the character index. * @param[out] numberOfGlyphs The number of glyphs in the character of which the index was passed to the function. * */ -void GetGlyphMetricsFromCharacterIndex(CharacterIndex index, - const GlyphInfo* const glyphInfoBuffer, - const GlyphIndex* const charactersToGlyphBuffer, - const Length* const glyphsPerCharacterBuffer, - MetricsPtr& metrics, - GlyphMetrics& glyphMetrics, - GlyphIndex& glyphIndex, - Length& numberOfGlyphs); +void GetGlyphMetricsFromCharacterIndex(CharacterIndex index, + const VisualModelPtr& visualModel, + const LogicalModelPtr& logicalModel, + MetricsPtr& metrics, + GlyphMetrics& glyphMetrics, + GlyphIndex& glyphIndex, + Length& numberOfGlyphs); } // namespace Text diff --git a/dali-toolkit/internal/text/layouts/layout-engine-helper-functions.cpp b/dali-toolkit/internal/text/layouts/layout-engine-helper-functions.cpp new file mode 100644 index 0000000..85676cf --- /dev/null +++ b/dali-toolkit/internal/text/layouts/layout-engine-helper-functions.cpp @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// FILE HEADER +#include + +// INTERNAL INCLUDE +#include + +namespace Dali +{ +namespace Toolkit +{ +namespace Text +{ +namespace Layout +{ +void CalculateGlyphPositionsLTR(const VisualModelPtr& visualModel, + const LogicalModelPtr& logicalModel, + const float interGlyphExtraAdvance, + const Length numberOfGlyphs, + const GlyphIndex startIndexForGlyph, + const GlyphIndex startIndexForGlyphPositions, + Vector2* glyphPositionsBuffer, + float& penX) +{ + const GlyphInfo* const glyphsBuffer = visualModel->mGlyphs.Begin(); + const float characterSpacing = visualModel->GetCharacterSpacing(); + const Character* const textBuffer = logicalModel->mText.Begin(); + + Vector& glyphToCharacterMap = visualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); + + float calculatedAdvance = 0.f; + + for(GlyphIndex i = 0u; i < numberOfGlyphs; ++i) + { + const GlyphInfo& glyph = *(glyphsBuffer + startIndexForGlyph + i); + Vector2& position = *(glyphPositionsBuffer + startIndexForGlyphPositions + i); + + position.x = penX + glyph.xBearing; + position.y = -glyph.yBearing; + + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + (startIndexForGlyph + i)))), characterSpacing, glyph.advance); + penX += (calculatedAdvance + interGlyphExtraAdvance); + } +} + +void CalculateGlyphPositionsRTL(const VisualModelPtr& visualModel, + const LogicalModelPtr& logicalModel, + const BidirectionalLineRunIndex& bidiLineIndex, + const GlyphIndex& startGlyphIndex, + Vector2* glyphPositionsBuffer, + CharacterIndex& characterVisualIndex, + CharacterIndex& characterLogicalIndex, + float& penX) +{ + const Character* const textBuffer = logicalModel->mText.Begin(); + const BidirectionalLineInfoRun& bidiLine = logicalModel->mBidirectionalLineInfo[bidiLineIndex]; + const GlyphInfo* const glyphsBuffer = visualModel->mGlyphs.Begin(); + const GlyphIndex* const charactersToGlyphsBuffer = visualModel->mCharactersToGlyph.Begin(); + const float characterSpacing = visualModel->GetCharacterSpacing(); + + float calculatedAdvance = 0.f; + + while(TextAbstraction::IsWhiteSpace(*(textBuffer + characterVisualIndex))) + { + const GlyphIndex glyphIndex = *(charactersToGlyphsBuffer + characterVisualIndex); + const GlyphInfo& glyph = *(glyphsBuffer + glyphIndex); + + Vector2& position = *(glyphPositionsBuffer + glyphIndex - startGlyphIndex); + position.x = penX; + position.y = -glyph.yBearing; + + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + characterVisualIndex), characterSpacing, glyph.advance); + penX += calculatedAdvance; + + ++characterLogicalIndex; + characterVisualIndex = bidiLine.characterRun.characterIndex + *(bidiLine.visualToLogicalMap + characterLogicalIndex); + } +} + +void TraversesCharactersForGlyphPositionsRTL(const VisualModelPtr& visualModel, + const Character* const textBuffer, + const GlyphIndex& startGlyphIndex, + const float interGlyphExtraAdvance, + const CharacterRun& bidiLineCharacterRun, + CharacterIndex* bidiLineVisualToLogicalMap, + Vector2* glyphPositionsBuffer, + CharacterIndex& characterLogicalIndex, + float& penX) +{ + const GlyphInfo* const glyphsBuffer = visualModel->mGlyphs.Begin(); + const GlyphIndex* const charactersToGlyphsBuffer = visualModel->mCharactersToGlyph.Begin(); + const float characterSpacing = visualModel->GetCharacterSpacing(); + const Length* const glyphsPerCharacterBuffer = visualModel->mGlyphsPerCharacter.Begin(); + + float calculatedAdvance = 0.f; + + for(; characterLogicalIndex < bidiLineCharacterRun.numberOfCharacters; + ++characterLogicalIndex) + { + // Convert the character in the logical order into the character in the visual order. + const CharacterIndex characterVisualIndex = bidiLineCharacterRun.characterIndex + *(bidiLineVisualToLogicalMap + characterLogicalIndex); + + // Get the number of glyphs of the character. + const Length numberOfGlyphs = *(glyphsPerCharacterBuffer + characterVisualIndex); + + for(GlyphIndex index = 0u; index < numberOfGlyphs; ++index) + { + // Convert the character in the visual order into the glyph in the visual order. + const GlyphIndex glyphIndex = *(charactersToGlyphsBuffer + characterVisualIndex) + index; + + DALI_ASSERT_DEBUG(glyphIndex < visualModel->mGlyphs.Count()); + + const GlyphInfo& glyph = *(glyphsBuffer + glyphIndex); + Vector2& position = *(glyphPositionsBuffer + glyphIndex - startGlyphIndex); + + position.x = penX + glyph.xBearing; + position.y = -glyph.yBearing; + + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + characterVisualIndex), characterSpacing, glyph.advance); + penX += (calculatedAdvance + interGlyphExtraAdvance); + } + } +} + +} // namespace Layout + +} // namespace Text + +} // namespace Toolkit + +} // namespace Dali diff --git a/dali-toolkit/internal/text/layouts/layout-engine-helper-functions.h b/dali-toolkit/internal/text/layouts/layout-engine-helper-functions.h new file mode 100644 index 0000000..0d0e362 --- /dev/null +++ b/dali-toolkit/internal/text/layouts/layout-engine-helper-functions.h @@ -0,0 +1,106 @@ +#ifndef DALI_TOOLKIT_TEXT_LAYOUT_ENGINE_HELPER_FUNCTIONS_H +#define DALI_TOOLKIT_TEXT_LAYOUT_ENGINE_HELPER_FUNCTIONS_H + +/* + * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// INTERNAL INCLUDE +#include +#include + +namespace Dali +{ +namespace Toolkit +{ +namespace Text +{ +namespace Layout +{ +/** + * @brief Calculate glyph positions when set glyph positions for left to right. + * + * @param[in] visualModel The visual model. + * @param[in] logicalModel The logical model. + * @param[in] interGlyphExtraAdvance Extra advance added to each glyph. + * @param[in] numberOfGlyphs The number of glyphs. + * @param[in] startIndexForGlyph The index of the first glyph in the line. + * @param[in] startIndexForGlyphPositions The index of the first glyph for GlyphPositions. + * @param[in,out] glyphPositionsBuffer The glyph positions buffer. + * @param[in,out] penX The current position for the horizontal pen. + */ +void CalculateGlyphPositionsLTR(const VisualModelPtr& visualModel, + const LogicalModelPtr& logicalModel, + const float interGlyphExtraAdvance, + const Length numberOfGlyphs, + const GlyphIndex startIndexForGlyph, + const GlyphIndex startIndexForGlyphPositions, + Vector2* glyphPositionsBuffer, + float& penX); + +/** + * @brief Calculate glyph positions when set glyph positions for right to left. + * + * @param[in] visualModel The visual model. + * @param[in] logicalModel The logical model. + * @param[in] bidiLineIndex Index to the line's bidirectional info. + * @param[in] startGlyphIndex The index of the first glyph in the line. + * @param[in,out] glyphPositionsBuffer The glyph positions buffer. + * @param[in] characterVisualIndex The character visual index. + * @param[in] characterLogicalIndex The character logical index. + * @param[in,out] penX The current position for the horizontal pen. + */ +void CalculateGlyphPositionsRTL(const VisualModelPtr& visualModel, + const LogicalModelPtr& logicalModel, + const BidirectionalLineRunIndex& bidiLineIndex, + const GlyphIndex& startGlyphIndex, + Vector2* glyphPositionsBuffer, + CharacterIndex& characterVisualIndex, + CharacterIndex& characterLogicalIndex, + float& penX); + +/** + * @brief Calculate glyph positions when set glyph positions for right to left. + * + * @param[in] visualModel The visual model. + * @param[in] textBuffer The text buffer. + * @param[in] startGlyphIndex The index of the first glyph in the line. + * @param[in] interGlyphExtraAdvance Extra advance added to each glyph. + * @param[in] bidiLineCharacterRun The initial character index within the whole text and the number of characters of the run for BidirectionalLine. + * @param[in] bidiLineVisualToLogicalMap Pointer to the visual to logical map table for BidirectionalLine. + * @param[in,out] glyphPositionsBuffer The glyph positions buffer. + * @param[in,out] characterLogicalIndex The character logical index. + * @param[in,out] penX The current position for the horizontal pen. + */ +void TraversesCharactersForGlyphPositionsRTL(const VisualModelPtr& visualModel, + const Character* const textBuffer, + const GlyphIndex& startGlyphIndex, + const float interGlyphExtraAdvance, + const CharacterRun& bidiLineCharacterRun, + CharacterIndex* bidiLineVisualToLogicalMap, + Vector2* glyphPositionsBuffer, + CharacterIndex& characterLogicalIndex, + float& penX); + +} // namespace Layout + +} // namespace Text + +} // namespace Toolkit + +} // namespace Dali + +#endif // DALI_TOOLKIT_TEXT_LAYOUT_ENGINE_HELPER_FUNCTIONS_H \ No newline at end of file diff --git a/dali-toolkit/internal/text/layouts/layout-engine.cpp b/dali-toolkit/internal/text/layouts/layout-engine.cpp index 7610b67..c8addcc 100644 --- a/dali-toolkit/internal/text/layouts/layout-engine.cpp +++ b/dali-toolkit/internal/text/layouts/layout-engine.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,6 +28,7 @@ #include #include #include +#include #include namespace Dali @@ -42,6 +43,7 @@ float GetLineHeight(const LineRun lineRun) // However, the line descender has a negative value, hence the subtraction. return lineRun.ascender - lineRun.descender + lineRun.lineSpacing; } + namespace Layout { namespace @@ -250,10 +252,13 @@ struct Engine::Impl const float outlineWidth = static_cast(parameters.textModel->GetOutlineWidth()); const GlyphIndex lastGlyphOfParagraphPlusOne = parameters.startGlyphIndex + parameters.numberOfGlyphs; + const float characterSpacing = parameters.textModel->mVisualModel->GetCharacterSpacing(); CharacterIndex characterLogicalIndex = 0u; CharacterIndex characterVisualIndex = 0u; + float calculatedAdvance = 0.f; + // If there are characters in the second half of Line then the first visual index mapped from visualToLogicalMapSecondHalf // Otherwise maps the first visual index from visualToLogicalMap. // This is to initialize the first visual index. @@ -278,7 +283,8 @@ struct Engine::Impl { const GlyphInfo& glyphInfo = *(glyphsBuffer + *(charactersToGlyphsBuffer + characterVisualIndex)); - whiteSpaceLengthEndOfLine += glyphInfo.advance; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + characterVisualIndex), characterSpacing, glyphInfo.advance); + whiteSpaceLengthEndOfLine += calculatedAdvance; ++characterLogicalIndex; characterVisualIndex = bidirectionalLineInfo.characterRunForSecondHalfLine.characterIndex + *(bidirectionalLineInfo.visualToLogicalMapSecondHalf + characterLogicalIndex); @@ -299,7 +305,8 @@ struct Engine::Impl { const GlyphInfo& glyphInfo = *(glyphsBuffer + *(charactersToGlyphsBuffer + characterVisualIndex)); - whiteSpaceLengthEndOfLine += glyphInfo.advance; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + characterVisualIndex), characterSpacing, glyphInfo.advance); + whiteSpaceLengthEndOfLine += calculatedAdvance; ++characterLogicalIndex; characterVisualIndex = bidirectionalLineInfo.characterRun.characterIndex + *(bidirectionalLineInfo.visualToLogicalMap + characterLogicalIndex); @@ -316,11 +323,13 @@ struct Engine::Impl charactersPerGlyphBuffer); GlyphMetrics glyphMetrics; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + characterVisualIndex), characterSpacing, (*(glyphsBuffer + glyphIndex)).advance); GetGlyphsMetrics(glyphIndex, numberOfGLyphsInGroup, glyphMetrics, glyphsBuffer, - mMetrics); + mMetrics, + calculatedAdvance); float penX = -glyphMetrics.xBearing + mCursorWidth + outlineWidth; @@ -345,11 +354,13 @@ struct Engine::Impl characterLogicalIndex += *(charactersPerGlyphBuffer + glyphIndex + numberOfGLyphsInGroup - 1u); GlyphMetrics glyphMetrics; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + characterVisualIndex), characterSpacing, (*(glyphsBuffer + glyphIndex)).advance); GetGlyphsMetrics(glyphIndex, numberOfGLyphsInGroup, glyphMetrics, glyphsBuffer, - mMetrics); + mMetrics, + calculatedAdvance); if(isWhiteSpace) { @@ -405,11 +416,13 @@ struct Engine::Impl characterLogicalIndex += *(charactersPerGlyphBuffer + glyphIndex + numberOfGLyphsInGroup - 1u); GlyphMetrics glyphMetrics; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + characterVisualIndex), characterSpacing, (*(glyphsBuffer + glyphIndex)).advance); GetGlyphsMetrics(glyphIndex, numberOfGLyphsInGroup, glyphMetrics, glyphsBuffer, - mMetrics); + mMetrics, + calculatedAdvance); if(isWhiteSpace) { @@ -639,13 +652,20 @@ struct Engine::Impl float widthFirstHalf = ((ellipsisPosition != DevelText::EllipsisPosition::MIDDLE) ? targetWidth : targetWidth - std::floor(targetWidth / 2)); bool isSecondHalf = false; + // Character Spacing + const float characterSpacing = parameters.textModel->mVisualModel->GetCharacterSpacing(); + float calculatedAdvance = 0.f; + Vector& glyphToCharacterMap = parameters.textModel->mVisualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); GlyphMetrics glyphMetrics; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + lineLayout.glyphIndex))), characterSpacing, (*(glyphsBuffer + lineLayout.glyphIndex)).advance); GetGlyphsMetrics(lineLayout.glyphIndex, numberOfGLyphsInGroup, glyphMetrics, glyphsBuffer, - mMetrics); + mMetrics, + calculatedAdvance); // Set the direction of the first character of the line. lineLayout.characterIndex = *(glyphsToCharactersBuffer + lineLayout.glyphIndex); @@ -680,11 +700,13 @@ struct Engine::Impl charactersPerGlyphBuffer); GlyphMetrics glyphMetrics; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + glyphIndex))), characterSpacing, (*(glyphsBuffer + glyphIndex)).advance); GetGlyphsMetrics(glyphIndex, numberOfGLyphsInGroup, glyphMetrics, glyphsBuffer, - mMetrics); + mMetrics, + calculatedAdvance); const bool isLastGlyph = glyphIndex + numberOfGLyphsInGroup == totalNumberOfGlyphs; @@ -739,7 +761,8 @@ struct Engine::Impl if(isWhiteSpace) { // Add the length to the length of white spaces at the end of the line. - tmpLineLayout.whiteSpaceLengthEndOfLine += glyphMetrics.advance; // The advance is used as the width is always zero for the white spaces. + tmpLineLayout.whiteSpaceLengthEndOfLine += glyphMetrics.advance; + // The advance is used as the width is always zero for the white spaces. } else { @@ -777,11 +800,13 @@ struct Engine::Impl while(tmpLineLayout.length + tmpLineLayout.whiteSpaceLengthEndOfLine > targetWidth && glyphIndexToRemove < glyphIndex) { GlyphMetrics glyphMetrics; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + glyphIndexToRemove))), characterSpacing, (*(glyphsBuffer + glyphIndexToRemove)).advance); GetGlyphsMetrics(glyphIndexToRemove, numberOfGLyphsInGroup, glyphMetrics, glyphsBuffer, - mMetrics); + mMetrics, + calculatedAdvance); const Length numberOfGLyphsInGroup = GetNumberOfGlyphsOfGroup(glyphIndexToRemove, lastGlyphOfParagraphPlusOne, @@ -1008,16 +1033,14 @@ struct Engine::Impl const GlyphInfo& glyph = *(glyphsBuffer + startIndexForGlyph); float penX = -glyph.xBearing + mCursorWidth + outlineWidth; // - for(GlyphIndex i = 0u; i < numberOfGlyphs; ++i) - { - const GlyphInfo& glyph = *(glyphsBuffer + startIndexForGlyph + i); - Vector2& position = *(glyphPositionsBuffer + startIndexForGlyphPositions + i); - - position.x = penX + glyph.xBearing; - position.y = -glyph.yBearing; - - penX += (glyph.advance + interGlyphExtraAdvance); - } + CalculateGlyphPositionsLTR(layoutParameters.textModel->mVisualModel, + layoutParameters.textModel->mLogicalModel, + interGlyphExtraAdvance, + numberOfGlyphs, + startIndexForGlyph, // startIndexForGlyph is the index of the first glyph in the line + startIndexForGlyphPositions, + glyphPositionsBuffer, + penX); if(layout.isSplitToTwoHalves) { @@ -1025,16 +1048,14 @@ struct Engine::Impl const Length numberOfGlyphsInSecondHalfLine = layout.numberOfGlyphsInSecondHalfLine; const GlyphIndex startIndexForGlyphPositionsnSecondHalf = layout.glyphIndexInSecondHalfLine - layoutParameters.startGlyphIndex; - for(GlyphIndex i = 0u; i < numberOfGlyphsInSecondHalfLine; ++i) - { - const GlyphInfo& glyph = *(glyphsBuffer + startIndexForGlyphInSecondHalf + i); - Vector2& position = *(glyphPositionsBuffer + startIndexForGlyphPositionsnSecondHalf + i); - - position.x = penX + glyph.xBearing; - position.y = -glyph.yBearing; - - penX += (glyph.advance + interGlyphExtraAdvance); - } + CalculateGlyphPositionsLTR(layoutParameters.textModel->mVisualModel, + layoutParameters.textModel->mLogicalModel, + interGlyphExtraAdvance, + numberOfGlyphsInSecondHalfLine, + startIndexForGlyphInSecondHalf, // startIndexForGlyph is the index of the first glyph in the line + startIndexForGlyphPositionsnSecondHalf, + glyphPositionsBuffer, + penX); } } @@ -1043,11 +1064,9 @@ struct Engine::Impl LayoutBidiParameters& layoutBidiParameters, const LineLayout& layout) { - const Character* const textBuffer = layoutParameters.textModel->mLogicalModel->mText.Begin(); const BidirectionalLineInfoRun& bidiLine = layoutParameters.textModel->mLogicalModel->mBidirectionalLineInfo[layoutBidiParameters.bidiLineIndex]; const GlyphInfo* const glyphsBuffer = layoutParameters.textModel->mVisualModel->mGlyphs.Begin(); const GlyphIndex* const charactersToGlyphsBuffer = layoutParameters.textModel->mVisualModel->mCharactersToGlyph.Begin(); - const Length* const glyphsPerCharacterBuffer = layoutParameters.textModel->mVisualModel->mGlyphsPerCharacter.Begin(); CharacterIndex characterLogicalIndex = 0u; CharacterIndex characterVisualIndex = bidiLine.characterRunForSecondHalfLine.characterIndex + *(bidiLine.visualToLogicalMapSecondHalf + characterLogicalIndex); @@ -1057,20 +1076,14 @@ struct Engine::Impl if(layout.isSplitToTwoHalves) { - while(TextAbstraction::IsWhiteSpace(*(textBuffer + characterVisualIndex))) - { - const GlyphIndex glyphIndex = *(charactersToGlyphsBuffer + characterVisualIndex); - const GlyphInfo& glyph = *(glyphsBuffer + glyphIndex); - - Vector2& position = *(glyphPositionsBuffer + glyphIndex - layoutParameters.startGlyphIndex); - position.x = penX; - position.y = -glyph.yBearing; - - penX += glyph.advance; - - ++characterLogicalIndex; - characterVisualIndex = bidiLine.characterRun.characterIndex + *(bidiLine.visualToLogicalMap + characterLogicalIndex); - } + CalculateGlyphPositionsRTL(layoutParameters.textModel->mVisualModel, + layoutParameters.textModel->mLogicalModel, + layoutBidiParameters.bidiLineIndex, + layoutParameters.startGlyphIndex, + glyphPositionsBuffer, + characterVisualIndex, + characterLogicalIndex, + penX); } if(characterLogicalIndex == bidiLine.characterRunForSecondHalfLine.numberOfCharacters) @@ -1079,20 +1092,14 @@ struct Engine::Impl characterLogicalIndex = 0u; characterVisualIndex = bidiLine.characterRun.characterIndex + *(bidiLine.visualToLogicalMap + characterLogicalIndex); - while(TextAbstraction::IsWhiteSpace(*(textBuffer + characterVisualIndex))) - { - const GlyphIndex glyphIndex = *(charactersToGlyphsBuffer + characterVisualIndex); - const GlyphInfo& glyph = *(glyphsBuffer + glyphIndex); - - Vector2& position = *(glyphPositionsBuffer + glyphIndex - layoutParameters.startGlyphIndex); - position.x = penX; - position.y = -glyph.yBearing; - - penX += glyph.advance; - - ++characterLogicalIndex; - characterVisualIndex = bidiLine.characterRun.characterIndex + *(bidiLine.visualToLogicalMap + characterLogicalIndex); - } + CalculateGlyphPositionsRTL(layoutParameters.textModel->mVisualModel, + layoutParameters.textModel->mLogicalModel, + layoutBidiParameters.bidiLineIndex, + layoutParameters.startGlyphIndex, + glyphPositionsBuffer, + characterVisualIndex, + characterLogicalIndex, + penX); } const GlyphIndex glyphIndex = *(charactersToGlyphsBuffer + characterVisualIndex); @@ -1103,59 +1110,28 @@ struct Engine::Impl // Traverses the characters of the right to left paragraph. if(layout.isSplitToTwoHalves && !extendedToSecondHalf) { - for(; characterLogicalIndex < bidiLine.characterRunForSecondHalfLine.numberOfCharacters; - ++characterLogicalIndex) - { - // Convert the character in the logical order into the character in the visual order. - const CharacterIndex characterVisualIndex = bidiLine.characterRunForSecondHalfLine.characterIndex + *(bidiLine.visualToLogicalMapSecondHalf + characterLogicalIndex); - - // Get the number of glyphs of the character. - const Length numberOfGlyphs = *(glyphsPerCharacterBuffer + characterVisualIndex); - - for(GlyphIndex index = 0u; index < numberOfGlyphs; ++index) - { - // Convert the character in the visual order into the glyph in the visual order. - const GlyphIndex glyphIndex = *(charactersToGlyphsBuffer + characterVisualIndex) + index; - - DALI_ASSERT_DEBUG(glyphIndex < layoutParameters.textModel->mVisualModel->mGlyphs.Count()); - - const GlyphInfo& glyph = *(glyphsBuffer + glyphIndex); - Vector2& position = *(glyphPositionsBuffer + glyphIndex - layoutParameters.startGlyphIndex); - - position.x = penX + glyph.xBearing; - position.y = -glyph.yBearing; - - penX += (glyph.advance + layoutParameters.interGlyphExtraAdvance); - } - } + TraversesCharactersForGlyphPositionsRTL(layoutParameters.textModel->mVisualModel, + layoutParameters.textModel->mLogicalModel->mText.Begin(), + layoutParameters.startGlyphIndex, + layoutParameters.interGlyphExtraAdvance, + bidiLine.characterRunForSecondHalfLine, + bidiLine.visualToLogicalMapSecondHalf, + glyphPositionsBuffer, + characterLogicalIndex, + penX); } characterLogicalIndex = extendedToSecondHalf ? characterLogicalIndex : 0u; - for(; characterLogicalIndex < bidiLine.characterRun.numberOfCharacters; - ++characterLogicalIndex) - { - // Convert the character in the logical order into the character in the visual order. - const CharacterIndex characterVisualIndex = bidiLine.characterRun.characterIndex + *(bidiLine.visualToLogicalMap + characterLogicalIndex); - - // Get the number of glyphs of the character. - const Length numberOfGlyphs = *(glyphsPerCharacterBuffer + characterVisualIndex); - - for(GlyphIndex index = 0u; index < numberOfGlyphs; ++index) - { - // Convert the character in the visual order into the glyph in the visual order. - const GlyphIndex glyphIndex = *(charactersToGlyphsBuffer + characterVisualIndex) + index; - DALI_ASSERT_DEBUG(glyphIndex < layoutParameters.textModel->mVisualModel->mGlyphs.Count()); - - const GlyphInfo& glyph = *(glyphsBuffer + glyphIndex); - Vector2& position = *(glyphPositionsBuffer + glyphIndex - layoutParameters.startGlyphIndex); - - position.x = penX + glyph.xBearing; - position.y = -glyph.yBearing; - - penX += (glyph.advance + layoutParameters.interGlyphExtraAdvance); - } - } + TraversesCharactersForGlyphPositionsRTL(layoutParameters.textModel->mVisualModel, + layoutParameters.textModel->mLogicalModel->mText.Begin(), + layoutParameters.startGlyphIndex, + layoutParameters.interGlyphExtraAdvance, + bidiLine.characterRun, + bidiLine.visualToLogicalMap, + glyphPositionsBuffer, + characterLogicalIndex, + penX); } /** diff --git a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp index 206d7f6..9946d49 100644 --- a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp @@ -28,6 +28,7 @@ // INTERNAL INCLUDES #include #include +#include #include #include #include @@ -475,6 +476,7 @@ struct AtlasRenderer::Impl const Vector4& strikethroughColor(view.GetStrikethroughColor()); const float strikethroughHeight = view.GetStrikethroughHeight(); Vector4 currentStrikethroughColor; + const float characterSpacing(view.GetCharacterSpacing()); // Elided text info. Indices according to elided text. const auto startIndexOfGlyphs = view.GetStartIndexOfElidedGlyphs(); @@ -525,8 +527,12 @@ struct AtlasRenderer::Impl uint32_t underlineChunkId = 0u; // give id for each chunk. bool isPreUnderlined = false; // status of underlined for previous glyph. - uint32_t strikethroughChunkId = 0u; // give id for each chunk. - bool isPrevGlyphStrikethrough = false; // status of strikethrough for previous glyph. + uint32_t strikethroughChunkId = 0u; // give id for each chunk. + bool isPrevGlyphStrikethrough = false; // status of strikethrough for previous glyph. + const Character* textBuffer = view.GetTextBuffer(); + float calculatedAdvance = 0.f; + const Vector& glyphToCharacterMap = view.GetGlyphsToCharacters(); + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); //Skip hyphenIndices less than startIndexOfGlyphs or between two middle of elided text if(hyphenIndices) @@ -635,7 +641,8 @@ struct AtlasRenderer::Impl if(addHyphen) { GlyphInfo tempInfo = *(glyphsBuffer + i); - position.x = position.x + tempInfo.advance - tempInfo.xBearing + glyph.xBearing; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + i))), characterSpacing, tempInfo.advance); + position.x = position.x + calculatedAdvance - tempInfo.xBearing + glyph.xBearing; position.y += tempInfo.yBearing - glyph.yBearing; } diff --git a/dali-toolkit/internal/text/rendering/text-typesetter.cpp b/dali-toolkit/internal/text/rendering/text-typesetter.cpp index f7a1123..2e01c18 100644 --- a/dali-toolkit/internal/text/rendering/text-typesetter.cpp +++ b/dali-toolkit/internal/text/rendering/text-typesetter.cpp @@ -25,6 +25,7 @@ // INTERNAL INCLUDES #include +#include #include namespace Dali @@ -939,6 +940,11 @@ Devel::PixelBuffer Typesetter::CreateImageBuffer(const unsigned int bufferWidth, TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); Length hyphenIndex = 0; + const Character* textBuffer = mModel->GetTextBuffer(); + float calculatedAdvance = 0.f; + const Vector& glyphToCharacterMap = mModel->GetGlyphsToCharacters(); + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); + // Traverses the lines of the text. for(LineIndex lineIndex = 0u; lineIndex < modelNumberOfLines; ++lineIndex) { @@ -987,10 +993,10 @@ Devel::PixelBuffer Typesetter::CreateImageBuffer(const unsigned int bufferWidth, const Text::Underline::Type underlineType = mModel->GetUnderlineType(); const float dashedUnderlineWidth = mModel->GetDashedUnderlineWidth(); const float dashedUnderlineGap = mModel->GetDashedUnderlineGap(); - - const bool strikethroughEnabled = mModel->IsStrikethroughEnabled(); - const Vector4& strikethroughColor = mModel->GetStrikethroughColor(); - const float strikethroughHeight = mModel->GetStrikethroughHeight(); + const bool strikethroughEnabled = mModel->IsStrikethroughEnabled(); + const Vector4& strikethroughColor = mModel->GetStrikethroughColor(); + const float strikethroughHeight = mModel->GetStrikethroughHeight(); + const float characterSpacing = mModel->GetCharacterSpacing(); // Get the underline runs. const Length numberOfUnderlineRuns = mModel->GetNumberOfUnderlineRuns(); @@ -1093,7 +1099,8 @@ Devel::PixelBuffer Typesetter::CreateImageBuffer(const unsigned int bufferWidth, if(addHyphen) { GlyphInfo tempInfo = *(glyphsBuffer + elidedGlyphIndex); - position.x = position.x + tempInfo.advance - tempInfo.xBearing + glyphInfo->xBearing; + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + elidedGlyphIndex))), characterSpacing, tempInfo.advance); + position.x = position.x + calculatedAdvance - tempInfo.xBearing + glyphInfo->xBearing; position.y = -glyphInfo->yBearing; } diff --git a/dali-toolkit/internal/text/rendering/view-model.cpp b/dali-toolkit/internal/text/rendering/view-model.cpp index e446294..5e014df 100644 --- a/dali-toolkit/internal/text/rendering/view-model.cpp +++ b/dali-toolkit/internal/text/rendering/view-model.cpp @@ -24,6 +24,7 @@ // INTERNAL INCLUDES #include +#include namespace Dali { @@ -314,13 +315,33 @@ Length ViewModel::GetHyphensCount() const return mModel->GetHyphensCount(); } +const float ViewModel::GetCharacterSpacing() const +{ + return mModel->GetCharacterSpacing(); +} + +const Character* ViewModel::GetTextBuffer() const +{ + return mModel->GetTextBuffer(); +} + +const Vector& ViewModel::GetGlyphsToCharacters() const +{ + return mModel->GetGlyphsToCharacters(); +} + void ViewModel::ElideGlyphs() { mIsTextElided = false; mStartIndexOfElidedGlyphs = mFirstMiddleIndexOfElidedGlyphs = mSecondMiddleIndexOfElidedGlyphs = 0; mEndIndexOfElidedGlyphs = mModel->GetNumberOfGlyphs() - 1u; - auto ellipsisPosition = GetEllipsisPosition(); + auto ellipsisPosition = GetEllipsisPosition(); + auto characterSpacing = GetCharacterSpacing(); + const Character* textBuffer = GetTextBuffer(); + const Vector& glyphToCharacterMap = GetGlyphsToCharacters(); + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); + float calculatedAdvance = 0.f; if(IsTextElideEnabled()) { @@ -484,7 +505,8 @@ void ViewModel::ElideGlyphs() firstPenSet = true; } - removedGlypsWidth += std::min(glyphToRemove.advance, (glyphToRemove.xBearing + glyphToRemove.width)); + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + indexOfEllipsis))), characterSpacing, glyphToRemove.advance); + removedGlypsWidth += std::min(calculatedAdvance, (glyphToRemove.xBearing + glyphToRemove.width)); // Calculate the width of the ellipsis glyph and check if it fits. const float ellipsisGlyphWidth = ellipsisGlyph.width + ellipsisGlyph.xBearing; diff --git a/dali-toolkit/internal/text/rendering/view-model.h b/dali-toolkit/internal/text/rendering/view-model.h index e877baa..c3ee530 100644 --- a/dali-toolkit/internal/text/rendering/view-model.h +++ b/dali-toolkit/internal/text/rendering/view-model.h @@ -276,6 +276,21 @@ public: Length GetHyphensCount() const override; /** + * @copydoc ModelInterface::GetCharacterSpacing() + */ + const float GetCharacterSpacing() const override; + + /** + * @copydoc ModelInterface::GetTextBuffer() + */ + const Character* GetTextBuffer() const override; + + /** + * @copydoc ModelInterface::GetGlyphsToCharacters() + */ + const Vector& GetGlyphsToCharacters() const override; + + /** * @brief Does the text elide at the end, start or middle of text according to ellipsis position * * It stores a copy of the visible glyphs and removes as many glyphs as needed diff --git a/dali-toolkit/internal/text/text-controller-background-actor.cpp b/dali-toolkit/internal/text/text-controller-background-actor.cpp index dda514f..72bfcde 100644 --- a/dali-toolkit/internal/text/text-controller-background-actor.cpp +++ b/dali-toolkit/internal/text/text-controller-background-actor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,11 +24,11 @@ // INTERNAL INCLUDES #include #include +#include #include namespace Dali::Toolkit::Text { - namespace { struct BackgroundVertex @@ -44,7 +44,7 @@ struct BackgroundMesh }; } // unnamed namespace -Actor CreateControllerBackgroundActor(const View& textView, const VisualModelPtr& textVisualModel, Shader& textShaderBackground) +Actor CreateControllerBackgroundActor(const View& textView, const VisualModelPtr& textVisualModel, const LogicalModelPtr& textLogicalModel, Shader& textShaderBackground) { // NOTE: Currently we only support background color for left-to-right text. @@ -63,10 +63,10 @@ Actor CreateControllerBackgroundActor(const View& textView, const VisualModelPtr const LineRun* lineRun = textVisualModel->mLines.Begin(); float alignmentOffset = lineRun->alignmentOffset; numberOfGlyphs = textView.GetGlyphs(glyphs.Begin(), - positions.Begin(), - alignmentOffset, - 0u, - numberOfGlyphs); + positions.Begin(), + alignmentOffset, + 0u, + numberOfGlyphs); glyphs.Resize(numberOfGlyphs); positions.Resize(numberOfGlyphs); @@ -86,6 +86,10 @@ Actor CreateControllerBackgroundActor(const View& textView, const VisualModelPtr const Vector4* const backgroundColorsBuffer = textView.GetBackgroundColors(); const ColorIndex* const backgroundColorIndicesBuffer = textView.GetBackgroundColorIndices(); const Vector4& defaultBackgroundColor = textVisualModel->IsBackgroundEnabled() ? textVisualModel->GetBackgroundColor() : Color::TRANSPARENT; + const float characterSpacing = textVisualModel->GetCharacterSpacing(); + Vector& glyphToCharacterMap = textVisualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); + float calculatedAdvance = 0.f; Vector4 quad; uint32_t numberOfQuads = 0u; @@ -117,33 +121,34 @@ Actor CreateControllerBackgroundActor(const View& textView, const VisualModelPtr if(backgroundColor != Color::TRANSPARENT) { const Vector2 position = *(positionsBuffer + i); + calculatedAdvance = GetCalculatedAdvance(*(textLogicalModel->mText.Begin() + (*(glyphToCharacterMapBuffer + i))), characterSpacing, glyph.advance); if(i == 0u && glyphSize == 1u) // Only one glyph in the whole text { quad.x = position.x; quad.y = yLineOffset; - quad.z = quad.x + std::max(glyph.advance, glyph.xBearing + glyph.width); + quad.z = quad.x + std::max(calculatedAdvance, glyph.xBearing + glyph.width); quad.w = lineHeight; } else if((lineIndex != prevLineIndex) || (i == 0u)) // The first glyph in the line { quad.x = position.x; quad.y = yLineOffset; - quad.z = quad.x - glyph.xBearing + glyph.advance; + quad.z = quad.x - glyph.xBearing + calculatedAdvance; quad.w = quad.y + lineHeight; } else if(i == glyphSize - 1u) // The last glyph in the whole text { quad.x = position.x - glyph.xBearing; quad.y = yLineOffset; - quad.z = quad.x + std::max(glyph.advance, glyph.xBearing + glyph.width); + quad.z = quad.x + std::max(calculatedAdvance, glyph.xBearing + glyph.width); quad.w = quad.y + lineHeight; } else // The glyph in the middle of the text { quad.x = position.x - glyph.xBearing; quad.y = yLineOffset; - quad.z = quad.x + glyph.advance; + quad.z = quad.x + calculatedAdvance; quad.w = quad.y + lineHeight; } diff --git a/dali-toolkit/internal/text/text-controller-background-actor.h b/dali-toolkit/internal/text/text-controller-background-actor.h index 5ad9084..41b549c 100644 --- a/dali-toolkit/internal/text/text-controller-background-actor.h +++ b/dali-toolkit/internal/text/text-controller-background-actor.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_TEXT_CONTROLLER_BACKGROUND_ACTOR_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ #include // INTERNAL INCLUDES +#include #include namespace Dali::Toolkit::Text @@ -32,9 +33,14 @@ class View; /** * @brief Create an actor that renders the text background color * + * @param[in] textView The text view. + * @param[in] textVisualModel The text visual model. + * @param[in] textLogicalModel The text logical model. + * @param[in] textShaderBackground The text shader for background. + * * @return the created actor or an empty handle if no background color needs to be rendered. */ -Actor CreateControllerBackgroundActor(const View& textView, const VisualModelPtr& textVisualModel, Shader& textShaderBackground); +Actor CreateControllerBackgroundActor(const View& textView, const VisualModelPtr& textVisualModel, const LogicalModelPtr& textLogicalModel, Shader& textShaderBackground); } // namespace Dali::Toolkit::Text diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 5ee189b..db6fde1 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -22,11 +22,13 @@ #include #include #include +#include #include // INTERNAL INCLUDES #include #include +#include #include #include #include @@ -691,7 +693,7 @@ bool Controller::Impl::SetDefaultLineSpacing(float lineSpacing) { mLayoutEngine.SetDefaultLineSpacing(lineSpacing); - RelayoutForNewLineSize(); + RelayoutAllCharacters(); return true; } return false; @@ -703,7 +705,7 @@ bool Controller::Impl::SetDefaultLineSize(float lineSize) { mLayoutEngine.SetDefaultLineSize(lineSize); - RelayoutForNewLineSize(); + RelayoutAllCharacters(); return true; } return false; @@ -1461,7 +1463,7 @@ void Controller::Impl::RequestRelayout() } } -void Controller::Impl::RelayoutForNewLineSize() +void Controller::Impl::RelayoutAllCharacters() { // relayout all characters mTextUpdateInfo.mCharacterIndex = 0; diff --git a/dali-toolkit/internal/text/text-controller-impl.h b/dali-toolkit/internal/text/text-controller-impl.h index a646e92..4b1db94 100644 --- a/dali-toolkit/internal/text/text-controller-impl.h +++ b/dali-toolkit/internal/text/text-controller-impl.h @@ -369,6 +369,7 @@ struct Controller::Impl mClipboard = Clipboard::Get(); mView.SetVisualModel(mModel->mVisualModel); + mView.SetLogicalModel(mModel->mLogicalModel); // Use this to access FontClient i.e. to get down-scaled Emoji metrics. mMetrics = Metrics::New(mFontClient); @@ -791,9 +792,16 @@ struct Controller::Impl void ScrollTextToMatchCursor(); /** - * @brief fill needed relayout parameters when line size is changed & request relayout. + * @brief Create an actor that renders the text background color + * + * @return the created actor or an empty handle if no background color needs to be rendered. + */ + Actor CreateBackgroundActor(); + + /** + * @brief fill needed relayout parameters whenever a property is changed and a re-layout is needed for the entire text. */ - void RelayoutForNewLineSize(); + void RelayoutAllCharacters(); /** * @copydoc Controller::IsInputStyleChangedSignalsQueueEmpty diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index f5d1bb7..1e1ab68 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -1340,6 +1340,19 @@ void Controller::SetEllipsisPosition(Toolkit::DevelText::EllipsisPosition::Type mImpl->mModel->mVisualModel->SetEllipsisPosition(ellipsisPosition); } +void Controller::SetCharacterSpacing(float characterSpacing) +{ + mImpl->mModel->mVisualModel->SetCharacterSpacing(characterSpacing); + + mImpl->RelayoutAllCharacters(); + mImpl->RequestRelayout(); +} + +const float Controller::GetCharacterSpacing() const +{ + return mImpl->mModel->mVisualModel->GetCharacterSpacing(); +} + Controller::UpdateTextType Controller::Relayout(const Size& size, Dali::LayoutDirection::Type layoutDirection) { return Relayouter::Relayout(*this, size, layoutDirection); @@ -1597,7 +1610,7 @@ bool Controller::ShouldClearFocusOnEscape() const Actor Controller::CreateBackgroundActor() { - return CreateControllerBackgroundActor(mImpl->mView, mImpl->mModel->mVisualModel, mImpl->mShaderBackground); + return CreateControllerBackgroundActor(mImpl->mView, mImpl->mModel->mVisualModel, mImpl->mModel->mLogicalModel, mImpl->mShaderBackground); } void Controller::GetAnchorActors(std::vector& anchorActors) diff --git a/dali-toolkit/internal/text/text-controller.h b/dali-toolkit/internal/text/text-controller.h index 069db55..4c7a1ad 100644 --- a/dali-toolkit/internal/text/text-controller.h +++ b/dali-toolkit/internal/text/text-controller.h @@ -1468,6 +1468,24 @@ public: // Default style & Input style */ void SetAnchorControlInterface(AnchorControlInterface* anchorControlInterface); + /** + * @brief Sets the character spacing. + * + * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * + * @param[in] characterSpacing The character spacing. + */ + void SetCharacterSpacing(float characterSpacing); + + /** + * @brief Retrieves the character spacing. + * + * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * + * @return The character spacing. + */ + const float GetCharacterSpacing() const; + public: // Queries & retrieves. /** * @brief Return the layout engine. diff --git a/dali-toolkit/internal/text/text-model-interface.h b/dali-toolkit/internal/text/text-model-interface.h index 128f587..7d51b16 100644 --- a/dali-toolkit/internal/text/text-model-interface.h +++ b/dali-toolkit/internal/text/text-model-interface.h @@ -394,6 +394,29 @@ public: * @param[in] numberOfRuns Number of strikethrough runs to be copied. */ virtual void GetStrikethroughRuns(StrikethroughGlyphRun* strikethroughRuns, StrikethroughRunIndex index, Length numberOfRuns) const = 0; + + /** + * @brief Retrieves the character spacing. + * + * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * + * @return The character spacing. + */ + virtual const float GetCharacterSpacing() const = 0; + + /** + * @brief Retrieves the text buffer. + * + * @return The text buffer. + */ + virtual const Character* GetTextBuffer() const = 0; + + /** + * @brief Retrieves the Glyphs to Characters Array. + * + * @return The GlyphsToCharacters. + */ + virtual const Vector& GetGlyphsToCharacters() const = 0; }; } // namespace Text diff --git a/dali-toolkit/internal/text/text-model.cpp b/dali-toolkit/internal/text/text-model.cpp index baa6b91..e19618e 100644 --- a/dali-toolkit/internal/text/text-model.cpp +++ b/dali-toolkit/internal/text/text-model.cpp @@ -281,6 +281,21 @@ void Model::GetStrikethroughRuns(StrikethroughGlyphRun* strikethroughRuns, Strik mVisualModel->GetStrikethroughRuns(strikethroughRuns, index, numberOfRuns); } +const float Model::GetCharacterSpacing() const +{ + return mVisualModel->GetCharacterSpacing(); +} + +const Character* Model::GetTextBuffer() const +{ + return mLogicalModel->mText.Begin(); +} + +const Vector& Model::GetGlyphsToCharacters() const +{ + return mVisualModel->mGlyphsToCharacters; +} + Model::Model() : mLogicalModel(), mVisualModel(), diff --git a/dali-toolkit/internal/text/text-model.h b/dali-toolkit/internal/text/text-model.h index 443f9ab..4f7b9e3 100644 --- a/dali-toolkit/internal/text/text-model.h +++ b/dali-toolkit/internal/text/text-model.h @@ -277,6 +277,20 @@ public: const Vector4& GetStrikethroughColor() const override; bool IsStrikethroughEnabled() const override; + /** + * @copydoc ModelInterface::GetCharacterSpacing() + */ + const float GetCharacterSpacing() const override; + + /** + * @copydoc ModelInterface::GetTextBuffer() + */ + const Character* GetTextBuffer() const override; + + /** + * @copydoc ModelInterface::GetGlyphsToCharacters() + */ + const Vector& GetGlyphsToCharacters() const override; /** * @copydoc ModelInterface::GetNumberOfStrikethroughRuns() diff --git a/dali-toolkit/internal/text/text-selection-handle-controller.cpp b/dali-toolkit/internal/text/text-selection-handle-controller.cpp index cf63deb..8e43a87 100644 --- a/dali-toolkit/internal/text/text-selection-handle-controller.cpp +++ b/dali-toolkit/internal/text/text-selection-handle-controller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ // INTERNAL INCLUDES #include +#include #include using namespace Dali; @@ -103,10 +104,13 @@ void SelectionHandleController::Reposition(Controller::Impl& impl) } // Get the indices to the first and last selected glyphs. - const CharacterIndex selectionEndMinusOne = selectionEnd - 1u; - const GlyphIndex glyphStart = *(charactersToGlyphBuffer + selectionStart); - const Length numberOfGlyphs = *(glyphsPerCharacterBuffer + selectionEndMinusOne); - const GlyphIndex glyphEnd = *(charactersToGlyphBuffer + selectionEndMinusOne) + ((numberOfGlyphs > 0) ? numberOfGlyphs - 1u : 0u); + const CharacterIndex selectionEndMinusOne = selectionEnd - 1u; + const GlyphIndex glyphStart = *(charactersToGlyphBuffer + selectionStart); + const Length numberOfGlyphs = *(glyphsPerCharacterBuffer + selectionEndMinusOne); + const GlyphIndex glyphEnd = *(charactersToGlyphBuffer + selectionEndMinusOne) + ((numberOfGlyphs > 0) ? numberOfGlyphs - 1u : 0u); + const float characterSpacing = visualModel->GetCharacterSpacing(); + Vector& glyphToCharacterMap = visualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); // Get the lines where the glyphs are laid-out. const LineRun* lineRun = visualModel->mLines.Begin(); @@ -163,18 +167,20 @@ void SelectionHandleController::Reposition(Controller::Impl& impl) // Count the actual number of quads. unsigned int actualNumberOfQuads = 0u; Vector4 quad; + float calculatedAdvance = 0.f; // Traverse the glyphs. for(GlyphIndex index = glyphStart; index <= glyphEnd; ++index) { const GlyphInfo& glyph = *(glyphsBuffer + index); const Vector2& position = *(positionsBuffer + index); + calculatedAdvance = GetCalculatedAdvance(*(logicalModel->mText.Begin() + (*(glyphToCharacterMapBuffer + index))), characterSpacing, glyph.advance); if(splitStartGlyph) { // If the first glyph is a ligature that must be broken it may be needed to add only part of the glyph to the highlight box. - const float glyphAdvance = glyph.advance / static_cast(numberOfCharactersStart); + const float glyphAdvance = calculatedAdvance / static_cast(numberOfCharactersStart); const CharacterIndex interGlyphIndex = selectionStart - *(glyphToCharacterBuffer + glyphStart); // Get the direction of the character. CharacterDirection isCurrentRightToLeft = false; @@ -207,7 +213,7 @@ void SelectionHandleController::Reposition(Controller::Impl& impl) { // Equally, if the last glyph is a ligature that must be broken it may be needed to add only part of the glyph to the highlight box. - const float glyphAdvance = glyph.advance / static_cast(numberOfCharactersEnd); + const float glyphAdvance = calculatedAdvance / static_cast(numberOfCharactersEnd); const CharacterIndex interGlyphIndex = selectionEnd - *(glyphToCharacterBuffer + glyphEnd); // Get the direction of the character. CharacterDirection isCurrentRightToLeft = false; @@ -237,7 +243,7 @@ void SelectionHandleController::Reposition(Controller::Impl& impl) quad.x = lineRun->alignmentOffset + position.x - glyph.xBearing + model->mScrollPosition.x; quad.y = selectionBoxInfo->lineOffset; - quad.z = quad.x + glyph.advance; + quad.z = quad.x + calculatedAdvance; quad.w = quad.y + selectionBoxInfo->lineHeight; // Store the min and max 'x' for each line. diff --git a/dali-toolkit/internal/text/text-view-interface.h b/dali-toolkit/internal/text/text-view-interface.h index 67875b8..da6b4e1 100644 --- a/dali-toolkit/internal/text/text-view-interface.h +++ b/dali-toolkit/internal/text/text-view-interface.h @@ -18,6 +18,9 @@ * */ +// EXTERNAL INCLUDES +#include + // INTERNAL INCLUDES #include #include @@ -328,6 +331,29 @@ public: virtual void GetStrikethroughRuns(StrikethroughGlyphRun* strikethroughRuns, StrikethroughRunIndex index, Length numberOfRuns) const = 0; + + /** + * @brief The spaces between characters in Pixels. + * + * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * + * @return characterSpacing. + */ + virtual const float GetCharacterSpacing() const = 0; + + /** + * @brief The text buffer. + * + * @return The text buffer. + */ + virtual const Character* GetTextBuffer() const = 0; + + /** + * @brief The text Glyph to Characters Array. + * + * @return GetGlyphsToCharacters. + */ + virtual const Vector& GetGlyphsToCharacters() const = 0; }; } // namespace Text diff --git a/dali-toolkit/internal/text/text-view.cpp b/dali-toolkit/internal/text/text-view.cpp index 9b34dd4..b4644e7 100644 --- a/dali-toolkit/internal/text/text-view.cpp +++ b/dali-toolkit/internal/text/text-view.cpp @@ -23,6 +23,9 @@ #include #include +// INTERNAL INCLUDES +#include + namespace Dali { namespace Toolkit @@ -32,6 +35,7 @@ namespace Text struct View::Impl { VisualModelPtr mVisualModel; + LogicalModelPtr mLogicalModel; TextAbstraction::FontClient mFontClient; ///< Handle to the font client. }; @@ -53,6 +57,11 @@ void View::SetVisualModel(VisualModelPtr visualModel) mImpl->mVisualModel = visualModel; } +void View::SetLogicalModel(LogicalModelPtr logicalModel) +{ + mImpl->mLogicalModel = logicalModel; +} + const Vector2& View::GetControlSize() const { if(mImpl->mVisualModel) @@ -96,8 +105,13 @@ Length View::GetGlyphs(GlyphInfo* glyphs, GlyphIndex glyphIndex, Length numberOfGlyphs) const { - Length numberOfLaidOutGlyphs = 0u; - Length numberOfActualLaidOutGlyphs = 0u; + Length numberOfLaidOutGlyphs = 0u; + Length numberOfActualLaidOutGlyphs = 0u; + const float characterSpacing = mImpl->mVisualModel->GetCharacterSpacing(); + Vector& glyphToCharacterMap = mImpl->mVisualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); + float calculatedAdvance = 0.f; + const Character* textBuffer = mImpl->mLogicalModel->mText.Begin(); if(mImpl->mVisualModel) { @@ -342,7 +356,8 @@ Length View::GetGlyphs(GlyphInfo* glyphs, firstPenSet = true; } - removedGlypsWidth += std::min(glyphToRemove.advance, (glyphToRemove.xBearing + glyphToRemove.width)); + calculatedAdvance = GetCalculatedAdvance(*(textBuffer + (*(glyphToCharacterMapBuffer + indexOfEllipsis))), characterSpacing, glyphToRemove.advance); + removedGlypsWidth += std::min(calculatedAdvance, (glyphToRemove.xBearing + glyphToRemove.width)); // Calculate the width of the ellipsis glyph and check if it fits. const float ellipsisGlyphWidth = ellipsisGlyph.width + ellipsisGlyph.xBearing; @@ -809,6 +824,21 @@ void View::GetStrikethroughRuns(StrikethroughGlyphRun* strikethroughRuns, } } +const float View::GetCharacterSpacing() const +{ + return (mImpl->mVisualModel) ? mImpl->mVisualModel->GetCharacterSpacing() : 0.f; +} + +const Character* View::GetTextBuffer() const +{ + return (mImpl->mVisualModel) ? mImpl->mLogicalModel->mText.Begin() : nullptr; +} + +const Vector& View::GetGlyphsToCharacters() const +{ + return mImpl->mVisualModel->GetGlyphsToCharacters(); +} + } // namespace Text } // namespace Toolkit diff --git a/dali-toolkit/internal/text/text-view.h b/dali-toolkit/internal/text/text-view.h index 37d6e0f..f673e0e 100644 --- a/dali-toolkit/internal/text/text-view.h +++ b/dali-toolkit/internal/text/text-view.h @@ -19,6 +19,7 @@ */ // INTERNAL INCLUDES +#include #include #include @@ -52,6 +53,13 @@ public: void SetVisualModel(VisualModelPtr visualModel); /** + * @brief Set the logical model. + * + * @param[in] logicalModel The logical model used by the View. + */ + void SetLogicalModel(LogicalModelPtr logicalModel); + + /** * @copydoc Dali::Toolkit::Text::ViewInterface::GetControlSize() */ const Vector2& GetControlSize() const override; @@ -239,6 +247,21 @@ public: StrikethroughRunIndex index, Length numberOfRuns) const; + /** + * @copydoc Dali::Toolkit::Text::ViewInterface::GetCharacterSpacing() + */ + const float GetCharacterSpacing() const override; + + /** + * @copydoc Dali::Toolkit::Text::ViewInterface::GetTextBuffer() + */ + const Character* GetTextBuffer() const override; + + /** + * @copydoc Dali::Toolkit::Text::ViewInterface::GetGlyphsToCharacters() + */ + const Vector& GetGlyphsToCharacters() const override; + private: // Undefined View(const View& handle); diff --git a/dali-toolkit/internal/text/visual-model-impl.cpp b/dali-toolkit/internal/text/visual-model-impl.cpp index 6c4ff9b..3fa3975 100644 --- a/dali-toolkit/internal/text/visual-model-impl.cpp +++ b/dali-toolkit/internal/text/visual-model-impl.cpp @@ -460,6 +460,11 @@ void VisualModel::SetStrikethroughHeight(float height) mStrikethroughHeight = height; } +void VisualModel::SetCharacterSpacing(float characterSpacing) +{ + mCharacterSpacing = characterSpacing; +} + const Vector4& VisualModel::GetTextColor() const { return mTextColor; @@ -525,6 +530,11 @@ const Vector4& VisualModel::GetBackgroundColor() const return mBackgroundColor; } +const float VisualModel::GetCharacterSpacing() const +{ + return mCharacterSpacing; +} + bool VisualModel::IsBackgroundEnabled() const { return mBackgroundEnabled; @@ -604,6 +614,11 @@ void VisualModel::ClearCaches() mCachedLineIndex = 0u; } +const Vector& VisualModel::GetGlyphsToCharacters() const +{ + return mGlyphsToCharacters; +} + VisualModel::~VisualModel() { } @@ -644,7 +659,8 @@ VisualModel::VisualModel() mUnderlineColorSet(false), mBackgroundEnabled(false), mMarkupProcessorEnabled(false), - mStrikethroughEnabled(false) + mStrikethroughEnabled(false), + mCharacterSpacing(0.0f) { } diff --git a/dali-toolkit/internal/text/visual-model-impl.h b/dali-toolkit/internal/text/visual-model-impl.h index 673156b..ebddb35 100644 --- a/dali-toolkit/internal/text/visual-model-impl.h +++ b/dali-toolkit/internal/text/visual-model-impl.h @@ -552,6 +552,30 @@ public: * @return Returns the override height for a strikethrough, 0 indicates that font metrics will determine the height */ float GetStrikethroughHeight() const; + /** + * @brief Set the override used for character spacing. + * + * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * + * @param[in] characterSpacing The character spacing. + */ + void SetCharacterSpacing(float characterSpacing); + + /** + * @brief Retrieves the characterSpacing. + * + * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed). + * + * @return Returns the characterSpacing. + */ + const float GetCharacterSpacing() const; + + /** + * @brief Retrieves the Glyphs to Characters Array. + * + * @return The GlyphsToCharacters. + */ + const Vector& GetGlyphsToCharacters() const; /** * @brief Retrieves the strikethrough runs. @@ -640,6 +664,7 @@ public: bool mMarkupProcessorEnabled : 1; ///< Markup-processor enabled flag HyphenInfo mHyphen; ///< Contains hyphen glyph info & the character index to draw hyphen after. bool mStrikethroughEnabled : 1; ///< Strikethrough enabled flag + float mCharacterSpacing; ///< Contains the value of the character spacing. }; } // namespace Text -- 2.7.4