X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fsvg%2Fsvg-visual.cpp;h=9d0a2cc81ed4b564be77500006ef929acd19bb17;hp=bddb7f0dcb967a723198cf7f73267604bc1f1e61;hb=45ad62cd772319bc585a48c868b31892881374bb;hpb=5e568632fb11fd797309ccd61d4fcae784de91a0 diff --git a/dali-toolkit/internal/visuals/svg/svg-visual.cpp b/dali-toolkit/internal/visuals/svg/svg-visual.cpp index bddb7f0..9d0a2cc 100644 --- a/dali-toolkit/internal/visuals/svg/svg-visual.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-visual.cpp @@ -29,6 +29,7 @@ // EXTERNAL INCLUDES #include #include +#include namespace Dali { @@ -38,7 +39,7 @@ namespace Internal { namespace { -const int CUSTOM_PROPERTY_COUNT(6); // atlas + corner/border +const int CUSTOM_PROPERTY_COUNT(1); // atlas // property name const Dali::Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f); @@ -85,8 +86,22 @@ void SvgVisual::OnInitialize() { Shader shader = GenerateShader(); Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY); - mImpl->mRenderer = VisualRenderer::New(geometry, shader); + mImpl->mRenderer = DecoratedVisualRenderer::New(geometry, shader); mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT); + + Vector2 dpi = Stage::GetCurrent().GetDpi(); + float meanDpi = (dpi.height + dpi.width) * 0.5f; + + SvgTaskPtr newTask = new SvgLoadingTask(this, mVectorRenderer, mImageUrl, meanDpi); + + if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource()) + { + newTask->Process(); + } + else + { + mFactoryCache.GetSVGRasterizationThread()->AddTask(newTask); + } } void SvgVisual::DoSetProperties(const Property::Map& propertyMap) @@ -242,16 +257,12 @@ void SvgVisual::AddRasterizationTask(const Vector2& size) unsigned int width = static_cast(size.width); unsigned int height = static_cast(size.height); - Vector2 dpi = Stage::GetCurrent().GetDpi(); - float meanDpi = (dpi.height + dpi.width) * 0.5f; - - RasterizingTaskPtr newTask = new RasterizingTask(this, mVectorRenderer, mImageUrl, meanDpi, width, height); + SvgTaskPtr newTask = new SvgRasterizingTask(this, mVectorRenderer, width, height); if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource()) { - newTask->Load(); - newTask->Rasterize(); - ApplyRasterizedImage(newTask->GetPixelData(), newTask->IsLoaded()); + newTask->Process(); + ApplyRasterizedImage(newTask->GetPixelData(), newTask->HasSucceeded()); } else { @@ -260,80 +271,84 @@ void SvgVisual::AddRasterizationTask(const Vector2& size) } } -void SvgVisual::ApplyRasterizedImage(PixelData rasterizedPixelData, bool isLoaded) +void SvgVisual::ApplyRasterizedImage(PixelData rasterizedPixelData, bool success) { - if(isLoaded && rasterizedPixelData && IsOnScene()) + if(success) { if(mDefaultWidth == 0 || mDefaultHeight == 0) { mVectorRenderer.GetDefaultSize(mDefaultWidth, mDefaultHeight); } - mRasterizedSize.x = static_cast(rasterizedPixelData.GetWidth()); - mRasterizedSize.y = static_cast(rasterizedPixelData.GetHeight()); - - TextureSet currentTextureSet = mImpl->mRenderer.GetTextures(); - if(mImpl->mFlags & Impl::IS_ATLASING_APPLIED) + // Rasterization success + if(rasterizedPixelData && IsOnScene()) { - mFactoryCache.GetAtlasManager()->Remove(currentTextureSet, mAtlasRect); - } - - TextureSet textureSet; + mRasterizedSize.x = static_cast(rasterizedPixelData.GetWidth()); + mRasterizedSize.y = static_cast(rasterizedPixelData.GetHeight()); - if(mAttemptAtlasing && !mImpl->mCustomShader) - { - Vector4 atlasRect; - textureSet = mFactoryCache.GetAtlasManager()->Add(atlasRect, rasterizedPixelData); - if(textureSet) // atlasing + TextureSet currentTextureSet = mImpl->mRenderer.GetTextures(); + if(mImpl->mFlags & Impl::IS_ATLASING_APPLIED) { - if(textureSet != currentTextureSet) - { - mImpl->mRenderer.SetTextures(textureSet); - } - mImpl->mRenderer.RegisterProperty(ATLAS_RECT_UNIFORM_NAME, atlasRect); - mAtlasRect = atlasRect; - mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; + mFactoryCache.GetAtlasManager()->Remove(currentTextureSet, mAtlasRect); } - } - if(!textureSet) // no atlasing - mAttemptAtlasing is false or adding to atlas is failed - { - Texture texture = Texture::New(Dali::TextureType::TEXTURE_2D, Pixel::RGBA8888, rasterizedPixelData.GetWidth(), rasterizedPixelData.GetHeight()); - texture.Upload(rasterizedPixelData); - mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; + TextureSet textureSet; - if(mAtlasRect == FULL_TEXTURE_RECT) + if(mAttemptAtlasing && !mImpl->mCustomShader) { - textureSet = currentTextureSet; + Vector4 atlasRect; + textureSet = mFactoryCache.GetAtlasManager()->Add(atlasRect, rasterizedPixelData); + if(textureSet) // atlasing + { + if(textureSet != currentTextureSet) + { + mImpl->mRenderer.SetTextures(textureSet); + } + mImpl->mRenderer.RegisterProperty(ATLAS_RECT_UNIFORM_NAME, atlasRect); + mAtlasRect = atlasRect; + mImpl->mFlags |= Impl::IS_ATLASING_APPLIED; + } } - else + + if(!textureSet) // no atlasing - mAttemptAtlasing is false or adding to atlas is failed { - textureSet = TextureSet::New(); - mImpl->mRenderer.SetTextures(textureSet); + Texture texture = Texture::New(Dali::TextureType::TEXTURE_2D, Pixel::RGBA8888, rasterizedPixelData.GetWidth(), rasterizedPixelData.GetHeight()); + texture.Upload(rasterizedPixelData); + mImpl->mFlags &= ~Impl::IS_ATLASING_APPLIED; + + if(mAtlasRect == FULL_TEXTURE_RECT) + { + textureSet = currentTextureSet; + } + else + { + textureSet = TextureSet::New(); + mImpl->mRenderer.SetTextures(textureSet); - mImpl->mRenderer.RegisterProperty(ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT); - mAtlasRect = FULL_TEXTURE_RECT; + mImpl->mRenderer.RegisterProperty(ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT); + mAtlasRect = FULL_TEXTURE_RECT; + } + + if(textureSet) + { + textureSet.SetTexture(0, texture); + } } - if(textureSet) + // Rasterized pixels are uploaded to texture. If weak handle is holding a placement actor, it is the time to add the renderer to actor. + Actor actor = mPlacementActor.GetHandle(); + if(actor) { - textureSet.SetTexture(0, texture); + actor.AddRenderer(mImpl->mRenderer); + // reset the weak handle so that the renderer only get added to actor once + mPlacementActor.Reset(); } - } - // Rasterized pixels are uploaded to texture. If weak handle is holding a placement actor, it is the time to add the renderer to actor. - Actor actor = mPlacementActor.GetHandle(); - if(actor) - { - actor.AddRenderer(mImpl->mRenderer); - // reset the weak handle so that the renderer only get added to actor once - mPlacementActor.Reset(); + // Svg loaded and ready to display + ResourceReady(Toolkit::Visual::ResourceStatus::READY); } - - // Svg loaded and ready to display - ResourceReady(Toolkit::Visual::ResourceStatus::READY); } - else if(!isLoaded || !rasterizedPixelData) + else if(!success && !mLoadFailed) { mLoadFailed = true;