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%2Fatlas-glyph-manager-impl.cpp;h=8532b93ef1b42ef77bb498f3cc372d33f52e3ed9;hp=cb90d039c7d30c7a74e11cdb6359c4fab45bda7d;hb=6f990775daf7adf6170db59f0b99e00ae25fceed;hpb=b79345b4ba7ac5e959d6ee913555e3436ca005f2 diff --git a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp index cb90d03..8532b93 100644 --- a/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/atlas-glyph-manager-impl.cpp @@ -18,66 +18,59 @@ #include // EXTERNAL INCLUDES -#include -#include - -#define MAKE_SHADER(A)#A +#include namespace { + +#if defined(DEBUG_ENABLED) + 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; -uniform mediump vec3 uSize; varying mediump vec2 vTexCoord; +varying mediump vec4 vColor; void main() { - mediump vec4 position = vec4( aPosition, 0.0, 1.0 ); - position.xyz *= uSize; + mediump vec4 position = vec4( aPosition.xy + uOffset, 0.0, 1.0 ); gl_Position = uMvpMatrix * position; vTexCoord = aTexCoord; + vColor = aColor; } ); -const char* FRAGMENT_SHADER = MAKE_SHADER( +const char* FRAGMENT_SHADER_L8 = MAKE_SHADER( +uniform lowp vec4 uColor; uniform sampler2D sTexture; varying mediump vec2 vTexCoord; +varying mediump vec4 vColor; void main() { - gl_FragColor = texture2D( sTexture, vTexCoord ); -} -); - -const char* VERTEX_SHADER_SHADOW = MAKE_SHADER( -attribute mediump vec2 aPosition; -attribute mediump vec2 aTexCoord; -uniform mediump vec3 uSize; -varying mediump vec2 vTexCoord; - -void main() -{ - mediump vec4 position = vec4( aPosition, 0.0, 1.0 ); - position.xyz *= uSize; - gl_Position = position; - vTexCoord = aTexCoord; + mediump vec4 color = texture2D( sTexture, vTexCoord ); + gl_FragColor = vec4( vColor.rgb * uColor.rgb, vColor.a * uColor.a * color.r ); } ); -const char* FRAGMENT_SHADER_SHADOW = MAKE_SHADER( +const char* FRAGMENT_SHADER_RGBA = MAKE_SHADER( uniform sampler2D sTexture; -uniform lowp vec4 uColor; varying mediump vec2 vTexCoord; void main() { - mediump vec4 color = texture2D( sTexture, vTexCoord ); - gl_FragColor = vec4(uColor.rgb, uColor.a*color.r); + gl_FragColor = texture2D( sTexture, vTexCoord ); } ); -} + +} // unnamed namespace namespace Dali { @@ -90,61 +83,87 @@ 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(); - mEffectBufferShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); - mShadowShader = Shader::New( VERTEX_SHADER_SHADOW, FRAGMENT_SHADER_SHADOW, Dali::Shader::HINT_MODIFIES_GEOMETRY ); -} - -AtlasGlyphManager::~AtlasGlyphManager() -{ -} - -AtlasGlyphManagerPtr AtlasGlyphManager::New() -{ - AtlasGlyphManagerPtr internal = new AtlasGlyphManager(); - return internal; } void AtlasGlyphManager::Add( const Text::GlyphInfo& glyph, - const BufferImage& bitmap, + const PixelData& bitmap, Dali::Toolkit::AtlasManager::AtlasSlot& slot ) { - GlyphRecord record; - record.mFontId = glyph.fontId; - record.mIndex = glyph.index; + DALI_LOG_INFO( gLogFilter, Debug::General, "Added glyph, font: %d index: %d\n", glyph.fontId, glyph.index ); + + if ( mAtlasManager.Add( bitmap, slot ) ) + { + // A new atlas was created so set the texture set details for the atlas + Dali::Texture atlas = mAtlasManager.GetAtlasContainer( slot.mAtlasId ); + TextureSet textureSet = TextureSet::New(); + textureSet.SetTexture( 0u, atlas ); + mAtlasManager.SetTextures( slot.mAtlasId, textureSet ); + } - mAtlasManager.Add( bitmap, slot ); + GlyphRecordEntry record; + record.mIndex = glyph.index; record.mImageId = slot.mImageId; - mGlyphRecords.PushBack( record ); + record.mCount = 1; + + // Have glyph records been created for this fontId ? + bool foundGlyph = false; + for ( std::vector< FontGlyphRecord >::iterator fontGlyphRecordIt = mFontGlyphRecords.begin(); + fontGlyphRecordIt != mFontGlyphRecords.end(); ++fontGlyphRecordIt ) + { + if ( fontGlyphRecordIt->mFontId == glyph.fontId ) + { + fontGlyphRecordIt->mGlyphRecords.PushBack( record ); + foundGlyph = true; + break; + } + } + + if ( !foundGlyph ) + { + // We need to add a new font entry + FontGlyphRecord fontGlyphRecord; + fontGlyphRecord.mFontId = glyph.fontId; + fontGlyphRecord.mGlyphRecords.PushBack( record ); + mFontGlyphRecords.push_back( fontGlyphRecord ); + } } void AtlasGlyphManager::GenerateMeshData( uint32_t imageId, const Vector2& position, Toolkit::AtlasManager::Mesh2D& mesh ) { - mAtlasManager.GenerateMeshData( imageId, position, mesh ); + // Generate mesh data and tell Atlas Manager not to handle reference counting ( we'll do it ) + mAtlasManager.GenerateMeshData( imageId, position, mesh, false ); } -void AtlasGlyphManager::StitchMesh( Toolkit::AtlasManager::Mesh2D& first, - const Toolkit::AtlasManager::Mesh2D& second ) -{ - mAtlasManager.StitchMesh( first, second ); -} - -void AtlasGlyphManager::Cached( Text::FontId fontId, - uint32_t index, +bool AtlasGlyphManager::IsCached( Text::FontId fontId, + Text::GlyphIndex index, Dali::Toolkit::AtlasManager::AtlasSlot& slot ) { - for ( uint32_t i = 0; i < mGlyphRecords.Size(); ++i ) + for ( std::vector< FontGlyphRecord >::iterator fontGlyphRecordIt = mFontGlyphRecords.begin(); + fontGlyphRecordIt != mFontGlyphRecords.end(); + ++fontGlyphRecordIt ) { - if ( fontId == mGlyphRecords[ i ].mFontId && index == mGlyphRecords[ i ].mIndex ) + if ( fontGlyphRecordIt->mFontId == fontId ) { - slot.mImageId = mGlyphRecords[ i ].mImageId; - slot.mAtlasId = mAtlasManager.GetAtlas( slot.mImageId ); - return; + for ( Vector< GlyphRecordEntry >::Iterator glyphRecordIt = fontGlyphRecordIt->mGlyphRecords.Begin(); + glyphRecordIt != fontGlyphRecordIt->mGlyphRecords.End(); + ++glyphRecordIt ) + { + if ( glyphRecordIt->mIndex == index ) + { + slot.mImageId = glyphRecordIt->mImageId; + slot.mAtlasId = mAtlasManager.GetAtlas( slot.mImageId ); + return true; + } + } } } slot.mImageId = 0; + return false; } Vector2 AtlasGlyphManager::GetAtlasSize( uint32_t atlasId ) @@ -163,41 +182,89 @@ void AtlasGlyphManager::SetNewAtlasSize( uint32_t width, uint32_t height, uint32 mAtlasManager.SetNewAtlasSize( size ); } -void AtlasGlyphManager::Remove( uint32_t imageId ) +Pixel::Format AtlasGlyphManager::GetPixelFormat( uint32_t atlasId ) { - if ( mAtlasManager.Remove( imageId ) ) + return mAtlasManager.GetPixelFormat( atlasId ); +} + +const Toolkit::AtlasGlyphManager::Metrics& AtlasGlyphManager::GetMetrics() +{ + std::ostringstream verboseMetrics; + + mMetrics.mGlyphCount = 0u; + for ( std::vector< FontGlyphRecord >::iterator fontGlyphRecordIt = mFontGlyphRecords.begin(); + fontGlyphRecordIt != mFontGlyphRecords.end(); + ++fontGlyphRecordIt ) { - for ( uint32_t i = 0; i < mGlyphRecords.Size(); ++i ) + mMetrics.mGlyphCount += fontGlyphRecordIt->mGlyphRecords.Size(); + + verboseMetrics << "[FontId " << fontGlyphRecordIt->mFontId << " Glyph "; + for ( Vector< GlyphRecordEntry >::Iterator glyphRecordEntryIt = fontGlyphRecordIt->mGlyphRecords.Begin(); + glyphRecordEntryIt != fontGlyphRecordIt->mGlyphRecords.End(); + ++glyphRecordEntryIt ) { - if ( mGlyphRecords[ i ].mImageId == imageId ) - { - mGlyphRecords.Remove( mGlyphRecords.Begin() + i ); - return; - } + verboseMetrics << glyphRecordEntryIt->mIndex << "(" << glyphRecordEntryIt->mCount << ") "; } + verboseMetrics << "] "; } + mMetrics.mVerboseGlyphCounts = verboseMetrics.str(); + + mAtlasManager.GetMetrics( mMetrics.mAtlasMetrics ); + + return mMetrics; } -Pixel::Format AtlasGlyphManager::GetPixelFormat( uint32_t atlasId ) +void AtlasGlyphManager::AdjustReferenceCount( Text::FontId fontId, Text::GlyphIndex index, int32_t delta ) { - return mAtlasManager.GetPixelFormat( atlasId ); + if( 0 != delta ) + { + DALI_LOG_INFO( gLogFilter, Debug::General, "AdjustReferenceCount %d, font: %d index: %d\n", delta, fontId, index ); + + for ( std::vector< FontGlyphRecord >::iterator fontGlyphRecordIt = mFontGlyphRecords.begin(); + fontGlyphRecordIt != mFontGlyphRecords.end(); + ++fontGlyphRecordIt ) + { + if ( fontGlyphRecordIt->mFontId == fontId ) + { + for ( Vector< GlyphRecordEntry >::Iterator glyphRecordIt = fontGlyphRecordIt->mGlyphRecords.Begin(); + glyphRecordIt != fontGlyphRecordIt->mGlyphRecords.End(); + ++glyphRecordIt ) + { + if ( glyphRecordIt->mIndex == index ) + { + glyphRecordIt->mCount += delta; + DALI_ASSERT_DEBUG( glyphRecordIt->mCount >= 0 && "Glyph ref-count should not be negative" ); + + if ( !glyphRecordIt->mCount ) + { + mAtlasManager.Remove( glyphRecordIt->mImageId ); + fontGlyphRecordIt->mGlyphRecords.Remove( glyphRecordIt ); + } + return; + } + } + } + } + + // Should not arrive here + DALI_ASSERT_DEBUG( false && "Failed to adjust ref-count" ); + } } -Material AtlasGlyphManager::GetMaterial( uint32_t atlasId ) const +TextureSet AtlasGlyphManager::GetTextures( uint32_t atlasId ) const { - return mAtlasManager.GetMaterial( atlasId ); + return mAtlasManager.GetTextures( atlasId ); } -Sampler AtlasGlyphManager::GetSampler( uint32_t atlasId ) const +Shader AtlasGlyphManager::GetShader( uint32_t atlasId ) const { - return mAtlasManager.GetSampler( atlasId ); + Pixel::Format pixelFormat = mAtlasManager.GetPixelFormat( atlasId ); + return pixelFormat == Pixel::L8 ? mShaderL8 : mShaderRgba; } -const Toolkit::AtlasGlyphManager::Metrics& AtlasGlyphManager::GetMetrics() +AtlasGlyphManager::~AtlasGlyphManager() { - mMetrics.mGlyphCount = mGlyphRecords.Size(); - mAtlasManager.GetMetrics( mMetrics.mAtlasMetrics ); - return mMetrics; + // mAtlasManager handle is automatically released here } } // namespace Internal