X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-Visual.cpp;h=b1f2e2e7359822b9ff1694efaf78a25830256c29;hp=121d5f4c5ab4cfcd7d1820c572e559374a41b18d;hb=339af74b081016140d2d5e25dc8609913aabaa31;hpb=c663dd751004f22cd292f3de7289e58bb2377a8c diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp index 121d5f4..b1f2e2e 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp @@ -24,7 +24,11 @@ #include #include #include +#include +#include +#include #include + #include "dummy-control.h" using namespace Dali; @@ -34,12 +38,13 @@ namespace { const char* TEST_GIF_FILE_NAME = TEST_RESOURCE_DIR "/anim.gif"; const char* TEST_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/gallery-small-1.jpg"; -const char* TEST_NPATCH_FILE_NAME = "gallery_image_01.9.jpg"; +const char* TEST_NPATCH_FILE_NAME = TEST_RESOURCE_DIR "/button-up.9.png"; const char* TEST_SVG_FILE_NAME = TEST_RESOURCE_DIR "/svg1.svg"; const char* TEST_OBJ_FILE_NAME = TEST_RESOURCE_DIR "/Cube.obj"; const char* TEST_MTL_FILE_NAME = TEST_RESOURCE_DIR "/ToyRobot-Metal.mtl"; const char* TEST_RESOURCE_LOCATION = TEST_RESOURCE_DIR "/"; + const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); Property::Map DefaultTransform() @@ -280,6 +285,15 @@ int UtcDaliVisualSize(void) gradientVisual.GetNaturalSize(naturalSize); DALI_TEST_EQUALS( naturalSize, Vector2::ZERO,TEST_LOCATION ); + // animated gradient visual + Vector2 animated_gradient_visual_size(10.f, 10.f); + propertyMap.Clear(); + propertyMap.Insert( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_GRADIENT ); + Visual::Base animatedGradientVisual = factory.CreateVisual( propertyMap ); + animatedGradientVisual.GetNaturalSize(naturalSize); + animatedGradientVisual.SetTransformAndSize(DefaultTransform(), controlSize ); + DALI_TEST_EQUALS( naturalSize, Vector2::ZERO, TEST_LOCATION ); + // svg visual Visual::Base svgVisual = factory.CreateVisual( TEST_SVG_FILE_NAME, ImageDimensions() ); svgVisual.SetTransformAndSize(DefaultTransform(), controlSize ); @@ -753,6 +767,8 @@ int UtcDaliVisualGetPropertyMap6(void) propertyMap.Insert( ImageVisual::Property::URL, TEST_NPATCH_FILE_NAME ); propertyMap.Insert( ImageVisual::Property::BORDER_ONLY, true ); propertyMap.Insert( ImageVisual::Property::BORDER, border ); + propertyMap.Insert( DevelImageVisual::Property::AUXILIARY_IMAGE, "application-icon-30.png" ); + propertyMap.Insert( DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA, 0.9f ); Visual::Base nPatchVisual = factory.CreateVisual( propertyMap ); Property::Map resultMap; @@ -779,6 +795,14 @@ int UtcDaliVisualGetPropertyMap6(void) DALI_TEST_CHECK( value ); DALI_TEST_CHECK( value->Get< Rect< int > >() == border ); + value = resultMap.Find( DevelImageVisual::Property::AUXILIARY_IMAGE, Property::STRING ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == "application-icon-30.png" ); + + value = resultMap.Find( DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA, Property::FLOAT ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == 0.9f ); + Vector4 border1( 1.0f, 1.0f, 1.0f, 1.0f ); Property::Map propertyMap1; @@ -1102,6 +1126,490 @@ int UtcDaliVisualGetPropertyMap10(void) END_TEST; } +int UtcDaliVisualGetPropertyMap11(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliVisualGetPropertyMap11: AnimatedGradientVisual" ); + + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + propertyMap.Insert(Visual::Property::TYPE, DevelVisual::ANIMATED_GRADIENT); + + Vector2 start(-0.5f, 0.5f); + Vector2 end (0.5f, -0.0f); + Vector4 start_color(1.0f, 0.7f, 0.5f, 1.0f); + Vector4 end_color (0.7f, 0.5f, 1.0f, 1.0f); + Vector2 rotate_center(0.0f, 0.4f); + float rotate_amount = 1.57f; + float offset = 100.f; + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, DevelAnimatedGradientVisual::GradientType::RADIAL); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::UNIT_TYPE, DevelAnimatedGradientVisual::UnitType::USER_SPACE); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::SPREAD_TYPE, DevelAnimatedGradientVisual::SpreadType::CLAMP); + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_POSITION, start); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_POSITION, end); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_COLOR, start_color); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_COLOR, end_color); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_CENTER, rotate_center); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT, rotate_amount); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::OFFSET, offset); + + Visual::Base animatedGradientVisual = factory.CreateVisual(propertyMap); + DALI_TEST_CHECK( animatedGradientVisual ); + + Property::Map resultMap; + animatedGradientVisual.CreatePropertyMap( resultMap ); + + // check the property values from the returned map from visual + Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelVisual::ANIMATED_GRADIENT ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::GradientType::RADIAL ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::UNIT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::UnitType::USER_SPACE ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::SPREAD_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::SpreadType::CLAMP ); + + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::START_POSITION, Property::VECTOR2 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), start , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::END_POSITION, Property::VECTOR2 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), end , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::START_COLOR, Property::VECTOR4 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), start_color , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::END_COLOR, Property::VECTOR4 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), end_color , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::ROTATE_CENTER, Property::VECTOR2 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), rotate_center , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT, Property::FLOAT ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), rotate_amount , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::OFFSET, Property::FLOAT ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), offset , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + END_TEST; +} + +int UtcDaliVisualGetPropertyMap12(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliVisualGetPropertyMap12: AnimatedGradientVisual with animation param" ); + + // Case 1 : Set values by index + { + tet_printf( " - Set Values by Index\n" ); + // NOTE : PropertyMap doesn't optimized even delay < -loop_count * (duration + repeat_delay) so this animation will not run + // _delay = -10.0f is this case. It will progress (10.0f / 1.5f) amount. and 10.0f / 1.5f > 5. + for(float _delay = -10.0f; _delay <= 5.0f; _delay += 5.0f) + { + tet_printf( "test with delay [%f]\n", _delay ); + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + Property::Map animationMap; + propertyMap.Insert(Visual::Property::TYPE, DevelVisual::ANIMATED_GRADIENT); + + float duration = 1.1f; + float delay = _delay; + float repeat_delay = 0.4f; + + int direction = DevelAnimatedGradientVisual::AnimationParameter::DirectionType::BACKWARD; + int loop_count = 5; + int motion = DevelAnimatedGradientVisual::AnimationParameter::MotionType::MIRROR; + int easing = DevelAnimatedGradientVisual::AnimationParameter::EasingType::OUT; + + auto buildAnimatedMap = [&animationMap, &direction, &duration, &delay, &loop_count, &repeat_delay, &motion, &easing](const Property::Value &start, const Property::Value &target)->Property::Map& + { + animationMap.Clear(); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::START, start); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET, target); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, direction); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION, duration); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY, delay); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT, loop_count); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY, repeat_delay); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE, motion); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, easing); + + return animationMap; + }; + + Vector2 start1(-0.5f, 0.5f); + Vector2 end1 (0.5f, -0.5f); + Vector4 start_color1(1.0f, 0.7f, 0.5f, 1.0f); + Vector4 end_color1 (0.7f, 0.5f, 1.0f, 1.0f); + Vector2 rotate_center1(0.0f, 0.4f); + float rotate_amount1 = 0.0f; + float offset1 = 0.f; + + Vector2 start2(-0.5f, -0.5f); + Vector2 end2 (0.5f, 0.5f); + Vector4 start_color2(0.0f, 0.1f, 0.8f, 1.0f); + Vector4 end_color2 (0.3f, 1.0f, 0.1f, 0.0f); + Vector2 rotate_center2(0.0f, -0.4f); + float rotate_amount2 = 6.2832f; + float offset2 = 2.f; + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, DevelAnimatedGradientVisual::GradientType::LINEAR); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::UNIT_TYPE, DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::SPREAD_TYPE, DevelAnimatedGradientVisual::SpreadType::REPEAT); + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_POSITION, buildAnimatedMap(start1 , start2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_POSITION, buildAnimatedMap(end1 , end2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_COLOR, buildAnimatedMap(start_color1 , start_color2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_COLOR, buildAnimatedMap(end_color1 , end_color2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_CENTER, buildAnimatedMap(rotate_center1, rotate_center2)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT, buildAnimatedMap(rotate_amount1, rotate_amount2)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::OFFSET, buildAnimatedMap(offset1 , offset2 )); + + Visual::Base animatedGradientVisual = factory.CreateVisual(propertyMap); + DALI_TEST_CHECK( animatedGradientVisual ); + + Property::Map resultMap; + animatedGradientVisual.CreatePropertyMap( resultMap ); + + // check the property values from the returned map from visual + Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelVisual::ANIMATED_GRADIENT ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::GradientType::LINEAR ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::UNIT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::SPREAD_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::SpreadType::REPEAT ); + + auto checkAnimatedMap = [&value, &resultMap, &direction, &duration, &delay, &loop_count, &repeat_delay, &motion, &easing](const Property::Index &index, const Property::Value &start, const Property::Value &target, int line_num)->void + { + tet_printf("Check value at %d\n", line_num); + value = resultMap.Find( index, Property::MAP ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->GetType() == Property::MAP ); + Property::Map *temp_map = value->GetMap(); + DALI_TEST_CHECK( temp_map ); + + auto checkMapValue = [&temp_map](const Property::Index index)->Property::Value + { + Property::Value *res = temp_map->Find( index ); + DALI_TEST_CHECK( res ); + return *res; + }; + + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::START) , start, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET) , target, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION) , Property::Value( direction ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION) , Property::Value( duration ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY) , Property::Value( delay ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT) , Property::Value( loop_count ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY), Property::Value( repeat_delay ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE) , Property::Value( motion ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE) , Property::Value( easing ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + }; + + // check the animation map data is good + checkAnimatedMap(DevelAnimatedGradientVisual::Property::START_POSITION, start1 , start2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::END_POSITION , end1 , end2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::START_COLOR , start_color1 , start_color2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::END_COLOR , end_color1 , end_color2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::ROTATE_CENTER , rotate_center1, rotate_center2, __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT , rotate_amount1, rotate_amount2, __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::OFFSET , offset1 , offset2 , __LINE__); + } + } + + // Case 2 : Set values by string + { + tet_printf( " - Set Values by String\n" ); + // NOTE : PropertyMap doesn't optimized even delay < -loop_count * (duration + repeat_delay) so this animation will not run + // _delay = -10.0f is this case. It will progress (10.0f / 1.5f) amount. and 10.0f / 1.5f > 5. + for(float _delay = -10.0f; _delay <= 5.0f; _delay += 5.0f) + { + tet_printf( "test with delay [%f]\n", _delay ); + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + Property::Map animationMap; + propertyMap.Insert("visualType", "ANIMATED_GRADIENT"); + + float duration = 1.1f; + float delay = _delay; + float repeat_delay = 0.4f; + + int direction = DevelAnimatedGradientVisual::AnimationParameter::DirectionType::BACKWARD; + int loop_count = 5; + int motion = DevelAnimatedGradientVisual::AnimationParameter::MotionType::MIRROR; + int easing = DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN_OUT; + + auto buildAnimatedMap = [&animationMap, &duration, &delay, &loop_count, &repeat_delay](const Property::Value &start, const Property::Value &target)->Property::Map& + { + animationMap.Clear(); + animationMap.Insert("startValue" , start); + animationMap.Insert("targetValue" , target); + animationMap.Insert("directionType", "BACKWARD"); + animationMap.Insert("duration" , duration); + animationMap.Insert("delay" , delay); + animationMap.Insert("repeat" , loop_count); + animationMap.Insert("repeatDelay" , repeat_delay); + animationMap.Insert("motionType" , "MIRROR"); + animationMap.Insert("easingType" , "IN_OUT"); + + return animationMap; + }; + + Vector2 start1(-0.5f, 0.5f); + Vector2 end1 (0.5f, -0.5f); + Vector4 start_color1(1.0f, 0.7f, 0.5f, 1.0f); + Vector4 end_color1 (0.7f, 0.5f, 1.0f, 1.0f); + Vector2 rotate_center1(0.0f, 0.4f); + float rotate_amount1 = 0.0f; + float offset1 = 0.f; + + Vector2 start2(-0.5f, -0.5f); + Vector2 end2 (0.5f, 0.5f); + Vector4 start_color2(0.0f, 0.1f, 0.8f, 1.0f); + Vector4 end_color2 (0.3f, 1.0f, 0.1f, 0.0f); + Vector2 rotate_center2(0.0f, -0.4f); + float rotate_amount2 = 6.2832f; + float offset2 = 2.f; + + // For test mix the type string/index key and string/index value works well. + propertyMap.Insert(DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, "RADIAL"); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::UNIT_TYPE, DevelAnimatedGradientVisual::UnitType::USER_SPACE); + propertyMap.Insert("spreadType" , DevelAnimatedGradientVisual::SpreadType::REFLECT); + + propertyMap.Insert("startPosition", buildAnimatedMap(start1 , start2 )); + propertyMap.Insert("endPosition" , buildAnimatedMap(end1 , end2 )); + propertyMap.Insert("startColor" , buildAnimatedMap(start_color1 , start_color2 )); + propertyMap.Insert("endColor" , buildAnimatedMap(end_color1 , end_color2 )); + propertyMap.Insert("rotateCenter" , buildAnimatedMap(rotate_center1, rotate_center2)); + propertyMap.Insert("rotateAmount" , buildAnimatedMap(rotate_amount1, rotate_amount2)); + propertyMap.Insert("offset" , buildAnimatedMap(offset1 , offset2 )); + + Visual::Base animatedGradientVisual = factory.CreateVisual(propertyMap); + DALI_TEST_CHECK( animatedGradientVisual ); + + Property::Map resultMap; + animatedGradientVisual.CreatePropertyMap( resultMap ); + + // check the property values from the returned map from visual + // Note : resultMap from CreatePropertyMap only contain indexKey + Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelVisual::ANIMATED_GRADIENT ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::GradientType::RADIAL ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::UNIT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::UnitType::USER_SPACE ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::SPREAD_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::SpreadType::REFLECT ); + + auto checkAnimatedMap = [&value, &resultMap, &direction, &duration, &delay, &loop_count, &repeat_delay, &motion, &easing](const Property::Index &index, const Property::Value &start, const Property::Value &target, int line_num)->void + { + tet_printf("Check value at %d\n", line_num); + value = resultMap.Find( index, Property::MAP ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->GetType() == Property::MAP ); + Property::Map *temp_map = value->GetMap(); + DALI_TEST_CHECK( temp_map ); + + auto checkMapValue = [&temp_map](const Property::Index index)->Property::Value + { + Property::Value *res = temp_map->Find( index ); + DALI_TEST_CHECK( res ); + return *res; + }; + + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::START) , start, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET) , target, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION) , Property::Value( direction ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION) , Property::Value( duration ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY) , Property::Value( delay ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT) , Property::Value( loop_count ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY), Property::Value( repeat_delay ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE) , Property::Value( motion ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + DALI_TEST_EQUALS( checkMapValue(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE) , Property::Value( easing ), Math::MACHINE_EPSILON_100, TEST_LOCATION ); + }; + + // check the animation map data is good + checkAnimatedMap(DevelAnimatedGradientVisual::Property::START_POSITION, start1 , start2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::END_POSITION , end1 , end2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::START_COLOR , start_color1 , start_color2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::END_COLOR , end_color1 , end_color2 , __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::ROTATE_CENTER , rotate_center1, rotate_center2, __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT , rotate_amount1, rotate_amount2, __LINE__); + checkAnimatedMap(DevelAnimatedGradientVisual::Property::OFFSET , offset1 , offset2 , __LINE__); + } + } + + END_TEST; +} +int UtcDaliVisualGetPropertyMap13(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliVisualGetPropertyMap13: AnimatedGradientVisual when repeat = 0" ); + + for(int _direction = 0; _direction <= 1; ++_direction) + { + for(float _delay = -10.0f; _delay <= 10.0f; _delay += 10.0f) + { + tet_printf( ((_direction == 0) ? "Forward test with delay [%f]\n" : "Backward test with delay [%f]\n") , _delay ); + VisualFactory factory = VisualFactory::Get(); + DALI_TEST_CHECK( factory ); + + Property::Map propertyMap; + Property::Map animationMap; + propertyMap.Insert(Visual::Property::TYPE, DevelVisual::ANIMATED_GRADIENT); + + float duration = 1.0f; + float delay = _delay; + float repeat_delay = 0.5f; + + int direction = _direction; + int loop_count = 0; // When loop_count is 0, Animation will not be created. + int motion = DevelAnimatedGradientVisual::AnimationParameter::MotionType::LOOP; + int easing = DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN; + + auto buildAnimatedMap = [&animationMap, &direction, &duration, &delay, &loop_count, &repeat_delay, &motion, &easing](const Property::Value &start, const Property::Value &target)->Property::Map& + { + animationMap.Clear(); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::START, start); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET, target); + if(direction == 0)animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD); + else animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, DevelAnimatedGradientVisual::AnimationParameter::DirectionType::BACKWARD); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, direction); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION, duration); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY, delay); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT, loop_count); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY, repeat_delay); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE, motion); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, easing); + + return animationMap; + }; + + Vector2 start1(-0.5f, 0.5f); + Vector2 end1 (0.5f, -0.5f); + Vector4 start_color1(1.0f, 0.7f, 0.5f, 1.0f); + Vector4 end_color1 (0.7f, 0.5f, 1.0f, 1.0f); + Vector2 rotate_center1(1.0f, 0.4f); + float rotate_amount1 = 2.0f; + float offset1 = 1.f; + + Vector2 start2(-0.5f, -0.5f); + Vector2 end2 (0.5f, 0.5f); + Vector4 start_color2(0.0f, 0.1f, 0.8f, 1.0f); + Vector4 end_color2 (0.3f, 1.0f, 0.1f, 0.0f); + Vector2 rotate_center2(1.0f, -0.4f); + float rotate_amount2 = 1.0f; + float offset2 = 3.f; + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, DevelAnimatedGradientVisual::GradientType::LINEAR); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::UNIT_TYPE, DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::SPREAD_TYPE, DevelAnimatedGradientVisual::SpreadType::REFLECT); + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_POSITION, buildAnimatedMap(start1 , start2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_POSITION, buildAnimatedMap(end1 , end2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_COLOR, buildAnimatedMap(start_color1 , start_color2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_COLOR, buildAnimatedMap(end_color1 , end_color2 )); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_CENTER, buildAnimatedMap(rotate_center1, rotate_center2)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT, buildAnimatedMap(rotate_amount1, rotate_amount2)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::OFFSET, buildAnimatedMap(offset1 , offset2 )); + + Visual::Base animatedGradientVisual = factory.CreateVisual(propertyMap); + DALI_TEST_CHECK( animatedGradientVisual ); + + Property::Map resultMap; + animatedGradientVisual.CreatePropertyMap( resultMap ); + + // check the property values from the returned map from visual + Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelVisual::ANIMATED_GRADIENT ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::GradientType::LINEAR ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::UNIT_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::UnitType::OBJECT_BOUNDING_BOX ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::SPREAD_TYPE, Property::INTEGER ); + DALI_TEST_CHECK( value ); + DALI_TEST_CHECK( value->Get() == DevelAnimatedGradientVisual::SpreadType::REFLECT ); + + // If loop_count = 0, Animation doesn't created. + // Optimized resultMap only have one value, which is target value + // Note: target value will be changed by direction option. + value = resultMap.Find( DevelAnimatedGradientVisual::Property::START_POSITION, Property::VECTOR2 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), direction ? start1 : start2 , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::END_POSITION, Property::VECTOR2 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), direction ? end1 : end2 , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::START_COLOR, Property::VECTOR4 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), direction ? start_color1 : start_color2 , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::END_COLOR, Property::VECTOR4 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), direction ? end_color1 : end_color2 , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::ROTATE_CENTER, Property::VECTOR2 ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), direction ? rotate_center1 : rotate_center2 , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT, Property::FLOAT ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), direction ? rotate_amount1 : rotate_amount2 , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + + value = resultMap.Find( DevelAnimatedGradientVisual::Property::OFFSET, Property::FLOAT ); + DALI_TEST_CHECK( value ); + DALI_TEST_EQUALS( value->Get(), direction ? offset1 : offset2 , Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + } + + END_TEST; +} + int UtcDaliVisualAnimateBorderVisual01(void) { ToolkitTestApplication application; @@ -1356,6 +1864,614 @@ int UtcDaliVisualAnimatePrimitiveVisual(void) END_TEST; } +int UtcDaliVisualAnimatedGradientVisual01(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliAnimatedGradientVisual with default" ); + + { + VisualFactory factory = VisualFactory::Get(); + Property::Map propertyMap; + propertyMap.Insert(Visual::Property::TYPE, DevelVisual::ANIMATED_GRADIENT); + Visual::Base visual = factory.CreateVisual( propertyMap ); + + DummyControl actor = DummyControl::New(true); + Impl::DummyControl& dummyImpl = static_cast(actor.GetImplementation()); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + actor.SetSize(2000, 2000); + actor.SetParentOrigin(ParentOrigin::CENTER); + actor.SetColor(Color::BLACK); + Stage::GetCurrent().Add(actor); + + application.SendNotification(); + application.Render(0); + application.SendNotification(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION); + + for(int step_iter = 0; step_iter < 3; step_iter++) + { + application.SendNotification(); + application.Render(0); + application.Render(750u); // step i/4 + application.SendNotification(); + + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "start_point" , Vector2( -0.5f, 0.0f ) ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "end_point" , Vector2( 0.5f, 0.0f ) ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "start_color" , Vector4( 143.0f, 170.0f, 220.0f, 255.0f ) / 255.0f ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "end_color" , Vector4( 255.0f, 163.0f, 163.0f, 255.0f ) / 255.0f ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "rotate_center", Vector2( 0.0f, 0.0f ) ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "rotate_angle" , 0.0f ), true, TEST_LOCATION ); + DALI_TEST_EQUALS( application.GetGlAbstraction().CheckUniformValue( "gradient_offset", 0.5f * step_iter + 0.5f ), true, TEST_LOCATION ); + } + + //Not check here. cause gradient_offset value can be 2.0f or 0.0f + application.Render(750u); // go to end + application.SendNotification(); + + application.Render(10u); // finish + application.SendNotification(); + + actor.Unparent(); + application.SendNotification(); + application.Render(0u); + application.SendNotification(); + } + + END_TEST; +} + +int UtcDaliVisualAnimatedGradientVisual02(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliAnimatedGradientVisual with full-option" ); + + { + float _delay[4] = {0.0f, -1.35f, 0.15f, -0.4f}; // fract(_delay) must NOT be 1/4, 2/4, 3/4. cause we don't know progress is 1.0f or 0.0f + int _direction[2] = {0, 1}; + int _loop_count[3] = {-1, 0, 1}; + int _motion[2] = {0, 1}; + int _easing[4] = {0, 1, 2, 3}; + + int test_case_max = 4 * 2 * 3 * 2 * 4; + int test_case = 0; + int test_case_d = 7; // 7 is the number of animated properties. + + float _duration = 0.4f; + float _repeat_delay = _duration * 0.25f; // < _duration. cause real_duration = _duration - _repeat_delay; + float noise_maker = 0.0f; + // total testing time = ceil((4*2*3*2*4) / 7) * (_duration(=0.4) * 2 + 0.01) = 22.68 seconds + for( test_case = 0; test_case < test_case_max + test_case_d; test_case += test_case_d ) + { + tet_printf( "test [%d ~ %d / %d]\n" , test_case, test_case + test_case_d - 1, test_case_max); + + VisualFactory factory = VisualFactory::Get(); + Property::Map propertyMap; + Property::Map animationMap; + propertyMap.Insert(Visual::Property::TYPE, DevelVisual::ANIMATED_GRADIENT); + + int gradient_type = DevelAnimatedGradientVisual::GradientType::LINEAR; + int unit_type = DevelAnimatedGradientVisual::UnitType::USER_SPACE; + int spread_type = DevelAnimatedGradientVisual::SpreadType::REPEAT; + + auto buildAnimatedMap = [&animationMap, &_direction, &_duration, &_delay, &_loop_count, &_repeat_delay, &_motion, &_easing, &test_case](const Property::Value &start, const Property::Value &target, int tc_offset)->Property::Map& + { + int tc = (test_case + tc_offset); + int idx_easing = tc % 4; tc /= 4; + int idx_motion = tc % 2; tc /= 2; + int idx_loop_count = tc % 3; tc /= 3; + int idx_direction = tc % 2; tc /= 2; + int idx_delay = tc % 4; tc /= 4; + + float duration = _duration - _repeat_delay; + float repeat_delay = _repeat_delay; + float delay = _delay[idx_delay] * _duration; + int direction = _direction[idx_direction]; + int loop_count = _loop_count[idx_loop_count]; + int motion = _motion[idx_motion]; + int easing = _easing[idx_easing]; + + animationMap.Clear(); + animationMap.Insert( DevelAnimatedGradientVisual::AnimationParameter::Property::START, start ); + animationMap.Insert( DevelAnimatedGradientVisual::AnimationParameter::Property::TARGET, target ); + if( direction == 0 ) + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, DevelAnimatedGradientVisual::AnimationParameter::DirectionType::FORWARD); + } + else + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DIRECTION, DevelAnimatedGradientVisual::AnimationParameter::DirectionType::BACKWARD); + } + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DURATION, duration); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::DELAY, delay); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT, loop_count); + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::REPEAT_DELAY, repeat_delay); + if( motion == 0 ) + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE, DevelAnimatedGradientVisual::AnimationParameter::MotionType::LOOP); + } + else + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::MOTION_TYPE, DevelAnimatedGradientVisual::AnimationParameter::MotionType::MIRROR); + } + if( easing == 0 ) + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, DevelAnimatedGradientVisual::AnimationParameter::EasingType::LINEAR); + } + else if( easing == 1 ) + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN); + } + else if( easing == 2 ) + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, DevelAnimatedGradientVisual::AnimationParameter::EasingType::OUT); + } + else + { + animationMap.Insert(DevelAnimatedGradientVisual::AnimationParameter::Property::EASING_TYPE, DevelAnimatedGradientVisual::AnimationParameter::EasingType::IN_OUT); + } + + return animationMap; + }; + + // Give different values for debuging + noise_maker += 1.0f; + Vector2 start1(-0.5f + noise_maker * 0.1f, 0.5f + noise_maker * 0.1f); + Vector2 end1 (0.5f + noise_maker * 0.1f, -0.5f + noise_maker * 0.1f); + Vector4 start_color1(1.0f, 0.7f, 0.5f, 1.0f); + Vector4 end_color1 (0.7f, 0.5f, 1.0f, 1.0f); + Vector2 rotate_center1(0.0f + noise_maker * 0.1f, 0.4f + noise_maker * 0.1f); + float rotate_amount1 = 0.0f + noise_maker * 0.1f; + float offset1 = 0.f + noise_maker * 0.1f; + + Vector2 start2(0.2f + noise_maker * 0.1f, -0.7f + noise_maker * 0.1f); + Vector2 end2 (0.5f + noise_maker * 0.1f, 0.5f + noise_maker * 0.1f); + Vector4 start_color2(0.0f, 0.1f, 0.8f, 1.0f); + Vector4 end_color2 (0.3f, 1.0f, 0.1f, 0.0f); + Vector2 rotate_center2(0.0f + noise_maker * 0.1f, -0.4f + noise_maker * 0.1f); + float rotate_amount2 = 7.0f + noise_maker * 0.1f; + float offset2 = 2.f + noise_maker * 0.1f; + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::GRADIENT_TYPE, gradient_type); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::UNIT_TYPE, unit_type); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::SPREAD_TYPE, spread_type); + + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_POSITION, buildAnimatedMap(start1 , start2 ,0)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_POSITION, buildAnimatedMap(end1 , end2 ,1)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::START_COLOR, buildAnimatedMap(start_color1 , start_color2 ,2)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::END_COLOR, buildAnimatedMap(end_color1 , end_color2 ,3)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_CENTER, buildAnimatedMap(rotate_center1, rotate_center2,4)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::ROTATE_AMOUNT, buildAnimatedMap(rotate_amount1, rotate_amount2,5)); + propertyMap.Insert(DevelAnimatedGradientVisual::Property::OFFSET, buildAnimatedMap(offset1 , offset2 ,6)); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + + DummyControl actor = DummyControl::New( true ); + Impl::DummyControl& dummyImpl = static_cast( actor.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + actor.SetSize( 2000, 2000 ); + actor.SetParentOrigin(ParentOrigin::CENTER); + actor.SetColor(Color::BLACK); + Stage::GetCurrent().Add(actor); + + application.SendNotification(); + application.Render( 0 ); + application.SendNotification(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION); + + application.SendNotification(); + + //Compare between CPU calculated value and Shader Visual calculated value + auto testProperty = [&application, &_direction, &_duration, &_delay, &_loop_count, &_repeat_delay, &_motion, &_easing, &test_case](const char* name, const Property::Value& start, const Property::Value& target, int tc_offset, int value_type, float progress)->void + { + int tc = (test_case + tc_offset); + int idx_easing = tc % 4; tc /= 4; + int idx_motion = tc % 2; tc /= 2; + int idx_loop_count = tc % 3; tc /= 3; + int idx_direction = tc % 2; tc /= 2; + int idx_delay = tc % 4; tc /= 4; + + float duration = _duration - _repeat_delay; + float repeat_delay = _repeat_delay; + float delay = _delay[idx_delay] * _duration; + int direction = _direction[idx_direction]; + int loop_count = _loop_count[idx_loop_count]; + int motion = _motion[idx_motion]; + int easing = _easing[idx_easing]; + + progress -= delay / _duration; + + Property::Value s = start; + Property::Value t = target; + if( direction == 1 ) + { + s = target; + t = start; + } + float x; ///< Animator progress value + if( loop_count == 0 ) + { + x = 1.0f; + } + else if( loop_count > 0 && progress + 0.01f > loop_count ) + { + x = ( motion == 0 ) ? 1.0f : 0.0f; + } + else + { + if( progress < 0.0f ) + { + progress = 0.0f; + } + progress = fmodf( progress, 1.0f ); + progress = Dali::Clamp( (progress * (duration + repeat_delay) - repeat_delay) / duration, 0.0f, 1.0f ); + + x = progress; + if( motion == 1 ) + { + x = progress * 2.0f; + if( x > 1.0f ) + { + x = 2.0f - x; + } + } + + if( easing == 1 ) // EASE_IN + { + x = x*x; + } + else if( easing == 2 ) // EASE_OUT + { + x = 2.0f*x - x*x; + } + else if( easing == 3 ) // EASE_IN_OUT + { + x = x * x * (3.0f - 2.0f * x); + } + } + if( value_type == 0 ) // result type is Float + { + float res; + float cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + else if( value_type == 1 ) // result type is Vector2 + { + Vector2 res; + Vector2 cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + else if( value_type == 2 ) // result type is Vector3 + { + Vector3 res; + Vector3 cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + else // result type is Vector4 + { + Vector4 res; + Vector4 cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + }; + + float step = 0.0f; + for( int iter = 0; iter < 2; iter++ ) // test 2*duration seconds + { + for( int step_iter = 0; step_iter < 3; step_iter++ ) + { + application.SendNotification(); + application.Render( _duration * 250.f ); // step i/4 + application.SendNotification(); + step += 0.25f; + + testProperty( "start_point" , Property::Value( start1 ) , Property::Value( start2 ) , 0, 1, step ); + testProperty( "end_point" , Property::Value( end1 ) , Property::Value( end2 ) , 1, 1, step ); + testProperty( "start_color" , Property::Value( start_color1 ) , Property::Value( start_color2 ) , 2, 3, step ); + testProperty( "end_color" , Property::Value( end_color1 ) , Property::Value( end_color2 ) , 3, 3, step ); + testProperty( "rotate_center" , Property::Value( rotate_center1 ), Property::Value( rotate_center2 ), 4, 1, step ); + testProperty( "rotate_angle" , Property::Value( rotate_amount1 ), Property::Value( rotate_amount2 ), 5, 0, step ); + testProperty( "gradient_offset", Property::Value( offset1 ) , Property::Value( offset2 ) , 6, 0, step ); + } + application.SendNotification(); + application.Render(_duration * 250.f); // step 4/4 will not test + application.SendNotification(); + step += 0.25f; + } + + application.SendNotification(); + actor.Unparent(); + application.SendNotification(); + application.Render(10.f); // tempral time + application.SendNotification(); + } + } + + END_TEST; +} + +int UtcDaliVisualAnimatedGradientVisual03(void) +{ + ToolkitTestApplication application; + tet_infoline( "UtcDaliAnimatedGradientVisual with full-option use string key" ); + + { + float _delay[4] = {0.0f, -1.35f, 0.15f, -0.4f}; // fract(_delay) must NOT be 1/4, 2/4, 3/4. cause we don't know progress is 1.0f or 0.0f + int _direction[2] = {0, 1}; + int _loop_count[3] = {-1, 0, 1}; + int _motion[2] = {0, 1}; + int _easing[4] = {0, 1, 2, 3}; + + int test_case_max = 4 * 2 * 3 * 2 * 4; + int test_case = 0; + int test_case_d = 7; // 7 is the number of animated properties. + + float _duration = 0.4f; + float _repeat_delay = _duration * 0.25f; // < _duration. cause real_duration = _duration - _repeat_delay; + float noise_maker = 0.2f; + // total testing time = ceil((4*2*3*2*4) / 7) * (_duration(=0.4) * 2 + 0.01) = 22.68 seconds + for( test_case = 0; test_case < test_case_max + test_case_d; test_case += test_case_d ) + { + tet_printf( "test [%d ~ %d / %d]\n" , test_case, test_case + test_case_d - 1, test_case_max); + + VisualFactory factory = VisualFactory::Get(); + Property::Map propertyMap; + Property::Map animationMap; + propertyMap.Insert(Visual::Property::TYPE, DevelVisual::ANIMATED_GRADIENT); + + auto buildAnimatedMap = [&animationMap, &_direction, &_duration, &_delay, &_loop_count, &_repeat_delay, &_motion, &_easing, &test_case](const Property::Value &start, const Property::Value &target, int tc_offset)->Property::Map& + { + int tc = (test_case + tc_offset); + int idx_easing = tc % 4; tc /= 4; + int idx_motion = tc % 2; tc /= 2; + int idx_loop_count = tc % 3; tc /= 3; + int idx_direction = tc % 2; tc /= 2; + int idx_delay = tc % 4; tc /= 4; + + float duration = _duration - _repeat_delay; + float repeat_delay = _repeat_delay; + float delay = _delay[idx_delay] * _duration; + int direction = _direction[idx_direction]; + int loop_count = _loop_count[idx_loop_count]; + int motion = _motion[idx_motion]; + int easing = _easing[idx_easing]; + + animationMap.Clear(); + animationMap.Insert( "startValue", start ); + animationMap.Insert( "targetValue", target ); + if( direction == 0 ) + { + animationMap.Insert("directionType", "FORWARD"); + } + else + { + animationMap.Insert("directionType", "BACKWARD"); + } + animationMap.Insert("duration", duration); + animationMap.Insert("delay", delay); + animationMap.Insert("repeat", loop_count); + animationMap.Insert("repeatDelay", repeat_delay); + if( motion == 0 ) + { + animationMap.Insert("motionType", "LOOP"); + } + else + { + animationMap.Insert("motionType", "MIRROR"); + } + if( easing == 0 ) + { + animationMap.Insert("easingType", "LINEAR"); + } + else if( easing == 1 ) + { + animationMap.Insert("easingType", "IN"); + } + else if( easing == 2 ) + { + animationMap.Insert("easingType", "OUT"); + } + else + { + animationMap.Insert("easingType", "IN_OUT"); + } + + return animationMap; + }; + + // Give different values for debuging + noise_maker += 0.8f; + Vector2 start1(-0.5f + noise_maker * 0.1f, 0.5f + noise_maker * 0.1f); + Vector2 end1 (0.5f + noise_maker * 0.1f, -0.5f + noise_maker * 0.1f); + Vector4 start_color1(1.0f, 0.7f, 0.5f, 1.0f); + Vector4 end_color1 (0.7f, 0.5f, 1.0f, 1.0f); + Vector2 rotate_center1(0.0f + noise_maker * 0.1f, 0.4f + noise_maker * 0.1f); + float rotate_amount1 = 0.0f + noise_maker * 0.1f; + float offset1 = 0.f + noise_maker * 0.1f; + + Vector2 start2(0.2f + noise_maker * 0.1f, -0.7f + noise_maker * 0.1f); + Vector2 end2 (0.5f + noise_maker * 0.1f, 0.5f + noise_maker * 0.1f); + Vector4 start_color2(0.0f, 0.1f, 0.8f, 1.0f); + Vector4 end_color2 (0.3f, 1.0f, 0.1f, 0.0f); + Vector2 rotate_center2(0.0f + noise_maker * 0.1f, -0.4f + noise_maker * 0.1f); + float rotate_amount2 = 7.0f + noise_maker * 0.1f; + float offset2 = 2.f + noise_maker * 0.1f; + + propertyMap.Insert("gradientType", "LINEAR"); + propertyMap.Insert("unitType", "USER_SPACE"); + propertyMap.Insert("spreadType", "CLAMP"); + + propertyMap.Insert("startPosition", buildAnimatedMap(start1 , start2 ,0)); + propertyMap.Insert("endPosition", buildAnimatedMap(end1 , end2 ,1)); + propertyMap.Insert("startColor", buildAnimatedMap(start_color1 , start_color2 ,2)); + propertyMap.Insert("endColor", buildAnimatedMap(end_color1 , end_color2 ,3)); + propertyMap.Insert("rotateCenter", buildAnimatedMap(rotate_center1, rotate_center2,4)); + propertyMap.Insert("rotateAmount", buildAnimatedMap(rotate_amount1, rotate_amount2,5)); + propertyMap.Insert("offset", buildAnimatedMap(offset1 , offset2 ,6)); + + Visual::Base visual = factory.CreateVisual( propertyMap ); + + DummyControl actor = DummyControl::New( true ); + Impl::DummyControl& dummyImpl = static_cast( actor.GetImplementation() ); + dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual ); + actor.SetSize( 2000, 2000 ); + actor.SetParentOrigin(ParentOrigin::CENTER); + actor.SetColor(Color::BLACK); + Stage::GetCurrent().Add(actor); + + application.SendNotification(); + application.Render( 0 ); + application.SendNotification(); + + DALI_TEST_EQUALS( actor.GetRendererCount(), 1u, TEST_LOCATION); + + application.SendNotification(); + + //Compare between CPU calculated value and Shader Visual calculated value + auto testProperty = [&application, &_direction, &_duration, &_delay, &_loop_count, &_repeat_delay, &_motion, &_easing, &test_case](const char* name, const Property::Value& start, const Property::Value& target, int tc_offset, int value_type, float progress)->void + { + int tc = (test_case + tc_offset); + int idx_easing = tc % 4; tc /= 4; + int idx_motion = tc % 2; tc /= 2; + int idx_loop_count = tc % 3; tc /= 3; + int idx_direction = tc % 2; tc /= 2; + int idx_delay = tc % 4; tc /= 4; + + float duration = _duration - _repeat_delay; + float repeat_delay = _repeat_delay; + float delay = _delay[idx_delay] * _duration; + int direction = _direction[idx_direction]; + int loop_count = _loop_count[idx_loop_count]; + int motion = _motion[idx_motion]; + int easing = _easing[idx_easing]; + + progress -= delay / _duration; + + Property::Value s = start; + Property::Value t = target; + if( direction == 1 ) + { + s = target; + t = start; + } + float x; ///< Animator progress value + if( loop_count == 0 ) + { + x = 1.0f; + } + else if( loop_count > 0 && progress + 0.01f > loop_count ) + { + x = ( motion == 0 ) ? 1.0f : 0.0f; + } + else + { + if( progress < 0.0f ) + { + progress = 0.0f; + } + progress = fmodf( progress, 1.0f ); + progress = Dali::Clamp( (progress * (duration + repeat_delay) - repeat_delay) / duration, 0.0f, 1.0f ); + + x = progress; + if( motion == 1 ) + { + x = progress * 2.0f; + if( x > 1.0f ) + { + x = 2.0f - x; + } + } + + if( easing == 1 ) // EASE_IN + { + x = x*x; + } + else if( easing == 2 ) // EASE_OUT + { + x = 2.0f*x - x*x; + } + else if( easing == 3 ) // EASE_IN_OUT + { + x = x * x * (3.0f - 2.0f * x); + } + } + if( value_type == 0 ) // result type is Float + { + float res; + float cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + else if( value_type == 1 ) // result type is Vector2 + { + Vector2 res; + Vector2 cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + else if( value_type == 2 ) // result type is Vector3 + { + Vector3 res; + Vector3 cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + else // result type is Vector4 + { + Vector4 res; + Vector4 cur; + res = s.Get() * (1.0f - x) + t.Get() * (x); + DALI_TEST_EQUALS( application.GetGlAbstraction().GetUniformValue(name, cur), true, TEST_LOCATION ); + DALI_TEST_EQUALS( res, cur, Math::MACHINE_EPSILON_100, TEST_LOCATION ); + } + }; + + float step = 0.0f; + for( int iter = 0; iter < 2; iter++ ) // test 2*duration seconds + { + for( int step_iter = 0; step_iter < 3; step_iter++ ) + { + application.SendNotification(); + application.Render( _duration * 250.f ); // step i/4 + application.SendNotification(); + step += 0.25f; + + testProperty( "start_point" , Property::Value( start1 ) , Property::Value( start2 ) , 0, 1, step ); + testProperty( "end_point" , Property::Value( end1 ) , Property::Value( end2 ) , 1, 1, step ); + testProperty( "start_color" , Property::Value( start_color1 ) , Property::Value( start_color2 ) , 2, 3, step ); + testProperty( "end_color" , Property::Value( end_color1 ) , Property::Value( end_color2 ) , 3, 3, step ); + testProperty( "rotate_center" , Property::Value( rotate_center1 ), Property::Value( rotate_center2 ), 4, 1, step ); + testProperty( "rotate_angle" , Property::Value( rotate_amount1 ), Property::Value( rotate_amount2 ), 5, 0, step ); + testProperty( "gradient_offset", Property::Value( offset1 ) , Property::Value( offset2 ) , 6, 0, step ); + } + application.SendNotification(); + application.Render(_duration * 250.f); // step 4/4 will not test + application.SendNotification(); + step += 0.25f; + } + + application.SendNotification(); + actor.Unparent(); + application.SendNotification(); + application.Render(10.f); // tempral time + application.SendNotification(); + } + } + + END_TEST; +} int UtcDaliVisualWireframeVisual(void) {