/*
- * 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.
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;
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;
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;
+}