Use the line ascender and descender. 97/37597/3
authorVictor Cebollada <v.cebollada@samsung.com>
Tue, 31 Mar 2015 15:21:22 +0000 (16:21 +0100)
committerVictor Cebollada <v.cebollada@samsung.com>
Tue, 7 Apr 2015 14:45:34 +0000 (15:45 +0100)
Change-Id: I86c5b581faa1819a429dd31feb02044e405e855f
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
dali-toolkit/internal/text/layouts/layout-engine.cpp
dali-toolkit/internal/text/line-run.h
dali-toolkit/internal/text/text-controller.cpp
dali-toolkit/internal/text/text-io.cpp

index a88a877..1a97dd4 100644 (file)
@@ -19,6 +19,7 @@
 #include <dali-toolkit/internal/text/layouts/layout-engine.h>
 
 // EXTERNAL INCLUDES
+#include <limits>
 #include <dali/public-api/math/vector2.h>
 #include <dali/public-api/text-abstraction/font-client.h>
 
@@ -35,6 +36,13 @@ namespace Toolkit
 namespace Text
 {
 
+namespace
+{
+
+const float MAX_FLOAT = std::numeric_limits<float>::max();
+
+} //namespace
+
 /**
  * @brief Stores temporary layout info of the line.
  */
@@ -48,7 +56,7 @@ struct LineLayout
   float          widthAdvanceDiff;   ///< The difference between the width and the advance of the last glyph.
   float          wsLengthEndOfLine;  ///< The length of the white spaces at the end of the line.
   float          ascender;           ///< The maximum ascender of all fonts in the line.
-  float          descender;          ///< The maximum descender of all fonts in the line.
+  float          descender;          ///< The minimum descender of all fonts in the line.
 };
 
 struct LayoutEngine::Impl
@@ -73,7 +81,7 @@ struct LayoutEngine::Impl
     lineLayout.length = 0.f;
     lineLayout.wsLengthEndOfLine = 0.f;
     lineLayout.ascender = 0.f;
-    lineLayout.descender = 0.f;
+    lineLayout.descender = MAX_FLOAT;
 
     // Get the last glyph index.
     const GlyphIndex lastGlyphIndex = parameters.totalNumberOfGlyphs - 1u;
@@ -129,8 +137,8 @@ struct LayoutEngine::Impl
           lineLayout.ascender = fontMetrics.ascender;
         }
 
-        // Sets the maximum descender.
-        if( fontMetrics.descender > lineLayout.descender )
+        // Sets the minimum descender.
+        if( fontMetrics.descender < lineLayout.descender )
         {
           lineLayout.descender = fontMetrics.descender;
         }
@@ -153,7 +161,7 @@ struct LayoutEngine::Impl
     lineLayout.widthAdvanceDiff = 0.f;
     lineLayout.wsLengthEndOfLine = 0.f;
     lineLayout.ascender = 0.f;
-    lineLayout.descender = 0.f;
+    lineLayout.descender = MAX_FLOAT;
 
     // Stores temporary line layout which has not been added to the final line layout.
     LineLayout tmpLineLayout;
@@ -163,7 +171,7 @@ struct LayoutEngine::Impl
     tmpLineLayout.widthAdvanceDiff = 0.f;
     tmpLineLayout.wsLengthEndOfLine = 0.f;
     tmpLineLayout.ascender = 0.f;
-    tmpLineLayout.descender = 0.f;
+    tmpLineLayout.descender = MAX_FLOAT;
 
     FontId lastFontId = 0u;
     for( GlyphIndex glyphIndex = lineLayout.glyphIndex;
@@ -244,7 +252,7 @@ struct LayoutEngine::Impl
           lineLayout.ascender = tmpLineLayout.ascender;
         }
 
-        if( tmpLineLayout.descender > lineLayout.descender )
+        if( tmpLineLayout.descender < lineLayout.descender )
         {
           lineLayout.descender = tmpLineLayout.descender;
         }
@@ -255,7 +263,7 @@ struct LayoutEngine::Impl
         tmpLineLayout.widthAdvanceDiff = 0u;
         tmpLineLayout.wsLengthEndOfLine = 0u;
         tmpLineLayout.ascender = 0.f;
-        tmpLineLayout.descender = 0.f;
+        tmpLineLayout.descender = MAX_FLOAT;
         return;
       }
 
@@ -284,7 +292,7 @@ struct LayoutEngine::Impl
           lineLayout.ascender = tmpLineLayout.ascender;
         }
 
-        if( tmpLineLayout.descender > lineLayout.descender )
+        if( tmpLineLayout.descender < lineLayout.descender )
         {
           lineLayout.descender = tmpLineLayout.descender;
         }
@@ -295,7 +303,7 @@ struct LayoutEngine::Impl
         tmpLineLayout.widthAdvanceDiff = 0u;
         tmpLineLayout.wsLengthEndOfLine = 0u;
         tmpLineLayout.ascender = 0.f;
-        tmpLineLayout.descender = 0.f;
+        tmpLineLayout.descender = MAX_FLOAT;
       }
 
       if( lastFontId != glyphInfo.fontId )
@@ -309,10 +317,10 @@ struct LayoutEngine::Impl
           tmpLineLayout.ascender = fontMetrics.ascender;
         }
 
-        // Sets the maximum descender.
-        if( -fontMetrics.descender > tmpLineLayout.descender )
+        // Sets the minimum descender.
+        if( -fontMetrics.descender < tmpLineLayout.descender )
         {
-          tmpLineLayout.descender = -fontMetrics.descender;
+          tmpLineLayout.descender = fontMetrics.descender;
         }
 
         lastFontId = glyphInfo.fontId;
@@ -437,7 +445,7 @@ struct LayoutEngine::Impl
       // 2) Calculate the alignment offset accordingly with the align option,
       //    the box width, line length, and the paragraphs direction.
       float alignOffset = CalculateHorizontalAlignment( layoutSize.width,
-                                                        line.lineSize.width,
+                                                        line.width,
                                                         line.extraLength,
                                                         paragraphDirection );
 
@@ -472,8 +480,9 @@ struct LayoutEngine::Impl
     lineRun.numberOfGlyphs = layoutParameters.totalNumberOfGlyphs;
     lineRun.characterRun.characterIndex = 0u;
     lineRun.characterRun.numberOfCharacters = *( layoutParameters.glyphsToCharactersBuffer + lastGlyphIndex ) + *( layoutParameters.charactersPerGlyphBuffer + lastGlyphIndex );
-    lineRun.lineSize.width = layout.length;
-    lineRun.lineSize.height = layout.ascender + layout.descender;
+    lineRun.width = layout.length;
+    lineRun.ascender = layout.ascender;
+    lineRun.descender = layout.descender;
     lineRun.extraLength = layout.wsLengthEndOfLine;
     lineRun.direction = false;
 
@@ -481,7 +490,7 @@ struct LayoutEngine::Impl
 
     // Update the actual size.
     actualSize.width = layout.length;
-    actualSize.height = lineRun.lineSize.height;
+    actualSize.height = lineRun.ascender + -lineRun.descender;
 
     float penX = 0.f;
     float penY = layout.ascender;
@@ -531,8 +540,9 @@ struct LayoutEngine::Impl
       lineRun.numberOfGlyphs = layout.numberOfGlyphs;
       lineRun.characterRun.characterIndex = *( layoutParameters.glyphsToCharactersBuffer + index );
       lineRun.characterRun.numberOfCharacters = ( *( layoutParameters.glyphsToCharactersBuffer + lastGlyphIndex ) + *( layoutParameters.charactersPerGlyphBuffer + lastGlyphIndex ) ) - lineRun.characterRun.characterIndex;
-      lineRun.lineSize.width = layout.length + ( ( layout.widthAdvanceDiff > 0.f ) ? layout.widthAdvanceDiff : 0.f );
-      lineRun.lineSize.height = layout.ascender + layout.descender;
+      lineRun.width = layout.length + ( ( layout.widthAdvanceDiff > 0.f ) ? layout.widthAdvanceDiff : 0.f );
+      lineRun.ascender = layout.ascender;
+      lineRun.descender = layout.descender;
       lineRun.extraLength = layout.wsLengthEndOfLine;
       lineRun.direction = false;
 
@@ -544,7 +554,7 @@ struct LayoutEngine::Impl
         actualSize.width = layout.length;
       }
 
-      actualSize.height += lineRun.lineSize.height;
+      actualSize.height += ( lineRun.ascender + -lineRun.descender );
 
       // Traverse the glyphs and set the positions.
 
@@ -562,7 +572,7 @@ struct LayoutEngine::Impl
         penX += glyph.advance;
       }
 
-      penY += layout.descender;
+      penY += -layout.descender;
 
       // Increase the glyph index.
       index += layout.numberOfGlyphs;
index 7df4bec..a71dc0f 100644 (file)
@@ -41,7 +41,9 @@ struct LineRun
   GlyphIndex         glyphIndex;     ///< The initial glyph index.
   Length             numberOfGlyphs; ///< The number of glyphs of the run.
   CharacterRun       characterRun;   ///< The initial character and the number of characters.
-  Size               lineSize;       ///< The size of the line.
+  float              width;          ///< The line's width.
+  float              ascender;       ///< The line's ascender.
+  float              descender;      ///< The line's descender.
   float              extraLength;    ///< The length of the white spaces at the end of the line.
   CharacterDirection direction;      ///< Direction of the first character of the paragraph.
 };
index 15d79a1..0796311 100644 (file)
@@ -359,7 +359,7 @@ struct Controller::TextInput
 
       // TODO - multi-line selection
       const Vector<LineRun>& lines = mVisualModel->mLines;
-      float height = lines.Count() ? lines[0].lineSize.height : 0.0f;
+      float height = lines.Count() ? lines[0].ascender + -lines[0].descender : 0.0f;
 
       mDecorator->SetPosition( PRIMARY_SELECTION_HANDLE,   primaryX,   0.0f, height );
       mDecorator->SetPosition( SECONDARY_SELECTION_HANDLE, secondaryX, 0.0f, height );
@@ -438,7 +438,8 @@ struct Controller::TextInput
     const Vector<LineRun>& lines = mVisualModel->mLines;
     for( float totalHeight = 0; lineIndex < lines.Count(); ++lineIndex )
     {
-      totalHeight += lines[lineIndex].lineSize.height;
+      const LineRun& lineRun = lines[lineIndex];
+      totalHeight += lineRun.ascender + -lineRun.descender;
       if( y < totalHeight )
       {
         return lineIndex;
@@ -515,7 +516,7 @@ struct Controller::TextInput
     }
     visualY = 0.0f;
 
-    height = line.lineSize.height;
+    height = line.ascender + -line.descender;
   }
 
   void UpdateCursorPosition()
@@ -559,7 +560,8 @@ struct Controller::TextInput
         lastGlyph = (lineRuns[lineIndex].glyphIndex + lineRuns[lineIndex].numberOfGlyphs);
         if( cursorGlyph < lastGlyph )
         {
-          height = lineRuns[lineIndex].lineSize.height;
+          const LineRun& lineRun = lineRuns[lineIndex];
+          height = lineRun.ascender + -lineRun.descender;
           break;
         }
       }
index 3a0fe9b..3bc1761 100644 (file)
@@ -95,7 +95,9 @@ std::ostream& operator<< (std::ostream& o, const Vector<LineRun>& lineRuns)
     // e.g. Print "Line 0 Glyphs: 0->9 Characters: 0->9 (10)" for a ten character run staring from beginning of the model
     o << "Line " << i << " Glyphs: " << lineRuns[i].glyphIndex << "->" << (lineRuns[i].glyphIndex + lineRuns[i].numberOfGlyphs );
     o << " Characters: " << lineRuns[i].characterRun.characterIndex << "->" << (lineRuns[i].characterRun.characterIndex + lineRuns[i].characterRun.numberOfCharacters );
-    o << " Size: " << lineRuns[i].lineSize;
+    o << " Width: " << lineRuns[i].width;
+    o << " Ascender: " << lineRuns[i].ascender;
+    o << " Descender: " << lineRuns[i].descender;
 
     if( i+1 < lineRuns.Count() )
     {