Text - Fix for emojis resampling. 31/116331/12
authorVictor Cebollada <v.cebollada@samsung.com>
Thu, 23 Feb 2017 17:51:39 +0000 (17:51 +0000)
committerVictor Cebollada <v.cebollada@samsung.com>
Mon, 27 Feb 2017 10:37:10 +0000 (10:37 +0000)
* Clears the texture when a new atlas is created.
* Query the emoji bitmaps with the desired size.
* Uses the shadow's color for emoji's shadows.

Change-Id: I262f04a59cae6c1d9b2f5b15410843f4a3020219
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
12 files changed:
automated-tests/resources/fonts/tizen/BreezeColorEmoji.ttf [new file with mode: 0644]
automated-tests/resources/fonts/tizen/TizenColorEmoji.ttf [deleted file]
automated-tests/src/dali-toolkit-internal/utc-Dali-Text-MultiLanguage.cpp
automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Typesetter.cpp
automated-tests/src/dali-toolkit/utc-Dali-TextLabel.cpp
dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp
dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.h
dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.cpp
dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager.h
dali-toolkit/internal/text/rendering/atlas/atlas-manager-impl.cpp
dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp
dali-toolkit/internal/text/rendering/text-typesetter.cpp

diff --git a/automated-tests/resources/fonts/tizen/BreezeColorEmoji.ttf b/automated-tests/resources/fonts/tizen/BreezeColorEmoji.ttf
new file mode 100644 (file)
index 0000000..2a6b046
Binary files /dev/null and b/automated-tests/resources/fonts/tizen/BreezeColorEmoji.ttf differ
diff --git a/automated-tests/resources/fonts/tizen/TizenColorEmoji.ttf b/automated-tests/resources/fonts/tizen/TizenColorEmoji.ttf
deleted file mode 100644 (file)
index 25234ea..0000000
Binary files a/automated-tests/resources/fonts/tizen/TizenColorEmoji.ttf and /dev/null differ
index eba6b05..3904faa 100644 (file)
@@ -69,7 +69,7 @@ namespace
 {
 
 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
-const unsigned int EMOJI_FONT_SIZE = 3968u;
+const unsigned int EMOJI_FONT_SIZE = 3840u; // 60 * 64
 const unsigned int NON_DEFAULT_FONT_SIZE = 40u;
 
 struct MergeFontDescriptionsData
@@ -1303,7 +1303,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
   // Load some fonts.
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
-  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenColorEmoji.ttf", EMOJI_FONT_SIZE );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/BreezeColorEmoji.ttf", EMOJI_FONT_SIZE );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf", pointSize01 );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf", pointSize02 );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf", pointSize01 );
@@ -1311,7 +1311,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
 
   // Font id 1 --> TizenSansArabicRegular.ttf
   // Font id 2 --> TizenSansHebrewRegular.ttf
-  // Font id 3 --> TizenColorEmoji.ttf
+  // Font id 3 --> BreezeColorEmoji.ttf
   // Font id 4 --> TizenSansRegular.ttf, size 8
   // Font id 5 --> TizenSansRegular.ttf, size 16
   // Font id 6 --> TizenSansHebrewRegular.ttf, size 8
@@ -1484,8 +1484,8 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
       0u,
       4u
     },
-    const_cast<char*>( "TizenColorEmoji" ),
-    15u,
+    const_cast<char*>( "BreezeColorEmoji" ),
+    16u,
     TextAbstraction::FontWeight::NORMAL,
     TextAbstraction::FontWidth::NORMAL,
     TextAbstraction::FontSlant::NORMAL,
@@ -1699,7 +1699,7 @@ int UtcDaliTextMultiLanguageValidateFonts01(void)
     {
       "Emojis",
       "\xF0\x9F\x98\x81\xF0\x9F\x98\x82\xF0\x9F\x98\x83\xF0\x9F\x98\x84",
-      "/tizen/TizenColorEmoji.ttf",
+      "/tizen/BreezeColorEmoji.ttf",
       EMOJI_FONT_SIZE,
       0u,
       4u,
index 63f9a22..e742a9e 100644 (file)
@@ -35,7 +35,7 @@ using namespace Text;
 namespace
 {
 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
-const PointSize26Dot6 EMOJI_FONT_SIZE = 62u * 64u;
+const PointSize26Dot6 EMOJI_FONT_SIZE = 3840u; // 60 * 64
 } // namespace
 
 int UtcDaliTextTypesetter(void)
@@ -86,7 +86,7 @@ int UtcDaliTextRenderingControllerRender(void)
   const std::string pathName( pathNamePtr );
   free( pathNamePtr );
 
-  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenColorEmoji.ttf", EMOJI_FONT_SIZE );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/BreezeColorEmoji.ttf", EMOJI_FONT_SIZE );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
 
   // Creates a text controller.
@@ -97,7 +97,7 @@ int UtcDaliTextRenderingControllerRender(void)
 
   // Sets the text.
   controller->SetMarkupProcessorEnabled( true );
-  controller->SetText( "<font family='TizenSansRegular'>Hello world </font><font family='TizenColorEmoji'>\xF0\x9F\x98\x81</font>" );
+  controller->SetText( "<font family='TizenSansRegular'>Hello world </font><font family='BreezeColorEmoji'>\xF0\x9F\x98\x81</font>" );
 
   // Creates the text's model and relais-out the text.
   const Size relayoutSize( 120.f, 60.f );
index aa2ca31..9e00636 100644 (file)
@@ -66,7 +66,7 @@ const char* const PROPERTY_NAME_OUTLINE = "outline";
 
 const int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND;
 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
-const unsigned int EMOJI_FONT_SIZE = 3968u;
+const unsigned int EMOJI_FONT_SIZE = 3840u; // 60 * 64
 
 bool DaliTestCheckMaps( const Property::Map& fontStyleMapGet, const Property::Map& fontStyleMapSet )
 {
@@ -486,15 +486,34 @@ int UtcDaliToolkitTextLabelLanguagesP(void)
   application.SendNotification();
   application.Render();
 
+  END_TEST;
+}
+
+int UtcDaliToolkitTextLabelEmojisP(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliToolkitTextLabelLanguagesP");
+  TextLabel label = TextLabel::New();
+  DALI_TEST_CHECK( label );
+
+  Stage::GetCurrent().Add( label );
+
   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
 
   char* pathNamePtr = get_current_dir_name();
   const std::string pathName( pathNamePtr );
   free( pathNamePtr );
 
-  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenColorEmoji.ttf", EMOJI_FONT_SIZE );
+  TextAbstraction::FontDescription fontDescription;
+  fontDescription.path = pathName + DEFAULT_FONT_DIR + "/tizen/BreezeColorEmoji.ttf";
+  fontDescription.family = "BreezeColorEmoji";
+  fontDescription.width = TextAbstraction::FontWidth::NONE;
+  fontDescription.weight = TextAbstraction::FontWeight::NORMAL;
+  fontDescription.slant = TextAbstraction::FontSlant::NONE;
+
+  fontClient.GetFontId( fontDescription, EMOJI_FONT_SIZE );
 
-  const std::string emojis = "<font family='TizenColorEmoji'>\xF0\x9F\x98\x81 \xF0\x9F\x98\x82 \xF0\x9F\x98\x83 \xF0\x9F\x98\x84</font>";
+  const std::string emojis = "<font family='BreezeColorEmoji' size='60'>\xF0\x9F\x98\x81 \xF0\x9F\x98\x82 \xF0\x9F\x98\x83 \xF0\x9F\x98\x84</font>";
   label.SetProperty( TextLabel::Property::ENABLE_MARKUP, true );
   label.SetProperty( TextLabel::Property::TEXT, emojis );
 
index 12d39a5..7e672bd 100644 (file)
@@ -27,50 +27,6 @@ namespace
   Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_RENDERING");
 #endif
 
-#define MAKE_SHADER(A)#A
-
-const char* VERTEX_SHADER = MAKE_SHADER(
-attribute mediump vec2    aPosition;
-attribute mediump vec2    aTexCoord;
-attribute mediump vec4    aColor;
-uniform   mediump vec2    uOffset;
-uniform   mediump mat4    uMvpMatrix;
-varying   mediump vec2    vTexCoord;
-varying   mediump vec4    vColor;
-
-void main()
-{
-  mediump vec4 position = vec4( aPosition.xy + uOffset, 0.0, 1.0 );
-  gl_Position = uMvpMatrix * position;
-  vTexCoord = aTexCoord;
-  vColor = aColor;
-}
-);
-
-const char* FRAGMENT_SHADER_L8 = MAKE_SHADER(
-uniform lowp    vec4      uColor;
-uniform         sampler2D sTexture;
-varying mediump vec2      vTexCoord;
-varying mediump vec4      vColor;
-
-void main()
-{
-  mediump vec4 color = texture2D( sTexture, vTexCoord );
-  gl_FragColor = vec4( vColor.rgb * uColor.rgb, vColor.a * uColor.a * color.r );
-}
-);
-
-const char* FRAGMENT_SHADER_RGBA = MAKE_SHADER(
-uniform lowp    vec4      uColor;
-uniform         sampler2D sTexture;
-varying mediump vec2      vTexCoord;
-
-void main()
-{
-  gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;
-}
-);
-
 } // unnamed namespace
 
 namespace Dali
@@ -84,8 +40,6 @@ namespace Internal
 
 AtlasGlyphManager::AtlasGlyphManager()
 {
-  mShaderL8 = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_L8 );
-  mShaderRgba = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_RGBA );
   mAtlasManager = Dali::Toolkit::AtlasManager::New();
 }
 
@@ -257,12 +211,6 @@ TextureSet AtlasGlyphManager::GetTextures( uint32_t atlasId ) const
   return mAtlasManager.GetTextures( atlasId );
 }
 
-Shader AtlasGlyphManager::GetShader( uint32_t atlasId ) const
-{
-  Pixel::Format pixelFormat = mAtlasManager.GetPixelFormat( atlasId );
-  return pixelFormat == Pixel::L8 ? mShaderL8 : mShaderRgba;
-}
-
 AtlasGlyphManager::~AtlasGlyphManager()
 {
   // mAtlasManager handle is automatically released here
index b72b649..a2232f9 100644 (file)
@@ -113,11 +113,6 @@ public:
   TextureSet GetTextures( uint32_t atlasId ) const;
 
   /**
-   * @copydoc Toolkit::AtlasGlyphManager::GetShader
-   */
-  Shader GetShader( uint32_t atlasId ) const;
-
-  /**
    * @copydoc Toolkit::AtlasGlyphManager::GetMetrics
    */
   const Toolkit::AtlasGlyphManager::Metrics& GetMetrics();
@@ -134,9 +129,6 @@ private:
   Dali::Toolkit::AtlasManager mAtlasManager;          ///> Atlas Manager created by GlyphManager
   std::vector< FontGlyphRecord > mFontGlyphRecords;
   Toolkit::AtlasGlyphManager::Metrics mMetrics;       ///> Metrics to pass back on GlyphManager status
-
-  Shader mShaderL8;
-  Shader mShaderRgba;
 };
 
 } // namespace Internal
index 6858f26..743bc6c 100644 (file)
@@ -111,11 +111,6 @@ TextureSet AtlasGlyphManager::GetTextures( uint32_t atlasId ) const
   return GetImplementation(*this).GetTextures( atlasId );
 }
 
-Shader AtlasGlyphManager::GetShader( uint32_t atlasId ) const
-{
-  return GetImplementation(*this).GetShader( atlasId );
-}
-
 const Toolkit::AtlasGlyphManager::Metrics& AtlasGlyphManager::GetMetrics()
 {
   return GetImplementation(*this).GetMetrics();
index 3ba54de..1bc058b 100644 (file)
@@ -149,15 +149,6 @@ public:
   TextureSet GetTextures( uint32_t atlasId ) const;
 
   /**
-   * @brief Get the shader used by an atlas
-   *
-   * @param[in] atlasId Id of an atlas
-   *
-   * @return The shader used by the atlas
-   */
-  Shader GetShader( uint32_t atlasId ) const;
-
-  /**
    * @brief Get Glyph Manager metrics
    *
    * @return const reference to glyph manager metrics
index bc3a70a..958749e 100644 (file)
@@ -79,6 +79,14 @@ Toolkit::AtlasManager::AtlasId AtlasManager::CreateAtlas( const Toolkit::AtlasMa
   }
 
   Dali::Texture atlas = Dali::Texture::New( TextureType::TEXTURE_2D, pixelformat, width, height );
+
+  // Clear the background
+  unsigned int bufferSize(  width * height * Dali::Pixel::GetBytesPerPixel( pixelformat ) );
+  unsigned char* background = new unsigned char[bufferSize];
+  memset( background, 0, bufferSize );
+  PixelData backgroundPixels = PixelData::New( background, bufferSize, width, height, pixelformat, PixelData::DELETE_ARRAY );
+  atlas.Upload( backgroundPixels, 0u, 0u, 0u, 0u, width, height );
+
   AtlasDescriptor atlasDescriptor;
   atlasDescriptor.mAtlas = atlas;
   atlasDescriptor.mSize = size;
@@ -86,7 +94,7 @@ Toolkit::AtlasManager::AtlasId AtlasManager::CreateAtlas( const Toolkit::AtlasMa
   atlasDescriptor.mTotalBlocks = ( ( width - 1u ) / blockWidth ) * ( ( height - 1u ) / blockHeight );
   atlasDescriptor.mAvailableBlocks = atlasDescriptor.mTotalBlocks;
 
-  unsigned int bufferSize(  blockWidth * SINGLE_PIXEL_PADDING * Dali::Pixel::GetBytesPerPixel(pixelformat) );
+  bufferSize = blockWidth * SINGLE_PIXEL_PADDING * Dali::Pixel::GetBytesPerPixel(pixelformat);
   unsigned char* bufferHorizontalStrip = new unsigned char[bufferSize];
   memset( bufferHorizontalStrip, 0, bufferSize );
   atlasDescriptor.mHorizontalStrip = PixelData::New( bufferHorizontalStrip, bufferSize, blockWidth, SINGLE_PIXEL_PADDING, pixelformat, PixelData::DELETE_ARRAY );
index 2332c7a..69416c1 100644 (file)
@@ -42,6 +42,50 @@ namespace
   Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT_RENDERING");
 #endif
 
+#define MAKE_SHADER(A)#A
+
+const char* VERTEX_SHADER = MAKE_SHADER(
+attribute mediump vec2    aPosition;
+attribute mediump vec2    aTexCoord;
+attribute mediump vec4    aColor;
+uniform   mediump vec2    uOffset;
+uniform   mediump mat4    uMvpMatrix;
+varying   mediump vec2    vTexCoord;
+varying   mediump vec4    vColor;
+
+void main()
+{
+  mediump vec4 position = vec4( aPosition.xy + uOffset, 0.0, 1.0 );
+  gl_Position = uMvpMatrix * position;
+  vTexCoord = aTexCoord;
+  vColor = aColor;
+}
+);
+
+const char* FRAGMENT_SHADER_L8 = MAKE_SHADER(
+uniform lowp    vec4      uColor;
+uniform         sampler2D sTexture;
+varying mediump vec2      vTexCoord;
+varying mediump vec4      vColor;
+
+void main()
+{
+  mediump vec4 color = texture2D( sTexture, vTexCoord );
+  gl_FragColor = vec4( vColor.rgb * uColor.rgb, vColor.a * uColor.a * color.r );
+}
+);
+
+const char* FRAGMENT_SHADER_RGBA = MAKE_SHADER(
+uniform lowp    vec4      uColor;
+uniform         sampler2D sTexture;
+varying mediump vec2      vTexCoord;
+
+void main()
+{
+  gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;
+}
+);
+
 const float ZERO( 0.0f );
 const float HALF( 0.5f );
 const float ONE( 1.0f );
@@ -290,7 +334,28 @@ struct AtlasRenderer::Impl
           }
 
           // Create a new image for the glyph
-          PixelData bitmap = mFontClient.CreateBitmap( glyph.fontId, glyph.index );
+          PixelData bitmap;
+
+          // Whether the current glyph is a color one.
+          const bool isColorGlyph = mFontClient.IsColorGlyph( glyph.fontId, glyph.index );
+
+          // Retrieve the emoji's bitmap.
+          TextAbstraction::FontClient::GlyphBufferData glyphBufferData;
+          glyphBufferData.width = isColorGlyph ? glyph.width : 0;   // Desired width and height.
+          glyphBufferData.height = isColorGlyph ? glyph.height : 0;
+
+          mFontClient.CreateBitmap( glyph.fontId,
+                                    glyph.index,
+                                    glyphBufferData );
+
+          // Create the pixel data.
+          bitmap = PixelData::New( glyphBufferData.buffer,
+                                   glyph.width * glyph.height * GetBytesPerPixel( glyphBufferData.format ),
+                                   glyph.width,
+                                   glyph.height,
+                                   glyphBufferData.format,
+                                   PixelData::DELETE_ARRAY );
+
           if( bitmap )
           {
             MaxBlockSize& blockSize = mBlockSizes[currentBlockSize];
@@ -339,21 +404,6 @@ struct AtlasRenderer::Impl
 
         AtlasManager::Vertex2D* verticesBuffer = newMesh.mVertices.Begin();
 
-        // Adjust the vertices if the fixed-size font should be down-scaled
-        if( glyph.scaleFactor > 0 )
-        {
-          for( unsigned int index = 0u, size = newMesh.mVertices.Count();
-               index < size;
-               ++index )
-          {
-            AtlasManager::Vertex2D& vertex = *( verticesBuffer + index );
-
-            // Set the position of the vertex.
-            vertex.mPosition.x = position.x + ( ( vertex.mPosition.x - position.x ) * glyph.scaleFactor );
-            vertex.mPosition.y = position.y + ( ( vertex.mPosition.y - position.y ) * glyph.scaleFactor );
-          }
-        }
-
         // Get the color of the character.
         const ColorIndex colorIndex = useDefaultColor ? 0u : *( colorIndicesBuffer + i );
         const Vector4& color = ( useDefaultColor || ( 0u == colorIndex ) ) ? defaultColor : *( colorsBuffer + colorIndex - 1u );
@@ -409,7 +459,7 @@ struct AtlasRenderer::Impl
       {
         MeshRecord& meshRecord = *it;
 
-        Actor actor = CreateMeshActor( meshRecord, textSize );
+        Actor actor = CreateMeshActor( meshRecord, textSize, STYLE_NORMAL );
 
         // Whether the actor has renderers.
         const bool hasRenderer = actor.GetRendererCount() > 0u;
@@ -429,7 +479,7 @@ struct AtlasRenderer::Impl
             vertex.mColor = shadowColor;
           }
 
-          Actor shadowActor = CreateMeshActor( meshRecord, textSize );
+          Actor shadowActor = CreateMeshActor( meshRecord, textSize, STYLE_DROP_SHADOW );
 #if defined(DEBUG_ENABLED)
           shadowActor.SetName( "Text Shadow renderable actor" );
 #endif
@@ -480,7 +530,7 @@ struct AtlasRenderer::Impl
     mTextCache.Resize( 0 );
   }
 
-  Actor CreateMeshActor( const MeshRecord& meshRecord, const Vector2& actorSize )
+  Actor CreateMeshActor( const MeshRecord& meshRecord, const Vector2& actorSize, Style style )
   {
     PropertyBuffer quadVertices = PropertyBuffer::New( mQuadVertexFormat );
     quadVertices.SetData( const_cast< AtlasManager::Vertex2D* >( &meshRecord.mMesh.mVertices[ 0 ] ), meshRecord.mMesh.mVertices.Size() );
@@ -490,7 +540,29 @@ struct AtlasRenderer::Impl
     quadGeometry.SetIndexBuffer( &meshRecord.mMesh.mIndices[0],  meshRecord.mMesh.mIndices.Size() );
 
     TextureSet textureSet( mGlyphManager.GetTextures( meshRecord.mAtlasId ) );
-    Shader shader( mGlyphManager.GetShader( meshRecord.mAtlasId ) );
+
+    // Choose the shader to use.
+    const bool isColorShader = ( STYLE_DROP_SHADOW != style ) && ( Pixel::BGRA8888 == mGlyphManager.GetPixelFormat( meshRecord.mAtlasId ) );
+    Shader shader;
+    if( isColorShader )
+    {
+      // The glyph is an emoji and is not a shadow.
+      if( !mShaderRgba )
+      {
+        mShaderRgba = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_RGBA );
+      }
+      shader = mShaderRgba;
+    }
+    else
+    {
+      // The glyph is text or a shadow.
+      if( !mShaderL8 )
+      {
+        mShaderL8 = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_L8 );
+      }
+      shader = mShaderL8;
+    }
+
     Dali::Renderer renderer = Dali::Renderer::New( quadGeometry, shader );
     renderer.SetTextures( textureSet );
     renderer.SetProperty( Dali::Renderer::Property::BLEND_MODE, BlendMode::ON );
@@ -723,11 +795,13 @@ struct AtlasRenderer::Impl
 
   Actor mActor;                                       ///< The actor parent which renders the text
   AtlasGlyphManager mGlyphManager;                    ///< Glyph Manager to handle upload and caching
-  TextAbstraction::FontClient mFontClient;            ///> The font client used to supply glyph information
-  std::vector< MaxBlockSize > mBlockSizes;            ///> Maximum size needed to contain a glyph in a block within a new atlas
-  Vector< TextCacheEntry > mTextCache;                ///> Caches data from previous render
-  Property::Map mQuadVertexFormat;                    ///> Describes the vertex format for text
-  int mDepth;                                         ///> DepthIndex passed by control when connect to stage
+  TextAbstraction::FontClient mFontClient;            ///< The font client used to supply glyph information
+  Shader mShaderL8;                                   ///< The shader for glyphs and emoji's shadows.
+  Shader mShaderRgba;                                 ///< The shader for emojis.
+  std::vector< MaxBlockSize > mBlockSizes;            ///< Maximum size needed to contain a glyph in a block within a new atlas
+  Vector< TextCacheEntry > mTextCache;                ///< Caches data from previous render
+  Property::Map mQuadVertexFormat;                    ///< Describes the vertex format for text
+  int mDepth;                                         ///< DepthIndex passed by control when connect to stage
 };
 
 Text::RendererPtr AtlasRenderer::New()
index 62e3b14..3df8bbe 100644 (file)
@@ -248,6 +248,8 @@ PixelData Typesetter::Render( const Vector2& size )
 
       // Retrieves the glyph's bitmap.
       glyphData.glyphBitmap.buffer = NULL;
+      glyphData.glyphBitmap.width = glyphInfo->width;   // Desired width and height.
+      glyphData.glyphBitmap.height = glyphInfo->height;
       fontClient.CreateBitmap( glyphInfo->fontId,
                                glyphInfo->index,
                                glyphData.glyphBitmap );