X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-view.cpp;h=414fffa8d1397d69197ffee102db3ace951c4805;hp=e7bd2629c388191176addcea1946fa6acd6f3c5d;hb=5064025f6246c31c82cd1531084b639ac9c3237d;hpb=e82c3165d7d7eeaa8cd8c911ab73b1ed2f46ddf4 diff --git a/dali-toolkit/internal/text/text-view.cpp b/dali-toolkit/internal/text/text-view.cpp index e7bd262..414fffa 100644 --- a/dali-toolkit/internal/text/text-view.cpp +++ b/dali-toolkit/internal/text/text-view.cpp @@ -20,7 +20,7 @@ // EXTERNAL INCLUDES #include -#include +#include namespace Dali { @@ -92,6 +92,48 @@ Length View::GetGlyphs( GlyphInfo* glyphs, glyphIndex, numberOfLaidOutGlyphs ); + // Get the lines for the given range of glyphs. + // The lines contain the alignment offset which needs to be added to the glyph's position. + LineIndex firstLine = 0u; + Length numberOfLines = 0u; + mImpl->mVisualModel->GetNumberOfLines( glyphIndex, + numberOfLaidOutGlyphs, + firstLine, + numberOfLines ); + + Vector lines; + lines.Resize( numberOfLines ); + LineRun* lineBuffer = lines.Begin(); + + mImpl->mVisualModel->GetLinesOfGlyphRange( lineBuffer, + glyphIndex, + numberOfLaidOutGlyphs ); + + // Get the first line for the given glyph range. + LineIndex lineIndex = firstLine; + LineRun* line = lineBuffer + lineIndex; + + // Index of the last glyph of the line. + GlyphIndex lastGlyphIndexOfLine = line->glyphIndex + line->numberOfGlyphs - 1u; + + // Add the alignment offset to the glyph's position. + for( Length index = 0u; index < numberOfLaidOutGlyphs; ++index ) + { + ( *( glyphPositions + index ) ).x += line->alignmentOffset; + + if( lastGlyphIndexOfLine == index ) + { + // Get the next line. + ++lineIndex; + + if( lineIndex < numberOfLines ) + { + line = lineBuffer + lineIndex; + lastGlyphIndexOfLine = line->glyphIndex + line->numberOfGlyphs - 1u; + } + } + } + if( 1u == numberOfLaidOutGlyphs ) { // not a point try to do ellipsis with only one laid out character. @@ -116,55 +158,61 @@ Length View::GetGlyphs( GlyphInfo* glyphs, { const GlyphInfo& glyphToRemove = *( glyphs + index ); - // Need to reshape the glyph as the font may be different in size. - const GlyphInfo& ellipsisGlyph = mImpl->mFontClient.GetEllipsisGlyph( mImpl->mFontClient.GetPointSize( glyphToRemove.fontId ) ); - - if( !firstPenSet ) + if( 0u != glyphToRemove.fontId ) { - const Vector2& position = *( glyphPositions + index ); + // i.e. The font id of the glyph shaped from the '\n' character is zero. - // Calculates the penY of the current line. It will be used to position the ellipsis glyph. - penY = position.y + glyphToRemove.yBearing; + // Need to reshape the glyph as the font may be different in size. + const GlyphInfo& ellipsisGlyph = mImpl->mFontClient.GetEllipsisGlyph( mImpl->mFontClient.GetPointSize( glyphToRemove.fontId ) ); - // Calculates the first penX which will be used if rtl text is elided. - firstPenX = position.x - glyphToRemove.xBearing; - if( firstPenX < -ellipsisGlyph.xBearing ) + if( !firstPenSet ) { - // Avoids to exceed the bounding box when rtl text is elided. - firstPenX = -ellipsisGlyph.xBearing; - } + const Vector2& position = *( glyphPositions + index ); - removedGlypsWidth = -ellipsisGlyph.xBearing; + // Calculates the penY of the current line. It will be used to position the ellipsis glyph. + penY = position.y + glyphToRemove.yBearing; - firstPenSet = true; - } + // 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; + } - removedGlypsWidth += std::min( glyphToRemove.advance, ( glyphToRemove.xBearing + glyphToRemove.width ) ); + removedGlypsWidth = -ellipsisGlyph.xBearing; - // Calculate the width of the ellipsis glyph and check if it fits. - const float ellipsisGlyphWidth = ellipsisGlyph.width + ellipsisGlyph.xBearing; - if( ellipsisGlyphWidth < removedGlypsWidth ) - { - GlyphInfo& glyphInfo = *( glyphs + index ); - Vector2& position = *( glyphPositions + index ); - position.x -= glyphInfo.xBearing; - - // Replace the glyph by the ellipsis glyph. - glyphInfo = ellipsisGlyph; + firstPenSet = true; + } - // Change the 'x' and 'y' position of the ellipsis glyph. + removedGlypsWidth += std::min( glyphToRemove.advance, ( glyphToRemove.xBearing + glyphToRemove.width ) ); - if( position.x > firstPenX ) + // Calculate the width of the ellipsis glyph and check if it fits. + const float ellipsisGlyphWidth = ellipsisGlyph.width + ellipsisGlyph.xBearing; + if( ellipsisGlyphWidth < removedGlypsWidth ) { - position.x = firstPenX + removedGlypsWidth - ellipsisGlyphWidth; - } + GlyphInfo& glyphInfo = *( glyphs + index ); + Vector2& position = *( glyphPositions + index ); + position.x -= glyphInfo.xBearing; - position.x += ellipsisGlyph.xBearing; - position.y = penY - ellipsisGlyph.yBearing; + // Replace the glyph by the ellipsis glyph. + glyphInfo = ellipsisGlyph; - inserted = true; + // Change the 'x' and 'y' position of the ellipsis glyph. + + if( position.x > firstPenX ) + { + position.x = firstPenX + removedGlypsWidth - ellipsisGlyphWidth; + } + + position.x += ellipsisGlyph.xBearing; + position.y = penY - ellipsisGlyph.yBearing; + + inserted = true; + } } - else + + if( !inserted ) { if( index > 0u ) {