X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Frenderers%2Fimage%2Fimage-renderer.cpp;h=af155f700734d7b533071981bfc4a02678c373bd;hp=c2bec8574a9f62e24a6a29893a76b0d6f8c8f0c1;hb=d2cc1da3aea2842d9de3e2f5288d768be711fa5b;hpb=a2de9cf491172cd5da9dc9ed60b17683dab6d7bc diff --git a/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp b/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp index c2bec85..af155f7 100644 --- a/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp +++ b/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp @@ -22,9 +22,12 @@ #include // for strncasecmp #include #include +#include +#include #include // INTERNAL HEADER +#include #include #include #include @@ -45,33 +48,29 @@ namespace const char HTTP_URL[] = "http://"; const char HTTPS_URL[] = "https://"; -const char * const RENDERER_TYPE("rendererType"); -const char * const RENDERER_TYPE_VALUE("image"); - // property names -const char * const IMAGE_URL_NAME( "imageUrl" ); -const char * const IMAGE_FITTING_MODE( "imageFittingMode" ); -const char * const IMAGE_SAMPLING_MODE( "imageSamplingMode" ); -const char * const IMAGE_DESIRED_WIDTH( "imageDesiredWidth" ); -const char * const IMAGE_DESIRED_HEIGHT( "imageDesiredHeight" ); +const char * const IMAGE_FITTING_MODE( "fittingMode" ); +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" ); // fitting modes -const char * const SHRINK_TO_FIT("shrinkToFit"); -const char * const SCALE_TO_FILL("scaleToFill"); -const char * const FIT_WIDTH("fitWidth"); -const char * const FIT_HEIGHT("fitHeight"); -const char * const DEFAULT("default"); +const char * const SHRINK_TO_FIT("SHRINK_TO_FIT"); +const char * const SCALE_TO_FILL("SCALE_TO_FILL"); +const char * const FIT_WIDTH("FIT_WIDTH"); +const char * const FIT_HEIGHT("FIT_HEIGHT"); +const char * const DEFAULT("DEFAULT"); // sampling modes -const char * const BOX("box"); -const char * const NEAREST("nearest"); -const char * const LINEAR("linear"); -const char * const BOX_THEN_NEAREST("boxThenNearest"); -const char * const BOX_THEN_LINEAR("boxThenLinear"); -const char * const NO_FILTER("noFilter"); -const char * const DONT_CARE("dontCare"); - -const std::string ATLAS_RECT_UNIFORM_NAME = "uAtlasRect"; +const char * const BOX("BOX"); +const char * const NEAREST("NEAREST"); +const char * const LINEAR("LINEAR"); +const char * const BOX_THEN_NEAREST("BOX_THEN_NEAREST"); +const char * const BOX_THEN_LINEAR("BOX_THEN_LINEAR"); +const char * const NO_FILTER("NO_FILTER"); +const char * const DONT_CARE("DONT_CARE"); + const std::string PIXEL_AREA_UNIFORM_NAME = "pixelArea"; const Vector4 FULL_TEXTURE_RECT(0.f, 0.f, 1.f, 1.f); @@ -117,7 +116,7 @@ Geometry CreateGeometry( RendererFactoryCache& factoryCache, ImageDimensions gri geometry = factoryCache.GetGeometry( RendererFactoryCache::QUAD_GEOMETRY ); if( !geometry ) { - geometry = RendererFactoryCache::CreateQuadGeometry(); + geometry = Geometry::QUAD(); factoryCache.SaveGeometry( RendererFactoryCache::QUAD_GEOMETRY, geometry ); } } @@ -252,6 +251,29 @@ void ImageRenderer::DoInitialize( Actor& actor, const Property::Map& propertyMap } mDesiredSize = ImageDimensions( desiredWidth, desiredHeight ); + + } + + Property::Value* syncLoading = propertyMap.Find( SYNCHRONOUS_LOADING ); + if( syncLoading ) + { + bool sync; + syncLoading->Get( sync ); + if( sync ) + { + mImpl->mFlags |= Impl::IS_SYNCHRONOUS_RESOURCE_LOADING; + } + else + { + mImpl->mFlags &= ~Impl::IS_SYNCHRONOUS_RESOURCE_LOADING; + } + } + + // if sync loading is required, the loading should start immediately when new image url is set or the actor is off stage + // ( for on-stage actor with image url unchanged, resource loading is already finished) + if( ( !mImpl->mRenderer || imageURLValue) && IsSynchronousResourceLoading() ) + { + DoSynchronousResourceLoading(); } // remove old renderer if exit @@ -358,10 +380,7 @@ Renderer ImageRenderer::CreateRenderer() const } } - TextureSet textureSet = TextureSet::New(); - Renderer renderer = Renderer::New( geometry, shader ); - renderer.SetTextures( textureSet ); return renderer; } @@ -382,20 +401,13 @@ Renderer ImageRenderer::CreateNativeImageRenderer() const else { geometry = CreateGeometry( mFactoryCache, mImpl->mCustomShader->mGridSize ); - if( mImpl->mCustomShader->mVertexShader.empty() && mImpl->mCustomShader->mFragmentShader.empty() ) - { - shader = Shader::New( VERTEX_SHADER, mNativeFragmentShaderCode ); - } - else + shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? VERTEX_SHADER : mImpl->mCustomShader->mVertexShader, + mNativeFragmentShaderCode, + mImpl->mCustomShader->mHints ); + if( mImpl->mCustomShader->mVertexShader.empty() ) { - shader = Shader::New( mImpl->mCustomShader->mVertexShader.empty() ? VERTEX_SHADER : mImpl->mCustomShader->mVertexShader, - mNativeFragmentShaderCode, - mImpl->mCustomShader->mHints ); - if( mImpl->mCustomShader->mVertexShader.empty() ) - { - shader.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT ); - shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); - } + shader.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, FULL_TEXTURE_RECT ); + shader.RegisterProperty( PIXEL_AREA_UNIFORM_NAME, FULL_TEXTURE_RECT ); } } @@ -406,6 +418,82 @@ Renderer ImageRenderer::CreateNativeImageRenderer() const return renderer; } + +bool ImageRenderer::IsSynchronousResourceLoading() const +{ + return mImpl->mFlags & Impl::IS_SYNCHRONOUS_RESOURCE_LOADING; +} + +void ImageRenderer::DoSynchronousResourceLoading() +{ + if( !mImageUrl.empty() ) + { + BitmapLoader loader = BitmapLoader::New( mImageUrl, mDesiredSize, mFittingMode, mSamplingMode ); + loader.Load(); + mPixels = loader.GetPixelData(); + } +} + +Image ImageRenderer::LoadImage( const std::string& url, bool synchronousLoading ) +{ + if( synchronousLoading ) + { + if( !mPixels ) + { + // use broken image + return RendererFactory::GetBrokenRendererImage(); + } + Atlas image = Atlas::New( mPixels->GetWidth(), mPixels->GetHeight(), mPixels->GetPixelFormat() ); + image.Upload( mPixels, 0, 0 ); + return image; + } + else + { + ResourceImage resourceImage = Dali::ResourceImage::New( url, mDesiredSize, mFittingMode, mSamplingMode ); + resourceImage.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded ); + return resourceImage; + } +} + +TextureSet ImageRenderer::CreateTextureSet( Vector4& textureRect, const std::string& url, bool synchronousLoading ) +{ + TextureSet textureSet; + textureRect = FULL_TEXTURE_RECT; + if( synchronousLoading ) + { + if( !mPixels ) + { + // use broken image + textureSet = TextureSet::New(); + textureSet.SetImage( 0u, RendererFactory::GetBrokenRendererImage() ); + } + else + { + textureSet = mAtlasManager.Add(textureRect, mPixels ); + if( !textureSet ) // big image, no atlasing + { + Atlas image = Atlas::New( mPixels->GetWidth(), mPixels->GetHeight(), mPixels->GetPixelFormat() ); + image.Upload( mPixels, 0, 0 ); + textureSet = TextureSet::New(); + textureSet.SetImage( 0u, image ); + } + } + } + else + { + textureSet = mAtlasManager.Add(textureRect, url, mDesiredSize, mFittingMode, mSamplingMode ); + if( !textureSet ) // big image, no atlasing + { + ResourceImage resourceImage = Dali::ResourceImage::New( url, mDesiredSize, mFittingMode, mSamplingMode ); + resourceImage.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded ); + textureSet = TextureSet::New(); + textureSet.SetImage( 0u, resourceImage ); + } + } + + return textureSet; +} + void ImageRenderer::InitializeRenderer( const std::string& imageUrl ) { if( imageUrl.empty() ) @@ -424,25 +512,15 @@ void ImageRenderer::InitializeRenderer( const std::string& imageUrl ) if( !mImpl->mRenderer ) { Vector4 atlasRect; - TextureSet textureSet = mAtlasManager.Add(atlasRect, imageUrl, mDesiredSize, mFittingMode, mSamplingMode ); - if( textureSet ) + TextureSet textureSet = CreateTextureSet(atlasRect, imageUrl, IsSynchronousResourceLoading() ); + Geometry geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) ); + Shader shader( GetImageShader(mFactoryCache) ); + mImpl->mRenderer = Renderer::New( geometry, shader ); + mImpl->mRenderer.SetTextures( textureSet ); + if( atlasRect != FULL_TEXTURE_RECT ) { - Geometry geometry = CreateGeometry( mFactoryCache, ImageDimensions( 1, 1 ) ); - Shader shader( GetImageShader(mFactoryCache) ); - mImpl->mRenderer = Renderer::New( geometry, shader ); - mImpl->mRenderer.SetTextures( textureSet ); mImpl->mRenderer.RegisterProperty( ATLAS_RECT_UNIFORM_NAME, atlasRect ); } - else // big image, atlasing is not applied - { - mImpl->mRenderer = CreateRenderer(); - - ResourceImage image = Dali::ResourceImage::New( imageUrl, mDesiredSize, mFittingMode, mSamplingMode ); - image.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded ); - TextureSet textureSet = mImpl->mRenderer.GetTextures(); - textureSet.SetImage( 0u, image ); - } - mFactoryCache.SaveRenderer( imageUrl, mImpl->mRenderer ); } @@ -454,9 +532,8 @@ void ImageRenderer::InitializeRenderer( const std::string& imageUrl ) mImpl->mFlags &= ~Impl::IS_FROM_CACHE; mImpl->mRenderer = CreateRenderer(); - ResourceImage resourceImage = Dali::ResourceImage::New( imageUrl, mDesiredSize, mFittingMode, mSamplingMode ); - resourceImage.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded ); - ApplyImageToSampler( resourceImage ); + Image image = LoadImage( imageUrl, IsSynchronousResourceLoading() ); + ApplyImageToSampler( image ); } } @@ -505,7 +582,10 @@ void ImageRenderer::DoSetOffStage( Actor& actor ) void ImageRenderer::DoCreatePropertyMap( Property::Map& map ) const { map.Clear(); - map.Insert( RENDERER_TYPE, RENDERER_TYPE_VALUE ); + map.Insert( RENDERER_TYPE, IMAGE_RENDERER ); + + bool sync = IsSynchronousResourceLoading(); + map.Insert( SYNCHRONOUS_LOADING, sync ); if( !mImageUrl.empty() ) { map.Insert( IMAGE_URL_NAME, mImageUrl ); @@ -622,6 +702,11 @@ void ImageRenderer::SetImage( Actor& actor, const std::string& imageUrl, ImageDi mSamplingMode = samplingMode; mImage.Reset(); + if( IsSynchronousResourceLoading() ) + { + DoSynchronousResourceLoading(); + } + if( mImpl->mRenderer ) { if( GetIsFromCache() ) // if renderer is from cache, remove the old one @@ -645,8 +730,7 @@ void ImageRenderer::SetImage( Actor& actor, const std::string& imageUrl, ImageDi } else // if renderer is not from cache, reuse the same renderer and only change the texture { - ResourceImage image = Dali::ResourceImage::New( imageUrl, mDesiredSize, mFittingMode, mSamplingMode ); - image.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded ); + Image image = LoadImage( imageUrl, IsSynchronousResourceLoading() ); ApplyImageToSampler( image ); } } @@ -737,10 +821,12 @@ void ImageRenderer::ApplyImageToSampler( const Image& image ) if( image ) { TextureSet textureSet = mImpl->mRenderer.GetTextures(); - if( textureSet ) + if( !textureSet ) { - textureSet.SetImage( 0u, image ); + textureSet = TextureSet::New(); + mImpl->mRenderer.SetTextures( textureSet ); } + textureSet.SetImage( 0u, image ); } } @@ -799,7 +885,6 @@ void ImageRenderer::SetNativeFragmentShaderCode( Dali::NativeImage& nativeImage { mNativeFragmentShaderCode.replace( mNativeFragmentShaderCode.find( DEFAULT_SAMPLER_TYPENAME ), strlen( DEFAULT_SAMPLER_TYPENAME ), customSamplerTypename ); } - } } // namespace Internal