X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fimage%2Fimage-visual.cpp;h=ceb366928377f5a2e282752f50b0937cb39df158;hp=8845541bfcb5c903545e3dbbd65904c9580f3f31;hb=4b11a25bb26aeb1eaef96ac024de6009a790387f;hpb=2aab2479f7e6d127df4de063328570cc247ce6d4 diff --git a/dali-toolkit/internal/visuals/image/image-visual.cpp b/dali-toolkit/internal/visuals/image/image-visual.cpp index 8845541..ceb3669 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.cpp +++ b/dali-toolkit/internal/visuals/image/image-visual.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 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. @@ -42,6 +42,7 @@ #include #include #include +#include namespace Dali { @@ -94,15 +95,15 @@ DALI_ENUM_TO_STRING_TABLE_END( WRAP_MODE ) // load policies DALI_ENUM_TO_STRING_TABLE_BEGIN( LOAD_POLICY ) -DALI_ENUM_TO_STRING_WITH_SCOPE( DevelImageVisual::LoadPolicy, IMMEDIATE ) -DALI_ENUM_TO_STRING_WITH_SCOPE( DevelImageVisual::LoadPolicy, ATTACHED ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::Toolkit::ImageVisual::LoadPolicy, IMMEDIATE ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::Toolkit::ImageVisual::LoadPolicy, ATTACHED ) DALI_ENUM_TO_STRING_TABLE_END( LOAD_POLICY ) // release policies DALI_ENUM_TO_STRING_TABLE_BEGIN( RELEASE_POLICY ) -DALI_ENUM_TO_STRING_WITH_SCOPE( DevelImageVisual::ReleasePolicy, DETACHED ) -DALI_ENUM_TO_STRING_WITH_SCOPE( DevelImageVisual::ReleasePolicy, DESTROYED ) -DALI_ENUM_TO_STRING_WITH_SCOPE( DevelImageVisual::ReleasePolicy, NEVER ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::Toolkit::ImageVisual::ReleasePolicy, DETACHED ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::Toolkit::ImageVisual::ReleasePolicy, DESTROYED ) +DALI_ENUM_TO_STRING_WITH_SCOPE( Dali::Toolkit::ImageVisual::ReleasePolicy, NEVER ) DALI_ENUM_TO_STRING_TABLE_END( RELEASE_POLICY ) const Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f); @@ -112,114 +113,6 @@ const char* DEFAULT_SAMPLER_TYPENAME = "sampler2D"; const float PIXEL_ALIGN_ON = 1.0f; const float PIXEL_ALIGN_OFF = 0.0f; -const char* VERTEX_SHADER = DALI_COMPOSE_SHADER( - attribute mediump vec2 aPosition;\n - uniform mediump mat4 uModelMatrix;\n - uniform mediump mat4 uViewMatrix;\n - uniform mediump mat4 uProjection;\n - uniform mediump vec3 uSize;\n - uniform mediump vec4 pixelArea; - varying mediump vec2 vTexCoord;\n - uniform lowp float uPixelAligned;\n - \n - //Visual size and offset - uniform mediump vec2 offset;\n - uniform mediump vec2 size;\n - uniform mediump vec4 offsetSizeMode;\n - uniform mediump vec2 origin;\n - uniform mediump vec2 anchorPoint;\n -\n - vec4 ComputeVertexPosition()\n - {\n - vec2 visualSize = mix(uSize.xy*size, size, offsetSizeMode.zw );\n - vec2 visualOffset = mix( offset, offset/uSize.xy, offsetSizeMode.xy);\n - return vec4( (aPosition + anchorPoint)*visualSize + (visualOffset + origin)*uSize.xy, 0.0, 1.0 );\n - }\n -\n - void main()\n - {\n - mediump vec4 vertexPosition = uViewMatrix * uModelMatrix * ComputeVertexPosition();\n - vec4 alignedVertexPosition = vertexPosition;\n - alignedVertexPosition.xy = floor ( vertexPosition.xy );\n // Pixel alignment - vertexPosition = uProjection * mix( vertexPosition, alignedVertexPosition, uPixelAligned );\n - vTexCoord = pixelArea.xy+pixelArea.zw*(aPosition + vec2(0.5) );\n - gl_Position = vertexPosition;\n - }\n -); - -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 vec3 mixColor;\n - uniform lowp float opacity;\n - uniform lowp float preMultipliedAlpha;\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n - void main()\n - {\n - gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor * visualMixColor();\n - }\n -); - -const char* FRAGMENT_SHADER_ATLAS_CLAMP = DALI_COMPOSE_SHADER( - varying mediump vec2 vTexCoord;\n - uniform sampler2D sTexture;\n - uniform mediump vec4 uAtlasRect;\n - uniform lowp vec4 uColor;\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 * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n - \n - void main()\n - {\n - mediump vec2 texCoord = clamp( mix( uAtlasRect.xy, uAtlasRect.zw, vTexCoord ), uAtlasRect.xy, uAtlasRect.zw );\n - gl_FragColor = texture2D( sTexture, texCoord ) * uColor * visualMixColor();\n - }\n -); - -const char* FRAGMENT_SHADER_ATLAS_VARIOUS_WRAP = DALI_COMPOSE_SHADER( - varying mediump vec2 vTexCoord;\n - uniform sampler2D sTexture;\n - uniform mediump vec4 uAtlasRect;\n - // WrapMode -- 0: CLAMP; 1: REPEAT; 2: REFLECT; - uniform lowp vec2 wrapMode;\n - uniform lowp vec4 uColor;\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 - {\n - mediump float coord;\n - if( wrap > 1.5 )\n // REFLECT - coord = 1.0-abs(fract(coordinate*0.5)*2.0 - 1.0);\n - else \n// warp == 0 or 1 - coord = mix(coordinate, fract( coordinate ), wrap);\n - return clamp( mix(range.x, range.y, coord), range.x, range.y ); - }\n - \n - lowp vec4 visualMixColor()\n - {\n - return vec4( mixColor * mix( 1.0, opacity, preMultipliedAlpha ), opacity );\n - }\n - \n - void main()\n - {\n - mediump vec2 texCoord = vec2( wrapCoordinate( uAtlasRect.xz, vTexCoord.x, wrapMode.x ), - wrapCoordinate( uAtlasRect.yw, vTexCoord.y, wrapMode.y ) );\n - gl_FragColor = texture2D( sTexture, texCoord ) * uColor * visualMixColor();\n - }\n -); - Geometry CreateGeometry( VisualFactoryCache& factoryCache, ImageDimensions gridSize ) { Geometry geometry; @@ -239,37 +132,40 @@ Geometry CreateGeometry( VisualFactoryCache& factoryCache, ImageDimensions gridS } // unnamed namespace ImageVisualPtr ImageVisual::New( VisualFactoryCache& factoryCache, + ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, const Property::Map& properties, ImageDimensions size, FittingMode::Type fittingMode, Dali::SamplingMode::Type samplingMode ) { - ImageVisualPtr imageVisualPtr( new ImageVisual( factoryCache, imageUrl, size, fittingMode, samplingMode ) ); + ImageVisualPtr imageVisualPtr( new ImageVisual( factoryCache, shaderFactory, imageUrl, size, fittingMode, samplingMode ) ); imageVisualPtr->SetProperties( properties ); return imageVisualPtr; } ImageVisualPtr ImageVisual::New( VisualFactoryCache& factoryCache, + ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, ImageDimensions size, FittingMode::Type fittingMode, Dali::SamplingMode::Type samplingMode ) { - return new ImageVisual( factoryCache, imageUrl, size, fittingMode, samplingMode ); + return new ImageVisual( factoryCache, shaderFactory, imageUrl, size, fittingMode, samplingMode ); } -ImageVisualPtr ImageVisual::New( VisualFactoryCache& factoryCache, const Image& image ) +ImageVisualPtr ImageVisual::New( VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const Image& image ) { - return new ImageVisual( factoryCache, image ); + return new ImageVisual( factoryCache, shaderFactory, image ); } ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, + ImageVisualShaderFactory& shaderFactory, const VisualUrl& imageUrl, ImageDimensions size, FittingMode::Type fittingMode, Dali::SamplingMode::Type samplingMode ) -: Visual::Base( factoryCache ), +: Visual::Base( factoryCache, Visual::FittingMode::FILL ), mImage(), mPixelArea( FULL_TEXTURE_RECT ), mPlacementActor(), @@ -278,21 +174,24 @@ ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, mDesiredSize( size ), mTextureId( TextureManager::INVALID_TEXTURE_ID ), mTextures(), + mImageVisualShaderFactory( shaderFactory ), mFittingMode( fittingMode ), mSamplingMode( samplingMode ), mWrapModeU( WrapMode::DEFAULT ), mWrapModeV( WrapMode::DEFAULT ), - mLoadPolicy( DevelImageVisual::LoadPolicy::ATTACHED ), - mReleasePolicy( DevelImageVisual::ReleasePolicy::DETACHED ), + mLoadPolicy( Toolkit::ImageVisual::LoadPolicy::ATTACHED ), + mReleasePolicy( Toolkit::ImageVisual::ReleasePolicy::DETACHED ), mAtlasRect( 0.0f, 0.0f, 0.0f, 0.0f ), + mAtlasRectSize( 0, 0 ), mAttemptAtlasing( false ), mLoading( false ), mOrientationCorrection( true ) { + EnablePreMultipliedAlpha( mFactoryCache.GetPreMultiplyOnLoad() ); } -ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, const Image& image ) -: Visual::Base( factoryCache ), +ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory, const Image& image ) +: Visual::Base( factoryCache, Visual::FittingMode::FIT_KEEP_ASPECT_RATIO ), mImage( image ), mPixelArea( FULL_TEXTURE_RECT ), mPlacementActor(), @@ -301,17 +200,19 @@ ImageVisual::ImageVisual( VisualFactoryCache& factoryCache, const Image& image ) mDesiredSize(), mTextureId( TextureManager::INVALID_TEXTURE_ID ), mTextures(), + mImageVisualShaderFactory( shaderFactory ), mFittingMode( FittingMode::DEFAULT ), mSamplingMode( SamplingMode::DEFAULT ), mWrapModeU( WrapMode::DEFAULT ), mWrapModeV( WrapMode::DEFAULT ), - mLoadPolicy( DevelImageVisual::LoadPolicy::ATTACHED ), - mReleasePolicy( DevelImageVisual::ReleasePolicy::DESTROYED ), + mLoadPolicy( Toolkit::ImageVisual::LoadPolicy::ATTACHED ), + mReleasePolicy( Toolkit::ImageVisual::ReleasePolicy::DESTROYED ), mAtlasRect( 0.0f, 0.0f, 0.0f, 0.0f ), mAttemptAtlasing( false ), mLoading( false ), mOrientationCorrection( true ) { + EnablePreMultipliedAlpha( mFactoryCache.GetPreMultiplyOnLoad() ); } ImageVisual::~ImageVisual() @@ -326,12 +227,12 @@ ImageVisual::~ImageVisual() if( mMaskingData->mAlphaMaskId != TextureManager::INVALID_TEXTURE_ID ) { TextureManager& textureManager = mFactoryCache.GetTextureManager(); - textureManager.Remove( mMaskingData->mAlphaMaskId ); + textureManager.Remove( mMaskingData->mAlphaMaskId, this ); } } // ImageVisual destroyed so remove texture unless ReleasePolicy is set to never release - if( ( mTextureId != TextureManager::INVALID_TEXTURE_ID ) && ( mReleasePolicy != DevelImageVisual::ReleasePolicy::NEVER ) ) + if( ( mTextureId != TextureManager::INVALID_TEXTURE_ID ) && ( mReleasePolicy != Toolkit::ImageVisual::ReleasePolicy::NEVER ) ) { RemoveTexture(); } @@ -400,20 +301,20 @@ void ImageVisual::DoSetProperties( const Property::Map& propertyMap ) } else if ( keyValue.first == LOAD_POLICY_NAME ) { - DoSetProperty( Toolkit::DevelImageVisual::Property::LOAD_POLICY, keyValue.second ); + DoSetProperty( Toolkit::ImageVisual::Property::LOAD_POLICY, keyValue.second ); } else if( keyValue.first == RELEASE_POLICY_NAME ) { - DoSetProperty( Toolkit::DevelImageVisual::Property::RELEASE_POLICY, keyValue.second ); + DoSetProperty( Toolkit::ImageVisual::Property::RELEASE_POLICY, keyValue.second ); } else if( keyValue.first == ORIENTATION_CORRECTION_NAME ) { - DoSetProperty( Toolkit::DevelImageVisual::Property::ORIENTATION_CORRECTION, keyValue.second ); + DoSetProperty( Toolkit::ImageVisual::Property::ORIENTATION_CORRECTION, keyValue.second ); } } } // Load image immediately if LOAD_POLICY requires it - if ( mLoadPolicy == DevelImageVisual::LoadPolicy::IMMEDIATE ) + if ( mLoadPolicy == Toolkit::ImageVisual::LoadPolicy::IMMEDIATE ) { auto attemptAtlasing = AttemptAtlasing(); LoadTexture( attemptAtlasing, mAtlasRect, mTextures, mOrientationCorrection, @@ -427,7 +328,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v { case Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING: { - bool sync; + bool sync = false; if( value.Get( sync ) ) { if( sync ) @@ -448,7 +349,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v case Toolkit::ImageVisual::Property::DESIRED_WIDTH: { - float desiredWidth; + float desiredWidth = 0.0f; if( value.Get( desiredWidth ) ) { mDesiredSize.SetWidth( desiredWidth ); @@ -462,7 +363,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v case Toolkit::ImageVisual::Property::DESIRED_HEIGHT: { - float desiredHeight; + float desiredHeight = 0.0f; if( value.Get( desiredHeight ) ) { mDesiredSize.SetHeight( desiredHeight ); @@ -476,7 +377,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v case Toolkit::ImageVisual::Property::FITTING_MODE: { - int fittingMode; + int fittingMode = 0; Scripting::GetEnumerationProperty( value, FITTING_MODE_TABLE, FITTING_MODE_TABLE_COUNT, fittingMode ); mFittingMode = Dali::FittingMode::Type( fittingMode ); break; @@ -484,7 +385,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v case Toolkit::ImageVisual::Property::SAMPLING_MODE: { - int samplingMode; + int samplingMode = 0; Scripting::GetEnumerationProperty( value, SAMPLING_MODE_TABLE, SAMPLING_MODE_TABLE_COUNT, samplingMode ); mSamplingMode = Dali::SamplingMode::Type( samplingMode ); break; @@ -498,7 +399,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v case Toolkit::ImageVisual::Property::WRAP_MODE_U: { - int wrapMode; + int wrapMode = 0; Scripting::GetEnumerationProperty( value, WRAP_MODE_TABLE, WRAP_MODE_TABLE_COUNT, wrapMode ); mWrapModeU = Dali::WrapMode::Type( wrapMode ); break; @@ -506,7 +407,7 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v case Toolkit::ImageVisual::Property::WRAP_MODE_V: { - int wrapMode; + int wrapMode = 0; Scripting::GetEnumerationProperty( value, WRAP_MODE_TABLE, WRAP_MODE_TABLE_COUNT, wrapMode ); mWrapModeV = Dali::WrapMode::Type( wrapMode ); break; @@ -520,21 +421,18 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v case Toolkit::ImageVisual::Property::ALPHA_MASK_URL: { - std::string alphaUrl; + std::string alphaUrl = ""; if( value.Get( alphaUrl ) ) { AllocateMaskData(); - // Immediately trigger the alpha mask loading (it may just get a cached value) mMaskingData->mAlphaMaskUrl = alphaUrl; - TextureManager& textureManager = mFactoryCache.GetTextureManager(); - mMaskingData->mAlphaMaskId = textureManager.RequestMaskLoad( alphaUrl ); } break; } case Toolkit::ImageVisual::Property::MASK_CONTENT_SCALE: { - float scale; + float scale = 1.0f; if( value.Get( scale ) ) { AllocateMaskData(); @@ -554,22 +452,22 @@ void ImageVisual::DoSetProperty( Property::Index index, const Property::Value& v break; } - case Toolkit::DevelImageVisual::Property::RELEASE_POLICY: + case Toolkit::ImageVisual::Property::RELEASE_POLICY: { - int releasePolicy; + int releasePolicy = 0; Scripting::GetEnumerationProperty( value, RELEASE_POLICY_TABLE, RELEASE_POLICY_TABLE_COUNT, releasePolicy ); - mReleasePolicy = DevelImageVisual::ReleasePolicy::Type( releasePolicy ); + mReleasePolicy = Toolkit::ImageVisual::ReleasePolicy::Type( releasePolicy ); break; } - case Toolkit::DevelImageVisual::Property::LOAD_POLICY: + case Toolkit::ImageVisual::Property::LOAD_POLICY: { - int loadPolicy; + int loadPolicy = 0; Scripting::GetEnumerationProperty( value, LOAD_POLICY_TABLE, LOAD_POLICY_TABLE_COUNT, loadPolicy ); - mLoadPolicy = DevelImageVisual::LoadPolicy::Type( loadPolicy ); + mLoadPolicy = Toolkit::ImageVisual::LoadPolicy::Type( loadPolicy ); break; } - case Toolkit::DevelImageVisual::Property::ORIENTATION_CORRECTION: + case Toolkit::ImageVisual::Property::ORIENTATION_CORRECTION: { bool orientationCorrection( mOrientationCorrection ); if( value.Get( orientationCorrection ) ) @@ -605,8 +503,14 @@ void ImageVisual::GetNaturalSize( Vector2& naturalSize ) } else if( mImpl->mRenderer ) // Check if we have a loaded image { - auto textureSet = mImpl->mRenderer.GetTextures(); + if( mImpl->mFlags & Impl::IS_ATLASING_APPLIED ) + { + naturalSize.x = mAtlasRectSize.GetWidth(); + naturalSize.y = mAtlasRectSize.GetHeight(); + return; + } + auto textureSet = mImpl->mRenderer.GetTextures(); if( textureSet ) { auto texture = textureSet.GetTexture(0); @@ -640,7 +544,7 @@ void ImageVisual::GetNaturalSize( Vector2& naturalSize ) } else { - Image brokenImage = VisualFactoryCache::GetBrokenVisualImage(); + Image brokenImage = mFactoryCache.GetBrokenVisualImage(); naturalSize.x = brokenImage.GetWidth(); naturalSize.y = brokenImage.GetWidth(); @@ -661,7 +565,7 @@ void ImageVisual::CreateRenderer( TextureSet& textureSet ) { geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) ); - shader = GetImageShader( mFactoryCache, + shader = mImageVisualShaderFactory.GetShader( mFactoryCache, mImpl->mFlags & Impl::IS_ATLASING_APPLIED, mWrapModeU <= WrapMode::CLAMP_TO_EDGE && mWrapModeV <= WrapMode::CLAMP_TO_EDGE ); } @@ -670,13 +574,15 @@ void ImageVisual::CreateRenderer( TextureSet& textureSet ) geometry = CreateGeometry( mFactoryCache, mImpl->mCustomShader->mGridSize ); if( mImpl->mCustomShader->mVertexShader.empty() && mImpl->mCustomShader->mFragmentShader.empty() ) { - shader = GetImageShader( mFactoryCache, false, true ); + // Use custom hints + shader = Shader::New( mImageVisualShaderFactory.GetVertexShaderSource(), mImageVisualShaderFactory.GetFragmentShaderSource(), mImpl->mCustomShader->mHints ); + shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); } else { - shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? VERTEX_SHADER : mImpl->mCustomShader->mVertexShader, - mImpl->mCustomShader->mFragmentShader.empty() ? FRAGMENT_SHADER_NO_ATLAS : mImpl->mCustomShader->mFragmentShader, - mImpl->mCustomShader->mHints ); + shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource() : mImpl->mCustomShader->mVertexShader, + mImpl->mCustomShader->mFragmentShader.empty() ? mImageVisualShaderFactory.GetFragmentShaderSource() : mImpl->mCustomShader->mFragmentShader, + mImpl->mCustomShader->mHints ); if( mImpl->mCustomShader->mVertexShader.empty() ) { shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); @@ -698,6 +604,8 @@ void ImageVisual::CreateRenderer( TextureSet& textureSet ) //Register transform properties mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT ); + + EnablePreMultipliedAlpha( IsPreMultipliedAlphaEnabled() ); } void ImageVisual::CreateNativeImageRenderer( NativeImage& nativeImage ) @@ -721,7 +629,7 @@ void ImageVisual::CreateNativeImageRenderer( NativeImage& nativeImage ) } else { - fragmentShader += FRAGMENT_SHADER_NO_ATLAS; + fragmentShader += mImageVisualShaderFactory.GetFragmentShaderSource(); } if( customSamplerTypename ) @@ -733,13 +641,13 @@ void ImageVisual::CreateNativeImageRenderer( NativeImage& nativeImage ) { geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) ); - shader = Shader::New( VERTEX_SHADER, fragmentShader ); + shader = Shader::New( mImageVisualShaderFactory.GetVertexShaderSource(), fragmentShader ); shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); } else { geometry = CreateGeometry( mFactoryCache, mImpl->mCustomShader->mGridSize ); - shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? VERTEX_SHADER : mImpl->mCustomShader->mVertexShader, + shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? mImageVisualShaderFactory.GetVertexShaderSource() : mImpl->mCustomShader->mVertexShader, fragmentShader, mImpl->mCustomShader->mHints ); if( mImpl->mCustomShader->mVertexShader.empty() ) @@ -754,7 +662,6 @@ void ImageVisual::CreateNativeImageRenderer( NativeImage& nativeImage ) mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT ); } - bool ImageVisual::IsSynchronousResourceLoading() const { return mImpl->mFlags & Impl::IS_SYNCHRONOUS_RESOURCE_LOADING; @@ -775,12 +682,20 @@ void ImageVisual::LoadTexture( bool& atlasing, Vector4& atlasRect, TextureSet& t atlasUploadObserver = this; } + auto preMultiplyOnLoad = IsPreMultipliedAlphaEnabled() && !mImpl->mCustomShader + ? TextureManager::MultiplyOnLoad::MULTIPLY_ON_LOAD + : TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY; + textures = textureManager.LoadTexture( mImageUrl, mDesiredSize, mFittingMode, mSamplingMode, mMaskingData, IsSynchronousResourceLoading(), mTextureId, - atlasRect, atlasing, mLoading, mWrapModeU, + atlasRect, mAtlasRectSize, atlasing, mLoading, mWrapModeU, mWrapModeV, textureObserver, atlasUploadObserver, atlasManager, - mOrientationCorrection, - forceReload ); + mOrientationCorrection, forceReload, preMultiplyOnLoad); + + if( textures ) + { + EnablePreMultipliedAlpha( preMultiplyOnLoad == TextureManager::MultiplyOnLoad::MULTIPLY_ON_LOAD ); + } if( atlasing ) // Flag needs to be set before creating renderer { @@ -892,9 +807,10 @@ void ImageVisual::DoSetOffStage( Actor& actor ) // Image release is dependent on the ReleasePolicy, renderer is destroyed. actor.RemoveRenderer( mImpl->mRenderer); - if( mReleasePolicy == DevelImageVisual::ReleasePolicy::DETACHED ) + if( mReleasePolicy == Toolkit::ImageVisual::ReleasePolicy::DETACHED ) { RemoveTexture(); // If INVALID_TEXTURE_ID then removal will be attempted on atlas + mImpl->mResourceStatus = Toolkit::Visual::ResourceStatus::PREPARING; } if( mImageUrl.IsValid() ) @@ -948,9 +864,9 @@ void ImageVisual::DoCreatePropertyMap( Property::Map& map ) const map.Insert( Toolkit::ImageVisual::Property::CROP_TO_MASK, mMaskingData->mCropToMask ); } - map.Insert( Toolkit::DevelImageVisual::Property::LOAD_POLICY, mLoadPolicy ); - map.Insert( Toolkit::DevelImageVisual::Property::RELEASE_POLICY, mReleasePolicy ); - map.Insert( Toolkit::DevelImageVisual::Property::ORIENTATION_CORRECTION, mOrientationCorrection ); + map.Insert( Toolkit::ImageVisual::Property::LOAD_POLICY, mLoadPolicy ); + map.Insert( Toolkit::ImageVisual::Property::RELEASE_POLICY, mReleasePolicy ); + map.Insert( Toolkit::ImageVisual::Property::ORIENTATION_CORRECTION, mOrientationCorrection ); } void ImageVisual::DoCreateInstancePropertyMap( Property::Map& map ) const @@ -999,46 +915,6 @@ bool ImageVisual::IsResourceReady() const mImpl->mResourceStatus == Toolkit::Visual::ResourceStatus::FAILED ); } -Shader ImageVisual::GetImageShader( VisualFactoryCache& factoryCache, bool atlasing, bool defaultTextureWrapping ) -{ - Shader shader; - if( atlasing ) - { - if( defaultTextureWrapping ) - { - shader = factoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP ); - if( !shader ) - { - shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_CLAMP ); - shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); - factoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_DEFAULT_WRAP, shader ); - } - } - else - { - shader = factoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_CUSTOM_WRAP ); - if( !shader ) - { - shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_ATLAS_VARIOUS_WRAP ); - shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); - factoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER_ATLAS_CUSTOM_WRAP, shader ); - } - } - } - else - { - shader = factoryCache.GetShader( VisualFactoryCache::IMAGE_SHADER ); - if( !shader ) - { - shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER_NO_ATLAS ); - shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); - factoryCache.SaveShader( VisualFactoryCache::IMAGE_SHADER, shader ); - } - } - - return shader; -} - void ImageVisual::ApplyImageToSampler( const Image& image ) { if( image ) @@ -1073,40 +949,44 @@ void ImageVisual::UploadCompleted() // From Texture Manager void ImageVisual::UploadComplete( bool loadingSuccess, int32_t textureId, TextureSet textureSet, bool usingAtlas, - const Vector4& atlasRectangle ) + const Vector4& atlasRectangle, bool preMultiplied ) { Toolkit::Visual::ResourceStatus resourceStatus; - Actor actor = mPlacementActor.GetHandle(); - if( actor ) + if( mImpl->mRenderer ) { - if( mImpl->mRenderer ) + if( usingAtlas ) { - if( usingAtlas ) - { - mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, mAtlasRect ); - } + mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, mAtlasRect ); + } + EnablePreMultipliedAlpha( preMultiplied ); + + 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(); - if( loadingSuccess ) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode( mWrapModeU, mWrapModeV ); - textureSet.SetSampler( 0u, sampler ); - mImpl->mRenderer.SetTextures(textureSet); - } - else - { - Image brokenImage = VisualFactoryCache::GetBrokenVisualImage(); + } - textureSet = TextureSet::New(); - mImpl->mRenderer.SetTextures( textureSet ); + if( loadingSuccess ) + { + Sampler sampler = Sampler::New(); + sampler.SetWrapMode( mWrapModeU, mWrapModeV ); + textureSet.SetSampler( 0u, sampler ); + mImpl->mRenderer.SetTextures(textureSet); + } + else + { + Image brokenImage = mFactoryCache.GetBrokenVisualImage(); - ApplyImageToSampler( brokenImage ); - } + textureSet = TextureSet::New(); + mImpl->mRenderer.SetTextures( textureSet ); + + ApplyImageToSampler( brokenImage ); } } + // Storing TextureSet needed when renderer staged. if( ! mImpl->mRenderer ) { @@ -1131,7 +1011,7 @@ void ImageVisual::RemoveTexture() { if( mTextureId != TextureManager::INVALID_TEXTURE_ID ) { - mFactoryCache.GetTextureManager().Remove( mTextureId ); + mFactoryCache.GetTextureManager().Remove( mTextureId, this ); mTextureId = TextureManager::INVALID_TEXTURE_ID; } else