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;
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;
{
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();
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
}
}
+void ImageRenderer::OnImageLoaded( ResourceImage image )
+{
+ if( image.GetLoadingState() == Dali::ResourceLoadingFailed )
+ {
+ mImage = RendererFactory::GetBrokenRendererImage();
+ if( mImpl->mIsOnStage )
+ {
+ ApplyImageToSampler();
+ }
+ }
+}
+
} // namespace Internal
} // namespace Toolkit
// 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
{
* "default"
*
*/
-class ImageRenderer: public ControlRenderer
+class ImageRenderer: public ControlRenderer, public ConnectionTracker
{
public:
*/
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;
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 );
}
}
{
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 )
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 )
if( !mImageUrl.empty() )
{
NinePatchImage nPatch = NinePatchImage::New( mImageUrl );
- InitialiseFromImage( nPatch );
+ InitializeFromImage( nPatch );
}
else if( mImage )
{
- InitialiseFromImage( mImage );
+ InitializeFromImage( mImage );
}
InitializeRenderer( mImpl->mRenderer );
mImageUrl = imageUrl;
NinePatchImage nPatch = NinePatchImage::New( mImageUrl );
- InitialiseFromImage( nPatch );
+ InitializeFromImage( nPatch );
if( mCroppedImage && mImpl->mIsOnStage )
{
}
mImage = image;
- InitialiseFromImage( mImage );
+ InitializeFromImage( mImage );
if( mCroppedImage && mImpl->mIsOnStage )
{
}
}
-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;
}
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()
*
* @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
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
return false;
}
+Image RendererFactory::GetBrokenRendererImage()
+{
+ return ResourceImage::New( BROKEN_RENDERER_IMAGE_URL );
+}
+
} // namespace Internal
} // namespace Toolkit
*/
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:
/**