From: Victor Cebollada Date: Tue, 17 Mar 2015 18:09:07 +0000 (+0000) Subject: Mirroring bidirectional text. X-Git-Tag: dali_1.0.38~11^2~47 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=b0d779c1461781f29868f5414d2475ab0ba9766b Mirroring bidirectional text. Change-Id: Ie1392451f1aad81b05d7762b6838c14cccfc0913 Signed-off-by: Victor Cebollada --- diff --git a/dali-toolkit/internal/text/bidirectional-support.cpp b/dali-toolkit/internal/text/bidirectional-support.cpp index 14fb1a7..f20641b 100644 --- a/dali-toolkit/internal/text/bidirectional-support.cpp +++ b/dali-toolkit/internal/text/bidirectional-support.cpp @@ -236,6 +236,18 @@ void ReorderLines( LogicalModel& logicalModel, { } +bool GetMirroredText( const Vector& text, + Vector& mirroredText ) +{ + // Handle to the bidirectional info module in text-abstraction. + TextAbstraction::BidirectionalSupport bidirectionalSupport = TextAbstraction::BidirectionalSupport::Get(); + + mirroredText = text; + + return bidirectionalSupport.GetMirroredText( mirroredText.Begin(), + mirroredText.Count() ); +} + } // namespace Text } // namespace Toolkit diff --git a/dali-toolkit/internal/text/bidirectional-support.h b/dali-toolkit/internal/text/bidirectional-support.h index 4bdd5e3..227133e 100644 --- a/dali-toolkit/internal/text/bidirectional-support.h +++ b/dali-toolkit/internal/text/bidirectional-support.h @@ -110,6 +110,16 @@ void ReorderLines( LogicalModel& logicalModel, Length numberOfCharactersToRemove, Length numberOfCharactersToInsert ); +/** + * @brief Replaces any character which could be mirrored. + * + * @param[in] text The text. + * @param[in] mirroredText The mirroredText. + * + * @return @e true if a character has been replaced. + */ +bool GetMirroredText( const Vector& text, + Vector& mirroredText ); } // namespace Text } // namespace Toolkit diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index b4d4bb5..ea33695 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -622,6 +622,7 @@ Vector3 Controller::GetNaturalSize() VALIDATE_FONTS | GET_LINE_BREAKS | GET_WORD_BREAKS | + BIDI_INFO | SHAPE_TEXT | GET_GLYPH_METRICS ); // Make sure the model is up-to-date before layouting @@ -670,6 +671,7 @@ float Controller::GetHeightForWidth( float width ) VALIDATE_FONTS | GET_LINE_BREAKS | GET_WORD_BREAKS | + BIDI_INFO | SHAPE_TEXT | GET_GLYPH_METRICS ); // Make sure the model is up-to-date before layouting @@ -968,6 +970,8 @@ void Controller::UpdateModel( OperationsMask operationsRequired ) } } + Vector mirroredUtf32Characters; + bool textMirrored = false; if( BIDI_INFO & operations ) { // Count the number of LINE_NO_BREAK to reserve some space for the vector of paragraph's @@ -992,6 +996,14 @@ void Controller::UpdateModel( OperationsMask operationsRequired ) scripts, lineBreakInfo, bidirectionalInfo ); + + if( 0u != bidirectionalInfo.Count() ) + { + // This paragraph has right to left text. Some characters may need to be mirrored. + // TODO: consider if the mirrored string can be stored as well. + + textMirrored = GetMirroredText( utf32Characters, mirroredUtf32Characters ); + } } Vector& glyphs = mImpl->mVisualModel->mGlyphs; @@ -999,8 +1011,9 @@ void Controller::UpdateModel( OperationsMask operationsRequired ) Vector& charactersPerGlyph = mImpl->mVisualModel->mCharactersPerGlyph; if( SHAPE_TEXT & operations ) { + const Vector& textToShape = textMirrored ? mirroredUtf32Characters : utf32Characters; // Shapes the text. - ShapeText( utf32Characters, + ShapeText( textToShape, lineBreakInfo, scripts, validFonts,