X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fbidirectional-support.cpp;h=9bf27f8bc68aef52372f35343ca52e823853bd43;hp=da8f96161f1e2d873ca8178bfd8e69f954670486;hb=750fadba87bb959c9af32e89e3f1bc7af6cb6dd2;hpb=f2039d47f9bed8104575da80a2ecf0bb6e37ff8d diff --git a/dali-toolkit/internal/text/bidirectional-support.cpp b/dali-toolkit/internal/text/bidirectional-support.cpp index da8f961..9bf27f8 100644 --- a/dali-toolkit/internal/text/bidirectional-support.cpp +++ b/dali-toolkit/internal/text/bidirectional-support.cpp @@ -34,7 +34,7 @@ void SetBidirectionalInfo(const Vector& text, CharacterIndex startIndex, Length numberOfCharacters, Vector& bidirectionalInfo, - bool matchSystemLanguageDirection, + bool matchLayoutDirection, Dali::LayoutDirection::Type layoutDirection) { // Find where to insert the new paragraphs. @@ -113,7 +113,7 @@ void SetBidirectionalInfo(const Vector& text, // Create the bidirectional info for the whole paragraph and store the index to the table with this info in the run. bidirectionalRun.bidirectionalInfoIndex = bidirectionalSupport.CreateInfo(textBuffer + bidirectionalRun.characterRun.characterIndex, bidirectionalRun.characterRun.numberOfCharacters, - matchSystemLanguageDirection, + matchLayoutDirection, layoutDirection); bidirectionalRun.direction = bidirectionalSupport.GetParagraphDirection(bidirectionalRun.bidirectionalInfoIndex); @@ -147,6 +147,8 @@ void ReorderLine(const BidirectionalParagraphInfoRun& bidirectionalParagraphInfo BidirectionalLineRunIndex bidiLineIndex, CharacterIndex startIndex, Length numberOfCharacters, + CharacterIndex startIndexInSecondHalfLine, + Length numberOfCharactersInSecondHalfLine, CharacterDirection direction) { // Handle to the bidirectional info module in text-abstraction. @@ -159,11 +161,16 @@ void ReorderLine(const BidirectionalParagraphInfoRun& bidirectionalParagraphInfo lineInfoRun.direction = direction; lineInfoRun.isIdentity = true; + lineInfoRun.characterRunForSecondHalfLine.characterIndex = startIndexInSecondHalfLine; + lineInfoRun.characterRunForSecondHalfLine.numberOfCharacters = numberOfCharactersInSecondHalfLine; + // Allocate space for the conversion maps. // The memory is freed after the visual to logical to visual conversion tables are built in the logical model. lineInfoRun.visualToLogicalMap = reinterpret_cast(malloc(numberOfCharacters * sizeof(CharacterIndex))); - if(nullptr != lineInfoRun.visualToLogicalMap) + lineInfoRun.visualToLogicalMapSecondHalf = reinterpret_cast(malloc(numberOfCharactersInSecondHalfLine * sizeof(CharacterIndex))); + + if(nullptr != lineInfoRun.visualToLogicalMap && nullptr != lineInfoRun.visualToLogicalMapSecondHalf) { // Reorders the line. bidirectionalSupport.Reorder(bidirectionalParagraphInfo.bidirectionalInfoIndex, @@ -171,6 +178,11 @@ void ReorderLine(const BidirectionalParagraphInfoRun& bidirectionalParagraphInfo lineInfoRun.characterRun.numberOfCharacters, lineInfoRun.visualToLogicalMap); + bidirectionalSupport.Reorder(bidirectionalParagraphInfo.bidirectionalInfoIndex, + lineInfoRun.characterRunForSecondHalfLine.characterIndex - bidirectionalParagraphInfo.characterRun.characterIndex, + lineInfoRun.characterRunForSecondHalfLine.numberOfCharacters, + lineInfoRun.visualToLogicalMapSecondHalf); + // For those LTR lines inside a bidirectional paragraph. // It will save to relayout the line after reordering. for(unsigned int i = 0; i < numberOfCharacters; ++i) @@ -181,6 +193,15 @@ void ReorderLine(const BidirectionalParagraphInfoRun& bidirectionalParagraphInfo break; } } + + for(unsigned int i = 0; i < numberOfCharactersInSecondHalfLine; ++i) + { + if(i != *(lineInfoRun.visualToLogicalMapSecondHalf + i)) + { + lineInfoRun.isIdentity = false; + break; + } + } } // Push the run into the vector.