/*
- * Copyright (c) 2020 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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.
SvgVisualPtr svgVisual( new SvgVisual( factoryCache, shaderFactory, imageUrl ) );
svgVisual->Load();
svgVisual->SetProperties(properties);
+ svgVisual->Initialize();
return svgVisual;
}
{
SvgVisualPtr svgVisual( new SvgVisual( factoryCache, shaderFactory, imageUrl ) );
svgVisual->Load();
+ svgVisual->Initialize();
return svgVisual;
}
-SvgVisual::SvgVisual( VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl )
-: Visual::Base( factoryCache, Visual::FittingMode::FILL, Toolkit::Visual::SVG ),
- mImageVisualShaderFactory( shaderFactory ),
- mAtlasRect( FULL_TEXTURE_RECT ),
- mImageUrl( imageUrl ),
- mVectorRenderer( VectorImageRenderer::New() ),
- mDefaultWidth( 0 ),
- mDefaultHeight( 0 ),
- mLoaded( false ),
+SvgVisual::SvgVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl)
+: Visual::Base(factoryCache, Visual::FittingMode::FILL, Toolkit::Visual::SVG),
+ mImageVisualShaderFactory(shaderFactory),
+ mAtlasRect(FULL_TEXTURE_RECT),
+ mImageUrl(imageUrl),
+ mVectorRenderer(VectorImageRenderer::New()),
+ mDefaultWidth(0),
+ mDefaultHeight(0),
mPlacementActor(),
mVisualSize(Vector2::ZERO),
- mAttemptAtlasing( false )
+ mLoadFailed(false),
+ mAttemptAtlasing(false)
{
// the rasterized image is with pre-multiplied alpha format
mImpl->mFlags |= Impl::IS_PREMULTIPLIED_ALPHA;
{
}
+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);
+ }
+
+ Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY);
+ mImpl->mRenderer = Renderer::New(geometry, shader);
+}
+
void SvgVisual::DoSetProperties( const Property::Map& propertyMap )
{
// url already passed in from constructor
void SvgVisual::DoSetOnScene( Actor& actor )
{
- 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 );
- }
-
- Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY );
TextureSet textureSet = TextureSet::New();
- mImpl->mRenderer = Renderer::New( geometry, shader );
mImpl->mRenderer.SetTextures( textureSet );
// Register transform properties
// Hold the weak handle of the placement actor and delay the adding of renderer until the svg rasterization is finished.
mPlacementActor = actor;
- // SVG visual needs it's size set before it can be rasterized hence set ResourceReady once on stage
- ResourceReady( Toolkit::Visual::ResourceStatus::READY );
+ if(mLoadFailed)
+ {
+ Texture brokenImage = mFactoryCache.GetBrokenVisualImage();
+ textureSet.SetTexture(0u, brokenImage);
+
+ 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);
+ }
}
void SvgVisual::DoSetOffScene( Actor& actor )
mFactoryCache.GetSVGRasterizationThread()->RemoveTask( this );
actor.RemoveRenderer( mImpl->mRenderer );
- mImpl->mRenderer.Reset();
mPlacementActor.Reset();
// Reset the visual size to zero so that when adding the actor back to stage the SVG rasterization is forced
void SvgVisual::GetNaturalSize( Vector2& naturalSize )
{
- if(mLoaded)
- {
- naturalSize.x = mDefaultWidth;
- naturalSize.y = mDefaultHeight;
- }
- else
- {
- naturalSize = Vector2::ZERO;
- }
+ naturalSize.x = mDefaultWidth;
+ naturalSize.y = mDefaultHeight;
}
void SvgVisual::DoCreatePropertyMap( Property::Map& map ) const
void SvgVisual::Load()
{
// load remote resource on svg rasterize thread.
- if(!mLoaded && mImageUrl.IsLocalResource())
+ if(mImageUrl.IsLocalResource())
{
Dali::Vector<uint8_t> buffer;
if(Dali::FileLoader::ReadFile(mImageUrl.GetUrl(), buffer))
float meanDpi = (dpi.height + dpi.width) * 0.5f;
if(!mVectorRenderer.Load(buffer, meanDpi))
{
+ mLoadFailed = true;
DALI_LOG_ERROR("SvgVisual::Load: Failed to load file! [%s]\n", mImageUrl.GetUrl().c_str());
return;
}
mVectorRenderer.GetDefaultSize(mDefaultWidth, mDefaultHeight);
- mLoaded = true;
}
else
{
+ mLoadFailed = true;
DALI_LOG_ERROR("SvgVisual::Load: Failed to read file! [%s]\n", mImageUrl.GetUrl().c_str());
}
}
Vector2 dpi = Stage::GetCurrent().GetDpi();
float meanDpi = ( dpi.height + dpi.width ) * 0.5f;
- RasterizingTaskPtr newTask = new RasterizingTask(this, mVectorRenderer, mImageUrl, meanDpi, width, height, mLoaded);
- if(IsSynchronousLoadingRequired())
+ RasterizingTaskPtr newTask = new RasterizingTask(this, mVectorRenderer, mImageUrl, meanDpi, width, height);
+ if(IsSynchronousLoadingRequired() && mImageUrl.IsLocalResource())
{
newTask->Load();
newTask->Rasterize();
void SvgVisual::ApplyRasterizedImage( VectorImageRenderer vectorRenderer, PixelData rasterizedPixelData, bool isLoaded )
{
- mLoaded = isLoaded;
-
if(isLoaded && rasterizedPixelData && IsOnScene())
{
TextureSet currentTextureSet = mImpl->mRenderer.GetTextures();
}
else if(!isLoaded || !rasterizedPixelData)
{
+ Actor actor = mPlacementActor.GetHandle();
+ if(actor)
+ {
+ TextureSet textureSet = mImpl->mRenderer.GetTextures();
+
+ Texture brokenImage = mFactoryCache.GetBrokenVisualImage();
+ textureSet.SetTexture(0u, brokenImage);
+
+ actor.AddRenderer(mImpl->mRenderer);
+ }
+
ResourceReady( Toolkit::Visual::ResourceStatus::FAILED );
}
}
{
Vector2 visualSize = mImpl->mTransform.GetVisualSize( mImpl->mControlSize );
- if( IsOnScene() )
+ if(IsOnScene() && !mLoadFailed)
{
if( visualSize != mVisualSize )
{