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 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 = 0.5f;
63 const float halfHeight = 0.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 //TODO: replace with triangle strip when Geometry supports it
78 unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 };
79 Property::Map indexFormat;
80 indexFormat["indices"] = Property::INTEGER;
81 PropertyBuffer indices = PropertyBuffer::New( indexFormat, 6 );
82 indices.SetData(indexData);
84 // Create the geometry object
85 Geometry texturedQuadGeometry = Geometry::New();
86 texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices );
87 texturedQuadGeometry.SetIndexBuffer( indices );
89 return texturedQuadGeometry;
94 return Toolkit::ImageView::New();
97 // Setup properties, signals and actions using the type-registry.
98 DALI_TYPE_REGISTRATION_BEGIN( Toolkit::ImageView, Toolkit::Control, Create );
99 DALI_PROPERTY_REGISTRATION( Toolkit, ImageView, "resource-url", STRING, RESOURCE_URL )
100 DALI_TYPE_REGISTRATION_END()
102 } // anonymous namespace
104 using namespace Dali;
106 ImageView::ImageView()
107 : Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) )
111 ImageView::~ImageView()
115 Toolkit::ImageView ImageView::New()
117 ImageView* impl = new ImageView();
119 Dali::Toolkit::ImageView handle = Dali::Toolkit::ImageView( *impl );
121 // Second-phase init of the implementation
122 // This can only be done after the CustomActor connection has been made...
128 /////////////////////////////////////////////////////////////
130 void ImageView::SetImage( Image image )
134 ResourceImage resourceImage = ResourceImage::DownCast( mImage );
137 mImageUrl = resourceImage.GetUrl();
146 if( Self().OnStage() )
156 Self().RemoveRenderer( mRenderer );
165 Image ImageView::GetImage() const
170 Vector3 ImageView::GetNaturalSize()
172 // if no image then use Control's natural size
177 size.x = mImage.GetWidth();
178 size.y = mImage.GetHeight();
179 size.z = std::min(size.x, size.y);
183 size = Control::GetNaturalSize();
188 float ImageView::GetHeightForWidth( float width )
192 return GetHeightForWidthBase( width );
196 return Control::GetHeightForWidth( width );
200 float ImageView::GetWidthForHeight( float height )
204 return GetWidthForHeightBase( height );
208 return Control::GetWidthForHeight( height );
212 ///////////////////////////////////////////////////////////
217 void ImageView::AttachImage()
221 Shader shader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER );
222 mMaterial = Material::New( shader );
224 mSampler = Sampler::New( mImage, "sTexture" );
225 mMaterial.AddSampler( mSampler );
227 Vector3 size = Self().GetCurrentSize();
228 mMesh = CreateGeometry( size.width, size.height );
229 mRenderer = Renderer::New( mMesh, mMaterial );
230 Self().AddRenderer( mRenderer );
234 mSampler.SetImage( mImage );
238 void ImageView::OnRelayout( const Vector2& size, RelayoutContainer& container )
240 Control::OnRelayout( size, container );
244 mMesh = CreateGeometry( size.width, size.height );
245 mRenderer.SetGeometry( mMesh );
249 void ImageView::OnStageConnection( int depth )
257 ///////////////////////////////////////////////////////////
262 void ImageView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
264 Toolkit::ImageView imageView = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
270 case Toolkit::ImageView::Property::RESOURCE_URL:
272 std::string imageUrl;
273 if( value.Get( imageUrl ) )
275 ImageView& impl = GetImpl( imageView );
276 impl.mImageUrl = imageUrl;
278 Image image = ResourceImage::New( imageUrl );
279 impl.SetImage( image );
287 Property::Value ImageView::GetProperty( BaseObject* object, Property::Index propertyIndex )
289 Property::Value value;
291 Toolkit::ImageView imageview = Toolkit::ImageView::DownCast( Dali::BaseHandle( object ) );
295 switch ( propertyIndex )
297 case Toolkit::ImageView::Property::RESOURCE_URL:
299 value = GetImpl( imageview ).mImageUrl;
308 } // namespace Internal
309 } // namespace Toolkit