+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualReleasePolicy09(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualReleasePolicy09 Destroyed Policy with N-Patch, Texture should be deleted when visual destroyed");
+
+ Property::Map propertyMapNPatchReleasePolicy;
+ propertyMapNPatchReleasePolicy.Insert(Visual::Property::TYPE, Visual::N_PATCH);
+ propertyMapNPatchReleasePolicy.Insert(ImageVisual::Property::URL, TEST_N_PATCH_IMAGE_FILE_NAME);
+ propertyMapNPatchReleasePolicy.Insert(DevelImageVisual::Property::AUXILIARY_IMAGE, TEST_MASK_IMAGE_FILE_NAME);
+ propertyMapNPatchReleasePolicy.Insert(DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA, 0.9f);
+ propertyMapNPatchReleasePolicy.Insert(ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DESTROYED);
+
+ VisualFactory factory = VisualFactory::Get();
+ Visual::Base imageVisual = factory.CreateVisual(propertyMapNPatchReleasePolicy);
+ DALI_TEST_CHECK(imageVisual);
+
+ // Setup debug trace
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ tet_infoline("Register visual with control and ensure it has the only handle");
+ DummyControl actor = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
+
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ application.SendNotification();
+ application.Render(0);
+ DALI_TEST_CHECK(actor.GetRendererCount() == 0u);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+
+ application.GetScene().Add(actor);
+
+ // Wait for image to load
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render(0);
+ // Test renderer and texture created
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+
+ DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
+ tet_infoline("Destroy visual by UnRegistering visual with control, check renderer is destroyed");
+ dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
+ DALI_TEST_CHECK(actor.GetRendererCount() == 0u);
+ application.SendNotification();
+ application.Render();
+
+ // Test texture removed after visual destroyed.
+ tet_infoline("Ensure texture is deleted after visual destroyed");
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 2, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualLoadPolicy01(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualLoadPolicy01 Load a visual image before attaching to stage");
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ tet_infoline("Create visual with IMMEDIATE load policy");
+ VisualFactory factory = VisualFactory::Get();
+
+ Property::Map propertyMap;
+ propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
+ propertyMap.Insert(ImageVisual::Property::URL, TEST_IMAGE_FILE_NAME);
+ propertyMap.Insert(ImageVisual::Property::DESIRED_WIDTH, 20);
+ propertyMap.Insert(ImageVisual::Property::DESIRED_HEIGHT, 30);
+ propertyMap.Insert("loadPolicy", ImageVisual::LoadPolicy::IMMEDIATE);
+
+ Visual::Base imageVisual = factory.CreateVisual(propertyMap);
+
+ Property::Map resultMap;
+ imageVisual.CreatePropertyMap(resultMap);
+ DALI_TEST_CHECK(!resultMap.Empty());
+ DALI_TEST_EQUALS((resultMap.Find(ImageVisual::Property::LOAD_POLICY))->Get<int>(), (int)ImageVisual::LoadPolicy::IMMEDIATE, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ // Ensure texture has been uploaded
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Ensure texture loading starts after visual created");
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ textureTrace.Reset();
+
+ tet_infoline("Register visuals with control and ensure it has the only handles");
+ DummyControl actor = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
+
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ application.GetScene().Add(actor);
+ tet_infoline("Ensure nothing triggers another load as texure already loaded");
+ const unsigned int TIME_OUT_3_SECONDS = 3;
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, TIME_OUT_3_SECONDS), false, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+
+ // Ensure texture is deleted when no longer needed (ref count was correct )
+ dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualLoadPolicy02(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualLoadPolicy01 Load a visual image only after attached to stage");
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ tet_infoline("Create visual with IMMEDIATE load policy");
+ Visual::Base imageVisual = CreateVisualWithPolicy(TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED);
+
+ const unsigned int TIME_OUT_3_SECONDS = 3;
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, TIME_OUT_3_SECONDS), false, TEST_LOCATION);
+
+ // Act on meeage queue even although nothing expected to load
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Ensure texture is not generated yet");
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION);
+ textureTrace.Reset();
+
+ tet_infoline("Register visuals with control and ensure it has the only handles");
+ DummyControl actor = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
+
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ application.GetScene().Add(actor);
+ tet_infoline("Allow image time to load");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Ensure texture generated and renderer created");
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+
+ // Ensure texture is delete when no longer needed
+ dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.CountMethod("DeleteTextures"), 1, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualLoadPolicy03(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualLoadPolicy03 Load a visual image and receive ResourceReady Signal when loaded");
+
+ const bool VISUAL_NOT_ENABLED(false); // Instead of just passing 'false' into an API.
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ tet_infoline("Create a control and connect to resource ready signal without adding to stage");
+ DummyControl actor = DummyControl::New(true);
+ actor.ResourceReadySignal().Connect(&ResourceReadySignal);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ tet_infoline("Create visual with IMMEDIATE load policy");
+ Visual::Base imageVisual = CreateVisualWithPolicy(TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE);
+
+ tet_infoline("Registering visual allows control to get a signal once loaded even if visual not enabled( not staged )");
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual, VISUAL_NOT_ENABLED);
+ imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
+
+ tet_infoline("Allow image time to load resource");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render();
+
+ // Ensure texture has been uploaded
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualLoadPolicy04(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualLoadPolicy04 First part Load a visual image before attaching to stage");
+ tet_infoline("Second part, Reuse the same image in aonther control and check resource ready signal fired");
+
+ const bool VISUAL_NOT_ENABLED(false); // Instead of just passing false into an API.
+
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ tet_infoline("Create a control and connect to resource ready signal");
+ DummyControl actor = DummyControl::New(true);
+ actor.ResourceReadySignal().Connect(&ResourceReadySignal);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+
+ tet_infoline("Create visual with IMMEDIATE load policy");
+ Visual::Base imageVisual = CreateVisualWithPolicy(TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE);
+
+ tet_infoline("Registering visual allows control to get a signal once loaded even if visual not enabled( staged )");
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual, VISUAL_NOT_ENABLED);
+ imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
+
+ tet_infoline("Allow image time to load");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Testing texture is loaded and resource ready signal fired");
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, false, TEST_LOCATION);
+
+ tet_infoline("Original control correctly signalled, now testing for signal with new Control reusing the image");
+
+ gResourceReadySignalFired = false; // Reset signal check ready for testing next Control
+ Visual::Base imageVisual2 = CreateVisualWithPolicy(TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE);
+ DummyControl actor2 = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ actor2.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ tet_infoline("Registering visual this should trigger the loading signal as is already image loaded for previous control");
+ dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual2);
+ imageVisual2.Reset(); // reduce ref count so only the control keeps the visual alive.
+ actor2.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(0), true, TEST_LOCATION); // Not expecting any further loading as texture is being reused.
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualLoadPolicy05(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualLoadPolicy05 LoadPolicy::ATTACHED (default) First part Load a visual image before attaching to stage");
+ tet_infoline("Second part, Reuse the same image in aonther control and check resource ready signal fired");
+ // Set up trace debug
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ tet_infoline("Create a control and connect to resource ready signal");
+ DummyControl actor = DummyControl::New(true);
+ actor.ResourceReadySignal().Connect(&ResourceReadySignal);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ application.GetScene().Add(actor);
+
+ tet_infoline("Create visual with ATTACHED load policy");
+ Visual::Base imageVisual = CreateVisualWithPolicy(TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED);
+
+ tet_infoline("Registering visual allows control to get a signal once loaded");
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ imageVisual.Reset(); // reduce ref count so only the control keeps the visual alive.
+
+ tet_infoline("Allow image time to load");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Testing texture is loaded and resource ready signal fired");
+ DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+ tet_infoline("Original control correctly signalled, now testing for signal with new Control reusing the image");
+
+ gResourceReadySignalFired = false; // Reset signal check ready for testing next Control
+ Visual::Base imageVisual2 = CreateVisualWithPolicy(TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED);
+ DummyControl actor2 = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ actor2.ResourceReadySignal().Connect(&ResourceReadySignal);
+
+ tet_infoline("Registering visual this should trigger the loading signal as is already image loaded for previous control");
+ dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual2);
+ imageVisual2.Reset(); // reduce ref count so only the control keeps the visual alive.
+ actor2.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(0), true, TEST_LOCATION); // Not expecting any further loading as texture is being reused.
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualOrientationCorrection(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualOrientationCorrection Enabling OrientationCorrection should rotate an image with exif (90deg) orientation data with requested");
+
+ VisualFactory factory = VisualFactory::Get();
+ tet_infoline("Create visual with Orientation correction set OFF");
+ Property::Map propertyMap;
+ propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
+ propertyMap.Insert(ImageVisual::Property::URL, TEST_ROTATED_IMAGE);
+ propertyMap.Insert("orientationCorrection", false);
+ Visual::Base imageVisual = factory.CreateVisual(propertyMap);
+
+ tet_infoline("Create control for visual, need to loaded it");
+ DummyControl actor = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ application.GetScene().Add(actor);
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ // Wait for image to load
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ Vector2 originalImageSize;
+ tet_infoline("Get size of original visual to compare later with rotated image");
+ imageVisual.GetNaturalSize(originalImageSize);
+ DALI_TEST_GREATER(originalImageSize.width, originalImageSize.height, TEST_LOCATION); // Width and Height must be different for this test.
+ imageVisual.Reset(); // remove handle so can unregister it and remove from cache
+ dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Create visual with Orientation correction set ON ");
+ propertyMap.Clear();
+ propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
+ propertyMap.Insert(ImageVisual::Property::URL, TEST_ROTATED_IMAGE);
+ propertyMap.Insert(ImageVisual::Property::ORIENTATION_CORRECTION, true);
+ imageVisual = factory.CreateVisual(propertyMap);
+
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual);
+ // Wait for image to load
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ Vector2 rotatedImageSize;
+ imageVisual.GetNaturalSize(rotatedImageSize);
+ tet_infoline("Confirm that visual has rotated");
+ DALI_TEST_EQUALS(originalImageSize.width, rotatedImageSize.height, TEST_LOCATION);
+ DALI_TEST_EQUALS(originalImageSize.height, rotatedImageSize.width, TEST_LOCATION);
+
+ Property::Map resultMap;
+ imageVisual.CreatePropertyMap(resultMap);
+
+ // check the Property::ORIENTATION_CORRECTION value from the returned map
+ Property::Value* typeValue = resultMap.Find(ImageVisual::Property::ORIENTATION_CORRECTION, Property::BOOLEAN);
+ DALI_TEST_EQUALS(typeValue->Get<bool>(), true, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualCustomShader(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualCustomShader Test custom shader");
+
+ VisualFactory factory = VisualFactory::Get();
+ Property::Map properties;
+ Property::Map shader;
+ const std::string vertexShader = "Foobar";
+ const std::string fragmentShader = "Foobar";
+ shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
+ shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
+
+ properties[Visual::Property::TYPE] = Visual::IMAGE;
+ properties[Visual::Property::SHADER] = shader;
+ properties[ImageVisual::Property::URL] = TEST_IMAGE_FILE_NAME;
+
+ Visual::Base visual = factory.CreateVisual(properties);
+
+ // trigger creation through setting on stage
+ DummyControl dummy = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummy.GetImplementation());
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
+
+ dummy.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ dummy.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+ application.GetScene().Add(dummy);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ Renderer renderer = dummy.GetRendererAt(0);
+ Shader shader2 = renderer.GetShader();
+ Property::Value value = shader2.GetProperty(Shader::Property::PROGRAM);
+ Property::Map* map = value.GetMap();
+ DALI_TEST_CHECK(map);
+
+ Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp
+ DALI_TEST_EQUALS(fragmentShader, fragment->Get<std::string>(), TEST_LOCATION);
+
+ Property::Value* vertex = map->Find("vertex"); // vertex key name from shader-impl.cpp
+ DALI_TEST_EQUALS(vertexShader, vertex->Get<std::string>(), TEST_LOCATION);
+
+ shader.Clear();
+
+ shader[Visual::Shader::Property::HINTS] = Shader::Hint::OUTPUT_IS_TRANSPARENT;
+ properties[Visual::Property::SHADER] = shader;
+
+ Visual::Base visual1 = factory.CreateVisual(properties);
+
+ // trigger creation through setting on stage
+ DummyControl dummy1 = DummyControl::New(true);
+ Impl::DummyControl& dummyImpl1 = static_cast<Impl::DummyControl&>(dummy1.GetImplementation());
+ dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual1);
+ dummy1.SetProperty(Actor::Property::SIZE, Vector2(200, 200));
+ dummy1.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
+ application.GetScene().Add(dummy1);
+
+ TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
+ glAbstraction.EnableEnableDisableCallTrace(true);
+
+ application.SendNotification();
+ application.Render();
+
+ TraceCallStack& glEnableStack = glAbstraction.GetEnableDisableTrace();
+ std::ostringstream blendStr;
+ blendStr << std::hex << GL_BLEND;
+ DALI_TEST_CHECK(glEnableStack.FindMethodAndParams("Enable", blendStr.str()));
+
+ END_TEST;
+}
+
+void ResourceReadyLoadNext(Control control)
+{
+ static int callNumber = 0;
+
+ gResourceReadySignalFired = true;
+ gReadyIds.push_back(control.GetProperty<int>(Actor::Property::ID));
+
+ if(callNumber == 0)
+ {
+ DALI_TEST_EQUALS(control.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL), Toolkit::Visual::ResourceStatus::FAILED, TEST_LOCATION);
+
+ tet_infoline("Create visual with loaded image from within the signal handler");
+ VisualFactory factory = VisualFactory::Get();
+ Visual::Base imageVisual = factory.CreateVisual(TEST_IMAGE_FILE_NAME, ImageDimensions{20, 30});
+
+ Impl::DummyControl& controlImpl = static_cast<Impl::DummyControl&>(control.GetImplementation());
+ controlImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual); // This should trigger another signal.
+ callNumber = 1;
+ }
+ else
+ {
+ tet_infoline("3rd signal called");
+ DALI_TEST_CHECK(true);
+ }
+}
+
+int UtcDaliImageVisualLoadReady01(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline("UtcDaliImageVisualLoadReady01");
+ tet_infoline("First part: Load an image visual for one resource, then another image visual for a second resource.");
+ tet_infoline("Second part, In the ready signal for the second image visual, add a 3rd visual with the first URL");
+ tet_infoline("Should get a ready signal for all three visuals");
+
+ ClearReadyIds();
+
+ tet_infoline("Create a control and connect to resource ready signal");
+ DummyControl actor = DummyControl::New(true);
+ int actor1Id = actor.GetProperty<int>(Actor::Property::ID);
+ actor.ResourceReadySignal().Connect(&ResourceReadySignal);
+ Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(actor.GetImplementation());
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ application.GetScene().Add(actor);
+
+ tet_infoline("Create visual with IMMEDIATE load policy");
+ Visual::Base imageVisual1 = CreateVisualWithPolicy(TEST_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE);
+
+ tet_infoline("Registering visual allows control to get a signal once loaded even if visual not enabled( staged )");
+ dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual1);
+
+ tet_infoline("Allow image time to load");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ application.SendNotification();
+ application.Render();
+
+ tet_infoline("Testing texture is loaded and resource ready signal fired");
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gReadyIds[0], actor1Id, TEST_LOCATION);
+
+ tet_infoline("Original control correctly signalled, now testing failing image");
+
+ gResourceReadySignalFired = false; // Reset signal check ready for testing next Control
+ ClearReadyIds();
+
+ Visual::Base imageVisual2 = CreateVisualWithPolicy(TEST_BROKEN_IMAGE_FILE_NAME, ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::IMMEDIATE);
+
+ DummyControl actor2 = DummyControl::New(true);
+ int actor2Id = actor2.GetProperty<int>(Actor::Property::ID);
+ Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(actor2.GetImplementation());
+ actor2.ResourceReadySignal().Connect(&ResourceReadyLoadNext);
+
+ tet_infoline("Registering visual this should trigger the ready signal when the image fails to load");
+ dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, imageVisual2);
+
+ actor2.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ application.GetScene().Add(actor2);
+
+ tet_infoline("Wait for loading thread to finish");
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(gResourceReadySignalFired, true, TEST_LOCATION);
+
+ DALI_TEST_EQUALS(gReadyIds[0], actor2Id, TEST_LOCATION);
+
+ tet_infoline("Check for 3rd signal");
+ application.SendNotification();
+ DALI_TEST_EQUALS(gReadyIds.size(), 2, TEST_LOCATION);
+ DALI_TEST_EQUALS(gReadyIds[1], actor2Id, TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliImageVisualLoadImagePlanes01(void)
+{
+ EnvironmentVariable::SetTestEnvironmentVariable(LOAD_IMAGE_YUV_PLANES_ENV, "1");
+ EnvironmentVariable::SetTestEnvironmentVariable(ENABLE_DECODE_JPEG_TO_YUV_420_ENV, "1");
+
+ ToolkitTestApplication application;
+
+ VisualFactory factory = VisualFactory::Get();
+ DALI_TEST_CHECK(factory);
+
+ Property::Map propertyMap;
+ propertyMap.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
+ propertyMap.Insert(ImageVisual::Property::URL, TEST_YUV420_IMAGE_FILE_NAME);
+
+ Visual::Base visual = factory.CreateVisual(propertyMap);
+ DALI_TEST_CHECK(visual);
+
+ DummyControl actor = DummyControl::New();
+ DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
+ dummyImpl.RegisterVisual(Control::CONTROL_PROPERTY_END_INDEX + 1, visual);
+ actor.SetProperty(Actor::Property::SIZE, Vector2(200.f, 200.f));
+ application.GetScene().Add(actor);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
+
+ TestGlAbstraction& gl = application.GetGlAbstraction();
+ TraceCallStack& textureTrace = gl.GetTextureTrace();
+ textureTrace.Enable(true);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION);
+ DALI_TEST_EQUALS(actor.IsResourceReady(), true, TEST_LOCATION);
+ DALI_TEST_EQUALS(textureTrace.CountMethod("GenTextures"), 3, TEST_LOCATION);