X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Frendering%2Fatlas%2Ftext-atlas-renderer.cpp;h=7891391bb60f7b50e6cb8eb47d5d087940c643c8;hp=016284aac8a29a0399bff82cb8b879f8bc38e01e;hb=7e85bd91f75df91102fa1cb39d7e4d5f4b3df61a;hpb=52117490d94d8242addbe1608efe64364fdb308a diff --git a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp index 016284a..7891391 100644 --- a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp @@ -19,7 +19,6 @@ #include // EXTERNAL INCLUDES -#include #include #include @@ -43,9 +42,8 @@ namespace const float HALF( 0.5f ); const float ONE( 1.0f ); const float TWO( 2.0f ); - const Vector2 DEFAULT_ATLAS_SIZE( 512.0f, 512.0f ); - const Vector2 DEFAULT_BLOCK_SIZE( 16.0f, 16.0f ); - const Vector2 PADDING( 4.0f, 4.0f ); // Allow for variation in font glyphs + const uint32_t DEFAULT_ATLAS_WIDTH = 512u; + const uint32_t DEFAULT_ATLAS_HEIGHT = 512u; } struct AtlasRenderer::Impl : public ConnectionTracker @@ -85,14 +83,14 @@ struct AtlasRenderer::Impl : public ConnectionTracker struct MaxBlockSize { FontId mFontId; - Vector2 mNeededBlockSize; + uint32_t mNeededBlockWidth; + uint32_t mNeededBlockHeight; }; Impl() { mGlyphManager = AtlasGlyphManager::Get(); mFontClient = TextAbstraction::FontClient::Get(); - mGlyphManager.SetNewAtlasSize( DEFAULT_ATLAS_SIZE, DEFAULT_BLOCK_SIZE ); mBasicShader = BasicShader::New(); mBgraShader = BgraShader::New(); mBasicShadowShader = BasicShadowShader::New(); @@ -117,7 +115,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker float currentUnderlinePosition = ZERO; float currentUnderlineThickness = underlineHeight; - + uint32_t currentBlockSize = 0; FontId lastFontId = 0; Style style = STYLE_NORMAL; @@ -147,8 +145,8 @@ struct AtlasRenderer::Impl : public ConnectionTracker // We need to fetch fresh font underline metrics FontMetrics fontMetrics; mFontClient.GetFontMetrics( glyph.fontId, fontMetrics ); - currentUnderlinePosition = FontMetricsRoundUp( fabsf( fontMetrics.underlinePosition ) ); - float descender = FontMetricsRoundUp( fabsf( fontMetrics.descender ) ); + currentUnderlinePosition = ceil( fabsf( fontMetrics.underlinePosition ) ); + float descender = ceil( fabsf( fontMetrics.descender ) ); if ( underlineHeight == ZERO ) { @@ -161,7 +159,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker } else { - currentUnderlineThickness = FontMetricsRoundUp( currentUnderlineThickness ); + currentUnderlineThickness = ceil( currentUnderlineThickness ); } } @@ -197,14 +195,39 @@ struct AtlasRenderer::Impl : public ConnectionTracker { if ( mBlockSizes[ j ].mFontId == glyph.fontId ) { - mGlyphManager.SetNewAtlasSize( DEFAULT_ATLAS_SIZE, mBlockSizes[ j ].mNeededBlockSize ); + currentBlockSize = j; + mGlyphManager.SetNewAtlasSize( DEFAULT_ATLAS_WIDTH, + DEFAULT_ATLAS_HEIGHT, + mBlockSizes[ j ].mNeededBlockWidth, + mBlockSizes[ j ].mNeededBlockHeight ); } } } - // Glyph doesn't currently exist in atlas so upload + // Create a new image for the glyph BufferImage bitmap = mFontClient.CreateBitmap( glyph.fontId, glyph.index ); + // Ensure that the next image will fit into the current block size + bool setSize = false; + if ( bitmap.GetWidth() > mBlockSizes[ currentBlockSize ].mNeededBlockWidth ) + { + setSize = true; + mBlockSizes[ currentBlockSize ].mNeededBlockWidth = bitmap.GetWidth(); + } + if ( bitmap.GetHeight() > mBlockSizes[ currentBlockSize ].mNeededBlockHeight ) + { + setSize = true; + mBlockSizes[ currentBlockSize ].mNeededBlockHeight = bitmap.GetHeight(); + } + + if ( setSize ) + { + mGlyphManager.SetNewAtlasSize( DEFAULT_ATLAS_WIDTH, + DEFAULT_ATLAS_HEIGHT, + mBlockSizes[ currentBlockSize ].mNeededBlockWidth, + mBlockSizes[ currentBlockSize ].mNeededBlockHeight ); + } + // Locate a new slot for our glyph mGlyphManager.Add( glyph, bitmap, slot ); @@ -224,8 +247,8 @@ struct AtlasRenderer::Impl : public ConnectionTracker currentUnderlinePosition, currentUnderlineThickness, slot ); + lastFontId = glyph.fontId; } - lastFontId = glyph.fontId; } if ( underlineEnabled ) @@ -241,6 +264,9 @@ struct AtlasRenderer::Impl : public ConnectionTracker { MeshActor actor = MeshActor::New( Mesh::New( mIt->mMeshData ) ); actor.SetColor( mIt->mColor ); + + // Ensure that text rendering is unfiltered + actor.SetFilterMode( FilterMode::NEAREST, FilterMode::NEAREST ); if ( mIt->mIsUnderline ) { actor.SetColorMode( USE_OWN_COLOR ); @@ -287,10 +313,10 @@ struct AtlasRenderer::Impl : public ConnectionTracker DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Atlas [%i] %sPixels: %s Size: %ix%i, BlockSize: %ix%i, BlocksUsed: %i/%i\n", i + 1, i > 8 ? "" : " ", metrics.mAtlasMetrics.mAtlasMetrics[ i ].mPixelFormat == Pixel::L8 ? "L8 " : "BGRA", - metrics.mAtlasMetrics.mAtlasMetrics[ i ].mWidth, - metrics.mAtlasMetrics.mAtlasMetrics[ i ].mHeight, - metrics.mAtlasMetrics.mAtlasMetrics[ i ].mBlockWidth, - metrics.mAtlasMetrics.mAtlasMetrics[ i ].mBlockHeight, + metrics.mAtlasMetrics.mAtlasMetrics[ i ].mSize.mWidth, + metrics.mAtlasMetrics.mAtlasMetrics[ i ].mSize.mHeight, + metrics.mAtlasMetrics.mAtlasMetrics[ i ].mSize.mBlockWidth, + metrics.mAtlasMetrics.mAtlasMetrics[ i ].mSize.mBlockHeight, metrics.mAtlasMetrics.mAtlasMetrics[ i ].mBlocksUsed, metrics.mAtlasMetrics.mAtlasMetrics[ i ].mTotalBlocks ); } @@ -420,50 +446,27 @@ struct AtlasRenderer::Impl : public ConnectionTracker MaxBlockSize maxBlockSize; for ( uint32_t i = 0; i < glyphs.Size(); ++i ) { - // Get the fontId of this glyph and check to see if a max size exists? FontId fontId = glyphs[ i ].fontId; - float paddedWidth = glyphs[ i ].width + PADDING.x; - float paddedHeight = glyphs[ i ].height + PADDING.y; bool foundFont = false; - for ( uint32_t j = 0; j < mBlockSizes.size(); ++j ) { if ( mBlockSizes[ j ].mFontId == fontId ) { foundFont = true; - if ( mBlockSizes[ j ].mNeededBlockSize.x < paddedWidth ) - { - mBlockSizes[ j ].mNeededBlockSize.x = paddedWidth; - } - if ( mBlockSizes[ j ].mNeededBlockSize.y < paddedHeight ) - { - mBlockSizes[ j ].mNeededBlockSize.y = paddedHeight; - } } } - if ( !foundFont ) { - maxBlockSize.mNeededBlockSize = Vector2( paddedWidth, paddedHeight ); + FontMetrics fontMetrics; + mFontClient.GetFontMetrics( fontId, fontMetrics ); + maxBlockSize.mNeededBlockWidth = static_cast< uint32_t >( fontMetrics.height ); + maxBlockSize.mNeededBlockHeight = static_cast< uint32_t >( fontMetrics.height ); maxBlockSize.mFontId = fontId; mBlockSizes.push_back( maxBlockSize ); } } } - float FontMetricsRoundUp( float value ) - { - double integral_part; - if ( modf( value, &integral_part ) ) - { - return ( static_cast< float >( integral_part ) + 1.0f ); - } - else - { - return static_cast< float >( integral_part ); - } - } - void GenerateUnderlines( std::vector< MeshRecord>& meshRecords, Vector< Extent >& extents, const Vector4& underlineColor,