#include <dali-toolkit-test-suite-utils.h>
#include <dali-toolkit/dali-toolkit.h>
+#include <dali/devel-api/scripting/scripting.h>
using namespace Dali;
using namespace Toolkit;
namespace
{
const char* TEST_IMAGE_FILE_NAME = "gallery_image_01.jpg";
+const char* TEST_IMAGE_FILE_NAME2 = "gallery_image_02.jpg";
+
+void TestImage( ImageView imageView, BufferImage image )
+{
+ Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+ Property::Map map;
+ DALI_TEST_CHECK( value.Get( map ) );
+
+ DALI_TEST_CHECK( map.Find( "width" ) );
+ DALI_TEST_CHECK( map.Find( "height" ) );
+ DALI_TEST_CHECK( map.Find( "type" ) );
+
+ int width = 0;
+ DALI_TEST_CHECK( map[ "width" ].Get( width ) );
+ DALI_TEST_EQUALS( width, image.GetWidth(), TEST_LOCATION );
+
+ int height = 0;
+ DALI_TEST_CHECK( map[ "height" ].Get( height ) );
+ DALI_TEST_EQUALS( height, image.GetHeight(), TEST_LOCATION );
+
+ std::string type;
+ DALI_TEST_CHECK( map[ "type" ].Get( type ) );
+ DALI_TEST_EQUALS( type, "BufferImage", TEST_LOCATION );
+}
+
+void TestImage( ImageView imageView, ResourceImage image )
+{
+ Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+ Property::Map map;
+ DALI_TEST_CHECK( value.Get( map ) );
+
+ if( map.Find( "width" ) )
+ {
+ int width = 0;
+ DALI_TEST_CHECK( map[ "width" ].Get( width ) );
+ DALI_TEST_EQUALS( width, image.GetWidth(), TEST_LOCATION );
+ }
+
+ if( map.Find( "height" ) )
+ {
+ int height = 0;
+ DALI_TEST_CHECK( map[ "height" ].Get( height ) );
+ DALI_TEST_EQUALS( height, image.GetHeight(), TEST_LOCATION );
+ }
+
+ DALI_TEST_CHECK( map.Find( "type" ) );
+
+ std::string type;
+ DALI_TEST_CHECK( map[ "type" ].Get( type ) );
+ DALI_TEST_EQUALS( type, "ResourceImage", TEST_LOCATION );
+
+ std::string filename;
+ DALI_TEST_CHECK( map[ "filename" ].Get( filename ) );
+ DALI_TEST_EQUALS( filename, image.GetUrl(), TEST_LOCATION );
+}
+
+void TestUrl( ImageView imageView, const std::string url )
+{
+ Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+ std::string urlActual;
+ DALI_TEST_CHECK( value.Get( urlActual ) );
+ DALI_TEST_EQUALS( urlActual, url, TEST_LOCATION );
+}
+
} // namespace
int UtcDaliImageViewNewP(void)
{
TestApplication application;
- Image image = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+ BufferImage image = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
ImageView imageView = ImageView::New( image );
DALI_TEST_CHECK( imageView );
- DALI_TEST_EQUALS( image, imageView.GetImage(), TEST_LOCATION );
+ TestImage( imageView, image );
END_TEST;
}
ImageView imageView = ImageView::New( TEST_IMAGE_FILE_NAME );
DALI_TEST_CHECK( imageView );
- DALI_TEST_CHECK( imageView.GetImage() );
-
- Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
- std::string resource_url;
- DALI_TEST_CHECK( val.Get( resource_url ) );
- DALI_TEST_EQUALS( resource_url, TEST_IMAGE_FILE_NAME, TEST_LOCATION );
- Image image = imageView.GetImage();
- DALI_TEST_CHECK( image );
-
- ResourceImage resourceImage = ResourceImage::DownCast( image );
- DALI_TEST_CHECK( resourceImage );
- DALI_TEST_EQUALS( resourceImage.GetUrl(), TEST_IMAGE_FILE_NAME, TEST_LOCATION );
+ TestUrl( imageView, TEST_IMAGE_FILE_NAME );
END_TEST;
}
END_TEST;
}
-int UtcDaliImageViewSetGetProperty(void)
+int UtcDaliImageViewSetGetProperty01(void)
{
ToolkitTestApplication application;
ImageView imageView = ImageView::New();
- Property::Index idx = imageView.GetPropertyIndex( "resource-url" );
- DALI_TEST_EQUALS( idx, ImageView::Property::RESOURCE_URL, TEST_LOCATION );
+ Property::Index idx = imageView.GetPropertyIndex( "image" );
+ DALI_TEST_EQUALS( idx, ImageView::Property::IMAGE, TEST_LOCATION );
imageView.SetProperty( idx, TEST_IMAGE_FILE_NAME );
- Property::Value val = imageView.GetProperty( idx );
- std::string resource_url;
- DALI_TEST_CHECK( val.Get( resource_url ) );
- DALI_TEST_EQUALS( resource_url, TEST_IMAGE_FILE_NAME, TEST_LOCATION );
-
- Image image = imageView.GetImage();
- DALI_TEST_CHECK( image );
-
- ResourceImage resourceImage = ResourceImage::DownCast( image );
- DALI_TEST_CHECK( resourceImage );
- DALI_TEST_EQUALS( resourceImage.GetUrl(), TEST_IMAGE_FILE_NAME, TEST_LOCATION );
+ TestUrl( imageView, TEST_IMAGE_FILE_NAME );
END_TEST;
}
{
ToolkitTestApplication application;
- int width = 300;
- int height = 400;
- Image image = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+ int width1 = 300;
+ int height1 = 400;
+ BufferImage image1 = CreateBufferImage( width1, height1, Vector4( 1.f, 1.f, 1.f, 1.f ) );
ImageView imageView = ImageView::New();
- imageView.SetImage( image );
+ imageView.SetImage( image1 );
- std::string resource_url;
- Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
- DALI_TEST_CHECK( val.Get( resource_url ) );
- DALI_TEST_CHECK( resource_url.empty() );
+ TestImage( imageView, image1 );
+
+ int width2 = 600;
+ int height2 = 500;
+ BufferImage image2 = CreateBufferImage( width2, height2, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+ imageView.SetImage( image2 );
+
+ TestImage( imageView, image2 );
END_TEST;
}
-int UtcDaliImageViewSetResourceImage(void)
+int UtcDaliImageViewSetImageUrl(void)
{
ToolkitTestApplication application;
- Image image = ResourceImage::New( TEST_IMAGE_FILE_NAME );
ImageView imageView = ImageView::New();
- imageView.SetImage( image );
+ imageView.SetImage( TEST_IMAGE_FILE_NAME );
+ TestUrl( imageView, TEST_IMAGE_FILE_NAME );
- std::string resource_url;
- Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
- DALI_TEST_CHECK( val.Get( resource_url ) );
- DALI_TEST_EQUALS( resource_url, TEST_IMAGE_FILE_NAME, TEST_LOCATION );
+
+ imageView.SetImage( TEST_IMAGE_FILE_NAME2 );
+ TestUrl( imageView, TEST_IMAGE_FILE_NAME2 );
END_TEST;
}
application.SendNotification();
application.Render();
- Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+ ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
imageView.SetImage( image1 );
-
- Image image2 = imageView.GetImage();
- DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+ TestImage( imageView, image1 );
int width = 300;
int height = 400;
- Image image3 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
- imageView.SetImage( image3 );
-
- Image image4 = imageView.GetImage();
- DALI_TEST_EQUALS( image3, image4, TEST_LOCATION );
+ BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+ imageView.SetImage( image2 );
+ TestImage( imageView, image2 );
END_TEST;
}
application.SendNotification();
application.Render();
- Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+ ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
imageView.SetImage( image1 );
+ TestImage( imageView, image1 );
+
+ Image image2;
+ imageView.SetImage( image2 );
- Image image2 = imageView.GetImage();
- DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+ Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
- Image image3;
- imageView.SetImage( image3 );
+ //the value should be empty
+ std::string url;
+ DALI_TEST_CHECK( !value.Get( url ) );
- Image image4 = imageView.GetImage();
- DALI_TEST_CHECK( !image4 );
+ Property::Map map;
+ DALI_TEST_CHECK( !value.Get( map ) );
END_TEST;
}
application.Render();
Stage::GetCurrent().Remove( imageView );
- Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+ ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
imageView.SetImage( image1 );
-
- Image image2 = imageView.GetImage();
- DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+ TestImage( imageView, image1 );
int width = 300;
int height = 400;
- Image image3 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
- imageView.SetImage( image3 );
-
- Image image4 = imageView.GetImage();
- DALI_TEST_EQUALS( image3, image4, TEST_LOCATION );
+ BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
+ imageView.SetImage( image2 );
+ TestImage( imageView, image2 );
END_TEST;
}
application.Render();
Stage::GetCurrent().Remove( imageView );
- Image image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
+ ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
imageView.SetImage( image1 );
+ TestImage( imageView, image1 );
+
+ Image image2;
+ imageView.SetImage( image2 );
- Image image2 = imageView.GetImage();
- DALI_TEST_EQUALS( image1, image2, TEST_LOCATION );
+ Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
- Image image3;
- imageView.SetImage( image3 );
+ //the value should be empty
+ std::string url;
+ DALI_TEST_CHECK( !value.Get( url ) );
- Image image4 = imageView.GetImage();
- DALI_TEST_CHECK( !image4 );
+ Property::Map map;
+ DALI_TEST_CHECK( !value.Get( map ) );
END_TEST;
}
ImageView imageView = ImageView::New();
imageView.SetImage( image1 );
- Image image2 = imageView.GetImage();
- DALI_TEST_CHECK( !image2 );
+ Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+
+ //the value should be empty
+ std::string url;
+ DALI_TEST_CHECK( !value.Get( url ) );
+
+ Property::Map map;
+ DALI_TEST_CHECK( !value.Get( map ) );
std::string resource_url;
- Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "resource-url" ) );
- DALI_TEST_CHECK( val.Get( resource_url ) );
- DALI_TEST_CHECK( resource_url.empty() );
+ Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
+ DALI_TEST_CHECK( !val.Get( resource_url ) );
END_TEST;
}
return GetImplementation( *this ).ResetRenderer( renderer, image );
}
+ControlRenderer RendererFactory::GetControlRenderer( const std::string& url )
+{
+ return GetImplementation( *this ).GetControlRenderer( url );
+}
+
+bool RendererFactory::ResetRenderer( ControlRenderer& renderer, const std::string& url )
+{
+ return GetImplementation( *this ).ResetRenderer( renderer, url );
+}
+
} // namespace Toolkit
} // namespace Dali
* if the current renderer is a handle to an internal color renderer, set this color to it,
* else the renderer would be a handle to a newly created internal color renderer.
*
+ * @param[in] renderer The ControlRenderer to reset
+ * @param[in] color The color to be rendered.
* @return Whether a new internal control renderer is created.
*/
bool ResetRenderer( ControlRenderer& renderer, const Vector4& color );
* if the current renderer is a handle to an internal image renderer, set this image to it,
* else the renderer would be a handle to a newly created internal image renderer.
*
+ * @param[in] renderer The ControlRenderer to reset
+ * @param[in] image The Image to be rendered.
* @return Whether a new internal control renderer is created.
*/
bool ResetRenderer( ControlRenderer& renderer, const Image& image );
+ /**
+ * @brief Request the control renderer to render the given resource at the url.
+ *
+ * @param[in] url The URL to the resource to be rendered.
+ * @return The pointer pointing to the control renderer
+ */
+ ControlRenderer GetControlRenderer( const std::string& url );
+
+ /**
+ * @brief Request the current control renderer to render the given resource at the url
+ *
+ * if the current renderer is a handle to an internal image renderer, set this image to it,
+ * else the renderer would be a handle to a newly created internal image renderer.
+ *
+ * @param[in] renderer The ControlRenderer to reset
+ * @param[in] url The URL to the resource to be rendered.
+ * @return Whether a new internal control renderer is created.
+ */
+ bool ResetRenderer( ControlRenderer& renderer, const std::string& url );
+
private:
explicit DALI_INTERNAL RendererFactory(Internal::RendererFactory *impl);
// CLASS HEADER
#include "image-view-impl.h"
-// INTERNAL INCLUDES
-#include <dali-toolkit/public-api/controls/image-view/image-view.h>
-
// EXTERNAL INCLUDES
#include <dali/public-api/images/resource-image.h>
#include <dali/public-api/object/type-registry.h>
#include <dali/devel-api/object/type-registry-helper.h>
#include <dali/devel-api/scripting/scripting.h>
+// INTERNAL INCLUDES
+#include <dali-toolkit/public-api/controls/image-view/image-view.h>
+#include <dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h>
+#include <dali-toolkit/internal/controls/renderers/image/image-renderer.h>
+
namespace Dali
{
namespace
{
-#define MAKE_SHADER(A)#A
-
-const char* VERTEX_SHADER = MAKE_SHADER(
- attribute mediump vec2 aPosition;
- attribute highp vec2 aTexCoord;
- varying mediump vec2 vTexCoord;
- uniform mediump mat4 uMvpMatrix;
- uniform mediump vec3 uSize;
-
- void main()
- {
- mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);
- vertexPosition.xyz *= uSize;
- vertexPosition = uMvpMatrix * vertexPosition;
-
- vTexCoord = aTexCoord;
- gl_Position = vertexPosition;
- }
-);
-
-const char* FRAGMENT_SHADER = MAKE_SHADER(
- varying mediump vec2 vTexCoord;
- uniform sampler2D sTexture;
- uniform lowp vec4 uColor;
-
- void main()
- {
- gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;
- }
-);
-
-//TODO: remove when RendererFactory is implemented, so if there are multiple images that render as quads we only end up with one instance of geometry
-Geometry CreateGeometry( int width, int height )
-{
- // Create vertices
- const float halfWidth = 0.5f;
- const float halfHeight = 0.5f;
- struct TexturedQuadVertex { Vector2 position; Vector2 textureCoordinates; };
- TexturedQuadVertex texturedQuadVertexData[4] = { { Vector2(-halfWidth, -halfHeight), Vector2(0.f, 0.f) },
- { Vector2( halfWidth, -halfHeight), Vector2(1.f, 0.f) },
- { Vector2(-halfWidth, halfHeight), Vector2(0.f, 1.f) },
- { Vector2( halfWidth, halfHeight), Vector2(1.f, 1.f) } };
-
- Property::Map texturedQuadVertexFormat;
- texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
- texturedQuadVertexFormat["aTexCoord"] = Property::VECTOR2;
- PropertyBuffer texturedQuadVertices = PropertyBuffer::New( texturedQuadVertexFormat, 4 );
- texturedQuadVertices.SetData(texturedQuadVertexData);
-
- // Create indices
- //TODO: replace with triangle strip when Geometry supports it
- unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 };
- Property::Map indexFormat;
- indexFormat["indices"] = Property::INTEGER;
- PropertyBuffer indices = PropertyBuffer::New( indexFormat, 6 );
- indices.SetData(indexData);
-
- // Create the geometry object
- Geometry texturedQuadGeometry = Geometry::New();
- texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices );
- texturedQuadGeometry.SetIndexBuffer( indices );
-
- return texturedQuadGeometry;
-}
-
BaseHandle Create()
{
return Toolkit::ImageView::New();
// Setup properties, signals and actions using the type-registry.
DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ImageView, Toolkit::Control, Create );
-DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "resource-url", STRING, RESOURCE_URL )
+DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "image", MAP, IMAGE )
DALI_TYPE_REGISTRATION_END()
} // anonymous namespace
{
ImageView* impl = new ImageView();
- Dali::Toolkit::ImageView handle = Dali::Toolkit::ImageView( *impl );
+ Toolkit::ImageView handle = Toolkit::ImageView( *impl );
// Second-phase init of the implementation
// This can only be done after the CustomActor connection has been made...
void ImageView::SetImage( Image image )
{
- mImage = image;
+ if( mImage != image )
+ {
+ mUrl.clear();
+ mPropertyMap.Clear();
- ResourceImage resourceImage = ResourceImage::DownCast( mImage );
- if( resourceImage )
+ mImage = image;
+
+ bool newRendererCreated = false;
+ if( mRenderer )
+ {
+ newRendererCreated = Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, image );
+ }
+ else
+ {
+ mRenderer = Toolkit::RendererFactory::Get().GetControlRenderer( image );
+ newRendererCreated = true;
+ }
+
+ //we need to inform any newly created renderers if it is on stage
+ if( newRendererCreated && Self().OnStage() )
+ {
+ CustomActor self = Self();
+ mRenderer.SetOnStage( self );
+ }
+
+ mImageSize = image ? ImageDimensions( image.GetWidth(), image.GetHeight() ) : ImageDimensions( 0, 0 );
+ }
+}
+
+void ImageView::SetImage( Property::Map map )
+{
+ mImage.Reset();
+ mUrl.clear();
+ mPropertyMap = map;
+
+ mRenderer = Toolkit::RendererFactory::Get().GetControlRenderer( mPropertyMap );
+
+ //we need to inform any newly created renderers if it is on stage
+ if( Self().OnStage() )
{
- mImageUrl = resourceImage.GetUrl();
+ CustomActor self = Self();
+ mRenderer.SetOnStage( self );
}
- else
+
+ int width = 0;
+ Property::Value* widthValue = mPropertyMap.Find( "width" );
+ if( widthValue )
{
- mImageUrl.clear();
+ widthValue->Get( width );
}
- if( mImage )
+ int height = 0;
+ Property::Value* heightValue = mPropertyMap.Find( "height" );
+ if( heightValue )
{
- if( Self().OnStage() )
- {
- AttachImage();
- }
- RelayoutRequest();
+ heightValue->Get( height );
}
- else
+
+ mImageSize = ImageDimensions( width, height );
+}
+
+void ImageView::SetImage( const std::string& url )
+{
+ if( mUrl != url )
{
+ mImage.Reset();
+ mPropertyMap.Clear();
+
+ mUrl = url;
+
+ bool newRendererCreated = false;
if( mRenderer )
{
- Self().RemoveRenderer( mRenderer );
+ newRendererCreated = Toolkit::RendererFactory::Get().ResetRenderer( mRenderer, mUrl );
+ }
+ else
+ {
+ mRenderer = Toolkit::RendererFactory::Get().GetControlRenderer( mUrl );
+ newRendererCreated = true;
}
- mSampler.Reset();
- mMaterial.Reset();
- mMesh.Reset();
- mRenderer.Reset();
- }
-}
-Image ImageView::GetImage() const
-{
- return mImage;
+ //we need to inform any newly created renderers if it is on stage
+ if( newRendererCreated && Self().OnStage() )
+ {
+ CustomActor self = Self();
+ mRenderer.SetOnStage( self );
+ }
+
+ mImageSize = ResourceImage::GetImageSize( mUrl );
+ }
}
Vector3 ImageView::GetNaturalSize()
{
- // if no image then use Control's natural size
Vector3 size;
- if( mImage )
+ size.x = mImageSize.GetWidth();
+ size.y = mImageSize.GetHeight();
+ size.z = std::min(size.x, size.y);
+
+ if( size.x > 0 && size.x > 0 )
{
- size.x = mImage.GetWidth();
- size.y = mImage.GetHeight();
- size.z = std::min(size.x, size.y);
+ return size;
}
else
{
- size = Control::GetNaturalSize();
+ // if no image then use Control's natural size
+ return Control::GetNaturalSize();
}
- return size;
}
float ImageView::GetHeightForWidth( float width )
{
- if( mImage )
+ if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
{
return GetHeightForWidthBase( width );
}
float ImageView::GetWidthForHeight( float height )
{
- if( mImage )
+ if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 )
{
return GetWidthForHeightBase( height );
}
// Private methods
//
-void ImageView::AttachImage()
-{
- if( !mRenderer )
- {
- Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
- mMaterial = Material::New( shader );
-
- mSampler = Sampler::New( mImage, "sTexture" );
- mMaterial.AddSampler( mSampler );
-
- Vector3 size = Self().GetCurrentSize();
- mMesh = CreateGeometry( size.width, size.height );
- mRenderer = Renderer::New( mMesh, mMaterial );
- Self().AddRenderer( mRenderer );
- }
- else
- {
- mSampler.SetImage( mImage );
- }
-}
-
-void ImageView::OnRelayout( const Vector2& size, RelayoutContainer& container )
-{
- Control::OnRelayout( size, container );
-
- if( mRenderer )
- {
- mMesh = CreateGeometry( size.width, size.height );
- mRenderer.SetGeometry( mMesh );
- }
-}
-
void ImageView::OnStageConnection( int depth )
{
- if( mImage )
+ if( mRenderer )
{
- AttachImage();
+ CustomActor self = Self();
+ mRenderer.SetOnStage( self );
}
}
{
switch ( index )
{
- case Toolkit::ImageView::Property::RESOURCE_URL:
+ case Toolkit::ImageView::Property::IMAGE:
{
std::string imageUrl;
if( value.Get( imageUrl ) )
{
ImageView& impl = GetImpl( imageView );
- impl.mImageUrl = imageUrl;
+ impl.SetImage( imageUrl );
+ }
- Image image = ResourceImage::New( imageUrl );
- impl.SetImage( image );
+ // if its not a string then get a Property::Map from the property if possible.
+ Property::Map map;
+ if( value.Get( map ) )
+ {
+ ImageView& impl = GetImpl( imageView );
+ impl.SetImage( map );
}
+
break;
}
}
{
switch ( propertyIndex )
{
- case Toolkit::ImageView::Property::RESOURCE_URL:
+ case Toolkit::ImageView::Property::IMAGE:
{
- value = GetImpl( imageview ).mImageUrl;
+ ImageView& impl = GetImpl( imageview );
+ if ( !impl.mUrl.empty() )
+ {
+ value = impl.mUrl;
+ }
+ else if( impl.mImage )
+ {
+ Property::Map map;
+ Scripting::CreatePropertyMap( impl.mImage, map );
+ value = map;
+ }
+ else if( !impl.mPropertyMap.Empty() )
+ {
+ value = impl.mPropertyMap;
+ }
break;
}
}
*/
// EXTERNAL INCLUDES
-#include <dali/devel-api/rendering/renderer.h>
+#include <dali/public-api/object/property-map.h>
// INTERNAL INCLUDES
+#include <dali-toolkit/internal/controls/renderers/image/image-renderer.h>
#include <dali-toolkit/public-api/controls/control-impl.h>
#include <dali-toolkit/public-api/controls/image-view/image-view.h>
*/
virtual ~ImageView();
+
+
public:
/**
* Create a new ImageView.
static Toolkit::ImageView New();
/**
- * @copydoc Dali::Toolkit::SetImage( Image image )
+ * @copydoc Dali::Toolkit::SetImage
*/
void SetImage( Image image );
/**
- * @copydoc Dali::Toolkit::Image GetImage() const
+ * @brief Sets this ImageView from an Dali::Property::Map
+ *
+ * If the handle is empty, ImageView will display nothing
+ * @param[in] map The Dali::Property::Map to use for to display.
+ */
+ void SetImage( Dali::Property::Map map );
+
+ /**
+ * @copydoc Dali::Toolkit::SetImage
*/
- Image GetImage() const;
+ void SetImage( const std::string& imageUrl );
// Properties
/**
private: // From Control
/**
- * @copydoc Toolkit::Control::OnRelayout()
- */
- virtual void OnRelayout( const Vector2& size, RelayoutContainer& container );
-
- /**
* @copydoc Toolkit::Control::OnStageConnect()
*/
virtual void OnStageConnection( int depth );
void AttachImage();
private:
+ // Undefined
+ ImageView( const ImageView& );
+ ImageView& operator=( const ImageView& );
+
+private:
+ Toolkit::ControlRenderer mRenderer;
+ ImageDimensions mImageSize;
- Sampler mSampler;
- Material mMaterial;
- Geometry mMesh;
- Renderer mRenderer;
- Image mImage;
- std::string mImageUrl;
+ std::string mUrl; ///< the url for the image if the image came from a URL, empty otherwise
+ Image mImage; ///< the Image if the image came from a Image, null otherwise
+ Property::Map mPropertyMap; ///< the Property::Map if the image came from a Property::Map, empty otherwise
};
} // namespace Internal
}
}
+Image ImageRenderer::GetImage() const
+{
+ return mImage;
+}
+
void ImageRenderer::ApplyImageToSampler()
{
if( mImage )
*/
void SetImage( Image image );
+ /**
+ * @brief Gets the image this renderer uses
+ *
+ * @return The image this renderer uses, which may be null if the image is set from a URL string and the renderer is not set as onstage
+ */
+ Image GetImage() const;
+
private:
/**
DALI_LOG_ERROR( "Renderer type unknown" );
}
- return Toolkit::ControlRenderer(rendererPtr);
+ return Toolkit::ControlRenderer( rendererPtr );
}
Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Vector4& color )
}
rendererPtr->Initialize( *( mFactoryCache.Get() ) );
- rendererPtr->SetColor(color);
+ rendererPtr->SetColor( color );
- return Toolkit::ControlRenderer(rendererPtr);
+ return Toolkit::ControlRenderer( rendererPtr );
}
bool RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, const Vector4& color )
{
- ColorRenderer* rendererPtr = dynamic_cast<ColorRenderer*>(&GetImplementation(renderer));
+ ColorRenderer* rendererPtr = dynamic_cast< ColorRenderer* >( &GetImplementation( renderer ) );
if( rendererPtr )
{
- rendererPtr->SetColor(color);
+ rendererPtr->SetColor( color );
return false;
}
else
{
- renderer = GetControlRenderer(color);
+ renderer = GetControlRenderer( color );
return true;
}
}
rendererPtr->Initialize( *( mFactoryCache.Get() ) );
rendererPtr->SetImage( image );
- return Toolkit::ControlRenderer(rendererPtr);
+ return Toolkit::ControlRenderer( rendererPtr );
}
bool RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, const Image& image )
{
- ImageRenderer* rendererPtr = dynamic_cast<ImageRenderer*>(&GetImplementation(renderer));
+ ImageRenderer* rendererPtr = dynamic_cast< ImageRenderer* >( &GetImplementation( renderer ) );
if( rendererPtr )
{
- rendererPtr->SetImage(image);
+ rendererPtr->SetImage( image );
return false;
}
else
{
- renderer = GetControlRenderer(image);
+ renderer = GetControlRenderer( image );
+ return true;
+ }
+}
+
+Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const std::string& url )
+{
+ ImageRenderer* rendererPtr = new ImageRenderer();
+ if( !mFactoryCache )
+ {
+ mFactoryCache = new RendererFactoryCache();
+ }
+ rendererPtr->Initialize( *( mFactoryCache.Get() ) );
+ rendererPtr->SetImage( url );
+
+ return Toolkit::ControlRenderer( rendererPtr );
+}
+
+bool RendererFactory::ResetRenderer( Toolkit::ControlRenderer& renderer, const std::string& url )
+{
+ ImageRenderer* rendererPtr = dynamic_cast< ImageRenderer* >( &GetImplementation( renderer ) );
+ if( rendererPtr )
+ {
+ rendererPtr->SetImage( url );
+ return false;
+ }
+ else
+ {
+ renderer = GetControlRenderer( url );
return true;
}
}
*/
bool ResetRenderer( Toolkit::ControlRenderer& renderer, const Image& image );
+ /**
+ * @copydoc Toolkit::RenderFactory::GetControlRenderer( const std::string& )
+ */
+ Toolkit::ControlRenderer GetControlRenderer( const std::string& image );
+
+ /**
+ * @copydoc Toolkit::RendererFactory::ResetRenderer( Toolkit::ControlRenderer&, const std::string& )
+ */
+ bool ResetRenderer( Toolkit::ControlRenderer& renderer, const std::string& image );
+
protected:
/**
*/
// CLASS HEADER
-
#include <dali-toolkit/public-api/controls/image-view/image-view.h>
+// EXTERNAL INCLUDES
+#include <dali/public-api/images/resource-image.h>
+#include <dali/public-api/object/property-map.h>
+
// INTERNAL INCLUDES
#include <dali-toolkit/internal/controls/image-view/image-view-impl.h>
-// EXTERNAL INCLUDES
-
namespace Dali
{
{
ImageView imageView = Internal::ImageView::New();
imageView.SetImage( image );
- return imageView;
+ return ImageView( imageView );
}
ImageView ImageView::New( const std::string& url )
{
ImageView imageView = Internal::ImageView::New();
- imageView.SetProperty( ImageView::Property::RESOURCE_URL, Dali::Property::Value( url ) );
+ imageView.SetImage( url );
return imageView;
}
ImageView ImageView::DownCast( BaseHandle handle )
{
- return Control::DownCast<ImageView, Internal::ImageView>(handle);
+ return Control::DownCast<ImageView, Internal::ImageView>( handle );
}
void ImageView::SetImage( Image image )
Dali::Toolkit::GetImpl( *this ).SetImage( image );
}
+void ImageView::SetImage( const std::string& url )
+{
+ Dali::Toolkit::GetImpl( *this ).SetImage( url );
+}
+
Image ImageView::GetImage() const
{
- return Dali::Toolkit::GetImpl( *this ).GetImage();
+ return Image();
}
ImageView::ImageView( Internal::ImageView& implementation )
{
enum
{
- RESOURCE_URL = PROPERTY_START_INDEX, ///< name "resource-url", @see SetImage(), type string
+ IMAGE = PROPERTY_START_INDEX, ///< name "image", @see SetImage(), type string if it is a url, map otherwise
};
};
void SetImage( Image image );
/**
- * @brief Gets the Image
+ * @brief Sets this ImageView from an Image url
+ *
+ * If the handle is empty, ImageView will display nothing
+ * @param[in] url The Image resource to display.
+ */
+ void SetImage( const std::string& url );
+
+ /**
+ * @deprecated Gets the Image
*
* @return The Image currently set to this ImageView
*/