2 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
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-event-thread-callback.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali/devel-api/scripting/scripting.h>
25 #include <dali-toolkit/devel-api/controls/control-devel.h>
26 #include <dali-toolkit/devel-api/image-loader/texture-manager.h>
28 #include <test-native-image.h>
33 #include "dummy-control.h"
36 using namespace Toolkit;
38 void utc_dali_toolkit_image_view_startup(void)
40 test_return_value = TET_UNDEF;
43 void utc_dali_toolkit_image_view_cleanup(void)
45 test_return_value = TET_PASS;
51 const char* VERTEX_SHADER = DALI_COMPOSE_SHADER(
52 attribute mediump vec2 aPosition;\n
53 varying mediump vec2 vTexCoord;\n
54 uniform mediump mat4 uMvpMatrix;\n
55 uniform mediump vec3 uSize;\n
59 mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);\n
60 vertexPosition.xyz *= uSize;\n
61 vertexPosition = uMvpMatrix * vertexPosition;\n
63 vTexCoord = aPosition + vec2(0.5);\n
64 gl_Position = vertexPosition;\n
68 const char* FRAGMENT_SHADER = DALI_COMPOSE_SHADER(
69 varying mediump vec2 vTexCoord;\n
70 uniform sampler2D sTexture;\n
71 uniform lowp vec4 uColor;\n
75 gl_FragColor = texture2D( sTexture, vTexCoord ) * uColor;\n
79 const char* TEST_IMAGE_FILE_NAME = "gallery_image_01.jpg";
80 const char* TEST_IMAGE_FILE_NAME2 = "gallery_image_02.jpg";
82 const char* TEST_IMAGE_1 = TEST_RESOURCE_DIR "/TB-gloss.png";
83 const char* TEST_IMAGE_2 = TEST_RESOURCE_DIR "/tb-norm.png";
85 // resolution: 34*34, pixel format: RGBA8888
86 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png";
87 // resolution: 600*600, pixel format: RGB888
88 static const char* gImage_600_RGB = TEST_RESOURCE_DIR "/test-image-600.jpg";
90 // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame
91 const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif";
93 void TestImage( ImageView imageView, BufferImage image )
95 Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
98 DALI_TEST_CHECK( value.Get( map ) );
100 DALI_TEST_CHECK( map.Find( "width" ) );
101 DALI_TEST_CHECK( map.Find( "height" ) );
102 DALI_TEST_CHECK( map.Find( "type" ) );
105 DALI_TEST_CHECK( map[ "width" ].Get( width ) );
106 DALI_TEST_EQUALS( (unsigned int)width, image.GetWidth(), TEST_LOCATION );
109 DALI_TEST_CHECK( map[ "height" ].Get( height ) );
110 DALI_TEST_EQUALS( (unsigned int)height, image.GetHeight(), TEST_LOCATION );
113 DALI_TEST_CHECK( map[ "type" ].Get( type ) );
114 DALI_TEST_EQUALS( type, "BufferImage", TEST_LOCATION );
117 void TestImage( ImageView imageView, ResourceImage image )
119 Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
122 DALI_TEST_CHECK( value.Get( map ) );
124 if( map.Find( "width" ) )
127 DALI_TEST_CHECK( map[ "width" ].Get( width ) );
128 DALI_TEST_EQUALS( (unsigned int)width, image.GetWidth(), TEST_LOCATION );
131 if( map.Find( "height" ) )
134 DALI_TEST_CHECK( map[ "height" ].Get( height ) );
135 DALI_TEST_EQUALS( (unsigned int)height, image.GetHeight(), TEST_LOCATION );
138 DALI_TEST_CHECK( map.Find( "type" ) );
141 DALI_TEST_CHECK( map[ "type" ].Get( type ) );
142 DALI_TEST_EQUALS( type, "ResourceImage", TEST_LOCATION );
144 std::string filename;
145 DALI_TEST_CHECK( map[ "filename" ].Get( filename ) );
146 DALI_TEST_EQUALS( filename, image.GetUrl(), TEST_LOCATION );
149 void TestUrl( ImageView imageView, const std::string url )
151 Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
153 std::string urlActual;
154 DALI_TEST_CHECK( value.Get( urlActual ) );
155 DALI_TEST_EQUALS( urlActual, url, TEST_LOCATION );
160 int UtcDaliImageViewNewP(void)
162 TestApplication application;
164 ImageView imageView = ImageView::New();
166 DALI_TEST_CHECK( imageView );
171 int UtcDaliImageViewNewImageP(void)
173 TestApplication application;
175 BufferImage image = CreateBufferImage( 100, 200, Vector4( 1.f, 1.f, 1.f, 1.f ) );
176 ImageView imageView = ImageView::New( image );
178 DALI_TEST_CHECK( imageView );
179 TestImage( imageView, image );
184 int UtcDaliImageViewNewUrlP(void)
186 TestApplication application;
188 ImageView imageView = ImageView::New( TEST_IMAGE_FILE_NAME );
189 DALI_TEST_CHECK( imageView );
191 TestUrl( imageView, TEST_IMAGE_FILE_NAME );
196 int UtcDaliImageViewConstructorP(void)
198 TestApplication application;
202 DALI_TEST_CHECK( !imageView );
207 int UtcDaliImageViewCopyConstructorP(void)
209 TestApplication application;
211 // Initialize an object, ref count == 1
212 ImageView imageView = ImageView::New();
214 ImageView copy( imageView );
215 DALI_TEST_CHECK( copy );
220 int UtcDaliImageViewAssignmentOperatorP(void)
222 TestApplication application;
224 ImageView imageView = ImageView::New();
226 ImageView copy( imageView );
227 DALI_TEST_CHECK( copy );
228 DALI_TEST_EQUALS( imageView, copy, TEST_LOCATION );
233 int UtcDaliImageViewDownCastP(void)
235 TestApplication application;
237 ImageView imageView = ImageView::New();
239 BaseHandle object(imageView);
241 ImageView imageView2 = ImageView::DownCast( object );
242 DALI_TEST_CHECK(imageView2);
244 ImageView imageView3 = DownCast< ImageView >( object );
245 DALI_TEST_CHECK(imageView3);
250 int UtcDaliImageViewDownCastN(void)
252 TestApplication application;
254 BaseHandle unInitializedObject;
256 ImageView imageView1 = ImageView::DownCast( unInitializedObject );
257 DALI_TEST_CHECK( !imageView1 );
259 ImageView imageView2 = DownCast< ImageView >( unInitializedObject );
260 DALI_TEST_CHECK( !imageView2 );
265 int UtcDaliImageViewTypeRegistry(void)
267 ToolkitTestApplication application;
269 TypeRegistry typeRegistry = TypeRegistry::Get();
270 DALI_TEST_CHECK( typeRegistry );
272 TypeInfo typeInfo = typeRegistry.GetTypeInfo( "ImageView" );
273 DALI_TEST_CHECK( typeInfo );
275 BaseHandle handle = typeInfo.CreateInstance();
276 DALI_TEST_CHECK( handle );
278 ImageView imageView = ImageView::DownCast( handle );
279 DALI_TEST_CHECK( imageView );
284 int UtcDaliImageViewSetGetProperty01(void)
286 ToolkitTestApplication application;
288 ImageView imageView = ImageView::New();
290 Property::Index idx = imageView.GetPropertyIndex( "image" );
291 DALI_TEST_EQUALS( idx, (Property::Index)ImageView::Property::IMAGE, TEST_LOCATION );
293 imageView.SetProperty( idx, TEST_IMAGE_FILE_NAME );
294 TestUrl( imageView, TEST_IMAGE_FILE_NAME );
299 int UtcDaliImageViewSetGetProperty02(void)
301 ToolkitTestApplication application;
303 Image image = CreateBufferImage( 10, 10, Color::WHITE );
304 ImageView imageView = ImageView::New(image);
305 Vector4 fullImageRect( 0.f, 0.f, 1.f, 1.f );
307 Stage::GetCurrent().Add( imageView );
309 application.SendNotification();
310 application.Render();
311 TestGlAbstraction& gl = application.GetGlAbstraction();
313 Vector4 pixelAreaUniform;
314 DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
315 DALI_TEST_EQUALS( pixelAreaUniform, fullImageRect, TEST_LOCATION );
317 Property::Value value = imageView.GetProperty( ImageView::Property::PIXEL_AREA );
318 Vector4 pixelAreaValue;
319 DALI_TEST_CHECK( value.Get(pixelAreaValue) );
320 DALI_TEST_EQUALS( pixelAreaValue, fullImageRect, TEST_LOCATION );
322 Vector4 pixelAreaSet( 0.2f, 0.2f, 0.3f, 0.3f );
323 imageView.SetProperty( ImageView::Property::PIXEL_AREA, pixelAreaSet);
325 application.SendNotification();
326 application.Render();
328 value = imageView.GetProperty( ImageView::Property::PIXEL_AREA );
329 value.Get(pixelAreaValue);
330 DALI_TEST_EQUALS( pixelAreaValue, pixelAreaSet, TEST_LOCATION );
332 DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
333 DALI_TEST_EQUALS( pixelAreaUniform, pixelAreaSet, TEST_LOCATION );
338 int UtcDaliImageViewSetGetProperty03(void)
340 ToolkitTestApplication application;
342 Image image = CreateBufferImage( 10, 10, Color::WHITE );
343 ImageView imageView = ImageView::New(image);
344 Stage::GetCurrent().Add( imageView );
345 application.SendNotification();
346 application.Render();
348 // conventional alpha blending
349 Renderer renderer = imageView.GetRendererAt( 0 );
350 Property::Value value = renderer.GetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
352 DALI_TEST_CHECK( value.Get( enable ) );
353 DALI_TEST_CHECK( !enable );
355 // pre-multiplied alpha blending
356 imageView.SetProperty( Toolkit::ImageView::Property::PRE_MULTIPLIED_ALPHA, true );
357 application.SendNotification();
358 application.Render();
360 int srcFactorRgb = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_RGB );
361 int destFactorRgb = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_RGB );
362 int srcFactorAlpha = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_SRC_ALPHA );
363 int destFactorAlpha = renderer.GetProperty<int>( Renderer::Property::BLEND_FACTOR_DEST_ALPHA );
364 DALI_TEST_CHECK( srcFactorRgb == BlendFactor::ONE );
365 DALI_TEST_CHECK( destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA );
366 DALI_TEST_CHECK( srcFactorAlpha == BlendFactor::ONE );
367 DALI_TEST_CHECK( destFactorAlpha == BlendFactor::ONE );
369 value = renderer.GetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA );
370 DALI_TEST_CHECK( value.Get( enable ) );
371 DALI_TEST_CHECK( enable );
376 int UtcDaliImageViewPixelArea(void)
378 // Test pixel area property
379 ToolkitTestApplication application;
381 // Gif image, use AnimatedImageVisual internally
382 // Atlasing is applied to pack multiple frames, use custom wrap mode
383 ImageView gifView = ImageView::New();
384 const Vector4 pixelAreaVisual( 0.f, 0.f, 2.f, 2.f );
385 gifView.SetProperty( ImageView::Property::IMAGE,
386 Property::Map().Add( ImageVisual::Property::URL, TEST_GIF_FILE_NAME )
387 .Add( ImageVisual::Property::PIXEL_AREA, pixelAreaVisual ) );
390 Stage stage = Stage::GetCurrent();
391 stage.Add( gifView );
394 application.SendNotification();
395 application.Render(16);
396 DALI_TEST_CHECK( gifView.GetRendererCount() == 1u );
398 const Vector4 fullTextureRect( 0.f, 0.f, 1.f, 1.f );
399 // test that the pixel area value defined in the visual property map is registered on renderer
400 Renderer renderer = gifView.GetRendererAt(0);
401 Property::Value pixelAreaValue = renderer.GetProperty( renderer.GetPropertyIndex( "pixelArea" ) );
402 DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelAreaVisual, TEST_LOCATION );
404 // test that the shader has the default pixel area value registered.
405 Shader shader = renderer.GetShader();
406 pixelAreaValue = shader.GetProperty( shader.GetPropertyIndex( "pixelArea" ) );
407 DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), fullTextureRect, TEST_LOCATION );
409 // test that the uniform uses the pixelArea property on the renderer.
410 TestGlAbstraction& gl = application.GetGlAbstraction();
411 Vector4 pixelAreaUniform;
412 DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
413 DALI_TEST_EQUALS( pixelAreaVisual, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
415 // set the pixelArea property on the control
416 const Vector4 pixelAreaControl( -1.f, -1.f, 3.f, 3.f );
417 gifView.SetProperty( ImageView::Property::PIXEL_AREA, pixelAreaControl );
418 application.SendNotification();
419 application.Render(16);
421 // check the pixelArea property on the control
422 pixelAreaValue = gifView.GetProperty( gifView.GetPropertyIndex( "pixelArea" ) );
423 DALI_TEST_EQUALS( pixelAreaValue.Get<Vector4>(), pixelAreaControl, TEST_LOCATION );
424 // test that the uniform uses the pixelArea property on the control.
425 DALI_TEST_CHECK( gl.GetUniformValue<Vector4>( "pixelArea", pixelAreaUniform ) );
426 DALI_TEST_EQUALS( pixelAreaControl, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION );
432 int UtcDaliImageViewAsyncLoadingWithoutAltasing(void)
434 ToolkitTestApplication application;
435 TestGlAbstraction& gl = application.GetGlAbstraction();
436 const std::vector<GLuint>& textures = gl.GetBoundTextures();
437 size_t numTextures = textures.size();
439 // Async loading, no atlasing for big size image
440 ImageView imageView = ImageView::New( gImage_600_RGB );
442 // By default, Aysnc loading is used
443 Stage::GetCurrent().Add( imageView );
444 imageView.SetSize(100, 100);
445 imageView.SetParentOrigin( ParentOrigin::CENTER );
447 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
449 application.SendNotification();
450 application.Render(16);
451 application.SendNotification();
453 const std::vector<GLuint>& textures2 = gl.GetBoundTextures();
454 DALI_TEST_GREATER( textures2.size(), numTextures, TEST_LOCATION );
461 int UtcDaliImageViewAsyncLoadingWithAtlasing(void)
463 ToolkitTestApplication application;
465 //Async loading, automatic atlasing for small size image
466 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
468 callStack.Enable(true);
470 Property::Map imageMap;
472 imageMap[ ImageVisual::Property::URL ] = gImage_34_RGBA;
473 imageMap[ ImageVisual::Property::DESIRED_HEIGHT ] = 34;
474 imageMap[ ImageVisual::Property::DESIRED_WIDTH ] = 34;
475 imageMap[ ImageVisual::Property::ATLASING] = true;
477 ImageView imageView = ImageView::New();
478 imageView.SetProperty( ImageView::Property::IMAGE, imageMap );
479 imageView.SetProperty( Toolkit::Control::Property::PADDING, Extents( 10u, 10u, 10u, 10u ) );
481 // By default, Aysnc loading is used
482 // loading is not started if the actor is offStage
484 Stage::GetCurrent().Add( imageView );
485 application.SendNotification();
486 application.Render(16);
487 application.Render(16);
488 application.SendNotification();
490 // loading started, this waits for the loader thread for max 30 seconds
491 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
493 application.SendNotification();
494 application.Render(16);
496 callStack.Enable(false);
498 TraceCallStack::NamedParams params;
499 params["width"] = ToString(34);
500 params["height"] = ToString(34);
501 DALI_TEST_EQUALS( callStack.FindMethodAndParams( "TexSubImage2D", params ), true, TEST_LOCATION );
506 int UtcDaliImageViewAsyncLoadingWithAtlasing02(void)
508 ToolkitTestApplication application;
510 //Async loading, automatic atlasing for small size image
511 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
513 callStack.Enable(true);
515 Property::Map asyncLoadingMap;
516 asyncLoadingMap[ "url" ] = gImage_34_RGBA;
517 asyncLoadingMap[ "desiredHeight" ] = 34;
518 asyncLoadingMap[ "desiredWidth" ] = 34;
519 asyncLoadingMap[ "synchronousLoading" ] = false;
520 asyncLoadingMap[ "atlasing" ] = true;
522 ImageView imageView = ImageView::New();
523 imageView.SetProperty( ImageView::Property::IMAGE, asyncLoadingMap );
525 Stage::GetCurrent().Add( imageView );
526 application.SendNotification();
527 application.Render(16);
528 application.Render(16);
529 application.SendNotification();
531 // loading started, this waits for the loader thread for max 30 seconds
532 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
534 application.SendNotification();
535 application.Render(16);
537 callStack.Enable(false);
539 TraceCallStack::NamedParams params;
540 params["width"] = ToString(34);
541 params["height"] = ToString(34);
542 DALI_TEST_EQUALS( callStack.FindMethodAndParams( "TexSubImage2D", params ), true, TEST_LOCATION );
547 int UtcDaliImageViewSyncLoading(void)
549 ToolkitTestApplication application;
551 tet_infoline("ImageView Testing sync loading and size using index key property map");
553 Property::Map syncLoadingMap;
554 syncLoadingMap[ ImageVisual::Property::SYNCHRONOUS_LOADING ] = true;
555 syncLoadingMap[ ImageVisual::Property::ATLASING ] = true;
557 // Sync loading, no atlasing for big size image
559 ImageView imageView = ImageView::New();
561 // Sync loading is used
562 syncLoadingMap[ ImageVisual::Property::URL ] = gImage_600_RGB;
563 imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap );
566 // Sync loading, automatic atlasing for small size image
568 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
570 callStack.Enable(true);
572 ImageView imageView = ImageView::New( );
574 // Sync loading is used
575 syncLoadingMap[ ImageVisual::Property::URL ] = gImage_34_RGBA;
576 syncLoadingMap[ ImageVisual::Property::DESIRED_HEIGHT ] = 34;
577 syncLoadingMap[ ImageVisual::Property::DESIRED_WIDTH ] = 34;
578 imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap );
580 Stage::GetCurrent().Add( imageView );
581 application.SendNotification();
582 application.Render(16);
584 TraceCallStack::NamedParams params;
585 params["width"] = ToString(34);
586 params["height"] = ToString(34);
587 DALI_TEST_EQUALS( callStack.FindMethodAndParams( "TexSubImage2D", params ),
588 true, TEST_LOCATION );
593 int UtcDaliImageViewSyncLoading02(void)
595 ToolkitTestApplication application;
597 tet_infoline("ImageView Testing sync loading and size using string key property map");
599 // Sync loading, automatic atlasing for small size image
601 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
603 callStack.Enable(true);
605 ImageView imageView = ImageView::New( );
607 // Sync loading is used
608 Property::Map syncLoadingMap;
609 syncLoadingMap[ "url" ] = gImage_34_RGBA;
610 syncLoadingMap[ "desiredHeight" ] = 34;
611 syncLoadingMap[ "desiredWidth" ] = 34;
612 syncLoadingMap[ "synchronousLoading" ] = true;
613 syncLoadingMap[ "atlasing" ] = true;
614 imageView.SetProperty( ImageView::Property::IMAGE, syncLoadingMap );
616 Stage::GetCurrent().Add( imageView );
617 application.SendNotification();
618 application.Render(16);
620 TraceCallStack::NamedParams params;
621 params["width"] = ToString(34);
622 params["height"] = ToString(34);
623 DALI_TEST_EQUALS( callStack.FindMethodAndParams( "TexSubImage2D", params ),
624 true, TEST_LOCATION );
629 int UtcDaliImageViewAddedTexture(void)
631 ToolkitTestApplication application;
633 tet_infoline("ImageView Testing image view with texture provided manager url");
635 ImageView imageView = ImageView::New();
637 // empty texture is ok, though pointless from app point of view
639 std::string url = TextureManager::AddTexture(empty);
640 DALI_TEST_CHECK(url.size() > 0u);
642 Property::Map propertyMap;
643 propertyMap[ImageVisual::Property::URL] = url;
644 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
646 Stage::GetCurrent().Add( imageView );
647 application.SendNotification();
648 application.Render();
653 int UtcDaliImageViewSizeWithBackground(void)
655 ToolkitTestApplication application;
659 Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
660 ImageView imageView = ImageView::New();
661 imageView.SetBackgroundImage( image );
663 Stage::GetCurrent().Add( imageView );
664 application.SendNotification();
665 application.Render();
667 DALI_TEST_EQUALS( imageView.GetCurrentSize().width, (float)width, TEST_LOCATION );
668 DALI_TEST_EQUALS( imageView.GetCurrentSize().height, (float)height, TEST_LOCATION );
673 int UtcDaliImageViewSizeWithBackgroundAndImage(void)
675 ToolkitTestApplication application;
677 int widthBackground = 100;
678 int heightBackground = 200;
681 Image imageBackground = CreateBufferImage( widthBackground, heightBackground, Vector4(1.f, 1.f, 1.f, 1.f) );
682 Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
684 ImageView imageView = ImageView::New();
685 imageView.SetBackgroundImage( imageBackground );
686 imageView.SetImage( image );
688 Stage::GetCurrent().Add( imageView );
689 application.SendNotification();
690 application.Render();
692 DALI_TEST_EQUALS( imageView.GetCurrentSize().width, (float)width, TEST_LOCATION );
693 DALI_TEST_EQUALS( imageView.GetCurrentSize().height, (float)height, TEST_LOCATION );
698 int UtcDaliImageViewHeightForWidthBackground(void)
700 ToolkitTestApplication application;
702 int widthBackground = 100;
703 int heightBackground = 200;
704 Image imageBackground = CreateBufferImage( widthBackground, heightBackground, Vector4(1.f, 1.f, 1.f, 1.f) );
706 ImageView imageView = ImageView::New();
707 imageView.SetBackgroundImage( imageBackground );
709 Stage::GetCurrent().Add( imageView );
710 application.SendNotification();
711 application.Render();
713 Control control = Control::DownCast( imageView );
714 DALI_TEST_CHECK( control );
715 DALI_TEST_EQUALS( imageView.GetHeightForWidth( 123.f ), control.GetHeightForWidth( 123.f ), TEST_LOCATION );
716 DALI_TEST_EQUALS( imageView.GetWidthForHeight( 321.f ), control.GetWidthForHeight( 321.f ), TEST_LOCATION );
721 int UtcDaliImageViewHeightForWidthBackgroundAndImage(void)
723 ToolkitTestApplication application;
725 int widthBackground = 100;
726 int heightBackground = 200;
729 Image imageBackground = CreateBufferImage( widthBackground, heightBackground, Vector4(1.f, 1.f, 1.f, 1.f) );
730 Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
732 ImageView imageView = ImageView::New();
733 imageView.SetBackgroundImage( imageBackground );
734 imageView.SetImage( image );
736 Stage::GetCurrent().Add( imageView );
737 application.SendNotification();
738 application.Render();
740 DALI_TEST_EQUALS( imageView.GetHeightForWidth( width ), (float)height, TEST_LOCATION );
741 DALI_TEST_EQUALS( imageView.GetWidthForHeight( height ), (float)width, TEST_LOCATION );
746 int UtcDaliImageViewSetBufferImage(void)
748 ToolkitTestApplication application;
752 BufferImage image1 = CreateBufferImage( width1, height1, Vector4( 1.f, 1.f, 1.f, 1.f ) );
753 ImageView imageView = ImageView::New();
754 imageView.SetImage( image1 );
756 TestImage( imageView, image1 );
760 BufferImage image2 = CreateBufferImage( width2, height2, Vector4( 1.f, 1.f, 1.f, 1.f ) );
761 imageView.SetImage( image2 );
763 TestImage( imageView, image2 );
768 int UtcDaliImageViewSetImageUrl(void)
770 ToolkitTestApplication application;
772 ImageView imageView = ImageView::New();
773 imageView.SetImage( TEST_IMAGE_FILE_NAME );
774 TestUrl( imageView, TEST_IMAGE_FILE_NAME );
777 imageView.SetImage( TEST_IMAGE_FILE_NAME2 );
778 TestUrl( imageView, TEST_IMAGE_FILE_NAME2 );
783 int UtcDaliImageViewSetImageOnstageP(void)
785 ToolkitTestApplication application;
787 ImageView imageView = ImageView::New();
789 Stage::GetCurrent().Add( imageView );
790 application.SendNotification();
791 application.Render();
793 ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
794 imageView.SetImage( image1 );
795 TestImage( imageView, image1 );
799 BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
800 imageView.SetImage( image2 );
801 TestImage( imageView, image2 );
806 int UtcDaliImageViewSetImageOnstageN(void)
808 ToolkitTestApplication application;
810 ImageView imageView = ImageView::New();
812 Stage::GetCurrent().Add( imageView );
813 application.SendNotification();
814 application.Render();
816 ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
817 imageView.SetImage( image1 );
818 TestImage( imageView, image1 );
821 imageView.SetImage( image2 );
823 Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
825 //the value should be empty
827 DALI_TEST_CHECK( !value.Get( url ) );
830 DALI_TEST_CHECK( !value.Get( map ) );
835 int UtcDaliImageViewSetImageOffstageP(void)
837 ToolkitTestApplication application;
839 ImageView imageView = ImageView::New();
841 Stage::GetCurrent().Add( imageView );
842 application.SendNotification();
843 application.Render();
844 Stage::GetCurrent().Remove( imageView );
846 ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
847 imageView.SetImage( image1 );
848 TestImage( imageView, image1 );
852 BufferImage image2 = CreateBufferImage( width, height, Vector4( 1.f, 1.f, 1.f, 1.f ) );
853 imageView.SetImage( image2 );
854 TestImage( imageView, image2 );
859 bool gResourceReadySignalFired = false;
860 Vector3 gNaturalSize;
862 void ResourceReadySignal( Control control )
864 gResourceReadySignalFired = true;
867 int UtcDaliImageViewCheckResourceReady(void)
869 ToolkitTestApplication application;
871 gResourceReadySignalFired = false;
876 Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
878 // Check ImageView with background and main image, to ensure both visuals are marked as loaded
879 ImageView imageView = ImageView::New( TEST_GIF_FILE_NAME );
881 imageView.SetBackgroundImage( image );
883 DALI_TEST_EQUALS( imageView.IsResourceReady(), false, TEST_LOCATION );
885 imageView.ResourceReadySignal().Connect( &ResourceReadySignal);
887 Stage::GetCurrent().Add( imageView );
889 application.SendNotification();
890 application.Render(16);
893 DALI_TEST_EQUALS( imageView.IsResourceReady(), true, TEST_LOCATION );
895 DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
900 int UtcDaliImageViewSetImageOffstageN(void)
902 ToolkitTestApplication application;
904 ImageView imageView = ImageView::New();
906 Stage::GetCurrent().Add( imageView );
907 application.SendNotification();
908 application.Render();
909 Stage::GetCurrent().Remove( imageView );
911 ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
912 imageView.SetImage( image1 );
913 TestImage( imageView, image1 );
916 imageView.SetImage( image2 );
918 Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
920 //the value should be empty
922 DALI_TEST_CHECK( !value.Get( url ) );
925 DALI_TEST_CHECK( !value.Get( map ) );
930 int UtcDaliImageViewSetImageN(void)
932 ToolkitTestApplication application;
935 ImageView imageView = ImageView::New();
936 imageView.SetImage( image1 );
938 Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
940 //the value should be empty
942 DALI_TEST_CHECK( !value.Get( url ) );
945 DALI_TEST_CHECK( !value.Get( map ) );
947 std::string resource_url;
948 Property::Value val = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
949 DALI_TEST_CHECK( !val.Get( resource_url ) );
954 int UtcDaliImageViewSetImageTypeChangesP(void)
956 ToolkitTestApplication application;
958 ImageView imageView = ImageView::New();
964 Property::Value value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
965 DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
966 DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
969 imageView.SetImage( "TEST_URL" );
970 value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
972 DALI_TEST_CHECK( value.Get( url ) ); // Value should NOT be empty
973 DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
975 // Set an empty Image
976 imageView.SetImage( Image() );
977 value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
979 DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
980 DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
983 ResourceImage image1 = ResourceImage::New( TEST_IMAGE_FILE_NAME );
984 imageView.SetImage( image1 );
985 value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
987 DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
988 DALI_TEST_CHECK( value.Get( map ) ); // Value should NOT be empty
991 imageView.SetImage( "" );
992 value = imageView.GetProperty( imageView.GetPropertyIndex( "image" ) );
994 DALI_TEST_CHECK( ! value.Get( url ) ); // Value should be empty
995 DALI_TEST_CHECK( ! value.Get( map ) ); // Value should be empty
1000 int UtcDaliImageViewResourceUrlP(void)
1002 ToolkitTestApplication application;
1004 ImageView imageView = ImageView::New();
1005 DALI_TEST_CHECK( imageView.GetProperty( ImageView::Property::RESOURCE_URL ).Get< std::string >().empty() );
1007 imageView.SetProperty( ImageView::Property::RESOURCE_URL, "TestString" );
1008 DALI_TEST_EQUALS( imageView.GetProperty( ImageView::Property::RESOURCE_URL ).Get< std::string >(), "TestString", TEST_LOCATION );
1013 // Scenarios 1: ImageView from regular image
1014 int UtcDaliImageViewSetImageBufferImage(void)
1016 ToolkitTestApplication application;
1018 ImageView imageView = ImageView::New();
1019 Stage::GetCurrent().Add( imageView );
1021 TestGlAbstraction& gl = application.GetGlAbstraction();
1022 gl.EnableTextureCallTrace( true );
1024 std::vector< GLuint > ids;
1025 ids.push_back( 23 );
1026 application.GetGlAbstraction().SetNextTextureIds( ids );
1030 BufferImage image = CreateBufferImage( width, height, Color::WHITE );
1032 imageView.SetImage( image );
1034 application.SendNotification();
1035 application.Render();
1037 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1039 std::stringstream params;
1040 params << GL_TEXTURE_2D << ", " << 23;
1041 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1046 // Scenarios 2: ImageView from Native image
1047 int UtcDaliImageViewSetImageNativeImage(void)
1049 ToolkitTestApplication application;
1051 ImageView imageView = ImageView::New();
1052 Stage::GetCurrent().Add( imageView );
1054 TestGlAbstraction& gl = application.GetGlAbstraction();
1055 gl.EnableTextureCallTrace( true );
1057 std::vector< GLuint > ids;
1058 ids.push_back( 23 );
1059 application.GetGlAbstraction().SetNextTextureIds( ids );
1063 TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
1064 NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
1066 imageView.SetImage( nativeImage );
1067 application.SendNotification();
1068 application.Render();
1070 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1072 std::stringstream params;
1073 params << GL_TEXTURE_EXTERNAL_OES << ", " << 23;
1074 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1079 // Scenarios 3: ImageView initially from regular image but then SetImage called with Native image
1080 int UtcDaliImageViewSetImageBufferImageToNativeImage(void)
1082 ToolkitTestApplication application;
1086 BufferImage image = CreateBufferImage( width, height, Color::WHITE );
1088 ImageView imageView = ImageView::New( image );
1089 Stage::GetCurrent().Add( imageView );
1091 TestGlAbstraction& gl = application.GetGlAbstraction();
1092 gl.EnableTextureCallTrace( true );
1094 std::vector< GLuint > ids;
1095 ids.push_back( 23 );
1096 application.GetGlAbstraction().SetNextTextureIds( ids );
1098 application.SendNotification();
1099 application.Render();
1101 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1103 std::stringstream params;
1104 params << GL_TEXTURE_2D << ", " << 23;
1105 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1109 TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
1110 NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
1111 imageView.SetImage( nativeImage );
1114 ids.push_back( 24 );
1115 application.GetGlAbstraction().SetNextTextureIds( ids );
1117 application.SendNotification();
1118 application.Render();
1120 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1122 std::stringstream nextTextureParams;
1123 nextTextureParams << GL_TEXTURE_EXTERNAL_OES << ", " << 24;
1124 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nextTextureParams.str()) );
1129 // Scenarios 4: ImageView initially from Native image but then SetImage called with regular image
1130 int UtcDaliImageViewSetImageNativeImageToBufferImage(void)
1132 ToolkitTestApplication application;
1136 TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
1137 NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
1139 ImageView imageView = ImageView::New( nativeImage );
1140 Stage::GetCurrent().Add( imageView );
1142 TestGlAbstraction& gl = application.GetGlAbstraction();
1143 gl.EnableTextureCallTrace( true );
1145 std::vector< GLuint > ids;
1146 ids.push_back( 23 );
1147 application.GetGlAbstraction().SetNextTextureIds( ids );
1149 application.SendNotification();
1150 application.Render();
1152 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1154 std::stringstream params;
1155 params << GL_TEXTURE_EXTERNAL_OES << ", " << 23;
1156 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1160 BufferImage image = CreateBufferImage( width, height, Color::WHITE );
1161 imageView.SetImage( image );
1164 ids.push_back( 24 );
1165 application.GetGlAbstraction().SetNextTextureIds( ids );
1167 application.SendNotification();
1168 application.Render();
1170 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1172 std::stringstream nextTextureParams;
1173 nextTextureParams << GL_TEXTURE_2D << ", " << 24;
1174 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nextTextureParams.str()) );
1179 // Scenarios 5: ImageView from Native image with custom shader
1180 int UtcDaliImageViewSetImageNativeImageWithCustomShader(void)
1182 ToolkitTestApplication application;
1187 Property::Map customShader;
1188 customShader.Insert( "vertexShader", VERTEX_SHADER );
1189 customShader.Insert( "fragmentShader", FRAGMENT_SHADER );
1191 Property::Array shaderHints;
1192 shaderHints.PushBack( "requiresSelfDepthTest" );
1193 shaderHints.PushBack( "outputIsTransparent" );
1194 shaderHints.PushBack( "outputIsOpaque" );
1195 shaderHints.PushBack( "modifiesGeometry" );
1197 customShader.Insert( "hints", shaderHints );
1200 map.Insert( "shader", customShader );
1202 TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
1203 NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
1205 ImageView imageView = ImageView::New( nativeImage );
1206 imageView.SetProperty( ImageView::Property::IMAGE, map );
1207 Stage::GetCurrent().Add( imageView );
1209 TestGlAbstraction& gl = application.GetGlAbstraction();
1210 gl.EnableTextureCallTrace( true );
1212 std::vector< GLuint > ids;
1213 ids.push_back( 23 );
1214 application.GetGlAbstraction().SetNextTextureIds( ids );
1216 application.SendNotification();
1217 application.Render();
1219 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1221 std::stringstream params;
1222 params << GL_TEXTURE_EXTERNAL_OES << ", " << 23;
1223 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1228 // Scenarios 6: ImageView initially from regular image with custom shader but then SetImage called with Native
1229 int UtcDaliImageViewSetImageBufferImageWithCustomShaderToNativeImage(void)
1231 ToolkitTestApplication application;
1236 Property::Map customShader;
1237 customShader.Insert( "vertexShader", VERTEX_SHADER );
1238 customShader.Insert( "fragmentShader", FRAGMENT_SHADER );
1240 Property::Array shaderHints;
1241 shaderHints.PushBack( "requiresSelfDepthTest" );
1242 shaderHints.PushBack( "outputIsTransparent" );
1243 shaderHints.PushBack( "outputIsOpaque" );
1244 shaderHints.PushBack( "modifiesGeometry" );
1246 customShader.Insert( "hints", shaderHints );
1249 map.Insert( "shader", customShader );
1251 BufferImage image = CreateBufferImage( width, height, Color::WHITE );
1253 ImageView imageView = ImageView::New( image );
1254 imageView.SetProperty( ImageView::Property::IMAGE, map );
1255 Stage::GetCurrent().Add( imageView );
1257 TestGlAbstraction& gl = application.GetGlAbstraction();
1258 gl.EnableTextureCallTrace( true );
1260 std::vector< GLuint > ids;
1261 ids.push_back( 23 );
1262 application.GetGlAbstraction().SetNextTextureIds( ids );
1264 application.SendNotification();
1265 application.Render();
1267 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1269 std::stringstream params;
1270 params << GL_TEXTURE_2D << ", " << 23;
1271 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", params.str()) );
1273 TestNativeImagePointer nativeImageInterface = TestNativeImage::New( width, height );
1274 NativeImage nativeImage = NativeImage::New( *(nativeImageInterface.Get()) );
1275 imageView.SetImage( nativeImage );
1278 ids.push_back( 24 );
1279 application.GetGlAbstraction().SetNextTextureIds( ids );
1281 application.SendNotification();
1282 application.Render();
1284 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethod("BindTexture") );
1286 std::stringstream nativeImageParams;
1287 nativeImageParams << GL_TEXTURE_EXTERNAL_OES << ", " << 24;
1288 DALI_TEST_CHECK( gl.GetTextureTrace().FindMethodAndParams("BindTexture", nativeImageParams.str()) );
1294 int UtcDaliImageViewGetImageP1(void)
1296 ToolkitTestApplication application;
1298 ImageView imageView = ImageView::New();
1299 DALI_TEST_CHECK( ! imageView.GetImage() );
1301 Image image = CreateBufferImage();
1302 imageView.SetImage( image );
1303 DALI_TEST_CHECK( imageView.GetImage() == image );
1308 int UtcDaliImageViewGetImageP2(void)
1310 ToolkitTestApplication application;
1312 BufferImage image = CreateBufferImage();
1313 ImageView imageView = ImageView::New( image );
1314 DALI_TEST_CHECK( imageView.GetImage() == image );
1319 int UtcDaliImageViewGetImageN(void)
1321 ToolkitTestApplication application;
1323 ImageView imageView = ImageView::New( TEST_IMAGE_FILE_NAME );
1324 DALI_TEST_CHECK( ! imageView.GetImage() );
1326 Image image = CreateBufferImage();
1327 imageView.SetImage( image );
1328 DALI_TEST_CHECK( imageView.GetImage() == image );
1330 imageView.SetImage( TEST_IMAGE_FILE_NAME );
1331 DALI_TEST_CHECK( ! imageView.GetImage() );
1337 int UtcDaliImageViewReplaceImage(void)
1339 ToolkitTestApplication application;
1341 gResourceReadySignalFired = false;
1345 Image image = CreateBufferImage( width, height, Vector4(1.f, 1.f, 1.f, 1.f) );
1347 // Check ImageView with background and main image, to ensure both visuals are marked as loaded
1348 ImageView imageView = ImageView::New( TEST_IMAGE_1 );
1350 DALI_TEST_EQUALS( imageView.IsResourceReady(), false, TEST_LOCATION );
1352 imageView.ResourceReadySignal().Connect( &ResourceReadySignal);
1354 Stage::GetCurrent().Add( imageView );
1356 application.SendNotification();
1357 application.Render(16);
1359 // loading started, this waits for the loader thread for max 30 seconds
1360 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1362 DALI_TEST_EQUALS( imageView.GetRendererCount(), 1u, TEST_LOCATION );
1364 DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
1366 gResourceReadySignalFired = false;
1368 imageView.SetImage(TEST_IMAGE_2);
1370 application.SendNotification();
1371 application.Render(16);
1373 // loading started, this waits for the loader thread for max 30 seconds
1374 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1376 DALI_TEST_EQUALS( imageView.GetRendererCount(), 1u, TEST_LOCATION );
1378 DALI_TEST_EQUALS( imageView.IsResourceReady(), true, TEST_LOCATION );
1380 DALI_TEST_EQUALS( gResourceReadySignalFired, true, TEST_LOCATION );
1385 void OnRelayoutOverride( Size size )
1387 gNaturalSize = size; // Size Relayout is using
1390 int UtcDaliImageViewReplaceImageAndGetNaturalSize(void)
1392 ToolkitTestApplication application;
1394 // Check ImageView with background and main image, to ensure both visuals are marked as loaded
1395 ImageView imageView = ImageView::New( TEST_IMAGE_1 );
1396 imageView.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
1398 DummyControl dummyControl = DummyControl::New( true );
1399 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1400 dummyControl.SetResizePolicy( ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS );
1402 dummyControl.Add( imageView );
1403 dummyImpl.SetRelayoutCallback( &OnRelayoutOverride );
1404 Stage::GetCurrent().Add( dummyControl );
1406 application.SendNotification();
1407 application.Render();
1409 // loading started, this waits for the loader thread for max 30 seconds
1410 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1412 DALI_TEST_EQUALS( gNaturalSize.width, 1024.0f, TEST_LOCATION );
1413 DALI_TEST_EQUALS( gNaturalSize.height, 1024.0f, TEST_LOCATION );
1415 gNaturalSize = Vector3::ZERO;
1417 imageView.SetImage(gImage_600_RGB);
1419 // Waiting for resourceReady so SendNotifcation not called here.
1421 // loading started, this waits for the loader thread for max 30 seconds
1422 DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1424 // Trigger a potential relayout
1425 application.SendNotification();
1426 application.Render();
1428 DALI_TEST_EQUALS( gNaturalSize.width, 600.0f, TEST_LOCATION );
1429 DALI_TEST_EQUALS( gNaturalSize.height, 600.0f, TEST_LOCATION );