[dali_1.2.30] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / image / image-visual.cpp
index 9ce3a92..812e854 100644 (file)
@@ -22,7 +22,6 @@
 #include <cstring> // for strncasecmp
 #include <dali/public-api/images/resource-image.h>
 #include <dali/public-api/images/native-image.h>
-#include <dali/devel-api/images/atlas.h>
 #include <dali/devel-api/images/texture-set-image.h>
 #include <dali/devel-api/adaptor-framework/bitmap-loader.h>
 #include <dali/devel-api/scripting/enum-helper.h>
@@ -59,7 +58,6 @@ const char * const IMAGE_SAMPLING_MODE( "samplingMode" );
 const char * const IMAGE_DESIRED_WIDTH( "desiredWidth" );
 const char * const IMAGE_DESIRED_HEIGHT( "desiredHeight" );
 const char * const SYNCHRONOUS_LOADING( "synchronousLoading" );
-const char * const BATCHING_ENABLED( "batchingEnabled" );
 
 // fitting modes
 DALI_ENUM_TO_STRING_TABLE_BEGIN( FITTING_MODE )
@@ -127,12 +125,13 @@ const char* FRAGMENT_SHADER_NO_ATLAS = DALI_COMPOSE_SHADER(
   varying mediump vec2 vTexCoord;\n
   uniform sampler2D sTexture;\n
   uniform lowp vec4 uColor;\n
-  uniform lowp vec4 mixColor;\n
+  uniform lowp vec3 mixColor;\n
+  uniform lowp float opacity;\n
   uniform lowp float preMultipliedAlpha;\n
   \n
   lowp vec4 visualMixColor()\n
   {\n
-    return vec4( mixColor.rgb * mix( 1.0, mixColor.a, preMultipliedAlpha ), mixColor.a );\n
+    return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n
   }\n
   void main()\n
   {\n
@@ -145,12 +144,13 @@ const char* FRAGMENT_SHADER_ATLAS_CLAMP = DALI_COMPOSE_SHADER(
     uniform sampler2D sTexture;\n
     uniform mediump vec4 uAtlasRect;\n
     uniform lowp vec4 uColor;\n
-    uniform lowp vec4 mixColor;\n
+    uniform lowp vec3 mixColor;\n
+    uniform lowp float opacity;\n
     uniform lowp float preMultipliedAlpha;\n
     \n
     lowp vec4 visualMixColor()\n
     {\n
-        return vec4( mixColor.rgb * mix( 1.0, mixColor.a, preMultipliedAlpha ), mixColor.a );\n
+        return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n
     }\n
     \n
     void main()\n
@@ -167,7 +167,8 @@ const char* FRAGMENT_SHADER_ATLAS_VARIOUS_WRAP = DALI_COMPOSE_SHADER(
     // WrapMode -- 0: CLAMP; 1: REPEAT; 2: REFLECT;
     uniform lowp vec2 wrapMode;\n
     uniform lowp vec4 uColor;\n
-    uniform lowp vec4 mixColor;\n
+    uniform lowp vec3 mixColor;\n
+    uniform lowp float opacity;\n
     uniform lowp float preMultipliedAlpha;\n
     \n
     mediump float wrapCoordinate( mediump vec2 range, mediump float coordinate, lowp float wrap )\n
@@ -182,7 +183,7 @@ const char* FRAGMENT_SHADER_ATLAS_VARIOUS_WRAP = DALI_COMPOSE_SHADER(
     \n
     lowp vec4 visualMixColor()\n
     {\n
-      return vec4( mixColor.rgb * mix( 1.0, mixColor.a, preMultipliedAlpha ), mixColor.a );\n
+      return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n
     }\n
     \n
     void main()\n
@@ -498,11 +499,13 @@ void ImageVisual::CreateNativeImageRenderer( NativeImage& nativeImage )
   std::string fragmentShader;
   const char* fragmentPreFix = nativeImage.GetCustomFragmentPreFix();
   const char* customSamplerTypename = nativeImage.GetCustomSamplerTypename();
+
   if( fragmentPreFix )
   {
     fragmentShader = fragmentPreFix;
     fragmentShader += "\n";
   }
+
   if( mImpl->mCustomShader && !mImpl->mCustomShader->mFragmentShader.empty() )
   {
     fragmentShader += mImpl->mCustomShader->mFragmentShader;
@@ -511,6 +514,7 @@ void ImageVisual::CreateNativeImageRenderer( NativeImage& nativeImage )
   {
     fragmentShader += FRAGMENT_SHADER_NO_ATLAS;
   }
+
   if( customSamplerTypename )
   {
     fragmentShader.replace( fragmentShader.find( DEFAULT_SAMPLER_TYPENAME ), strlen( DEFAULT_SAMPLER_TYPENAME ), customSamplerTypename );
@@ -623,52 +627,27 @@ void ImageVisual::InitializeRenderer( const std::string& imageUrl )
       ( strncasecmp( imageUrl.c_str(), HTTPS_URL, sizeof(HTTPS_URL) -1 ) != 0 ) )
   {
     bool defaultWrapMode = mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE;
-    bool defaultTransform = mImpl->mTransform.mSize == Vector2::ONE &&
-                            mImpl->mTransform.mOffset == Vector2::ZERO &&
-                            mImpl->mTransform.mOffsetSizeMode == Vector4::ZERO &&
-                            mImpl->mTransform.mOrigin == Toolkit::Align::CENTER &&
-                            mImpl->mTransform.mAnchorPoint == Toolkit::Align::CENTER;
-
-    bool cacheable =  defaultWrapMode && defaultTransform &&  mPixelArea == FULL_TEXTURE_RECT;
-
 
-    mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
-    if( cacheable ) // fetch the renderer from cache if exist
-    {
-      mImpl->mRenderer = mFactoryCache.GetRenderer( imageUrl );
-      mImpl->mFlags |= Impl::IS_FROM_CACHE;
-    }
+    Vector4 atlasRect;
+    // texture set has to be created first as we need to know if atlasing succeeded or not
+    // when selecting the shader
+    TextureSet textures = CreateTextureSet( atlasRect, imageUrl, IsSynchronousResourceLoading(), true );
+    CreateRenderer( textures );
 
-    if( !mImpl->mRenderer ) // new renderer is needed
+    if( mImpl->mFlags & Impl::IS_ATLASING_APPLIED ) // the texture is packed inside atlas
     {
-      Vector4 atlasRect;
-      // texture set has to be created first as we need to know if atlasing succeeded or not
-      // when selecting the shader
-      TextureSet textures = CreateTextureSet( atlasRect, imageUrl, IsSynchronousResourceLoading(), true );
-      CreateRenderer( textures );
-
-      if( mImpl->mFlags & Impl::IS_ATLASING_APPLIED ) // the texture is packed inside atlas
-      {
-        mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect );
-        if( !defaultWrapMode ) // custom wrap mode, renderer is not cached.
-        {
-          Vector2 wrapMode(mWrapModeU-WrapMode::CLAMP_TO_EDGE, mWrapModeV-WrapMode::CLAMP_TO_EDGE);
-          wrapMode.Clamp( Vector2::ZERO, Vector2( 2.f, 2.f ) );
-          mImpl->mRenderer.RegisterProperty( WRAP_MODE_UNIFORM_NAME, wrapMode );
-        }
-      }
-
-      // save the renderer to cache only when default wrap mode and default pixel area is used
-      if( cacheable )
+      mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect );
+      if( !defaultWrapMode ) // custom wrap mode, renderer is not cached.
       {
-        mFactoryCache.SaveRenderer( imageUrl, mImpl->mRenderer );
+        Vector2 wrapMode(mWrapModeU-WrapMode::CLAMP_TO_EDGE, mWrapModeV-WrapMode::CLAMP_TO_EDGE);
+        wrapMode.Clamp( Vector2::ZERO, Vector2( 2.f, 2.f ) );
+        mImpl->mRenderer.RegisterProperty( WRAP_MODE_UNIFORM_NAME, wrapMode );
       }
     }
   }
   else
   {
-    // for custom shader or remote image, renderer is not cached and atlas is not applied
-    mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
+    // for custom shader or remote image, atlas is not applied
     Vector4 atlasRect; // ignored in this case
     TextureSet textures = CreateTextureSet( atlasRect, imageUrl, IsSynchronousResourceLoading(), false );
     CreateRenderer( textures );
@@ -677,10 +656,9 @@ void ImageVisual::InitializeRenderer( const std::string& imageUrl )
 
 void ImageVisual::InitializeRenderer( const Image& image )
 {
-  mImpl->mFlags &= ~Impl::IS_FROM_CACHE;
-
   // don't reuse CreateTextureSet
   TextureSet textures = TextureSet::New();
+
   // Renderer can't be shared if mImage is NativeImage
   NativeImage nativeImage = NativeImage::DownCast( image );
   if( nativeImage )
@@ -747,7 +725,7 @@ void ImageVisual::DoSetOffStage( Actor& actor )
   actor.RemoveRenderer( mImpl->mRenderer);
   if( !mImageUrl.empty() )
   {
-    CleanCache(mImageUrl);
+    RemoveFromAtlas(mImageUrl);
     mImage.Reset();
   }
 
@@ -788,6 +766,22 @@ void ImageVisual::DoCreatePropertyMap( Property::Map& map ) const
   map.Insert( Toolkit::ImageVisual::Property::WRAP_MODE_V, mWrapModeV );
 }
 
+void ImageVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
+{
+  map.Clear();
+  map.Insert( Toolkit::DevelVisual::Property::TYPE, Toolkit::Visual::IMAGE );
+  if( !mImageUrl.empty() )
+  {
+    map.Insert( Toolkit::ImageVisual::Property::DESIRED_WIDTH, mDesiredSize.GetWidth() );
+    map.Insert( Toolkit::ImageVisual::Property::DESIRED_HEIGHT, mDesiredSize.GetHeight() );
+  }
+  else if( mImage )
+  {
+    map.Insert( Toolkit::ImageVisual::Property::DESIRED_WIDTH, static_cast<int>(mImage.GetWidth()) );
+    map.Insert( Toolkit::ImageVisual::Property::DESIRED_HEIGHT, static_cast<int>(mImage.GetHeight()) );
+  }
+}
+
 void ImageVisual::OnSetTransform()
 {
   if( mImpl->mRenderer )
@@ -862,24 +856,22 @@ void ImageVisual::OnImageLoaded( ResourceImage image )
   }
 }
 
-void ImageVisual::CleanCache(const std::string& url)
+void ImageVisual::RemoveFromAtlas(const std::string& url)
 {
-  if( IsFromCache() )
+  Vector4 atlasRect( 0.f, 0.f, 1.f, 1.f );
+  Property::Index index = mImpl->mRenderer.GetPropertyIndex( ATLAS_RECT_UNIFORM_NAME );
+  if( index != Property::INVALID_INDEX )
   {
-    Vector4 atlasRect( 0.f, 0.f, 1.f, 1.f );
-    Property::Index index = mImpl->mRenderer.GetPropertyIndex( ATLAS_RECT_UNIFORM_NAME );
-    if( index != Property::INVALID_INDEX )
-    {
-      Property::Value atlasRectValue = mImpl->mRenderer.GetProperty( index );
-      atlasRectValue.Get( atlasRect );
-    }
+    Property::Value atlasRectValue = mImpl->mRenderer.GetProperty( index );
+    atlasRectValue.Get( atlasRect );
+  }
 
-    TextureSet textureSet = mImpl->mRenderer.GetTextures();
-    mImpl->mRenderer.Reset();
-    if( mFactoryCache.CleanRendererCache( url ) && index != Property::INVALID_INDEX )
-    {
-      mFactoryCache.GetAtlasManager()->Remove( textureSet, atlasRect );
-    }
+  TextureSet textureSet = mImpl->mRenderer.GetTextures();
+  mImpl->mRenderer.Reset();
+
+  if( index != Property::INVALID_INDEX )
+  {
+    mFactoryCache.GetAtlasManager()->Remove( textureSet, atlasRect );
   }
 }