2f918e19b0c3c41639fa8fb2ec5214232ceb55e6
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedVectorImageVisual.cpp
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <iostream>
18 #include <stdlib.h>
19 #include <chrono>
20 #include <thread>
21 #include <dali-toolkit-test-suite-utils.h>
22 #include <toolkit-timer.h>
23 #include <toolkit-event-thread-callback.h>
24 #include <toolkit-vector-animation-renderer.h>
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
27 #include <dali-toolkit/devel-api/controls/control-devel.h>
28 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
29 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
30 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h>
31 #include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-signals-devel.h>
32 #include <dali/devel-api/rendering/renderer-devel.h>
33 #include <dali/devel-api/adaptor-framework/window-devel.h>
34 #include "dummy-control.h"
35
36 using namespace Dali;
37 using namespace Dali::Toolkit;
38
39 void dali_animated_vector_image_visual_startup(void)
40 {
41   test_return_value = TET_UNDEF;
42 }
43
44 void dali_animated_vector_image_visual_cleanup(void)
45 {
46   test_return_value = TET_PASS;
47 }
48
49 namespace
50 {
51
52 const char* TEST_VECTOR_IMAGE_FILE_NAME =  TEST_RESOURCE_DIR  "/insta_camera.json";
53
54 bool gAnimationFinishedSignalFired = false;
55
56 void VisualEventSignal( Control control, Dali::Property::Index visualIndex, Dali::Property::Index signalId )
57 {
58   if( visualIndex == DummyControl::Property::TEST_VISUAL && signalId == DevelAnimatedVectorImageVisual::Signal::ANIMATION_FINISHED )
59   {
60     gAnimationFinishedSignalFired = true;
61   }
62 }
63
64 }
65
66 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual01(void)
67 {
68   ToolkitTestApplication application;
69   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual01: Request animated vector image visual with a json url" );
70
71   VisualFactory factory = VisualFactory::Get();
72   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
73   DALI_TEST_CHECK( visual );
74
75   DummyControl actor = DummyControl::New( true );
76   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
77   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
78   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
79   Stage::GetCurrent().Add( actor );
80
81   application.SendNotification();
82   application.Render();
83
84   // renderer is added to actor
85   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
86   Renderer renderer = actor.GetRendererAt( 0u );
87   DALI_TEST_CHECK( renderer );
88
89   // Test SetOffStage().
90   actor.Unparent();
91   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
92
93   END_TEST;
94 }
95
96 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual02(void)
97 {
98   ToolkitTestApplication application;
99   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual02: Request animated vector image visual with a Property::Map" );
100
101   Property::Map propertyMap;
102   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
103              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
104
105   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
106   DALI_TEST_CHECK( visual );
107
108   DummyControl actor = DummyControl::New( true );
109   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
110   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
111   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
112   Stage::GetCurrent().Add( actor );
113
114   application.SendNotification();
115   application.Render();
116
117   // renderer is added to actor
118   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
119   Renderer renderer = actor.GetRendererAt( 0u );
120   DALI_TEST_CHECK( renderer );
121
122   actor.Unparent( );
123   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
124
125   END_TEST;
126 }
127
128 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual03(void)
129 {
130   ToolkitTestApplication application;
131   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual03: Request animated vector image visual with a Property::Map" );
132
133   int startFrame = 1, endFrame = 3;
134   Property::Array playRange;
135   playRange.PushBack( startFrame );
136   playRange.PushBack( endFrame );
137
138   Property::Map propertyMap;
139   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
140              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
141              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
142              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
143
144   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
145   DALI_TEST_CHECK( visual );
146
147   DummyControl actor = DummyControl::New( true );
148   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
149   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
150   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
151   Stage::GetCurrent().Add( actor );
152
153   application.SendNotification();
154   application.Render();
155
156   // renderer is added to actor
157   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
158   Renderer renderer = actor.GetRendererAt( 0u );
159   DALI_TEST_CHECK( renderer );
160
161   actor.Unparent( );
162   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
163
164   END_TEST;
165 }
166
167 int UtcDaliVisualFactoryGetAnimatedVectorImageVisual04(void)
168 {
169   ToolkitTestApplication application;
170   tet_infoline( "UtcDaliVisualFactoryGetAnimatedVectorImageVisual04: Request animated vector image visual with a Property::Map" );
171
172   int startFrame = 1, endFrame = 3;
173   Property::Array playRange;
174   playRange.PushBack( startFrame );
175   playRange.PushBack( endFrame );
176
177   Property::Map propertyMap;
178   propertyMap.Add( "visualType", DevelVisual::ANIMATED_VECTOR_IMAGE )
179              .Add( "url", TEST_VECTOR_IMAGE_FILE_NAME )
180              .Add( "loopCount", 3 )
181              .Add( "playRange", playRange )
182              .Add( "stopBehavior", DevelImageVisual::StopBehavior::FIRST_FRAME )
183              .Add( "loopingMode", DevelImageVisual::LoopingMode::AUTO_REVERSE );
184
185   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
186   DALI_TEST_CHECK( visual );
187
188   DummyControl actor = DummyControl::New( true );
189   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
190   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
191   actor.SetProperty( Actor::Property::SIZE, Vector2( 200.0f, 200.0f ) );
192   Stage::GetCurrent().Add( actor );
193
194   application.SendNotification();
195   application.Render();
196
197   // renderer is added to actor
198   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
199   Renderer renderer = actor.GetRendererAt( 0u );
200   DALI_TEST_CHECK( renderer );
201
202   Property::Map resultMap;
203   visual.CreatePropertyMap( resultMap );
204
205   // check the property values from the returned map from a visual
206   Property::Value* value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
207   DALI_TEST_CHECK( value );
208   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
209
210   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
211   DALI_TEST_CHECK( value );
212   DALI_TEST_CHECK( value->Get< int >() == 3 );
213
214   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
215   DALI_TEST_CHECK( value );
216
217   Property::Array* result = value->GetArray();
218   DALI_TEST_CHECK( result );
219
220   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
221   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
222
223   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
224   DALI_TEST_CHECK( value );
225   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::FIRST_FRAME );
226
227   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
228   DALI_TEST_CHECK( value );
229   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::AUTO_REVERSE );
230
231   actor.Unparent( );
232   DALI_TEST_CHECK( actor.GetRendererCount() == 0u );
233
234   END_TEST;
235 }
236
237 int UtcDaliAnimatedVectorImageVisualGetPropertyMap01(void)
238 {
239   ToolkitTestApplication application;
240   tet_infoline( "UtcDaliAnimatedVectorImageVisualGetPropertyMap01" );
241
242   int startFrame = 1, endFrame = 3;
243   Property::Array playRange;
244   playRange.PushBack( startFrame );
245   playRange.PushBack( endFrame );
246
247   Property::Map propertyMap;
248   propertyMap.Add( Toolkit::Visual::Property::TYPE,  DevelVisual::ANIMATED_VECTOR_IMAGE )
249              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
250              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
251              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
252
253   // request AnimatedVectorImageVisual with a property map
254   VisualFactory factory = VisualFactory::Get();
255   Visual::Base visual = factory.CreateVisual( propertyMap );
256
257   DummyControl actor = DummyControl::New( true );
258   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
259   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
260
261   Vector2 controlSize( 20.f, 30.f );
262   actor.SetProperty( Actor::Property::SIZE, controlSize );
263
264   Stage::GetCurrent().Add( actor );
265
266   application.SendNotification();
267   application.Render();
268
269   Property::Map resultMap;
270   resultMap = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
271
272   // check the property values from the returned map from a visual
273   Property::Value* value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
274   DALI_TEST_CHECK( value );
275   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
276
277   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
278   DALI_TEST_CHECK( value );
279   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
280
281   value = resultMap.Find( DevelImageVisual::Property::LOOP_COUNT, Property::INTEGER );
282   DALI_TEST_CHECK( value );
283   DALI_TEST_CHECK( value->Get< int >() == 3 );
284
285   value = resultMap.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
286   DALI_TEST_CHECK( value );
287
288   Property::Array* result = value->GetArray();
289   DALI_TEST_CHECK( result );
290
291   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
292   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
293
294   value = resultMap.Find( DevelImageVisual::Property::STOP_BEHAVIOR, Property::INTEGER );
295   DALI_TEST_CHECK( value );
296   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::StopBehavior::CURRENT_FRAME );
297
298   value = resultMap.Find( DevelImageVisual::Property::LOOPING_MODE, Property::INTEGER );
299   DALI_TEST_CHECK( value );
300   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::LoopingMode::RESTART );
301
302   value = resultMap.Find( DevelImageVisual::Property::CONTENT_INFO, Property::MAP );
303   DALI_TEST_CHECK( value );
304
305   // request AnimatedVectorImageVisual with an URL
306   Visual::Base visual2 = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
307
308   resultMap.Clear();
309   visual2.CreatePropertyMap( resultMap );
310
311   // check the property values from the returned map from a visual
312   value = resultMap.Find( Toolkit::Visual::Property::TYPE, Property::INTEGER );
313   DALI_TEST_CHECK( value );
314   DALI_TEST_CHECK( value->Get< int >() == DevelVisual::ANIMATED_VECTOR_IMAGE );
315
316   value = resultMap.Find( ImageVisual::Property::URL, Property::STRING );
317   DALI_TEST_CHECK( value );
318   DALI_TEST_CHECK( value->Get< std::string >() == TEST_VECTOR_IMAGE_FILE_NAME );
319
320   END_TEST;
321 }
322
323 int UtcDaliAnimatedVectorImageVisualPlayback(void)
324 {
325   ToolkitTestApplication application;
326
327   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayback" );
328
329   {
330     // request AnimatedVectorImageVisual with a property map
331     VisualFactory factory = VisualFactory::Get();
332     Visual::Base visual = factory.CreateVisual(
333       Property::Map()
334       .Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
335       .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME ) );
336
337     DummyControl dummyControl = DummyControl::New( true );
338     Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummyControl.GetImplementation() );
339     dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
340     dummyControl.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
341
342     Property::Map attributes;
343     tet_infoline( "Test Play action" );
344     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
345
346     Stage::GetCurrent().Add( dummyControl );
347     application.SendNotification();
348     application.Render( 16 );
349
350     Property::Map map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
351     Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
352     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
353
354     tet_infoline( "Test Pause action" );
355     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
356
357     application.SendNotification();
358     application.Render(16);
359
360     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
361     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
362     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PAUSED );
363
364     tet_infoline( "Test Play action" );
365     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
366
367     application.SendNotification();
368     application.Render(16);
369
370     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
371     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
372     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
373
374     tet_infoline( "Test Stop action" );
375     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
376
377     application.SendNotification();
378     application.Render(16);
379
380     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
381     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
382     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
383
384     tet_infoline( "Test Stop action again" );
385     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
386
387     application.SendNotification();
388     application.Render(16);
389
390     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
391     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
392     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
393
394     tet_infoline( "Test Play action" );
395     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
396
397     application.SendNotification();
398     application.Render(16);
399
400     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
401     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
402     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
403
404     tet_infoline( "Off stage" );
405     dummyControl.Unparent();
406
407     application.SendNotification();
408     application.Render(16);
409
410     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
411     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
412     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
413
414     tet_infoline( "On stage again" );
415     Stage::GetCurrent().Add( dummyControl );
416
417     application.SendNotification();
418     application.Render(16);
419
420     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
421     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
422     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
423
424     tet_infoline( "Test Play action" );
425     DevelControl::DoAction( dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
426
427     application.SendNotification();
428     application.Render(16);
429
430     map = dummyControl.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
431     value = map.Find( DevelImageVisual::Property::PLAY_STATE );
432     DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::PLAYING );
433
434     // Change Size
435     Vector3 newSize( 100.0f, 100.0f, 0.0f );
436     dummyControl.SetProperty( Actor::Property::SIZE, newSize );
437
438     application.SendNotification();
439     application.Render(16);
440
441     // Size should be changed
442     Vector3 naturalSize = dummyControl.GetNaturalSize();
443     DALI_TEST_CHECK( naturalSize == newSize );
444
445     dummyControl.Unparent();
446   }
447
448   END_TEST;
449 }
450
451 int UtcDaliAnimatedVectorImageVisualCustomShader(void)
452 {
453   ToolkitTestApplication application;
454   tet_infoline( "UtcDaliAnimatedVectorImageVisualCustomShader Test custom shader" );
455
456   VisualFactory factory = VisualFactory::Get();
457   Property::Map properties;
458   Property::Map shader;
459   const std::string vertexShader = "Foobar";
460   const std::string fragmentShader = "Foobar sampler2D Foobar";
461   shader[Visual::Shader::Property::FRAGMENT_SHADER] = fragmentShader;
462   shader[Visual::Shader::Property::VERTEX_SHADER] = vertexShader;
463
464   properties[Visual::Property::TYPE] = Visual::IMAGE;
465   properties[Visual::Property::SHADER] = shader;
466   properties[ImageVisual::Property::URL] = TEST_VECTOR_IMAGE_FILE_NAME;
467
468   Visual::Base visual = factory.CreateVisual( properties );
469
470   // trigger creation through setting on stage
471   DummyControl dummy = DummyControl::New( true );
472   Impl::DummyControl& dummyImpl = static_cast< Impl::DummyControl& >( dummy.GetImplementation() );
473   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
474
475   dummy.SetProperty( Actor::Property::SIZE, Vector2( 200.f, 200.f ) );
476   dummy.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
477   Stage::GetCurrent().Add( dummy );
478
479   application.SendNotification();
480   application.Render();
481
482   Renderer renderer = dummy.GetRendererAt( 0 );
483   Shader shader2 = renderer.GetShader();
484   Property::Value value = shader2.GetProperty( Shader::Property::PROGRAM );
485   Property::Map* map = value.GetMap();
486   DALI_TEST_CHECK( map );
487
488   std::string resultFragmentShader, resultVertexShader;
489   Property::Value* fragment = map->Find( "fragment" ); // fragment key name from shader-impl.cpp
490   fragment->Get( resultFragmentShader );
491   DALI_TEST_CHECK( resultFragmentShader.find( fragmentShader ) != std::string::npos );
492
493   Property::Value* vertex = map->Find( "vertex" ); // vertex key name from shader-impl.cpp
494   vertex->Get( resultVertexShader );
495   DALI_TEST_CHECK( resultVertexShader.find( vertexShader ) != std::string::npos );
496
497   END_TEST;
498 }
499
500 int UtcDaliAnimatedVectorImageVisualNaturalSize(void)
501 {
502   ToolkitTestApplication application;
503   tet_infoline( "UtcDaliAnimatedVectorImageVisualNaturalSize" );
504
505   VisualFactory factory = VisualFactory::Get();
506   Visual::Base visual = factory.CreateVisual( TEST_VECTOR_IMAGE_FILE_NAME, ImageDimensions() );
507   DALI_TEST_CHECK( visual );
508
509   DummyControl actor = DummyControl::New( true );
510   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
511   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
512
513   Vector2 controlSize( 20.f, 30.f );
514   Vector2 naturalSize;
515
516   Stage::GetCurrent().Add( actor );
517
518   application.SendNotification();
519   application.Render();
520
521   visual.GetNaturalSize( naturalSize );
522
523   DALI_TEST_EQUALS( naturalSize, Vector2( 100.0f, 100.0f ), TEST_LOCATION );    // 100x100 is the content default size.
524
525   actor.SetProperty( Actor::Property::SIZE, controlSize );
526
527   application.SendNotification();
528   application.Render();
529
530   visual.GetNaturalSize( naturalSize );
531
532   DALI_TEST_EQUALS( naturalSize, controlSize, TEST_LOCATION );
533
534   END_TEST;
535 }
536
537 int UtcDaliAnimatedVectorImageVisualLoopCount(void)
538 {
539   ToolkitTestApplication application;
540   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopCount" );
541
542   Property::Map propertyMap;
543   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
544              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
545              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
546
547   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
548   DALI_TEST_CHECK( visual );
549
550   DummyControl actor = DummyControl::New( true );
551   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
552   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
553
554   Vector2 controlSize( 20.f, 30.f );
555   actor.SetProperty( Actor::Property::SIZE, controlSize );
556
557   Stage::GetCurrent().Add( actor );
558
559   Property::Map attributes;
560   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
561
562   application.SendNotification();
563   application.Render();
564
565   // Trigger count is 1 - render a frame
566   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
567
568   // renderer is added to actor
569   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
570   Renderer renderer = actor.GetRendererAt( 0u );
571   DALI_TEST_CHECK( renderer );
572
573   END_TEST;
574 }
575
576 int UtcDaliAnimatedVectorImageVisualPlayRange(void)
577 {
578   ToolkitTestApplication application;
579   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRange" );
580
581   int startFrame = 1, endFrame = 3;
582   Property::Array array;
583   array.PushBack( endFrame );
584   array.PushBack( startFrame );
585
586   Property::Map propertyMap;
587   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
588              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
589              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
590
591   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
592   DALI_TEST_CHECK( visual );
593
594   DummyControl actor = DummyControl::New( true );
595   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
596   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
597
598   Vector2 controlSize( 20.f, 30.f );
599   actor.SetProperty( Actor::Property::SIZE, controlSize );
600
601   Stage::GetCurrent().Add( actor );
602
603   Property::Map attributes;
604   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
605
606   application.SendNotification();
607   application.Render();
608
609   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
610
611   // renderer is added to actor
612   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
613   Renderer renderer = actor.GetRendererAt( 0u );
614   DALI_TEST_CHECK( renderer );
615
616   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
617   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
618
619   int resultStartFrame, resultEndFrame;
620   Property::Array* result = value->GetArray();
621   result->GetElementAt( 0 ).Get( resultStartFrame );
622   result->GetElementAt( 1 ).Get( resultEndFrame );
623
624   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );
625   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
626
627   // Set invalid play range
628   array.Clear();
629   array.PushBack( 1 );
630   array.PushBack( 100 );
631
632   attributes.Clear();
633   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
634   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
635
636   application.SendNotification();
637   application.Render();
638
639   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
640
641   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
642   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
643
644   result = value->GetArray();
645   result->GetElementAt( 0 ).Get( resultStartFrame );
646   result->GetElementAt( 1 ).Get( resultEndFrame );
647
648   DALI_TEST_EQUALS( startFrame, resultStartFrame, TEST_LOCATION );  // Should not be changed
649   DALI_TEST_EQUALS( endFrame, resultEndFrame, TEST_LOCATION );
650
651   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, Property::Map() );
652
653   application.SendNotification();
654   application.Render();
655
656   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
657
658   application.SendNotification();
659   application.Render();
660
661   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
662
663   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
664   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
665   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
666
667   array.Clear();
668   array.PushBack( 0 );
669   array.PushBack( 2 );
670
671   attributes.Clear();
672   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
673   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
674
675   application.SendNotification();
676   application.Render();
677
678   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
679   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
680
681   result = value->GetArray();
682   result->GetElementAt( 0 ).Get( resultStartFrame );
683   result->GetElementAt( 1 ).Get( resultEndFrame );
684
685   DALI_TEST_EQUALS( 0, resultStartFrame, TEST_LOCATION );
686   DALI_TEST_EQUALS( 2, resultEndFrame, TEST_LOCATION );
687
688   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
689   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );    // CURRENT_FRAME_NUMBER should be changed also.
690
691   END_TEST;
692 }
693
694 int UtcDaliAnimatedVectorImageVisualPlayRangeMarker(void)
695 {
696   ToolkitTestApplication application;
697   tet_infoline( "UtcDaliAnimatedVectorImageVisualPlayRangeMarker" );
698
699   Property::Array array;
700   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
701
702   Property::Map propertyMap;
703   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
704              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
705              .Add( DevelImageVisual::Property::PLAY_RANGE, array  );
706
707   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
708   DALI_TEST_CHECK( visual );
709
710   DummyControl actor = DummyControl::New( true );
711   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
712   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
713
714   Vector2 controlSize( 20.f, 30.f );
715   actor.SetProperty( Actor::Property::SIZE, controlSize );
716
717   Stage::GetCurrent().Add( actor );
718
719   Property::Map attributes;
720   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
721
722   application.SendNotification();
723   application.Render();
724
725   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
726
727   // renderer is added to actor
728   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
729   Renderer renderer = actor.GetRendererAt( 0u );
730   DALI_TEST_CHECK( renderer );
731
732   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
733   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
734
735   int resultStartFrame, resultEndFrame;
736   Property::Array* result = value->GetArray();
737   result->GetElementAt( 0 ).Get( resultStartFrame );
738   result->GetElementAt( 1 ).Get( resultEndFrame );
739
740   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );
741   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_1, resultEndFrame, TEST_LOCATION );
742
743   // Set 2 markers
744   array.Clear();
745   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
746   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_2 );
747
748   attributes.Clear();
749   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
750   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
751
752   application.SendNotification();
753   application.Render();
754
755   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
756
757   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
758   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
759
760   result = value->GetArray();
761   result->GetElementAt( 0 ).Get( resultStartFrame );
762   result->GetElementAt( 1 ).Get( resultEndFrame );
763
764   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );
765   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_2, resultEndFrame, TEST_LOCATION );
766
767   // Set invalid play range
768   array.Clear();
769   array.PushBack( 1 );
770   array.PushBack( VECTOR_ANIMATION_MARKER_NAME_1 );
771
772   attributes.Clear();
773   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
774   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
775
776   application.SendNotification();
777   application.Render();
778
779   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
780
781   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
782   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
783
784   result = value->GetArray();
785   result->GetElementAt( 0 ).Get( resultStartFrame );
786   result->GetElementAt( 1 ).Get( resultEndFrame );
787
788   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_START_FRAME_1, resultStartFrame, TEST_LOCATION );  // Should not be changed
789   DALI_TEST_EQUALS( VECTOR_ANIMATION_MARKER_END_FRAME_2, resultEndFrame, TEST_LOCATION );
790
791   END_TEST;
792 }
793
794 int UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal(void)
795 {
796   ToolkitTestApplication application;
797   tet_infoline( "UtcDaliAnimatedVectorImageVisualAnimationFinishedSignal" );
798
799   Property::Map propertyMap;
800   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
801              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
802              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  );
803
804   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
805   DALI_TEST_CHECK( visual );
806
807   DummyControl actor = DummyControl::New( true );
808   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
809   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
810
811   DevelControl::VisualEventSignal( actor ).Connect( &VisualEventSignal );
812
813   Vector2 controlSize( 20.f, 30.f );
814   actor.SetProperty( Actor::Property::SIZE, controlSize );
815
816   Stage::GetCurrent().Add( actor );
817
818   Property::Map attributes;
819   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
820
821   application.SendNotification();
822   application.Render();
823
824   // Wait for animation finish
825   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
826
827   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
828   Property::Value* value = map.Find( DevelImageVisual::Property::PLAY_STATE );
829   DALI_TEST_CHECK( value->Get< int >() == DevelImageVisual::PlayState::STOPPED );
830
831   DALI_TEST_EQUALS( gAnimationFinishedSignalFired, true, TEST_LOCATION );
832
833   END_TEST;
834 }
835
836 int UtcDaliAnimatedVectorImageVisualJumpTo(void)
837 {
838   ToolkitTestApplication application;
839   tet_infoline( "UtcDaliAnimatedVectorImageVisualJumpTo" );
840
841   Property::Map propertyMap;
842   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
843              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
844
845   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
846   DALI_TEST_CHECK( visual );
847
848   tet_printf( "1. Visual is created.\n" );
849
850   DummyControl actor = DummyControl::New( true );
851   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
852   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
853
854   Vector2 controlSize( 20.f, 30.f );
855   actor.SetProperty( Actor::Property::SIZE, controlSize );
856
857   Stage::GetCurrent().Add( actor );
858
859   application.SendNotification();
860   application.Render();
861
862   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 2 );
863
864   application.SendNotification();
865   application.Render();
866
867   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
868   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
869   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
870
871   tet_printf( "2. The current frame number is [%d].\n", value->Get< int >() );
872
873   Property::Array array;
874   array.PushBack( 0 );
875   array.PushBack( 2 );
876
877   Property::Map attributes;
878   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
879   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
880
881   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
882
883   application.SendNotification();
884   application.Render();
885
886   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
887   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
888   DALI_TEST_EQUALS( value->Get< int >(), 2, TEST_LOCATION );
889
890   tet_printf( "3. The current frame number is [%d].\n", value->Get< int >() );
891
892   // Change play range
893   attributes.Clear();
894   array.Clear();
895
896   array.PushBack( 0 );
897   array.PushBack( 4 );
898
899   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, array );
900   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
901
902   attributes.Clear();
903   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
904
905   application.SendNotification();
906   application.Render();
907
908   // Stop and jump to 3
909   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
910
911   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
912
913   application.SendNotification();
914   application.Render();
915
916   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
917
918   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
919   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
920   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
921
922   tet_printf( "4. The current frame number is [%d].\n", value->Get< int >() );
923
924   // Jump to the same position
925   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::JUMP_TO, 3 );
926
927   application.SendNotification();
928   application.Render();
929
930   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
931   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
932   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
933
934   tet_printf( "5. The current frame number is [%d].\n", value->Get< int >() );
935
936   END_TEST;
937 }
938
939 int UtcDaliAnimatedVectorImageVisualUpdateProperty(void)
940 {
941   ToolkitTestApplication application;
942   tet_infoline( "UtcDaliAnimatedVectorImageVisualUpdateProperty" );
943
944   int startFrame = 1, endFrame = 3;
945   Property::Array playRange;
946   playRange.PushBack( startFrame );
947   playRange.PushBack( endFrame );
948
949   Property::Map propertyMap;
950   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
951              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  )
952              .Add( DevelImageVisual::Property::LOOP_COUNT, 3  )
953              .Add( DevelImageVisual::Property::PLAY_RANGE, playRange  );
954
955   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
956   DALI_TEST_CHECK( visual );
957
958   DummyControl actor = DummyControl::New( true );
959   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
960   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
961
962   Vector2 controlSize( 20.f, 30.f );
963   actor.SetProperty( Actor::Property::SIZE, controlSize );
964
965   Stage::GetCurrent().Add( actor );
966
967   application.SendNotification();
968   application.Render();
969
970   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
971
972   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
973   Property::Value* value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
974   DALI_TEST_EQUALS( value->Get< int >(), 3, TEST_LOCATION );
975
976   value = map.Find( DevelImageVisual::Property::PLAY_RANGE, Property::ARRAY );
977   DALI_TEST_CHECK( value );
978
979   Property::Array* result = value->GetArray();
980   DALI_TEST_CHECK( result );
981
982   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
983   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
984
985   playRange.Clear();
986   playRange.PushBack( 0 );
987   playRange.PushBack( 2 );
988
989   Property::Map attributes;
990   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
991   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 5 );
992
993   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
994
995   application.SendNotification();
996   application.Render();
997
998   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
999
1000   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1001   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
1002   DALI_TEST_EQUALS( value->Get< int >(), 5, TEST_LOCATION );
1003
1004   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
1005   result = value->GetArray();
1006   DALI_TEST_CHECK( result );
1007
1008   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == 0 );
1009   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == 2 );
1010
1011   attributes.Clear();
1012
1013   playRange.Clear();
1014   playRange.PushBack( startFrame );
1015   playRange.PushBack( endFrame );
1016
1017   attributes.Add( DevelImageVisual::Property::PLAY_RANGE, playRange );
1018
1019   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1020
1021   application.SendNotification();
1022   application.Render();
1023
1024   std::this_thread::sleep_for( std::chrono::milliseconds( 20 ) );    // wait for next rasterize thread run
1025
1026   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1027   value = map.Find( DevelImageVisual::Property::PLAY_RANGE );
1028
1029   result = value->GetArray();
1030   DALI_TEST_CHECK( result );
1031
1032   DALI_TEST_CHECK( result->GetElementAt( 0 ).Get< int >() == startFrame );
1033   DALI_TEST_CHECK( result->GetElementAt( 1 ).Get< int >() == endFrame );
1034
1035   // Play and update property
1036   attributes.Clear();
1037   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1038
1039   application.SendNotification();
1040   application.Render();
1041
1042   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, 10 );
1043
1044   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1045
1046   application.SendNotification();
1047   application.Render();
1048
1049   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1050   value = map.Find( DevelImageVisual::Property::LOOP_COUNT );
1051   DALI_TEST_EQUALS( value->Get< int >(), 10, TEST_LOCATION );
1052
1053   END_TEST;
1054 }
1055
1056 int UtcDaliAnimatedVectorImageVisualStopBehavior(void)
1057 {
1058   ToolkitTestApplication application;
1059   tet_infoline( "UtcDaliAnimatedVectorImageVisualStopBehavior" );
1060
1061   Property::Map propertyMap;
1062   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1063              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
1064              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
1065              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME );
1066
1067   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1068   DALI_TEST_CHECK( visual );
1069
1070   DummyControl actor = DummyControl::New( true );
1071   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1072   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1073
1074   Vector2 controlSize( 20.f, 30.f );
1075   actor.SetProperty( Actor::Property::SIZE, controlSize );
1076
1077   Stage::GetCurrent().Add( actor );
1078
1079   Property::Map attributes;
1080   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1081
1082   application.SendNotification();
1083   application.Render();
1084
1085   // Trigger count is 1 - animation finished
1086   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1087
1088   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1089   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1090   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
1091
1092   // Change stop behavior
1093   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME );
1094
1095   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1096
1097   attributes.Clear();
1098
1099   // Play again
1100   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1101
1102   application.SendNotification();
1103   application.Render();
1104
1105   // Trigger count is 1 - animation finished
1106   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1107
1108   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1109
1110   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
1111   int totalFrameNumber = value1->Get< int >();
1112
1113   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1114   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
1115
1116   // Change stop behavior
1117   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
1118   attributes.Add( DevelImageVisual::Property::LOOP_COUNT, -1 );
1119
1120   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1121
1122   attributes.Clear();
1123
1124   // Play again
1125   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1126
1127   application.SendNotification();
1128   application.Render();
1129
1130   // Pause
1131   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PAUSE, attributes );
1132
1133   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1134   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1135   int currentFrameNumber = value->Get< int >();
1136
1137   // Stop
1138   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::STOP, attributes );
1139
1140   application.SendNotification();
1141   application.Render( 16 );
1142
1143   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1144   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1145   DALI_TEST_EQUALS( value->Get< int >(), currentFrameNumber, TEST_LOCATION );  // Should be same with currentFrameNumber
1146
1147   END_TEST;
1148 }
1149
1150 int UtcDaliAnimatedVectorImageVisualLoopingMode(void)
1151 {
1152   ToolkitTestApplication application;
1153   tet_infoline( "UtcDaliAnimatedVectorImageVisualLoopingMode" );
1154
1155   Property::Map propertyMap;
1156   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1157              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME )
1158              .Add( DevelImageVisual::Property::LOOP_COUNT, 3 )
1159              .Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME )
1160              .Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::AUTO_REVERSE );
1161
1162   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1163   DALI_TEST_CHECK( visual );
1164
1165   DummyControl actor = DummyControl::New( true );
1166   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1167   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1168
1169   Vector2 controlSize( 20.f, 30.f );
1170   actor.SetProperty( Actor::Property::SIZE, controlSize );
1171
1172   Stage::GetCurrent().Add( actor );
1173
1174   Property::Map attributes;
1175   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1176
1177   application.SendNotification();
1178   application.Render();
1179
1180   // Trigger count is 1 - animation finished
1181   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 2 ), true, TEST_LOCATION );
1182
1183   Property::Map map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1184   Property::Value* value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1185   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame because of auto reverse
1186
1187   // Change stop behavior
1188   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::CURRENT_FRAME );
1189
1190   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1191
1192   // Play again
1193   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1194
1195   application.SendNotification();
1196   application.Render();
1197
1198   // Trigger count is 1 - animation finished
1199   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1200
1201   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1202   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1203   DALI_TEST_EQUALS( value->Get< int >(), 0, TEST_LOCATION );  // Should be the first frame
1204
1205   // Change looping mode
1206   attributes.Add( DevelImageVisual::Property::LOOPING_MODE, DevelImageVisual::LoopingMode::RESTART );
1207
1208   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1209
1210   // Play again
1211   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1212
1213   application.SendNotification();
1214   application.Render();
1215
1216   // Trigger count is 1 - animation finished
1217   DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
1218
1219   Property::Value* value1 = map.Find( DevelImageVisual::Property::TOTAL_FRAME_NUMBER );
1220   int totalFrameNumber = value1->Get< int >();
1221
1222   map = actor.GetProperty< Property::Map >( DummyControl::Property::TEST_VISUAL );
1223   value = map.Find( DevelImageVisual::Property::CURRENT_FRAME_NUMBER );
1224   DALI_TEST_EQUALS( value->Get< int >(), totalFrameNumber - 1, TEST_LOCATION );  // Should be the last frame
1225
1226   END_TEST;
1227 }
1228
1229 int UtcDaliAnimatedVectorImageVisualPropertyNotification(void)
1230 {
1231   ToolkitTestApplication application;
1232   tet_infoline( "UtcDaliAnimatedVectorImageVisualPropertyNotification" );
1233
1234   Property::Map propertyMap;
1235   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1236              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME  );
1237
1238   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1239   DALI_TEST_CHECK( visual );
1240
1241   DummyControl actor = DummyControl::New( true );
1242   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1243   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1244
1245   Vector2 controlSize( 20.f, 30.f );
1246   Vector3 controlScale( 2.0f, 2.0f, 1.0f );
1247   actor.SetProperty( Actor::Property::SIZE, controlSize );
1248   actor.SetProperty( Actor::Property::SCALE, controlScale );
1249
1250   Stage::GetCurrent().Add( actor );
1251
1252   application.SendNotification();
1253   application.Render();
1254
1255   application.SendNotification();
1256   application.Render();
1257
1258   Renderer renderer = actor.GetRendererAt( 0u );
1259   DALI_TEST_CHECK( renderer );
1260
1261   auto textureSet = renderer.GetTextures();
1262   auto texture = textureSet.GetTexture(0);
1263
1264   DALI_TEST_EQUALS( controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION );
1265   DALI_TEST_EQUALS( controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION );
1266
1267   // Change scale and size
1268   controlSize = Vector2( 50.f, 40.f );
1269   controlScale= Vector3( 0.5f, 0.5f, 1.0f );
1270   actor.SetProperty( Actor::Property::SIZE, controlSize );
1271   actor.SetProperty( Actor::Property::SCALE, controlScale );
1272
1273   application.SendNotification();
1274   application.Render();
1275
1276   application.SendNotification();
1277   application.Render();
1278
1279   renderer = actor.GetRendererAt( 0u );
1280   DALI_TEST_CHECK( renderer );
1281
1282   textureSet = renderer.GetTextures();
1283   texture = textureSet.GetTexture(0);
1284
1285   DALI_TEST_EQUALS( controlSize.width * controlScale.width, texture.GetWidth(), TEST_LOCATION );
1286   DALI_TEST_EQUALS( controlSize.height * controlScale.height, texture.GetHeight(), TEST_LOCATION );
1287
1288   END_TEST;
1289 }
1290
1291 int UtcDaliAnimatedVectorImageVisualMultipleInstances(void)
1292 {
1293   ToolkitTestApplication application;
1294   tet_infoline( "UtcDaliAnimatedVectorImageVisualMultipleInstances" );
1295
1296   Property::Map propertyMap;
1297   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1298              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1299
1300   Visual::Base visual1 = VisualFactory::Get().CreateVisual( propertyMap );
1301   DALI_TEST_CHECK( visual1 );
1302
1303   DummyControl actor1 = DummyControl::New( true );
1304   DummyControlImpl& dummyImpl1 = static_cast< DummyControlImpl& >( actor1.GetImplementation() );
1305   dummyImpl1.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual1 );
1306
1307   Vector2 controlSize( 20.f, 30.f );
1308   actor1.SetProperty( Actor::Property::SIZE, controlSize );
1309
1310   Stage::GetCurrent().Add( actor1 );
1311
1312   propertyMap.Clear();
1313   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1314              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1315
1316   Visual::Base visual2 = VisualFactory::Get().CreateVisual( propertyMap );
1317   DALI_TEST_CHECK( visual2 );
1318
1319   DummyControl actor2 = DummyControl::New( true );
1320   DummyControlImpl& dummyImpl2 = static_cast< DummyControlImpl& >( actor2.GetImplementation() );
1321   dummyImpl2.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual2 );
1322
1323   actor2.SetProperty( Actor::Property::SIZE, controlSize );
1324
1325   Stage::GetCurrent().Add( actor2 );
1326
1327   DevelControl::DoAction( actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map() );
1328
1329   application.SendNotification();
1330   application.Render();
1331
1332   std::this_thread::sleep_for( std::chrono::milliseconds( 200 ) );
1333
1334   Property::Map attributes;
1335   attributes.Add( DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME );
1336
1337   DevelControl::DoAction( actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1338   DevelControl::DoAction( actor2, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::UPDATE_PROPERTY, attributes );
1339
1340   DevelControl::DoAction( actor1, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, Property::Map() );
1341
1342   // renderer is added to actor
1343   DALI_TEST_CHECK( actor1.GetRendererCount() == 1u );
1344   Renderer renderer1 = actor1.GetRendererAt( 0u );
1345   DALI_TEST_CHECK( renderer1 );
1346
1347   // renderer is added to actor
1348   DALI_TEST_CHECK( actor2.GetRendererCount() == 1u );
1349   Renderer renderer2 = actor2.GetRendererAt( 0u );
1350   DALI_TEST_CHECK( renderer2 );
1351
1352   END_TEST;
1353 }
1354
1355 int UtcDaliAnimatedVectorImageVisualControlVisibilityChanged(void)
1356 {
1357   ToolkitTestApplication application;
1358   tet_infoline( "UtcDaliAnimatedVectorImageVisualControlVisibilityChanged" );
1359
1360   Property::Map propertyMap;
1361   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1362              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1363
1364   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1365   DALI_TEST_CHECK( visual );
1366
1367   DummyControl actor = DummyControl::New( true );
1368   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1369   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1370
1371   Vector2 controlSize( 20.f, 30.f );
1372   actor.SetProperty( Actor::Property::SIZE, controlSize );
1373
1374   Stage::GetCurrent().Add( actor );
1375
1376   application.SendNotification();
1377   application.Render();
1378
1379   Property::Map attributes;
1380   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1381
1382   application.SendNotification();
1383   application.Render();
1384
1385   // Check rendering behavior
1386   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1387   Renderer renderer = actor.GetRendererAt( 0u );
1388   DALI_TEST_CHECK( renderer );
1389   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY );
1390
1391   actor.SetProperty( Actor::Property::VISIBLE, false );
1392
1393   application.SendNotification();
1394   application.Render();
1395
1396   // Check rendering behavior again
1397   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED );
1398
1399   END_TEST;
1400 }
1401
1402 int UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged(void)
1403 {
1404   ToolkitTestApplication application;
1405   tet_infoline( "UtcDaliAnimatedVectorImageVisualWindowVisibilityChanged" );
1406
1407   Property::Map propertyMap;
1408   propertyMap.Add( Toolkit::Visual::Property::TYPE, DevelVisual::ANIMATED_VECTOR_IMAGE )
1409              .Add( ImageVisual::Property::URL, TEST_VECTOR_IMAGE_FILE_NAME );
1410
1411   Visual::Base visual = VisualFactory::Get().CreateVisual( propertyMap );
1412   DALI_TEST_CHECK( visual );
1413
1414   DummyControl actor = DummyControl::New( true );
1415   DummyControlImpl& dummyImpl = static_cast< DummyControlImpl& >( actor.GetImplementation() );
1416   dummyImpl.RegisterVisual( DummyControl::Property::TEST_VISUAL, visual );
1417
1418   Vector2 controlSize( 20.f, 30.f );
1419   actor.SetProperty( Actor::Property::SIZE, controlSize );
1420
1421   Stage::GetCurrent().Add( actor );
1422
1423   application.SendNotification();
1424   application.Render();
1425
1426   Property::Map attributes;
1427   DevelControl::DoAction( actor, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedVectorImageVisual::Action::PLAY, attributes );
1428
1429   application.SendNotification();
1430   application.Render();
1431
1432   // Check rendering behavior
1433   DALI_TEST_CHECK( actor.GetRendererCount() == 1u );
1434   Renderer renderer = actor.GetRendererAt( 0u );
1435   DALI_TEST_CHECK( renderer );
1436   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::CONTINUOUSLY );
1437
1438   Window window = DevelWindow::Get( actor );
1439   window.Hide();
1440
1441   application.SendNotification();
1442   application.Render();
1443
1444   // Check rendering behavior again
1445   DALI_TEST_CHECK( renderer.GetProperty< int >( DevelRenderer::Property::RENDERING_BEHAVIOR ) == DevelRenderer::Rendering::IF_REQUIRED );
1446
1447   END_TEST;
1448 }