From 909f2036cbcc608b50163c497980ed8168ecef1b Mon Sep 17 00:00:00 2001 From: Chu Hoang Date: Fri, 25 Sep 2015 11:17:43 +0100 Subject: [PATCH] Changed NPatchRenderer and ImageRenderer to use an "broken image" if they try to renderer an invalid image. Change-Id: I9cc4146dd2d7c8e775a63c774937d3bd1ab47b7d --- .../src/dali-toolkit/utc-Dali-RendererFactory.cpp | 6 ++- .../controls/renderers/image/image-renderer.cpp | 22 ++++++++++- .../controls/renderers/image/image-renderer.h | 9 ++++- .../controls/renderers/npatch/npatch-renderer.cpp | 44 ++++++++------------- .../controls/renderers/npatch/npatch-renderer.h | 6 +-- .../controls/renderers/renderer-factory-impl.cpp | 7 ++++ .../controls/renderers/renderer-factory-impl.h | 6 +++ dali-toolkit/styles/images-common/broken.png | Bin 0 -> 728 bytes 8 files changed, 64 insertions(+), 36 deletions(-) create mode 100644 dali-toolkit/styles/images-common/broken.png diff --git a/automated-tests/src/dali-toolkit/utc-Dali-RendererFactory.cpp b/automated-tests/src/dali-toolkit/utc-Dali-RendererFactory.cpp index 9cc604b..3b603b0 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-RendererFactory.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-RendererFactory.cpp @@ -729,7 +729,8 @@ int UtcDaliRendererFactoryGetNPatchRendererN1(void) DALI_TEST_CHECK( controlRenderer ); Actor actor = Actor::New(); - TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(), 1u ); + //The testkit still has to load a bitmap for the broken renderer image + TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)), 1u ); TestGlAbstraction& gl = application.GetGlAbstraction(); int textureUnit = -1; @@ -757,7 +758,8 @@ int UtcDaliRendererFactoryGetNPatchRendererN2(void) DALI_TEST_CHECK( controlRenderer ); Actor actor = Actor::New(); - TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(), 1u ); + //The testkit still has to load a bitmap for the broken renderer image + TestControlRendererRender( application, actor, controlRenderer, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD)), 1u ); TestGlAbstraction& gl = application.GetGlAbstraction(); int textureUnit = -1; diff --git a/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp b/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp index 0fad543..8f02d85 100644 --- a/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp +++ b/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp @@ -401,7 +401,10 @@ void ImageRenderer::DoSetOnStage( Actor& actor ) { if( !mImageUrl.empty() && !mImage ) { - mImage = Dali::ResourceImage::New( mImageUrl, mDesiredSize, mFittingMode, mSamplingMode ); + Dali::ResourceImage resourceImage = Dali::ResourceImage::New( mImageUrl, mDesiredSize, mFittingMode, mSamplingMode ); + resourceImage.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded ); + + mImage = resourceImage; } ApplyImageToSampler(); @@ -529,7 +532,10 @@ void ImageRenderer::SetImage( const std::string& imageUrl, int desiredWidth, int if( !mImageUrl.empty() && mImpl->mIsOnStage ) { - mImage = Dali::ResourceImage::New( mImageUrl, mDesiredSize, mFittingMode, mSamplingMode ); + Dali::ResourceImage resourceImage = Dali::ResourceImage::New( mImageUrl, mDesiredSize, mFittingMode, mSamplingMode ); + resourceImage.LoadingFinishedSignal().Connect( this, &ImageRenderer::OnImageLoaded ); + mImage = resourceImage; + ApplyImageToSampler(); } else @@ -580,6 +586,18 @@ void ImageRenderer::ApplyImageToSampler() } } +void ImageRenderer::OnImageLoaded( ResourceImage image ) +{ + if( image.GetLoadingState() == Dali::ResourceLoadingFailed ) + { + mImage = RendererFactory::GetBrokenRendererImage(); + if( mImpl->mIsOnStage ) + { + ApplyImageToSampler(); + } + } +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/controls/renderers/image/image-renderer.h b/dali-toolkit/internal/controls/renderers/image/image-renderer.h index f408fb2..efcbf53 100644 --- a/dali-toolkit/internal/controls/renderers/image/image-renderer.h +++ b/dali-toolkit/internal/controls/renderers/image/image-renderer.h @@ -24,6 +24,7 @@ // EXTERNAL INCLUDES #include #include +#include namespace Dali { @@ -68,7 +69,7 @@ typedef IntrusivePtr< ImageRenderer > ImageRendererPtr; * "default" * */ -class ImageRenderer: public ControlRenderer +class ImageRenderer: public ControlRenderer, public ConnectionTracker { public: @@ -175,6 +176,12 @@ private: */ void ApplyImageToSampler(); + /** + * Callback function of image resource loading succeed + * @param[in] image The Image content that we attempted to load from mImageUrl + */ + void OnImageLoaded( ResourceImage image ); + private: Image mImage; diff --git a/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp b/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp index 10f851f..8e509a9 100644 --- a/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp +++ b/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp @@ -232,11 +232,11 @@ void NPatchRenderer::DoInitialize( const Property::Map& propertyMap ) if( imageURLValue->Get( mImageUrl ) ) { NinePatchImage nPatch = NinePatchImage::New( mImageUrl ); - InitialiseFromImage( nPatch ); + InitializeFromImage( nPatch ); } else { - CreateErrorImage(); + InitializeFromBrokenImage(); DALI_LOG_ERROR( "The property '%s' is not a string\n", IMAGE_URL_NAME ); } } @@ -248,17 +248,17 @@ void NPatchRenderer::GetNaturalSize( Vector2& naturalSize ) const { naturalSize.x = mImage.GetWidth(); naturalSize.y = mImage.GetHeight(); - return; } else if( !mImageUrl.empty() ) { ImageDimensions dimentions = ResourceImage::GetImageSize( mImageUrl ); naturalSize.x = dimentions.GetWidth(); naturalSize.y = dimentions.GetHeight(); - return; } - - naturalSize = Vector2::ZERO; + else + { + naturalSize = Vector2::ZERO; + } } void NPatchRenderer::SetClipRect( const Rect& clipRect ) @@ -319,7 +319,7 @@ void NPatchRenderer::InitializeRenderer( Renderer& renderer ) else { DALI_LOG_ERROR("The 9 patch image '%s' doesn't have any valid stretch borders and so is not a valid 9 patch image\n", mImageUrl.c_str() ); - CreateErrorImage(); + InitializeFromBrokenImage(); } if( !renderer ) @@ -345,11 +345,11 @@ void NPatchRenderer::DoSetOnStage( Actor& actor ) if( !mImageUrl.empty() ) { NinePatchImage nPatch = NinePatchImage::New( mImageUrl ); - InitialiseFromImage( nPatch ); + InitializeFromImage( nPatch ); } else if( mImage ) { - InitialiseFromImage( mImage ); + InitializeFromImage( mImage ); } InitializeRenderer( mImpl->mRenderer ); @@ -392,7 +392,7 @@ void NPatchRenderer::SetImage( const std::string& imageUrl, bool borderOnly ) mImageUrl = imageUrl; NinePatchImage nPatch = NinePatchImage::New( mImageUrl ); - InitialiseFromImage( nPatch ); + InitializeFromImage( nPatch ); if( mCroppedImage && mImpl->mIsOnStage ) { @@ -410,7 +410,7 @@ void NPatchRenderer::SetImage( NinePatchImage image, bool borderOnly ) } mImage = image; - InitialiseFromImage( mImage ); + InitializeFromImage( mImage ); if( mCroppedImage && mImpl->mIsOnStage ) { @@ -418,13 +418,13 @@ void NPatchRenderer::SetImage( NinePatchImage image, bool borderOnly ) } } -void NPatchRenderer::InitialiseFromImage( NinePatchImage nPatch ) +void NPatchRenderer::InitializeFromImage( NinePatchImage nPatch ) { mCroppedImage = nPatch.CreateCroppedBufferImage(); if( !mCroppedImage ) { DALI_LOG_ERROR("'%s' specify a valid 9 patch image\n", mImageUrl.c_str() ); - CreateErrorImage(); + InitializeFromBrokenImage(); return; } @@ -434,27 +434,15 @@ void NPatchRenderer::InitialiseFromImage( NinePatchImage nPatch ) mStretchPixelsY = nPatch.GetStretchPixelsY(); } -void NPatchRenderer::CreateErrorImage() +void NPatchRenderer::InitializeFromBrokenImage() { - mImageSize = ImageDimensions( 1, 1 ); - - BufferImage bufferImage = BufferImage::New( mImageSize.GetWidth(), mImageSize.GetHeight(), Pixel::RGBA8888 ); - mCroppedImage = bufferImage; - PixelBuffer* pixbuf = bufferImage.GetBuffer(); - - for( size_t i = 0; i < mImageSize.GetWidth() * mImageSize.GetHeight() * 4u; ) - { - pixbuf[ i++ ] = 0; - pixbuf[ i++ ] = 0; - pixbuf[ i++ ] = 0; - pixbuf[ i++ ] = 255; - } + mCroppedImage = RendererFactory::GetBrokenRendererImage(); + mImageSize = ImageDimensions( mCroppedImage.GetWidth(), mCroppedImage.GetHeight() ); mStretchPixelsX.Clear(); mStretchPixelsX.PushBack( Uint16Pair( 0, mImageSize.GetWidth() ) ); mStretchPixelsY.Clear(); mStretchPixelsY.PushBack( Uint16Pair( 0, mImageSize.GetHeight() ) ); - } void NPatchRenderer::ApplyImageToSampler() diff --git a/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.h b/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.h index bbb069c..c17b167 100644 --- a/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.h +++ b/dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.h @@ -166,13 +166,13 @@ private: * * @param nPatchImage The NinePatchImage to base our cropped images and stretch borders from */ - void InitialiseFromImage( NinePatchImage nPatchImage ); + void InitializeFromImage( NinePatchImage nPatchImage ); /** - * @brief Creates a black Image to indicate that there was an error in either the image url or the parsing of the image + * @brief Creates an error Image to indicate that there was an error in either the image url or the parsing of the image * */ - void CreateErrorImage(); + void InitializeFromBrokenImage(); /** * @brief Applies this renderer's image to the sampler to the material used for this renderer diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp index b9d1d40..ddac18e 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp @@ -41,6 +41,8 @@ const char * const BORDER_RENDERER("border-renderer"); const char * const GRADIENT_RENDERER("gradient-renderer"); const char * const IMAGE_RENDERER("image-renderer"); const char * const N_PATCH_RENDERER("n-patch-renderer"); + +const char * const BROKEN_RENDERER_IMAGE_URL( DALI_IMAGE_DIR "broken.png"); } namespace Dali @@ -307,6 +309,11 @@ bool RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, const P return false; } +Image RendererFactory::GetBrokenRendererImage() +{ + return ResourceImage::New( BROKEN_RENDERER_IMAGE_URL ); +} + } // namespace Internal } // namespace Toolkit diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h index 99ef2b8..a76c572 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h @@ -94,6 +94,12 @@ public: */ bool ResetRenderer( Toolkit::ControlRenderer& renderer, const std::string& image ); +public: + /** + * @brief Returns an image to be used when a renderer has failed to correctly render + */ + static Image GetBrokenRendererImage(); + protected: /** diff --git a/dali-toolkit/styles/images-common/broken.png b/dali-toolkit/styles/images-common/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..2d1c272cb465bc0a5915fe954a60ac1a1615308e GIT binary patch literal 728 zcmV;}0w?{6P)0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!dPzhF`K%VaXqH-)OzYBVAH{r)MY zP%JO^N4MJ*e&X0{|0_lOv&!!=pU=nRu^FR|QO&4nnX08}qlH2tolcwa>2#V-r^?m= z&+{skioIMc7RTdJ*+TXfh8bV4S39FLt;9$IQenpLVJH)TGC(odOC$lQP{u-~QpwT; z$^gZnOaQuPxm>oFXh&#D%4igTl+9*c0TRth9Brupq}^_(OaL-~JVdKmpP@k|Seifv zkOyS~(2LNK>?JAz^`OjBIsqg~0Zssk*bm4961|}j1|)g`!hpnLDJ21kMSvtAahZBC zKw{jLkO3qz0mI?2-|wSj*X#A+a6sY80FqDjL&ajT)9GxtTf3-bGMVVksR5*@r02>& zta~B@$irr{iQdBjNR%}Y?VdM-1CS^M#JVQ}v&i?q%u;ed@@fAMO!4J%X}7F{AgI-9 z=kpoU3D5lz#%wmjmrp7n5$?bDdOh1c^Z7hvyoRA;9f)<$(P*R$=7jAfivUS`$%PVP z_L570n7w3#IT?G&`;JV&Uh)bMu$Sy_DY@+>y8v!`De<0|)m{p{=;pJRLIU{grQA^i zCP0!CzywI5hdnp|NmKv_AW0v$AqOM}=Y?ni$$J5Rup1lD7_gM_Hp>z4U+WPk*a98aO&1CsZDdfjn+3NQcz`-_AjMNN