1 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
4 #include "image-view-impl.h"
7 #include <dali-toolkit/public-api/controls/image-view/image-view.h>
10 #include <dali/public-api/images/resource-image.h>
11 #include <dali/public-api/object/type-registry.h>
12 #include <dali/devel-api/object/type-registry-helper.h>
13 #include <dali/devel-api/scripting/scripting.h>
27 #define MAKE_SHADER(A)#A
29 const char* VERTEX_SHADER = MAKE_SHADER(
30 attribute mediump vec2 aPosition;
31 attribute highp vec2 aTexCoord;
32 varying mediump vec2 vTexCoord;
33 uniform mediump mat4 uMvpMatrix;
34 uniform mediump vec3 uSize;
38 mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);
39 // TODO scale by the actor size when we are using RendererFactor generated renderers with a shared unit sized mesh: vertexPosition.xyz *= uSize;
40 vertexPosition = uMvpMatrix * vertexPosition;
42 vTexCoord = aTexCoord;
43 gl_Position = vertexPosition;
47 const char* FRAGMENT_SHADER = MAKE_SHADER(
48 varying mediump vec2 vTexCoord;
49 uniform sampler2D sTexture;
50 uniform lowp vec4 uColor;
54 gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;
58 //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
59 Geometry CreateGeometry( int width, int height )
62 const float halfWidth = width * .5f;
63 const float halfHeight = height * .5f;
64 struct TexturedQuadVertex { Vector2 position; Vector2 textureCoordinates; };
65 TexturedQuadVertex texturedQuadVertexData[4] = { { Vector2(-halfWidth, -halfHeight), Vector2(0.f, 0.f) },
66 { Vector2( halfWidth, -halfHeight), Vector2(1.f, 0.f) },
67 { Vector2(-halfWidth, halfHeight), Vector2(0.f, 1.f) },
68 { Vector2( halfWidth, halfHeight), Vector2(1.f, 1.f) } };
70 Property::Map texturedQuadVertexFormat;
71 texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
72 texturedQuadVertexFormat["aTexCoord"] = Property::VECTOR2;
73 PropertyBuffer texturedQuadVertices = PropertyBuffer::New( texturedQuadVertexFormat, 4 );
74 texturedQuadVertices.SetData(texturedQuadVertexData);
77 unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 };
78 Property::Map indexFormat;
79 indexFormat["indices"] = Property::INTEGER;
80 PropertyBuffer indices = PropertyBuffer::New( indexFormat, 6 );
81 indices.SetData(indexData);
83 // Create the geometry object
84 Geometry texturedQuadGeometry = Geometry::New();
85 texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices );
86 texturedQuadGeometry.SetIndexBuffer( indices );
88 return texturedQuadGeometry;
93 return Toolkit::ImageView::New();
96 // Setup properties, signals and actions using the type-registry.
97 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ImageView, Toolkit::Control, Create );
98 DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "resource-url", STRING, RESOURCE_URL )
99 DALI_TYPE_REGISTRATION_END()
101 } // anonymous namespace
103 using namespace Dali;
105 ImageView::ImageView()
106 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) )
110 ImageView::~ImageView()
114 Toolkit::ImageView ImageView::New()
116 ImageView* impl = new ImageView();
118 Dali::Toolkit::ImageView handle = Dali::Toolkit::ImageView( *impl );
120 // Second-phase init of the implementation
121 // This can only be done after the CustomActor connection has been made...
127 /////////////////////////////////////////////////////////////
129 void ImageView::SetImage( Image image )
133 ResourceImage resourceImage = ResourceImage::DownCast( mImage );
136 mImageUrl = resourceImage.GetUrl();
145 if( Self().OnStage() )
155 Self().RemoveRenderer( mRenderer );
164 Image ImageView::GetImage() const
169 Vector3 ImageView::GetNaturalSize()
171 // if no image then use Control's natural size
176 size.x = mImage.GetWidth();
177 size.y = mImage.GetHeight();
178 size.z = std::min(size.x, size.y);
182 size = Control::GetNaturalSize();
187 float ImageView::GetHeightForWidth( float width )
191 return GetHeightForWidthBase( width );
195 return Control::GetHeightForWidth( width );
199 float ImageView::GetWidthForHeight( float height )
203 return GetWidthForHeightBase( height );
207 return Control::GetWidthForHeight( height );
211 ///////////////////////////////////////////////////////////
216 void ImageView::AttachImage()
220 Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
221 mMaterial = Material::New( shader );
223 mSampler = Sampler::New( mImage, "sTexture" );
224 mMaterial.AddSampler( mSampler );
226 Vector3 size = Self().GetCurrentSize();
227 mMesh = CreateGeometry( size.width, size.height );
228 mRenderer = Renderer::New( mMesh, mMaterial );
229 Self().AddRenderer( mRenderer );
233 mSampler.SetImage( mImage );
237 void ImageView::OnRelayout( const Vector2& size, RelayoutContainer& container )
239 Control::OnRelayout( size, container );
243 mMesh = CreateGeometry( size.width, size.height );
244 mRenderer.SetGeometry( mMesh );
248 void ImageView::OnStageConnection( int depth )
256 ///////////////////////////////////////////////////////////
261 void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
263 Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
269 case Toolkit::ImageView::Property::RESOURCE_URL:
271 std::string imageUrl;
272 if( value.Get( imageUrl ) )
274 ImageView& impl = GetImpl( imageView );
275 impl.mImageUrl = imageUrl;
277 Image image = ResourceImage::New( imageUrl );
278 impl.SetImage( image );
286 Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex )
288 Property::Value value;
290 Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
294 switch ( propertyIndex )
296 case Toolkit::ImageView::Property::RESOURCE_URL:
298 value = GetImpl( imageview ).mImageUrl;
307 } // namespace Internal
308 } // namespace Toolkit