X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Frendering%2Fview-model.cpp;h=0c4aeb3e00c4fcf38e7b6cf9e9e7b7de263c25ca;hp=2187487f157f28bd48cb3ed2efcb952029f53a63;hb=HEAD;hpb=4800a84a19c2fd33aea3174eae8e55297ee3a9af diff --git a/dali-toolkit/internal/text/rendering/view-model.cpp b/dali-toolkit/internal/text/rendering/view-model.cpp index 2187487..3799fc9 100644 --- a/dali-toolkit/internal/text/rendering/view-model.cpp +++ b/dali-toolkit/internal/text/rendering/view-model.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 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 @@ -92,7 +93,7 @@ Length ViewModel::GetNumberOfLines() const return mModel->GetNumberOfLines(); } -const LineRun* const ViewModel::GetLines() const +const LineRun* ViewModel::GetLines() const { return mModel->GetLines(); } @@ -102,11 +103,16 @@ Length ViewModel::GetNumberOfScripts() const return mModel->GetNumberOfScripts(); } -const ScriptRun* const ViewModel::GetScriptRuns() const +const ScriptRun* ViewModel::GetScriptRuns() const { return mModel->GetScriptRuns(); } +Length ViewModel::GetNumberOfCharacters() const +{ + return mModel->GetNumberOfCharacters(); +} + Length ViewModel::GetNumberOfGlyphs() const { if(mIsTextElided && mModel->IsTextElideEnabled()) @@ -161,7 +167,7 @@ GlyphIndex ViewModel::GetSecondMiddleIndexOfElidedGlyphs() const return mModel->GetSecondMiddleIndexOfElidedGlyphs(); } -const GlyphInfo* const ViewModel::GetGlyphs() const +const GlyphInfo* ViewModel::GetGlyphs() const { if(mIsTextElided && mModel->IsTextElideEnabled()) { @@ -175,7 +181,7 @@ const GlyphInfo* const ViewModel::GetGlyphs() const return NULL; } -const Vector2* const ViewModel::GetLayout() const +const Vector2* ViewModel::GetLayout() const { if(mIsTextElided && mModel->IsTextElideEnabled()) { @@ -189,27 +195,27 @@ const Vector2* const ViewModel::GetLayout() const return NULL; } -const Vector4* const ViewModel::GetColors() const +const Vector4* ViewModel::GetColors() const { return mModel->GetColors(); } -const ColorIndex* const ViewModel::GetColorIndices() const +const ColorIndex* ViewModel::GetColorIndices() const { return mModel->GetColorIndices(); } -const Vector4* const ViewModel::GetBackgroundColors() const +const Vector4* ViewModel::GetBackgroundColors() const { return mModel->GetBackgroundColors(); } -const ColorIndex* const ViewModel::GetBackgroundColorIndices() const +const ColorIndex* ViewModel::GetBackgroundColorIndices() const { return mModel->GetBackgroundColorIndices(); } -bool const ViewModel::IsMarkupBackgroundColorSet() const +bool ViewModel::IsMarkupBackgroundColorSet() const { return mModel->IsMarkupBackgroundColorSet(); } @@ -244,17 +250,37 @@ bool ViewModel::IsUnderlineEnabled() const return mModel->IsUnderlineEnabled(); } +bool ViewModel::IsMarkupUnderlineSet() const +{ + return mModel->IsMarkupUnderlineSet(); +} + float ViewModel::GetUnderlineHeight() const { return mModel->GetUnderlineHeight(); } +Text::Underline::Type ViewModel::GetUnderlineType() const +{ + return mModel->GetUnderlineType(); +} + +float ViewModel::GetDashedUnderlineWidth() const +{ + return mModel->GetDashedUnderlineWidth(); +} + +float ViewModel::GetDashedUnderlineGap() const +{ + return mModel->GetDashedUnderlineGap(); +} + Length ViewModel::GetNumberOfUnderlineRuns() const { return mModel->GetNumberOfUnderlineRuns(); } -void ViewModel::GetUnderlineRuns(GlyphRun* underlineRuns, UnderlineRunIndex index, Length numberOfRuns) const +void ViewModel::GetUnderlineRuns(UnderlinedGlyphRun* underlineRuns, UnderlineRunIndex index, Length numberOfRuns) const { mModel->GetUnderlineRuns(underlineRuns, index, numberOfRuns); } @@ -284,6 +310,11 @@ bool ViewModel::IsMarkupProcessorEnabled() const return mModel->IsMarkupProcessorEnabled(); } +bool ViewModel::IsSpannedTextPlaced() const +{ + return mModel->IsSpannedTextPlaced(); +} + const GlyphInfo* ViewModel::GetHyphens() const { return mModel->GetHyphens(); @@ -299,13 +330,33 @@ Length ViewModel::GetHyphensCount() const return mModel->GetHyphensCount(); } +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()) { @@ -469,7 +520,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; @@ -487,7 +539,71 @@ void ViewModel::ElideGlyphs() // Change the 'x' and 'y' position of the ellipsis glyph. if(position.x > firstPenX) { - position.x = firstPenX + removedGlypsWidth - ellipsisGlyphWidth; + if(isTailMode) + { + // To handle case of the mixed languages (LTR then RTL) with + // EllipsisPosition::END and the LayoutDirection::RIGHT_TO_LEFT + float nextXPositions = ellipsisLine->width; + if(indexOfEllipsis + 1u < numberOfGlyphs) + { + Vector2& positionOfNextGlyph = *(elidedPositionsBuffer + indexOfEllipsis + 1u); + nextXPositions = positionOfNextGlyph.x; + } + + if(position.x > nextXPositions) // RTL language + { + if((indexOfEllipsis > 0u) && ((position.x - nextXPositions) > removedGlypsWidth)) + { + // To handle mixed directions + // Re-calculates the first penX which will be used if rtl text is elided. + firstPenX = position.x - glyphToRemove.xBearing; + if(firstPenX < -ellipsisGlyph.xBearing) + { + // Avoids to exceed the bounding box when rtl text is elided. + firstPenX = -ellipsisGlyph.xBearing; + } + //Reset the width of removed glyphs + removedGlypsWidth = std::min(calculatedAdvance, (glyphToRemove.xBearing + glyphToRemove.width)) - ellipsisGlyph.xBearing; + + --indexOfEllipsis; + continue; + } + else + { + // To handle the case of RTL language with EllipsisPosition::END + position.x = firstPenX + removedGlypsWidth - ellipsisGlyphWidth; + } + } + } + else + { + // To handle the case of LTR language with EllipsisPosition::START + position.x = firstPenX + removedGlypsWidth - ellipsisGlyphWidth; + } + } + else + { + if(!isTailMode) + { + // To handle case of the mixed languages (RTL then LTR) with + // EllipsisPosition::START and the LayoutDirection::RIGHT_TO_LEFT + float nextXPositions = ellipsisLine->width; + if(indexOfEllipsis + 1u < numberOfGlyphs) + { + Vector2& positionOfNextGlyph = *(elidedPositionsBuffer + indexOfEllipsis + 1u); + nextXPositions = positionOfNextGlyph.x; + } + + if(position.x < nextXPositions) // LTR language + { + position.x = firstPenX + removedGlypsWidth - ellipsisGlyphWidth; + + if((position.x + ellipsisGlyphWidth + ellipsisGlyph.xBearing) > nextXPositions) + { + position.x -= (position.x + ellipsisGlyphWidth + ellipsisGlyph.xBearing) - nextXPositions; + } + } + } } position.x += ellipsisGlyph.xBearing; @@ -583,6 +699,66 @@ void ViewModel::ElideGlyphs() } } +float ViewModel::GetStrikethroughHeight() const +{ + return mModel->GetStrikethroughHeight(); +} + +const Vector4& ViewModel::GetStrikethroughColor() const +{ + return mModel->GetStrikethroughColor(); +} + +bool ViewModel::IsStrikethroughEnabled() const +{ + return mModel->IsStrikethroughEnabled(); +} + +bool ViewModel::IsMarkupStrikethroughSet() const +{ + return mModel->IsMarkupStrikethroughSet(); +} + +Length ViewModel::GetNumberOfStrikethroughRuns() const +{ + return mModel->GetNumberOfStrikethroughRuns(); +} + +void ViewModel::GetStrikethroughRuns(StrikethroughGlyphRun* strikethroughRuns, StrikethroughRunIndex index, Length numberOfRuns) const +{ + mModel->GetStrikethroughRuns(strikethroughRuns, index, numberOfRuns); +} + +Length ViewModel::GetNumberOfBoundedParagraphRuns() const +{ + return mModel->GetNumberOfBoundedParagraphRuns(); +} + +const Vector& ViewModel::GetBoundedParagraphRuns() const +{ + return mModel->GetBoundedParagraphRuns(); +} + +Length ViewModel::GetNumberOfCharacterSpacingGlyphRuns() const +{ + return mModel->GetNumberOfCharacterSpacingGlyphRuns(); +} + +const Vector& ViewModel::GetCharacterSpacingGlyphRuns() const +{ + return mModel->GetCharacterSpacingGlyphRuns(); +} + +const Vector& ViewModel::GetFontRuns() const +{ + return mModel->GetFontRuns(); +} + +const Vector& ViewModel::GetFontDescriptionRuns() const +{ + return mModel->GetFontDescriptionRuns(); +} + } // namespace Text } // namespace Toolkit