2 * Copyright (c) 2024 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.
21 // Need to override adaptor classes for toolkit test harness, so include
22 // test harness headers before dali headers.
24 #include <dali-toolkit-test-suite-utils.h>
25 #include <toolkit-event-thread-callback.h>
26 #include <toolkit-vector-image-renderer.h>
27 #include "dummy-control.h"
29 #include <test-encoded-image-buffer.h>
30 #include <test-native-image.h>
32 #include <dali-toolkit/dali-toolkit.h>
33 #include <dali-toolkit/devel-api/controls/control-devel.h>
34 #include <dali-toolkit/devel-api/image-loader/texture-manager.h>
35 #include <dali-toolkit/devel-api/styling/style-manager-devel.h>
36 #include <dali-toolkit/devel-api/visual-factory/visual-base.h>
37 #include <dali-toolkit/devel-api/visuals/animated-image-visual-actions-devel.h>
38 #include <dali-toolkit/devel-api/visuals/image-visual-actions-devel.h>
39 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
40 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
41 #include <dali-toolkit/public-api/image-loader/image-url.h>
42 #include <dali-toolkit/public-api/image-loader/image.h>
43 #include <dali/devel-api/scripting/scripting.h>
46 using namespace Toolkit;
48 void utc_dali_toolkit_image_view_startup(void)
50 test_return_value = TET_UNDEF;
53 void utc_dali_toolkit_image_view_cleanup(void)
55 test_return_value = TET_PASS;
60 const char* TEST_IMAGE_FILE_NAME = "gallery_image_01.jpg";
61 const char* TEST_IMAGE_FILE_NAME2 = "gallery_image_02.jpg";
63 // resolution: 1024*1024
64 const char* TEST_IMAGE_1 = TEST_RESOURCE_DIR "/TB-gloss.png";
65 const char* TEST_IMAGE_2 = TEST_RESOURCE_DIR "/tb-norm.png";
67 const char* TEST_BROKEN_IMAGE_DEFAULT = TEST_RESOURCE_DIR "/broken.png";
68 const char* TEST_BROKEN_IMAGE_S = TEST_RESOURCE_DIR "/broken_s.9.png";
69 const char* TEST_BROKEN_IMAGE_M = TEST_RESOURCE_DIR "/broken_m.9.png";
70 const char* TEST_BROKEN_IMAGE_L = TEST_RESOURCE_DIR "/broken_l.9.png";
71 const char* TEST_BROKEN_IMAGE_01 = TEST_RESOURCE_DIR "/button-up.9.png";
72 const char* TEST_BROKEN_IMAGE_02 = TEST_RESOURCE_DIR "/heartsframe.9.png";
74 const char* TEST_INVALID_NPATCH_FILE_NAME_01 = "invalid1.9.png";
76 // resolution: 34*34, pixel format: RGBA8888
77 static const char* gImage_34_RGBA = TEST_RESOURCE_DIR "/icon-edit.png";
78 // resolution: 600*600, pixel format: RGB888
79 static const char* gImage_600_RGB = TEST_RESOURCE_DIR "/test-image-600.jpg";
81 // resolution: 50*50, frame count: 4, frame delay: 0.2 second for each frame
82 const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif";
84 const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg";
85 const char* TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/insta_camera.json";
86 const char* TEST_WEBP_FILE_NAME = TEST_RESOURCE_DIR "/dali-logo.webp";
88 const char* TEST_OVERWRITABLE_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/overwritable-image.jpg";
90 void TestUrl(ImageView imageView, const std::string url)
92 Property::Value value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
94 std::string urlActual;
95 DALI_TEST_CHECK(value.Get(urlActual));
96 DALI_TEST_EQUALS(urlActual, url, TEST_LOCATION);
99 void OverwriteImage(const char* sourceFilename)
101 FILE* fpOut = fopen(TEST_OVERWRITABLE_IMAGE_FILE_NAME, "wb");
102 DALI_TEST_CHECK(fpOut);
105 FILE* fpIn = fopen(sourceFilename, "rb");
108 fseek(fpIn, 0, SEEK_END);
109 size_t size = ftell(fpIn);
111 tet_printf("Open %s success! file size : %zu byte\n", sourceFilename, size);
112 Dali::Vector<uint8_t> data;
114 fseek(fpIn, 0, SEEK_SET);
115 size_t realSize = fread(data.Begin(), sizeof(uint8_t), size, fpIn);
117 data.Resize(realSize);
120 fwrite(data.Begin(), sizeof(uint8_t), size, fpOut);
124 tet_printf("Open %s failed! write invalid\n", sourceFilename);
125 fprintf(fpOut, "invalid\n");
133 int UtcDaliImageViewNewP(void)
135 ToolkitTestApplication application;
137 ImageView imageView = ImageView::New();
139 DALI_TEST_CHECK(imageView);
144 int UtcDaliImageViewNewUrlP(void)
146 ToolkitTestApplication application;
148 ImageView imageView = ImageView::New(TEST_IMAGE_FILE_NAME);
149 DALI_TEST_CHECK(imageView);
151 TestUrl(imageView, TEST_IMAGE_FILE_NAME);
156 int UtcDaliImageViewConstructorP(void)
158 ToolkitTestApplication application;
162 DALI_TEST_CHECK(!imageView);
167 int UtcDaliImageViewCopyConstructorP(void)
169 ToolkitTestApplication application;
171 // Initialize an object, ref count == 1
172 ImageView imageView = ImageView::New();
174 ImageView copy(imageView);
175 DALI_TEST_CHECK(copy);
180 int UtcDaliImageViewMoveConstructor(void)
182 ToolkitTestApplication application;
184 ImageView imageView = ImageView::New();
185 DALI_TEST_EQUALS(1, imageView.GetBaseObject().ReferenceCount(), TEST_LOCATION);
186 imageView.SetProperty(Actor::Property::SENSITIVE, false);
187 DALI_TEST_CHECK(false == imageView.GetProperty<bool>(Actor::Property::SENSITIVE));
189 ImageView moved = std::move(imageView);
190 DALI_TEST_CHECK(moved);
191 DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
192 DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
193 DALI_TEST_CHECK(!imageView);
198 int UtcDaliImageViewAssignmentOperatorP(void)
200 ToolkitTestApplication application;
202 ImageView imageView = ImageView::New();
204 ImageView copy(imageView);
205 DALI_TEST_CHECK(copy);
206 DALI_TEST_EQUALS(imageView, copy, TEST_LOCATION);
211 int UtcDaliImageViewMoveAssignment(void)
213 ToolkitTestApplication application;
215 ImageView imageView = ImageView::New();
216 DALI_TEST_EQUALS(1, imageView.GetBaseObject().ReferenceCount(), TEST_LOCATION);
217 imageView.SetProperty(Actor::Property::SENSITIVE, false);
218 DALI_TEST_CHECK(false == imageView.GetProperty<bool>(Actor::Property::SENSITIVE));
221 moved = std::move(imageView);
222 DALI_TEST_CHECK(moved);
223 DALI_TEST_EQUALS(1, moved.GetBaseObject().ReferenceCount(), TEST_LOCATION);
224 DALI_TEST_CHECK(false == moved.GetProperty<bool>(Actor::Property::SENSITIVE));
225 DALI_TEST_CHECK(!imageView);
230 int UtcDaliImageViewDownCastP(void)
232 ToolkitTestApplication application;
234 ImageView imageView = ImageView::New();
236 BaseHandle object(imageView);
238 ImageView imageView2 = ImageView::DownCast(object);
239 DALI_TEST_CHECK(imageView2);
241 ImageView imageView3 = DownCast<ImageView>(object);
242 DALI_TEST_CHECK(imageView3);
247 int UtcDaliImageViewDownCastN(void)
249 ToolkitTestApplication application;
251 BaseHandle unInitializedObject;
253 ImageView imageView1 = ImageView::DownCast(unInitializedObject);
254 DALI_TEST_CHECK(!imageView1);
256 ImageView imageView2 = DownCast<ImageView>(unInitializedObject);
257 DALI_TEST_CHECK(!imageView2);
262 int UtcDaliImageViewTypeRegistry(void)
264 ToolkitTestApplication application;
266 TypeRegistry typeRegistry = TypeRegistry::Get();
267 DALI_TEST_CHECK(typeRegistry);
269 TypeInfo typeInfo = typeRegistry.GetTypeInfo("ImageView");
270 DALI_TEST_CHECK(typeInfo);
272 BaseHandle handle = typeInfo.CreateInstance();
273 DALI_TEST_CHECK(handle);
275 ImageView imageView = ImageView::DownCast(handle);
276 DALI_TEST_CHECK(imageView);
281 int UtcDaliImageViewSetGetProperty01(void)
283 ToolkitTestApplication application;
285 ImageView imageView = ImageView::New();
287 Property::Index idx = imageView.GetPropertyIndex("image");
288 DALI_TEST_EQUALS(idx, (Property::Index)ImageView::Property::IMAGE, TEST_LOCATION);
290 imageView.SetProperty(idx, TEST_IMAGE_FILE_NAME);
291 TestUrl(imageView, TEST_IMAGE_FILE_NAME);
296 int UtcDaliImageViewPreMultipliedAlphaPng(void)
298 ToolkitTestApplication application;
300 // Set up trace debug
301 TestGlAbstraction& gl = application.GetGlAbstraction();
302 TraceCallStack& textureTrace = gl.GetTextureTrace();
303 textureTrace.Enable(true);
305 Property::Map imageMap;
306 imageMap[ImageVisual::Property::URL] = gImage_34_RGBA;
307 imageMap[ImageVisual::Property::RELEASE_POLICY] = ImageVisual::ReleasePolicy::NEVER; // To keep the texture cache
309 ImageView imageView1 = ImageView::New();
310 imageView1.SetProperty(ImageView::Property::IMAGE, imageMap);
312 application.GetScene().Add(imageView1);
314 Property::Value value = imageView1.GetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA);
316 DALI_TEST_CHECK(value.Get(enable));
317 DALI_TEST_CHECK(enable); // Default value is true
319 // loading started, this waits for the loader thread for max 30 seconds
320 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
322 application.SendNotification();
323 application.Render();
325 value = imageView1.GetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA);
326 DALI_TEST_CHECK(value.Get(enable));
327 DALI_TEST_CHECK(enable); // Keep true
329 // conventional alpha blending
330 Renderer renderer1 = imageView1.GetRendererAt(0);
331 value = renderer1.GetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA);
332 DALI_TEST_CHECK(value.Get(enable));
333 DALI_TEST_CHECK(enable);
335 int srcFactorRgb = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_RGB);
336 int destFactorRgb = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_RGB);
337 int srcFactorAlpha = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_ALPHA);
338 int destFactorAlpha = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_ALPHA);
339 DALI_TEST_CHECK(srcFactorRgb == BlendFactor::ONE);
340 DALI_TEST_CHECK(destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA);
341 DALI_TEST_CHECK(srcFactorAlpha == BlendFactor::ONE);
342 DALI_TEST_CHECK(destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA);
344 DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION); // A new texture should be generated.
345 textureTrace.Reset();
347 // Disable pre-multiplied alpha blending
348 imageView1.SetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA, false);
351 Property::Map attributes;
352 DevelControl::DoAction(imageView1, ImageView::Property::IMAGE, DevelImageVisual::Action::RELOAD, attributes);
354 // loading started, this waits for the loader thread for max 30 seconds
355 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
357 application.SendNotification();
358 application.Render();
360 value = imageView1.GetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA);
361 DALI_TEST_CHECK(value.Get(enable));
362 DALI_TEST_CHECK(!enable);
364 // conventional alpha blending
365 value = renderer1.GetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA);
366 DALI_TEST_CHECK(value.Get(enable));
367 DALI_TEST_CHECK(!enable);
369 srcFactorRgb = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_RGB);
370 destFactorRgb = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_RGB);
371 srcFactorAlpha = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_ALPHA);
372 destFactorAlpha = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_ALPHA);
373 DALI_TEST_CHECK(srcFactorRgb == BlendFactor::SRC_ALPHA);
374 DALI_TEST_CHECK(destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA);
375 DALI_TEST_CHECK(srcFactorAlpha == BlendFactor::ONE);
376 DALI_TEST_CHECK(destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA);
378 DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION); // A new texture should be generated.
379 textureTrace.Reset();
381 // Make a new ImageView using the same image
382 ImageView imageView2 = ImageView::New();
383 imageView2.SetProperty(ImageView::Property::IMAGE, imageMap);
385 application.GetScene().Add(imageView2);
387 application.SendNotification();
388 application.Render();
390 Renderer renderer2 = imageView2.GetRendererAt(0);
391 value = renderer2.GetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA);
392 DALI_TEST_CHECK(value.Get(enable));
393 DALI_TEST_CHECK(enable);
395 srcFactorRgb = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_RGB);
396 destFactorRgb = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_RGB);
397 srcFactorAlpha = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_ALPHA);
398 destFactorAlpha = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_ALPHA);
399 DALI_TEST_CHECK(srcFactorRgb == BlendFactor::ONE);
400 DALI_TEST_CHECK(destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA);
401 DALI_TEST_CHECK(srcFactorAlpha == BlendFactor::ONE);
402 DALI_TEST_CHECK(destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA);
404 DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION); // The cached texture should be used.
409 int UtcDaliImageViewPreMultipliedAlphaJpg(void)
411 ToolkitTestApplication application;
413 // Set up trace debug
414 TestGlAbstraction& gl = application.GetGlAbstraction();
415 TraceCallStack& textureTrace = gl.GetTextureTrace();
416 textureTrace.Enable(true);
418 Property::Map imageMap;
419 imageMap[ImageVisual::Property::URL] = gImage_600_RGB;
420 imageMap[ImageVisual::Property::RELEASE_POLICY] = ImageVisual::ReleasePolicy::NEVER; // To keep the texture cache
422 ImageView imageView1 = ImageView::New();
423 imageView1.SetProperty(ImageView::Property::IMAGE, imageMap);
425 application.GetScene().Add(imageView1);
427 Property::Value value = imageView1.GetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA);
429 DALI_TEST_CHECK(value.Get(enable));
430 DALI_TEST_CHECK(enable); // Default value is true
432 // loading started, this waits for the loader thread for max 30 seconds
433 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
435 application.SendNotification();
436 application.Render();
438 value = imageView1.GetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA);
439 DALI_TEST_CHECK(value.Get(enable));
440 DALI_TEST_CHECK(!enable); // Should be false after loading
442 // conventional alpha blending
443 Renderer renderer1 = imageView1.GetRendererAt(0);
444 value = renderer1.GetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA);
445 DALI_TEST_CHECK(value.Get(enable));
446 DALI_TEST_CHECK(!enable);
448 int srcFactorRgb = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_RGB);
449 int destFactorRgb = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_RGB);
450 int srcFactorAlpha = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_ALPHA);
451 int destFactorAlpha = renderer1.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_ALPHA);
452 DALI_TEST_CHECK(srcFactorRgb == BlendFactor::SRC_ALPHA);
453 DALI_TEST_CHECK(destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA);
454 DALI_TEST_CHECK(srcFactorAlpha == BlendFactor::ONE);
455 DALI_TEST_CHECK(destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA);
457 DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION); // A new texture should be generated.
458 textureTrace.Reset();
460 ImageView imageView2 = ImageView::New();
461 imageView2.SetProperty(ImageView::Property::IMAGE, imageMap);
463 // Disable pre-multiplied alpha blending
464 imageView2.SetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA, false);
466 application.GetScene().Add(imageView2);
468 application.SendNotification();
469 application.Render();
471 value = imageView2.GetProperty(ImageView::Property::PRE_MULTIPLIED_ALPHA);
472 DALI_TEST_CHECK(value.Get(enable));
473 DALI_TEST_CHECK(!enable);
475 // conventional alpha blending
476 Renderer renderer2 = imageView2.GetRendererAt(0);
477 value = renderer2.GetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA);
478 DALI_TEST_CHECK(value.Get(enable));
479 DALI_TEST_CHECK(!enable);
481 srcFactorRgb = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_RGB);
482 destFactorRgb = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_RGB);
483 srcFactorAlpha = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_SRC_ALPHA);
484 destFactorAlpha = renderer2.GetProperty<int>(Renderer::Property::BLEND_FACTOR_DEST_ALPHA);
485 DALI_TEST_CHECK(srcFactorRgb == BlendFactor::SRC_ALPHA);
486 DALI_TEST_CHECK(destFactorRgb == BlendFactor::ONE_MINUS_SRC_ALPHA);
487 DALI_TEST_CHECK(srcFactorAlpha == BlendFactor::ONE);
488 DALI_TEST_CHECK(destFactorAlpha == BlendFactor::ONE_MINUS_SRC_ALPHA);
490 DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION); // The cached texture should be used.
495 int UtcDaliImageViewPixelArea(void)
497 // Test pixel area property
498 ToolkitTestApplication application;
500 static std::vector<UniformData> customUniforms =
502 UniformData("pixelArea", Property::Type::VECTOR4),
505 TestGraphicsController& graphics = application.GetGraphicsController();
506 graphics.AddCustomUniforms(customUniforms);
508 // Gif image, use AnimatedImageVisual internally
509 // Atlasing is applied to pack multiple frames, use custom wrap mode
510 ImageView gifView = ImageView::New();
511 const Vector4 pixelAreaVisual(0.f, 0.f, 2.f, 2.f);
512 gifView.SetProperty(ImageView::Property::IMAGE,
513 Property::Map().Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME).Add(ImageVisual::Property::PIXEL_AREA, pixelAreaVisual));
516 Integration::Scene stage = application.GetScene();
520 application.SendNotification();
521 application.Render(16);
523 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
525 application.SendNotification();
526 application.Render();
527 DALI_TEST_CHECK(gifView.GetRendererCount() == 1u);
529 const Vector4 fullTextureRect(0.f, 0.f, 1.f, 1.f);
530 // test that the pixel area value defined in the visual property map is registered on renderer
531 Renderer renderer = gifView.GetRendererAt(0);
532 Property::Value pixelAreaValue = renderer.GetProperty(renderer.GetPropertyIndex("pixelArea"));
533 DALI_TEST_EQUALS(pixelAreaValue.Get<Vector4>(), pixelAreaVisual, TEST_LOCATION);
535 // test that the shader has the default pixel area value registered.
536 Shader shader = renderer.GetShader();
537 pixelAreaValue = shader.GetProperty(shader.GetPropertyIndex("pixelArea"));
538 DALI_TEST_EQUALS(pixelAreaValue.Get<Vector4>(), fullTextureRect, TEST_LOCATION);
540 // test that the uniform uses the pixelArea property on the renderer.
541 TestGlAbstraction& gl = application.GetGlAbstraction();
542 Vector4 pixelAreaUniform;
543 DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("pixelArea", pixelAreaUniform));
544 DALI_TEST_EQUALS(pixelAreaVisual, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION);
546 // set the pixelArea property on the control
547 const Vector4 pixelAreaControl(-1.f, -1.f, 3.f, 3.f);
548 gifView.SetProperty(ImageView::Property::PIXEL_AREA, pixelAreaControl);
549 application.SendNotification();
550 application.Render(16);
552 // check the pixelArea property on the control
553 pixelAreaValue = gifView.GetProperty(gifView.GetPropertyIndex("pixelArea"));
554 DALI_TEST_EQUALS(pixelAreaValue.Get<Vector4>(), pixelAreaControl, TEST_LOCATION);
555 // test that the uniform uses the pixelArea property on the control.
556 DALI_TEST_CHECK(gl.GetUniformValue<Vector4>("pixelArea", pixelAreaUniform));
557 DALI_TEST_EQUALS(pixelAreaControl, pixelAreaUniform, Math::MACHINE_EPSILON_100, TEST_LOCATION);
562 int UtcDaliImageViewAsyncLoadingWithoutAltasing(void)
564 ToolkitTestApplication application;
565 TestGlAbstraction& gl = application.GetGlAbstraction();
566 const std::vector<GLuint>& textures = gl.GetBoundTextures();
567 size_t numTextures = textures.size();
569 // Async loading, no atlasing for big size image
570 ImageView imageView = ImageView::New(gImage_600_RGB);
572 // By default, Aysnc loading is used
573 application.GetScene().Add(imageView);
574 imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100));
575 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
577 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
579 application.SendNotification();
580 application.Render(16);
581 application.SendNotification();
583 const std::vector<GLuint>& textures2 = gl.GetBoundTextures();
584 DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION);
589 int UtcDaliImageViewAsyncLoadingWithAtlasing(void)
591 ToolkitTestApplication application;
593 //Async loading, automatic atlasing for small size image
594 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
596 callStack.Enable(true);
598 Property::Map imageMap;
600 imageMap[ImageVisual::Property::URL] = gImage_34_RGBA;
601 imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 34;
602 imageMap[ImageVisual::Property::DESIRED_WIDTH] = 34;
603 imageMap[ImageVisual::Property::ATLASING] = true;
605 ImageView imageView = ImageView::New();
606 imageView.SetProperty(ImageView::Property::IMAGE, imageMap);
607 imageView.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
609 // By default, Aysnc loading is used
610 // loading is not started if the actor is offScene
612 application.GetScene().Add(imageView);
614 imageView.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT);
616 // loading started, this waits for the loader thread for max 30 seconds
617 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
619 application.SendNotification();
620 application.Render(16);
622 callStack.Enable(false);
624 TraceCallStack::NamedParams params;
625 params["width"] << 34;
626 params["height"] << 34;
627 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params), true, TEST_LOCATION);
632 int UtcDaliImageViewAsyncLoadingWithAtlasing02(void)
634 ToolkitTestApplication application;
636 //Async loading, automatic atlasing for small size image
637 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
639 callStack.Enable(true);
641 Property::Map asyncLoadingMap;
642 asyncLoadingMap["url"] = gImage_34_RGBA;
643 asyncLoadingMap["desiredHeight"] = 34;
644 asyncLoadingMap["desiredWidth"] = 34;
645 asyncLoadingMap["synchronousLoading"] = false;
646 asyncLoadingMap["atlasing"] = true;
648 ImageView imageView = ImageView::New();
649 imageView.SetProperty(ImageView::Property::IMAGE, asyncLoadingMap);
651 application.GetScene().Add(imageView);
653 // loading started, this waits for the loader thread for max 30 seconds
654 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
656 application.SendNotification();
657 application.Render(16);
659 callStack.Enable(false);
661 TraceCallStack::NamedParams params;
662 params["width"] << 34;
663 params["height"] << 34;
664 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params), true, TEST_LOCATION);
669 int UtcDaliImageViewSyncLoading(void)
671 ToolkitTestApplication application;
673 tet_infoline("ImageView Testing sync loading and size using index key property map");
675 Property::Map syncLoadingMap;
676 syncLoadingMap[ImageVisual::Property::SYNCHRONOUS_LOADING] = true;
677 syncLoadingMap[ImageVisual::Property::ATLASING] = true;
679 // Sync loading, no atlasing for big size image
681 ImageView imageView = ImageView::New();
683 // Sync loading is used
684 syncLoadingMap[ImageVisual::Property::URL] = gImage_600_RGB;
685 imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
688 // Sync loading, automatic atlasing for small size image
690 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
692 callStack.Enable(true);
694 ImageView imageView = ImageView::New();
696 // Sync loading is used
697 syncLoadingMap[ImageVisual::Property::URL] = gImage_34_RGBA;
698 syncLoadingMap[ImageVisual::Property::DESIRED_HEIGHT] = 34;
699 syncLoadingMap[ImageVisual::Property::DESIRED_WIDTH] = 34;
700 imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
702 application.GetScene().Add(imageView);
703 application.SendNotification();
704 application.Render(16);
706 TraceCallStack::NamedParams params;
707 params["width"] << 34;
708 params["height"] << 34;
709 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params),
716 int UtcDaliImageViewSyncLoading02(void)
718 ToolkitTestApplication application;
720 tet_infoline("ImageView Testing sync loading and size using string key property map");
722 // Sync loading, automatic atlasing for small size image
724 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
726 callStack.Enable(true);
728 ImageView imageView = ImageView::New();
730 // Sync loading is used
731 Property::Map syncLoadingMap;
732 syncLoadingMap["url"] = gImage_34_RGBA;
733 syncLoadingMap["desiredHeight"] = 34;
734 syncLoadingMap["desiredWidth"] = 34;
735 syncLoadingMap["synchronousLoading"] = true;
736 syncLoadingMap["atlasing"] = true;
737 imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
739 application.GetScene().Add(imageView);
740 application.SendNotification();
741 application.Render(16);
743 TraceCallStack::NamedParams params;
744 params["width"] << 34;
745 params["height"] << 34;
746 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params),
753 int UtcDaliImageViewAsyncLoadingEncodedBuffer(void)
755 ToolkitTestApplication application;
756 TestGlAbstraction& gl = application.GetGlAbstraction();
757 const std::vector<GLuint>& textures = gl.GetBoundTextures();
758 size_t numTextures = textures.size();
760 // Get encoded raw-buffer image and generate url
761 EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(gImage_600_RGB);
762 ImageUrl url = Toolkit::Image::GenerateUrl(buffer);
764 // Async loading, no atlasing for big size image
765 ImageView imageView = ImageView::New(url.GetUrl());
767 // By default, Aysnc loading is used
768 application.GetScene().Add(imageView);
769 imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100));
770 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
772 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
774 application.SendNotification();
775 application.Render(16);
776 application.SendNotification();
778 const std::vector<GLuint>& textures2 = gl.GetBoundTextures();
779 DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION);
784 int UtcDaliImageViewAsyncLoadingEncodedBufferWithAtlasing(void)
786 ToolkitTestApplication application;
788 // Get encoded raw-buffer image and generate url
789 EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(gImage_600_RGB);
790 ImageUrl url = Toolkit::Image::GenerateUrl(buffer);
791 ImageUrl url2 = Toolkit::Image::GenerateUrl(buffer);
793 // Generate url is not equal to url2
794 // NOTE : This behavior may changed when ImageUrl compare operator changed.
795 DALI_TEST_CHECK(url != url2);
796 // Generate url's string is equal to url2's string
797 DALI_TEST_CHECK(url.GetUrl() == url2.GetUrl());
799 EncodedImageBuffer buffer2 = ConvertFileToEncodedImageBuffer(gImage_600_RGB);
800 url2 = Toolkit::Image::GenerateUrl(buffer2);
802 // Check whethere two url are not equal
803 DALI_TEST_CHECK(url.GetUrl() != url2.GetUrl());
805 // Async loading, automatic atlasing for small size image
806 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
808 callStack.Enable(true);
810 Property::Map imageMap;
812 imageMap[ImageVisual::Property::URL] = url.GetUrl();
813 imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 600;
814 imageMap[ImageVisual::Property::DESIRED_WIDTH] = 600;
815 imageMap[ImageVisual::Property::ATLASING] = true;
817 // No atlasing with big image
818 ImageView imageView_bigdesired = ImageView::New();
819 imageView_bigdesired.SetProperty(ImageView::Property::IMAGE, imageMap);
820 imageView_bigdesired.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
822 imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 0;
823 imageMap[ImageVisual::Property::DESIRED_WIDTH] = 0;
825 // No atlasing with zero desired size
826 ImageView imageView_nodesired = ImageView::New();
827 imageView_nodesired.SetProperty(ImageView::Property::IMAGE, imageMap);
828 imageView_nodesired.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
830 imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 34;
831 imageMap[ImageVisual::Property::DESIRED_WIDTH] = 34;
833 ImageView imageView = ImageView::New();
834 imageView.SetProperty(ImageView::Property::IMAGE, imageMap);
835 imageView.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
837 // By default, Aysnc loading is used
838 // loading is not started if the actor is offScene
839 application.GetScene().Add(imageView);
840 application.GetScene().Add(imageView_bigdesired);
841 application.GetScene().Add(imageView_nodesired);
842 application.SendNotification();
843 application.Render(16);
845 // loading started, this waits for the loader thread for max 30 seconds
846 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
848 application.Render(16);
849 application.SendNotification();
851 // Change url to url2
852 imageMap[ImageVisual::Property::URL] = url2.GetUrl();
853 imageView.SetProperty(ImageView::Property::IMAGE, imageMap);
855 imageView.SetProperty(Dali::Actor::Property::LAYOUT_DIRECTION, Dali::LayoutDirection::RIGHT_TO_LEFT);
857 // loading started, this waits for the loader thread for max 30 seconds
858 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
860 application.SendNotification();
861 application.Render(16);
863 callStack.Enable(false);
865 TraceCallStack::NamedParams params;
866 params["width"] << 34;
867 params["height"] << 34;
868 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params), true, TEST_LOCATION);
873 int UtcDaliImageViewSyncLoadingEncodedBuffer(void)
875 ToolkitTestApplication application;
877 tet_infoline("ImageView Testing sync loading from EncodedImageBuffer");
879 // Get encoded raw-buffer image and generate url
880 EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(gImage_34_RGBA);
881 ImageUrl url = Toolkit::Image::GenerateUrl(buffer);
883 // Sync loading, automatic atlasing for small size image
885 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
887 callStack.Enable(true);
889 ImageView imageView = ImageView::New();
891 // Sync loading is used
892 Property::Map syncLoadingMap;
893 syncLoadingMap["url"] = url.GetUrl();
894 syncLoadingMap["alphaMaskUrl"] = gImage_34_RGBA;
895 syncLoadingMap["desiredHeight"] = 34;
896 syncLoadingMap["desiredWidth"] = 34;
897 syncLoadingMap["synchronousLoading"] = true;
898 syncLoadingMap["atlasing"] = true;
899 imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
901 application.GetScene().Add(imageView);
902 application.SendNotification();
903 application.Render(16);
905 TraceCallStack::NamedParams params;
906 params["width"] << 34;
907 params["height"] << 34;
908 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params),
916 int UtcDaliImageViewEncodedBufferWithSvg(void)
918 ToolkitTestApplication application;
919 TestGlAbstraction& gl = application.GetGlAbstraction();
920 const std::vector<GLuint>& textures = gl.GetBoundTextures();
921 size_t numTextures = textures.size();
923 // Get encoded raw-buffer svg image and generate url
924 EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(TEST_SVG_FILE_NAME, EncodedImageBuffer::ImageType::VECTOR_IMAGE);
925 ImageUrl url = Toolkit::Image::GenerateUrl(buffer);
927 // Async loading, no atlasing for big size image
928 ImageView imageView = ImageView::New(url.GetUrl());
930 // By default, Aysnc loading is used
931 application.GetScene().Add(imageView);
932 imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100));
933 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
935 application.SendNotification();
936 application.Render(16);
938 // Load svg image + rasterize.
939 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
941 application.SendNotification();
942 application.Render(16);
943 application.SendNotification();
945 const std::vector<GLuint>& textures2 = gl.GetBoundTextures();
946 DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION);
948 // Remove visual, for line coverage.
949 imageView.Unparent();
950 application.SendNotification();
951 application.Render(16);
956 int UtcDaliImageViewEncodedBufferWithAnimatedVectorImage(void)
958 ToolkitTestApplication application;
959 TestGlAbstraction& gl = application.GetGlAbstraction();
960 const std::vector<GLuint>& textures = gl.GetBoundTextures();
961 size_t numTextures = textures.size();
963 // Get encoded raw-buffer lottie image and generate url
964 EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME, EncodedImageBuffer::ImageType::ANIMATED_VECTOR_IMAGE);
965 ImageUrl url = Toolkit::Image::GenerateUrl(buffer);
967 // Async loading, no atlasing for big size image
968 ImageView imageView = ImageView::New(url.GetUrl());
970 // By default, Aysnc loading is used
971 application.GetScene().Add(imageView);
972 imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100));
973 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
975 application.SendNotification();
976 application.Render(16);
978 // Load lottie image is sync. Only wait rasterize.
979 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
981 application.SendNotification();
982 application.Render(16);
983 application.SendNotification();
985 const std::vector<GLuint>& textures2 = gl.GetBoundTextures();
986 DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION);
988 // Remove visual, for line coverage.
989 imageView.Unparent();
990 application.SendNotification();
991 application.Render(16);
996 int UtcDaliImageViewEncodedBufferWithInvalidImageType(void)
998 ToolkitTestApplication application;
999 TestGlAbstraction& gl = application.GetGlAbstraction();
1000 const std::vector<GLuint>& textures = gl.GetBoundTextures();
1001 size_t numTextures = textures.size();
1003 // Get encoded raw-buffer jpg image with invalid image type, and generate url
1004 EncodedImageBuffer buffer = ConvertFileToEncodedImageBuffer(gImage_34_RGBA, static_cast<EncodedImageBuffer::ImageType>(-1));
1005 ImageUrl url = Toolkit::Image::GenerateUrl(buffer);
1007 // Async loading, no atlasing for big size image
1008 ImageView imageView = ImageView::New(url.GetUrl());
1010 // By default, Aysnc loading is used
1011 application.GetScene().Add(imageView);
1012 imageView.SetProperty(Actor::Property::SIZE, Vector2(100, 100));
1013 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
1015 application.SendNotification();
1016 application.Render(16);
1019 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1021 application.SendNotification();
1022 application.Render(16);
1023 application.SendNotification();
1025 const std::vector<GLuint>& textures2 = gl.GetBoundTextures();
1026 DALI_TEST_GREATER(textures2.size(), numTextures, TEST_LOCATION);
1028 // Remove visual, for line coverage.
1029 imageView.Unparent();
1030 application.SendNotification();
1031 application.Render(16);
1036 int UtcDaliImageViewAddedTexture(void)
1038 ToolkitTestApplication application;
1040 tet_infoline("ImageView Testing image view with texture provided manager url");
1042 ImageView imageView = ImageView::New();
1044 // empty texture is ok, though pointless from app point of view
1046 std::string url = TextureManager::AddTexture(empty);
1047 DALI_TEST_CHECK(url.size() > 0u);
1049 Property::Map propertyMap;
1050 propertyMap[ImageVisual::Property::URL] = url;
1051 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
1053 application.GetScene().Add(imageView);
1054 application.SendNotification();
1055 application.Render();
1060 int UtcDaliImageViewSizeWithBackground(void)
1062 ToolkitTestApplication application;
1066 ImageView imageView = ImageView::New();
1068 imageView.SetProperty(Control::Property::BACKGROUND,
1070 {Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE},
1071 {Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/gallery-small-1.jpg"},
1072 {ImageVisual::Property::DESIRED_WIDTH, width},
1073 {ImageVisual::Property::DESIRED_HEIGHT, height},
1076 application.GetScene().Add(imageView);
1077 application.SendNotification();
1078 application.Render();
1080 DALI_TEST_EQUALS(imageView.GetCurrentProperty<Vector3>(Actor::Property::SIZE).width, (float)width, TEST_LOCATION);
1081 DALI_TEST_EQUALS(imageView.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height, (float)height, TEST_LOCATION);
1086 int UtcDaliImageViewSizeWithBackgroundAndImage(void)
1088 ToolkitTestApplication application;
1090 int widthBackground = 100;
1091 int heightBackground = 200;
1095 ImageView imageView = ImageView::New();
1097 imageView.SetProperty(Control::Property::BACKGROUND,
1099 {Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE},
1100 {Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/gallery-small-1.jpg"},
1101 {ImageVisual::Property::DESIRED_WIDTH, widthBackground},
1102 {ImageVisual::Property::DESIRED_HEIGHT, heightBackground},
1105 imageView.SetImage(gImage_600_RGB); // 1 to 1 ratio, 600x600 pixels
1107 application.GetScene().Add(imageView);
1108 application.SendNotification();
1109 application.Render();
1111 DALI_TEST_EQUALS(imageView.GetCurrentProperty<Vector3>(Actor::Property::SIZE).width, (float)width, TEST_LOCATION);
1112 DALI_TEST_EQUALS(imageView.GetCurrentProperty<Vector3>(Actor::Property::SIZE).height, (float)height, TEST_LOCATION);
1117 int UtcDaliImageViewHeightForWidthBackground(void)
1119 ToolkitTestApplication application;
1121 int widthBackground = 100;
1122 int heightBackground = 200;
1124 ImageView imageView = ImageView::New();
1126 imageView.SetProperty(Control::Property::BACKGROUND,
1127 {{Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE},
1128 {Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/gallery-small-1.jpg"},
1129 {ImageVisual::Property::DESIRED_WIDTH, widthBackground},
1130 {ImageVisual::Property::DESIRED_HEIGHT, heightBackground}});
1132 application.GetScene().Add(imageView);
1133 application.SendNotification();
1134 application.Render();
1136 Control control = Control::DownCast(imageView);
1137 DALI_TEST_CHECK(control);
1138 DALI_TEST_EQUALS(imageView.GetHeightForWidth(123.f), control.GetHeightForWidth(123.f), TEST_LOCATION);
1139 DALI_TEST_EQUALS(imageView.GetWidthForHeight(321.f), control.GetWidthForHeight(321.f), TEST_LOCATION);
1144 int UtcDaliImageViewHeightForWidthBackgroundAndImage(void)
1146 ToolkitTestApplication application;
1148 int widthBackground = 100;
1149 int heightBackground = 200;
1153 ImageView imageView = ImageView::New();
1155 imageView.SetProperty(Control::Property::BACKGROUND,
1156 {{Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE},
1157 {Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/gallery-small-1.jpg"},
1158 {ImageVisual::Property::DESIRED_WIDTH, widthBackground},
1159 {ImageVisual::Property::DESIRED_HEIGHT, heightBackground}}); // 1 to 2 ratio
1161 imageView.SetImage(gImage_600_RGB); // 1 to 1 ratio
1163 application.GetScene().Add(imageView);
1164 application.SendNotification();
1165 application.Render();
1167 DALI_TEST_EQUALS(imageView.GetHeightForWidth(width), (float)height, TEST_LOCATION);
1168 DALI_TEST_EQUALS(imageView.GetWidthForHeight(height), (float)width, TEST_LOCATION);
1173 int UtcDaliImageViewSetImageUrl(void)
1175 ToolkitTestApplication application;
1177 ImageView imageView = ImageView::New();
1178 imageView.SetImage(TEST_IMAGE_FILE_NAME);
1179 TestUrl(imageView, TEST_IMAGE_FILE_NAME);
1181 imageView.SetImage(TEST_IMAGE_FILE_NAME2);
1182 TestUrl(imageView, TEST_IMAGE_FILE_NAME2);
1187 bool gResourceReadySignalFired = false;
1188 Vector3 gNaturalSize;
1190 void ResourceReadySignal(Control control)
1192 gResourceReadySignalFired = true;
1195 void OnResourceReadySignalSVG(Control control)
1197 // Check whether Image Visual transforms on ImageVieiw::OnRelayout()
1198 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(control);
1199 Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1200 Property::Map resultMap;
1201 imageVisual.CreatePropertyMap(resultMap);
1203 Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM);
1204 DALI_TEST_CHECK(transformValue);
1205 Property::Map* retMap = transformValue->GetMap();
1206 DALI_TEST_CHECK(retMap);
1208 // Fitting mode should not be applied at this point
1209 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::SIZE)->Get<Vector2>(), Vector2::ZERO, TEST_LOCATION);
1212 int UtcDaliImageViewCheckResourceReady(void)
1214 ToolkitTestApplication application;
1216 gResourceReadySignalFired = false;
1218 // Check ImageView with background and main image, to ensure both visuals are marked as loaded
1219 ImageView imageView = ImageView::New(TEST_GIF_FILE_NAME);
1221 imageView.SetProperty(Control::Property::BACKGROUND,
1222 {{Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE},
1223 {Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/gallery-small-1.jpg"},
1224 {ImageVisual::Property::DESIRED_WIDTH, 100},
1225 {ImageVisual::Property::DESIRED_HEIGHT, 200}});
1227 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
1229 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
1231 application.GetScene().Add(imageView);
1233 // loading started, this waits for the loader thread
1234 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1236 application.SendNotification();
1237 application.Render(16);
1239 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1241 application.SendNotification();
1242 application.Render();
1244 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
1246 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1251 int UtcDaliImageViewSetImageTypeChangesP(void)
1253 ToolkitTestApplication application;
1255 ImageView imageView = ImageView::New();
1256 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView);
1258 application.GetScene().Add(imageView);
1262 Toolkit::Visual::Base visual;
1264 Property::Value value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1265 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1267 application.SendNotification();
1268 application.Render(16);
1270 DALI_TEST_CHECK(!value.Get(url)); // Value should be empty
1272 DALI_TEST_CHECK(map.Empty()); // Value should be empty
1273 DALI_TEST_CHECK(!visual); // Visual should be invalid
1276 imageView.SetImage("TEST_URL");
1278 application.SendNotification();
1279 application.Render(16);
1281 value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1282 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1284 DALI_TEST_CHECK(value.Get(url)); // Value should NOT be empty
1285 DALI_TEST_CHECK(!value.Get(map)); // Value should be empty
1286 DALI_TEST_CHECK(visual); // Visual should be valid
1289 imageView.SetImage("");
1291 application.SendNotification();
1292 application.Render(16);
1294 value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1295 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1297 DALI_TEST_CHECK(!value.Get(url)); // Value should be empty
1299 DALI_TEST_CHECK(map.Empty()); // Value should be empty
1300 DALI_TEST_CHECK(!visual); // Visual should be invalid
1302 // Set a URL in property map
1303 Property::Map propertyMap;
1304 propertyMap[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
1305 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
1307 application.SendNotification();
1308 application.Render(16);
1310 value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1311 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1313 DALI_TEST_CHECK(!value.Get(url)); // Value should be empty
1314 DALI_TEST_CHECK(value.Get(map)); // Value should NOT be empty
1315 DALI_TEST_CHECK(visual); // Visual should be valid
1317 // Set a URL in property map again
1318 propertyMap[ImageVisual::Property::URL] = gImage_34_RGBA;
1319 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
1321 application.SendNotification();
1322 application.Render(16);
1324 value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1325 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1327 DALI_TEST_CHECK(!value.Get(url)); // Value should be empty
1328 DALI_TEST_CHECK(value.Get(map)); // Value should NOT be empty
1329 DALI_TEST_CHECK(visual); // Visual should be valid
1331 // Set an empty URL in property map
1332 propertyMap[ImageVisual::Property::URL] = std::string();
1333 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
1335 application.SendNotification();
1336 application.Render(16);
1338 value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1339 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1341 DALI_TEST_CHECK(!value.Get(url)); // Value should be empty
1342 DALI_TEST_CHECK(value.Get(map)); // Value should NOT be empty
1343 DALI_TEST_CHECK(!visual); // Visual should be invalid
1345 // Set a URL in property map again
1346 propertyMap[ImageVisual::Property::URL] = gImage_34_RGBA;
1347 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
1349 application.SendNotification();
1350 application.Render(16);
1352 value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1353 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1355 DALI_TEST_CHECK(!value.Get(url)); // Value should be empty
1356 DALI_TEST_CHECK(value.Get(map)); // Value should NOT be empty
1357 DALI_TEST_CHECK(visual); // Visual should be valid
1359 // Set an empty property map
1360 propertyMap.Clear();
1361 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
1363 application.SendNotification();
1364 application.Render(16);
1366 value = imageView.GetProperty(imageView.GetPropertyIndex("image"));
1367 visual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1369 DALI_TEST_CHECK(!value.Get(url)); // Value should be empty
1370 DALI_TEST_CHECK(value.Get(map)); // Value should NOT be empty
1371 DALI_TEST_CHECK(map.Empty()); // But PropertyMap should be empty
1372 DALI_TEST_CHECK(!visual); // Visual should be invalid
1377 int UtcDaliImageViewResourceUrlP(void)
1379 ToolkitTestApplication application;
1381 ImageView imageView = ImageView::New();
1382 DALI_TEST_CHECK(imageView.GetProperty(ImageView::Property::IMAGE).Get<std::string>().empty());
1384 imageView.SetProperty(ImageView::Property::IMAGE, "TestString");
1385 DALI_TEST_EQUALS(imageView.GetProperty(ImageView::Property::IMAGE).Get<std::string>(), "TestString", TEST_LOCATION);
1390 int UtcDaliImageViewReplaceImage(void)
1392 ToolkitTestApplication application;
1394 gResourceReadySignalFired = false;
1396 // Check ImageView with background and main image, to ensure both visuals are marked as loaded
1397 ImageView imageView = ImageView::New(TEST_IMAGE_1);
1399 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
1401 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
1403 application.GetScene().Add(imageView);
1405 application.SendNotification();
1406 application.Render(16);
1408 // loading started, this waits for the loader thread for max 30 seconds
1409 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1411 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
1413 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1415 gResourceReadySignalFired = false;
1417 imageView.SetImage(TEST_IMAGE_2);
1419 application.SendNotification();
1420 application.Render(16);
1422 // loading started, this waits for the loader thread for max 30 seconds
1423 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1425 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
1427 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
1429 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1434 int UtcDaliImageViewReloadAlphaMaskImage(void)
1436 ToolkitTestApplication application;
1438 gResourceReadySignalFired = false;
1440 ImageView dummy = ImageView::New();
1441 ImageView imageView = ImageView::New();
1442 Property::Map propertyMap;
1444 // To keep alpha mask cached, scene on some dummy image.
1445 // Note : If we don't cache alpha mask image, the reference count of mask image become zero.
1446 // In this case, we might need to wait mask image loading, which is not neccesary & can be changed behavior.
1447 propertyMap[ImageVisual::Property::URL] = gImage_600_RGB;
1448 propertyMap[ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
1449 dummy.SetProperty(ImageView::Property::IMAGE, propertyMap);
1451 application.GetScene().Add(dummy);
1453 application.SendNotification();
1454 application.Render(16);
1456 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1458 application.SendNotification();
1459 application.Render(16);
1461 propertyMap.Clear();
1462 propertyMap[ImageVisual::Property::URL] = gImage_34_RGBA;
1463 propertyMap[ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
1464 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
1466 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
1468 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
1470 application.GetScene().Add(imageView);
1472 application.SendNotification();
1473 application.Render(16);
1475 // Load image and use cached mask. Now we try to apply masking.
1476 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1478 DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
1480 // Cancel apply masking.
1481 imageView.Unparent();
1483 application.SendNotification();
1484 application.Render(16);
1486 // Reload same image again.
1487 application.GetScene().Add(imageView);
1489 application.SendNotification();
1490 application.Render(16);
1492 // Finish apply masking.
1493 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1495 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
1496 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
1497 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1502 void OnRelayoutOverride(Size size)
1504 gNaturalSize = size; // Size Relayout is using
1507 int UtcDaliImageViewReplaceImageAndGetNaturalSize(void)
1509 ToolkitTestApplication application;
1511 // Check ImageView with background and main image, to ensure both visuals are marked as loaded
1512 ImageView imageView = ImageView::New(TEST_IMAGE_1);
1513 imageView.SetResizePolicy(ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS);
1515 DummyControl dummyControl = DummyControl::New(true);
1516 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1517 dummyControl.SetResizePolicy(ResizePolicy::FIT_TO_CHILDREN, Dimension::ALL_DIMENSIONS);
1519 dummyControl.Add(imageView);
1520 dummyImpl.SetRelayoutCallback(&OnRelayoutOverride);
1521 application.GetScene().Add(dummyControl);
1523 application.SendNotification();
1524 application.Render();
1526 // loading started, this waits for the loader thread for max 30 seconds
1527 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1529 DALI_TEST_EQUALS(gNaturalSize.width, 1024.0f, TEST_LOCATION);
1530 DALI_TEST_EQUALS(gNaturalSize.height, 1024.0f, TEST_LOCATION);
1532 gNaturalSize = Vector3::ZERO;
1534 imageView.SetImage(gImage_600_RGB);
1536 // Waiting for resourceReady so SendNotifcation not called here.
1538 // loading started, this waits for the loader thread for max 30 seconds
1539 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1541 // Trigger a potential relayout
1542 application.SendNotification();
1543 application.Render();
1545 DALI_TEST_EQUALS(gNaturalSize.width, 600.0f, TEST_LOCATION);
1546 DALI_TEST_EQUALS(gNaturalSize.height, 600.0f, TEST_LOCATION);
1551 int UtcDaliImageViewResourceReadySignalWithImmediateLoad(void)
1553 tet_infoline("Test Setting Image with IMMEDIATE load and receving ResourceReadySignal before staged.");
1555 ToolkitTestApplication application;
1557 gResourceReadySignalFired = false;
1559 Property::Map imageMap;
1561 imageMap[ImageVisual::Property::URL] = gImage_34_RGBA;
1562 imageMap[ImageVisual::Property::LOAD_POLICY] = ImageVisual::LoadPolicy::IMMEDIATE;
1564 tet_infoline("Creating ImageView without URL so image does not start loading");
1565 ImageView imageView = ImageView::New();
1566 tet_infoline("Connect to image loaded signal before setting image");
1567 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
1568 tet_infoline("Setting Image with IMMEDIATE load, signal already connected so will be triggered.");
1569 imageView.SetProperty(ImageView::Property::IMAGE, imageMap);
1571 // loading started, this waits for the loader thread
1572 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1574 application.SendNotification();
1575 application.Render(16);
1577 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1582 int UtcDaliImageViewResourceReadySignalWithReusedImage(void)
1584 tet_infoline("Test Setting Image that was already loaded by another ImageView and still getting ResourceReadySignal.");
1586 ToolkitTestApplication application;
1588 gResourceReadySignalFired = false;
1590 Property::Map imageMap;
1592 imageMap[ImageVisual::Property::URL] = gImage_34_RGBA;
1593 imageMap[ImageVisual::Property::LOAD_POLICY] = ImageVisual::LoadPolicy::IMMEDIATE;
1595 ImageView imageView = ImageView::New();
1596 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
1597 imageView.SetProperty(ImageView::Property::IMAGE, imageMap);
1599 // loading started, this waits for the loader thread
1600 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1602 application.SendNotification();
1603 application.Render(16);
1605 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1606 gResourceReadySignalFired = false;
1608 ImageView imageViewWithExistingImage = ImageView::New();
1609 imageViewWithExistingImage.ResourceReadySignal().Connect(&ResourceReadySignal);
1610 imageViewWithExistingImage.SetProperty(ImageView::Property::IMAGE, imageMap);
1612 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1617 int UtcDaliImageViewResourceReadySignalWithReusedImage02(void)
1619 tet_infoline("Test Setting Image that was already loaded by another ImageView and still getting ResourceReadySignal when staged.");
1621 ToolkitTestApplication application;
1623 gResourceReadySignalFired = false;
1625 Property::Map imageImmediateLoadingMap;
1626 imageImmediateLoadingMap[ImageVisual::Property::URL] = gImage_34_RGBA;
1627 imageImmediateLoadingMap[ImageVisual::Property::LOAD_POLICY] = ImageVisual::LoadPolicy::IMMEDIATE;
1629 tet_infoline("Immediate load an image");
1630 ImageView imageView = ImageView::New();
1631 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
1632 imageView.SetProperty(ImageView::Property::IMAGE, imageImmediateLoadingMap);
1634 // loading started, this waits for the loader thread
1635 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1637 application.SendNotification();
1638 application.Render(16);
1640 tet_infoline("Check image loaded");
1641 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1642 gResourceReadySignalFired = false;
1644 tet_infoline("Create another ImageView with the same URL");
1645 ImageView imageViewWithExistingImage = ImageView::New(gImage_34_RGBA);
1646 tet_infoline("Connect to ResourceReady signal for second ImageView, it should still fire as resource is ready");
1647 imageViewWithExistingImage.ResourceReadySignal().Connect(&ResourceReadySignal);
1649 application.GetScene().Add(imageViewWithExistingImage);
1651 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
1656 int UtcDaliImageViewPaddingProperty(void)
1658 ToolkitTestApplication application;
1660 ImageView imageView = ImageView::New();
1661 Property::Map imagePropertyMap;
1662 imagePropertyMap[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
1663 imagePropertyMap[Toolkit::ImageVisual::Property::URL] = TEST_RESOURCE_DIR "/gallery-small-1.jpg";
1664 imagePropertyMap[ImageVisual::Property::DESIRED_WIDTH] = 128;
1665 imagePropertyMap[ImageVisual::Property::DESIRED_HEIGHT] = 128;
1666 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imagePropertyMap);
1667 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1668 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1669 imageView.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
1670 application.GetScene().Add(imageView);
1672 application.SendNotification();
1673 application.Render();
1675 DALI_TEST_EQUALS(imageView.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
1677 ImageView childImage = ImageView::New();
1678 childImage.SetBackgroundColor(Color::BLACK);
1679 childImage.SetProperty(Actor::Property::SIZE, Vector2(10.f, 10.f));
1680 imageView.Add(childImage);
1682 application.SendNotification();
1683 application.Render();
1685 // Child ImageView should be positioned dependinig on Parent ImageView's Padding value
1686 DALI_TEST_EQUALS(childImage.GetProperty<Vector3>(Dali::Actor::Property::POSITION), Vector3(15, 5, 0), TEST_LOCATION);
1688 // Check whether Image Visual transforms on ImageVieiw::OnRelayout()
1689 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView);
1690 Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1691 Property::Map resultMap;
1692 imageVisual.CreatePropertyMap(resultMap);
1694 Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM);
1695 DALI_TEST_CHECK(transformValue);
1696 Property::Map* retMap = transformValue->GetMap();
1697 DALI_TEST_CHECK(retMap);
1699 // Image Visual should be positioned depending on ImageView's padding
1700 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(15, 5), TEST_LOCATION);
1705 int UtcDaliImageViewPaddingProperty02(void)
1707 ToolkitTestApplication application;
1709 ImageView imageView = ImageView::New();
1710 Property::Map imagePropertyMap;
1711 imagePropertyMap[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
1712 imagePropertyMap[Toolkit::ImageVisual::Property::URL] = TEST_RESOURCE_DIR "/Kid1.svg";
1713 imagePropertyMap[ImageVisual::Property::DESIRED_WIDTH] = 128;
1714 imagePropertyMap[ImageVisual::Property::DESIRED_HEIGHT] = 128;
1715 imagePropertyMap[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::FIT_KEEP_ASPECT_RATIO;
1716 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imagePropertyMap);
1717 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1718 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1719 imageView.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
1720 application.GetScene().Add(imageView);
1722 application.SendNotification();
1723 application.Render();
1725 DALI_TEST_EQUALS(imageView.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
1727 // Check whether Image Visual transforms on ImageVieiw::OnRelayout()
1728 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView);
1729 Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1730 Property::Map resultMap;
1731 imageVisual.CreatePropertyMap(resultMap);
1733 Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM);
1734 DALI_TEST_CHECK(transformValue);
1735 Property::Map* retMap = transformValue->GetMap();
1736 DALI_TEST_CHECK(retMap);
1738 // Image Visual should be positioned depending on ImageView's padding
1739 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(15, 5), TEST_LOCATION);
1744 int UtcDaliImageViewPaddingProperty03(void)
1746 tet_infoline("Test Setting Image Padding then removing it.");
1748 ToolkitTestApplication application;
1750 ImageView imageView = ImageView::New();
1751 Property::Map imagePropertyMap;
1752 imagePropertyMap[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
1753 imagePropertyMap[Toolkit::ImageVisual::Property::URL] = TEST_RESOURCE_DIR "/Kid1.svg";
1754 imagePropertyMap[ImageVisual::Property::DESIRED_WIDTH] = 128;
1755 imagePropertyMap[ImageVisual::Property::DESIRED_HEIGHT] = 128;
1756 imagePropertyMap[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::FIT_KEEP_ASPECT_RATIO;
1757 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imagePropertyMap);
1758 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1759 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1760 imageView.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
1761 application.GetScene().Add(imageView);
1763 application.SendNotification();
1764 application.Render();
1766 DALI_TEST_EQUALS(imageView.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
1768 tet_infoline("Remove Padding and test Visual is position correctly");
1770 imageView.SetProperty(Control::Property::PADDING, Extents(0, 0, 0, 0));
1772 application.SendNotification();
1773 application.Render();
1775 // Check whether Image Visual transforms on ImageVieiw::OnRelayout()
1776 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView);
1777 Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1778 Property::Map resultMap;
1779 imageVisual.CreatePropertyMap(resultMap);
1781 Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM);
1782 DALI_TEST_CHECK(transformValue);
1783 Property::Map* retMap = transformValue->GetMap();
1784 DALI_TEST_CHECK(retMap);
1786 // Image Visual should be positioned depending on ImageView's padding
1787 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION);
1792 int UtcDaliImageViewPaddingProperty04(void)
1794 tet_infoline("Test Setting Image Padding then removing it. Visual Fitting Mode as Fill");
1796 ToolkitTestApplication application;
1798 ImageView imageView = ImageView::New();
1799 Property::Map imagePropertyMap;
1800 imagePropertyMap[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
1801 imagePropertyMap[Toolkit::ImageVisual::Property::URL] = TEST_RESOURCE_DIR "/Kid1.svg";
1802 imagePropertyMap[ImageVisual::Property::DESIRED_WIDTH] = 128;
1803 imagePropertyMap[ImageVisual::Property::DESIRED_HEIGHT] = 128;
1804 imagePropertyMap[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::FILL;
1805 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imagePropertyMap);
1806 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1807 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1808 imageView.SetProperty(Control::Property::PADDING, Extents(15, 10, 5, 10));
1809 application.GetScene().Add(imageView);
1811 application.SendNotification();
1812 application.Render();
1814 DALI_TEST_EQUALS(imageView.GetProperty<Extents>(Control::Property::PADDING), Extents(15, 10, 5, 10), TEST_LOCATION);
1816 tet_infoline("Remove Padding and test Visual is position correctly");
1818 imageView.SetProperty(Control::Property::PADDING, Extents(0, 0, 0, 0));
1820 application.SendNotification();
1821 application.Render();
1823 // Check whether Image Visual transforms on ImageVieiw::OnRelayout()
1824 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView);
1825 Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1826 Property::Map resultMap;
1827 imageVisual.CreatePropertyMap(resultMap);
1829 Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM);
1830 DALI_TEST_CHECK(transformValue);
1831 Property::Map* retMap = transformValue->GetMap();
1832 DALI_TEST_CHECK(retMap);
1834 // Image Visual should be positioned depending on ImageView's padding
1835 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION);
1840 int UtcDaliImageViewTransformTest01(void)
1842 tet_infoline("Test Setting a offset transform on the ImageView");
1844 ToolkitTestApplication application;
1846 ImageView imageView = ImageView::New();
1847 Property::Map imagePropertyMap;
1848 imagePropertyMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE)
1849 .Add(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/Kid1.svg")
1850 .Add(ImageVisual::Property::DESIRED_WIDTH, 120)
1851 .Add(ImageVisual::Property::DESIRED_HEIGHT, 120)
1852 .Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FILL)
1853 .Add(Visual::Property::TRANSFORM,
1854 Property::Map().Add(Toolkit::Visual::Transform::Property::OFFSET_POLICY,
1855 Vector2(Visual::Transform::Policy::ABSOLUTE, Visual::Transform::Policy::ABSOLUTE))
1856 .Add(Toolkit::Visual::Transform::Property::OFFSET, Vector2(8, 8)));
1858 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imagePropertyMap);
1859 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
1860 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
1861 application.GetScene().Add(imageView);
1863 application.SendNotification();
1864 application.Render();
1866 // Check whether Image Visual transforms on ImageVieiw::OnRelayout()
1867 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView);
1868 Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
1869 Property::Map resultMap;
1870 imageVisual.CreatePropertyMap(resultMap);
1872 Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM);
1873 DALI_TEST_CHECK(transformValue);
1874 Property::Map* retMap = transformValue->GetMap();
1875 DALI_TEST_CHECK(retMap);
1877 // Image Visual should be positioned depending on ImageView's padding
1878 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET)->Get<Vector2>(), Vector2(8, 8), TEST_LOCATION);
1879 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::OFFSET_POLICY)->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
1884 int UtcDaliImageViewUsingAtlasAndGetNaturalSize(void)
1886 ToolkitTestApplication application;
1888 // Check ImageView with background and main image, to ensure both visuals are marked as loaded
1889 ImageView imageView = ImageView::New();
1890 Property::Map imageMap;
1891 imageMap[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
1892 imageMap[Toolkit::ImageVisual::Property::URL] = gImage_34_RGBA;
1893 imageMap[Toolkit::ImageVisual::Property::ATLASING] = true;
1894 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
1895 application.GetScene().Add(imageView);
1897 // Trigger a potential relayout
1898 application.SendNotification();
1899 application.Render();
1901 Vector3 naturalSize = imageView.GetNaturalSize();
1903 DALI_TEST_EQUALS(naturalSize.width, 34.0f, TEST_LOCATION);
1904 DALI_TEST_EQUALS(naturalSize.height, 34.0f, TEST_LOCATION);
1909 int UtcDaliImageViewFillMode(void)
1911 ToolkitTestApplication application;
1913 tet_infoline("Create an ImageVisual without padding and set the fill-mode to fill");
1915 ImageView imageView = ImageView::New();
1916 Property::Map imageMap;
1917 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
1918 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB);
1919 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, DevelVisual::FittingMode::FILL);
1921 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
1923 application.GetScene().Add(imageView);
1925 // Trigger a potential relayout
1926 application.SendNotification();
1927 application.Render();
1929 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
1930 Property::Map returnedMap;
1931 visual.CreatePropertyMap(returnedMap);
1933 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
1934 DALI_TEST_CHECK(value);
1935 Property::Map* map = value->GetMap();
1936 DALI_TEST_CHECK(map);
1938 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
1939 DALI_TEST_CHECK(value);
1940 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2::ONE, TEST_LOCATION);
1942 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
1943 DALI_TEST_CHECK(value);
1944 DALI_TEST_CHECK(value->Get<int>() == Toolkit::Visual::Transform::Policy::RELATIVE);
1949 int UtcDaliImageViewFittingModeFitKeepAspectRatio(void)
1951 ToolkitTestApplication application;
1953 tet_infoline("Create an ImageVisual using FitKeepAspectRatio ( image: [600,600], view: [600,700] )");
1954 tet_infoline(" There should be need to change the transform, offset is adjusted to fit inside");
1956 ImageView imageView = ImageView::New();
1957 Property::Map imageMap;
1958 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
1959 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 600x600 image
1960 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FIT_KEEP_ASPECT_RATIO);
1962 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
1963 imageView.SetProperty(Actor::Property::SIZE, Vector2(600, 700));
1965 application.GetScene().Add(imageView);
1967 // Trigger a potential relayout
1968 application.SendNotification();
1969 application.Render();
1971 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
1972 Property::Map returnedMap;
1973 visual.CreatePropertyMap(returnedMap);
1975 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
1976 DALI_TEST_CHECK(value);
1977 Property::Map* map = value->GetMap();
1978 DALI_TEST_CHECK(map);
1981 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
1982 DALI_TEST_CHECK(value);
1983 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 600), TEST_LOCATION);
1985 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
1986 DALI_TEST_CHECK(value);
1987 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
1989 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
1990 DALI_TEST_CHECK(value);
1991 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 50), TEST_LOCATION);
1996 int UtcDaliImageViewFittingModesFill(void)
1998 ToolkitTestApplication application;
2000 tet_infoline("Create an ImageVisual using Fill ( image: [600,600], view: [600,700] )");
2001 tet_infoline(" There should be no need to change the transform, only size is changed to fit view");
2003 ImageView imageView = ImageView::New();
2004 Property::Map imageMap;
2005 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2006 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 600x600 image
2007 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FILL);
2009 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2010 imageView.SetProperty(Actor::Property::SIZE, Vector2(600, 700));
2012 application.GetScene().Add(imageView);
2014 // Trigger a potential relayout
2015 application.SendNotification();
2016 application.Render();
2018 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2019 Property::Map returnedMap;
2020 visual.CreatePropertyMap(returnedMap);
2022 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2023 DALI_TEST_CHECK(value);
2024 Property::Map* map = value->GetMap();
2025 DALI_TEST_CHECK(map);
2027 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2028 DALI_TEST_CHECK(value);
2029 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2::ONE, TEST_LOCATION); // Change the internal size according to the image view size
2031 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2032 DALI_TEST_CHECK(value);
2033 DALI_TEST_CHECK(value->Get<int>() == Toolkit::Visual::Transform::Policy::RELATIVE);
2035 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2036 DALI_TEST_CHECK(value);
2037 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION); // OFFSET is zero
2042 int UtcDaliImageViewFittingModesOverfitKeepAspectRatio(void)
2044 ToolkitTestApplication application;
2046 tet_infoline("Create an ImageVisual using OverFitKeepAspectRatio ( image: [600,600], view: [600,500] )");
2047 tet_infoline(" offset or size is the same as view, but adjust internally using pixelArea ");
2049 ImageView imageView = ImageView::New();
2050 Property::Map imageMap;
2051 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2052 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 600x600 image
2053 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::OVER_FIT_KEEP_ASPECT_RATIO);
2055 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2056 imageView.SetProperty(Actor::Property::SIZE, Vector2(600, 500));
2058 application.GetScene().Add(imageView);
2060 // Trigger a potential relayout
2061 application.SendNotification();
2062 application.Render();
2064 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2065 Property::Map returnedMap;
2066 visual.CreatePropertyMap(returnedMap);
2068 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2069 DALI_TEST_CHECK(value);
2070 Property::Map* map = value->GetMap();
2071 DALI_TEST_CHECK(map);
2074 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2075 DALI_TEST_CHECK(value);
2076 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 500), TEST_LOCATION); // Change the internal size according to the image view size
2078 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2079 DALI_TEST_CHECK(value);
2080 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2082 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2083 DALI_TEST_CHECK(value);
2084 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION); // OFFSET is zero
2089 int UtcDaliImageViewFittingModesCenter01(void)
2091 ToolkitTestApplication application;
2093 tet_infoline("Create an ImageVisual using Center ( image: [600,600], view: [700,700] )");
2094 tet_infoline(" There should be need to change the transform, offset is adjusted to fit inside");
2096 ImageView imageView = ImageView::New();
2097 Property::Map imageMap;
2098 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2099 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 600x600 image
2100 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::CENTER);
2102 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2103 imageView.SetProperty(Actor::Property::SIZE, Vector2(700, 700));
2105 application.GetScene().Add(imageView);
2107 // Trigger a potential relayout
2108 application.SendNotification();
2109 application.Render();
2111 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2112 Property::Map returnedMap;
2113 visual.CreatePropertyMap(returnedMap);
2115 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2116 DALI_TEST_CHECK(value);
2117 Property::Map* map = value->GetMap();
2118 DALI_TEST_CHECK(map);
2120 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2121 DALI_TEST_CHECK(value);
2122 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 600), TEST_LOCATION); // Change the internal size according to the image view size
2124 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2125 DALI_TEST_CHECK(value);
2126 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2128 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2129 DALI_TEST_CHECK(value);
2130 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(50, 50), TEST_LOCATION);
2135 int UtcDaliImageViewFittingModesCenter02(void)
2137 ToolkitTestApplication application;
2139 tet_infoline("Create an ImageVisual using Center ( image: [600,600], view: [500,500] )");
2140 tet_infoline(" There should be need to change the transform, offset is adjusted to fit inside");
2142 ImageView imageView = ImageView::New();
2143 Property::Map imageMap;
2144 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2145 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 600x600 image
2146 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::CENTER);
2148 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2149 imageView.SetProperty(Actor::Property::SIZE, Vector2(700, 700));
2151 application.GetScene().Add(imageView);
2153 // Trigger a potential relayout
2154 application.SendNotification();
2155 application.Render();
2157 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2158 Property::Map returnedMap;
2159 visual.CreatePropertyMap(returnedMap);
2161 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2162 DALI_TEST_CHECK(value);
2163 Property::Map* map = value->GetMap();
2164 DALI_TEST_CHECK(map);
2166 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2167 DALI_TEST_CHECK(value);
2168 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 600), TEST_LOCATION); // Change the internal size according to the image view size
2170 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2171 DALI_TEST_CHECK(value);
2172 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2174 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2175 DALI_TEST_CHECK(value);
2176 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(50, 50), TEST_LOCATION);
2181 int UtcDaliImageViewFittingModesFitHeight01(void)
2183 ToolkitTestApplication application;
2185 tet_infoline("Create an ImageVisual using FitHeight ( image: [600,600], view: [600,700] )");
2187 ImageView imageView = ImageView::New();
2188 Property::Map imageMap;
2189 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2190 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 600x600 image
2191 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FIT_HEIGHT);
2193 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2194 imageView.SetProperty(Actor::Property::SIZE, Vector2(600, 700));
2196 application.GetScene().Add(imageView);
2198 // Trigger a potential relayout
2199 application.SendNotification();
2200 application.Render();
2202 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2203 Property::Map returnedMap;
2204 visual.CreatePropertyMap(returnedMap);
2206 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2207 DALI_TEST_CHECK(value);
2208 Property::Map* map = value->GetMap();
2209 DALI_TEST_CHECK(map);
2211 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2212 DALI_TEST_CHECK(value);
2213 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 700), TEST_LOCATION); // Change the internal size according to the image view size
2215 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2216 DALI_TEST_CHECK(value);
2217 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2219 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2220 DALI_TEST_CHECK(value);
2221 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION); // OFFSET is zero
2226 int UtcDaliImageViewFittingModesFitHeight02(void)
2228 ToolkitTestApplication application;
2230 tet_infoline("Create an ImageVisual using FitHeight ( image: [600,600], view: [700,600] )");
2232 ImageView imageView = ImageView::New();
2233 Property::Map imageMap;
2234 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2235 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 249x169 image
2236 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FIT_HEIGHT);
2238 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2239 imageView.SetProperty(Actor::Property::SIZE, Vector2(700, 600));
2241 application.GetScene().Add(imageView);
2243 // Trigger a potential relayout
2244 application.SendNotification();
2245 application.Render();
2247 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2248 Property::Map returnedMap;
2249 visual.CreatePropertyMap(returnedMap);
2251 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2252 DALI_TEST_CHECK(value);
2253 Property::Map* map = value->GetMap();
2254 DALI_TEST_CHECK(map);
2256 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2257 DALI_TEST_CHECK(value);
2258 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 600), TEST_LOCATION); // Change the internal size according to the image view size
2260 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2261 DALI_TEST_CHECK(value);
2262 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2264 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2265 DALI_TEST_CHECK(value);
2266 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(50, 0), TEST_LOCATION);
2271 int UtcDaliImageViewFittingModesFitWidth01(void)
2273 ToolkitTestApplication application;
2275 tet_infoline("Create an ImageVisual using FitWidth ( image: [600,600], view: [600,700] )");
2277 ImageView imageView = ImageView::New();
2278 Property::Map imageMap;
2279 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2280 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 600x600 image
2281 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FIT_WIDTH);
2283 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2284 imageView.SetProperty(Actor::Property::SIZE, Vector2(600, 700));
2286 application.GetScene().Add(imageView);
2288 // Trigger a potential relayout
2289 application.SendNotification();
2290 application.Render();
2292 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2293 Property::Map returnedMap;
2294 visual.CreatePropertyMap(returnedMap);
2296 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2297 DALI_TEST_CHECK(value);
2298 Property::Map* map = value->GetMap();
2299 DALI_TEST_CHECK(map);
2301 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2302 DALI_TEST_CHECK(value);
2303 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 600), TEST_LOCATION); // Change the internal size according to the image view size
2305 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2306 DALI_TEST_CHECK(value);
2307 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2309 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2310 DALI_TEST_CHECK(value);
2311 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 50), TEST_LOCATION);
2316 int UtcDaliImageViewFittingModesFitWidth02(void)
2318 ToolkitTestApplication application;
2320 tet_infoline("Create an ImageVisual using FitWidth ( image: [600,600], view:[700,600] )");
2322 ImageView imageView = ImageView::New();
2323 Property::Map imageMap;
2324 imageMap.Add(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2325 imageMap.Add(Toolkit::ImageVisual::Property::URL, gImage_600_RGB); // 249x169 image
2326 imageMap.Add(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FIT_WIDTH);
2328 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2329 imageView.SetProperty(Actor::Property::SIZE, Vector2(700, 600));
2331 application.GetScene().Add(imageView);
2333 // Trigger a potential relayout
2334 application.SendNotification();
2335 application.Render();
2337 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2338 Property::Map returnedMap;
2339 visual.CreatePropertyMap(returnedMap);
2341 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2342 DALI_TEST_CHECK(value);
2343 Property::Map* map = value->GetMap();
2344 DALI_TEST_CHECK(map);
2346 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2347 DALI_TEST_CHECK(value);
2348 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(700, 600), TEST_LOCATION); // Change the internal size according to the image view size
2350 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2351 DALI_TEST_CHECK(value);
2352 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2354 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2355 DALI_TEST_CHECK(value);
2356 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION); // OFFSET is zero
2361 int UtcDaliImageViewFittingModesChangeFittingMode01(void)
2363 ToolkitTestApplication application;
2365 tet_infoline("UtcDaliImageViewFittingModesChangeFittingMode, image: [600,600], view:[800,700]");
2367 ImageView imageView = ImageView::New();
2369 // 1. Render using FittingMode::SHRINK_TO_FIT
2370 Property::Map imageMap;
2371 imageMap[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
2372 imageMap[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
2373 imageMap[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::FIT_KEEP_ASPECT_RATIO;
2375 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2376 imageView.SetProperty(Actor::Property::SIZE, Vector2(800, 700));
2378 application.GetScene().Add(imageView);
2380 // Trigger a potential relayout
2381 application.SendNotification();
2382 application.Render();
2384 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2385 Property::Map returnedMap;
2386 visual.CreatePropertyMap(returnedMap);
2388 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2389 DALI_TEST_CHECK(value);
2390 Property::Map* map = value->GetMap();
2391 DALI_TEST_CHECK(map);
2393 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2394 DALI_TEST_CHECK(value);
2395 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(700, 700), TEST_LOCATION); // Change the internal size according to the image view size
2397 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2398 DALI_TEST_CHECK(value);
2399 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2401 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2402 DALI_TEST_CHECK(value);
2403 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(50, 0), TEST_LOCATION);
2405 // 2. Render again using DevelVisaul::CENTER
2406 Property::Map imageMap2;
2407 imageMap2[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
2408 imageMap2[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
2409 imageMap2[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::CENTER;
2411 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap2);
2412 imageView.SetProperty(Actor::Property::SIZE, Vector2(800, 700));
2414 application.GetScene().Add(imageView);
2416 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2418 // Trigger a potential relayout
2419 application.SendNotification();
2420 application.Render();
2422 returnedMap.Clear();
2423 visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2425 visual.CreatePropertyMap(returnedMap);
2427 value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2428 DALI_TEST_CHECK(value);
2429 map = value->GetMap();
2430 DALI_TEST_CHECK(map);
2432 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2433 DALI_TEST_CHECK(value);
2434 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 600), TEST_LOCATION); // Change the internal size according to the image view size
2436 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2437 DALI_TEST_CHECK(value);
2438 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2440 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2441 DALI_TEST_CHECK(value);
2442 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(100, 50), TEST_LOCATION);
2444 // 3. Render again using before fittingMode
2445 Property::Map imageMap3;
2446 imageMap3[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
2447 imageMap3[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
2448 imageMap3[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::FIT_KEEP_ASPECT_RATIO;
2450 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap3);
2451 imageView.SetProperty(Actor::Property::SIZE, Vector2(800, 700));
2453 application.GetScene().Add(imageView);
2455 // Trigger a potential relayout
2456 application.SendNotification();
2457 application.Render();
2459 returnedMap.Clear();
2460 visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2461 visual.CreatePropertyMap(returnedMap);
2463 value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2464 DALI_TEST_CHECK(value);
2465 map = value->GetMap();
2466 DALI_TEST_CHECK(map);
2468 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2469 DALI_TEST_CHECK(value);
2470 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(700, 700), TEST_LOCATION); // Change the internal size according to the image view size
2472 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2473 DALI_TEST_CHECK(value);
2474 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2476 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2477 DALI_TEST_CHECK(value);
2478 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(50, 0), TEST_LOCATION);
2483 int UtcDaliImageViewFittingModesChangeFittingMode02(void)
2485 ToolkitTestApplication application;
2487 tet_infoline("UtcDaliImageViewFittingModesChangeFittingMode, image: [600,600], view:[800,700]");
2489 ImageView imageView = ImageView::New();
2491 // 1. Render using FittingMode::OVER_FIT_KEEP_ASPECT_RATIO
2492 Property::Map imageMap;
2493 imageMap[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
2494 imageMap[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
2495 imageMap[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::OVER_FIT_KEEP_ASPECT_RATIO;
2497 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2498 imageView.SetProperty(Actor::Property::SIZE, Vector2(800, 700));
2500 application.GetScene().Add(imageView);
2502 // Trigger a potential relayout
2503 application.SendNotification();
2504 application.Render();
2506 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2507 Property::Map returnedMap;
2508 visual.CreatePropertyMap(returnedMap);
2510 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2511 DALI_TEST_CHECK(value);
2512 Property::Map* map = value->GetMap();
2513 DALI_TEST_CHECK(map);
2515 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2516 DALI_TEST_CHECK(value);
2517 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(800, 700), TEST_LOCATION); // Change the internal size according to the image view size
2519 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2520 DALI_TEST_CHECK(value);
2521 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2523 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2524 DALI_TEST_CHECK(value);
2525 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION);
2527 // 2. Render again using DevelVisaul::CENTER
2528 Property::Map imageMap2;
2529 imageMap2[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
2530 imageMap2[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
2531 imageMap2[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::CENTER;
2533 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap2);
2534 imageView.SetProperty(Actor::Property::SIZE, Vector2(800, 700));
2536 application.GetScene().Add(imageView);
2538 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2540 // Trigger a potential relayout
2541 application.SendNotification();
2542 application.Render();
2544 returnedMap.Clear();
2545 visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2547 visual.CreatePropertyMap(returnedMap);
2549 value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2550 DALI_TEST_CHECK(value);
2551 map = value->GetMap();
2552 DALI_TEST_CHECK(map);
2554 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2555 DALI_TEST_CHECK(value);
2556 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(600, 600), TEST_LOCATION); // Change the internal size according to the image view size
2558 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2559 DALI_TEST_CHECK(value);
2560 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2562 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2563 DALI_TEST_CHECK(value);
2564 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(100, 50), TEST_LOCATION);
2566 // 3. Render again using before fittingMode
2567 Property::Map imageMap3;
2568 imageMap3[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::IMAGE;
2569 imageMap3[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
2570 imageMap3[DevelVisual::Property::VISUAL_FITTING_MODE] = Toolkit::DevelVisual::OVER_FIT_KEEP_ASPECT_RATIO;
2572 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap3);
2573 imageView.SetProperty(Actor::Property::SIZE, Vector2(800, 700));
2575 application.GetScene().Add(imageView);
2577 // Trigger a potential relayout
2578 application.SendNotification();
2579 application.Render();
2581 returnedMap.Clear();
2582 visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2583 visual.CreatePropertyMap(returnedMap);
2585 value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2586 DALI_TEST_CHECK(value);
2587 map = value->GetMap();
2588 DALI_TEST_CHECK(map);
2590 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2591 DALI_TEST_CHECK(value);
2592 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(800, 700), TEST_LOCATION); // Change the internal size according to the image view size
2594 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2595 DALI_TEST_CHECK(value);
2596 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(Toolkit::Visual::Transform::Policy::ABSOLUTE, Toolkit::Visual::Transform::Policy::ABSOLUTE), TEST_LOCATION);
2598 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2599 DALI_TEST_CHECK(value);
2600 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION);
2605 int UtcDaliImageViewFittingModesWithAnimatedVectorImageVisual(void)
2607 ToolkitTestApplication application;
2609 tet_infoline("Create an ImageVisual using SCALE_TO_FILL and animated vector image ( image: [600,600], view:[600,600] )");
2611 ImageView imageView = ImageView::New();
2612 Property::Map imageMap;
2613 imageMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE);
2614 imageMap.Add(Toolkit::ImageVisual::Property::URL, TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME); // 249x169 image
2616 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, imageMap);
2617 imageView.SetProperty(Actor::Property::SIZE, Vector2(600, 600));
2619 application.GetScene().Add(imageView);
2621 // Trigger a potential relayout
2622 application.SendNotification();
2623 application.Render();
2625 Toolkit::Visual::Base visual = DevelControl::GetVisual(Toolkit::Internal::GetImplementation(imageView), Toolkit::ImageView::Property::IMAGE);
2626 Property::Map returnedMap;
2627 visual.CreatePropertyMap(returnedMap);
2629 Property::Value* value = returnedMap.Find(Toolkit::Visual::Property::TRANSFORM);
2630 DALI_TEST_CHECK(value);
2631 Property::Map* map = value->GetMap();
2632 DALI_TEST_CHECK(map);
2634 value = map->Find(Toolkit::Visual::Transform::Property::SIZE);
2635 DALI_TEST_CHECK(value);
2636 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2::ONE, TEST_LOCATION); // Relative size so will take up 100%
2638 value = map->Find(Toolkit::Visual::Transform::Property::SIZE_POLICY);
2639 DALI_TEST_CHECK(value);
2640 DALI_TEST_CHECK(value->Get<int>() == Toolkit::Visual::Transform::Policy::RELATIVE);
2642 value = map->Find(Toolkit::Visual::Transform::Property::OFFSET);
2643 DALI_TEST_CHECK(value);
2644 DALI_TEST_EQUALS(value->Get<Vector2>(), Vector2(0, 0), TEST_LOCATION); // OFFSET is zero
2649 int UtcDaliImageViewCustomShader(void)
2651 ToolkitTestApplication application;
2653 // Set a custom shader with an image url
2655 Property::Map properties;
2656 Property::Map shader;
2657 const std::string vertexShader = "Foobar";
2658 const std::string fragmentShader = "Foobar";
2659 shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
2660 shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
2662 properties[Visual::Property::TYPE] = Visual::IMAGE;
2663 properties[Visual::Property::SHADER] = shader;
2664 properties[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
2666 ImageView imageView = ImageView::New();
2667 imageView.SetProperty(ImageView::Property::IMAGE, properties);
2669 application.GetScene().Add(imageView);
2671 application.SendNotification();
2672 application.Render();
2674 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2676 Renderer renderer = imageView.GetRendererAt(0);
2677 Shader shader2 = renderer.GetShader();
2678 Property::Value value = shader2.GetProperty(Shader::Property::PROGRAM);
2679 Property::Map* map = value.GetMap();
2680 DALI_TEST_CHECK(map);
2682 Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp
2683 DALI_TEST_EQUALS(fragmentShader, fragment->Get<std::string>(), TEST_LOCATION);
2685 Property::Value* vertex = map->Find("vertex"); // vertex key name from shader-impl.cpp
2686 DALI_TEST_EQUALS(vertexShader, vertex->Get<std::string>(), TEST_LOCATION);
2689 // Set a custom shader after setting an image url
2691 Property::Map properties;
2692 Property::Map shader;
2693 const std::string vertexShader = "Foobar";
2694 const std::string fragmentShader = "Foobar";
2695 shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
2696 shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
2698 properties[Visual::Property::SHADER] = shader;
2700 ImageView imageView = ImageView::New(TEST_IMAGE_FILE_NAME);
2701 imageView.SetProperty(ImageView::Property::IMAGE, properties);
2703 application.GetScene().Add(imageView);
2705 application.SendNotification();
2706 application.Render();
2708 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2710 Renderer renderer = imageView.GetRendererAt(0);
2711 Shader shader2 = renderer.GetShader();
2712 Property::Value value = shader2.GetProperty(Shader::Property::PROGRAM);
2713 Property::Map* map = value.GetMap();
2714 DALI_TEST_CHECK(map);
2716 Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp
2717 DALI_TEST_EQUALS(fragmentShader, fragment->Get<std::string>(), TEST_LOCATION);
2719 Property::Value* vertex = map->Find("vertex"); // vertex key name from shader-impl.cpp
2720 DALI_TEST_EQUALS(vertexShader, vertex->Get<std::string>(), TEST_LOCATION);
2723 // Set a custom shader before setting an image url
2725 Property::Map properties;
2726 Property::Map shader;
2727 const std::string vertexShader = "Foobar";
2728 const std::string fragmentShader = "Foobar";
2729 shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
2730 shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
2732 properties[Visual::Property::SHADER] = shader;
2734 ImageView imageView = ImageView::New();
2735 imageView.SetProperty(ImageView::Property::IMAGE, properties);
2736 imageView.SetProperty(ImageView::Property::IMAGE, TEST_IMAGE_FILE_NAME);
2738 application.GetScene().Add(imageView);
2740 application.SendNotification();
2741 application.Render();
2742 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2744 Renderer renderer = imageView.GetRendererAt(0);
2745 Shader shader2 = renderer.GetShader();
2746 Property::Value value = shader2.GetProperty(Shader::Property::PROGRAM);
2747 Property::Map* map = value.GetMap();
2748 DALI_TEST_CHECK(map);
2750 Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp
2751 DALI_TEST_EQUALS(fragmentShader, fragment->Get<std::string>(), TEST_LOCATION);
2753 Property::Value* vertex = map->Find("vertex"); // vertex key name from shader-impl.cpp
2754 DALI_TEST_EQUALS(vertexShader, vertex->Get<std::string>(), TEST_LOCATION);
2757 // Set a custom shader after setting a property map
2759 Property::Map properties;
2760 Property::Map shader;
2761 const std::string vertexShader = "Foobar";
2762 const std::string fragmentShader = "Foobar";
2763 shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
2764 shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
2766 properties[Visual::Property::SHADER] = shader;
2768 Property::Map properties1;
2769 properties1[Visual::Property::TYPE] = Visual::IMAGE;
2770 properties1[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
2772 ImageView imageView = ImageView::New();
2773 imageView.SetProperty(ImageView::Property::IMAGE, properties1);
2774 imageView.SetProperty(ImageView::Property::IMAGE, properties);
2776 application.GetScene().Add(imageView);
2778 application.SendNotification();
2779 application.Render();
2780 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2782 Renderer renderer = imageView.GetRendererAt(0);
2783 Shader shader2 = renderer.GetShader();
2784 Property::Value value = shader2.GetProperty(Shader::Property::PROGRAM);
2785 Property::Map* map = value.GetMap();
2786 DALI_TEST_CHECK(map);
2788 Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp
2789 DALI_TEST_EQUALS(fragmentShader, fragment->Get<std::string>(), TEST_LOCATION);
2791 Property::Value* vertex = map->Find("vertex"); // vertex key name from shader-impl.cpp
2792 DALI_TEST_EQUALS(vertexShader, vertex->Get<std::string>(), TEST_LOCATION);
2795 // Set a custom shader before setting a property map
2797 Property::Map properties;
2798 Property::Map shader;
2799 const std::string vertexShader = "Foobar";
2800 const std::string fragmentShader = "Foobar";
2801 shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
2802 shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
2804 properties[Visual::Property::SHADER] = shader;
2806 Property::Map properties1;
2807 properties1[Visual::Property::TYPE] = Visual::IMAGE;
2808 properties1[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
2810 ImageView imageView = ImageView::New();
2811 imageView.SetProperty(ImageView::Property::IMAGE, properties);
2812 imageView.SetProperty(ImageView::Property::IMAGE, properties1);
2814 application.GetScene().Add(imageView);
2816 application.SendNotification();
2817 application.Render();
2818 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2820 Renderer renderer = imageView.GetRendererAt(0);
2821 Shader shader2 = renderer.GetShader();
2822 Property::Value value = shader2.GetProperty(Shader::Property::PROGRAM);
2823 Property::Map* map = value.GetMap();
2824 DALI_TEST_CHECK(map);
2826 Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp
2827 DALI_TEST_EQUALS(fragmentShader, fragment->Get<std::string>(), TEST_LOCATION);
2829 Property::Value* vertex = map->Find("vertex"); // vertex key name from shader-impl.cpp
2830 DALI_TEST_EQUALS(vertexShader, vertex->Get<std::string>(), TEST_LOCATION);
2838 static int gFailCounter = 0;
2839 const int MAX_RETRIES(3);
2841 void ReloadImage(ImageView imageView)
2843 Property::Map imageImmediateLoadingMap;
2844 imageImmediateLoadingMap[ImageVisual::Property::URL] = "Non-existant-image.jpg";
2845 imageImmediateLoadingMap[ImageVisual::Property::LOAD_POLICY] = ImageVisual::LoadPolicy::IMMEDIATE;
2847 tet_infoline("Immediate load an image");
2848 imageView.SetProperty(ImageView::Property::IMAGE, imageImmediateLoadingMap);
2851 void ResourceFailedReload(Control control)
2857 int UtcDaliImageViewReloadFailedOnResourceReadySignal(void)
2859 tet_infoline("Test reloading failed image from within signal handler.");
2861 ToolkitTestApplication application;
2865 ImageView imageView = ImageView::New();
2866 imageView.ResourceReadySignal().Connect(&ResourceFailedReload);
2867 DALI_TEST_EQUALS(gFailCounter, 0, TEST_LOCATION);
2868 ReloadImage(imageView);
2870 // loading started, this waits for the loader thread to complete
2871 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2872 DALI_TEST_EQUALS(gFailCounter, 1, TEST_LOCATION);
2874 ReloadImage(imageView);
2875 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2876 DALI_TEST_EQUALS(gFailCounter, 2, TEST_LOCATION);
2878 ReloadImage(imageView);
2879 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
2880 DALI_TEST_EQUALS(gFailCounter, 3, TEST_LOCATION);
2885 int UtcDaliImageViewLoadRemoteSVG(void)
2887 tet_infoline("Test load from a remote server.");
2889 ToolkitTestApplication application;
2892 Toolkit::ImageView imageView;
2893 imageView = Toolkit::ImageView::New();
2894 imageView.SetImage("https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg");
2895 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2896 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2897 imageView.SetProperty(Actor::Property::SIZE, Vector2(300, 300));
2898 imageView.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 150.0f, 0.0f));
2900 application.GetScene().Add(imageView);
2902 DALI_TEST_CHECK(imageView);
2904 DALI_TEST_EQUALS(imageView.GetRendererCount(), 0u, TEST_LOCATION);
2906 application.SendNotification();
2908 // Wait for loading & rasterization
2909 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
2911 application.SendNotification();
2912 application.Render();
2914 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
2919 Toolkit::ImageView imageView;
2920 imageView = Toolkit::ImageView::New();
2921 imageView.SetImage("https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg");
2922 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2923 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2924 imageView.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 150.0f, 0.0f));
2926 application.GetScene().Add(imageView);
2928 DALI_TEST_CHECK(imageView);
2930 DALI_TEST_EQUALS(imageView.GetRendererCount(), 0u, TEST_LOCATION);
2932 application.SendNotification();
2934 // Wait for loading & rasterization
2935 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
2937 application.SendNotification();
2938 application.Render();
2940 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
2946 int UtcDaliImageViewLoadRemoteLottie(void)
2948 tet_infoline("Test load from a remote server. (Note we don't support real download now. Just for line coverage)");
2950 ToolkitTestApplication application;
2953 Toolkit::ImageView imageView;
2954 imageView = Toolkit::ImageView::New();
2955 imageView.SetImage("https://lottie.json");
2956 imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
2957 imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
2958 imageView.SetProperty(Actor::Property::SIZE, Vector2(300, 300));
2959 imageView.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 150.0f, 0.0f));
2961 application.GetScene().Add(imageView);
2963 DALI_TEST_CHECK(imageView);
2965 application.SendNotification();
2966 application.Render();
2968 // Do not check anything for here.
2974 int UtcDaliImageViewSyncSVGLoading(void)
2976 ToolkitTestApplication application;
2978 tet_infoline("ImageView Testing SVG image sync loading");
2981 ImageView imageView = ImageView::New();
2983 // Sync loading is used
2984 Property::Map syncLoadingMap;
2985 syncLoadingMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
2986 syncLoadingMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
2987 syncLoadingMap.Insert(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, true);
2988 imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
2990 application.GetScene().Add(imageView);
2991 DALI_TEST_CHECK(imageView);
2993 application.SendNotification();
2994 Vector3 naturalSize = imageView.GetNaturalSize();
2996 DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
2997 DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
3002 int UtcDaliImageViewSyncSVGLoading02(void)
3004 ToolkitTestApplication application;
3006 tet_infoline("ImageView Testing SVG image sync loading");
3009 ImageView imageView = ImageView::New();
3011 // Sync loading is used
3012 Property::Map syncLoadingMap;
3013 syncLoadingMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
3014 syncLoadingMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
3015 syncLoadingMap.Insert(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, true);
3016 syncLoadingMap.Insert(DevelVisual::Property::VISUAL_FITTING_MODE, Toolkit::DevelVisual::FIT_KEEP_ASPECT_RATIO);
3017 imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
3018 imageView.ResourceReadySignal().Connect(&OnResourceReadySignalSVG);
3020 application.GetScene().Add(imageView);
3021 DALI_TEST_CHECK(imageView);
3023 application.SendNotification();
3024 application.Render();
3026 // Check whether Image Visual transforms on ImageVieiw::OnRelayout()
3027 Toolkit::Internal::Control& controlImpl = Toolkit::Internal::GetImplementation(imageView);
3028 Toolkit::Visual::Base imageVisual = DevelControl::GetVisual(controlImpl, ImageView::Property::IMAGE);
3029 Property::Map resultMap;
3030 imageVisual.CreatePropertyMap(resultMap);
3032 Property::Value* transformValue = resultMap.Find(Visual::Property::TRANSFORM);
3033 DALI_TEST_CHECK(transformValue);
3034 Property::Map* retMap = transformValue->GetMap();
3035 DALI_TEST_CHECK(retMap);
3037 // Image Visual should be positioned depending on ImageView's padding
3038 DALI_TEST_EQUALS(retMap->Find(Visual::Transform::Property::SIZE)->Get<Vector2>(), Vector2(100, 100), TEST_LOCATION);
3040 Vector3 naturalSize = imageView.GetNaturalSize();
3041 DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
3042 DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
3047 int UtcDaliImageViewAsyncSVGLoading(void)
3049 ToolkitTestApplication application;
3051 tet_infoline("ImageView Testing SVG image async loading");
3054 ImageView imageView = ImageView::New();
3056 // Async loading is used - default value of SYNCHRONOUS_LOADING is false.
3057 Property::Map propertyMap;
3058 propertyMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
3059 propertyMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
3060 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
3062 application.GetScene().Add(imageView);
3063 DALI_TEST_CHECK(imageView);
3065 application.SendNotification();
3068 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3070 application.SendNotification();
3071 application.Render(16);
3073 Vector3 naturalSize = imageView.GetNaturalSize();
3074 DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
3075 DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
3080 int UtcDaliImageViewSVGLoadingSyncSetInvalidValue(void)
3082 ToolkitTestApplication application;
3084 tet_infoline("ImageView Testing SVG image async loading");
3088 ImageView imageView = ImageView::New();
3090 // Sync loading is used
3091 Property::Map syncLoadingMap;
3092 syncLoadingMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
3093 syncLoadingMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
3095 // Check to set invalid value
3096 // The SYNCHRONOUS_LOADING property must be set to the bool value.
3097 // Check if error log is outputted when setting other value like string.
3098 // Even if the wrong value is set, the image will be shown normally, and the synchronous value should be the default value(false).
3099 syncLoadingMap.Insert(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, std::to_string(5));
3100 imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
3102 application.GetScene().Add(imageView);
3103 DALI_TEST_CHECK(imageView);
3105 application.SendNotification();
3108 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3110 application.SendNotification();
3111 application.Render(16);
3113 Vector3 naturalSize = imageView.GetNaturalSize();
3114 DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
3115 DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
3117 Property::Value value = imageView.GetProperty(ImageView::Property::IMAGE);
3118 Property::Map* map = value.GetMap();
3119 DALI_TEST_CHECK(map);
3121 Property::Value* sync = map->Find(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING);
3122 DALI_TEST_CHECK(sync);
3123 DALI_TEST_EQUALS(false, sync->Get<bool>(), TEST_LOCATION);
3128 int UtcDaliImageViewSvgLoadingFailureLocalFile(void)
3130 // Local svg file - invalid file path
3132 ToolkitTestApplication application;
3134 TestGlAbstraction& gl = application.GetGlAbstraction();
3135 TraceCallStack& textureTrace = gl.GetTextureTrace();
3136 textureTrace.Enable(true);
3138 gResourceReadySignalFired = false;
3140 ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/foo.svg");
3141 imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
3142 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
3144 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
3146 application.GetScene().Add(imageView);
3148 application.SendNotification();
3150 // loading started, this waits for the loader thread - load
3151 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3153 application.SendNotification();
3154 application.Render(16);
3156 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
3157 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
3158 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
3160 // Should be shown a broken image
3161 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
3162 DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
3165 // Local svg file - invalid file path without size set
3167 ToolkitTestApplication application;
3169 TestGlAbstraction& gl = application.GetGlAbstraction();
3170 TraceCallStack& textureTrace = gl.GetTextureTrace();
3171 textureTrace.Enable(true);
3173 gResourceReadySignalFired = false;
3174 textureTrace.Reset();
3176 ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/foo.svg");
3177 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
3179 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
3181 application.GetScene().Add(imageView);
3183 application.SendNotification();
3185 // loading started, this waits for the loader thread - load & rasterize
3186 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3188 application.SendNotification();
3189 application.Render(16);
3191 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
3192 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
3193 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
3195 // Should be shown a broken image
3196 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
3197 DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
3200 // Local svg file - invalid file
3202 ToolkitTestApplication application;
3204 TestGlAbstraction& gl = application.GetGlAbstraction();
3205 TraceCallStack& textureTrace = gl.GetTextureTrace();
3206 textureTrace.Enable(true);
3208 gResourceReadySignalFired = false;
3209 textureTrace.Reset();
3211 ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/invalid.svg");
3212 imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
3213 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
3215 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
3217 application.GetScene().Add(imageView);
3219 application.SendNotification();
3221 // loading started, this waits for the loader thread - load & rasterize
3222 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3224 application.SendNotification();
3225 application.Render(16);
3227 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
3228 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
3229 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
3231 // Should be shown a broken image
3232 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
3233 DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
3239 int UtcDaliImageViewSvgLoadingFailureRemoteFile01(void)
3243 ToolkitTestApplication application;
3245 TestGlAbstraction& gl = application.GetGlAbstraction();
3246 TraceCallStack& textureTrace = gl.GetTextureTrace();
3247 textureTrace.Enable(true);
3249 gResourceReadySignalFired = false;
3251 ImageView imageView = ImageView::New("https://127.0.0.1/foobar.svg");
3252 imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
3253 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
3255 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
3257 application.GetScene().Add(imageView);
3259 application.SendNotification();
3261 // loading started, this waits for the loader thread - load & rasterize
3262 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3264 application.SendNotification();
3265 application.Render(16);
3267 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
3268 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
3269 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
3271 // Should be shown a broken image
3272 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
3273 DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
3279 int UtcDaliImageViewSvgLoadingFailureRemoteFile02(void)
3281 // Remote svg file without size set
3283 ToolkitTestApplication application;
3285 TestGlAbstraction& gl = application.GetGlAbstraction();
3286 TraceCallStack& textureTrace = gl.GetTextureTrace();
3287 textureTrace.Enable(true);
3289 gResourceReadySignalFired = false;
3291 ImageView imageView = ImageView::New("https://127.0.0.1/foobar.svg");
3292 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
3294 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
3296 application.GetScene().Add(imageView);
3298 application.SendNotification();
3300 // loading started, this waits for the loader thread - load & rasterize
3301 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3303 application.SendNotification();
3304 application.Render(16);
3306 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
3307 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
3308 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
3310 // Should be shown a broken image
3311 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
3312 DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
3318 int UtcDaliImageViewSvgRasterizationFailure(void)
3320 ToolkitTestApplication application;
3322 gResourceReadySignalFired = false;
3324 TestGlAbstraction& gl = application.GetGlAbstraction();
3325 TraceCallStack& textureTrace = gl.GetTextureTrace();
3326 textureTrace.Enable(true);
3328 ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/invalid1.svg");
3329 imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
3330 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
3332 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
3334 application.GetScene().Add(imageView);
3336 application.SendNotification();
3338 // Wait for loading & rasterization
3339 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
3341 application.SendNotification();
3342 application.Render(16);
3344 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
3345 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
3346 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
3348 // Should be shown a broken image
3349 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
3350 DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
3355 int UtcDaliImageViewSvgChageSize(void)
3357 ToolkitTestApplication application;
3359 TestGlAbstraction& gl = application.GetGlAbstraction();
3360 TraceCallStack& textureTrace = gl.GetTextureTrace();
3361 textureTrace.Enable(true);
3363 ImageView imageView = ImageView::New(TEST_SVG_FILE_NAME);
3364 application.GetScene().Add(imageView);
3366 application.SendNotification();
3368 // Wait for loading & rasterization
3369 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
3371 application.SendNotification();
3372 application.Render(16);
3374 DALI_TEST_EQUALS(Test::VectorImageRenderer::GetLoadCount(), 1, TEST_LOCATION);
3376 // Change actor size, then rasterization should be done again
3377 imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
3379 application.SendNotification();
3381 // Wait for rasterization
3382 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3384 application.SendNotification();
3385 application.Render(16);
3387 // We should not load the file again.
3388 DALI_TEST_EQUALS(Test::VectorImageRenderer::GetLoadCount(), 1, TEST_LOCATION);
3393 int UtcDaliImageViewSvgAtlasing(void)
3395 ToolkitTestApplication application;
3397 TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
3399 callStack.Enable(true);
3401 Property::Map propertyMap;
3402 propertyMap["url"] = TEST_SVG_FILE_NAME;
3403 propertyMap["atlasing"] = true;
3405 ImageView imageView = ImageView::New();
3406 imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
3407 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
3408 application.GetScene().Add(imageView);
3410 application.SendNotification();
3412 // Wait for loading & rasterization
3413 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
3415 application.SendNotification();
3416 application.Render(16);
3419 TraceCallStack::NamedParams params1;
3420 params1["width"] << 100;
3421 params1["height"] << 100;
3422 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params1), true, TEST_LOCATION);
3424 imageView.SetProperty(Actor::Property::SIZE, Vector2(600.f, 600.f));
3426 application.SendNotification();
3428 // Wait for rasterization
3429 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3433 application.SendNotification();
3434 application.Render(16);
3437 TraceCallStack::NamedParams params2;
3438 params2["width"] << 600;
3439 params2["height"] << 600;
3440 DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexImage2D", params2), true, TEST_LOCATION);
3445 int UtcDaliImageViewTVGLoading(void)
3447 ToolkitTestApplication application;
3449 tet_infoline("ImageView Testing TVG image loading");
3452 ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/test.tvg");
3453 application.GetScene().Add(imageView);
3454 DALI_TEST_CHECK(imageView);
3456 application.SendNotification();
3458 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3460 application.SendNotification();
3461 application.Render(16);
3463 Vector3 naturalSize = imageView.GetNaturalSize();
3465 DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
3466 DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
3471 int UtcDaliImageViewSvgDesiredSize01(void)
3473 ToolkitTestApplication application;
3475 TestGlAbstraction& gl = application.GetGlAbstraction();
3476 TraceCallStack& textureTrace = gl.GetTextureTrace();
3477 textureTrace.Enable(true);
3479 int desiredWidth = 100, desiredHeight = 150;
3480 ImageView imageView = ImageView::New(TEST_SVG_FILE_NAME, ImageDimensions(desiredWidth, desiredHeight));
3482 application.GetScene().Add(imageView);
3484 application.SendNotification();
3486 // Wait for loading & rasterization
3487 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
3489 application.SendNotification();
3490 application.Render(16);
3493 std::stringstream out;
3494 out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight;
3495 DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str()));
3501 int UtcDaliImageViewSvgDesiredSize02(void)
3503 ToolkitTestApplication application;
3505 TestGlAbstraction& gl = application.GetGlAbstraction();
3506 TraceCallStack& textureTrace = gl.GetTextureTrace();
3507 textureTrace.Enable(true);
3509 int desiredWidth = 150, desiredHeight = 100;
3510 ImageView imageView = ImageView::New();
3511 imageView[ImageView::Property::IMAGE] = Property::Map().Add("url", TEST_SVG_FILE_NAME).Add("desiredWidth", desiredWidth).Add("desiredHeight", desiredHeight);
3512 application.GetScene().Add(imageView);
3514 application.SendNotification();
3516 // Wait for loading & rasterization
3517 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
3519 application.SendNotification();
3520 application.Render(16);
3523 std::stringstream out;
3524 out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight;
3525 DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str()));
3531 int UtcDaliImageViewImageLoadFailure01(void)
3533 ToolkitTestApplication application;
3535 Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
3536 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL, TEST_BROKEN_IMAGE_S);
3537 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL, TEST_BROKEN_IMAGE_M);
3538 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE, TEST_BROKEN_IMAGE_L);
3540 std::string brokenUrl;
3541 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL);
3542 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_S, brokenUrl, TEST_LOCATION);
3544 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL);
3545 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_M, brokenUrl, TEST_LOCATION);
3547 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE);
3548 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_L, brokenUrl, TEST_LOCATION);
3550 ImageView imageView = ImageView::New("invalidUrl.png");
3551 imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
3553 application.GetScene().Add(imageView);
3554 application.SendNotification();
3555 application.Render(16);
3557 // loading started, this waits for the loader thread
3558 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3563 int UtcDaliImageViewImageLoadFailure02(void)
3565 ToolkitTestApplication application;
3567 Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
3568 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL, TEST_BROKEN_IMAGE_DEFAULT);
3569 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL, TEST_BROKEN_IMAGE_M);
3570 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE, TEST_BROKEN_IMAGE_L);
3572 std::string brokenUrl;
3573 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL);
3574 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_DEFAULT, brokenUrl, TEST_LOCATION);
3576 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL);
3577 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_M, brokenUrl, TEST_LOCATION);
3579 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE);
3580 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_L, brokenUrl, TEST_LOCATION);
3582 ImageView imageView = ImageView::New("invalidUrl.png");
3583 imageView.SetProperty(Actor::Property::SIZE, Vector2(30.f, 30.f));
3584 application.GetScene().Add(imageView);
3585 application.SendNotification();
3586 application.Render(16);
3588 // loading started, this waits for the loader thread
3589 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3594 int UtcDaliImageViewImageLoadFailure03(void)
3596 ToolkitTestApplication application;
3598 Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
3599 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL, TEST_BROKEN_IMAGE_01);
3600 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL, TEST_BROKEN_IMAGE_02);
3602 std::string brokenUrl;
3603 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL);
3604 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_01, brokenUrl, TEST_LOCATION);
3606 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL);
3607 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_02, brokenUrl, TEST_LOCATION);
3609 ImageView imageView = ImageView::New("invalidUrl.png");
3610 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
3611 application.GetScene().Add(imageView);
3612 application.SendNotification();
3613 application.Render(16);
3615 // loading started, this waits for the loader thread
3616 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3621 int UtcDaliImageViewImageLoadFailure04(void)
3623 ToolkitTestApplication application;
3625 ImageView imageView = ImageView::New("invalidUrl.png");
3626 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
3627 application.GetScene().Add(imageView);
3628 application.SendNotification();
3629 application.Render(16);
3631 // loading started, this waits for the loader thread
3632 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3634 Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
3635 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL, TEST_BROKEN_IMAGE_S);
3636 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL, "invalidBroken.png");
3637 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE, TEST_BROKEN_IMAGE_L);
3639 ImageView imageView2 = ImageView::New("invalidUrl.png");
3640 imageView2.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
3641 application.GetScene().Add(imageView2);
3643 std::string brokenUrl;
3644 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL);
3645 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_S, brokenUrl, TEST_LOCATION);
3647 brokenUrl = DevelStyleManager::GetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE);
3648 DALI_TEST_EQUALS(TEST_BROKEN_IMAGE_L, brokenUrl, TEST_LOCATION);
3650 application.SendNotification();
3651 application.Render(16);
3653 // loading started, this waits for the loader thread
3654 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3656 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL, "invalidBroken.9.png");
3658 ImageView imageView3 = ImageView::New("invalidUrl.png");
3659 imageView3.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
3660 application.GetScene().Add(imageView3);
3662 application.SendNotification();
3663 application.Render(16);
3665 // loading started, this waits for the loader thread
3666 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
3673 static int gResourceReadySignalCounter = 0;
3675 void OnResourceReadySignal01(Control control)
3677 gResourceReadySignalCounter++;
3679 if(control.GetVisualResourceStatus(ImageView::Property::IMAGE) == Visual::ResourceStatus::READY)
3681 if(gResourceReadySignalCounter == 1)
3684 // It makes the first new visual be deleted immediately
3685 ImageView::DownCast(control).SetImage(gImage_34_RGBA);
3686 ImageView::DownCast(control).SetImage(gImage_34_RGBA);
3689 else if(control.GetVisualResourceStatus(ImageView::Property::IMAGE) == Visual::ResourceStatus::FAILED)
3691 // Make the resource ready immediately
3692 control[ImageView::Property::IMAGE] = gImage_600_RGB;
3696 void OnResourceReadySignal02(Control control)
3698 if(++gResourceReadySignalCounter == 1)
3700 // It makes the first new visual be deleted immediately
3701 // The first image will not be loaded.
3702 control[ImageView::Property::IMAGE] = Property::Map().Add(ImageVisual::Property::URL, gImage_600_RGB).Add(ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::NEVER);
3703 control[ImageView::Property::IMAGE] = TEST_IMAGE_1;
3707 ImageView gImageView1;
3708 ImageView gImageView2;
3709 ImageView gImageView3;
3710 ImageView gImageView4;
3712 void OnResourceReadySignal03(Control control)
3714 if(gResourceReadySignalCounter == 0)
3717 // 1. Use cached image, then LoadComplete will be called right after OnResourceReadySignal03.
3718 gImageView2[ImageView::Property::IMAGE] = gImage_34_RGBA;
3720 // 2. Load a new image
3721 gImageView3[ImageView::Property::IMAGE] = TEST_IMAGE_1;
3723 // 3. Use the new image again
3724 gImageView1[ImageView::Property::IMAGE] = TEST_IMAGE_1;
3725 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal03);
3727 else if(gResourceReadySignalCounter == 1)
3729 // This is called from TextureManager::ProcessQueuedTextures().
3730 gImageView1.Unparent();
3731 gImageView1.Reset();
3733 gResourceReadySignalCounter++;
3736 void OnSimpleResourceReadySignal(Control control)
3738 // simply increate counter
3739 gResourceReadySignalCounter++;
3742 int gResourceReadySignal04ComesOrder = 0;
3744 void OnResourceReadySignal04(Control control)
3746 gResourceReadySignalCounter++;
3747 tet_printf("rc %d\n", gResourceReadySignalCounter);
3748 if(gResourceReadySignalCounter == 1)
3750 auto scene = gImageView1.GetParent();
3752 // Request load something
3753 // We hope this request result is return later than gImageView2.
3754 gImageView3 = ImageView::New(TEST_IMAGE_1);
3755 gImageView3.ResourceReadySignal().Connect(&OnResourceReadySignal04);
3756 scene.Add(gImageView3);
3757 gImageView4 = ImageView::New(TEST_IMAGE_2);
3758 gImageView4.ResourceReadySignal().Connect(&OnResourceReadySignal04);
3759 scene.Add(gImageView4);
3761 if(control == gImageView1)
3763 gResourceReadySignal04ComesOrder = 1;
3767 gResourceReadySignal04ComesOrder = 2;
3770 if(gResourceReadySignalCounter == 2)
3772 if(gResourceReadySignal04ComesOrder == 1 && control == gImageView2)
3774 // Scene off first one.
3775 gImageView1.Unparent();
3777 // Scene off second one.
3778 gImageView2.Unparent();
3780 else if(gResourceReadySignal04ComesOrder == 2 && control == gImageView1)
3782 // Scene off first one.
3783 gImageView2.Unparent();
3785 // Scene off second one.
3786 gImageView1.Unparent();
3790 // We can't check that this utc fail case. just pass always when we come here.
3791 gResourceReadySignal04ComesOrder = -1;
3794 // If we don't seperate index of FreeList area
3795 // and if we don't queue remove during obversing,
3796 // cache index become something invalid data.
3797 // In this case, some strange observer can be called.
3798 // For example, gImageView4.LoadComplete will be called.
3802 void OnResourceReadySignal05(Control control)
3804 gResourceReadySignalCounter++;
3806 // Request load with same image
3807 // NOTE : The url must not be same as gImageView1
3808 const int viewCount = 4;
3809 for(int i = 0; i < viewCount; ++i)
3811 gImageView1.Add(ImageView::New("invalid2.jpg"));
3815 int gResourceReadySignal06ComesOrder = 0;
3817 void OnResourceReadySignal06(Control control)
3819 gResourceReadySignalCounter++;
3820 if(gResourceReadySignalCounter == 1)
3822 auto scene = gImageView1.GetParent();
3824 // Request load something
3825 // We hope this request result is return later than gImageView2.
3828 map1[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
3829 map1[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
3831 gImageView3 = ImageView::New();
3832 gImageView3.SetProperty(Toolkit::ImageView::Property::IMAGE, map1);
3833 gImageView3.ResourceReadySignal().Connect(&OnResourceReadySignal06);
3836 map2[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2;
3837 map2[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_S;
3838 gImageView4 = ImageView::New();
3839 gImageView4.SetProperty(Toolkit::ImageView::Property::IMAGE, map2);
3840 gImageView4.ResourceReadySignal().Connect(&OnResourceReadySignal06);
3842 if(control == gImageView1)
3844 gResourceReadySignal06ComesOrder = 1;
3848 gResourceReadySignal06ComesOrder = 2;
3851 if(gResourceReadySignalCounter == 2)
3853 if(gResourceReadySignal06ComesOrder == 1 && control == gImageView2)
3855 // Scene off first one.
3856 gImageView1.Unparent();
3858 // Scene off second one.
3859 gImageView2.Unparent();
3861 else if(gResourceReadySignal06ComesOrder == 2 && control == gImageView1)
3863 // Scene off first one.
3864 gImageView2.Unparent();
3866 // Scene off second one.
3867 gImageView1.Unparent();
3871 // We can't check that this utc fail case. just pass always when we come here.
3872 gResourceReadySignal06ComesOrder = -1;
3875 // If we don't seperate index of FreeList area
3876 // and if we don't queue remove during obversing,
3877 // cache index become something invalid data.
3878 // In this case, some strange observer can be called.
3879 // For example, gImageView4.LoadComplete will be called.
3883 void OnResourceReadySignal07(Control control)
3885 gResourceReadySignalCounter++;
3886 // Load masked image
3887 tet_printf("rc %d %d\n", gResourceReadySignalCounter, static_cast<bool>(gImageView2));
3891 auto scene = gImageView1.GetParent();
3894 map1[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
3895 map1[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
3897 gImageView2 = ImageView::New();
3898 gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map1);
3899 gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal07);
3901 scene.Add(gImageView2);
3905 void OnResourceReadySignal08(Control control)
3907 gResourceReadySignalCounter++;
3911 gImageView1.Unparent();
3912 gImageView1.Reset();
3916 gImageView2.Unparent();
3917 gImageView2.Reset();
3921 std::size_t gResourceReadySignal09Emitted = false;
3923 void OnResourceReadySignal09(Control control)
3925 gResourceReadySignalCounter++;
3927 if(gImageView1 && !gResourceReadySignal09Emitted)
3929 gResourceReadySignal09Emitted = true;
3930 gImageView1.ResourceReadySignal().Disconnect(&OnResourceReadySignal09);
3932 // Try to load cached invalid nine patch image. It will request load now.
3933 gImageView1.SetImage(TEST_INVALID_NPATCH_FILE_NAME_01);
3934 gImageView2.SetImage(TEST_INVALID_NPATCH_FILE_NAME_01);
3936 // Destroy all visuals immediatly.
3937 gImageView1.Unparent();
3938 gImageView1.Reset();
3939 gImageView2.Unparent();
3940 gImageView2.Reset();
3943 constexpr int gResourceReadySignal10MaxCounter = 5;
3945 void OnResourceReadySignal10(Control control)
3947 gResourceReadySignalCounter++;
3949 tet_printf("OnResourceReadySignal10 comes!\n");
3950 if(gResourceReadySignalCounter < gResourceReadySignal10MaxCounter)
3952 tet_printf("OnResourceReadySignal10 Set image\n");
3953 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, gImage_34_RGBA);
3954 tet_printf("OnResourceReadySignal10 Set image done\n");
3958 void OnResourceReadySignal11(Control control)
3960 gResourceReadySignalCounter++;
3964 auto scene = gImageView1.GetParent();
3966 // Try to load animated image visual here which is already cached, and then ignore forcely.
3969 map1[Toolkit::ImageVisual::Property::URL] = TEST_GIF_FILE_NAME;
3971 gImageView2 = ImageView::New();
3972 gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map1);
3974 gImageView3 = ImageView::New();
3975 gImageView3.SetProperty(Toolkit::ImageView::Property::IMAGE, map1);
3977 scene.Add(gImageView2);
3978 gImageView2.Unparent();
3980 scene.Add(gImageView3);
3981 gImageView3.Unparent();
3982 gImageView3.Reset(); // Destroy visual
3988 int UtcDaliImageViewSetImageOnResourceReadySignal01(void)
3990 tet_infoline("Test setting image from within signal handler.");
3992 ToolkitTestApplication application;
3994 gResourceReadySignalCounter = 0;
3996 ImageView imageView = ImageView::New(gImage_34_RGBA);
3997 imageView.ResourceReadySignal().Connect(&OnResourceReadySignal01);
3999 application.GetScene().Add(imageView);
4001 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4003 application.SendNotification();
4004 application.Render();
4006 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4008 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
4010 // Create a new ImageView to cache the image
4011 ImageView imageView1 = ImageView::New(gImage_600_RGB);
4012 application.GetScene().Add(imageView1);
4014 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4016 application.SendNotification();
4017 application.Render();
4020 gResourceReadySignalCounter = 0;
4022 imageView[ImageView::Property::IMAGE] = "invalid.jpg";
4024 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4026 application.SendNotification();
4027 application.Render();
4029 // Run idle callback
4030 application.RunIdles();
4032 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4034 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
4039 int UtcDaliImageViewSetImageOnResourceReadySignal02(void)
4041 tet_infoline("Test setting image from within signal handler.");
4043 ToolkitTestApplication application;
4045 gResourceReadySignalCounter = 0;
4047 ImageView imageView = ImageView::New(gImage_34_RGBA);
4048 imageView.ResourceReadySignal().Connect(&OnResourceReadySignal02);
4050 application.GetScene().Add(imageView);
4052 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4054 application.SendNotification();
4055 application.Render();
4057 // Wait for loading an image
4058 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4060 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4062 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
4067 int UtcDaliImageViewSetImageOnResourceReadySignal03(void)
4069 tet_infoline("Test setting image from within signal handler.");
4071 ToolkitTestApplication application;
4073 gResourceReadySignalCounter = 0;
4075 gImageView1 = ImageView::New(gImage_34_RGBA);
4076 application.GetScene().Add(gImageView1);
4079 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4081 gImageView2 = ImageView::New(gImage_600_RGB);
4082 gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal03);
4083 application.GetScene().Add(gImageView2);
4085 gImageView3 = ImageView::New();
4086 application.GetScene().Add(gImageView3);
4088 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
4090 application.SendNotification();
4091 application.Render();
4096 int UtcDaliImageViewOnResourceReadySignalWithBrokenAlphaMask01(void)
4098 tet_infoline("Test signal handler when image / mask image is broken.");
4100 ToolkitTestApplication application;
4102 auto TestResourceReadyUrl = [&application](int eventTriggerCount, bool isSynchronous, const std::string& url, const std::string& mask, const char* location) {
4103 gResourceReadySignalCounter = 0;
4106 map[Toolkit::ImageVisual::Property::URL] = url;
4109 map[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = mask;
4111 map[Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING] = isSynchronous;
4113 ImageView imageView = ImageView::New();
4114 imageView[Toolkit::ImageView::Property::IMAGE] = map;
4115 imageView[Actor::Property::SIZE] = Vector2(100.0f, 200.0f);
4116 imageView.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal);
4118 application.GetScene().Add(imageView);
4119 application.SendNotification();
4120 application.Render();
4125 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(eventTriggerCount), true, location);
4127 tet_printf("test %s [sync:%d] signal fired\n", url.c_str(), isSynchronous ? 1 : 0);
4128 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, location);
4130 imageView.Unparent();
4133 for(int synchronous = 0; synchronous <= 1; synchronous++)
4135 tet_printf("Test normal case (sync:%d)\n", synchronous);
4136 TestResourceReadyUrl(1, synchronous, gImage_600_RGB, "", TEST_LOCATION);
4137 TestResourceReadyUrl(3, synchronous, gImage_600_RGB, gImage_34_RGBA, TEST_LOCATION); // 3 event trigger required : 2 image load + 1 apply mask
4139 tet_printf("Test broken image case (sync:%d)\n", synchronous);
4140 TestResourceReadyUrl(1, synchronous, "invalid.jpg", "", TEST_LOCATION);
4141 TestResourceReadyUrl(2, synchronous, "invalid.jpg", gImage_34_RGBA, TEST_LOCATION);
4143 tet_printf("Test broken mask image case (sync:%d)\n", synchronous);
4144 TestResourceReadyUrl(2, synchronous, gImage_600_RGB, "invalid.png", TEST_LOCATION);
4146 tet_printf("Test broken both image, mask image case (sync:%d)\n", synchronous);
4147 TestResourceReadyUrl(2, synchronous, "invalid.jpg", "invalid.png", TEST_LOCATION);
4153 int UtcDaliImageViewOnResourceReadySignalWithBrokenAlphaMask02(void)
4155 tet_infoline("Test signal handler when image try to use cached-and-broken mask image.");
4157 ToolkitTestApplication application;
4159 gResourceReadySignalCounter = 0;
4161 auto TestBrokenMaskResourceReadyUrl = [&application](const std::string& url, const char* location) {
4163 map[Toolkit::ImageVisual::Property::URL] = url;
4164 // Use invalid mask url
4165 map[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = "invalid.png";
4167 ImageView imageView = ImageView::New();
4168 imageView[Toolkit::ImageView::Property::IMAGE] = map;
4169 imageView[Actor::Property::SIZE] = Vector2(100.0f, 200.0f);
4170 imageView.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal);
4172 application.GetScene().Add(imageView);
4174 // Don't unparent imageView, for keep the cache.
4177 // Use more than 4 images (The number of LocalImageLoadThread)
4178 const std::vector<std::string> testUrlList = {gImage_34_RGBA, gImage_600_RGB, "invalid.jpg" /* invalid url */, TEST_IMAGE_1, TEST_IMAGE_2, TEST_BROKEN_IMAGE_DEFAULT};
4180 int expectResourceReadySignalCounter = 0;
4182 for(auto& url : testUrlList)
4184 TestBrokenMaskResourceReadyUrl(url, TEST_LOCATION);
4185 expectResourceReadySignalCounter++;
4188 // Remain 1 signal due to we use #URL + 1 mask image.
4189 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(expectResourceReadySignalCounter + 1), true, TEST_LOCATION);
4190 application.SendNotification();
4191 application.Render();
4192 DALI_TEST_EQUALS(gResourceReadySignalCounter, expectResourceReadySignalCounter, TEST_LOCATION);
4197 int UtcDaliImageViewCheckVariousCaseSendOnResourceReadySignal(void)
4199 tet_infoline("Test signal handler various case.");
4201 auto TestResourceReadyUrl = [](int eventTriggerCount, bool isSynchronous, bool loadSuccess, const std::string& url, const std::string& mask, const char* location) {
4202 ToolkitTestApplication application;
4204 gResourceReadySignalCounter = 0;
4207 map[Toolkit::ImageVisual::Property::URL] = url;
4210 map[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = mask;
4212 map[Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING] = isSynchronous;
4214 ImageView imageView = ImageView::New();
4215 imageView[Toolkit::ImageView::Property::IMAGE] = map;
4216 imageView[Actor::Property::SIZE] = Vector2(100.0f, 200.0f);
4217 imageView.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal);
4219 application.GetScene().Add(imageView);
4220 application.SendNotification();
4221 application.Render();
4224 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(eventTriggerCount), true, location);
4226 tet_printf("test %s [sync:%d] signal fired\n", url.c_str(), isSynchronous ? 1 : 0);
4227 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, location);
4228 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(Toolkit::ImageView::Property::IMAGE), loadSuccess ? Toolkit::Visual::ResourceStatus::READY : Toolkit::Visual::ResourceStatus::FAILED, location);
4230 imageView.Unparent();
4233 auto TestAuxiliaryResourceReadyUrl = [](bool isSynchronous, bool loadSuccess, const std::string& url, const std::string& auxiliaryUrl, const char* location) {
4234 ToolkitTestApplication application;
4236 gResourceReadySignalCounter = 0;
4239 map[Toolkit::ImageVisual::Property::URL] = url;
4240 map[Toolkit::DevelImageVisual::Property::AUXILIARY_IMAGE] = auxiliaryUrl;
4241 map[Toolkit::DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA] = 0.5f;
4242 map[Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING] = isSynchronous;
4244 ImageView imageView = ImageView::New();
4245 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4246 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
4247 imageView.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal);
4248 application.GetScene().Add(imageView);
4250 application.SendNotification();
4251 application.Render();
4256 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, location);
4259 tet_printf("test %s [sync:%d] signal fired\n", url.c_str(), isSynchronous ? 1 : 0);
4260 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, location);
4261 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(Toolkit::ImageView::Property::IMAGE), loadSuccess ? Toolkit::Visual::ResourceStatus::READY : Toolkit::Visual::ResourceStatus::FAILED, TEST_LOCATION);
4263 imageView.Unparent();
4266 // Case 1 : asynchronous loading
4267 tet_printf("Test invalid single simple image Asynchronous\n");
4270 TestResourceReadyUrl(1, 0, 1, gImage_600_RGB, "", TEST_LOCATION);
4271 TestResourceReadyUrl(2, 0, 1, TEST_SVG_FILE_NAME, "", TEST_LOCATION); // load & rasterize
4272 TestResourceReadyUrl(1, 0, 1, TEST_BROKEN_IMAGE_L, "", TEST_LOCATION);
4274 TestResourceReadyUrl(2, 0, 1, TEST_GIF_FILE_NAME, "", TEST_LOCATION); // 2 image loading - batch size
4275 TestResourceReadyUrl(2, 0, 1, TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME, "", TEST_LOCATION); // load & rasterize
4277 TestResourceReadyUrl(3, 0, 1, gImage_600_RGB, gImage_34_RGBA, TEST_LOCATION); // 2 image loading + 1 applymask
4279 TestAuxiliaryResourceReadyUrl(0, 1, TEST_BROKEN_IMAGE_L, gImage_34_RGBA, TEST_LOCATION);
4282 TestResourceReadyUrl(1, 0, 0, "invalid.jpg", "", TEST_LOCATION);
4283 TestResourceReadyUrl(1, 0, 0, "invalid.svg", "", TEST_LOCATION);
4284 TestResourceReadyUrl(1, 0, 0, "invalid.9.png", "", TEST_LOCATION);
4285 TestResourceReadyUrl(1, 0, 0, "invalid.gif", "", TEST_LOCATION); // 1 image loading
4286 TestResourceReadyUrl(1, 0, 0, "invalid.json", "", TEST_LOCATION); // 0 rasterize
4288 TestResourceReadyUrl(2, 0, 0, "invalid.jpg", "invalid.png", TEST_LOCATION); // 2 image loading
4289 TestResourceReadyUrl(2, 0, 1, gImage_600_RGB, "invalid.png", TEST_LOCATION); // 2 image loading
4290 TestResourceReadyUrl(2, 0, 0, "invalid.jpg", gImage_34_RGBA, TEST_LOCATION); // 2 image loading
4292 TestAuxiliaryResourceReadyUrl(0, 0, "invalid.9.png", "invalid.png", TEST_LOCATION);
4293 TestAuxiliaryResourceReadyUrl(0, 1, TEST_BROKEN_IMAGE_L, "invalid.png", TEST_LOCATION);
4294 TestAuxiliaryResourceReadyUrl(0, 0, "invalid.9.png", gImage_34_RGBA, TEST_LOCATION);
4296 // Case 2 : Synchronous loading
4297 tet_printf("Test invalid single simple image Synchronous\n");
4300 TestResourceReadyUrl(0, 1, 1, gImage_600_RGB, "", TEST_LOCATION);
4301 TestResourceReadyUrl(0, 1, 1, TEST_SVG_FILE_NAME, "", TEST_LOCATION); // synchronous rasterize
4302 TestResourceReadyUrl(0, 1, 1, TEST_BROKEN_IMAGE_L, "", TEST_LOCATION);
4304 TestResourceReadyUrl(1, 1, 1, TEST_GIF_FILE_NAME, "", TEST_LOCATION); // first frame image loading sync + second frame image loading async
4306 TestResourceReadyUrl(0, 1, 1, gImage_600_RGB, gImage_34_RGBA, TEST_LOCATION);
4308 TestAuxiliaryResourceReadyUrl(1, 1, TEST_BROKEN_IMAGE_L, gImage_34_RGBA, TEST_LOCATION);
4311 TestResourceReadyUrl(0, 1, 0, "invalid.jpg", "", TEST_LOCATION);
4312 TestResourceReadyUrl(0, 1, 0, "invalid.svg", "", TEST_LOCATION);
4313 TestResourceReadyUrl(0, 1, 0, "invalid.9.png", "", TEST_LOCATION);
4314 TestResourceReadyUrl(0, 1, 0, "invalid.gif", "", TEST_LOCATION);
4316 TestResourceReadyUrl(0, 1, 0, "invalid.jpg", "invalid.png", TEST_LOCATION);
4317 TestResourceReadyUrl(0, 1, 1, gImage_600_RGB, "invalid.png", TEST_LOCATION);
4318 TestResourceReadyUrl(0, 1, 0, "invalid.jpg", gImage_34_RGBA, TEST_LOCATION);
4320 TestAuxiliaryResourceReadyUrl(1, 0, "invalid.9.png", "invalid.png", TEST_LOCATION);
4321 TestAuxiliaryResourceReadyUrl(1, 1, TEST_BROKEN_IMAGE_L, "invalid.png", TEST_LOCATION);
4322 TestAuxiliaryResourceReadyUrl(1, 0, "invalid.9.png", gImage_34_RGBA, TEST_LOCATION);
4327 int UtcDaliImageViewSetImageOnResourceReadySignal04(void)
4329 tet_infoline("Test texturemanager's remove queue works well within signal handler.");
4331 ToolkitTestApplication application;
4333 gResourceReadySignalCounter = 0;
4334 gResourceReadySignal04ComesOrder = 0;
4336 gImageView1 = ImageView::New("invalid.jpg"); // request invalid image, to make loading failed fast.
4337 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal04);
4338 application.GetScene().Add(gImageView1);
4340 gImageView2 = ImageView::New("invalid.png"); // request invalid image, to make loading failed fast.
4341 gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal04);
4342 application.GetScene().Add(gImageView2);
4344 application.SendNotification();
4345 application.Render();
4347 tet_infoline("Try to load 2 invalid image");
4349 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
4350 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4352 tet_infoline("load done");
4354 // We can test this UTC only if gImageView1 and gImageView2 loaded done.
4355 if(gResourceReadySignal04ComesOrder == -1)
4357 tet_infoline("Bad news.. gImageView3 or gImageView4 loaded faster than others. just skip this UTC");
4361 // gImageView3 and gImageView4 load must not be successed yet.
4362 DALI_TEST_EQUALS(gImageView3.GetRendererCount(), 0u, TEST_LOCATION);
4363 DALI_TEST_EQUALS(gImageView4.GetRendererCount(), 0u, TEST_LOCATION);
4365 application.SendNotification();
4366 application.Render();
4368 tet_infoline("Try to load 2 valid image");
4370 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
4371 DALI_TEST_EQUALS(gResourceReadySignalCounter, 4, TEST_LOCATION);
4373 tet_infoline("load done");
4375 // gImageView3 and gImageView4 load must be successed now.
4376 DALI_TEST_EQUALS(gImageView3.GetRendererAt(0).GetTextures().GetTextureCount(), 1u, TEST_LOCATION);
4377 DALI_TEST_EQUALS(gImageView4.GetRendererAt(0).GetTextures().GetTextureCount(), 1u, TEST_LOCATION);
4382 int UtcDaliImageViewSetImageOnResourceReadySignal05(void)
4384 tet_infoline("Test multiple views with same image during ResourceReady load the image only 1 times");
4386 ToolkitTestApplication application;
4388 gResourceReadySignalCounter = 0;
4390 gImageView1 = ImageView::New("invalid.jpg"); // request invalid image, to make loading failed fast.
4391 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal05);
4392 application.GetScene().Add(gImageView1);
4394 application.SendNotification();
4395 application.Render();
4397 tet_infoline("Try to load 1 invalid.jpg image");
4398 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4399 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
4401 tet_infoline("Try to load 1 invalid2.jpg image");
4402 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4404 tet_infoline("Now we don't have any image to be loaded. Check event thread trigger failed.");
4405 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 1), false, TEST_LOCATION);
4407 gImageView1.Unparent();
4408 gImageView1.Reset();
4412 int UtcDaliImageViewSetImageOnResourceReadySignal06(void)
4414 tet_infoline("Test texturemanager's remove image & mask queue works well within signal handler.");
4416 ToolkitTestApplication application;
4418 gResourceReadySignalCounter = 0;
4419 gResourceReadySignal06ComesOrder = 0;
4422 map[Toolkit::ImageVisual::Property::URL] = "invalid.jpg";
4423 map[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = "invalid.png";
4425 gImageView1 = ImageView::New(); // request invalid image, to make loading failed fast.
4426 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4427 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal06);
4428 application.GetScene().Add(gImageView1);
4430 gImageView2 = ImageView::New(); // request invalid image, to make loading failed fast.
4431 gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4432 gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal06);
4433 application.GetScene().Add(gImageView2);
4435 application.SendNotification();
4436 application.Render();
4438 tet_infoline("Try to load 2 invalid image");
4440 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
4441 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4443 tet_infoline("load done");
4445 // We can test this UTC only if gImageView1 and gImageView2 loaded done.
4446 if(gResourceReadySignal06ComesOrder == -1)
4448 tet_infoline("Bad news.. gImageView3 or gImageView4 loaded faster than others. just skip this UTC");
4452 // gImageView3 and gImageView4 load must not be successed yet.
4453 DALI_TEST_EQUALS(gImageView3.GetRendererCount(), 0u, TEST_LOCATION);
4454 DALI_TEST_EQUALS(gImageView4.GetRendererCount(), 0u, TEST_LOCATION);
4456 application.GetScene().Add(gImageView3);
4457 application.GetScene().Add(gImageView4);
4458 application.SendNotification();
4459 application.Render();
4461 tet_infoline("Try to load 2 valid image");
4463 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
4464 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4466 tet_infoline("Note that resource ready should not come now.");
4467 tet_infoline("Try to load remained 2 valid image + apply masking");
4469 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
4470 DALI_TEST_EQUALS(gResourceReadySignalCounter, 4, TEST_LOCATION);
4472 tet_infoline("Check all resource ready comes now.");
4477 int UtcDaliImageViewSetImageOnResourceReadySignal07(void)
4479 tet_infoline("Test texturemanager's remove image & mask queue works well within signal handler 02.");
4481 ToolkitTestApplication application;
4483 gResourceReadySignalCounter = 0;
4486 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
4488 // Clear image view for clear test
4492 gImageView1.Reset();
4496 gImageView2.Reset();
4499 gImageView1 = ImageView::New();
4500 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4501 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal07);
4502 application.GetScene().Add(gImageView1);
4504 application.SendNotification();
4505 application.Render();
4509 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4510 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
4512 tet_infoline("load image1 done");
4514 // Load gImageView2 and mask
4516 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
4517 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
4519 // gImageView2 mask apply done
4521 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4522 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4524 tet_infoline("load image2 done");
4528 int UtcDaliImageViewSetImageOnResourceReadySignal08(void)
4530 tet_infoline("Test remove npatch images during resource ready");
4532 ToolkitTestApplication application;
4534 gResourceReadySignalCounter = 0;
4537 map[Toolkit::ImageVisual::Property::URL] = TEST_BROKEN_IMAGE_M;
4539 // Clear image view for clear test
4543 gImageView1.Reset();
4547 gImageView2.Reset();
4550 // Case 1 : Remove all images during resource ready.
4553 gImageView1 = ImageView::New();
4554 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4555 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal08);
4556 application.GetScene().Add(gImageView1);
4558 application.SendNotification();
4559 application.Render();
4562 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4563 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
4565 application.SendNotification();
4566 application.Render();
4568 DALI_TEST_CHECK(true);
4572 // Exception should not happened
4573 DALI_TEST_CHECK(false);
4577 application.SendNotification();
4578 application.Render();
4580 gResourceReadySignalCounter = 0;
4582 // Case 2 : Remove all images when we use cached resource.
4585 gImageView1 = ImageView::New();
4586 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4587 gImageView1.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal);
4588 application.GetScene().Add(gImageView1);
4590 application.SendNotification();
4591 application.Render();
4594 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4595 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
4597 application.SendNotification();
4598 application.Render();
4600 gImageView2 = ImageView::New();
4601 gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4602 gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal08);
4603 application.GetScene().Add(gImageView2);
4604 DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
4606 application.SendNotification();
4607 application.Render();
4609 DALI_TEST_CHECK(true);
4613 // Exception should not happened
4614 DALI_TEST_CHECK(false);
4616 gResourceReadySignalCounter = 0;
4618 // Clear image view for clear test
4622 gImageView1.Reset();
4626 gImageView2.Reset();
4632 int UtcDaliImageViewSetImageOnResourceReadySignal09(void)
4634 tet_infoline("Test load invalid npatch images during invalid resource ready");
4636 ToolkitTestApplication application;
4638 gResourceReadySignalCounter = 0;
4641 map[Toolkit::ImageVisual::Property::URL] = TEST_INVALID_NPATCH_FILE_NAME_01;
4643 // Clear image view for clear test
4647 gImageView1.Reset();
4651 gImageView2.Reset();
4655 gImageView3.Reset();
4658 // Dummy view with npatch image
4659 ImageView dummyView = ImageView::New(TEST_BROKEN_IMAGE_M);
4660 application.GetScene().Add(dummyView);
4662 application.SendNotification();
4663 application.Render();
4664 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4665 application.SendNotification();
4666 application.Render();
4668 // Case 1 : Reload images during resource ready.
4671 gResourceReadySignal09Emitted = false;
4673 gImageView1 = ImageView::New();
4674 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4675 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal09);
4676 application.GetScene().Add(gImageView1);
4678 gImageView2 = ImageView::New();
4679 application.GetScene().Add(gImageView2);
4681 // Load TEST_INVALID_NPATCH_FILE_NAME_01
4682 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4684 // Load TEST_INVALID_NPATCH_FILE_NAME_01 one more times.
4685 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4687 application.SendNotification();
4688 application.Render();
4690 DALI_TEST_CHECK(true);
4694 // Exception should not happened
4695 DALI_TEST_CHECK(false);
4699 application.SendNotification();
4700 application.Render();
4702 gResourceReadySignalCounter = 0;
4704 // Case 2 : Remove all images when we use cached resource.
4707 gResourceReadySignal09Emitted = false;
4709 gImageView3 = ImageView::New();
4710 gImageView3.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4711 gImageView3.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal);
4712 application.GetScene().Add(gImageView3);
4714 gImageView2 = ImageView::New();
4715 application.GetScene().Add(gImageView2);
4718 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4720 gImageView1 = ImageView::New();
4721 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
4722 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal09);
4723 application.GetScene().Add(gImageView1);
4726 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4728 // Load TEST_INVALID_NPATCH_FILE_NAME_01 one more times.
4729 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4731 application.SendNotification();
4732 application.Render();
4734 DALI_TEST_CHECK(true);
4738 // Exception should not happened
4739 DALI_TEST_CHECK(false);
4741 gResourceReadySignalCounter = 0;
4743 // Clear image view for clear test
4747 gImageView1.Reset();
4751 gImageView2.Reset();
4755 gImageView3.Reset();
4761 int UtcDaliImageViewSetImageOnResourceReadySignal10(void)
4763 tet_infoline("Test ResourceReady signal comes more than 2 times.");
4765 ToolkitTestApplication application;
4767 gResourceReadySignalCounter = 0;
4769 // Clear image view for clear test
4773 gImageView1.Reset();
4776 // Dummy view to cache image.
4777 ImageView dummyView = ImageView::New(gImage_34_RGBA);
4778 application.GetScene().Add(dummyView);
4780 application.SendNotification();
4781 application.Render();
4782 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4783 application.SendNotification();
4784 application.Render();
4788 gImageView1 = ImageView::New();
4789 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, gImage_34_RGBA);
4790 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal10);
4791 application.GetScene().Add(gImageView1); // It will call resourceReady signal 1 time.
4793 tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter);
4795 DALI_TEST_GREATER(gResourceReadySignal10MaxCounter, gResourceReadySignalCounter, TEST_LOCATION); // Check whether resource ready call too much.
4797 for(int i = 0; i < gResourceReadySignal10MaxCounter; ++i)
4799 tet_printf("RunIdles\n");
4800 // Executes the idle callbacks.
4801 application.RunIdles();
4802 application.SendNotification();
4803 application.Render();
4804 tet_printf("RunIdles done\n");
4806 tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter);
4808 DALI_TEST_EQUALS(gResourceReadySignalCounter, gResourceReadySignal10MaxCounter, TEST_LOCATION);
4810 DALI_TEST_CHECK(true);
4814 // Exception should not happened
4815 DALI_TEST_CHECK(false);
4819 application.SendNotification();
4820 application.Render();
4822 gResourceReadySignalCounter = 0;
4824 gResourceReadySignalCounter = 0;
4826 // Clear image view for clear test
4830 gImageView1.Reset();
4836 int UtcDaliImageViewSetImageOnResourceReadySignal10WhenAddIdleFailed(void)
4838 tet_infoline("Test ResourceReady signal comes more than 2 times, but do not call again if AddIdle failed");
4840 ToolkitTestApplication application;
4842 gResourceReadySignalCounter = 0;
4844 // Clear image view for clear test
4848 gImageView1.Reset();
4851 // Dummy view to cache image.
4852 ImageView dummyView = ImageView::New(gImage_34_RGBA);
4853 application.GetScene().Add(dummyView);
4855 application.SendNotification();
4856 application.Render();
4857 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4858 application.SendNotification();
4859 application.Render();
4861 // Make AddIdle failed.
4862 ToolkitApplication::ADD_IDLE_SUCCESS = false;
4866 gImageView1 = ImageView::New();
4867 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, gImage_34_RGBA);
4868 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal10);
4869 application.GetScene().Add(gImageView1); // It will call resourceReady signal 1 time.
4871 tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter);
4873 DALI_TEST_GREATER(gResourceReadySignal10MaxCounter, gResourceReadySignalCounter, TEST_LOCATION); // Check whether resource ready call too much.
4875 for(int i = 0; i < gResourceReadySignal10MaxCounter; ++i)
4877 tet_printf("RunIdles\n");
4878 // Executes the idle callbacks.
4879 application.RunIdles();
4880 application.SendNotification();
4881 application.Render();
4882 tet_printf("RunIdles done\n");
4884 tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter);
4886 DALI_TEST_GREATER(gResourceReadySignal10MaxCounter, gResourceReadySignalCounter, TEST_LOCATION); // Check whether resource ready not called multiple times.
4888 DALI_TEST_CHECK(true);
4892 // Exception should not happened
4893 DALI_TEST_CHECK(false);
4896 ToolkitApplication::ADD_IDLE_SUCCESS = true;
4899 application.SendNotification();
4900 application.Render();
4902 gResourceReadySignalCounter = 0;
4904 gResourceReadySignalCounter = 0;
4906 // Clear image view for clear test
4910 gImageView1.Reset();
4916 int UtcDaliImageViewSetImageOnResourceReadySignal11(void)
4918 tet_infoline("Test ResourceReady Add AnimatedImageVisual and then Remove immediately.");
4920 ToolkitTestApplication application;
4922 gResourceReadySignalCounter = 0;
4924 // Clear image view for clear test
4928 gImageView1.Reset();
4932 gImageView2.Reset();
4936 gImageView3.Reset();
4941 gImageView1 = ImageView::New();
4942 gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, TEST_GIF_FILE_NAME);
4943 gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal11);
4944 application.GetScene().Add(gImageView1); // It will call resourceReady signal 1 time.
4946 tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter);
4948 DALI_TEST_EQUALS(gResourceReadySignalCounter, 0, TEST_LOCATION);
4950 application.SendNotification();
4951 application.Render();
4954 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
4956 tet_printf("ResourceReady called %d times\n", gResourceReadySignalCounter);
4958 DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
4960 DALI_TEST_CHECK(true);
4964 // Exception should not happened
4965 DALI_TEST_CHECK(false);
4969 application.SendNotification();
4970 application.Render();
4972 gResourceReadySignalCounter = 0;
4974 // Clear image view for clear test
4978 gImageView1.Reset();
4982 gImageView2.Reset();
4986 gImageView3.Reset();
4992 int UtcDaliImageViewUseSameUrlWithAnimatedImageVisual(void)
4994 tet_infoline("Test multiple views with same image in animated image visual");
4995 ToolkitTestApplication application;
4997 gImageView1 = ImageView::New(TEST_WEBP_FILE_NAME);
4998 application.GetScene().Add(gImageView1);
5000 tet_infoline("Remove imageView and Create new imageView with same url");
5001 application.GetScene().Remove(gImageView1);
5002 gImageView2 = ImageView::New(TEST_WEBP_FILE_NAME);
5003 application.GetScene().Add(gImageView2);
5005 application.SendNotification();
5006 application.Render();
5008 tet_infoline("Check the ImageView load image successfully");
5009 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5013 int UtcDaliImageViewNpatchImageCacheTest01(void)
5015 tet_infoline("Test npatch image cached");
5017 ToolkitTestApplication application;
5018 ImageView imageView[2];
5020 auto& gl = application.GetGlAbstraction();
5021 gl.EnableTextureCallTrace(true);
5022 auto& textureCallStack = gl.GetTextureTrace();
5023 textureCallStack.Enable(true);
5024 textureCallStack.EnableLogging(true);
5026 auto TestNPatch = [&](int index, const std::string& nPatchImageUrl, const char* location) {
5027 if(imageView[index])
5029 imageView[index].Unparent();
5032 // Ensure remove npatch cache if required.
5033 application.SendNotification();
5034 application.Render();
5036 imageView[index] = ImageView::New(nPatchImageUrl);
5037 imageView[index].SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
5038 application.GetScene().Add(imageView[index]);
5041 TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
5042 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5044 application.SendNotification();
5045 application.Render();
5047 tet_printf("trace : \n%s\n", textureCallStack.GetTraceString().c_str());
5049 // Check we gen only 1 textures
5050 DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 1, TEST_LOCATION);
5051 textureCallStack.Reset();
5053 // Let we use cached textures
5054 for(int i = 0; i < 10; i++)
5056 TestNPatch(1, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
5057 TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
5060 application.SendNotification();
5061 application.Render();
5062 // Check we use cached npatch data so we don't generate new texture textures
5063 DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 0, TEST_LOCATION);
5066 imageView[0].Unparent();
5067 imageView[0].Reset();
5068 imageView[1].Unparent();
5069 imageView[1].Reset();
5071 application.SendNotification();
5072 application.Render();
5074 textureCallStack.Reset();
5075 // Let we use deference textures
5076 TestNPatch(1, TEST_BROKEN_IMAGE_S, TEST_LOCATION);
5077 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5079 application.SendNotification();
5080 application.Render();
5081 // Try to load multiple times.
5082 for(int i = 0; i < 3; i++)
5084 TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
5085 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5086 TestNPatch(1, TEST_BROKEN_IMAGE_S, TEST_LOCATION);
5087 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5089 application.SendNotification();
5090 application.Render();
5092 imageView[0].Unparent();
5093 imageView[0].Reset();
5094 imageView[1].Unparent();
5095 imageView[1].Reset();
5097 application.SendNotification();
5098 application.Render();
5100 // Check memory leak
5101 DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), textureCallStack.CountMethod("DeleteTextures"), TEST_LOCATION);
5106 int UtcDaliImageViewNpatchImageCacheTest02(void)
5108 tet_infoline("Test npatch image cached with border");
5110 ToolkitTestApplication application;
5111 ImageView imageView[2];
5113 auto& gl = application.GetGlAbstraction();
5114 gl.EnableTextureCallTrace(true);
5115 auto& textureCallStack = gl.GetTextureTrace();
5116 textureCallStack.Enable(true);
5117 textureCallStack.EnableLogging(true);
5119 auto TestBorderImage = [&](int index, const std::string& normalImageUrl, const Rect<int> border, const char* location) {
5121 map[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::N_PATCH;
5122 map[Toolkit::ImageVisual::Property::URL] = normalImageUrl;
5123 map[Toolkit::ImageVisual::Property::BORDER] = border;
5125 imageView[index] = ImageView::New();
5126 imageView[index].SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5127 imageView[index].SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
5128 application.GetScene().Add(imageView[index]);
5131 TestBorderImage(0, gImage_34_RGBA, Rect<int>(0, 0, 0, 0), TEST_LOCATION);
5132 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5134 application.SendNotification();
5135 application.Render();
5137 tet_printf("trace : \n%s\n", textureCallStack.GetTraceString().c_str());
5139 // Check we gen only 1 textures
5140 DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 1, TEST_LOCATION);
5141 textureCallStack.Reset();
5143 // Let we use cached textures
5144 for(int i = 0; i < 10; i++)
5146 TestBorderImage(0, gImage_34_RGBA, Rect<int>(i, i + 1, i + 2, i + 3), TEST_LOCATION);
5147 TestBorderImage(1, gImage_34_RGBA, Rect<int>(i + 1, i, i + 3, i + 2), TEST_LOCATION);
5150 application.SendNotification();
5151 application.Render();
5153 // Check we use cached npatch data so we don't generate new texture textures
5154 DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 0, TEST_LOCATION);
5159 int UtcDaliImageViewPlaceholderImage01(void)
5161 tet_infoline("Test imageView use placeholder image");
5163 ToolkitTestApplication application;
5165 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5167 ImageView imageView = ImageView::New();
5168 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5169 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
5170 application.GetScene().Add(imageView);
5172 Property::Value value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
5174 DALI_TEST_CHECK(value.Get(url));
5175 DALI_TEST_CHECK(url.empty());
5176 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5178 application.SendNotification();
5179 application.Render();
5181 value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
5182 DALI_TEST_CHECK(value.Get(url));
5183 DALI_TEST_CHECK(url == gImage_34_RGBA);
5185 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5186 application.SendNotification();
5187 application.Render();
5189 // Replace Image test
5190 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
5191 map[ImageView::Property::PLACEHOLDER_IMAGE] = gImage_34_RGBA;
5192 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5193 application.SendNotification();
5194 application.Render();
5196 map[Toolkit::ImageVisual::Property::URL] = "";
5197 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5198 application.SendNotification();
5199 application.Render();
5201 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2;
5202 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5203 application.SendNotification();
5204 application.Render();
5206 // Replace Image test2
5207 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
5208 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5209 application.SendNotification();
5210 application.Render();
5212 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2;
5213 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5214 application.SendNotification();
5215 application.Render();
5217 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5218 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5219 application.SendNotification();
5220 application.Render(900);
5222 map[Toolkit::ImageVisual::Property::URL] = "";
5223 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5224 application.SendNotification();
5225 application.Render();
5227 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
5228 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5229 application.SendNotification();
5230 application.Render();
5235 int UtcDaliImageViewPlaceholderImage02(void)
5237 tet_infoline("Test imageView use placeholder image without resource ready");
5239 ToolkitTestApplication application;
5242 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5244 ImageView imageView = ImageView::New();
5245 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5246 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
5247 DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
5248 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
5249 application.GetScene().Add(imageView);
5251 Property::Value value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
5253 DALI_TEST_CHECK(value.Get(url));
5254 DALI_TEST_CHECK(url.empty());
5256 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5257 application.SendNotification();
5258 application.Render();
5260 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5262 value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
5263 DALI_TEST_CHECK(value.Get(url));
5264 DALI_TEST_CHECK(url == gImage_34_RGBA);
5266 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
5267 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
5269 gResourceReadySignalFired = false;
5270 map[Toolkit::ImageVisual::Property::URL] = "";
5271 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5272 application.SendNotification();
5273 application.Render();
5275 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
5276 DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
5281 int UtcDaliImageViewTransitionEffect01(void)
5283 tet_infoline("Test imageView use transition effect");
5285 ToolkitTestApplication application;
5287 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5288 map[Toolkit::Visual::Property::OPACITY] = 0.9f;
5290 ImageView imageView = ImageView::New();
5291 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5292 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
5293 application.GetScene().Add(imageView);
5295 Property::Value value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
5297 DALI_TEST_CHECK(value.Get(transition));
5298 DALI_TEST_CHECK(transition == false);
5299 imageView.SetProperty(Toolkit::ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
5301 application.SendNotification();
5302 application.Render();
5304 value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
5305 DALI_TEST_CHECK(value.Get(transition));
5306 DALI_TEST_CHECK(transition == true);
5308 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5309 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5310 application.SendNotification();
5311 application.Render();
5313 // Test transition effect with placeholder
5314 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
5315 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5316 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5317 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5318 application.SendNotification();
5319 application.Render();
5321 map[Toolkit::ImageVisual::Property::URL] = "";
5322 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5323 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5324 application.SendNotification();
5325 application.Render();
5327 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5328 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5329 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5330 application.SendNotification();
5331 application.Render();
5333 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
5334 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5335 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5336 application.SendNotification();
5338 map[Toolkit::ImageVisual::Property::URL] = "";
5339 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5340 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5341 application.SendNotification();
5342 application.Render();
5344 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5345 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5346 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, "");
5347 application.SendNotification();
5348 application.Render();
5350 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5351 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5352 application.SendNotification();
5353 application.Render();
5355 map[Toolkit::ImageVisual::Property::URL] = "";
5356 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5357 application.SendNotification();
5358 application.Render();
5360 // Test transition effect without placeholder
5361 map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
5362 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5363 application.SendNotification();
5364 application.Render();
5366 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5367 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5368 application.SendNotification();
5369 application.Render();
5371 map[Toolkit::ImageVisual::Property::URL] = "";
5372 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5373 application.SendNotification();
5374 application.Render();
5376 map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
5377 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5378 application.SendNotification();
5379 application.Render();
5381 imageView.SetImage(TEST_IMAGE_1);
5382 application.SendNotification();
5383 application.Render();
5385 imageView.SetImage(gImage_600_RGB);
5386 application.SendNotification();
5387 application.Render(9000);
5389 imageView.SetImage("");
5390 application.SendNotification();
5391 application.Render();
5393 imageView.SetImage(TEST_IMAGE_1);
5394 application.SendNotification();
5395 application.Render();
5398 imageView.Unparent();
5404 int UtcDaliImageViewTransitionEffect02(void)
5406 tet_infoline("Test imageView use transition effect with replace image");
5408 ToolkitTestApplication application;
5412 ImageView imageView = ImageView::New();
5413 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5414 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
5415 application.GetScene().Add(imageView);
5417 Property::Value value;
5418 value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
5420 DALI_TEST_CHECK(value.Get(transition));
5421 DALI_TEST_CHECK(transition == false);
5422 imageView.SetProperty(Toolkit::ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
5424 value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
5426 DALI_TEST_CHECK(value.Get(url));
5427 DALI_TEST_CHECK(url.empty());
5428 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5429 application.SendNotification();
5430 application.Render();
5432 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, "");
5433 application.SendNotification();
5434 application.Render();
5436 imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5437 application.SendNotification();
5438 application.Render();
5440 value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
5441 DALI_TEST_CHECK(value.Get(transition));
5442 DALI_TEST_CHECK(transition == true);
5444 value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
5445 DALI_TEST_CHECK(value.Get(url));
5446 DALI_TEST_CHECK(url == gImage_34_RGBA);
5448 imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
5449 application.SendNotification();
5450 application.Render();
5453 imageView.Unparent();
5459 int UtcDaliImageViewTransitionEffect03(void)
5461 tet_infoline("Test imageView use transition effect with placeholder");
5463 ToolkitTestApplication application;
5466 ImageView imageView = ImageView::New();
5467 imageView.SetImage("");
5468 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
5469 imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5470 imageView.SetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
5471 application.GetScene().Add(imageView);
5473 //DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5475 application.SendNotification();
5476 application.Render(16);
5478 tet_infoline("(1)");
5479 imageView.SetImage(gImage_600_RGB);
5480 imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5481 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
5482 application.SendNotification();
5483 application.Render(16);
5485 Property::Value value;
5486 value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
5488 DALI_TEST_CHECK(value.Get(transition));
5489 DALI_TEST_CHECK(transition == true);
5491 value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
5493 DALI_TEST_CHECK(value.Get(url));
5494 DALI_TEST_CHECK(url == gImage_34_RGBA);
5496 imageView.SetImage("");
5497 application.SendNotification();
5498 application.Render(16);
5500 imageView.SetImage(TEST_IMAGE_1);
5501 imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
5502 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5503 application.SendNotification();
5504 application.Render(16);
5507 imageView.Unparent();
5513 int UtcDaliImageViewImageLoadFailureAndReload01(void)
5515 tet_infoline("Try to load invalid image first, and then reload after that image valid.");
5516 ToolkitTestApplication application;
5518 gResourceReadySignalFired = false;
5520 // Make overwritable image invalid first.
5523 ImageView imageView = ImageView::New(TEST_OVERWRITABLE_IMAGE_FILE_NAME);
5524 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
5525 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
5527 application.GetScene().Add(imageView);
5528 application.SendNotification();
5529 application.Render(16);
5531 // loading started, this waits for the loader thread
5532 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5534 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
5535 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
5536 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
5538 gResourceReadySignalFired = false;
5540 // Make overwritable image valid now.
5541 OverwriteImage(gImage_34_RGBA);
5544 Property::Map attributes;
5545 DevelControl::DoAction(imageView, ImageView::Property::IMAGE, DevelImageVisual::Action::RELOAD, attributes);
5546 application.SendNotification();
5547 application.Render(16);
5549 // loading started, this waits for the loader thread
5550 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5552 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
5553 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
5554 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::READY, TEST_LOCATION);
5556 // Make overwritable image invalid end of test (for clean).
5559 gResourceReadySignalFired = false;
5564 int UtcDaliImageViewImageLoadFailureAndReload02(void)
5566 tet_infoline("Try to load invalid image first, and then reload after that image valid.");
5567 tet_infoline("This case, broken image was n-patch. So we should check whether Geometry / Shader changed after reload");
5568 ToolkitTestApplication application;
5570 Toolkit::StyleManager styleManager = Toolkit::StyleManager::Get();
5571 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::SMALL, TEST_BROKEN_IMAGE_S);
5572 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::NORMAL, TEST_BROKEN_IMAGE_M);
5573 DevelStyleManager::SetBrokenImageUrl(styleManager, DevelStyleManager::BrokenImageType::LARGE, TEST_BROKEN_IMAGE_L);
5575 gResourceReadySignalFired = false;
5577 // Make overwritable image invalid first.
5580 ImageView imageView = ImageView::New(TEST_OVERWRITABLE_IMAGE_FILE_NAME);
5581 imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
5582 imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
5584 application.GetScene().Add(imageView);
5585 application.SendNotification();
5586 application.Render(16);
5588 // loading started, this waits for the loader thread
5589 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5591 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
5592 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
5593 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
5595 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
5596 Geometry brokenGeometry = imageView.GetRendererAt(0u).GetGeometry();
5597 Shader brokenShader = imageView.GetRendererAt(0u).GetShader();
5598 DALI_TEST_CHECK(brokenGeometry);
5599 DALI_TEST_CHECK(brokenShader);
5601 gResourceReadySignalFired = false;
5603 // Make overwritable image valid now.
5604 OverwriteImage(gImage_34_RGBA);
5607 Property::Map attributes;
5608 DevelControl::DoAction(imageView, ImageView::Property::IMAGE, DevelImageVisual::Action::RELOAD, attributes);
5609 application.SendNotification();
5610 application.Render(16);
5612 // loading started, this waits for the loader thread
5613 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
5615 DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
5616 DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
5617 DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::READY, TEST_LOCATION);
5619 // Check whether we don't use n-patch shader and geometry in this case.
5620 DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
5621 DALI_TEST_CHECK(brokenGeometry != imageView.GetRendererAt(0u).GetGeometry());
5622 DALI_TEST_CHECK(brokenShader != imageView.GetRendererAt(0u).GetShader());
5624 // Make overwritable image invalid end of test (for clean).
5627 gResourceReadySignalFired = false;