X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit-internal%2Fdali-toolkit-test-utils%2Ftoolkit-text-utils.cpp;h=0a426b01fd5bd9e27fea41cc27206d1d5a2cb5ab;hp=924815156e8d081d99a340e432eeb5444faac761;hb=656f6eec4881d0305fc1322a0531cadd816287dc;hpb=a8cc5814798a6df3859462486d593245ddaa17e5 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 old mode 100644 new mode 100755 index 9248151..0a426b0 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -31,6 +31,8 @@ #include #include #include +#include +#include namespace Dali { @@ -78,7 +80,6 @@ void ClearModelData( CharacterIndex characterIndex, logicalModel->mScriptRuns.Clear(); logicalModel->mFontRuns.Clear(); - logicalModel->mWordBreakInfo.Clear(); logicalModel->mBidirectionalParagraphInfo.Clear(); logicalModel->mCharacterDirections.Clear(); logicalModel->mBidirectionalLineInfo.Clear(); @@ -98,45 +99,97 @@ void CreateTextModel( const std::string& text, const Vector& fontDescriptions, const LayoutOptions& options, Size& layoutSize, - LogicalModelPtr& logicalModel, - VisualModelPtr& visualModel, - MetricsPtr& metrics ) + ModelPtr& textModel, + MetricsPtr& metrics, + bool markupProcessorEnabled, + LineWrap::Mode wrapMode ) { - logicalModel = LogicalModel::New(); - visualModel = VisualModel::New(); + textModel = Model::New(); ///< Pointer to the text's model. + LogicalModelPtr logicalModel = textModel->mLogicalModel; + VisualModelPtr visualModel = textModel->mVisualModel; + + MarkupProcessData markupProcessData( logicalModel->mColorRuns, + logicalModel->mFontDescriptionRuns, + logicalModel->mEmbeddedItems, + logicalModel->mAnchors, + logicalModel->mUnderlinedCharacterRuns); + + Length textSize = 0u; + const uint8_t* utf8 = NULL; + if( markupProcessorEnabled ) + { + ProcessMarkupString( text, markupProcessData ); + textSize = markupProcessData.markupProcessedText.size(); + + // This is a bit horrible but std::string returns a (signed) char* + utf8 = reinterpret_cast( markupProcessData.markupProcessedText.c_str() ); + } + else + { + textSize = text.size(); + + // This is a bit horrible but std::string returns a (signed) char* + utf8 = reinterpret_cast( text.c_str() ); + } // 1) Convert to utf32 Vector& utf32Characters = logicalModel->mText; - utf32Characters.Resize( text.size() ); + utf32Characters.Resize( textSize ); - const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast( text.c_str() ), - text.size(), - &utf32Characters[0u] ); - utf32Characters.Resize( numberOfCharacters ); + // Transform a text array encoded in utf8 into an array encoded in utf32. + // It returns the actual number of characters. + Length characterCount = Utf8ToUtf32( utf8, textSize, utf32Characters.Begin() ); + utf32Characters.Resize( characterCount ); // 2) Set the break and paragraph info. Vector& lineBreakInfo = logicalModel->mLineBreakInfo; - lineBreakInfo.Resize( numberOfCharacters ); + lineBreakInfo.Resize( characterCount ); SetLineBreakInfo( utf32Characters, 0u, - numberOfCharacters, + characterCount, lineBreakInfo ); - if( 0u == numberOfCharacters ) + if( 0u == characterCount ) { // Nothing else to do if the number of characters is zero. return; } - // Retrieves the word break info. The word break info is used to layout the text (where to wrap the text in lines). - Vector& wordBreakInfo = logicalModel->mWordBreakInfo; - wordBreakInfo.Resize( numberOfCharacters ); + textModel->mLineWrapMode = wrapMode; - SetWordBreakInfo( utf32Characters, - 0u, - numberOfCharacters, - wordBreakInfo ); + if(textModel->mLineWrapMode == ((Text::LineWrap::Mode)DevelText::LineWrap::HYPHENATION) || + textModel->mLineWrapMode == ((Text::LineWrap::Mode)DevelText::LineWrap::MIXED)) + { + CharacterIndex end = characterCount; + LineBreakInfo* lineBreakInfoBuffer = lineBreakInfo.Begin(); + + for(CharacterIndex index = 0; index < end; index++) + { + CharacterIndex wordEnd = index; + while((*(lineBreakInfoBuffer + wordEnd) != TextAbstraction::LINE_ALLOW_BREAK) && (*(lineBreakInfoBuffer + wordEnd) != TextAbstraction::LINE_MUST_BREAK)) + { + wordEnd++; + } + + if((wordEnd + 1) == end) // add last char + { + wordEnd++; + } + + Vector hyphens = GetWordHyphens(utf32Characters.Begin() + index, wordEnd - index, nullptr); + + for(CharacterIndex i = 0; i < (wordEnd - index); i++) + { + if(hyphens[i]) + { + *(lineBreakInfoBuffer + index + i) = TextAbstraction::LINE_HYPHENATION_BREAK; + } + } + + index = wordEnd; + } + } // 3) Set the script info. MultilanguageSupport multilanguageSupport = MultilanguageSupport::Get(); @@ -144,7 +197,7 @@ void CreateTextModel( const std::string& text, Vector& scripts = logicalModel->mScriptRuns; multilanguageSupport.SetScripts( utf32Characters, 0u, - numberOfCharacters, + characterCount, scripts ); // 4) Set the font info @@ -166,7 +219,7 @@ void CreateTextModel( const std::string& text, fontDescription, TextAbstraction::FontClient::DEFAULT_POINT_SIZE, 0u, - numberOfCharacters, + characterCount, validFonts ); // 5) Set the bidirectional info per paragraph. @@ -181,12 +234,12 @@ void CreateTextModel( const std::string& text, scripts, lineBreakInfo, 0u, - numberOfCharacters, + characterCount, bidirectionalInfo ); // Create the paragraph info. logicalModel->CreateParagraphInfo( 0u, - numberOfCharacters ); + characterCount ); // 6) Set character directions. Vector& characterDirections = logicalModel->mCharacterDirections; @@ -194,9 +247,9 @@ void CreateTextModel( const std::string& text, { // Only set the character directions if there is right to left characters. GetCharactersDirection( bidirectionalInfo, - numberOfCharacters, + characterCount, 0u, - numberOfCharacters, + characterCount, characterDirections ); @@ -205,7 +258,7 @@ void CreateTextModel( const std::string& text, characterDirections, bidirectionalInfo, 0u, - numberOfCharacters, + characterCount, mirroredUtf32Characters ); } else @@ -229,15 +282,15 @@ void CreateTextModel( const std::string& text, validFonts, 0u, 0u, - numberOfCharacters, + characterCount, glyphs, glyphsToCharactersMap, charactersPerGlyph, newParagraphGlyphs ); // Create the 'number of glyphs' per character and the glyph to character conversion tables. - visualModel->CreateGlyphsPerCharacterTable( 0u, 0u, numberOfCharacters ); - visualModel->CreateCharacterToGlyphTable( 0u, 0u, numberOfCharacters ); + visualModel->CreateGlyphsPerCharacterTable( 0u, 0u, characterCount ); + visualModel->CreateCharacterToGlyphTable( 0u, 0u, characterCount ); const Length numberOfGlyphs = glyphs.Count(); @@ -267,30 +320,18 @@ void CreateTextModel( const std::string& text, layoutEngine.SetLayout( Layout::Engine::MULTI_LINE_BOX ); // Set the layout parameters. - const Vector& charactersToGlyph = visualModel->mCharactersToGlyph; - const Vector& glyphsPerCharacter = visualModel->mGlyphsPerCharacter; - float outlineWidth = visualModel->GetOutlineWidth(); + textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN; + textModel->mIgnoreSpacesAfterText = true; + textModel->mMatchSystemLanguageDirection = false; Layout::Parameters layoutParameters( textArea, - utf32Characters.Begin(), - lineBreakInfo.Begin(), - wordBreakInfo.Begin(), - ( 0u != characterDirections.Count() ) ? characterDirections.Begin() : NULL, - glyphs.Begin(), - glyphsToCharactersMap.Begin(), - charactersPerGlyph.Begin(), - charactersToGlyph.Begin(), - glyphsPerCharacter.Begin(), - numberOfGlyphs, - Text::HorizontalAlignment::BEGIN, - Text::LineWrap::WORD, - outlineWidth ); + textModel ); Vector& lines = visualModel->mLines; Vector& glyphPositions = visualModel->mGlyphPositions; glyphPositions.Resize( numberOfGlyphs ); - layoutParameters.isLastNewParagraph = TextAbstraction::IsNewParagraph( *( utf32Characters.Begin() + ( numberOfCharacters - 1u ) ) ); + layoutParameters.isLastNewParagraph = TextAbstraction::IsNewParagraph( *( utf32Characters.Begin() + ( characterCount - 1u ) ) ); // The initial glyph and the number of glyphs to layout. layoutParameters.startGlyphIndex = 0u; @@ -298,51 +339,23 @@ void CreateTextModel( const std::string& text, layoutParameters.startLineIndex = 0u; layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count(); + bool isAutoScroll = false; layoutEngine.LayoutText( layoutParameters, - glyphPositions, - lines, layoutSize, - false ); - - // 10) Reorder the lines - if( 0u != bidirectionalInfo.Count() ) - { - Vector& bidirectionalLineInfo = logicalModel->mBidirectionalLineInfo; - - // Get the lines - const Length numberOfLines = lines.Count(); - - // Reorder the lines. - bidirectionalLineInfo.Reserve( numberOfLines ); // Reserve because is not known yet how many lines have right to left characters. - ReorderLines( bidirectionalInfo, - 0u, - numberOfCharacters, - lines, - bidirectionalLineInfo ); - - // Set the bidirectional info per line into the layout parameters. - layoutParameters.lineBidirectionalInfoRunsBuffer = bidirectionalLineInfo.Begin(); - layoutParameters.numberOfBidirectionalInfoRuns = bidirectionalLineInfo.Count(); - - if( options.reorder ) - { - // Re-layout the text. Reorder those lines with right to left characters. - layoutEngine.ReLayoutRightToLeftLines( layoutParameters, - 0u, - numberOfCharacters, - glyphPositions ); - } - } + false, + isAutoScroll ); if( options.align ) { float alignmentOffset = 0.f; layoutEngine.Align( textArea, 0u, - numberOfCharacters, + characterCount, Text::HorizontalAlignment::BEGIN, lines, - alignmentOffset ); + alignmentOffset, + Dali::LayoutDirection::LEFT_TO_RIGHT, + false ); } } @@ -357,8 +370,9 @@ void ConfigureTextLabel( ControllerPtr controller ) // Set cursor's width to zero. controller->GetLayoutEngine().SetCursorWidth( 0 ); + InputMethodContext inputMethodContext = InputMethodContext::New(); // Disables the text input. - controller->EnableTextInput( NULL ); + controller->EnableTextInput( NULL, inputMethodContext ); // Disables the vertical scrolling. controller->SetVerticalScrollEnabled( false ); @@ -382,8 +396,9 @@ void ConfigureTextField( ControllerPtr controller ) // Set the text layout as multi-line. controller->GetLayoutEngine().SetLayout( Layout::Engine::SINGLE_LINE_BOX ); + InputMethodContext inputMethodContext = InputMethodContext::New(); // Enables the text input. - controller->EnableTextInput( decorator ); + controller->EnableTextInput( decorator, inputMethodContext ); // Enables the vertical scrolling after the text input has been enabled. controller->SetVerticalScrollEnabled( false ); @@ -410,8 +425,9 @@ void ConfigureTextEditor( ControllerPtr controller ) // Set the text layout as multi-line. controller->GetLayoutEngine().SetLayout( Layout::Engine::MULTI_LINE_BOX ); + InputMethodContext inputMethodContext = InputMethodContext::New(); // Enables the text input. - controller->EnableTextInput( decorator ); + controller->EnableTextInput( decorator, inputMethodContext ); // Enables the vertical scrolling after the text input has been enabled. controller->SetVerticalScrollEnabled( true );