Fix for text ellipsis. 24/40824/2
authorVictor Cebollada <v.cebollada@samsung.com>
Tue, 9 Jun 2015 10:01:22 +0000 (11:01 +0100)
committerVictor Cebollada <v.cebollada@samsung.com>
Tue, 9 Jun 2015 10:22:32 +0000 (11:22 +0100)
  The FontClient::GetPointSize() logs an error and
returns the default font point size if the font id
is zero.

  Some glyphs i.e. the '\n' have font id zero. It
avoids the call to that method with font id
equal to zero.

Change-Id: Ie4877d4ec87b1dfd65dd98bc405b8768e4e2a57e
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
dali-toolkit/internal/text/text-view.cpp

index 976635a..47a2028 100644 (file)
@@ -116,55 +116,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 )
             {