Merge "Changed ImageView to utilise ImageRenderer." into devel/master
authorKimmo Hoikka <kimmo.hoikka@samsung.com>
Mon, 21 Sep 2015 15:09:38 +0000 (08:09 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Mon, 21 Sep 2015 15:09:38 +0000 (08:09 -0700)
automated-tests/src/dali-toolkit/utc-Dali-ImageView.cpp
dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.cpp
dali-toolkit/devel-api/controls/renderer-factory/renderer-factory.h
dali-toolkit/internal/controls/image-view/image-view-impl.cpp
dali-toolkit/internal/controls/image-view/image-view-impl.h
dali-toolkit/internal/controls/renderers/image/image-renderer.cpp
dali-toolkit/internal/controls/renderers/image/image-renderer.h
dali-toolkit/internal/controls/renderers/renderer-factory-impl.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-impl.h
dali-toolkit/public-api/controls/image-view/image-view.cpp
dali-toolkit/public-api/controls/image-view/image-view.h

index 8e9f8fe..e40862c 100644 (file)
@@ -20,6 +20,7 @@
 #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;
@@ -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;
 }
index f836e8c..a5918ef 100644 (file)
@@ -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
index 4a30888..d15dc68 100644 (file)
@@ -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);
index b6b97a4..76493a6 100644 (file)
@@ -3,15 +3,17 @@
 // 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
 {
 
@@ -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;
       }
     }
index e912e4c..3af21ce 100644 (file)
  */
 
 // 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>
 
@@ -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
index 3a2da25..208864b 100644 (file)
@@ -298,6 +298,11 @@ void ImageRenderer::SetImage( Image image )
   }
 }
 
+Image ImageRenderer::GetImage() const
+{
+  return mImage;
+}
+
 void ImageRenderer::ApplyImageToSampler()
 {
   if( mImage )
index e3a60a0..be9c2af 100644 (file)
@@ -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:
 
   /**
index 1320436..11070c9 100644 (file)
@@ -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<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;
   }
 }
@@ -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<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;
   }
 }
index 93cbc3c..d65e747 100644 (file)
@@ -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:
 
   /**
index 8075764..e3d2b67 100644 (file)
  */
 
 // 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
 {
 
@@ -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<ImageView, Internal::ImageView>(handle);
+  return Control::DownCast<ImageView, Internal::ImageView>( 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 )
index fe6d7b1..f2a221c 100644 (file)
@@ -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
    */