From 018b3b5ba7512694a9b95494493f2ae0477f2746 Mon Sep 17 00:00:00 2001 From: Chu Hoang Date: Tue, 15 Sep 2015 16:41:42 +0100 Subject: [PATCH] Changed ImageView to utilise ImageRenderer. Change-Id: I95211860cbc75601fbf6380252b76d236e3471f3 --- .../src/dali-toolkit/utc-Dali-ImageView.cpp | 215 ++++++++++------- .../controls/renderer-factory/renderer-factory.cpp | 10 + .../controls/renderer-factory/renderer-factory.h | 24 ++ .../controls/image-view/image-view-impl.cpp | 265 ++++++++++----------- .../internal/controls/image-view/image-view-impl.h | 40 ++-- .../controls/renderers/image/image-renderer.cpp | 5 + .../controls/renderers/image/image-renderer.h | 7 + .../controls/renderers/renderer-factory-impl.cpp | 48 +++- .../controls/renderers/renderer-factory-impl.h | 10 + .../public-api/controls/image-view/image-view.cpp | 20 +- .../public-api/controls/image-view/image-view.h | 12 +- 11 files changed, 400 insertions(+), 256 deletions(-) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp index 8e9f8fe..e40862c 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp @@ -20,6 +20,7 @@ #include #include +#include using namespace Dali; using namespace Toolkit; @@ -37,6 +38,73 @@ void utc_dali_toolkit_image_view_cleanup(void) 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) @@ -54,11 +122,11 @@ int UtcDaliImageViewNewImageP(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; } @@ -69,19 +137,8 @@ int UtcDaliImageViewNewUrlP(void) 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; } @@ -174,27 +231,17 @@ int UtcDaliImageViewTypeRegistry(void) 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; } @@ -296,32 +343,35 @@ int UtcDaliImageViewSetBufferImage(void) { 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; } @@ -336,19 +386,15 @@ int UtcDaliImageViewSetImageOnstageP(void) 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; } @@ -363,17 +409,21 @@ int UtcDaliImageViewSetImageOnstageN(void) 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; } @@ -389,19 +439,15 @@ int UtcDaliImageViewSetImageOffstageP(void) 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; } @@ -417,17 +463,21 @@ int UtcDaliImageViewSetImageOffstageN(void) 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; } @@ -440,13 +490,18 @@ int UtcDaliImageViewSetImageN(void) 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; } diff --git a/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.cpp b/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.cpp index f836e8c..a5918ef 100644 --- a/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.cpp +++ b/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.cpp @@ -107,6 +107,16 @@ bool RendererFactory::ResetRenderer( ControlRenderer& renderer, const Image& ima 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 diff --git a/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h b/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h index 4a30888..d15dc68 100644 --- a/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h +++ b/dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h @@ -108,6 +108,8 @@ public: * 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 ); @@ -126,10 +128,32 @@ public: * 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); diff --git a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp index b6b97a4..76493a6 100644 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.cpp +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.cpp @@ -3,15 +3,17 @@ // CLASS HEADER #include "image-view-impl.h" -// INTERNAL INCLUDES -#include - // EXTERNAL INCLUDES #include #include #include #include +// INTERNAL INCLUDES +#include +#include +#include + namespace Dali { @@ -24,71 +26,6 @@ namespace Internal 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(); @@ -96,7 +33,7 @@ BaseHandle Create() // 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 @@ -116,7 +53,7 @@ Toolkit::ImageView ImageView::New() { 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... @@ -129,65 +66,120 @@ Toolkit::ImageView ImageView::New() 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 ); } @@ -199,7 +191,7 @@ float ImageView::GetHeightForWidth( float width ) float ImageView::GetWidthForHeight( float height ) { - if( mImage ) + if( mImageSize.GetWidth() > 0 && mImageSize.GetHeight() > 0 ) { return GetWidthForHeightBase( height ); } @@ -214,43 +206,12 @@ float ImageView::GetWidthForHeight( float 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 ); } } @@ -267,17 +228,23 @@ void ImageView::SetProperty( BaseObject* object, Property::Index index, const Pr { 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; } } @@ -294,9 +261,23 @@ Property::Value ImageView::GetProperty( BaseObject* object, Property::Index prop { 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; } } diff --git a/dali-toolkit/internal/controls/image-view/image-view-impl.h b/dali-toolkit/internal/controls/image-view/image-view-impl.h index e912e4c..3af21ce 100644 --- a/dali-toolkit/internal/controls/image-view/image-view-impl.h +++ b/dali-toolkit/internal/controls/image-view/image-view-impl.h @@ -19,9 +19,10 @@ */ // EXTERNAL INCLUDES -#include +#include // INTERNAL INCLUDES +#include #include #include @@ -49,6 +50,8 @@ class ImageView : public Control */ virtual ~ImageView(); + + public: /** * Create a new ImageView. @@ -57,14 +60,22 @@ public: 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 /** @@ -86,11 +97,6 @@ public: private: // From Control /** - * @copydoc Toolkit::Control::OnRelayout() - */ - virtual void OnRelayout( const Vector2& size, RelayoutContainer& container ); - - /** * @copydoc Toolkit::Control::OnStageConnect() */ virtual void OnStageConnection( int depth ); @@ -119,13 +125,17 @@ private: 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 diff --git a/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp b/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp index 3a2da25..208864b 100644 --- a/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp +++ b/dali-toolkit/internal/controls/renderers/image/image-renderer.cpp @@ -298,6 +298,11 @@ void ImageRenderer::SetImage( Image image ) } } +Image ImageRenderer::GetImage() const +{ + return mImage; +} + void ImageRenderer::ApplyImageToSampler() { if( mImage ) diff --git a/dali-toolkit/internal/controls/renderers/image/image-renderer.h b/dali-toolkit/internal/controls/renderers/image/image-renderer.h index e3a60a0..be9c2af 100644 --- a/dali-toolkit/internal/controls/renderers/image/image-renderer.h +++ b/dali-toolkit/internal/controls/renderers/image/image-renderer.h @@ -151,6 +151,13 @@ public: */ 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: /** diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp index 1320436..11070c9 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp @@ -105,7 +105,7 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Property::Ma DALI_LOG_ERROR( "Renderer type unknown" ); } - return Toolkit::ControlRenderer(rendererPtr); + return Toolkit::ControlRenderer( rendererPtr ); } Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Vector4& color ) @@ -118,22 +118,22 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Vector4& col } 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(&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; } } @@ -148,20 +148,48 @@ Toolkit::ControlRenderer RendererFactory::GetControlRenderer( const Image& image 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(&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; } } diff --git a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h index 93cbc3c..d65e747 100644 --- a/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h +++ b/dali-toolkit/internal/controls/renderers/renderer-factory-impl.h @@ -74,6 +74,16 @@ public: */ 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: /** diff --git a/dali-toolkit/public-api/controls/image-view/image-view.cpp b/dali-toolkit/public-api/controls/image-view/image-view.cpp index 8075764..e3d2b67 100644 --- a/dali-toolkit/public-api/controls/image-view/image-view.cpp +++ b/dali-toolkit/public-api/controls/image-view/image-view.cpp @@ -16,14 +16,15 @@ */ // CLASS HEADER - #include +// EXTERNAL INCLUDES +#include +#include + // INTERNAL INCLUDES #include -// EXTERNAL INCLUDES - namespace Dali { @@ -61,19 +62,19 @@ ImageView ImageView::New( Image image ) { 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(handle); + return Control::DownCast( handle ); } void ImageView::SetImage( Image image ) @@ -81,9 +82,14 @@ 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 ) diff --git a/dali-toolkit/public-api/controls/image-view/image-view.h b/dali-toolkit/public-api/controls/image-view/image-view.h index fe6d7b1..f2a221c 100644 --- a/dali-toolkit/public-api/controls/image-view/image-view.h +++ b/dali-toolkit/public-api/controls/image-view/image-view.h @@ -59,7 +59,7 @@ public: { 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 }; }; @@ -137,7 +137,15 @@ public: 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 */ -- 2.7.4