From 11d6d49bd9837159b95a27199c48dd7a39b8ccee Mon Sep 17 00:00:00 2001 From: Xiangyin Ma Date: Wed, 7 Dec 2016 15:49:35 +0000 Subject: [PATCH] AnimatedImageVisual Change-Id: I6d00000865b02fbdd1f47880e68b3b554da61d1c --- automated-tests/resources/anim.gif | Bin 0 -> 7449 bytes .../utc-Dali-VisualFactoryResolveUrl.cpp | 27 ++- .../src/dali-toolkit/utc-Dali-Visual.cpp | 48 ++++++ .../src/dali-toolkit/utc-Dali-VisualFactory.cpp | 83 +++++++++ dali-toolkit/internal/file.list | 1 + .../animated-image/animated-image-visual.cpp | 186 +++++++++++++++++++++ .../visuals/animated-image/animated-image-visual.h | 156 +++++++++++++++++ .../internal/visuals/color/color-visual.cpp | 5 - .../internal/visuals/gradient/gradient-visual.cpp | 5 - .../internal/visuals/image/image-visual.cpp | 5 - dali-toolkit/internal/visuals/svg/svg-visual.cpp | 5 - dali-toolkit/internal/visuals/text/text-visual.cpp | 5 - .../internal/visuals/visual-factory-cache.cpp | 5 + .../internal/visuals/visual-factory-impl.cpp | 9 + .../internal/visuals/visual-factory-resolve-url.h | 13 +- .../images/visuals/animated-image-visual.gif | Bin 0 -> 58580 bytes .../visuals.md | 42 ++++- 17 files changed, 564 insertions(+), 31 deletions(-) create mode 100644 automated-tests/resources/anim.gif create mode 100644 dali-toolkit/internal/visuals/animated-image/animated-image-visual.cpp create mode 100644 dali-toolkit/internal/visuals/animated-image/animated-image-visual.h create mode 100644 docs/content/images/visuals/animated-image-visual.gif diff --git a/automated-tests/resources/anim.gif b/automated-tests/resources/anim.gif new file mode 100644 index 0000000000000000000000000000000000000000..f66f076e45422481e7448fbea89527243cecc1a9 GIT binary patch literal 7449 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 qq^9H#M_G83WL3!Mj;KGL!xs-Pj$}+JA4ZGet() == Visual::IMAGE ); + + value = resultMap.Find( ImageVisual::Property::URL, Property::STRING ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == TEST_GIF_FILE_NAME ); + + // request SvgVisual with an URL + Visual::Base svgVisual2 = factory.CreateVisual( TEST_GIF_FILE_NAME, ImageDimensions() ); + resultMap.Clear(); + svgVisual2.CreatePropertyMap( resultMap ); + // check the property values from the returned map from a visual + value = resultMap.Find( Visual::Property::TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == Visual::IMAGE ); + + value = resultMap.Find( ImageVisual::Property::URL, Property::STRING ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == TEST_GIF_FILE_NAME ); + + END_TEST; +} + int UtcDaliVisualGetPropertyMapBatchImageVisualNoAtlas(void) { ToolkitTestApplication application; diff --git a/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp b/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp index b186ea4..0e9c014 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-VisualFactory.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -44,6 +45,9 @@ const char* TEST_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal.mtl"; const char* TEST_SIMPLE_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube-Points-Only.obj"; const char* TEST_SIMPLE_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal-Simple.mtl"; +// resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame +const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif"; + // resolution: 34*34, pixel format: RGBA8888 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png"; // resolution: 600*600, pixel format: RGB888 @@ -2051,3 +2055,82 @@ int UtcDaliVisualFactoryGetBatchImageVisual3(void) END_TEST; } + +int UtcDaliVisualFactoryGetAnimatedImageVisual(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliVisualFactoryGetAnimatedImageVisual: Request animated image visual with a gif url" ); + + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual( TEST_GIF_FILE_NAME, ImageDimensions() ); + DALI_TEST_CHECK( visual ); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + DummyControl actor = DummyControl::New(); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( Control::CONTROL_PROPERTY_END_INDEX + 1, visual ); + Stage::GetCurrent().Add( actor ); + + application.SendNotification(); + application.Render(); + + // renderer is added to actor + DALI_TEST_CHECK( actor.GetRendererCount() == 1u ); + + // test the uniforms which used to handle the atlas rect + // the four frames should be located inside atlas as follows: atlas size 100*100 + // ------------- + // | | | + // | 0 | 1 | + // ------------- + // | | | + // | 2 | 3 | + // ------------- + + Renderer renderer = actor.GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + + Property::Value atlasRectValue = renderer.GetProperty( renderer.GetPropertyIndex( "uAtlasRect" ) ); + // take into consideration the half pixel correction + DALI_TEST_EQUALS( atlasRectValue.Get(), Vector4(0.5f, 0.5f, 49.5f, 49.5f)/100.f, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + // waiting for the resource uploading + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS( textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION ); + + // Force the timer used by the animatedImageVisual to tick, + Dali::Timer timer = Timer::New( 0 ); + timer.MockEmitSignal(); + application.SendNotification(); + application.Render(); + atlasRectValue = renderer.GetProperty( renderer.GetPropertyIndex( "uAtlasRect" ) ); + // take into consideration the half pixel correction + DALI_TEST_EQUALS( atlasRectValue.Get(), Vector4(50.5f, 0.5f, 99.5f, 49.5f)/100.f, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + // Force the timer used by the animatedImageVisual to tick, + timer.MockEmitSignal(); + application.SendNotification(); + application.Render(); + atlasRectValue = renderer.GetProperty( renderer.GetPropertyIndex( "uAtlasRect" ) ); + // take into consideration the half pixel correction + DALI_TEST_EQUALS( atlasRectValue.Get(), Vector4(0.5f, 50.5f, 49.5f, 99.5f)/100.f, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + // Force the timer used by the animatedImageVisual to tick, + timer.MockEmitSignal(); + application.SendNotification(); + application.Render(); + atlasRectValue = renderer.GetProperty( renderer.GetPropertyIndex( "uAtlasRect" ) ); + // take into consideration the half pixel correction + DALI_TEST_EQUALS( atlasRectValue.Get(), Vector4(50.5f, 50.5f, 99.5f, 99.5f)/100.f, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + // Test SetOffStage(). + actor.Unparent(); + DALI_TEST_CHECK( actor.GetRendererCount() == 0u ); + + END_TEST; +} diff --git a/dali-toolkit/internal/file.list b/dali-toolkit/internal/file.list index 7fa3af7..a4f49d9 100644 --- a/dali-toolkit/internal/file.list +++ b/dali-toolkit/internal/file.list @@ -17,6 +17,7 @@ toolkit_src_files = \ $(toolkit_src_dir)/visuals/visual-factory-cache.cpp \ $(toolkit_src_dir)/visuals/visual-factory-impl.cpp \ $(toolkit_src_dir)/visuals/visual-string-constants.cpp \ + $(toolkit_src_dir)/visuals/animated-image/animated-image-visual.cpp \ $(toolkit_src_dir)/visuals/border/border-visual.cpp \ $(toolkit_src_dir)/visuals/color/color-visual.cpp \ $(toolkit_src_dir)/visuals/gradient/gradient.cpp \ diff --git a/dali-toolkit/internal/visuals/animated-image/animated-image-visual.cpp b/dali-toolkit/internal/visuals/animated-image/animated-image-visual.cpp new file mode 100644 index 0000000..5a3a154 --- /dev/null +++ b/dali-toolkit/internal/visuals/animated-image/animated-image-visual.cpp @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2016 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// CLASS HEADER +#include "animated-image-visual.h" + +// EXTERNAL INCLUDES +#include + +// INTERNAL INCLUDES +#include +#include +#include +#include +#include +#include +#include +#include + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ + +AnimatedImageVisualPtr AnimatedImageVisual::New( VisualFactoryCache& factoryCache, const std::string& imageUrl, const Property::Map& properties ) +{ + AnimatedImageVisual* visual = new AnimatedImageVisual( factoryCache ); + visual->mImageUrl = imageUrl; + visual->SetProperties( properties ); + + return visual; +} + +AnimatedImageVisualPtr AnimatedImageVisual::New( VisualFactoryCache& factoryCache, const std::string& imageUrl ) +{ + AnimatedImageVisual* visual = new AnimatedImageVisual( factoryCache ); + visual->mImageUrl = imageUrl; + + return visual; +} + +AnimatedImageVisual::AnimatedImageVisual( VisualFactoryCache& factoryCache ) +: Visual::Base( factoryCache ), + mFrameDelayTimer(), + mImageUrl(), + mImageSize(), + mCurrentFrameIndex( 0 ) +{} + +AnimatedImageVisual::~AnimatedImageVisual() +{ +} + +void AnimatedImageVisual::GetNaturalSize( Vector2& naturalSize ) +{ + if( mImageSize.GetWidth() == 0 && mImageSize.GetHeight() == 0) + { + mImageSize = Dali::GetGifImageSize( mImageUrl ); + } + + naturalSize.width = mImageSize.GetWidth(); + naturalSize.height = mImageSize.GetHeight(); +} + +void AnimatedImageVisual::DoCreatePropertyMap( Property::Map& map ) const +{ + map.Clear(); + map.Insert( Toolkit::DevelVisual::Property::TYPE, Toolkit::Visual::IMAGE ); + if( !mImageUrl.empty() ) + { + map.Insert( Toolkit::ImageVisual::Property::URL, mImageUrl ); + } +} + +void AnimatedImageVisual::DoSetProperties( const Property::Map& propertyMap ) +{ + // url already passed in from constructor +} + +void AnimatedImageVisual::DoSetOnStage( Actor& actor ) +{ + Texture texture = PrepareAnimatedImage(); + if( texture ) // if the image loading is successful + { + Shader shader = ImageVisual::GetImageShader( mFactoryCache, true, true ); + Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); + TextureSet textureSet = TextureSet::New(); + mImpl->mRenderer = Renderer::New( geometry, shader ); + mImpl->mRenderer.SetTextures( textureSet ); + textureSet.SetTexture( 0u, PrepareAnimatedImage() ); + mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, mTextureRectContainer[0] ); + + // Register transform properties + mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT ); + + mCurrentFrameIndex = 0; + if( mFrameDelayContainer.Count() > 1 ) + { + mFrameDelayTimer = Timer::New( mFrameDelayContainer[0] ); + mFrameDelayTimer.TickSignal().Connect( this, &AnimatedImageVisual::DisplayNextFrame ); + mFrameDelayTimer.Start(); + } + + actor.AddRenderer( mImpl->mRenderer ); + } +} + +void AnimatedImageVisual::DoSetOffStage( Actor& actor ) +{ + if( !mImpl->mRenderer ) + { + return; + } + + if( mFrameDelayTimer ) + { + mFrameDelayTimer.Stop(); + mFrameDelayTimer.Reset(); + } + + mTextureRectContainer.Clear(); + mFrameDelayContainer.Clear(); + + actor.RemoveRenderer( mImpl->mRenderer ); + mImpl->mRenderer.Reset(); +} + +void AnimatedImageVisual::OnSetTransform() +{ + if( mImpl->mRenderer ) + { + mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT ); + } +} + +Texture AnimatedImageVisual::PrepareAnimatedImage() +{ + // load from image file + std::vector pixelDataList; + if( Dali::LoadAnimatedGifFromFile( mImageUrl.c_str() , pixelDataList, mFrameDelayContainer ) ) + { + mImageSize.SetWidth( pixelDataList[0].GetWidth() ); + mImageSize.SetHeight( pixelDataList[0].GetHeight() ); + + return Toolkit::ImageAtlas::PackToAtlas( pixelDataList, mTextureRectContainer ); + } + + return Texture(); +} + +bool AnimatedImageVisual::DisplayNextFrame() +{ + mCurrentFrameIndex = (mCurrentFrameIndex+1) % mFrameDelayContainer.Count(); + mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, mTextureRectContainer[mCurrentFrameIndex] ); + if( mFrameDelayTimer.GetInterval() != mFrameDelayContainer[mCurrentFrameIndex] ) + { + mFrameDelayTimer.SetInterval( mFrameDelayContainer[mCurrentFrameIndex] ); + } + + return true; +} + + +} // namespace Internal + +} // namespace Toolkit + +} // namespace Dali diff --git a/dali-toolkit/internal/visuals/animated-image/animated-image-visual.h b/dali-toolkit/internal/visuals/animated-image/animated-image-visual.h new file mode 100644 index 0000000..15dff43 --- /dev/null +++ b/dali-toolkit/internal/visuals/animated-image/animated-image-visual.h @@ -0,0 +1,156 @@ +#ifndef DALI_TOOLKIT_INTERNAL_ANIMATED_IMAGE_VISUAL_H +#define DALI_TOOLKIT_INTERNAL_ANIMATED_IMAGE_VISUAL_H + +/* + * Copyright (c) 2016 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +// EXTERNAL INCLUDES +#include +#include +#include +#include + +// INTERNAL INCLUDES +#include + +namespace Dali +{ + +namespace Toolkit +{ + +namespace Internal +{ + +class AnimatedImageVisual; +typedef IntrusivePtr< AnimatedImageVisual > AnimatedImageVisualPtr; + +/** + * The visual which renders an animated image + * + * The following property is essential + * + * | %Property Name | Type | + * |--------------------------|------------------| + * | url | STRING | + * + */ + +class AnimatedImageVisual : public Visual::Base, public ConnectionTracker +{ + +public: + + /** + * @brief Create the animated image Visual using the image URL. + * + * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object + * @param[in] imageUrl The URL to svg resource to use + * @param[in] properties A Property::Map containing settings for this visual + * @return A smart-pointer to the newly allocated visual. + */ + static AnimatedImageVisualPtr New( VisualFactoryCache& factoryCache, const std::string& imageUrl, const Property::Map& properties ); + + /** + * @brief Create the animated image visual using the image URL. + * + * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object + * @param[in] imageUrl The URL to animated image resource to use + */ + static AnimatedImageVisualPtr New( VisualFactoryCache& factoryCache, const std::string& imageUrl ); + +public: // from Visual + + /** + * @copydoc Visual::Base::GetNaturalSize + */ + virtual void GetNaturalSize( Vector2& naturalSize ); + + /** + * @copydoc Visual::Base::CreatePropertyMap + */ + virtual void DoCreatePropertyMap( Property::Map& map ) const; + +protected: + + /** + * @brief Constructor. + * + * @param[in] factoryCache A pointer pointing to the VisualFactoryCache object + */ + AnimatedImageVisual( VisualFactoryCache& factoryCache ); + + /** + * @brief A reference counted object may only be deleted by calling Unreference(). + */ + virtual ~AnimatedImageVisual(); + + /** + * @copydoc Visual::Base::DoSetProperties + */ + virtual void DoSetProperties( const Property::Map& propertyMap ); + + /** + * @copydoc Visual::Base::DoSetOnStage + */ + virtual void DoSetOnStage( Actor& actor ); + + /** + * @copydoc Visual::Base::DoSetOffStage + */ + virtual void DoSetOffStage( Actor& actor ); + + /** + * @copydoc Visual::Base::OnSetTransform + */ + virtual void OnSetTransform(); + +private: + + /** + * Load the animated image and pack the frames into atlas. + * @return That atlas texture. + */ + Texture PrepareAnimatedImage(); + + /** + * Display the next frame. It is called when the mFrameDelayTimes ticks. + */ + bool DisplayNextFrame(); + + // Undefined + AnimatedImageVisual( const AnimatedImageVisual& animatedImageVisual ); + + // Undefined + AnimatedImageVisual& operator=( const AnimatedImageVisual& animatedImageVisual ); + +private: + + Timer mFrameDelayTimer; + Dali::Vector mTextureRectContainer; + Dali::Vector mFrameDelayContainer; + std::string mImageUrl; + ImageDimensions mImageSize; + uint32_t mCurrentFrameIndex; +}; + +} // namespace Internal + +} // namespace Toolkit + +} // namespace Dali +#endif /* DALI_TOOLKIT_INTERNAL_ANIMATED_IMAGE_VISUAL_H */ diff --git a/dali-toolkit/internal/visuals/color/color-visual.cpp b/dali-toolkit/internal/visuals/color/color-visual.cpp index 08dfd20..5bc3c6e 100644 --- a/dali-toolkit/internal/visuals/color/color-visual.cpp +++ b/dali-toolkit/internal/visuals/color/color-visual.cpp @@ -131,11 +131,6 @@ void ColorVisual::OnSetTransform() void ColorVisual::InitializeRenderer() { Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); - if( !geometry ) - { - geometry = VisualFactoryCache::CreateQuadGeometry(); - mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY, geometry ); - } Shader shader = mFactoryCache.GetShader( VisualFactoryCache::COLOR_SHADER ); if( !shader ) diff --git a/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp b/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp index 80c899f..7826984 100644 --- a/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp +++ b/dali-toolkit/internal/visuals/gradient/gradient-visual.cpp @@ -322,11 +322,6 @@ void GradientVisual::DoCreatePropertyMap( Property::Map& map ) const void GradientVisual::InitializeRenderer() { Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); - if( !geometry ) - { - geometry = VisualFactoryCache::CreateQuadGeometry(); - mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY, geometry ); - } Toolkit::GradientVisual::Units::Type gradientUnits = mGradient->GetGradientUnits(); VisualFactoryCache::ShaderType shaderType = GetShaderType( mGradientType, gradientUnits ); diff --git a/dali-toolkit/internal/visuals/image/image-visual.cpp b/dali-toolkit/internal/visuals/image/image-visual.cpp index 69a1094..b61c23b 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.cpp +++ b/dali-toolkit/internal/visuals/image/image-visual.cpp @@ -185,11 +185,6 @@ Geometry CreateGeometry( VisualFactoryCache& factoryCache, ImageDimensions gridS if( gridSize == ImageDimensions( 1, 1 ) ) { geometry = factoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); - if( !geometry ) - { - geometry = VisualFactoryCache::CreateQuadGeometry(); - factoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY, geometry ); - } } else { diff --git a/dali-toolkit/internal/visuals/svg/svg-visual.cpp b/dali-toolkit/internal/visuals/svg/svg-visual.cpp index 5dbb80f..955b84c 100644 --- a/dali-toolkit/internal/visuals/svg/svg-visual.cpp +++ b/dali-toolkit/internal/visuals/svg/svg-visual.cpp @@ -100,11 +100,6 @@ void SvgVisual::DoSetOnStage( Actor& actor ) { Shader shader = ImageVisual::GetImageShader( mFactoryCache, true, true ); Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); - if( !geometry ) - { - geometry = mFactoryCache.CreateQuadGeometry(); - mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY, geometry ); - } TextureSet textureSet = TextureSet::New(); mImpl->mRenderer = Renderer::New( geometry, shader ); mImpl->mRenderer.SetTextures( textureSet ); diff --git a/dali-toolkit/internal/visuals/text/text-visual.cpp b/dali-toolkit/internal/visuals/text/text-visual.cpp index 2e7fa6d..4145bf7 100644 --- a/dali-toolkit/internal/visuals/text/text-visual.cpp +++ b/dali-toolkit/internal/visuals/text/text-visual.cpp @@ -269,11 +269,6 @@ void TextVisual::DoSetOnStage( Actor& actor ) mControl = actor; Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::QUAD_GEOMETRY ); - if( !geometry ) - { - geometry = VisualFactoryCache::CreateQuadGeometry(); - mFactoryCache.SaveGeometry( VisualFactoryCache::QUAD_GEOMETRY , geometry ); - } Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_CLAMP ); mFactoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP, shader ); diff --git a/dali-toolkit/internal/visuals/visual-factory-cache.cpp b/dali-toolkit/internal/visuals/visual-factory-cache.cpp index bf6814d..05e32ff 100644 --- a/dali-toolkit/internal/visuals/visual-factory-cache.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-cache.cpp @@ -52,6 +52,11 @@ VisualFactoryCache::~VisualFactoryCache() Geometry VisualFactoryCache::GetGeometry( GeometryType type ) { + if( !mGeometry[type] && type == QUAD_GEOMETRY ) + { + mGeometry[type] = CreateQuadGeometry(); + } + return mGeometry[type]; } diff --git a/dali-toolkit/internal/visuals/visual-factory-impl.cpp b/dali-toolkit/internal/visuals/visual-factory-impl.cpp index 92cc53c..239f5c4 100644 --- a/dali-toolkit/internal/visuals/visual-factory-impl.cpp +++ b/dali-toolkit/internal/visuals/visual-factory-impl.cpp @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -151,6 +152,10 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const Property::Map& property { visualPtr = SvgVisual::New( *( mFactoryCache.Get() ), imageUrl, propertyMap ); } + else if( UrlType::GIF == type ) + { + visualPtr = AnimatedImageVisual::New( *( mFactoryCache.Get() ), imageUrl, propertyMap ); + } else // Regular image { bool batchingEnabled( false ); @@ -259,6 +264,10 @@ Toolkit::Visual::Base VisualFactory::CreateVisual( const std::string& url, Image { visualPtr = SvgVisual::New( *( mFactoryCache.Get() ), url ); } + else if( UrlType::GIF == type ) + { + visualPtr = AnimatedImageVisual::New( *( mFactoryCache.Get() ), url ); + } else // Regular image { visualPtr = ImageVisual::New( *( mFactoryCache.Get() ), url, size ); diff --git a/dali-toolkit/internal/visuals/visual-factory-resolve-url.h b/dali-toolkit/internal/visuals/visual-factory-resolve-url.h index 1d3ffe3..2c1c45b 100644 --- a/dali-toolkit/internal/visuals/visual-factory-resolve-url.h +++ b/dali-toolkit/internal/visuals/visual-factory-resolve-url.h @@ -37,7 +37,8 @@ namespace UrlType { REGULAR_IMAGE, N_PATCH, - SVG + SVG, + GIF }; } @@ -55,7 +56,9 @@ inline UrlType::Type ResolveUrlType( const std::string& url ) // parsing from the end for better chance of early outs enum { SUFFIX, HASH, HASH_DOT } state = SUFFIX; char SVG[ 4 ] = { 'g', 'v', 's', '.' }; + char GIF[ 4 ] = { 'f', 'i', 'g', '.' }; unsigned int svgScore = 0; + unsigned int gifScore = 0; int index = count; while( --index >= 0 ) { @@ -69,6 +72,14 @@ inline UrlType::Type ResolveUrlType( const std::string& url ) return UrlType::SVG; } } + if( ( offsetFromEnd < sizeof(GIF) )&&( tolower( currentChar ) == GIF[ offsetFromEnd ] ) ) + { + // early out if GIF + if( ++gifScore == sizeof(GIF) ) + { + return UrlType::GIF; + } + } switch( state ) { case SUFFIX: diff --git a/docs/content/images/visuals/animated-image-visual.gif b/docs/content/images/visuals/animated-image-visual.gif new file mode 100644 index 0000000000000000000000000000000000000000..ddc331286a3b43230a9ad1ac6faafecc8c1a25be GIT binary patch literal 58580 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