X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-AnimatedVectorImageVisual.cpp;h=1eb713ea4b0202e100c30b97bffa2e8488098cdc;hb=HEAD;hp=41028c1f782b094d92d644365e22207bca1720bc;hpb=f0379552a8e3342b6606f5b64558cd24a7198b6c;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp index 41028c1..9ee13ac 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-AnimatedVectorImageVisual.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -24,6 +24,7 @@ #include #include #include "dummy-control.h" +#include "test-native-image-source.h" #include @@ -34,6 +35,8 @@ #include #include #include + +#include #include #include @@ -66,6 +69,100 @@ void VisualEventSignal(Control control, Dali::Property::Index visualIndex, Dali: } } +/** + * @brief Retry function to get playrange until expect values comes. + * @note This function might consume EventThreadTrigger. + * + * @param[in] dummyControl The control for test. + * @param[in] expectStartFrame Expect start frame. + * @param[in] expectEndFrame Expect end frame. + * @param[in] retrialFrames Retry required frame value list. + * @param[in] testLocation Location info of UTC. It will be used when UTC failed. + */ +void CheckAndRetryPlayRange(DummyControl dummyControl, int expectStartFrame, int expectEndFrame, std::vector> retrialFrames, const char* testLocation) +{ + int tryCount = 0; + int tryCountMax = 25; + while(++tryCount <= tryCountMax) + { + Property::Map resultMap = dummyControl.GetProperty(DummyControl::Property::TEST_VISUAL); + + Property::Value* value = resultMap.Find(DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY); + DALI_TEST_CHECK(value); + + Property::Array* result = value->GetArray(); + DALI_TEST_CHECK(result); + DALI_TEST_EQUALS(result->Count(), 2, TEST_LOCATION); + + bool tryAgain = false; + for(auto& framePair : retrialFrames) + { + if(result->GetElementAt(0).Get() == framePair.first && result->GetElementAt(1).Get() == framePair.second) + { + tryAgain = true; + break; + } + } + if(tryAgain) + { + tet_printf("Retry to get value again! [%d]\n", tryCount); + // Dummy sleep 1 second. + Test::WaitForEventThreadTrigger(1, 1); + continue; + } + + DALI_TEST_EQUALS(result->GetElementAt(0).Get(), expectStartFrame, testLocation); + DALI_TEST_EQUALS(result->GetElementAt(1).Get(), expectEndFrame, testLocation); + break; + } + DALI_TEST_CHECK(tryCount <= tryCountMax); +} + +/** + * @brief Retry function to get current frame until expect values comes. + * @note This function might consume EventThreadTrigger. + * + * @param[in] dummyControl The control for test. + * @param[in] expectCurrentFrame Expect current frame. + * @param[in] retrialFrames Retry required frame value list. + * @param[in] testLocation Location info of UTC. It will be used when UTC failed. + */ +void CheckAndRetryCurrentFrame(DummyControl dummyControl, int expectCurrentFrame, std::vector retrialFrames, const char* testLocation) +{ + int tryCount = 0; + int tryCountMax = 25; + while(++tryCount <= tryCountMax) + { + Property::Map resultMap = dummyControl.GetProperty(DummyControl::Property::TEST_VISUAL); + + Property::Value* value = resultMap.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER, Property::INTEGER); + DALI_TEST_CHECK(value); + + int32_t result = value->Get(); + + bool tryAgain = false; + for(auto& frame : retrialFrames) + { + if(result == frame) + { + tryAgain = true; + break; + } + } + if(tryAgain) + { + tet_printf("Retry to get value again! [%d]\n", tryCount); + // Dummy sleep 1 second. + Test::WaitForEventThreadTrigger(1, 1); + continue; + } + + DALI_TEST_EQUALS(result, expectCurrentFrame, testLocation); + break; + } + DALI_TEST_CHECK(tryCount <= tryCountMax); +} + } // namespace int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void) @@ -86,6 +183,9 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void) application.SendNotification(); application.Render(); + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + // renderer is added to actor DALI_TEST_CHECK(actor.GetRendererCount() == 1u); Renderer renderer = actor.GetRendererAt(0u); @@ -105,7 +205,8 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual02(void) Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -119,6 +220,9 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual02(void) application.SendNotification(); application.Render(); + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + // renderer is added to actor DALI_TEST_CHECK(actor.GetRendererCount() == 1u); Renderer renderer = actor.GetRendererAt(0u); @@ -145,8 +249,10 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void) .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) .Add(DevelImageVisual::Property::LOOP_COUNT, 3) .Add(DevelImageVisual::Property::PLAY_RANGE, playRange) + .Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, 2.0f) .Add(DevelVisual::Property::CORNER_RADIUS, 50.0f) - .Add(DevelVisual::Property::BORDERLINE_WIDTH, 20.0f); + .Add(DevelVisual::Property::BORDERLINE_WIDTH, 20.0f) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -160,8 +266,20 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void) application.SendNotification(); application.Render(); + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + // There might be 1 event triggered if start frame is not 0, and render frame spend long time. + // if ForceRenderOnce triggered before render complete, renderer count could be zero. + // Consume it if required. + if(actor.GetRendererCount() == 0) + { + tet_printf("Warning! render frame trigger not comes yet. Let we wait one more time.\n"); + Test::WaitForEventThreadTrigger(1, 1); + } + // renderer is added to actor - DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); Renderer renderer = actor.GetRendererAt(0u); DALI_TEST_CHECK(renderer); @@ -177,6 +295,7 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void) tet_infoline("UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map"); int startFrame = 1, endFrame = 3; + int desiredWidth = 100, desiredHeight = 150; float cornerRadius = 22.0f; float borderlineWidth = 2.0f; Vector4 borderlineColor = Vector4(1.0f, 1.0f, 1.0f, 1.0f); @@ -193,10 +312,15 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void) .Add("stopBehavior", DevelImageVisual::StopBehavior::FIRST_FRAME) .Add("loopingMode", DevelImageVisual::LoopingMode::AUTO_REVERSE) .Add("redrawInScalingDown", false) + .Add("enableFrameCache", false) + .Add("notifyAfterRasterization", false) + .Add("frameSpeedFactor", 0.5f) .Add("cornerRadius", cornerRadius) .Add("borderlineWidth", borderlineWidth) .Add("borderlineColor", borderlineColor) - .Add("borderlineOffset", borderlineOffset); + .Add("borderlineOffset", borderlineOffset) + .Add("desiredWidth", desiredWidth) + .Add("desiredHeight", desiredHeight); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -213,8 +337,17 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void) // Trigger count is 1 - render a frame DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + // There might be 1 event triggered if start frame is not 0, and render frame spend long time. + // if ForceRenderOnce triggered before render complete, renderer count could be zero. + // Consume it if required. + if(actor.GetRendererCount() == 0) + { + tet_printf("Warning! render frame trigger not comes yet. Let we wait one more time.\n"); + Test::WaitForEventThreadTrigger(1, 1); + } + // renderer is added to actor - DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); Renderer renderer = actor.GetRendererAt(0u); DALI_TEST_CHECK(renderer); @@ -252,6 +385,18 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void) DALI_TEST_CHECK(value); DALI_TEST_CHECK(value->Get() == false); + value = resultMap.Find(DevelImageVisual::Property::ENABLE_FRAME_CACHE, Property::BOOLEAN); + DALI_TEST_CHECK(value); + DALI_TEST_CHECK(value->Get() == false); + + value = resultMap.Find(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION, Property::BOOLEAN); + DALI_TEST_CHECK(value); + DALI_TEST_CHECK(value->Get() == false); + + value = resultMap.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR, Property::FLOAT); + DALI_TEST_CHECK(value); + DALI_TEST_CHECK(value->Get() == 0.5f); + value = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4); DALI_TEST_CHECK(value); DALI_TEST_EQUALS(value->Get(), Vector4(cornerRadius, cornerRadius, cornerRadius, cornerRadius), TEST_LOCATION); @@ -272,6 +417,14 @@ int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void) DALI_TEST_CHECK(value); DALI_TEST_EQUALS(value->Get(), borderlineOffset, TEST_LOCATION); + value = resultMap.Find(ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), desiredWidth, TEST_LOCATION); + + value = resultMap.Find(ImageVisual::Property::DESIRED_HEIGHT, Property::INTEGER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), desiredHeight, TEST_LOCATION); + actor.Unparent(); DALI_TEST_CHECK(actor.GetRendererCount() == 0u); @@ -284,6 +437,7 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void) tet_infoline("UtcDaliAnimatedVectorImageVisualGetPropertyMap01"); int startFrame = 1, endFrame = 3; + int desiredWidth = 100, desiredHeight = 150; Vector4 cornerRadius(50.0f, 22.0f, 0.0f, 3.0f); float borderlineWidth = 2.3f; Vector4 borderlineColor = Vector4(0.3f, 0.3f, 1.0f, 1.0f); @@ -301,7 +455,10 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void) .Add(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::RELATIVE) .Add(DevelVisual::Property::BORDERLINE_WIDTH, borderlineWidth) .Add(DevelVisual::Property::BORDERLINE_COLOR, borderlineColor) - .Add(DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset); + .Add(DevelVisual::Property::BORDERLINE_OFFSET, borderlineOffset) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false) + .Add(ImageVisual::Property::DESIRED_WIDTH, desiredWidth) + .Add(ImageVisual::Property::DESIRED_HEIGHT, desiredHeight); // request AnimatedVectorImageVisual with a property map VisualFactory factory = VisualFactory::Get(); @@ -319,7 +476,8 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void) application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); Property::Map resultMap; resultMap = actor.GetProperty(DummyControl::Property::TEST_VISUAL); @@ -357,6 +515,17 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void) value = resultMap.Find(DevelImageVisual::Property::CONTENT_INFO, Property::MAP); DALI_TEST_CHECK(value); + value = resultMap.Find(DevelImageVisual::Property::MARKER_INFO, Property::MAP); + DALI_TEST_CHECK(value); + + value = resultMap.Find(DevelImageVisual::Property::ENABLE_FRAME_CACHE, Property::BOOLEAN); + DALI_TEST_CHECK(value); + DALI_TEST_CHECK(value->Get() == false); // Check default value + + value = resultMap.Find(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION, Property::BOOLEAN); + DALI_TEST_CHECK(value); + DALI_TEST_CHECK(value->Get() == false); // Check default value + value = resultMap.Find(DevelImageVisual::Property::REDRAW_IN_SCALING_DOWN, Property::BOOLEAN); DALI_TEST_CHECK(value); DALI_TEST_CHECK(value->Get() == true); // Check default value @@ -381,6 +550,14 @@ int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void) DALI_TEST_CHECK(value); DALI_TEST_EQUALS(value->Get(), borderlineOffset, TEST_LOCATION); + value = resultMap.Find(ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), desiredWidth, TEST_LOCATION); + + value = resultMap.Find(ImageVisual::Property::DESIRED_HEIGHT, Property::INTEGER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), desiredHeight, TEST_LOCATION); + // request AnimatedVectorImageVisual with an URL Visual::Base visual2 = factory.CreateVisual(TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions()); @@ -411,7 +588,8 @@ int UtcDaliAnimatedVectorImageVisualPlayback(void) Visual::Base visual = factory.CreateVisual( Property::Map() .Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME)); + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false)); DummyControl dummyControl = DummyControl::New(true); Impl::DummyControl& dummyImpl = static_cast(dummyControl.GetImplementation()); @@ -558,6 +736,9 @@ int UtcDaliAnimatedVectorImageVisualCustomShader(void) application.SendNotification(); application.Render(); + // Trigger count is 1 - render a frame + 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); @@ -582,7 +763,11 @@ int UtcDaliAnimatedVectorImageVisualNaturalSize(void) tet_infoline("UtcDaliAnimatedVectorImageVisualNaturalSize"); VisualFactory factory = VisualFactory::Get(); - Visual::Base visual = factory.CreateVisual(TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions()); + Visual::Base visual = factory.CreateVisual( + Property::Map() + .Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false)); DALI_TEST_CHECK(visual); DummyControl actor = DummyControl::New(true); @@ -597,6 +782,9 @@ int UtcDaliAnimatedVectorImageVisualNaturalSize(void) application.SendNotification(); application.Render(); + // Trigger count is 1 - load + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + visual.GetNaturalSize(naturalSize); DALI_TEST_EQUALS(naturalSize, Vector2(100.0f, 100.0f), TEST_LOCATION); // 100x100 is the content default size. @@ -621,7 +809,8 @@ int UtcDaliAnimatedVectorImageVisualLoopCount(void) Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) - .Add(DevelImageVisual::Property::LOOP_COUNT, 3); + .Add(DevelImageVisual::Property::LOOP_COUNT, 3) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -641,11 +830,11 @@ int UtcDaliAnimatedVectorImageVisualLoopCount(void) application.SendNotification(); application.Render(); - // Trigger count is 1 - render a frame - DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); // renderer is added to actor - DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); Renderer renderer = actor.GetRendererAt(0u); DALI_TEST_CHECK(renderer); @@ -665,7 +854,8 @@ int UtcDaliAnimatedVectorImageVisualPlayRange(void) Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) - .Add(DevelImageVisual::Property::PLAY_RANGE, array); + .Add(DevelImageVisual::Property::PLAY_RANGE, array) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -685,15 +875,26 @@ int UtcDaliAnimatedVectorImageVisualPlayRange(void) application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + // There might be 1 event triggered if start frame is not 0, and render frame spend long time. + // if ForceRenderOnce triggered before render complete, renderer count could be zero. + // Consume it if required. + if(actor.GetRendererCount() == 0) + { + tet_printf("Warning! render frame trigger not comes yet. Let we wait one more time.\n"); + Test::WaitForEventThreadTrigger(1, 1); + } // renderer is added to actor - DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); Renderer renderer = actor.GetRendererAt(0u); DALI_TEST_CHECK(renderer); - Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - Property::Value* value = map.Find(DevelImageVisual::Property::PLAY_RANGE); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::PLAY_RANGE); + int totalFrameNumber = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER)->Get(); int resultStartFrame, resultEndFrame; Property::Array* result = value->GetArray(); @@ -706,26 +907,22 @@ int UtcDaliAnimatedVectorImageVisualPlayRange(void) // Set invalid play range array.Clear(); array.PushBack(1); - array.PushBack(100); + array.PushBack(totalFrameNumber + 100); attributes.Clear(); attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f)); + application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run - - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::PLAY_RANGE); - - result = value->GetArray(); - result->GetElementAt(0).Get(resultStartFrame); - result->GetElementAt(1).Get(resultEndFrame); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - DALI_TEST_EQUALS(startFrame, resultStartFrame, TEST_LOCATION); // Should not be changed - DALI_TEST_EQUALS(endFrame, resultEndFrame, TEST_LOCATION); + // Should be clamped. + CheckAndRetryPlayRange(actor, 1, totalFrameNumber - 1, {{startFrame, endFrame}}, TEST_LOCATION); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, Property::Map()); @@ -737,11 +934,11 @@ int UtcDaliAnimatedVectorImageVisualPlayRange(void) application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + // Jump to action when paused, will make one or more event trigger + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 3, TEST_LOCATION); + // Test whether current frame is 3. + CheckAndRetryCurrentFrame(actor, 3, {0, 1}, TEST_LOCATION); array.Clear(); array.PushBack(0); @@ -751,21 +948,17 @@ int UtcDaliAnimatedVectorImageVisualPlayRange(void) attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); + application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run - - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::PLAY_RANGE); - - result = value->GetArray(); - result->GetElementAt(0).Get(resultStartFrame); - result->GetElementAt(1).Get(resultEndFrame); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - DALI_TEST_EQUALS(0, resultStartFrame, TEST_LOCATION); - DALI_TEST_EQUALS(2, resultEndFrame, TEST_LOCATION); + CheckAndRetryPlayRange(actor, 0, 2, {{1, totalFrameNumber - 1}}, TEST_LOCATION); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); DALI_TEST_EQUALS(value->Get(), 2, TEST_LOCATION); // CURRENT_FRAME_NUMBER should be changed also. @@ -777,13 +970,15 @@ int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void) ToolkitTestApplication application; tet_infoline("UtcDaliAnimatedVectorImageVisualPlayRangeMarker"); + // Set 1 marker as array Property::Array array; array.PushBack(VECTOR_ANIMATION_MARKER_NAME_1); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) - .Add(DevelImageVisual::Property::PLAY_RANGE, array); + .Add(DevelImageVisual::Property::PLAY_RANGE, array) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -803,10 +998,20 @@ int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void) application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + // There might be 1 event triggered if start frame is not 0, and render frame spend long time. + // if ForceRenderOnce triggered before render complete, renderer count could be zero. + // Consume it if required. + if(actor.GetRendererCount() == 0) + { + tet_printf("Warning! render frame trigger not comes yet. Let we wait one more time.\n"); + Test::WaitForEventThreadTrigger(1, 1); + } // renderer is added to actor - DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); Renderer renderer = actor.GetRendererAt(0u); DALI_TEST_CHECK(renderer); @@ -821,6 +1026,31 @@ int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void) DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION); DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_END_FRAME_1, resultEndFrame, TEST_LOCATION); + // Set 1 marker as string + array.Clear(); + + attributes.Clear(); + attributes.Add(DevelImageVisual::Property::PLAY_RANGE, VECTOR_ANIMATION_MARKER_NAME_1); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(40.0f, 40.0f)); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::PLAY_RANGE); + + result = value->GetArray(); + result->GetElementAt(0).Get(resultStartFrame); + result->GetElementAt(1).Get(resultEndFrame); + + DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION); + DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_END_FRAME_1, resultEndFrame, TEST_LOCATION); + // Set 2 markers array.Clear(); array.PushBack(VECTOR_ANIMATION_MARKER_NAME_1); @@ -830,10 +1060,13 @@ int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void) attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f)); + application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); value = map.Find(DevelImageVisual::Property::PLAY_RANGE); @@ -854,10 +1087,13 @@ int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void) attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); + application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); value = map.Find(DevelImageVisual::Property::PLAY_RANGE); @@ -872,15 +1108,15 @@ int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void) END_TEST; } -int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void) +int UtcDaliAnimatedVectorImageVisualMarkerInfo(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal"); + tet_infoline("UtcDaliAnimatedVectorImageVisualMarkerInfo"); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) - .Add(DevelImageVisual::Property::LOOP_COUNT, 3); + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -889,8 +1125,6 @@ int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); - DevelControl::VisualEventSignal(actor).Connect(&VisualEventSignal); - Vector2 controlSize(20.f, 30.f); actor.SetProperty(Actor::Property::SIZE, controlSize); @@ -902,32 +1136,70 @@ int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void) application.SendNotification(); application.Render(); - // Wait for animation finish + // Trigger count is 2 - load & render a frame DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + // renderer is added to actor + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - Property::Value* value = map.Find(DevelImageVisual::Property::PLAY_STATE); - DALI_TEST_CHECK(value->Get() == DevelImageVisual::PlayState::STOPPED); + Property::Value* value = map.Find(DevelImageVisual::Property::MARKER_INFO); - DALI_TEST_EQUALS(gAnimationFinishedSignalFired, true, TEST_LOCATION); + DALI_TEST_CHECK(value); + + Property::Map* result = value->GetMap(); + DALI_TEST_CHECK(result); + + std::string resultMarkerName; + int resultStartFrame, resultEndFrame; + DALI_TEST_EQUALS(2u, result->Count(), TEST_LOCATION); + + for(uint32_t i = 0u; i < result->Count(); ++i) + { + if(result->GetKeyAt(i).stringKey == VECTOR_ANIMATION_MARKER_NAME_1) + { + Property::Array* frameArray = result->GetValue(i).GetArray(); + DALI_TEST_CHECK(frameArray); + frameArray->GetElementAt(0).Get(resultStartFrame); + frameArray->GetElementAt(1).Get(resultEndFrame); + + DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION); + DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_END_FRAME_1, resultEndFrame, TEST_LOCATION); + } + else if(result->GetKeyAt(i).stringKey == VECTOR_ANIMATION_MARKER_NAME_2) + { + Property::Array* frameArray = result->GetValue(i).GetArray(); + DALI_TEST_CHECK(frameArray); + frameArray->GetElementAt(0).Get(resultStartFrame); + frameArray->GetElementAt(1).Get(resultEndFrame); + + DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_START_FRAME_2, resultStartFrame, TEST_LOCATION); + DALI_TEST_EQUALS(VECTOR_ANIMATION_MARKER_END_FRAME_2, resultEndFrame, TEST_LOCATION); + } + else + { + DALI_TEST_CHECK(false); + } + } END_TEST; } -int UtcDaliAnimatedVectorImageVisualJumpTo(void) +int UtcDaliAnimatedVectorImageVisualMarkerInfoFromInvalid(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualJumpTo"); + tet_infoline("UtcDaliAnimatedVectorImageVisualMarkerInfoFromInvalid"); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + .Add(ImageVisual::Property::URL, "invalid.json") + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); - tet_printf("1. Visual is created.\n"); - DummyControl actor = DummyControl::New(true); DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); @@ -937,107 +1209,85 @@ int UtcDaliAnimatedVectorImageVisualJumpTo(void) application.GetScene().Add(actor); - application.SendNotification(); - application.Render(); - - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2); - - application.SendNotification(); - application.Render(); - - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run - - Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - Property::Value* value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 2, TEST_LOCATION); - - tet_printf("2. The current frame number is [%d].\n", value->Get()); - - Property::Array array; - array.PushBack(0); - array.PushBack(2); - Property::Map attributes; - attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run - - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 2, TEST_LOCATION); + // Trigger count is 1 - load, and failed. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - tet_printf("3. The current frame number is [%d].\n", value->Get()); + // renderer is added to actor + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); - // Change play range - attributes.Clear(); - array.Clear(); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::MARKER_INFO); - array.PushBack(0); - array.PushBack(4); + // The values when load failed case is invalid. + DALI_TEST_CHECK(value == nullptr || (value->GetMap() == nullptr) || (value->GetMap()->Empty())); - attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + END_TEST; +} - attributes.Clear(); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); +int UtcDaliAnimatedVectorImageVisualEnableFrameCache(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualEnableFrameCache"); - application.SendNotification(); - application.Render(); + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(DevelImageVisual::Property::ENABLE_FRAME_CACHE, true) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); - // Stop and jump to 3 - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes); + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3); + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + application.GetScene().Add(actor); application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run - - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 3, TEST_LOCATION); - - tet_printf("4. The current frame number is [%d].\n", value->Get()); + // Trigger count is 1 - load + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - // Jump to the same position - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3); + Vector2 controlSize(200.f, 200.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 3, TEST_LOCATION); + // renderer is added to actor + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); - tet_printf("5. The current frame number is [%d].\n", value->Get()); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::ENABLE_FRAME_CACHE); + DALI_TEST_CHECK(value->Get() == true); END_TEST; } -int UtcDaliAnimatedVectorImageVisualUpdateProperty(void) +int UtcDaliAnimatedVectorImageVisualEnableFrameCacheFailed(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualUpdateProperty"); - - int startFrame = 1, endFrame = 3; - Property::Array playRange; - playRange.PushBack(startFrame); - playRange.PushBack(endFrame); + tet_infoline("UtcDaliAnimatedVectorImageVisualEnableFrameCacheFailed"); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) - .Add(DevelImageVisual::Property::LOOP_COUNT, 3) - .Add(DevelImageVisual::Property::PLAY_RANGE, playRange); + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_INVALID_FILE_NAME) + .Add(DevelImageVisual::Property::ENABLE_FRAME_CACHE, true) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -1046,110 +1296,137 @@ int UtcDaliAnimatedVectorImageVisualUpdateProperty(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); - Vector2 controlSize(20.f, 30.f); + Vector2 controlSize(200.f, 200.f); actor.SetProperty(Actor::Property::SIZE, controlSize); application.GetScene().Add(actor); - application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + // Trigger count is 1 - load, and failed. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - Property::Value* value = map.Find(DevelImageVisual::Property::LOOP_COUNT); - DALI_TEST_EQUALS(value->Get(), 3, TEST_LOCATION); - - value = map.Find(DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY); - DALI_TEST_CHECK(value); + // renderer is added to actor + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); - Property::Array* result = value->GetArray(); - DALI_TEST_CHECK(result); + propertyMap.Clear(); + propertyMap.Add(DevelImageVisual::Property::ENABLE_FRAME_CACHE, true) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::DESIRED_WIDTH, 100) + .Add(ImageVisual::Property::DESIRED_HEIGHT, 100); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, propertyMap); - DALI_TEST_CHECK(result->GetElementAt(0).Get() == startFrame); - DALI_TEST_CHECK(result->GetElementAt(1).Get() == endFrame); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::ENABLE_FRAME_CACHE); + DALI_TEST_CHECK(value->Get() == true); - playRange.Clear(); - playRange.PushBack(0); - playRange.PushBack(2); + END_TEST; +} - Property::Map attributes; - attributes.Add(DevelImageVisual::Property::PLAY_RANGE, playRange); - attributes.Add(DevelImageVisual::Property::LOOP_COUNT, 5); +int UtcDaliAnimatedVectorImageVisualNotifyAfterRasterization(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualNotifyAfterRasterization"); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION, true) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); - application.SendNotification(); - application.Render(); + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::LOOP_COUNT); - DALI_TEST_EQUALS(value->Get(), 5, TEST_LOCATION); + application.GetScene().Add(actor); - value = map.Find(DevelImageVisual::Property::PLAY_RANGE); - result = value->GetArray(); - DALI_TEST_CHECK(result); + application.SendNotification(); + application.Render(); - DALI_TEST_CHECK(result->GetElementAt(0).Get() == 0); - DALI_TEST_CHECK(result->GetElementAt(1).Get() == 2); + // Trigger count is 1 - load + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - attributes.Clear(); + Vector2 controlSize(200.f, 200.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); - playRange.Clear(); - playRange.PushBack(startFrame); - playRange.PushBack(endFrame); + application.SendNotification(); + application.Render(); - attributes.Add(DevelImageVisual::Property::PLAY_RANGE, playRange); + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + // Play animation + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(20)); // wait for next rasterize thread run + // There might be 1 event triggered if render frame spend long time. + // if ForceRenderOnce triggered before render complete, renderer count could be zero. + // Consume it if required. + if(actor.GetRendererCount() == 0) + { + tet_printf("Warning! render frame trigger not comes yet. Let we wait one more time.\n"); + Test::WaitForEventThreadTrigger(1, 1); + } - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::PLAY_RANGE); + // renderer is added to actor + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); - result = value->GetArray(); - DALI_TEST_CHECK(result); + // Check renderer behavior + DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::IF_REQUIRED); - DALI_TEST_CHECK(result->GetElementAt(0).Get() == startFrame); - DALI_TEST_CHECK(result->GetElementAt(1).Get() == endFrame); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION); + DALI_TEST_CHECK(value->Get() == true); - // Play and update property - attributes.Clear(); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + propertyMap.Clear(); + propertyMap.Add(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION, false); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, propertyMap); application.SendNotification(); application.Render(); - attributes.Add(DevelImageVisual::Property::LOOP_COUNT, 10); + // Check renderer behavior again + DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::CONTINUOUSLY); - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION); + DALI_TEST_CHECK(value->Get() == false); + + propertyMap.Clear(); + propertyMap.Add(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION, true); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, propertyMap); application.SendNotification(); application.Render(); + // Check renderer behavior again + DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::IF_REQUIRED); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::LOOP_COUNT); - DALI_TEST_EQUALS(value->Get(), 10, TEST_LOCATION); + value = map.Find(DevelImageVisual::Property::NOTIFY_AFTER_RASTERIZATION); + DALI_TEST_CHECK(value->Get() == true); END_TEST; } -int UtcDaliAnimatedVectorImageVisualStopBehavior(void) +int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualStopBehavior"); + tet_infoline("UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal"); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) - .Add(DevelImageVisual::Property::LOOP_COUNT, 3) - .Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME); + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -1158,97 +1435,57 @@ int UtcDaliAnimatedVectorImageVisualStopBehavior(void) DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + DevelControl::VisualEventSignal(actor).Connect(&VisualEventSignal); + Vector2 controlSize(20.f, 30.f); actor.SetProperty(Actor::Property::SIZE, controlSize); application.GetScene().Add(actor); - Property::Map attributes; - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); - - application.SendNotification(); - application.Render(); - - // Trigger count is 1 - animation finished - DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); - - Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - Property::Value* value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); // Should be the first frame - - // Change stop behavior - attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME); - - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - - attributes.Clear(); - - // Play again - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); - application.SendNotification(); application.Render(); - // Trigger count is 1 - animation finished + // Trigger count is 1 - render a frame DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - - Property::Value* value1 = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); - int totalFrameNumber = value1->Get(); - - value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), totalFrameNumber - 1, TEST_LOCATION); // Should be the last frame - - // Change stop behavior - attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME); - attributes.Add(DevelImageVisual::Property::LOOP_COUNT, -1); - - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - - attributes.Clear(); + propertyMap.Clear(); + propertyMap.Add(DevelImageVisual::Property::LOOP_COUNT, 3); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, propertyMap); - // Play again + Property::Map attributes; DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); application.SendNotification(); application.Render(); - // Pause - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes); - - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - int currentFrameNumber = value->Get(); - - // Stop - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes); + // Wait for animation finish + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - application.SendNotification(); - application.Render(16); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::PLAY_STATE); + DALI_TEST_CHECK(value->Get() == DevelImageVisual::PlayState::STOPPED); - map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), currentFrameNumber, TEST_LOCATION); // Should be same with currentFrameNumber + DALI_TEST_EQUALS(gAnimationFinishedSignalFired, true, TEST_LOCATION); END_TEST; } -int UtcDaliAnimatedVectorImageVisualLoopingMode(void) +int UtcDaliAnimatedVectorImageVisualJumpTo(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualLoopingMode"); + tet_infoline("UtcDaliAnimatedVectorImageVisualJumpTo"); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) .Add(DevelImageVisual::Property::LOOP_COUNT, 3) - .Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME) - .Add(DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::AUTO_REVERSE); + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); + tet_printf("1. Visual is created.\n"); + DummyControl actor = DummyControl::New(true); DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); @@ -1258,69 +1495,122 @@ int UtcDaliAnimatedVectorImageVisualLoopingMode(void) application.GetScene().Add(actor); - Property::Map attributes; - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); - application.SendNotification(); application.Render(); - // Trigger count is 1 - animation finished + // Trigger count is 2 - load & render a frame DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - Jump to during stopped + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); Property::Value* value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); // Should be the first frame because of auto reverse + DALI_TEST_EQUALS(value->Get(), 2, TEST_LOCATION); - // Change stop behavior - attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME); + tet_printf("2. The current frame number is [%d].\n", value->Get()); + + Property::Array array; + array.PushBack(0); + array.PushBack(2); + Property::Map attributes; + attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - // Play again - DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3); + + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f)); application.SendNotification(); application.Render(); - // Trigger count is 1 - animation finished DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); // Should be the first frame + DALI_TEST_EQUALS(value->Get(), 2, TEST_LOCATION); - // Change looping mode - attributes.Add(DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::RESTART); + tet_printf("3. The current frame number is [%d].\n", value->Get()); + + // Change play range + attributes.Clear(); + array.Clear(); + + array.PushBack(0); + array.PushBack(4); + attributes.Add(DevelImageVisual::Property::PLAY_RANGE, array); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - // Play again + attributes.Clear(); DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); application.SendNotification(); application.Render(); - // Trigger count is 1 - animation finished + // Wait for animation finish DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + // Note : AnimationFinished will occure force-render, and it might required another trigger. Test one more trigger now. + Test::WaitForEventThreadTrigger(1, 1); - Property::Value* value1 = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); - int totalFrameNumber = value1->Get(); + // Jump to 3 + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - Jump to during stopped. + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); - DALI_TEST_EQUALS(value->Get(), totalFrameNumber - 1, TEST_LOCATION); // Should be the last frame + DALI_TEST_EQUALS(value->Get(), 3, TEST_LOCATION); + + tet_printf("4. The current frame number is [%d].\n", value->Get()); + + // Jump to the same position + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3); + + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_EQUALS(value->Get(), 3, TEST_LOCATION); + + tet_printf("5. The current frame number is [%d].\n", value->Get()); END_TEST; } -int UtcDaliAnimatedVectorImageVisualPropertyNotification(void) +int UtcDaliAnimatedVectorImageVisualUpdateProperty(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualPropertyNotification"); + tet_infoline("UtcDaliAnimatedVectorImageVisualUpdateProperty"); + + int startFrame = 1, endFrame = 3; + Property::Array playRange; + playRange.PushBack(startFrame); + playRange.PushBack(endFrame); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(DevelImageVisual::Property::LOOP_COUNT, 3) + .Add(DevelImageVisual::Property::PLAY_RANGE, playRange) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -1330,123 +1620,115 @@ int UtcDaliAnimatedVectorImageVisualPropertyNotification(void) dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); Vector2 controlSize(20.f, 30.f); - Vector3 controlScale(2.0f, 2.0f, 1.0f); actor.SetProperty(Actor::Property::SIZE, controlSize); - actor.SetProperty(Actor::Property::SCALE, controlScale); application.GetScene().Add(actor); application.SendNotification(); application.Render(); - application.SendNotification(); - application.Render(); + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); - Renderer renderer = actor.GetRendererAt(0u); - DALI_TEST_CHECK(renderer); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::LOOP_COUNT); + DALI_TEST_EQUALS(value->Get(), 3, TEST_LOCATION); - auto textureSet = renderer.GetTextures(); - auto texture = textureSet.GetTexture(0); + value = map.Find(DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY); + DALI_TEST_CHECK(value); - DALI_TEST_EQUALS(controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION); - DALI_TEST_EQUALS(controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION); + Property::Array* result = value->GetArray(); + DALI_TEST_CHECK(result); - // Change scale and size - controlSize = Vector2(50.f, 40.f); - controlScale = Vector3(0.5f, 0.5f, 1.0f); - actor.SetProperty(Actor::Property::SIZE, controlSize); - actor.SetProperty(Actor::Property::SCALE, controlScale); + DALI_TEST_EQUALS(result->GetElementAt(0).Get(), startFrame, TEST_LOCATION); + DALI_TEST_EQUALS(result->GetElementAt(1).Get(), endFrame, TEST_LOCATION); - application.SendNotification(); - application.Render(); + playRange.Clear(); + playRange.PushBack(0); + playRange.PushBack(2); + + Property::Map attributes; + attributes.Add(DevelImageVisual::Property::PLAY_RANGE, playRange); + attributes.Add(DevelImageVisual::Property::LOOP_COUNT, 5); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f)); application.SendNotification(); application.Render(); - renderer = actor.GetRendererAt(0u); - DALI_TEST_CHECK(renderer); - - textureSet = renderer.GetTextures(); - texture = textureSet.GetTexture(0); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - DALI_TEST_EQUALS(controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION); - DALI_TEST_EQUALS(controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::LOOP_COUNT); + DALI_TEST_EQUALS(value->Get(), 5, TEST_LOCATION); - END_TEST; -} + value = map.Find(DevelImageVisual::Property::PLAY_RANGE); + result = value->GetArray(); + DALI_TEST_CHECK(result); -int UtcDaliAnimatedVectorImageVisualMultipleInstances(void) -{ - ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualMultipleInstances"); + // Ensure that vector data sended well. + CheckAndRetryPlayRange(actor, 0, 2, {{startFrame, endFrame}}, TEST_LOCATION); - Property::Map propertyMap; - propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + attributes.Clear(); - Visual::Base visual1 = VisualFactory::Get().CreateVisual(propertyMap); - DALI_TEST_CHECK(visual1); + playRange.Clear(); + playRange.PushBack(startFrame); + playRange.PushBack(endFrame); - DummyControl actor1 = DummyControl::New(true); - DummyControlImpl& dummyImpl1 = static_cast(actor1.GetImplementation()); - dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual1); + attributes.Add(DevelImageVisual::Property::PLAY_RANGE, playRange); - Vector2 controlSize(20.f, 30.f); - actor1.SetProperty(Actor::Property::SIZE, controlSize); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - application.GetScene().Add(actor1); + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); - propertyMap.Clear(); - propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + application.SendNotification(); + application.Render(); - Visual::Base visual2 = VisualFactory::Get().CreateVisual(propertyMap); - DALI_TEST_CHECK(visual2); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - DummyControl actor2 = DummyControl::New(true); - DummyControlImpl& dummyImpl2 = static_cast(actor2.GetImplementation()); - dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual2); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::PLAY_RANGE); - actor2.SetProperty(Actor::Property::SIZE, controlSize); + result = value->GetArray(); + DALI_TEST_CHECK(result); - application.GetScene().Add(actor2); + // Ensure that vector data sended well. + CheckAndRetryPlayRange(actor, startFrame, endFrame, {{0, 2}}, TEST_LOCATION); - DevelControl::DoAction(actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map()); + // Play and update property + attributes.Clear(); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); application.SendNotification(); application.Render(); - std::this_thread::sleep_for(std::chrono::milliseconds(200)); - - Property::Map attributes; - attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME); - - DevelControl::DoAction(actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - DevelControl::DoAction(actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + attributes.Add(DevelImageVisual::Property::LOOP_COUNT, 10); - DevelControl::DoAction(actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map()); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - // renderer is added to actor - DALI_TEST_CHECK(actor1.GetRendererCount() == 1u); - Renderer renderer1 = actor1.GetRendererAt(0u); - DALI_TEST_CHECK(renderer1); + application.SendNotification(); + application.Render(); - // renderer is added to actor - DALI_TEST_CHECK(actor2.GetRendererCount() == 1u); - Renderer renderer2 = actor2.GetRendererAt(0u); - DALI_TEST_CHECK(renderer2); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::LOOP_COUNT); + DALI_TEST_EQUALS(value->Get(), 10, TEST_LOCATION); END_TEST; } -int UtcDaliAnimatedVectorImageVisualControlVisibilityChanged(void) +int UtcDaliAnimatedVectorImageVisualStopBehavior(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualControlVisibilityChanged"); + tet_infoline("UtcDaliAnimatedVectorImageVisualStopBehavior"); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -1463,123 +1745,107 @@ int UtcDaliAnimatedVectorImageVisualControlVisibilityChanged(void) application.SendNotification(); application.Render(); + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + propertyMap.Clear(); + propertyMap.Add(DevelImageVisual::Property::LOOP_COUNT, 3); + propertyMap.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, propertyMap); + Property::Map attributes; DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); application.SendNotification(); application.Render(); - // Check rendering behavior - DALI_TEST_CHECK(actor.GetRendererCount() == 1u); - Renderer renderer = actor.GetRendererAt(0u); - DALI_TEST_CHECK(renderer); - DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::CONTINUOUSLY); + // Trigger count is 1 - animation finished + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - actor.SetProperty(Actor::Property::VISIBLE, false); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); // Should be the first frame - application.SendNotification(); - application.Render(); + // Change stop behavior + attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME); - // Check rendering behavior again - DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::IF_REQUIRED); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); - END_TEST; -} + attributes.Clear(); -int UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged(void) -{ - ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged"); + // Play again + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); - Property::Map propertyMap; - propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + application.SendNotification(); + application.Render(); - Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); - DALI_TEST_CHECK(visual); + // Trigger count is 1 - animation finished + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - DummyControl actor = DummyControl::New(true); - DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); - dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - Vector2 controlSize(20.f, 30.f); - actor.SetProperty(Actor::Property::SIZE, controlSize); + Property::Value* value1 = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); + int totalFrameNumber = value1->Get(); - application.GetScene().Add(actor); + value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_EQUALS(value->Get(), totalFrameNumber - 1, TEST_LOCATION); // Should be the last frame - application.SendNotification(); - application.Render(); + // Change stop behavior + attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME); + attributes.Add(DevelImageVisual::Property::LOOP_COUNT, -1); - Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + attributes.Clear(); + + // Play again DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); application.SendNotification(); application.Render(); - // Check rendering behavior - DALI_TEST_CHECK(actor.GetRendererCount() == 1u); - Renderer renderer = actor.GetRendererAt(0u); - DALI_TEST_CHECK(renderer); - DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::CONTINUOUSLY); + // Pause + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes); - Window window = DevelWindow::Get(actor); - window.Hide(); + // To make event trigger + actor.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f)); application.SendNotification(); application.Render(); - // Check rendering behavior again - DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::IF_REQUIRED); - - END_TEST; -} - -int UtcDaliAnimatedVectorImageVisualInvalidFile(void) -{ - ToolkitTestApplication application; - tet_infoline("Request loading with invalid file - should draw broken image"); - - TestGlAbstraction& gl = application.GetGlAbstraction(); - TraceCallStack& textureTrace = gl.GetTextureTrace(); - textureTrace.Enable(true); - - Property::Map propertyMap; - propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_INVALID_FILE_NAME); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); - DALI_TEST_CHECK(visual); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + int currentFrameNumber = value->Get(); - DummyControl actor = DummyControl::New(true); - DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); - dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + // Stop + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes); + // To make event trigger actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); - application.GetScene().Add(actor); - application.SendNotification(); application.Render(); - // Check resource status - Visual::ResourceStatus status = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL); - DALI_TEST_EQUALS(status, Visual::ResourceStatus::FAILED, TEST_LOCATION); + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - // The broken image should be shown. - DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); - DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION); + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_EQUALS(value->Get(), currentFrameNumber, TEST_LOCATION); // Should be same with currentFrameNumber END_TEST; } -int UtcDaliAnimatedVectorImageVisualFrameDrops(void) +int UtcDaliAnimatedVectorImageVisualLoopingMode(void) { ToolkitTestApplication application; - tet_infoline("UtcDaliAnimatedVectorImageVisualFrameDrops"); + tet_infoline("UtcDaliAnimatedVectorImageVisualLoopingMode"); Property::Map propertyMap; propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) - .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME_FRAME_DROP); + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); DALI_TEST_CHECK(visual); @@ -1593,26 +1859,1042 @@ int UtcDaliAnimatedVectorImageVisualFrameDrops(void) application.GetScene().Add(actor); - Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); - Property::Value* value = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); - int totalFrameNumber = value->Get(); + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load, render + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + propertyMap.Clear(); + propertyMap.Add(DevelImageVisual::Property::LOOP_COUNT, 3); + propertyMap.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME); + propertyMap.Add(DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::AUTO_REVERSE); + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, propertyMap); Property::Map attributes; DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); - // Make delay to drop frames - Test::VectorAnimationRenderer::DelayRendering(170); // longer than 16.6 * 10frames - application.SendNotification(); application.Render(); - // Trigger count is 2 - render the first frame & calculating frame drops - DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + // Trigger count is 1 - animation finished + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); - // Check dropped frame - uint32_t frames = Test::VectorAnimationRenderer::GetDroppedFrames(); - DALI_TEST_CHECK(frames > 0); - DALI_TEST_CHECK(frames <= static_cast(totalFrameNumber)); + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); // Should be the first frame because of auto reverse + + // Change stop behavior + attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + // Play again + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - animation finished + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_EQUALS(value->Get(), 0, TEST_LOCATION); // Should be the first frame + + // Change looping mode + attributes.Add(DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::RESTART); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + // Play again + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - animation finished + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + Property::Value* value1 = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); + int totalFrameNumber = value1->Get(); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER); + DALI_TEST_EQUALS(value->Get(), totalFrameNumber - 1, TEST_LOCATION); // Should be the last frame + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualFrameSpeedFactor(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualFrameSpeedFactor"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR); + DALI_TEST_EQUALS(value->Get(), 1.0f, TEST_LOCATION); // Check default value is 1.0f + + Property::Map attributes; + attributes.Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, 0.5f); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + application.SendNotification(); + application.Render(); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR); + DALI_TEST_EQUALS(value->Get(), 0.5f, TEST_LOCATION); + + attributes.Clear(); + attributes.Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, 8.0f); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + application.SendNotification(); + application.Render(); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR); + DALI_TEST_EQUALS(value->Get(), 8.0f, TEST_LOCATION); + + // TODO : Below logic might be changed in future. + + // Clampled by maximum frame speed factor. + attributes.Clear(); + attributes.Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, 100.0f + 1.0f); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + application.SendNotification(); + application.Render(); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR); + DALI_TEST_EQUALS(value->Get(), 100.0f, TEST_LOCATION); + + // Clampled by minimum frame speed factor. + attributes.Clear(); + attributes.Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, 0.0f); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + application.SendNotification(); + application.Render(); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR); + DALI_TEST_EQUALS(value->Get(), 0.01f, TEST_LOCATION); + + // Clampled by minimum frame speed factor 2. + attributes.Clear(); + attributes.Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, -1.0f); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + application.SendNotification(); + application.Render(); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR); + DALI_TEST_EQUALS(value->Get(), 0.01f, TEST_LOCATION); + + // Clampled by minimum frame speed factor 3. + attributes.Clear(); + attributes.Add(DevelImageVisual::Property::FRAME_SPEED_FACTOR, -100.0f - 1.0f); + + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + application.SendNotification(); + application.Render(); + + map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + value = map.Find(DevelImageVisual::Property::FRAME_SPEED_FACTOR); + DALI_TEST_EQUALS(value->Get(), 0.01f, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualPropertyNotification(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualPropertyNotification"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + actor.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f)); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.SendNotification(); + application.Render(); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + auto textureSet = renderer.GetTextures(); + auto texture = textureSet.GetTexture(0); + + DALI_TEST_EQUALS(controlSize.width, texture.GetWidth(), TEST_LOCATION); + DALI_TEST_EQUALS(controlSize.height, texture.GetHeight(), TEST_LOCATION); + + // Change scale + Vector3 controlScale(2.0f, 2.0f, 1.0f); + actor.SetProperty(Actor::Property::SCALE, controlScale); + + application.SendNotification(); + application.Render(); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + + textureSet = renderer.GetTextures(); + texture = textureSet.GetTexture(0); + + DALI_TEST_EQUALS(controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION); + DALI_TEST_EQUALS(controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION); + + // Size animation + controlSize = Vector2(50.0f, 100.0f); + Animation animation = Animation::New(1.0); + animation.AnimateTo(Property(actor, Actor::Property::SIZE), Vector3(controlSize.x, controlSize.y, 0.0f)); + animation.Play(); + + application.SendNotification(); + application.Render(1100); // After the animation + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + + textureSet = renderer.GetTextures(); + texture = textureSet.GetTexture(0); + + DALI_TEST_EQUALS(controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION); + DALI_TEST_EQUALS(controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualMultipleInstances(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualMultipleInstances"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual1 = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual1); + + DummyControl actor1 = DummyControl::New(true); + DummyControlImpl& dummyImpl1 = static_cast(actor1.GetImplementation()); + dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual1); + + Vector2 controlSize(20.f, 30.f); + actor1.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor1); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + propertyMap.Clear(); + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual2 = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual2); + + DummyControl actor2 = DummyControl::New(true); + DummyControlImpl& dummyImpl2 = static_cast(actor2.GetImplementation()); + dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual2); + + actor2.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor2); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + DevelControl::DoAction(actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map()); + + // To make event trigger + actor2.SetProperty(Actor::Property::SIZE, Vector2(10.0f, 10.0f)); + + application.SendNotification(); + application.Render(); + + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + Property::Map attributes; + attributes.Add(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME); + + DevelControl::DoAction(actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + DevelControl::DoAction(actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + DevelControl::DoAction(actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map()); + + // renderer is added to actor + DALI_TEST_CHECK(actor1.GetRendererCount() == 1u); + Renderer renderer1 = actor1.GetRendererAt(0u); + DALI_TEST_CHECK(renderer1); + + // renderer is added to actor + DALI_TEST_CHECK(actor2.GetRendererCount() == 1u); + Renderer renderer2 = actor2.GetRendererAt(0u); + DALI_TEST_CHECK(renderer2); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualControlVisibilityChanged(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualControlVisibilityChanged"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + + application.SendNotification(); + application.Render(); + + // Check rendering behavior + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::CONTINUOUSLY); + + actor.SetProperty(Actor::Property::VISIBLE, false); + + application.SendNotification(); + application.Render(); + + // Check rendering behavior again + DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::IF_REQUIRED); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualInheritedVisibilityChanged(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualInheritedVisibilityChanged"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + + application.SendNotification(); + application.Render(); + + // Check rendering behavior + DALI_TEST_CHECK(actor.GetRendererCount() == 1u); + Renderer renderer = actor.GetRendererAt(0u); + DALI_TEST_CHECK(renderer); + DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::CONTINUOUSLY); + + Window window = DevelWindow::Get(actor); + window.Hide(); + + application.SendNotification(); + application.Render(); + + // Check rendering behavior again + DALI_TEST_CHECK(renderer.GetProperty(DevelRenderer::Property::RENDERING_BEHAVIOR) == DevelRenderer::Rendering::IF_REQUIRED); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualInvalidFile01(void) +{ + ToolkitTestApplication application; + tet_infoline("Request loading with invalid file - should draw broken image"); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_INVALID_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - load + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + // Check resource status + Visual::ResourceStatus status = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL); + DALI_TEST_EQUALS(status, Visual::ResourceStatus::FAILED, TEST_LOCATION); + + // The broken image should be shown. + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); + DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualInvalidFile02(void) +{ + ToolkitTestApplication application; + tet_infoline("Request loading with invalid file - should draw broken image"); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_INVALID_FILE_NAME); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + actor.SetProperty(Actor::Property::SIZE, Vector2(20.0f, 20.0f)); + + application.SendNotification(); + application.Render(); + + // Add to the Scene after loading + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Check resource status + Visual::ResourceStatus status = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL); + DALI_TEST_EQUALS(status, Visual::ResourceStatus::FAILED, TEST_LOCATION); + + // The broken image should be shown. + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); + DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualInvalidFile03(void) +{ + ToolkitTestApplication application; + tet_infoline("Request loading with invalid file without size set - should draw broken image"); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + textureTrace.Enable(true); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_INVALID_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - load + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + // Check resource status + Visual::ResourceStatus status = actor.GetVisualResourceStatus(DummyControl::Property::TEST_VISUAL); + DALI_TEST_EQUALS(status, Visual::ResourceStatus::FAILED, TEST_LOCATION); + + // The broken image should be shown. + DALI_TEST_EQUALS(actor.GetRendererCount(), 1u, TEST_LOCATION); + DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualFrameDrops(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualFrameDrops"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME_FRAME_DROP) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load, render the first frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + Property::Map map = actor.GetProperty(DummyControl::Property::TEST_VISUAL); + Property::Value* value = map.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER); + int totalFrameNumber = value->Get(); + + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + + // Make delay to drop frames + Test::VectorAnimationRenderer::DelayRendering(170); // longer than 16.6 * 10frames + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - calculating frame drops + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + // Check dropped frame + uint32_t frames = Test::VectorAnimationRenderer::GetDroppedFrames(); + DALI_TEST_CHECK(frames > 0); + DALI_TEST_CHECK(frames <= static_cast(totalFrameNumber)); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualSize(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualSize"); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual(TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions()); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - resource ready + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + textureTrace.Enable(true); + + application.SendNotification(); + application.Render(); + + { + int width = 100, height = 100; // 100x100 is the content default size. + std::stringstream out; + out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height; + DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); + } + + actor.SetProperty(Actor::Property::SIZE, Vector2(200.0f, 200.0f)); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - resource ready + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + textureTrace.Reset(); + + application.SendNotification(); + application.Render(); + + { + int width = 200, height = 200; + std::stringstream out; + out << GL_TEXTURE_2D << ", " << 0u << ", " << width << ", " << height; + DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); + } + + END_TEST; +} + +namespace +{ +bool gDynamicPropertyCallbackFired = false; + +Property::Value FillColorCallback(int32_t id, VectorAnimationRenderer::VectorProperty property, uint32_t frameNumber) +{ + gDynamicPropertyCallbackFired = true; + + if(frameNumber < 3) + { + return Vector3(0, 0, 1); + } + else + { + return Vector3(1, 0, 0); + } +} +} // namespace + +int UtcDaliAnimatedVectorImageVisualDynamicProperty(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualDynamicProperty"); + + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual( + Property::Map() + .Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false)); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + gDynamicPropertyCallbackFired = false; + + // Set dynamic property + DevelAnimatedVectorImageVisual::DynamicPropertyInfo info; + info.id = 1; + info.keyPath = "Test.Path"; + info.property = static_cast(VectorAnimationRenderer::VectorProperty::FILL_COLOR); + info.callback = MakeCallback(FillColorCallback); + + DevelControl::DoActionExtension(actor, DummyControl::Property::TEST_VISUAL, DevelAnimatedVectorImageVisual::Action::SET_DYNAMIC_PROPERTY, Any(info)); + + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load & render a frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + // Test whether the property callback is called + DALI_TEST_EQUALS(gDynamicPropertyCallbackFired, true, TEST_LOCATION); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualDesiredSize(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualDesiredSize"); + + TestGlAbstraction& gl = application.GetGlAbstraction(); + TraceCallStack& textureTrace = gl.GetTextureTrace(); + int desiredWidth = 150, desiredHeight = 200; + + Visual::Base visual = VisualFactory::Get().CreateVisual(TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions(desiredWidth, desiredHeight)); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - resource ready + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + textureTrace.Enable(true); + + application.SendNotification(); + application.Render(); + + { + std::stringstream out; + out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight; + DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); + } + + // Unparent to make next trigger + actor.Unparent(); + + application.SendNotification(); + application.Render(); + + // Set visual size + actor.SetProperty(Actor::Property::SIZE, Vector2(300.0f, 300.0f)); + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - resource ready + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + textureTrace.Reset(); + + application.SendNotification(); + application.Render(); + + { + std::stringstream out; + out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight; + DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); // The size should not be changed + } + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualFlushAction(void) +{ + ToolkitTestApplication application; + + tet_infoline("UtcDaliAnimatedVectorImageVisualFlushAction"); + + int startFrame = 1; + int endFrame = 2; + + int totalFrameCount = 0; + + Property::Array playRange; + playRange.PushBack(startFrame); + playRange.PushBack(endFrame); + + Property::Map resultMap; + Property::Value* value = nullptr; + + // request AnimatedVectorImageVisual with a property map + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual( + Property::Map() + .Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME) + .Add(DevelImageVisual::Property::PLAY_RANGE, playRange) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, true)); + + DummyControl dummyControl = DummyControl::New(true); + Impl::DummyControl& dummyImpl = static_cast(dummyControl.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS); + + application.GetScene().Add(dummyControl); + + tet_printf("Pause lottie first.\n"); + + Property::Map attributes; + DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes); + + application.SendNotification(); + application.Render(16); + + do + { + resultMap = dummyControl.GetProperty(DummyControl::Property::TEST_VISUAL); + + value = resultMap.Find(DevelImageVisual::Property::TOTAL_FRAME_NUMBER, Property::INTEGER); + DALI_TEST_CHECK(value); + totalFrameCount = value->Get(); + } while(totalFrameCount == 0); + + // Ensure that vector data sended well. + CheckAndRetryPlayRange(dummyControl, startFrame, endFrame, {{0, 0}, {0, totalFrameCount - 1}}, TEST_LOCATION); + + resultMap = dummyControl.GetProperty(DummyControl::Property::TEST_VISUAL); + + value = resultMap.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER, Property::INTEGER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), startFrame, TEST_LOCATION); + + tet_printf("Now logically, range : [%d~%d], current : %d\n", startFrame, endFrame, startFrame); + + int changedStartFrame1 = startFrame + 2; + int changedEndFrame1 = endFrame + 2; + + playRange.Clear(); + playRange.Add(changedStartFrame1); + playRange.Add(changedEndFrame1); + + tet_printf("Change play range\n"); + attributes.Add(DevelImageVisual::Property::PLAY_RANGE, playRange); + DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + tet_printf("Jump to changedEndFrame!\n"); + DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, changedEndFrame1); + + attributes.Clear(); + tet_infoline("Flush Action!"); + tet_printf("Now logically, range : [%d~%d], current : %d\n", changedStartFrame1, changedEndFrame1, changedEndFrame1); + DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::FLUSH, attributes); + + int changedStartFrame2 = startFrame + 1; + int changedEndFrame2 = endFrame + 1; + + playRange.Clear(); + playRange.Add(changedStartFrame2); + playRange.Add(changedEndFrame2); + + tet_printf("Change play range again\n"); + tet_printf("Now logically, range : [%d~%d], current : %d\n", changedStartFrame2, changedEndFrame2, changedEndFrame2); + attributes.Add(DevelImageVisual::Property::PLAY_RANGE, playRange); + DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelVisual::Action::UPDATE_PROPERTY, attributes); + + application.SendNotification(); + application.Render(16); + + // Ensure that vector data sended well. + CheckAndRetryPlayRange(dummyControl, changedStartFrame2, changedEndFrame2, {{changedStartFrame1, changedEndFrame1}, {startFrame, endFrame}}, TEST_LOCATION); + + resultMap = dummyControl.GetProperty(DummyControl::Property::TEST_VISUAL); + + tet_printf("Test whether current frame number changed well. If Flush not works, current frame become startFrame."); + value = resultMap.Find(DevelImageVisual::Property::CURRENT_FRAME_NUMBER, Property::INTEGER); + DALI_TEST_CHECK(value); + DALI_TEST_EQUALS(value->Get(), changedEndFrame2, TEST_LOCATION); + + dummyControl.Unparent(); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageNativeTextureChangeShader(void) +{ + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageNativeTextureChangeShader"); + + VisualFactory factory = VisualFactory::Get(); + Visual::Base visual = factory.CreateVisual(TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions()); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + // Make we use native texture now. + Test::VectorAnimationRenderer::UseNativeImageTexture(true); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 1 - resource ready + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION); + + application.SendNotification(); + application.Render(); + + Renderer renderer = actor.GetRendererAt(0); + Shader shader = renderer.GetShader(); + Property::Value value = shader.GetProperty(Shader::Property::PROGRAM); + Property::Map* map = value.GetMap(); + DALI_TEST_CHECK(map); + + std::string resultFragmentShader, resultVertexShader; + Property::Value* fragment = map->Find("fragment"); // fragment key name from shader-impl.cpp + fragment->Get(resultFragmentShader); + DALI_TEST_CHECK(resultFragmentShader.find(NativeImageSourceTest::GetCustomFragmentPrefix()) != std::string::npos); + + // Reset to make we use normal texture again. + Test::VectorAnimationRenderer::UseNativeImageTexture(false); + + END_TEST; +} + +int UtcDaliAnimatedVectorImageVisualDestroyApplicationWhenFrameDropped(void) +{ + try + { + { + ToolkitTestApplication application; + tet_infoline("UtcDaliAnimatedVectorImageVisualDestroyApplicationWhenFrameDropped"); + + Property::Map propertyMap; + propertyMap.Add(Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE) + .Add(ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME_FRAME_DROP) + .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, false); + + Visual::Base visual = VisualFactory::Get().CreateVisual(propertyMap); + DALI_TEST_CHECK(visual); + + DummyControl actor = DummyControl::New(true); + DummyControlImpl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual); + + Vector2 controlSize(20.f, 30.f); + actor.SetProperty(Actor::Property::SIZE, controlSize); + + application.GetScene().Add(actor); + + application.SendNotification(); + application.Render(); + + // Trigger count is 2 - load, render the first frame + DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION); + + Property::Map attributes; + DevelControl::DoAction(actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes); + + // Make delay to drop frames + Test::VectorAnimationRenderer::DelayRendering(500); // block Rasterize thread near 500 ms + + // Request 1 frame rendering. + application.SendNotification(); + application.Render(); + + // Destroy applicatoin immediately. + } + + tet_result(TET_PASS); + } + catch(...) + { + tet_result(TET_FAIL); + } END_TEST; }