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=6851c754b6b9f06a87a399b01cf504f249a594ef;hp=dc148a2199a98dde0db920c757bad974ede27d10;hb=df0ba815340cb09f10cb3e84358718310ef0bffb;hpb=2ca1c3856ce848a94f54444f1014a820e91ee207 diff --git a/dali-toolkit/internal/visuals/svg/svg-visual.cpp b/dali-toolkit/internal/visuals/svg/svg-visual.cpp index dc148a2..6851c75 100644 --- a/dali-toolkit/internal/visuals/svg/svg-visual.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-visual.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,8 @@ namespace Internal { namespace { +const int CUSTOM_PROPERTY_COUNT(6); // atlas + corner/border + // property name const Dali::Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f); @@ -70,7 +72,7 @@ SvgVisual::SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& mDefaultWidth(0), mDefaultHeight(0), mPlacementActor(), - mVisualSize(Vector2::ZERO), + mRasterizedSize(Vector2::ZERO), mLoadFailed(false), mAttemptAtlasing(false) { @@ -84,22 +86,10 @@ SvgVisual::~SvgVisual() void SvgVisual::OnInitialize() { - Shader shader; - if(!mImpl->mCustomShader) - { - shader = mImageVisualShaderFactory.GetShader(mFactoryCache, mAttemptAtlasing, true, IsRoundedCornerRequired()); - } - else - { - shader = Shader::New(mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource().data() : mImpl->mCustomShader->mVertexShader, - mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource().data() : mImpl->mCustomShader->mFragmentShader, - mImpl->mCustomShader->mHints); - - shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT); - } - + Shader shader = GenerateShader(); Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY); - mImpl->mRenderer = Renderer::New(geometry, shader); + mImpl->mRenderer = VisualRenderer::New(geometry, shader); + mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT); } void SvgVisual::DoSetProperties(const Property::Map& propertyMap) @@ -161,7 +151,7 @@ void SvgVisual::DoSetOnScene(Actor& actor) mImpl->mRenderer.SetTextures(textureSet); // Register transform properties - mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); + mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); // Defer the rasterisation task until we get given a size (by Size Negotiation algorithm) @@ -170,17 +160,20 @@ void SvgVisual::DoSetOnScene(Actor& actor) if(mLoadFailed) { - Texture brokenImage = mFactoryCache.GetBrokenVisualImage(); - textureSet.SetTexture(0u, brokenImage); - + Vector2 imageSize = Vector2::ZERO; + imageSize = actor.GetProperty(Actor::Property::SIZE).Get(); + mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize); actor.AddRenderer(mImpl->mRenderer); ResourceReady(Toolkit::Visual::ResourceStatus::FAILED); } else { - // SVG visual needs it's size set before it can be rasterized hence set ResourceReady once on stage - ResourceReady(Toolkit::Visual::ResourceStatus::READY); + if(mImpl->mEventObserver) + { + // SVG visual needs it's size set before it can be rasterized hence request relayout once on stage + mImpl->mEventObserver->RelayoutRequest(*this); + } } } @@ -192,13 +185,31 @@ void SvgVisual::DoSetOffScene(Actor& actor) mPlacementActor.Reset(); // Reset the visual size to zero so that when adding the actor back to stage the SVG rasterization is forced - mVisualSize = Vector2::ZERO; + mRasterizedSize = Vector2::ZERO; } void SvgVisual::GetNaturalSize(Vector2& naturalSize) { - naturalSize.x = mDefaultWidth; - naturalSize.y = mDefaultHeight; + if(mLoadFailed && mImpl->mRenderer) + { + // Load failed, use broken image size + auto textureSet = mImpl->mRenderer.GetTextures(); + if(textureSet && textureSet.GetTextureCount()) + { + auto texture = textureSet.GetTexture(0); + if(texture) + { + naturalSize.x = texture.GetWidth(); + naturalSize.y = texture.GetHeight(); + return; + } + } + } + else + { + naturalSize.x = mDefaultWidth; + naturalSize.y = mDefaultHeight; + } } void SvgVisual::DoCreatePropertyMap(Property::Map& map) const @@ -218,6 +229,15 @@ void SvgVisual::DoCreateInstancePropertyMap(Property::Map& map) const // Do nothing } +void SvgVisual::EnablePreMultipliedAlpha(bool preMultiplied) +{ + // Make always enable pre multiplied alpha whether preMultiplied value is false. + if(!preMultiplied) + { + DALI_LOG_WARNING("Note : SvgVisual cannot disable PreMultipliedAlpha\n"); + } +} + void SvgVisual::Load() { // load remote resource on svg rasterize thread. @@ -274,6 +294,14 @@ void SvgVisual::ApplyRasterizedImage(VectorImageRenderer vectorRenderer, PixelDa { if(isLoaded && rasterizedPixelData && IsOnScene()) { + 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) { @@ -337,14 +365,14 @@ void SvgVisual::ApplyRasterizedImage(VectorImageRenderer vectorRenderer, PixelDa } else if(!isLoaded || !rasterizedPixelData) { + mLoadFailed = true; + Actor actor = mPlacementActor.GetHandle(); if(actor) { - TextureSet textureSet = mImpl->mRenderer.GetTextures(); - - Texture brokenImage = mFactoryCache.GetBrokenVisualImage(); - textureSet.SetTexture(0u, brokenImage); - + Vector2 imageSize = Vector2::ZERO; + imageSize = actor.GetProperty(Actor::Property::SIZE).Get(); + mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize); actor.AddRenderer(mImpl->mRenderer); } @@ -358,23 +386,49 @@ void SvgVisual::OnSetTransform() if(IsOnScene() && !mLoadFailed) { - if(visualSize != mVisualSize) + if(visualSize != mRasterizedSize || mDefaultWidth == 0 || mDefaultHeight == 0) { AddRasterizationTask(visualSize); - mVisualSize = visualSize; + mRasterizedSize = visualSize; } } if(mImpl->mRenderer) { - mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); + mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); } } -bool SvgVisual::IsResourceReady() const +void SvgVisual::UpdateShader() { - return (mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::READY || - mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::FAILED); + if(mImpl->mRenderer) + { + Shader shader = GenerateShader(); + mImpl->mRenderer.SetShader(shader); + } +} + +Shader SvgVisual::GenerateShader() const +{ + Shader shader; + if(!mImpl->mCustomShader) + { + shader = mImageVisualShaderFactory.GetShader( + mFactoryCache, + ImageVisualShaderFeature::FeatureBuilder() + .EnableTextureAtlas(mAttemptAtlasing) + .EnableRoundedCorner(IsRoundedCornerRequired()) + .EnableBorderline(IsBorderlineRequired())); + } + else + { + shader = Shader::New(mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource().data() : mImpl->mCustomShader->mVertexShader, + mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource().data() : mImpl->mCustomShader->mFragmentShader, + mImpl->mCustomShader->mHints); + + shader.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT); + } + return shader; } } // namespace Internal