Moved Core Rendering API from devel-api to public-api
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-ImageView.cpp
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // Need to override adaptor classes for toolkit test harness, so include
19 // test harness headers before dali headers.
20 #include <dali-toolkit-test-suite-utils.h>
21 #include <toolkit-bitmap-loader.h>
22 #include <toolkit-event-thread-callback.h>
23
24 #include <dali-toolkit/dali-toolkit.h>
25 #include <dali/devel-api/scripting/scripting.h>
26 #include <dali/public-api/rendering/renderer.h>
27
28 #include <test-native-image.h>
29 #include <sstream>
30
31 using namespace Dali;
32 using namespace Toolkit;
33
34 void utc_dali_toolkit_image_view_startup(void)
35 {
36   test_return_value = TET_UNDEF;
37 }
38
39 void utc_dali_toolkit_image_view_cleanup(void)
40 {
41   test_return_value = TET_PASS;
42 }
43
44 namespace
45 {
46
47 const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
48   attribute mediump vec2 aPosition;\n
49   varying mediump vec2 vTexCoord;\n
50   uniform mediump mat4 uMvpMatrix;\n
51   uniform mediump vec3 uSize;\n
52   \n
53   void main()\n
54   {\n
55     mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
56     vertexPosition.xyz *= uSize;\n
57     vertexPosition = uMvpMatrix * vertexPosition;\n
58     \n
59     vTexCoord = aPosition + vec2(0.5);\n
60     gl_Position = vertexPosition;\n
61   }\n
62 );
63
64 const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
65   varying mediump vec2 vTexCoord;\n
66   uniform sampler2D sTexture;\n
67   uniform lowp vec4 uColor;\n
68   \n
69   void main()\n
70   {\n
71     gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
72   }\n
73 );
74
75 const char* TEST_IMAGE_FILE_NAME =  "gallery_image_01.jpg";
76 const char* TEST_IMAGE_FILE_NAME2 =  "gallery_image_02.jpg";
77
78 // resolution: 34*34, pixel format: RGBA8888
79 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png";
80 // resolution: 600*600, pixel format: RGB888
81 static const char* gImage_600_RGB = TEST_RESOURCE_DIR "/test-image-600.jpg";
82
83 void TestImage( ImageView imageView, BufferImage image )
84 {
85   Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
86
87   Property::Map map;
88   DALI_TEST_CHECK( value.Get( map ) );
89
90   DALI_TEST_CHECK( map.Find( "width" ) );
91   DALI_TEST_CHECK( map.Find( "height" ) );
92   DALI_TEST_CHECK( map.Find( "type" ) );
93
94   int width = 0;
95   DALI_TEST_CHECK( map[ "width" ].Get( width ) );
96   DALI_TEST_EQUALS( (unsigned int)width, image.GetWidth(), TEST_LOCATION );
97
98   int height = 0;
99   DALI_TEST_CHECK( map[ "height" ].Get( height ) );
100   DALI_TEST_EQUALS( (unsigned int)height, image.GetHeight(), TEST_LOCATION );
101
102   std::string type;
103   DALI_TEST_CHECK( map[ "type" ].Get( type ) );
104   DALI_TEST_EQUALS( type, "BufferImage", TEST_LOCATION );
105 }
106
107 void TestImage( ImageView imageView, ResourceImage image )
108 {
109   Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
110
111   Property::Map map;
112   DALI_TEST_CHECK( value.Get( map ) );
113
114   if( map.Find( "width" ) )
115   {
116     int width = 0;
117     DALI_TEST_CHECK( map[ "width" ].Get( width ) );
118     DALI_TEST_EQUALS( (unsigned int)width, image.GetWidth(), TEST_LOCATION );
119   }
120
121   if( map.Find( "height" ) )
122   {
123     int height = 0;
124     DALI_TEST_CHECK( map[ "height" ].Get( height ) );
125     DALI_TEST_EQUALS( (unsigned int)height, image.GetHeight(), TEST_LOCATION );
126   }
127
128   DALI_TEST_CHECK( map.Find( "type" ) );
129
130   std::string type;
131   DALI_TEST_CHECK( map[ "type" ].Get( type ) );
132   DALI_TEST_EQUALS( type, "ResourceImage", TEST_LOCATION );
133
134   std::string filename;
135   DALI_TEST_CHECK( map[ "filename" ].Get( filename ) );
136   DALI_TEST_EQUALS( filename, image.GetUrl(), TEST_LOCATION );
137 }
138
139 void TestUrl( ImageView imageView, const std::string url )
140 {
141   Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
142
143   std::string urlActual;
144   DALI_TEST_CHECK( value.Get( urlActual ) );
145   DALI_TEST_EQUALS( urlActual, url, TEST_LOCATION );
146 }
147
148 } // namespace
149
150 int UtcDaliImageViewNewP(void)
151 {
152   TestApplication application;
153
154   ImageView imageView = ImageView::New();
155
156   DALI_TEST_CHECK( imageView );
157
158   END_TEST;
159 }
160
161 int UtcDaliImageViewNewImageP(void)
162 {
163   TestApplication application;
164
165   BufferImage image = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
166   ImageView imageView = ImageView::New( image );
167
168   DALI_TEST_CHECK( imageView );
169   TestImage( imageView, image );
170
171   END_TEST;
172 }
173
174 int UtcDaliImageViewNewUrlP(void)
175 {
176   TestApplication application;
177
178   ImageView imageView = ImageView::New( TEST_IMAGE_FILE_NAME );
179   DALI_TEST_CHECK( imageView );
180
181   TestUrl( imageView, TEST_IMAGE_FILE_NAME );
182
183   END_TEST;
184 }
185
186 int UtcDaliImageViewConstructorP(void)
187 {
188   TestApplication application;
189
190   ImageView imageView;
191
192   DALI_TEST_CHECK( !imageView );
193
194   END_TEST;
195 }
196
197 int UtcDaliImageViewCopyConstructorP(void)
198 {
199   TestApplication application;
200
201   // Initialize an object, ref count == 1
202   ImageView imageView = ImageView::New();
203
204   ImageView copy( imageView );
205   DALI_TEST_CHECK( copy );
206
207   END_TEST;
208 }
209
210 int UtcDaliImageViewAssignmentOperatorP(void)
211 {
212   TestApplication application;
213
214   ImageView imageView = ImageView::New();
215
216   ImageView copy( imageView );
217   DALI_TEST_CHECK( copy );
218   DALI_TEST_EQUALS( imageView, copy, TEST_LOCATION );
219
220   END_TEST;
221 }
222
223 int UtcDaliImageViewDownCastP(void)
224 {
225   TestApplication application;
226
227   ImageView imageView = ImageView::New();
228
229   BaseHandle object(imageView);
230
231   ImageView imageView2 = ImageView::DownCast( object );
232   DALI_TEST_CHECK(imageView2);
233
234   ImageView imageView3 = DownCast< ImageView >( object );
235   DALI_TEST_CHECK(imageView3);
236
237   END_TEST;
238 }
239
240 int UtcDaliImageViewDownCastN(void)
241 {
242   TestApplication application;
243
244   BaseHandle unInitializedObject;
245
246   ImageView imageView1 = ImageView::DownCast( unInitializedObject );
247   DALI_TEST_CHECK( !imageView1 );
248
249   ImageView imageView2 = DownCast< ImageView >( unInitializedObject );
250   DALI_TEST_CHECK( !imageView2 );
251
252   END_TEST;
253 }
254
255 int UtcDaliImageViewTypeRegistry(void)
256 {
257   ToolkitTestApplication application;
258
259   TypeRegistry typeRegistry = TypeRegistry::Get();
260   DALI_TEST_CHECK( typeRegistry );
261
262   TypeInfo typeInfo = typeRegistry.GetTypeInfo( "ImageView" );
263   DALI_TEST_CHECK( typeInfo );
264
265   BaseHandle handle = typeInfo.CreateInstance();
266   DALI_TEST_CHECK( handle );
267
268   ImageView imageView = ImageView::DownCast( handle );
269   DALI_TEST_CHECK( imageView );
270
271   END_TEST;
272 }
273
274 int UtcDaliImageViewSetGetProperty01(void)
275 {
276   ToolkitTestApplication application;
277
278   ImageView imageView = ImageView::New();
279
280   Property::Index idx = imageView.GetPropertyIndex( "image" );
281   DALI_TEST_EQUALS( idx, (Property::Index)ImageView::Property::IMAGE, TEST_LOCATION );
282
283   imageView.SetProperty( idx, TEST_IMAGE_FILE_NAME );
284   TestUrl( imageView, TEST_IMAGE_FILE_NAME );
285
286   END_TEST;
287 }
288
289 int UtcDaliImageViewSetGetProperty02(void)
290 {
291   ToolkitTestApplication application;
292
293   Image image = CreateBufferImage( 10, 10, Color::WHITE );
294   ImageView imageView = ImageView::New(image);
295   Vector4 fullImageRect( 0.f, 0.f, 1.f, 1.f );
296
297   Stage::GetCurrent().Add( imageView );
298
299   application.SendNotification();
300   application.Render();
301   TestGlAbstraction& gl = application.GetGlAbstraction();
302
303   Vector4 pixelAreaUniform;
304   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
305   DALI_TEST_EQUALS( pixelAreaUniform, fullImageRect, TEST_LOCATION );
306
307   Property::Value value = imageView.GetProperty( ImageView::Property::PIXEL_AREA );
308   Vector4 pixelAreaValue;
309   DALI_TEST_CHECK( value.Get(pixelAreaValue) );
310   DALI_TEST_EQUALS( pixelAreaValue, fullImageRect, TEST_LOCATION );
311
312   Vector4 pixelAreaSet( 0.2f, 0.2f, 0.3f, 0.3f );
313   imageView.SetProperty( ImageView::Property::PIXEL_AREA, pixelAreaSet);
314
315   application.SendNotification();
316   application.Render();
317
318   value = imageView.GetProperty( ImageView::Property::PIXEL_AREA );
319   value.Get(pixelAreaValue);
320   DALI_TEST_EQUALS( pixelAreaValue, pixelAreaSet, TEST_LOCATION );
321
322   DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
323   DALI_TEST_EQUALS( pixelAreaUniform, pixelAreaSet, TEST_LOCATION );
324
325   END_TEST;
326 }
327
328 int UtcDaliImageViewSetGetProperty03(void)
329 {
330   ToolkitTestApplication application;
331
332   Image image = CreateBufferImage( 10, 10, Color::WHITE );
333   ImageView imageView = ImageView::New(image);
334   Stage::GetCurrent().Add( imageView );
335   application.SendNotification();
336   application.Render();
337
338   // conventional alpha blending
339   Renderer renderer = imageView.GetRendererAt( 0 );
340   Property::Value value = renderer.GetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
341   bool enable;
342   DALI_TEST_CHECK( value.Get( enable ) );
343   DALI_TEST_CHECK( !enable );
344
345   // pre-multiplied alpha blending
346   imageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
347   application.SendNotification();
348   application.Render();
349
350   int srcFactorRgb    = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_RGB );
351   int destFactorRgb   = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_RGB );
352   int srcFactorAlpha  = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_ALPHA );
353   int destFactorAlpha = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_ALPHA );
354   DALI_TEST_CHECK( srcFactorRgb == BlendingFactor::ONE );
355   DALI_TEST_CHECK( destFactorRgb == BlendingFactor::ONE_MINUS_SRC_ALPHA );
356   DALI_TEST_CHECK( srcFactorAlpha == BlendingFactor::ONE );
357   DALI_TEST_CHECK( destFactorAlpha == BlendingFactor::ONE );
358
359   value = renderer.GetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
360   DALI_TEST_CHECK( value.Get( enable ) );
361   DALI_TEST_CHECK( enable );
362
363   END_TEST;
364 }
365
366 int UtcDaliImageViewAsyncLoadingWithoutAltasing(void)
367 {
368   ToolkitTestApplication application;
369
370   // Async loading, no atlasing for big size image
371   ImageView imageView = ImageView::New( gImage_600_RGB );
372
373   // By default, Aysnc loading is used
374   Stage::GetCurrent().Add( imageView );
375   application.SendNotification();
376   application.Render(16);
377   application.Render(16);
378   application.SendNotification();
379
380   // BitmapLoader is not used
381   BitmapLoader loader = BitmapLoader::GetLatestCreated();
382   DALI_TEST_CHECK( !loader );
383
384   END_TEST;
385 }
386
387 int UtcDaliImageViewAsyncLoadingWithAltasing(void)
388 {
389   ToolkitTestApplication application;
390
391   //Async loading, automatic atlasing for small size image
392   TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
393   callStack.Reset();
394   callStack.Enable(true);
395
396   ImageView imageView = ImageView::New( gImage_34_RGBA, ImageDimensions( 34, 34 ) );
397
398   // By default, Aysnc loading is used
399   // loading is not started if the actor is offStage
400   BitmapLoader loader = BitmapLoader::GetLatestCreated();
401   DALI_TEST_CHECK( !loader );
402
403   Stage::GetCurrent().Add( imageView );
404   application.SendNotification();
405   application.Render(16);
406   application.Render(16);
407   application.SendNotification();
408
409   // loading started
410   loader = BitmapLoader::GetLatestCreated();
411   DALI_TEST_CHECK( loader );
412
413   // worker thread is created
414   EventThreadCallback* eventTrigger = EventThreadCallback::Get();
415   DALI_TEST_CHECK( eventTrigger );
416
417   loader.WaitForLoading();// waiting until the image to be loaded
418   DALI_TEST_CHECK( loader.IsLoaded() );
419
420   CallbackBase* callback = eventTrigger->GetCallback();
421   CallbackBase::Execute( *callback );
422
423   application.SendNotification();
424   application.Render(16);
425
426   callStack.Enable(false);
427
428   TraceCallStack::NamedParams params;
429   params["width"] = ToString(34);
430   params["height"] = ToString(34);
431   DALI_TEST_EQUALS( callStack.FindMethodAndParams( "TexSubImage2D", params ), true, TEST_LOCATION );
432
433   END_TEST;
434 }
435
436 int UtcDaliImageViewSyncLoading(void)
437 {
438   ToolkitTestApplication application;
439
440   Property::Map syncLoadingMap;
441   syncLoadingMap[ "synchronousLoading" ] = true;
442
443   // Sync loading, no atlasing for big size image
444   {
445     ImageView imageView = ImageView::New();
446
447     // Sync loading is used
448     syncLoadingMap[ "url" ] = gImage_600_RGB;
449     imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap );
450
451     // BitmapLoader is used, and the loading is started immediately even the actor is not on stage.
452     BitmapLoader loader = BitmapLoader::GetLatestCreated();
453     DALI_TEST_CHECK( loader );
454   }
455
456   // Sync loading, automatic atlasing for small size image
457   {
458     BitmapLoader::ResetLatestCreated();
459     TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
460     callStack.Reset();
461     callStack.Enable(true);
462
463     ImageView imageView = ImageView::New( );
464     // Sync loading is used
465     syncLoadingMap[ "url" ] = gImage_34_RGBA;
466     syncLoadingMap[ "desiredHeight" ] = 34;
467     syncLoadingMap[ "desiredWidth" ] = 34;
468     imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap );
469
470     // loading is started even if the actor is offStage
471     BitmapLoader loader = BitmapLoader::GetLatestCreated();
472     DALI_TEST_CHECK( loader );
473
474     loader.WaitForLoading();
475
476     DALI_TEST_CHECK( loader.IsLoaded() );
477
478     Stage::GetCurrent().Add( imageView );
479     application.SendNotification();
480     application.Render(16);
481
482     TraceCallStack::NamedParams params;
483     params["width"] = ToString(34);
484     params["height"] = ToString(34);
485     DALI_TEST_EQUALS( callStack.FindMethodAndParams( "TexSubImage2D", params ),
486                       true, TEST_LOCATION );
487   }
488   END_TEST;
489 }
490
491 int UtcDaliImageViewSizeWithBackground(void)
492 {
493   ToolkitTestApplication application;
494
495   int width = 100;
496   int height = 200;
497   Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
498   ImageView imageView = ImageView::New();
499   imageView.SetBackgroundImage( image );
500
501   Stage::GetCurrent().Add( imageView );
502   application.SendNotification();
503   application.Render();
504
505   DALI_TEST_EQUALS( imageView.GetCurrentSize().width, (float)width, TEST_LOCATION );
506   DALI_TEST_EQUALS( imageView.GetCurrentSize().height, (float)height, TEST_LOCATION );
507
508   END_TEST;
509 }
510
511 int UtcDaliImageViewSizeWithBackgroundAndImage(void)
512 {
513   ToolkitTestApplication application;
514
515   int widthBackground = 100;
516   int heightBackground = 200;
517   int width = 300;
518   int height = 400;
519   Image imageBackground = CreateBufferImage( widthBackground, heightBackground, Vector4(1.f, 1.f, 1.f, 1.f) );
520   Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
521
522   ImageView imageView = ImageView::New();
523   imageView.SetBackgroundImage( imageBackground );
524   imageView.SetImage( image );
525
526   Stage::GetCurrent().Add( imageView );
527   application.SendNotification();
528   application.Render();
529
530   DALI_TEST_EQUALS( imageView.GetCurrentSize().width, (float)width, TEST_LOCATION );
531   DALI_TEST_EQUALS( imageView.GetCurrentSize().height, (float)height, TEST_LOCATION );
532
533   END_TEST;
534 }
535
536 int UtcDaliImageViewHeightForWidthBackground(void)
537 {
538   ToolkitTestApplication application;
539
540   int widthBackground = 100;
541   int heightBackground = 200;
542   Image imageBackground = CreateBufferImage( widthBackground, heightBackground, Vector4(1.f, 1.f, 1.f, 1.f) );
543
544   ImageView imageView = ImageView::New();
545   imageView.SetBackgroundImage( imageBackground );
546
547   Stage::GetCurrent().Add( imageView );
548   application.SendNotification();
549   application.Render();
550
551   Control control = Control::DownCast( imageView );
552   DALI_TEST_CHECK( control );
553   DALI_TEST_EQUALS( imageView.GetHeightForWidth( 123.f ), control.GetHeightForWidth( 123.f ), TEST_LOCATION );
554   DALI_TEST_EQUALS( imageView.GetWidthForHeight( 321.f ), control.GetWidthForHeight( 321.f ), TEST_LOCATION );
555
556   END_TEST;
557 }
558
559 int UtcDaliImageViewHeightForWidthBackgroundAndImage(void)
560 {
561   ToolkitTestApplication application;
562
563   int widthBackground = 100;
564   int heightBackground = 200;
565   int width = 300;
566   int height = 400;
567   Image imageBackground = CreateBufferImage( widthBackground, heightBackground, Vector4(1.f, 1.f, 1.f, 1.f) );
568   Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
569
570   ImageView imageView = ImageView::New();
571   imageView.SetBackgroundImage( imageBackground );
572   imageView.SetImage( image );
573
574   Stage::GetCurrent().Add( imageView );
575   application.SendNotification();
576   application.Render();
577
578   DALI_TEST_EQUALS( imageView.GetHeightForWidth( width ), (float)height, TEST_LOCATION );
579   DALI_TEST_EQUALS( imageView.GetWidthForHeight( height ), (float)width, TEST_LOCATION );
580
581   END_TEST;
582 }
583
584 int UtcDaliImageViewSetBufferImage(void)
585 {
586   ToolkitTestApplication application;
587
588   int width1 = 300;
589   int height1 = 400;
590   BufferImage image1 = CreateBufferImage( width1, height1, Vector4( 1.f, 1.f, 1.f, 1.f ) );
591   ImageView imageView = ImageView::New();
592   imageView.SetImage( image1 );
593
594   TestImage( imageView, image1 );
595
596   int width2 = 600;
597   int height2 = 500;
598   BufferImage image2 = CreateBufferImage( width2, height2, Vector4( 1.f, 1.f, 1.f, 1.f ) );
599   imageView.SetImage( image2 );
600
601   TestImage( imageView, image2 );
602
603   END_TEST;
604 }
605
606 int UtcDaliImageViewSetImageUrl(void)
607 {
608   ToolkitTestApplication application;
609
610   ImageView imageView = ImageView::New();
611   imageView.SetImage( TEST_IMAGE_FILE_NAME );
612   TestUrl( imageView, TEST_IMAGE_FILE_NAME );
613
614
615   imageView.SetImage( TEST_IMAGE_FILE_NAME2 );
616   TestUrl( imageView, TEST_IMAGE_FILE_NAME2 );
617
618   END_TEST;
619 }
620
621 int UtcDaliImageViewSetImageOnstageP(void)
622 {
623   ToolkitTestApplication application;
624
625   ImageView imageView = ImageView::New();
626
627   Stage::GetCurrent().Add( imageView );
628   application.SendNotification();
629   application.Render();
630
631   ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
632   imageView.SetImage( image1 );
633   TestImage( imageView, image1 );
634
635   int width = 300;
636   int height = 400;
637   BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
638   imageView.SetImage( image2 );
639   TestImage( imageView, image2 );
640
641   END_TEST;
642 }
643
644 int UtcDaliImageViewSetImageOnstageN(void)
645 {
646   ToolkitTestApplication application;
647
648   ImageView imageView = ImageView::New();
649
650   Stage::GetCurrent().Add( imageView );
651   application.SendNotification();
652   application.Render();
653
654   ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
655   imageView.SetImage( image1 );
656   TestImage( imageView, image1 );
657
658   Image image2;
659   imageView.SetImage( image2 );
660
661   Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
662
663   //the value should be empty
664   std::string url;
665   DALI_TEST_CHECK( !value.Get( url ) );
666
667   Property::Map map;
668   DALI_TEST_CHECK( !value.Get( map ) );
669
670   END_TEST;
671 }
672
673 int UtcDaliImageViewSetImageOffstageP(void)
674 {
675   ToolkitTestApplication application;
676
677   ImageView imageView = ImageView::New();
678
679   Stage::GetCurrent().Add( imageView );
680   application.SendNotification();
681   application.Render();
682   Stage::GetCurrent().Remove( imageView );
683
684   ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
685   imageView.SetImage( image1 );
686   TestImage( imageView, image1 );
687
688   int width = 300;
689   int height = 400;
690   BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
691   imageView.SetImage( image2 );
692   TestImage( imageView, image2 );
693
694   END_TEST;
695 }
696
697 int UtcDaliImageViewSetImageOffstageN(void)
698 {
699   ToolkitTestApplication application;
700
701   ImageView imageView = ImageView::New();
702
703   Stage::GetCurrent().Add( imageView );
704   application.SendNotification();
705   application.Render();
706   Stage::GetCurrent().Remove( imageView );
707
708   ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
709   imageView.SetImage( image1 );
710   TestImage( imageView, image1 );
711
712   Image image2;
713   imageView.SetImage( image2 );
714
715   Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
716
717   //the value should be empty
718   std::string url;
719   DALI_TEST_CHECK( !value.Get( url ) );
720
721   Property::Map map;
722   DALI_TEST_CHECK( !value.Get( map ) );
723
724   END_TEST;
725 }
726
727 int UtcDaliImageViewSetImageN(void)
728 {
729   ToolkitTestApplication application;
730
731   Image image1;
732   ImageView imageView = ImageView::New();
733   imageView.SetImage( image1 );
734
735   Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
736
737   //the value should be empty
738   std::string url;
739   DALI_TEST_CHECK( !value.Get( url ) );
740
741   Property::Map map;
742   DALI_TEST_CHECK( !value.Get( map ) );
743
744   std::string resource_url;
745   Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
746   DALI_TEST_CHECK( !val.Get( resource_url ) );
747
748   END_TEST;
749 }
750
751 int UtcDaliImageViewSetImageTypeChangesP(void)
752 {
753   ToolkitTestApplication application;
754
755   ImageView imageView = ImageView::New();
756
757
758   std::string url;
759   Property::Map map;
760
761   Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
762   DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
763   DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
764
765   // Set a URL
766   imageView.SetImage( "TEST_URL" );
767   value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
768
769   DALI_TEST_CHECK( value.Get( url ) );   // Value should NOT be empty
770   DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
771
772   // Set an empty Image
773   imageView.SetImage( Image() );
774   value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
775
776   DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
777   DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
778
779   // Set an Image
780   ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
781   imageView.SetImage( image1 );
782   value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
783
784   DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
785   DALI_TEST_CHECK( value.Get( map ) );   // Value should NOT be empty
786
787   // Set an empty URL
788   imageView.SetImage( "" );
789   value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
790
791   DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
792   DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
793
794   END_TEST;
795 }
796
797 int UtcDaliImageViewResourceUrlP(void)
798 {
799   ToolkitTestApplication application;
800
801   ImageView imageView = ImageView::New();
802   DALI_TEST_CHECK( imageView.GetProperty( ImageView::Property::RESOURCE_URL ).Get< std::string >().empty() );
803
804   imageView.SetProperty( ImageView::Property::RESOURCE_URL, "TestString" );
805   DALI_TEST_EQUALS( imageView.GetProperty( ImageView::Property::RESOURCE_URL ).Get< std::string >(), "TestString", TEST_LOCATION );
806
807   END_TEST;
808 }
809
810 // Scenarios 1: ImageView from regular image
811 int UtcDaliImageViewSetImageBufferImage(void)
812 {
813   ToolkitTestApplication application;
814
815   ImageView imageView = ImageView::New();
816   Stage::GetCurrent().Add( imageView );
817
818   TestGlAbstraction& gl = application.GetGlAbstraction();
819   gl.EnableTextureCallTrace( true );
820
821   std::vector< GLuint > ids;
822   ids.push_back( 23 );
823   application.GetGlAbstraction().SetNextTextureIds( ids );
824
825   int width = 300;
826   int height = 400;
827   BufferImage image = CreateBufferImage( width, height, Color::WHITE );
828
829   imageView.SetImage( image );
830
831   application.SendNotification();
832   application.Render();
833
834   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
835
836   std::stringstream params;
837   params << GL_TEXTURE_2D << ", " << 23;
838   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
839
840   END_TEST;
841 }
842
843 // Scenarios 2: ImageView from Native image
844 int UtcDaliImageViewSetImageNativeImage(void)
845 {
846   ToolkitTestApplication application;
847
848   ImageView imageView = ImageView::New();
849   Stage::GetCurrent().Add( imageView );
850
851   TestGlAbstraction& gl = application.GetGlAbstraction();
852   gl.EnableTextureCallTrace( true );
853
854   std::vector< GLuint > ids;
855   ids.push_back( 23 );
856   application.GetGlAbstraction().SetNextTextureIds( ids );
857
858   int width = 200;
859   int height = 500;
860   TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
861   NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
862
863   imageView.SetImage( nativeImage );
864   application.SendNotification();
865   application.Render();
866
867   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
868
869   std::stringstream params;
870   params << GL_TEXTURE_2D << ", " << 23;
871   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
872
873   END_TEST;
874 }
875
876 // Scenarios 3: ImageView initially from regular image but then SetImage called with Native image
877 int UtcDaliImageViewSetImageBufferImageToNativeImage(void)
878 {
879   ToolkitTestApplication application;
880
881   int width = 300;
882   int height = 400;
883   BufferImage image = CreateBufferImage( width, height, Color::WHITE );
884
885   ImageView imageView = ImageView::New( image );
886   Stage::GetCurrent().Add( imageView );
887
888   TestGlAbstraction& gl = application.GetGlAbstraction();
889   gl.EnableTextureCallTrace( true );
890
891   std::vector< GLuint > ids;
892   ids.push_back( 23 );
893   application.GetGlAbstraction().SetNextTextureIds( ids );
894
895   application.SendNotification();
896   application.Render();
897
898   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
899
900   std::stringstream params;
901   params << GL_TEXTURE_2D << ", " << 23;
902   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
903
904   width = 200;
905   height = 500;
906   TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
907   NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
908   imageView.SetImage( nativeImage );
909
910   ids.clear();
911   ids.push_back( 24 );
912   application.GetGlAbstraction().SetNextTextureIds( ids );
913
914   application.SendNotification();
915   application.Render();
916
917   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
918
919   std::stringstream nextTextureParams;
920   nextTextureParams << GL_TEXTURE_2D << ", " << 24;
921   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nextTextureParams.str()) );
922
923   END_TEST;
924 }
925
926 // Scenarios 4: ImageView initially from Native image but then SetImage called with regular image
927 int UtcDaliImageViewSetImageNativeImageToBufferImage(void)
928 {
929   ToolkitTestApplication application;
930
931   int width = 300;
932   int height = 400;
933   TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
934   NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
935
936   ImageView imageView = ImageView::New( nativeImage );
937   Stage::GetCurrent().Add( imageView );
938
939   TestGlAbstraction& gl = application.GetGlAbstraction();
940   gl.EnableTextureCallTrace( true );
941
942   std::vector< GLuint > ids;
943   ids.push_back( 23 );
944   application.GetGlAbstraction().SetNextTextureIds( ids );
945
946   application.SendNotification();
947   application.Render();
948
949   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
950
951   std::stringstream params;
952   params << GL_TEXTURE_2D << ", " << 23;
953   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
954
955   width = 200;
956   height = 500;
957   BufferImage image = CreateBufferImage( width, height, Color::WHITE );
958   imageView.SetImage( image );
959
960   ids.clear();
961   ids.push_back( 24 );
962   application.GetGlAbstraction().SetNextTextureIds( ids );
963
964   application.SendNotification();
965   application.Render();
966
967   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
968
969   std::stringstream nextTextureParams;
970   nextTextureParams << GL_TEXTURE_2D << ", " << 24;
971   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nextTextureParams.str()) );
972
973   END_TEST;
974 }
975
976 // Scenarios 5: ImageView from Native image with custom shader
977 int UtcDaliImageViewSetImageNativeImageWithCustomShader(void)
978 {
979   ToolkitTestApplication application;
980
981   int width = 300;
982   int height = 400;
983
984   Property::Map customShader;
985   customShader.Insert( "vertexShader", VERTEX_SHADER );
986   customShader.Insert( "fragmentShader", FRAGMENT_SHADER );
987
988   Property::Array shaderHints;
989   shaderHints.PushBack( "requiresSelfDepthTest" );
990   shaderHints.PushBack( "outputIsTransparent" );
991   shaderHints.PushBack( "outputIsOpaque" );
992   shaderHints.PushBack( "modifiesGeometry" );
993
994   customShader.Insert( "hints", shaderHints );
995
996   Property::Map map;
997   map.Insert( "shader", customShader );
998
999   TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
1000   NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
1001
1002   ImageView imageView = ImageView::New( nativeImage );
1003   imageView.SetProperty( ImageView::Property::IMAGE, map );
1004   Stage::GetCurrent().Add( imageView );
1005
1006   TestGlAbstraction& gl = application.GetGlAbstraction();
1007   gl.EnableTextureCallTrace( true );
1008
1009   std::vector< GLuint > ids;
1010   ids.push_back( 23 );
1011   application.GetGlAbstraction().SetNextTextureIds( ids );
1012
1013   application.SendNotification();
1014   application.Render();
1015
1016   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1017
1018   std::stringstream params;
1019   params << GL_TEXTURE_2D << ", " << 23;
1020   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1021
1022   END_TEST;
1023 }
1024
1025 // Scenarios 6: ImageView initially from regular image with custom shader but then SetImage called with Native
1026 int UtcDaliImageViewSetImageBufferImageWithCustomShaderToNativeImage(void)
1027 {
1028   ToolkitTestApplication application;
1029
1030   int width = 300;
1031   int height = 400;
1032
1033   Property::Map customShader;
1034   customShader.Insert( "vertexShader", VERTEX_SHADER );
1035   customShader.Insert( "fragmentShader", FRAGMENT_SHADER );
1036
1037   Property::Array shaderHints;
1038   shaderHints.PushBack( "requiresSelfDepthTest" );
1039   shaderHints.PushBack( "outputIsTransparent" );
1040   shaderHints.PushBack( "outputIsOpaque" );
1041   shaderHints.PushBack( "modifiesGeometry" );
1042
1043   customShader.Insert( "hints", shaderHints );
1044
1045   Property::Map map;
1046   map.Insert( "shader", customShader );
1047
1048   BufferImage image = CreateBufferImage( width, height, Color::WHITE );
1049
1050   ImageView imageView = ImageView::New( image );
1051   imageView.SetProperty( ImageView::Property::IMAGE, map );
1052   Stage::GetCurrent().Add( imageView );
1053
1054   TestGlAbstraction& gl = application.GetGlAbstraction();
1055   gl.EnableTextureCallTrace( true );
1056
1057   std::vector< GLuint > ids;
1058   ids.push_back( 23 );
1059   application.GetGlAbstraction().SetNextTextureIds( ids );
1060
1061   application.SendNotification();
1062   application.Render();
1063
1064   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1065
1066   std::stringstream params;
1067   params << GL_TEXTURE_2D << ", " << 23;
1068   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1069
1070   TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
1071   NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
1072   imageView.SetImage( nativeImage );
1073
1074   ids.clear();
1075   ids.push_back( 24 );
1076   application.GetGlAbstraction().SetNextTextureIds( ids );
1077
1078   application.SendNotification();
1079   application.Render();
1080
1081   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1082
1083   std::stringstream nativeImageParams;
1084   nativeImageParams << GL_TEXTURE_2D << ", " << 24;
1085   DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nativeImageParams.str()) );
1086
1087
1088   END_TEST;
1089 }
1090
1091 int UtcDaliImageViewGetImageP1(void)
1092 {
1093   ToolkitTestApplication application;
1094
1095   ImageView imageView = ImageView::New();
1096   DALI_TEST_CHECK( ! imageView.GetImage() );
1097
1098   Image image = CreateBufferImage();
1099   imageView.SetImage( image );
1100   DALI_TEST_CHECK( imageView.GetImage() == image );
1101
1102   END_TEST;
1103 }
1104
1105 int UtcDaliImageViewGetImageP2(void)
1106 {
1107   ToolkitTestApplication application;
1108
1109   BufferImage image = CreateBufferImage();
1110   ImageView imageView = ImageView::New( image );
1111   DALI_TEST_CHECK( imageView.GetImage() == image );
1112
1113   END_TEST;
1114 }
1115
1116 int UtcDaliImageViewGetImageN(void)
1117 {
1118   ToolkitTestApplication application;
1119
1120   ImageView imageView = ImageView::New( TEST_IMAGE_FILE_NAME );
1121   DALI_TEST_CHECK( ! imageView.GetImage() );
1122
1123   Image image = CreateBufferImage();
1124   imageView.SetImage( image );
1125   DALI_TEST_CHECK( imageView.GetImage() == image );
1126
1127   imageView.SetImage( TEST_IMAGE_FILE_NAME );
1128   DALI_TEST_CHECK( ! imageView.GetImage() );
1129
1130   END_TEST;
1131 }