TextLabel::GetHeightForWidth() implementation. 36/35636/2
authorVictor Cebollada <v.cebollada@samsung.com>
Fri, 20 Feb 2015 08:45:23 +0000 (08:45 +0000)
committerVictor Cebollada <v.cebollada@samsung.com>
Mon, 23 Feb 2015 08:34:12 +0000 (08:34 +0000)
Change-Id: Iaa9e3895668b0e38246c4a5c06a18086d3f2ab4d
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
12 files changed:
dali-toolkit/internal/controls/text-controls/text-label-impl.cpp
dali-toolkit/internal/controls/text-controls/text-label-impl.h
dali-toolkit/public-api/text/layouts/layout-engine.cpp
dali-toolkit/public-api/text/layouts/layout-engine.h
dali-toolkit/public-api/text/rendering/basic/text-basic-renderer.cpp
dali-toolkit/public-api/text/text-controller.cpp
dali-toolkit/public-api/text/text-controller.h
dali-toolkit/public-api/text/text-view-interface.h
dali-toolkit/public-api/text/text-view.cpp
dali-toolkit/public-api/text/text-view.h
dali-toolkit/public-api/text/visual-model.cpp
dali-toolkit/public-api/text/visual-model.h

index c498f0e..93c5500 100644 (file)
@@ -130,6 +130,16 @@ void TextLabel::OnInitialize()
   mController = Text::Controller::New();
 }
 
+Vector3 TextLabel::GetNaturalSize()
+{
+  return mController->GetNaturalSize();
+}
+
+float TextLabel::GetHeightForWidth( float width )
+{
+  return mController->GetHeightForWidth( width );
+}
+
 void TextLabel::OnRelayout( const Vector2& size, ActorSizeContainer& container )
 {
   if( mController->Relayout( size ) )
index 3ea01f2..ab29fc9 100644 (file)
@@ -86,6 +86,16 @@ private: // From Control
    */
   virtual void OnRelayout( const Vector2& size, ActorSizeContainer& container );
 
+  /**
+   * @copydoc Control::GetNaturalSize()
+   */
+  virtual Vector3 GetNaturalSize();
+
+  /**
+   * @copydoc Control::GetHeightForWidth()
+   */
+  virtual float GetHeightForWidth( float width );
+
 private: // Implementation
 
   /**
index 698832d..cfdd9d4 100644 (file)
@@ -84,7 +84,7 @@ struct LayoutEngine::Impl
       // FIXME Single font assumption
       Text::FontMetrics fontMetrics;
       GlyphInfo firstGlyph;
-      visualModel.GetGlyphs( 0, &firstGlyph, 1 );
+      visualModel.GetGlyphs( &firstGlyph, 0, 1 );
       mFontClient.GetFontMetrics( firstGlyph.fontId, fontMetrics );
 
       float penX( 0 );
@@ -93,7 +93,7 @@ struct LayoutEngine::Impl
       for( unsigned int i=0; i<glyphCount; ++i )
       {
         GlyphInfo glyph;
-        visualModel.GetGlyphs( i, &glyph, 1 );
+        visualModel.GetGlyphs( &glyph, i, 1 );
 
         glyphPositions.push_back( Vector2( penX + glyph.xBearing,
                                            penY - glyph.yBearing ) );
@@ -115,10 +115,12 @@ struct LayoutEngine::Impl
 
     if( glyphCount > 0 )
     {
+      Size actualSize;
+
       // FIXME Single font assumption
       Text::FontMetrics fontMetrics;
       GlyphInfo firstGlyph;
-      visualModel.GetGlyphs( 0, &firstGlyph, 1 );
+      visualModel.GetGlyphs( &firstGlyph, 0, 1 );
       mFontClient.GetFontMetrics( firstGlyph.fontId, fontMetrics );
 
       float penX( 0 );
@@ -131,7 +133,7 @@ struct LayoutEngine::Impl
         for( ; i<glyphCount; ++i )
         {
           GlyphInfo glyph;
-          visualModel.GetGlyphs( i, &glyph, 1 );
+          visualModel.GetGlyphs( &glyph, i, 1 );
 
           if( glyph.width  > 0 &&
               glyph.height > 0 )
@@ -152,7 +154,7 @@ struct LayoutEngine::Impl
         for( ; j<glyphCount; ++j )
         {
           GlyphInfo glyph;
-          visualModel.GetGlyphs( j, &glyph, 1 );
+          visualModel.GetGlyphs( &glyph, j, 1 );
 
           endPenX += glyph.advance;
 
@@ -164,6 +166,7 @@ struct LayoutEngine::Impl
           }
           else if( endPenX > boundingBox.width )
           {
+            actualSize.width = ( actualSize.width < endPenX - glyph.advance ) ? endPenX - glyph.advance : actualSize.width;
             break;
           }
         }
@@ -178,7 +181,7 @@ struct LayoutEngine::Impl
         for( ; i<endIndex; ++i )
         {
           GlyphInfo glyph;
-          visualModel.GetGlyphs( i, &glyph, 1 );
+          visualModel.GetGlyphs( &glyph, i, 1 );
 
           glyphPositions.push_back( Vector2( penX + glyph.xBearing,
                                              penY - glyph.yBearing ) );
@@ -189,9 +192,13 @@ struct LayoutEngine::Impl
         // Go to next line
         penX = 0;
         penY += fontMetrics.height;
+
+        actualSize.height += fontMetrics.height;
       }
 
       visualModel.SetGlyphPositions( &glyphPositions[0], glyphCount );
+
+      visualModel.SetActualSize( actualSize );
     }
   }
 
index aecb6d7..6fbaa3a 100644 (file)
@@ -286,11 +286,11 @@ RenderableActor BasicRenderer::Render( Text::ViewInterface& view )
     Vector<GlyphInfo> glyphs;
     glyphs.Resize( numberOfGlyphs );
 
-    view.GetGlyphs( 0, &glyphs[0], numberOfGlyphs );
+    view.GetGlyphs( &glyphs[0], 0, numberOfGlyphs );
 
     std::vector<Vector2> positions;
     positions.resize( numberOfGlyphs );
-    view.GetGlyphPositions( 0, &positions[0], numberOfGlyphs );
+    view.GetGlyphPositions( &positions[0], 0, numberOfGlyphs );
 
     Atlas atlas = mImpl->CreateAtlas( glyphs );
 
index 2592653..ceae8ca 100644 (file)
@@ -18,9 +18,6 @@
 // CLASS HEADER
 #include <dali-toolkit/public-api/text/text-controller.h>
 
-// EXTERNAL INCLUDES
-#include <dali/public-api/text-abstraction/font-client.h>
-
 // INTERNAL INCLUDES
 #include <dali-toolkit/public-api/text/character-set-conversion.h>
 #include <dali-toolkit/public-api/text/layouts/layout-engine.h>
 #include <dali-toolkit/public-api/text/text-view.h>
 #include <dali-toolkit/public-api/text/visual-model.h>
 
+// EXTERNAL INCLUDES
+#include <dali/public-api/text-abstraction/font-client.h>
+#include <limits>
+
 namespace Dali
 {
 
@@ -43,7 +44,8 @@ namespace Text
 struct Controller::Impl
 {
   Impl()
-  : mNewTextArrived( false )
+  : mNewText(),
+    mOperations( NO_OPERATION )
   {
     mLogicalModel = LogicalModel::New();
     mVisualModel  = VisualModel::New();
@@ -54,7 +56,6 @@ struct Controller::Impl
   }
 
   std::string mNewText;
-  bool mNewTextArrived;
 
   LogicalModelPtr mLogicalModel;
   VisualModelPtr  mVisualModel;
@@ -64,6 +65,8 @@ struct Controller::Impl
   LayoutEngine mLayoutEngine;
 
   TextAbstraction::FontClient mFontClient;
+
+  OperationsMask mOperations;
 };
 
 ControllerPtr Controller::New()
@@ -75,45 +78,111 @@ void Controller::SetText( const std::string& text )
 {
   // Keep until size negotiation
   mImpl->mNewText = text;
-  mImpl->mNewTextArrived = true;
+  mImpl->mOperations = ALL_OPERATIONS;
 }
 
 bool Controller::Relayout( const Vector2& size )
 {
+  if( ( size.width < Math::MACHINE_EPSILON_1000 ) || ( size.height < Math::MACHINE_EPSILON_1000 ) )
+  {
+    // Not worth to relayout if width or height is equal to zero.
+    return false;
+  }
+
+  bool viewUpdated = false;
+
+  if( size != mControlSize )
+  {
+    viewUpdated = DoRelayout( size, mImpl->mOperations );
+
+    // Do not re-do any operation until something changes.
+    mImpl->mOperations = NO_OPERATION;
+
+    mControlSize = size;
+  }
+
+  return viewUpdated;
+}
+
+bool Controller::DoRelayout( const Vector2& size, OperationsMask operations )
+{
   bool viewUpdated( false );
 
-  if( mImpl->mNewTextArrived )
+  Vector<Character> utf32Characters;
+  Length characterCount = 0u;
+  if( CONVERT_TO_UTF32 & operations )
   {
     std::string& text = mImpl->mNewText;
 
     //  Convert text into UTF-32
-    Vector<Character> utf32Characters;
     utf32Characters.Resize( text.size() );
 
     // This is a bit horrible but std::string returns a (signed) char*
     const uint8_t* utf8 = reinterpret_cast<const uint8_t*>( text.c_str() );
 
-    Length characterCount = Utf8ToUtf32( utf8, text.size(), &utf32Characters[0] );
+    // Transform a text array encoded in utf8 into an array encoded in utf32.
+    // It returns the actual number of characters.
+    characterCount = Utf8ToUtf32( utf8, text.size(), utf32Characters.Begin() );
     utf32Characters.Resize( characterCount );
 
-    Vector<ScriptRun> scripts;
+    // Sets the text into the model.
+    mImpl->mLogicalModel->SetText( utf32Characters.Begin(), characterCount );
+
+    // Discard temporary text
+    text.clear();
+  }
+
+  const bool getScripts = GET_SCRIPTS & operations;
+  const bool validateFonts = VALIDATE_FONTS & operations;
+
+  Vector<ScriptRun> scripts;
+  Vector<FontRun> fonts;
+  if( getScripts || validateFonts )
+  {
+    // Validates the fonts assigned by the application or assigns default ones.
+    // It makes sure all the characters are going to be rendered by the correct font.
     MultilanguageSupport multilanguageSupport = MultilanguageSupport::Get();
 
-    multilanguageSupport.SetScripts( utf32Characters,
-                                     scripts );
+    if( getScripts )
+    {
+      // Retrieves the scripts used in the text.
+      multilanguageSupport.SetScripts( utf32Characters,
+                                       scripts );
 
-    Vector<FontRun> fonts;
-    multilanguageSupport.ValidateFonts( utf32Characters,
-                                        scripts,
-                                        fonts );
+      // Sets the scripts into the model.
+      mImpl->mLogicalModel->SetScripts( scripts.Begin(), scripts.Count() );
+    }
 
-    Vector<LineBreakInfo> lineBreakInfo;
-    lineBreakInfo.Resize( characterCount, TextAbstraction::LINE_NO_BREAK );
+    if( validateFonts )
+    {
+      // Validates the fonts. If there is a character with no assigned font it sets a default one.
+      // After this call, fonts are validated.
+      multilanguageSupport.ValidateFonts( utf32Characters,
+                                          scripts,
+                                          fonts );
+
+      // Sets the fonts into the model.
+      mImpl->mLogicalModel->SetFonts( fonts.Begin(), fonts.Count() );
+    }
+  }
 
-    Vector<GlyphInfo> glyphs;
-    Vector<CharacterIndex> characterIndices;
-    Vector<Length> charactersPerGlyph;
+  Vector<LineBreakInfo> lineBreakInfo;
+  if( GET_LINE_BREAKS & operations )
+  {
+    // Retrieves the line break info. The line break info is used to split the text in 'paragraphs' to
+    // calculate the bidirectional info for each 'paragraph'.
+    // It's also used to layout the text (where it should be a new line) or to shape the text (text in different lines
+    // is not shaped together).
+    lineBreakInfo.Resize( characterCount, TextAbstraction::LINE_NO_BREAK );
+    mImpl->mLogicalModel->SetLineBreakInfo( lineBreakInfo.Begin(), characterCount );
+  }
 
+  Vector<GlyphInfo> glyphs;
+  Vector<CharacterIndex> characterIndices;
+  Vector<Length> charactersPerGlyph;
+  if( SHAPE_TEXT & operations )
+  {
+    // Shapes the text.
     ShapeText( utf32Characters,
                lineBreakInfo,
                scripts,
@@ -121,26 +190,42 @@ bool Controller::Relayout( const Vector2& size )
                glyphs,
                characterIndices,
                charactersPerGlyph );
+  }
 
-    // Manipulate the logical model
-    mImpl->mLogicalModel->SetText( &utf32Characters[0], characterCount );
-    mImpl->mLogicalModel->SetLineBreakInfo( &lineBreakInfo[0], characterCount );
-    mImpl->mLogicalModel->SetScripts( &scripts[0], scripts.Count() );
-    mImpl->mLogicalModel->SetFonts( &fonts[0], fonts.Count() );
+  if( GET_GLYPH_METRICS & operations )
+  {
+    TextAbstraction::FontClient::Get().GetGlyphMetrics( glyphs.Begin(), glyphs.Count() );
+  }
 
-    if( TextAbstraction::FontClient::Get().GetGlyphMetrics( &glyphs[0], glyphs.Size() ) )
+  if( LAYOUT & operations )
+  {
+    if( 0u == glyphs.Count() )
     {
-      // Update the visual model
-      mImpl->mLayoutEngine.UpdateVisualModel( size,
-                                              glyphs,
-                                              characterIndices,
-                                              charactersPerGlyph,
-                                              *mImpl->mVisualModel );
+      const Length numberOfGlyphs = mImpl->mVisualModel->GetNumberOfGlyphs();
+
+      glyphs.Resize( numberOfGlyphs );
+      characterIndices.Resize( numberOfGlyphs );
+      charactersPerGlyph.Resize( numberOfGlyphs );
+
+      mImpl->mVisualModel->GetGlyphs( glyphs.Begin(),
+                                      0u,
+                                      numberOfGlyphs );
+      
+      mImpl->mVisualModel->GetGlyphToCharacterMap( characterIndices.Begin(),
+                                                   0u,
+                                                   numberOfGlyphs );
+
+      mImpl->mVisualModel->GetCharactersPerGlyphMap( charactersPerGlyph.Begin(),
+                                                     0u,
+                                                     numberOfGlyphs );
     }
 
-    // Discard temporary text
-    mImpl->mNewTextArrived = false;
-    text.clear();
+    // Update the visual model
+    mImpl->mLayoutEngine.UpdateVisualModel( size,
+                                            glyphs,
+                                            characterIndices,
+                                            charactersPerGlyph,
+                                            *mImpl->mVisualModel );
 
     viewUpdated = true;
   }
@@ -148,6 +233,63 @@ bool Controller::Relayout( const Vector2& size )
   return viewUpdated;
 }
 
+Vector3 Controller::GetNaturalSize()
+{
+  // Operations that can be done only once until the text changes.
+  const OperationsMask onlyOnceOperations = static_cast<OperationsMask>( CONVERT_TO_UTF32 |
+                                                                         GET_SCRIPTS      |
+                                                                         VALIDATE_FONTS   |
+                                                                         GET_LINE_BREAKS  |
+                                                                         GET_WORD_BREAKS  |
+                                                                         SHAPE_TEXT       |
+                                                                         GET_GLYPH_METRICS );
+
+  // Operations that need to be done if the size or the text changes.
+  const OperationsMask sizeOperations =  static_cast<OperationsMask>( LAYOUT |
+                                                                      REORDER );
+
+  const float maxFloat = std::numeric_limits<float>::max();
+  DoRelayout( Vector2( maxFloat, maxFloat ),
+              static_cast<OperationsMask>( onlyOnceOperations |
+                                           sizeOperations ) );
+
+  // Do not do again the only once operations.
+  mImpl->mOperations = static_cast<OperationsMask>( mImpl->mOperations & ~onlyOnceOperations );
+
+  // Do the size related operations again.
+  mImpl->mOperations = static_cast<OperationsMask>( mImpl->mOperations | sizeOperations );
+
+  return Vector3( mImpl->mVisualModel->GetNaturalSize() );
+}
+
+float Controller::GetHeightForWidth( float width )
+{
+  // Operations that can be done only once until the text changes.
+  const OperationsMask onlyOnceOperations = static_cast<OperationsMask>( CONVERT_TO_UTF32 |
+                                                                         GET_SCRIPTS      |
+                                                                         VALIDATE_FONTS   |
+                                                                         GET_LINE_BREAKS  |
+                                                                         GET_WORD_BREAKS  |
+                                                                         SHAPE_TEXT       |
+                                                                         GET_GLYPH_METRICS );
+
+  // Operations that need to be done if the size or the text changes.
+  const OperationsMask sizeOperations =  static_cast<OperationsMask>( LAYOUT |
+                                                                      REORDER );
+
+  DoRelayout( Size( width, 0.f ),
+              static_cast<OperationsMask>( onlyOnceOperations |
+                                           sizeOperations ) );
+
+  // Do not do again the only once operations.
+  mImpl->mOperations = static_cast<OperationsMask>( mImpl->mOperations & ~onlyOnceOperations );
+
+  // Do the size related operations again.
+  mImpl->mOperations = static_cast<OperationsMask>( mImpl->mOperations | sizeOperations );
+
+  return mImpl->mVisualModel->GetActualSize().height;
+}
+
 View& Controller::GetView()
 {
   return mImpl->mView;
@@ -164,7 +306,8 @@ Controller::~Controller()
 }
 
 Controller::Controller()
-: mImpl( NULL )
+: mImpl( NULL ),
+  mControlSize()
 {
   mImpl = new Controller::Impl();
 }
index 3155015..25ad189 100644 (file)
  */
 
 // INTERNAL INCLUDES
-#include <dali/public-api/common/intrusive-ptr.h>
-#include <dali/public-api/object/ref-object.h>
 #include <dali-toolkit/public-api/text/text-view.h>
 
 // EXTERNAL INCLUDES
+#include <dali/public-api/common/intrusive-ptr.h>
+#include <dali/public-api/math/vector3.h>
+#include <dali/public-api/math/vector2.h>
+#include <dali/public-api/object/ref-object.h>
 #include <string>
 
 namespace Dali
@@ -48,6 +50,28 @@ typedef IntrusivePtr<Controller> ControllerPtr;
  */
 class Controller : public RefObject
 {
+private:
+
+  /**
+   * @brief Text related operations to be done in the relayout process.
+   */
+  enum OperationsMask
+  {
+    NO_OPERATION      = 0x0,
+    CONVERT_TO_UTF32  = 0x1,
+    GET_SCRIPTS       = 0x2,
+    VALIDATE_FONTS    = 0x4,
+    GET_LINE_BREAKS   = 0x8,
+    GET_WORD_BREAKS   = 0x10,
+    SHAPE_TEXT        = 0x20,
+    GET_GLYPH_METRICS = 0x40,
+    LAYOUT            = 0x80,
+    REORDER           = 0x100,
+    ALIGNEMENT        = 0x200,
+    RENDER            = 0x400,
+    ALL_OPERATIONS    = 0xFFF
+  };
+
 public:
 
   /**
@@ -75,6 +99,21 @@ public:
   bool Relayout( const Vector2& size );
 
   /**
+   *
+   */
+  bool DoRelayout( const Vector2& size, OperationsMask operations );
+
+  /**
+   * @copydoc Control::GetNaturalSize()
+   */
+  Vector3 GetNaturalSize();
+
+  /**
+   * @copydoc Control::GetHeightForWidth()
+   */
+  float GetHeightForWidth( float width );
+
+  /**
    * @brief Return the layout engine.
    *
    * @return A reference to the layout engine.
@@ -117,7 +156,10 @@ private:
 
   struct Impl;
   Impl* mImpl;
+
+  Size mControlSize;
 };
+
 } // namespace Text
 
 } // namespace Toolkit
index a440209..c15cda1 100644 (file)
@@ -69,20 +69,20 @@ public:
    * @param[in] glyphIndex Index to the first glyph.
    * @param[in] numberOfGlyphs Number of glyphs to be copied.
    */
-  virtual void GetGlyphs( GlyphIndex glyphIndex,
-                          GlyphInfo* glyphs,
+  virtual void GetGlyphs( GlyphInfo* glyphs,
+                          GlyphIndex glyphIndex,
                           Length numberOfGlyphs ) const = 0;
 
   /**
    * @brief Retrieves the glyph positions.
    *
    * @pre The size of the @p positions buffer needs to be big enough to copy the @p numberOfGlyphs positions.
-   * @param[in] glyphIndex Index to the first glyph position.
    * @param[out] glyphPositions Pointer to a buffer where the glyph positions are copied.
+   * @param[in] glyphIndex Index to the first glyph position.
    * @param[in] numberOfGlyphs The number of positions to be copied.
    */
-  virtual void GetGlyphPositions( GlyphIndex glyphIndex,
-                                  Vector2* glyphPositions,
+  virtual void GetGlyphPositions( Vector2* glyphPositions,
+                                  GlyphIndex glyphIndex,
                                   Length numberOfGlyphs ) const = 0;
 };
 
index 37dbbbb..01e7531 100644 (file)
@@ -61,23 +61,23 @@ Length View::GetNumberOfGlyphs() const
   return 0;
 }
 
-void View::GetGlyphs( GlyphIndex glyphIndex,
-                      GlyphInfo* glyphs,
+void View::GetGlyphs( GlyphInfo* glyphs,
+                      GlyphIndex glyphIndex,
                       Length numberOfGlyphs ) const
 {
   if( mImpl->mVisualModel )
   {
-    mImpl->mVisualModel->GetGlyphs( glyphIndex, glyphs, numberOfGlyphs );
+    mImpl->mVisualModel->GetGlyphs( glyphs, glyphIndex, numberOfGlyphs );
   }
 }
 
-void View::GetGlyphPositions( GlyphIndex glyphIndex,
-                              Vector2* glyphPositions,
+void View::GetGlyphPositions( Vector2* glyphPositions,
+                              GlyphIndex glyphIndex,
                               Length numberOfGlyphs ) const
 {
   if( mImpl->mVisualModel )
   {
-    mImpl->mVisualModel->GetGlyphPositions( glyphIndex, glyphPositions, numberOfGlyphs );
+    mImpl->mVisualModel->GetGlyphPositions( glyphPositions, glyphIndex, numberOfGlyphs );
   }
 }
 
index 81c63dd..432f5c5 100644 (file)
@@ -65,15 +65,15 @@ public:
   /**
    * @copydoc Dali::Toolkit::Text::ViewInterface::GetGlyphs()
    */
-  virtual void GetGlyphs( GlyphIndex glyphIndex,
-                          GlyphInfo* glyphs,
+  virtual void GetGlyphs( GlyphInfo* glyphs,
+                          GlyphIndex glyphIndex,
                           Length numberOfGlyphs ) const;
 
   /**
    * @copydoc Dali::Toolkit::Text::ViewInterface::GetGlyphPositions()
    */
-  virtual void GetGlyphPositions( GlyphIndex glyphIndex,
-                                  Vector2* glyphPositions,
+  virtual void GetGlyphPositions( Vector2* glyphPositions,
+                                  GlyphIndex glyphIndex,
                                   Length numberOfGlyphs ) const;
 
 private:
index 20285a6..b75005d 100644 (file)
@@ -44,6 +44,9 @@ struct VisualModel::Impl
   Vector<CharacterIndex> mGlyphsToCharacters;
   Vector<Length>         mCharactersPerGlyph;
   std::vector<Vector2>   mGlyphPositions;
+
+  Size                   mNaturalSize;
+  Size                   mActualSize;
 };
 
 VisualModelPtr VisualModel::New()
@@ -74,8 +77,8 @@ Length VisualModel::GetNumberOfGlyphs() const
   return mImpl->mGlyphs.Count();
 }
 
-void VisualModel::GetGlyphs( GlyphIndex glyphIndex,
-                             GlyphInfo* glyphs,
+void VisualModel::GetGlyphs( GlyphInfo* glyphs,
+                             GlyphIndex glyphIndex,
                              Length numberOfGlyphs ) const
 {
   Vector<GlyphInfo>& modelGlyphs = mImpl->mGlyphs;
@@ -139,8 +142,8 @@ void VisualModel::SetGlyphPositions( const Vector2* glyphPositions,
   memcpy( &modelPositions[0], glyphPositions, numberOfGlyphs*sizeof(Vector2) );
 }
 
-void VisualModel::GetGlyphPositions( GlyphIndex glyphIndex,
-                                     Vector2* glyphPositions,
+void VisualModel::GetGlyphPositions( Vector2* glyphPositions,
+                                     GlyphIndex glyphIndex,
                                      Length numberOfGlyphs ) const
 {
   std::vector<Vector2>& modelPositions = mImpl->mGlyphPositions;
@@ -182,20 +185,22 @@ void VisualModel::GetLinesOfGlyphRange( LineRun* lines,
 
 void VisualModel::SetNaturalSize( const Vector2& size  )
 {
+  mImpl->mNaturalSize = size;
 }
 
 const Vector2& VisualModel::GetNaturalSize() const
 {
-  return Vector2::ZERO;
+  return mImpl->mNaturalSize;
 }
 
 void VisualModel::SetActualSize( const Vector2& size )
 {
+  mImpl->mActualSize = size;
 }
 
 const Vector2& VisualModel::GetActualSize() const
 {
-  return Vector2::ZERO;
+  return mImpl->mActualSize;
 }
 
 VisualModel::~VisualModel()
index 71b0514..0cfa4b5 100644 (file)
@@ -86,8 +86,8 @@ public:
    * @param[in] glyphIndex Index to the first glyph.
    * @param[in] numberOfGlyphs Number of glyphs to be copied.
    */
-  void GetGlyphs( GlyphIndex glyphIndex,
-                  GlyphInfo* glyphs,
+  void GetGlyphs( GlyphInfo* glyphs,
+                  GlyphIndex glyphIndex,
                   Length numberOfGlyphs ) const;
 
   /**
@@ -181,12 +181,12 @@ public:
    * @brief Retrieves the glyph positions.
    *
    * @pre The size of the @p positions buffer needs to be big enough to copy the @p numberOfGlyphs positions.
-   * @param[in] glyphIndex Index to the first glyph position.
    * @param[out] glyphPositions Pointer to a buffer where the glyph positions are copied.
+   * @param[in] glyphIndex Index to the first glyph position.
    * @param[in] numberOfGlyphs The number of positions to be copied.
    */
-  void GetGlyphPositions( GlyphIndex glyphIndex,
-                          Vector2* glyphPositions,
+  void GetGlyphPositions( Vector2* glyphPositions,
+                          GlyphIndex glyphIndex,
                           Length numberOfGlyphs ) const;
 
   /**