Changed NPatchRenderer and ImageRenderer to use an "broken image" if they try to... 28/48728/11
authorChu Hoang <c.hoang@samsung.com>
Fri, 25 Sep 2015 10:17:43 +0000 (11:17 +0100)
committerChu Hoang <c.hoang@samsung.com>
Wed, 14 Oct 2015 09:42:53 +0000 (10:42 +0100)
Change-Id: I9cc4146dd2d7c8e775a63c774937d3bd1ab47b7d

automated-tests/src/dali-toolkit/utc-Dali-RendererFactory.cpp
dali-toolkit/internal/controls/renderers/image/image-renderer.cpp
dali-toolkit/internal/controls/renderers/image/image-renderer.h
dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.cpp
dali-toolkit/internal/controls/renderers/npatch/npatch-renderer.h
dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-impl.h
dali-toolkit/styles/images-common/broken.png [new file with mode: 0644]

index 9cc604b..3b603b0 100644 (file)
@@ -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;
index 0fad543..8f02d85 100644 (file)
@@ -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
index f408fb2..efcbf53 100644 (file)
@@ -24,6 +24,7 @@
 // EXTERNAL INCLUDES
 #include <dali/public-api/images/image.h>
 #include <dali/public-api/images/image-operations.h>
+#include <dali/public-api/images/resource-image.h>
 
 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;
 
index 10f851f..8e509a9 100644 (file)
@@ -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<int>& 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()
index bbb069c..c17b167 100644 (file)
@@ -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
index b9d1d40..ddac18e 100644 (file)
@@ -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
index 99ef2b8..a76c572 100644 (file)
@@ -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 (file)
index 0000000..2d1c272
Binary files /dev/null and b/dali-toolkit/styles/images-common/broken.png differ