/*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2023 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <dali-toolkit-test-suite-utils.h>
#include <toolkit-event-thread-callback.h>
+#include <toolkit-vector-image-renderer.h>
#include "dummy-control.h"
#include <test-encoded-image-buffer.h>
const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg";
const char* TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/insta_camera.json";
+const char* TEST_WEBP_FILE_NAME = TEST_RESOURCE_DIR "/dali-logo.webp";
void TestUrl(ImageView imageView, const std::string url)
{
Property::Map imageMap;
imageMap[ImageVisual::Property::URL] = url.GetUrl();
+ imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 600;
+ imageMap[ImageVisual::Property::DESIRED_WIDTH] = 600;
+ imageMap[ImageVisual::Property::ATLASING] = true;
+
+ // No atlasing with big image
+ ImageView imageView_bigdesired = ImageView::New();
+ imageView_bigdesired.SetProperty(ImageView::Property::IMAGE, imageMap);
+ imageView_bigdesired.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
+
+ imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 0;
+ imageMap[ImageVisual::Property::DESIRED_WIDTH] = 0;
+
+ // No atlasing with zero desired size
+ ImageView imageView_nodesired = ImageView::New();
+ imageView_nodesired.SetProperty(ImageView::Property::IMAGE, imageMap);
+ imageView_nodesired.SetProperty(Toolkit::Control::Property::PADDING, Extents(10u, 10u, 10u, 10u));
+
imageMap[ImageVisual::Property::DESIRED_HEIGHT] = 34;
imageMap[ImageVisual::Property::DESIRED_WIDTH] = 34;
- imageMap[ImageVisual::Property::ATLASING] = true;
ImageView imageView = ImageView::New();
imageView.SetProperty(ImageView::Property::IMAGE, imageMap);
// By default, Aysnc loading is used
// loading is not started if the actor is offScene
-
application.GetScene().Add(imageView);
+ application.GetScene().Add(imageView_bigdesired);
+ application.GetScene().Add(imageView_nodesired);
application.SendNotification();
application.Render(16);
+
+ // loading started, this waits for the loader thread for max 30 seconds
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
application.Render(16);
application.SendNotification();
// Sync loading is used
Property::Map syncLoadingMap;
syncLoadingMap["url"] = url.GetUrl();
+ syncLoadingMap["alphaMaskUrl"] = gImage_34_RGBA;
syncLoadingMap["desiredHeight"] = 34;
syncLoadingMap["desiredWidth"] = 34;
syncLoadingMap["synchronousLoading"] = true;
END_TEST;
}
+int UtcDaliImageViewReloadAlphaMaskImage(void)
+{
+ ToolkitTestApplication application;
+
+ gResourceReadySignalFired = false;
+
+ ImageView dummy = ImageView::New();
+ ImageView imageView = ImageView::New();
+ Property::Map propertyMap;
+
+ // To keep alpha mask cached, scene on some dummy image.
+ // Note : If we don't cache alpha mask image, the reference count of mask image become zero.
+ // In this case, we might need to wait mask image loading, which is not neccesary & can be changed behavior.
+ propertyMap[ImageVisual::Property::URL] = gImage_600_RGB;
+ propertyMap[ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
+ dummy.SetProperty(ImageView::Property::IMAGE, propertyMap);
+
+ application.GetScene().Add(dummy);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ propertyMap.Clear();
+ propertyMap[ImageVisual::Property::URL] = gImage_34_RGBA;
+ propertyMap[ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
+ imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
+
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
+
+ imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+ application.Render(16);
+
+ // Load image and use cached mask. Now we try to apply masking.
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
+
+ // Cancel apply masking.
+ imageView.Unparent();
+
+ application.SendNotification();
+ application.Render(16);
+
+ // Reload same image again.
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+ application.Render(16);
+
+ // Finish apply masking.
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+ END_TEST;
+}
+
void OnRelayoutOverride(Size size)
{
gNaturalSize = size; // Size Relayout is using
void ResourceFailedReload(Control control)
{
gFailCounter++;
- if(gFailCounter < MAX_RETRIES)
- {
- ReloadImage(ImageView::DownCast(control));
- }
}
} // namespace
// loading started, this waits for the loader thread to complete
DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
- application.SendNotification();
-
DALI_TEST_EQUALS(gFailCounter, 1, TEST_LOCATION);
+ ReloadImage(imageView);
DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
- application.SendNotification();
-
DALI_TEST_EQUALS(gFailCounter, 2, TEST_LOCATION);
+ ReloadImage(imageView);
DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
- application.SendNotification();
DALI_TEST_EQUALS(gFailCounter, 3, TEST_LOCATION);
END_TEST;
tet_infoline("Test load from a remote server.");
ToolkitTestApplication application;
- Toolkit::ImageView imageView;
- imageView = Toolkit::ImageView::New();
- imageView.SetImage("https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg");
- // Victor. Temporary (or permanent?) update as the url above seems not to work from time to time ...
- // imageView.SetImage("https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/SVG_logo.svg/64px-SVG_logo.svg.png");
- imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
- imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
- imageView.SetProperty(Actor::Property::SIZE, Vector2(300, 300));
- imageView.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 150.0f, 0.0f));
- application.GetScene().Add(imageView);
+ {
+ Toolkit::ImageView imageView;
+ imageView = Toolkit::ImageView::New();
+ imageView.SetImage("https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg");
+ imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(300, 300));
+ imageView.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 150.0f, 0.0f));
- DALI_TEST_CHECK(imageView);
+ application.GetScene().Add(imageView);
- DALI_TEST_EQUALS(imageView.GetRendererCount(), 0u, TEST_LOCATION);
+ DALI_TEST_CHECK(imageView);
- application.SendNotification();
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 0u, TEST_LOCATION);
- DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
- application.SendNotification();
- application.Render();
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
- DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ }
+
+ // Without size set
+ {
+ Toolkit::ImageView imageView;
+ imageView = Toolkit::ImageView::New();
+ imageView.SetImage("https://dev.w3.org/SVG/tools/svgweb/samples/svg-files/check.svg");
+ imageView.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT);
+ imageView.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT);
+ imageView.SetProperty(Actor::Property::POSITION, Vector3(150.0f, 150.0f, 0.0f));
+
+ application.GetScene().Add(imageView);
+
+ DALI_TEST_CHECK(imageView);
+
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 0u, TEST_LOCATION);
+
+ application.SendNotification();
+
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ }
END_TEST;
}
tet_infoline("ImageView Testing SVG image sync loading");
- // Sync loading, automatic atlasing for small size image
{
- TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
- callStack.Reset();
- callStack.Enable(true);
-
ImageView imageView = ImageView::New();
// Sync loading is used
DALI_TEST_CHECK(imageView);
application.SendNotification();
- application.Render(16);
Vector3 naturalSize = imageView.GetNaturalSize();
DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
tet_infoline("ImageView Testing SVG image async loading");
- // Sync loading, automatic atlasing for small size image
{
- TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
- callStack.Reset();
- callStack.Enable(true);
-
ImageView imageView = ImageView::New();
- // Sync loading is used
- Property::Map syncLoadingMap;
- syncLoadingMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
- syncLoadingMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
- syncLoadingMap.Insert(Toolkit::ImageVisual::Property::SYNCHRONOUS_LOADING, false);
- imageView.SetProperty(ImageView::Property::IMAGE, syncLoadingMap);
+ // Async loading is used - default value of SYNCHRONOUS_LOADING is false.
+ Property::Map propertyMap;
+ propertyMap.Insert(Toolkit::Visual::Property::TYPE, Toolkit::Visual::IMAGE);
+ propertyMap.Insert(Toolkit::ImageVisual::Property::URL, TEST_RESOURCE_DIR "/svg1.svg");
+ imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
application.GetScene().Add(imageView);
DALI_TEST_CHECK(imageView);
application.SendNotification();
+
+ // Wait for loading
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
application.Render(16);
- Vector3 naturalSize = imageView.GetNaturalSize();
+ Vector3 naturalSize = imageView.GetNaturalSize();
DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
}
tet_infoline("ImageView Testing SVG image async loading");
- // Sync loading, automatic atlasing for small size image
+ // Sync loading
{
- TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
- callStack.Reset();
- callStack.Enable(true);
-
ImageView imageView = ImageView::New();
// Sync loading is used
DALI_TEST_CHECK(imageView);
application.SendNotification();
+
+ // Wait for loading
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
application.Render(16);
+
Vector3 naturalSize = imageView.GetNaturalSize();
DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
DALI_TEST_EQUALS(naturalSize.height, 100.0f, TEST_LOCATION);
END_TEST;
}
-int UtcDaliImageViewSvgLoadingFailure(void)
+int UtcDaliImageViewSvgLoadingFailureLocalFile(void)
{
- ToolkitTestApplication application;
-
// Local svg file - invalid file path
{
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
gResourceReadySignalFired = false;
ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/foo.svg");
application.GetScene().Add(imageView);
application.SendNotification();
+
+ // loading started, this waits for the loader thread - load
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
+
+ // Should be shown a broken image
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
+ }
+
+ // Local svg file - invalid file path without size set
+ {
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ gResourceReadySignalFired = false;
+ textureTrace.Reset();
+
+ ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/foo.svg");
+ imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
+
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+
+ // loading started, this waits for the loader thread - load & rasterize
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
application.Render(16);
DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
+
+ // Should be shown a broken image
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
}
// Local svg file - invalid file
{
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
gResourceReadySignalFired = false;
+ textureTrace.Reset();
ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/invalid.svg");
imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
application.GetScene().Add(imageView);
application.SendNotification();
+
+ // loading started, this waits for the loader thread - load & rasterize
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
application.Render(16);
DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
+
+ // Should be shown a broken image
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
}
+ END_TEST;
+}
+
+int UtcDaliImageViewSvgLoadingFailureRemoteFile01(void)
+{
// Remote svg file
{
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
gResourceReadySignalFired = false;
- ImageView imageView = ImageView::New("https://bar.org/foobar.svg");
+ ImageView imageView = ImageView::New("https://127.0.0.1/foobar.svg");
imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
application.SendNotification();
- // loading started, this waits for the loader thread
+ // loading started, this waits for the loader thread - load & rasterize
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
+
+ // Should be shown a broken image
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
+ }
+
+ END_TEST;
+}
+
+int UtcDaliImageViewSvgLoadingFailureRemoteFile02(void)
+{
+ // Remote svg file without size set
+ {
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ gResourceReadySignalFired = false;
+
+ ImageView imageView = ImageView::New("https://127.0.0.1/foobar.svg");
+ imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
+
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+
+ // loading started, this waits for the loader thread - load & rasterize
DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
application.SendNotification();
DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
+
+ // Should be shown a broken image
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
}
END_TEST;
gResourceReadySignalFired = false;
- ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/svg1.svg");
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/invalid1.svg");
imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
application.SendNotification();
- // loading started, this waits for the loader thread
- DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
application.SendNotification();
application.Render(16);
DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
- DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::READY, TEST_LOCATION);
+ DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
- // Reset flag
- gResourceReadySignalFired = false;
+ // Should be shown a broken image
+ DALI_TEST_EQUALS(imageView.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
- // Change size
- imageView.SetProperty(Actor::Property::SIZE, Vector2(0.f, 0.f));
+ END_TEST;
+}
+
+int UtcDaliImageViewSvgChageSize(void)
+{
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ ImageView imageView = ImageView::New(TEST_SVG_FILE_NAME);
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ DALI_TEST_EQUALS(Test::VectorImageRenderer::GetLoadCount(), 1, TEST_LOCATION);
+
+ // Change actor size, then rasterization should be done again
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
application.SendNotification();
- // rasterization started, this waits for the rasterize thread
+ // Wait for rasterization
DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
application.SendNotification();
application.Render(16);
- DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
- DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
- // Fail to rasterize because the size is 0.
- DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(ImageView::Property::IMAGE), Visual::ResourceStatus::FAILED, TEST_LOCATION);
+ // We should not load the file again.
+ DALI_TEST_EQUALS(Test::VectorImageRenderer::GetLoadCount(), 1, TEST_LOCATION);
END_TEST;
}
-int UtcDaliImageViewTVGLoading(void)
+int UtcDaliImageViewSvgAtlasing(void)
{
ToolkitTestApplication application;
- tet_infoline("ImageView Testing TVG image loading");
+ TraceCallStack& callStack = application.GetGlAbstraction().GetTextureTrace();
+ callStack.Reset();
+ callStack.Enable(true);
- {
- ImageView imageView = ImageView::New();
+ Property::Map propertyMap;
+ propertyMap["url"] = TEST_SVG_FILE_NAME;
+ propertyMap["atlasing"] = true;
- imageView.SetImage(TEST_RESOURCE_DIR "/test.tvg");
+ ImageView imageView = ImageView::New();
+ imageView.SetProperty(ImageView::Property::IMAGE, propertyMap);
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(100.f, 100.f));
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ // use atlas
+ TraceCallStack::NamedParams params1;
+ params1["width"] << 100;
+ params1["height"] << 100;
+ DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexSubImage2D", params1), true, TEST_LOCATION);
+
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(600.f, 600.f));
+
+ application.SendNotification();
+
+ // Wait for rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ callStack.Reset();
+
+ application.SendNotification();
+ application.Render(16);
+
+ // not use atlas
+ TraceCallStack::NamedParams params2;
+ params2["width"] << 600;
+ params2["height"] << 600;
+ DALI_TEST_EQUALS(callStack.FindMethodAndParams("TexImage2D", params2), true, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageViewTVGLoading(void)
+{
+ ToolkitTestApplication application;
+
+ tet_infoline("ImageView Testing TVG image loading");
+ {
+ ImageView imageView = ImageView::New(TEST_RESOURCE_DIR "/test.tvg");
application.GetScene().Add(imageView);
DALI_TEST_CHECK(imageView);
+
+ application.SendNotification();
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
Vector3 naturalSize = imageView.GetNaturalSize();
DALI_TEST_EQUALS(naturalSize.width, 100.0f, TEST_LOCATION);
}
END_TEST;
}
+
+int UtcDaliImageViewSvgDesiredSize01(void)
+{
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ int desiredWidth = 100, desiredHeight = 150;
+ ImageView imageView = ImageView::New(TEST_SVG_FILE_NAME, ImageDimensions(desiredWidth, desiredHeight));
+
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ {
+ std::stringstream out;
+ out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight;
+ DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str()));
+ }
+
+ END_TEST;
+}
+
+int UtcDaliImageViewSvgDesiredSize02(void)
+{
+ ToolkitTestApplication application;
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ int desiredWidth = 150, desiredHeight = 100;
+ ImageView imageView = ImageView::New();
+ imageView[ImageView::Property::IMAGE] = Property::Map().Add("url", TEST_SVG_FILE_NAME).Add("desiredWidth", desiredWidth).Add("desiredHeight", desiredHeight);
+ application.GetScene().Add(imageView);
+
+ application.SendNotification();
+
+ // Wait for loading & rasterization
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ {
+ std::stringstream out;
+ out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight;
+ DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str()));
+ }
+
+ END_TEST;
+}
+
int UtcDaliImageViewImageLoadFailure01(void)
{
ToolkitTestApplication application;
else if(control.GetVisualResourceStatus(ImageView::Property::IMAGE) == Visual::ResourceStatus::FAILED)
{
// Make the resource ready immediately
- control[ImageView::Property::IMAGE] = TEST_RESOURCE_DIR "/svg1.svg";
+ control[ImageView::Property::IMAGE] = gImage_600_RGB;
}
}
}
}
+void OnResourceReadySignal05(Control control)
+{
+ gResourceReadySignalCounter++;
+
+ // Request load with same image
+ // NOTE : The url must not be same as gImageView1
+ const int viewCount = 4;
+ for(int i = 0; i < viewCount; ++i)
+ {
+ gImageView1.Add(ImageView::New("invalid2.jpg"));
+ }
+}
+
+int gResourceReadySignal06ComesOrder = 0;
+
+void OnResourceReadySignal06(Control control)
+{
+ gResourceReadySignalCounter++;
+ if(gResourceReadySignalCounter == 1)
+ {
+ auto scene = gImageView1.GetParent();
+
+ // Request load something
+ // We hope this request result is return later than gImageView2.
+
+ Property::Map map1;
+ map1[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ map1[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
+
+ gImageView3 = ImageView::New();
+ gImageView3.SetProperty(Toolkit::ImageView::Property::IMAGE, map1);
+ gImageView3.ResourceReadySignal().Connect(&OnResourceReadySignal06);
+
+ Property::Map map2;
+ map2[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2;
+ map2[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_S;
+ gImageView4 = ImageView::New();
+ gImageView4.SetProperty(Toolkit::ImageView::Property::IMAGE, map2);
+ gImageView4.ResourceReadySignal().Connect(&OnResourceReadySignal06);
+
+ if(control == gImageView1)
+ {
+ gResourceReadySignal06ComesOrder = 1;
+ }
+ else
+ {
+ gResourceReadySignal06ComesOrder = 2;
+ }
+ }
+ if(gResourceReadySignalCounter == 2)
+ {
+ if(gResourceReadySignal06ComesOrder == 1 && control == gImageView2)
+ {
+ // Scene off first one.
+ gImageView1.Unparent();
+
+ // Scene off second one.
+ gImageView2.Unparent();
+ }
+ else if(gResourceReadySignal06ComesOrder == 2 && control == gImageView1)
+ {
+ // Scene off first one.
+ gImageView2.Unparent();
+
+ // Scene off second one.
+ gImageView1.Unparent();
+ }
+ else
+ {
+ // We can't check that this utc fail case. just pass always when we come here.
+ gResourceReadySignal06ComesOrder = -1;
+ }
+
+ // If we don't seperate index of FreeList area
+ // and if we don't queue remove during obversing,
+ // cache index become something invalid data.
+ // In this case, some strange observer can be called.
+ // For example, gImageView4.LoadComplete will be called.
+ }
+}
+
+void OnResourceReadySignal07(Control control)
+{
+ gResourceReadySignalCounter++;
+ // Load masked image
+ tet_printf("rc %d %d\n", gResourceReadySignalCounter, static_cast<bool>(gImageView2));
+
+ if(!gImageView2)
+ {
+ auto scene = gImageView1.GetParent();
+
+ Property::Map map1;
+ map1[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ map1[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = TEST_BROKEN_IMAGE_DEFAULT;
+
+ gImageView2 = ImageView::New();
+ gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map1);
+ gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal07);
+
+ scene.Add(gImageView2);
+ }
+}
+
} // namespace
int UtcDaliImageViewSetImageOnResourceReadySignal01(void)
DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
+ // Create a new ImageView to cache the image
+ ImageView imageView1 = ImageView::New(gImage_600_RGB);
+ application.GetScene().Add(imageView1);
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
// Reset count
gResourceReadySignalCounter = 0;
imageView.ResourceReadySignal().Connect(&OnSimpleResourceReadySignal);
application.GetScene().Add(imageView);
- application.SendNotification();
- application.Render();
// Don't unparent imageView, for keep the cache.
};
// Remain 1 signal due to we use #URL + 1 mask image.
DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(expectResourceReadySignalCounter + 1), true, TEST_LOCATION);
-
+ application.SendNotification();
+ application.Render();
DALI_TEST_EQUALS(gResourceReadySignalCounter, expectResourceReadySignalCounter, TEST_LOCATION);
END_TEST;
{
tet_infoline("Test signal handler various case.");
- ToolkitTestApplication application;
+ auto TestResourceReadyUrl = [](int eventTriggerCount, bool isSynchronous, bool loadSuccess, const std::string& url, const std::string& mask, const char* location) {
+ ToolkitTestApplication application;
- auto TestResourceReadyUrl = [&application](int eventTriggerCount, bool isSynchronous, bool loadSuccess, const std::string& url, const std::string& mask, const char* location) {
gResourceReadySignalCounter = 0;
Property::Map map;
tet_printf("test %s [sync:%d] signal fired\n", url.c_str(), isSynchronous ? 1 : 0);
DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, location);
- DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(Toolkit::ImageView::Property::IMAGE), loadSuccess ? Toolkit::Visual::ResourceStatus::READY : Toolkit::Visual::ResourceStatus::FAILED, TEST_LOCATION);
+ DALI_TEST_EQUALS(imageView.GetVisualResourceStatus(Toolkit::ImageView::Property::IMAGE), loadSuccess ? Toolkit::Visual::ResourceStatus::READY : Toolkit::Visual::ResourceStatus::FAILED, location);
imageView.Unparent();
};
- auto TestAuxiliaryResourceReadyUrl = [&application](bool isSynchronous, bool loadSuccess, const std::string& url, const std::string& auxiliaryUrl, const char* location) {
+ auto TestAuxiliaryResourceReadyUrl = [](bool isSynchronous, bool loadSuccess, const std::string& url, const std::string& auxiliaryUrl, const char* location) {
+ ToolkitTestApplication application;
+
gResourceReadySignalCounter = 0;
Property::Map map;
// Test normal case
TestResourceReadyUrl(1, 0, 1, gImage_600_RGB, "", TEST_LOCATION);
- TestResourceReadyUrl(1, 0, 1, TEST_SVG_FILE_NAME, "", TEST_LOCATION); // 1 rasterize
+ TestResourceReadyUrl(2, 0, 1, TEST_SVG_FILE_NAME, "", TEST_LOCATION); // load & rasterize
TestResourceReadyUrl(1, 0, 1, TEST_BROKEN_IMAGE_L, "", TEST_LOCATION);
TestResourceReadyUrl(2, 0, 1, TEST_GIF_FILE_NAME, "", TEST_LOCATION); // 2 image loading - batch size
- TestResourceReadyUrl(1, 0, 1, TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME, "", TEST_LOCATION); // 1 rasterize
+ TestResourceReadyUrl(2, 0, 1, TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME, "", TEST_LOCATION); // load & rasterize
TestResourceReadyUrl(3, 0, 1, gImage_600_RGB, gImage_34_RGBA, TEST_LOCATION); // 2 image loading + 1 applymask
// Test broken case
TestResourceReadyUrl(1, 0, 0, "invalid.jpg", "", TEST_LOCATION);
- TestResourceReadyUrl(0, 0, 0, "invalid.svg", "", TEST_LOCATION); // 0 rasterize
+ TestResourceReadyUrl(1, 0, 0, "invalid.svg", "", TEST_LOCATION);
TestResourceReadyUrl(1, 0, 0, "invalid.9.png", "", TEST_LOCATION);
TestResourceReadyUrl(1, 0, 0, "invalid.gif", "", TEST_LOCATION); // 1 image loading
- TestResourceReadyUrl(0, 0, 0, "invalid.json", "", TEST_LOCATION); // 0 rasterize
+ TestResourceReadyUrl(1, 0, 0, "invalid.json", "", TEST_LOCATION); // 0 rasterize
TestResourceReadyUrl(2, 0, 0, "invalid.jpg", "invalid.png", TEST_LOCATION); // 2 image loading
TestResourceReadyUrl(2, 0, 1, gImage_600_RGB, "invalid.png", TEST_LOCATION); // 2 image loading
TestResourceReadyUrl(0, 1, 1, TEST_SVG_FILE_NAME, "", TEST_LOCATION); // synchronous rasterize
TestResourceReadyUrl(0, 1, 1, TEST_BROKEN_IMAGE_L, "", TEST_LOCATION);
- TestResourceReadyUrl(1, 1, 1, TEST_GIF_FILE_NAME, "", TEST_LOCATION); // first frame image loading sync + second frame image loading async
- TestResourceReadyUrl(0, 1, 1, TEST_ANIMATED_VECTOR_IMAGE_FILE_NAME, "", TEST_LOCATION); // synchronous rasterize
+ TestResourceReadyUrl(1, 1, 1, TEST_GIF_FILE_NAME, "", TEST_LOCATION); // first frame image loading sync + second frame image loading async
TestResourceReadyUrl(0, 1, 1, gImage_600_RGB, gImage_34_RGBA, TEST_LOCATION);
// Test broken case
TestResourceReadyUrl(0, 1, 0, "invalid.jpg", "", TEST_LOCATION);
- TestResourceReadyUrl(0, 1, 0, "invalid.svg", "", TEST_LOCATION); // 0 rasterize
+ TestResourceReadyUrl(0, 1, 0, "invalid.svg", "", TEST_LOCATION);
TestResourceReadyUrl(0, 1, 0, "invalid.9.png", "", TEST_LOCATION);
TestResourceReadyUrl(0, 1, 0, "invalid.gif", "", TEST_LOCATION);
- TestResourceReadyUrl(0, 1, 0, "invalid.json", "", TEST_LOCATION); // 0 rasterize
TestResourceReadyUrl(0, 1, 0, "invalid.jpg", "invalid.png", TEST_LOCATION);
TestResourceReadyUrl(0, 1, 1, gImage_600_RGB, "invalid.png", TEST_LOCATION);
END_TEST;
}
+int UtcDaliImageViewSetImageOnResourceReadySignal05(void)
+{
+ tet_infoline("Test multiple views with same image during ResourceReady load the image only 1 times");
+
+ ToolkitTestApplication application;
+
+ gResourceReadySignalCounter = 0;
+
+ gImageView1 = ImageView::New("invalid.jpg"); // request invalid image, to make loading failed fast.
+ gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal05);
+ application.GetScene().Add(gImageView1);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Try to load 1 invalid.jpg image");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
+
+ tet_infoline("Try to load 1 invalid2.jpg image");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ tet_infoline("Now we don't have any image to be loaded. Check event thread trigger failed.");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 1), false, TEST_LOCATION);
+
+ gImageView1.Unparent();
+ gImageView1.Reset();
+
+ END_TEST;
+}
+int UtcDaliImageViewSetImageOnResourceReadySignal06(void)
+{
+ tet_infoline("Test texturemanager's remove image & mask queue works well within signal handler.");
+
+ ToolkitTestApplication application;
+
+ gResourceReadySignalCounter = 0;
+ gResourceReadySignal06ComesOrder = 0;
+
+ Property::Map map;
+ map[Toolkit::ImageVisual::Property::URL] = "invalid.jpg";
+ map[Toolkit::ImageVisual::Property::ALPHA_MASK_URL] = "invalid.png";
+
+ gImageView1 = ImageView::New(); // request invalid image, to make loading failed fast.
+ gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal06);
+ application.GetScene().Add(gImageView1);
+
+ gImageView2 = ImageView::New(); // request invalid image, to make loading failed fast.
+ gImageView2.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ gImageView2.ResourceReadySignal().Connect(&OnResourceReadySignal06);
+ application.GetScene().Add(gImageView2);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Try to load 2 invalid image");
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
+
+ tet_infoline("load done");
+
+ // We can test this UTC only if gImageView1 and gImageView2 loaded done.
+ if(gResourceReadySignal06ComesOrder == -1)
+ {
+ tet_infoline("Bad news.. gImageView3 or gImageView4 loaded faster than others. just skip this UTC");
+ }
+ else
+ {
+ // gImageView3 and gImageView4 load must not be successed yet.
+ DALI_TEST_EQUALS(gImageView3.GetRendererCount(), 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(gImageView4.GetRendererCount(), 0u, TEST_LOCATION);
+
+ application.GetScene().Add(gImageView3);
+ application.GetScene().Add(gImageView4);
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Try to load 2 valid image");
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
+
+ tet_infoline("load done");
+ }
+ END_TEST;
+}
+
+int UtcDaliImageViewSetImageOnResourceReadySignal07(void)
+{
+ tet_infoline("Test texturemanager's remove image & mask queue works well within signal handler 02.");
+
+ ToolkitTestApplication application;
+
+ gResourceReadySignalCounter = 0;
+
+ Property::Map map;
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+
+ // Clear image view for clear test
+
+ if(gImageView1)
+ {
+ gImageView1.Reset();
+ }
+ if(gImageView2)
+ {
+ gImageView2.Reset();
+ }
+
+ gImageView1 = ImageView::New();
+ gImageView1.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ gImageView1.ResourceReadySignal().Connect(&OnResourceReadySignal07);
+ application.GetScene().Add(gImageView1);
+
+ application.SendNotification();
+ application.Render();
+
+ // Load gImageView1
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
+
+ tet_infoline("load image1 done");
+
+ // Load gImageView2 and mask
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalCounter, 1, TEST_LOCATION);
+
+ // gImageView2 mask apply done
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalCounter, 2, TEST_LOCATION);
+
+ tet_infoline("load image2 done");
+ END_TEST;
+}
+
+int UtcDaliImageViewUseSameUrlWithAnimatedImageVisual(void)
+{
+ tet_infoline("Test multiple views with same image in animated image visual");
+ ToolkitTestApplication application;
+
+ gImageView1 = ImageView::New(TEST_WEBP_FILE_NAME);
+ application.GetScene().Add(gImageView1);
+
+ tet_infoline("Remove imageView and Create new imageView with same url");
+ application.GetScene().Remove(gImageView1);
+ gImageView2 = ImageView::New(TEST_WEBP_FILE_NAME);
+ application.GetScene().Add(gImageView2);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Check the ImageView load image successfully");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ END_TEST;
+}
+
+int UtcDaliImageViewNpatchImageCacheTest01(void)
+{
+ tet_infoline("Test npatch image cached");
+
+ ToolkitTestApplication application;
+ ImageView imageView[2];
+
+ auto& gl = application.GetGlAbstraction();
+ gl.EnableTextureCallTrace(true);
+ auto& textureCallStack = gl.GetTextureTrace();
+ textureCallStack.Enable(true);
+ textureCallStack.EnableLogging(true);
+
+ auto TestNPatch = [&](int index, const std::string& nPatchImageUrl, const char* location) {
+ if(imageView[index])
+ {
+ imageView[index].Unparent();
+ }
+ imageView[index] = ImageView::New(nPatchImageUrl);
+ imageView[index].SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ application.GetScene().Add(imageView[index]);
+ };
+
+ TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_printf("trace : \n%s\n", textureCallStack.GetTraceString().c_str());
+
+ // Check we gen only 1 textures
+ DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 1, TEST_LOCATION);
+ textureCallStack.Reset();
+
+ // Let we use cached textures
+ for(int i = 0; i < 10; i++)
+ {
+ TestNPatch(1, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
+ TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
+ }
+
+ application.SendNotification();
+ application.Render();
+ // Check we use cached npatch data so we don't generate new texture textures
+ DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 0, TEST_LOCATION);
+
+ // Clear all cached
+ imageView[0].Unparent();
+ imageView[0].Reset();
+ imageView[1].Unparent();
+ imageView[1].Reset();
+
+ application.SendNotification();
+ application.Render();
+
+ textureCallStack.Reset();
+ // Let we use deference textures
+ TestNPatch(1, TEST_BROKEN_IMAGE_S, TEST_LOCATION);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+ // Try to load multiple times.
+ for(int i = 0; i < 3; i++)
+ {
+ TestNPatch(0, TEST_BROKEN_IMAGE_M, TEST_LOCATION);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ TestNPatch(1, TEST_BROKEN_IMAGE_S, TEST_LOCATION);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ }
+ application.SendNotification();
+ application.Render();
+
+ imageView[0].Unparent();
+ imageView[0].Reset();
+ imageView[1].Unparent();
+ imageView[1].Reset();
+
+ application.SendNotification();
+ application.Render();
+
+ // Check memory leak
+ DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), textureCallStack.CountMethod("DeleteTextures"), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageViewNpatchImageCacheTest02(void)
+{
+ tet_infoline("Test npatch image cached with border");
+
+ ToolkitTestApplication application;
+ ImageView imageView[2];
+
+ auto& gl = application.GetGlAbstraction();
+ gl.EnableTextureCallTrace(true);
+ auto& textureCallStack = gl.GetTextureTrace();
+ textureCallStack.Enable(true);
+ textureCallStack.EnableLogging(true);
+
+ auto TestBorderImage = [&](int index, const std::string& normalImageUrl, const Rect<int> border, const char* location) {
+ Property::Map map;
+ map[Toolkit::Visual::Property::TYPE] = Toolkit::Visual::N_PATCH;
+ map[Toolkit::ImageVisual::Property::URL] = normalImageUrl;
+ map[Toolkit::ImageVisual::Property::BORDER] = border;
+
+ imageView[index] = ImageView::New();
+ imageView[index].SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView[index].SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ application.GetScene().Add(imageView[index]);
+ };
+
+ TestBorderImage(0, gImage_34_RGBA, Rect<int>(0, 0, 0, 0), TEST_LOCATION);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_printf("trace : \n%s\n", textureCallStack.GetTraceString().c_str());
+
+ // Check we gen only 1 textures
+ DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 1, TEST_LOCATION);
+ textureCallStack.Reset();
+
+ // Let we use cached textures
+ for(int i = 0; i < 10; i++)
+ {
+ TestBorderImage(0, gImage_34_RGBA, Rect<int>(i, i + 1, i + 2, i + 3), TEST_LOCATION);
+ TestBorderImage(1, gImage_34_RGBA, Rect<int>(i + 1, i, i + 3, i + 2), TEST_LOCATION);
+ }
+
+ application.SendNotification();
+ application.Render();
+
+ // Check we use cached npatch data so we don't generate new texture textures
+ DALI_TEST_EQUALS(textureCallStack.CountMethod("GenTextures"), 0, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageViewPlaceholderImage01(void)
+{
+ tet_infoline("Test imageView use placeholder image");
+
+ ToolkitTestApplication application;
+ Property::Map map;
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+
+ ImageView imageView = ImageView::New();
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ application.GetScene().Add(imageView);
+
+ Property::Value value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
+ std::string url;
+ DALI_TEST_CHECK(value.Get(url));
+ DALI_TEST_CHECK(url.empty());
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+
+ application.SendNotification();
+ application.Render();
+
+ value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
+ DALI_TEST_CHECK(value.Get(url));
+ DALI_TEST_CHECK(url == gImage_34_RGBA);
+
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ // Replace Image test
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ map[ImageView::Property::PLACEHOLDER_IMAGE] = gImage_34_RGBA;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = "";
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ // Replace Image test2
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_2;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render(900);
+
+ map[Toolkit::ImageVisual::Property::URL] = "";
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ END_TEST;
+}
+
+int UtcDaliImageViewPlaceholderImage02(void)
+{
+ tet_infoline("Test imageView use placeholder image without resource ready");
+
+ ToolkitTestApplication application;
+
+ Property::Map map;
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+
+ ImageView imageView = ImageView::New();
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), false, TEST_LOCATION);
+ imageView.ResourceReadySignal().Connect(&ResourceReadySignal);
+ application.GetScene().Add(imageView);
+
+ Property::Value value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
+ std::string url;
+ DALI_TEST_CHECK(value.Get(url));
+ DALI_TEST_CHECK(url.empty());
+
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
+ DALI_TEST_CHECK(value.Get(url));
+ DALI_TEST_CHECK(url == gImage_34_RGBA);
+
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+ gResourceReadySignalFired = false;
+ map[Toolkit::ImageVisual::Property::URL] = "";
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(imageView.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageViewTransitionEffect01(void)
+{
+ tet_infoline("Test imageView use transition effect");
+
+ ToolkitTestApplication application;
+ Property::Map map;
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+ map[Toolkit::Visual::Property::OPACITY] = 0.9f;
+
+ ImageView imageView = ImageView::New();
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ application.GetScene().Add(imageView);
+
+ Property::Value value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
+ bool transition;
+ DALI_TEST_CHECK(value.Get(transition));
+ DALI_TEST_CHECK(transition == false);
+ imageView.SetProperty(Toolkit::ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
+
+ application.SendNotification();
+ application.Render();
+
+ value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
+ DALI_TEST_CHECK(value.Get(transition));
+ DALI_TEST_CHECK(transition == true);
+
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render();
+
+ // Test transition effect with placeholder
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = "";
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ application.SendNotification();
+
+ map[Toolkit::ImageVisual::Property::URL] = "";
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, "");
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = "";
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ // Test transition effect without placeholder
+ map[Toolkit::ImageVisual::Property::URL] = TEST_IMAGE_1;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = "";
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ map[Toolkit::ImageVisual::Property::URL] = gImage_600_RGB;
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ imageView.SetImage(TEST_IMAGE_1);
+ application.SendNotification();
+ application.Render();
+
+ imageView.SetImage(gImage_600_RGB);
+ application.SendNotification();
+ application.Render(9000);
+
+ imageView.SetImage("");
+ application.SendNotification();
+ application.Render();
+
+ imageView.SetImage(TEST_IMAGE_1);
+ application.SendNotification();
+ application.Render();
+
+ // Clear all cached
+ imageView.Unparent();
+ imageView.Reset();
+
+ END_TEST;
+}
+
+int UtcDaliImageViewTransitionEffect02(void)
+{
+ tet_infoline("Test imageView use transition effect with replace image");
+
+ ToolkitTestApplication application;
+
+ Property::Map map;
+
+ ImageView imageView = ImageView::New();
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ application.GetScene().Add(imageView);
+
+ Property::Value value;
+ value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
+ bool transition;
+ DALI_TEST_CHECK(value.Get(transition));
+ DALI_TEST_CHECK(transition == false);
+ imageView.SetProperty(Toolkit::ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
+
+ value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
+ std::string url;
+ DALI_TEST_CHECK(value.Get(url));
+ DALI_TEST_CHECK(url.empty());
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ application.SendNotification();
+ application.Render();
+
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, "");
+ application.SendNotification();
+ application.Render();
+
+ imageView.SetProperty(Toolkit::ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ application.SendNotification();
+ application.Render();
+
+ value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
+ DALI_TEST_CHECK(value.Get(transition));
+ DALI_TEST_CHECK(transition == true);
+
+ value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
+ DALI_TEST_CHECK(value.Get(url));
+ DALI_TEST_CHECK(url == gImage_34_RGBA);
+
+ imageView.SetProperty(Toolkit::ImageView::Property::IMAGE, map);
+ application.SendNotification();
+ application.Render();
+
+ // Clear all cached
+ imageView.Unparent();
+ imageView.Reset();
+
+ END_TEST;
+}
+
+int UtcDaliImageViewTransitionEffect03(void)
+{
+ tet_infoline("Test imageView use transition effect with placeholder");
+
+ ToolkitTestApplication application;
+ Property::Map map;
+
+ ImageView imageView = ImageView::New();
+ imageView.SetImage("");
+ imageView.SetProperty(Actor::Property::SIZE, Vector2(100.0f, 200.0f));
+ imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ imageView.SetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT, true);
+ application.GetScene().Add(imageView);
+
+ //DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(16);
+
+ tet_infoline("(1)");
+ imageView.SetImage(gImage_600_RGB);
+ imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render(16);
+
+ Property::Value value;
+ value = imageView.GetProperty(ImageView::Property::ENABLE_TRANSITION_EFFECT);
+ bool transition;
+ DALI_TEST_CHECK(value.Get(transition));
+ DALI_TEST_CHECK(transition == true);
+
+ value = imageView.GetProperty(ImageView::Property::PLACEHOLDER_IMAGE);
+ std::string url;
+ DALI_TEST_CHECK(value.Get(url));
+ DALI_TEST_CHECK(url == gImage_34_RGBA);
+
+ imageView.SetImage("");
+ application.SendNotification();
+ application.Render(16);
+
+ imageView.SetImage(TEST_IMAGE_1);
+ imageView.SetProperty(ImageView::Property::PLACEHOLDER_IMAGE, gImage_34_RGBA);
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render(16);
+
+ // Clear all cached
+ imageView.Unparent();
+ imageView.Reset();
+
+ END_TEST;
+}