DALi Version 2.2.11
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-AnimatedImageVisual.cpp
1 /*
2  * Copyright (c) 2023 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 <stdlib.h>
18 #include <iostream>
19
20 #include <dali-toolkit-test-suite-utils.h>
21
22 #include <toolkit-event-thread-callback.h>
23 #include <toolkit-timer.h>
24
25 #include <dali-toolkit/dali-toolkit.h>
26 #include <dali-toolkit/devel-api/controls/control-devel.h>
27 #include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
28 #include <dali-toolkit/devel-api/visuals/animated-image-visual-actions-devel.h>
29 #include <dali-toolkit/devel-api/visuals/image-visual-properties-devel.h>
30 #include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
31
32 #include "dummy-control.h"
33
34 using namespace Dali;
35 using namespace Dali::Toolkit;
36
37 void dali_animated_image_visual_startup(void)
38 {
39   test_return_value = TET_UNDEF;
40 }
41
42 void dali_animated_image_visual_cleanup(void)
43 {
44   test_return_value = TET_PASS;
45 }
46
47 namespace
48 {
49 const char* TEST_IMAGE_FILE_NAME      = TEST_RESOURCE_DIR "/application-icon-%02d.png";
50 const char* TEST_GIF_FILE_NAME        = TEST_RESOURCE_DIR "/anim.gif";
51 const char* TEST_MASK_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/mask.png";
52 const char* TEST_WEBP_FILE_NAME       = TEST_RESOURCE_DIR "/dali-logo.webp";
53 } // namespace
54
55 void CopyUrlsIntoArray(Property::Array& urls, int startIndex = 0)
56 {
57   for(int i = 20 + startIndex; i <= 30; ++i)
58   {
59     char* url;
60     if(asprintf(&url, TEST_IMAGE_FILE_NAME, i) > 0)
61     {
62       Property::Value value(url);
63       urls.Add(value);
64       free(url);
65     }
66   }
67 }
68
69 int UtcDaliAnimatedImageVisualGetPropertyMap01(void)
70 {
71   ToolkitTestApplication application;
72   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap");
73
74   // request AnimatedImageVisual with a property map
75   VisualFactory factory             = VisualFactory::Get();
76   Visual::Base  animatedImageVisual = factory.CreateVisual(
77     Property::Map()
78       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
79       .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
80       .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
81       .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
82       .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
83       .Add(ImageVisual::Property::FITTING_MODE, FittingMode::FIT_WIDTH)
84       .Add(ImageVisual::Property::SAMPLING_MODE, SamplingMode::NEAREST)
85       .Add(ImageVisual::Property::DESIRED_WIDTH, 154)
86       .Add(ImageVisual::Property::DESIRED_HEIGHT, 79)
87       .Add(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME)
88       .Add(ImageVisual::Property::MASK_CONTENT_SCALE, 1.6f)
89       .Add(ImageVisual::Property::CROP_TO_MASK, true)
90       .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
91       .Add(DevelVisual::Property::CORNER_RADIUS, 22.2f)
92       .Add(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE)
93       .Add(DevelVisual::Property::BORDERLINE_WIDTH, 33.3f)
94       .Add(DevelVisual::Property::BORDERLINE_COLOR, Color::RED)
95       .Add(DevelVisual::Property::BORDERLINE_OFFSET, 0.3f));
96
97   Property::Map resultMap;
98   animatedImageVisual.CreatePropertyMap(resultMap);
99   // check the property values from the returned map from a visual
100   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
101   DALI_TEST_CHECK(value);
102   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
103
104   value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
105   DALI_TEST_CHECK(value);
106   DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
107
108   value = resultMap.Find(Toolkit::ImageVisual::Property::WRAP_MODE_U, Property::INTEGER);
109   DALI_TEST_CHECK(value);
110   DALI_TEST_CHECK(value->Get<int>() == WrapMode::REPEAT);
111
112   value = resultMap.Find(Toolkit::ImageVisual::Property::WRAP_MODE_V, Property::INTEGER);
113   DALI_TEST_CHECK(value);
114   DALI_TEST_CHECK(value->Get<int>() == WrapMode::DEFAULT);
115
116   value = resultMap.Find(Toolkit::ImageVisual::Property::FITTING_MODE, Property::INTEGER);
117   DALI_TEST_CHECK(value);
118   DALI_TEST_CHECK(value->Get<int>() == FittingMode::FIT_WIDTH);
119
120   value = resultMap.Find(Toolkit::ImageVisual::Property::SAMPLING_MODE, Property::INTEGER);
121   DALI_TEST_CHECK(value);
122   DALI_TEST_CHECK(value->Get<int>() == SamplingMode::NEAREST);
123
124   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_WIDTH, Property::INTEGER);
125   DALI_TEST_CHECK(value);
126   DALI_TEST_CHECK(value->Get<int>() == 154);
127
128   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_HEIGHT, Property::INTEGER);
129   DALI_TEST_CHECK(value);
130   DALI_TEST_CHECK(value->Get<int>() == 79);
131
132   value = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
133   DALI_TEST_CHECK(value);
134   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(22.2f, 22.2f, 22.2f, 22.2f), TEST_LOCATION);
135
136   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER);
137   DALI_TEST_CHECK(value);
138   DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::ABSOLUTE);
139
140   value = resultMap.Find(DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT);
141   DALI_TEST_CHECK(value);
142   DALI_TEST_EQUALS(value->Get<float>(), 33.3f, TEST_LOCATION);
143
144   value = resultMap.Find(DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4);
145   DALI_TEST_CHECK(value);
146   DALI_TEST_EQUALS(value->Get<Vector4>(), Color::RED, TEST_LOCATION);
147
148   value = resultMap.Find(DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT);
149   DALI_TEST_CHECK(value);
150   DALI_TEST_EQUALS(value->Get<float>(), 0.3f, TEST_LOCATION);
151
152   // Check mask properties
153   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, Property::STRING);
154   DALI_TEST_CHECK(value);
155   DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
156
157   value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, Property::FLOAT);
158   DALI_TEST_CHECK(value);
159   DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
160
161   value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, Property::BOOLEAN);
162   DALI_TEST_CHECK(value);
163   DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
164
165   value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
166   DALI_TEST_CHECK(value);
167   DALI_TEST_CHECK(value->Get<int>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
168
169   // Natural size getted as desired size
170   Vector2 naturalSize;
171   animatedImageVisual.GetNaturalSize(naturalSize);
172   DALI_TEST_EQUALS(naturalSize, Vector2(154, 79), TEST_LOCATION);
173
174   // request AnimatedImageVisual with an URL
175   Visual::Base animatedImageVisual2 = factory.CreateVisual(TEST_GIF_FILE_NAME, ImageDimensions());
176   resultMap.Clear();
177   animatedImageVisual2.CreatePropertyMap(resultMap);
178   // check the property values from the returned map from a visual
179   value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
180   DALI_TEST_CHECK(value);
181   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
182
183   value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
184   DALI_TEST_CHECK(value);
185   DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
186
187   // Natural size getted as image size
188   animatedImageVisual2.GetNaturalSize(naturalSize);
189   DALI_TEST_EQUALS(naturalSize, Vector2(50, 50), TEST_LOCATION);
190
191   END_TEST;
192 }
193
194 int UtcDaliAnimatedImageVisualGetPropertyMap02(void)
195 {
196   ToolkitTestApplication application;
197   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap for multi image with fixed cache");
198
199   // request AnimatedImageVisual with a property map
200   VisualFactory   factory = VisualFactory::Get();
201   Property::Array urls;
202   CopyUrlsIntoArray(urls);
203
204   Visual::Base animatedImageVisual = factory.CreateVisual(
205     Property::Map()
206       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
207       .Add("url", urls)
208       .Add("batchSize", 4)
209       .Add("cacheSize", 20)
210       .Add("loopCount", 10)
211       .Add("frameDelay", 200)
212       .Add("pixelArea", Vector4())
213       .Add("wrapModeU", WrapMode::REPEAT)
214       .Add("wrapModeV", WrapMode::DEFAULT)
215       .Add("fittingMode", FittingMode::FIT_WIDTH)
216       .Add("samplingMode", SamplingMode::NEAREST)
217       .Add("desiredWidth", 154)
218       .Add("desiredHeight", 79)
219       .Add("alphaMaskUrl", TEST_MASK_IMAGE_FILE_NAME)
220       .Add("maskContentScale", 1.6f)
221       .Add("cropToMask", true)
222       .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
223       .Add("cornerRadius", Vector4(50.0f, 25.0f, 12.5f, 33.0f))
224       .Add("cornerRadiusPolicy", Visual::Transform::Policy::RELATIVE)
225       .Add("borderlineWidth", 20.0f)
226       .Add("borderlineColor", Vector4())
227       .Add("borderlineOffset", -1.0f));
228
229   Property::Map resultMap;
230   animatedImageVisual.CreatePropertyMap(resultMap);
231   // check the property values from the returned map from a visual
232   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
233   DALI_TEST_CHECK(value);
234   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
235
236   value = resultMap.Find(ImageVisual::Property::URL, "url");
237   DALI_TEST_CHECK(value);
238   Property::Array* resultUrls = value->GetArray();
239   DALI_TEST_CHECK(resultUrls);
240   DALI_TEST_EQUALS(resultUrls->Count(), urls.Count(), TEST_LOCATION);
241
242   value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
243   DALI_TEST_CHECK(value);
244   DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
245
246   value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
247   DALI_TEST_CHECK(value);
248   DALI_TEST_EQUALS(value->Get<int>(), 20, TEST_LOCATION);
249
250   value = resultMap.Find(Toolkit::DevelImageVisual::Property::LOOP_COUNT, "loopCount");
251   DALI_TEST_CHECK(value);
252   DALI_TEST_EQUALS(value->Get<int>(), 10, TEST_LOCATION);
253
254   value = resultMap.Find(ImageVisual::Property::FRAME_DELAY, "frameDelay");
255   DALI_TEST_CHECK(value);
256   DALI_TEST_EQUALS(value->Get<int>(), 200, TEST_LOCATION);
257
258   value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
259   DALI_TEST_CHECK(value);
260   DALI_TEST_EQUALS(value->Get<int>(), 11, TEST_LOCATION);
261
262   value = resultMap.Find(Toolkit::ImageVisual::Property::WRAP_MODE_U, "wrapModeU");
263   DALI_TEST_CHECK(value);
264   DALI_TEST_CHECK(value->Get<int>() == WrapMode::REPEAT);
265
266   value = resultMap.Find(Toolkit::ImageVisual::Property::WRAP_MODE_V, "wrapModeV");
267   DALI_TEST_CHECK(value);
268   DALI_TEST_CHECK(value->Get<int>() == WrapMode::DEFAULT);
269
270   value = resultMap.Find(Toolkit::ImageVisual::Property::FITTING_MODE, "fittingMode");
271   DALI_TEST_CHECK(value);
272   DALI_TEST_CHECK(value->Get<int>() == FittingMode::FIT_WIDTH);
273
274   value = resultMap.Find(Toolkit::ImageVisual::Property::SAMPLING_MODE, "samplingMode");
275   DALI_TEST_CHECK(value);
276   DALI_TEST_CHECK(value->Get<int>() == SamplingMode::NEAREST);
277
278   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_WIDTH, "desiredWidth");
279   DALI_TEST_CHECK(value);
280   DALI_TEST_CHECK(value->Get<int>() == 154);
281
282   value = resultMap.Find(Toolkit::ImageVisual::Property::DESIRED_HEIGHT, "desiredHeight");
283   DALI_TEST_CHECK(value);
284   DALI_TEST_CHECK(value->Get<int>() == 79);
285
286   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius");
287   DALI_TEST_CHECK(value);
288   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(50.0f, 25.0f, 12.5f, 33.0f), TEST_LOCATION);
289
290   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy");
291   DALI_TEST_CHECK(value);
292   DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::RELATIVE);
293
294   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
295   DALI_TEST_CHECK(value);
296   DALI_TEST_EQUALS(value->Get<float>(), 20.0f, TEST_LOCATION);
297
298   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
299   DALI_TEST_CHECK(value);
300   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
301
302   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
303   DALI_TEST_CHECK(value);
304   DALI_TEST_EQUALS(value->Get<float>(), -1.0f, TEST_LOCATION);
305
306   // Check mask properties
307   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
308   DALI_TEST_CHECK(value);
309   DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
310
311   value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, "maskContentScale");
312   DALI_TEST_CHECK(value);
313   DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
314
315   value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, "cropToMask");
316   DALI_TEST_CHECK(value);
317   DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
318
319   value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
320   DALI_TEST_CHECK(value);
321   DALI_TEST_CHECK(value->Get<int>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
322
323   END_TEST;
324 }
325
326 int UtcDaliAnimatedImageVisualGetPropertyMap03(void)
327 {
328   ToolkitTestApplication application;
329   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap for multi image rolling cache");
330
331   // request AnimatedImageVisual with a property map
332   VisualFactory   factory = VisualFactory::Get();
333   Property::Array urls;
334   CopyUrlsIntoArray(urls);
335
336   Visual::Base animatedImageVisual = factory.CreateVisual(
337     Property::Map()
338       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
339       .Add("url", urls)
340       .Add("batchSize", 4)
341       .Add("cacheSize", 8)
342       .Add("loopCount", 10)
343       .Add("frameDelay", 200)
344       .Add("pixelArea", Vector4())
345       .Add("wrapModeU", WrapMode::REPEAT)
346       .Add("wrapModeV", WrapMode::DEFAULT)
347       .Add("alphaMaskUrl", TEST_MASK_IMAGE_FILE_NAME)
348       .Add("maskContentScale", 1.6f)
349       .Add("cropToMask", true)
350       .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
351       .Add("cornerRadius", 50.5f));
352
353   Property::Map resultMap;
354   animatedImageVisual.CreatePropertyMap(resultMap);
355   // check the property values from the returned map from a visual
356   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
357   DALI_TEST_CHECK(value);
358   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
359
360   value = resultMap.Find(ImageVisual::Property::URL, "url");
361   DALI_TEST_CHECK(value);
362   Property::Array* resultUrls = value->GetArray();
363   DALI_TEST_CHECK(resultUrls);
364   DALI_TEST_EQUALS(resultUrls->Count(), urls.Count(), TEST_LOCATION);
365
366   value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
367   DALI_TEST_CHECK(value);
368   DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
369
370   value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
371   DALI_TEST_CHECK(value);
372   DALI_TEST_EQUALS(value->Get<int>(), 8, TEST_LOCATION);
373
374   value = resultMap.Find(Toolkit::DevelImageVisual::Property::LOOP_COUNT, "loopCount");
375   DALI_TEST_CHECK(value);
376   DALI_TEST_EQUALS(value->Get<int>(), 10, TEST_LOCATION);
377
378   value = resultMap.Find(ImageVisual::Property::FRAME_DELAY, "frameDelay");
379   DALI_TEST_CHECK(value);
380   DALI_TEST_EQUALS(value->Get<int>(), 200, TEST_LOCATION);
381
382   value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
383   DALI_TEST_CHECK(value);
384   DALI_TEST_EQUALS(value->Get<int>(), 11, TEST_LOCATION);
385
386   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius");
387   DALI_TEST_CHECK(value);
388   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(50.5f, 50.5f, 50.5f, 50.5f), TEST_LOCATION);
389
390   value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy");
391   DALI_TEST_CHECK(value);
392   DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::ABSOLUTE);
393
394   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
395   DALI_TEST_CHECK(value);
396   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
397
398   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
399   DALI_TEST_CHECK(value);
400   DALI_TEST_EQUALS(value->Get<Vector4>(), Color::BLACK, TEST_LOCATION);
401
402   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
403   DALI_TEST_CHECK(value);
404   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
405
406   // Check mask properties
407   value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
408   DALI_TEST_CHECK(value);
409   DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
410
411   value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, "maskContentScale");
412   DALI_TEST_CHECK(value);
413   DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
414
415   value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, "cropToMask");
416   DALI_TEST_CHECK(value);
417   DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
418
419   value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
420   DALI_TEST_CHECK(value);
421   DALI_TEST_CHECK(value->Get<bool>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
422
423   // Natural size getted as masked image size
424   Vector2 naturalSize;
425   animatedImageVisual.GetNaturalSize(naturalSize);
426   DALI_TEST_EQUALS(naturalSize, Vector2(100, 100), TEST_LOCATION);
427
428   END_TEST;
429 }
430
431 int UtcDaliAnimatedImageVisualGetPropertyMap04(void)
432 {
433   ToolkitTestApplication application;
434   tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap");
435
436   // request AnimatedImageVisual with a property map
437   VisualFactory factory             = VisualFactory::Get();
438   Visual::Base  animatedImageVisual = factory.CreateVisual(
439     Property::Map()
440       .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
441       .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
442       .Add(ImageVisual::Property::BATCH_SIZE, 1)
443       .Add(ImageVisual::Property::CACHE_SIZE, 1)
444       .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, true)
445       .Add(ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DETACHED)
446       .Add(ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED)
447       .Add(DevelVisual::Property::BORDERLINE_WIDTH, 0.4f));
448
449   Property::Map resultMap;
450   animatedImageVisual.CreatePropertyMap(resultMap);
451
452   // check the property values from the returned map from a visual
453   Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
454   DALI_TEST_CHECK(value);
455   DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
456
457   value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
458   DALI_TEST_CHECK(value);
459   DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
460
461   value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, Property::INTEGER);
462   DALI_TEST_CHECK(value);
463   DALI_TEST_CHECK(value->Get<int>() == 2);
464
465   value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, Property::INTEGER);
466   DALI_TEST_CHECK(value);
467   DALI_TEST_CHECK(value->Get<int>() == 2);
468
469   value = resultMap.Find(ImageVisual::Property::SYNCHRONOUS_LOADING, Property::BOOLEAN);
470   DALI_TEST_CHECK(value);
471   DALI_TEST_CHECK(value->Get<bool>() == true);
472
473   value = resultMap.Find(ImageVisual::Property::RELEASE_POLICY, Property::INTEGER);
474   DALI_TEST_CHECK(value);
475   DALI_TEST_CHECK(value->Get<int>() == ImageVisual::ReleasePolicy::DETACHED);
476
477   value = resultMap.Find(ImageVisual::Property::LOAD_POLICY, Property::INTEGER);
478   DALI_TEST_CHECK(value);
479   DALI_TEST_CHECK(value->Get<int>() == ImageVisual::LoadPolicy::ATTACHED);
480
481   value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
482   DALI_TEST_CHECK(value);
483   DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
484
485   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
486   DALI_TEST_CHECK(value);
487   DALI_TEST_EQUALS(value->Get<float>(), 0.4f, TEST_LOCATION);
488
489   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
490   DALI_TEST_CHECK(value);
491   DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(0.0f, 0.0f, 0.0f, 1.0f), TEST_LOCATION);
492
493   value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
494   DALI_TEST_CHECK(value);
495   DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
496
497   END_TEST;
498 }
499
500 int UtcDaliAnimatedImageVisualImageLoadingFail01(void)
501 {
502   ToolkitTestApplication application;
503   TestGlAbstraction&     gl = application.GetGlAbstraction();
504
505   {
506     Property::Map propertyMap;
507     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
508     propertyMap.Insert(ImageVisual::Property::URL, "dummy.gif");
509     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
510     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
511     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
512     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
513     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
514     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
515
516     VisualFactory factory = VisualFactory::Get();
517     Visual::Base  visual  = factory.CreateVisual(propertyMap);
518
519     DummyControl        dummyControl = DummyControl::New(true);
520     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
521     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
522
523     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
524     application.GetScene().Add(dummyControl);
525
526     TraceCallStack& textureTrace = gl.GetTextureTrace();
527     textureTrace.Enable(true);
528
529     application.SendNotification();
530     application.Render(20);
531
532     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 1, TEST_LOCATION);
533
534     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 6);
535
536     application.SendNotification();
537     application.Render(20);
538
539     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 1, TEST_LOCATION);
540
541     dummyControl.Unparent();
542   }
543
544   END_TEST;
545 }
546
547 int UtcDaliAnimatedImageVisualSynchronousLoading(void)
548 {
549   ToolkitTestApplication application;
550   TestGlAbstraction&     gl = application.GetGlAbstraction();
551
552   {
553     Property::Map propertyMap;
554     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
555     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
556     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
557     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
558     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
559     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
560     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
561     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
562
563     VisualFactory factory = VisualFactory::Get();
564     Visual::Base  visual  = factory.CreateVisual(propertyMap);
565
566     DummyControl        dummyControl = DummyControl::New(true);
567     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
568     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
569
570     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
571     application.GetScene().Add(dummyControl);
572
573     TraceCallStack& textureTrace = gl.GetTextureTrace();
574     textureTrace.Enable(true);
575
576     application.SendNotification();
577     application.Render(20);
578
579     // The first frame is loaded synchronously and load next batch.
580     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
581
582     application.SendNotification();
583     application.Render();
584
585     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
586     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
587
588     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 3);
589
590     application.SendNotification();
591     application.Render(20);
592
593     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
594
595     application.SendNotification();
596     application.Render();
597
598     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
599
600     dummyControl.Unparent();
601   }
602   tet_infoline("Test that removing the visual from stage deletes all textures");
603   application.SendNotification();
604   application.Render(16);
605   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
606
607   END_TEST;
608 }
609
610 int UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask01(void)
611 {
612   ToolkitTestApplication application;
613   tet_infoline("UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask01 for CPU Alpha Masking");
614   TestGlAbstraction& gl = application.GetGlAbstraction();
615
616   {
617     Property::Map propertyMap;
618     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
619     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
620     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
621     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
622     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
623     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
624     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
625     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
626     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
627
628     VisualFactory factory = VisualFactory::Get();
629     Visual::Base  visual  = factory.CreateVisual(propertyMap);
630
631     Property::Map testMap;
632     visual.CreatePropertyMap(testMap);
633     DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL), Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION);
634
635     DummyControl        dummyControl = DummyControl::New(true);
636     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
637     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
638
639     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
640     application.GetScene().Add(dummyControl);
641
642     TraceCallStack& textureTrace = gl.GetTextureTrace();
643     textureTrace.Enable(true);
644
645     application.SendNotification();
646     application.Render(20);
647
648     // The first frame is loaded synchronously and load next batch with masking
649     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
650
651     application.SendNotification();
652     application.Render();
653
654     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
655     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
656
657     dummyControl.Unparent();
658   }
659   tet_infoline("Test that removing the visual from stage deletes all textures");
660   application.SendNotification();
661   application.Render(16);
662   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
663
664   END_TEST;
665 }
666
667 int UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask02(void)
668 {
669   ToolkitTestApplication application;
670   tet_infoline("UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask02 for GPU Alpha Masking");
671   TestGlAbstraction& gl = application.GetGlAbstraction();
672
673   {
674     Property::Map propertyMap;
675     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
676     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
677     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
678     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
679     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
680     propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
681     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
682     propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
683     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
684     propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
685
686     VisualFactory factory = VisualFactory::Get();
687     Visual::Base  visual  = factory.CreateVisual(propertyMap);
688
689     Property::Map testMap;
690     visual.CreatePropertyMap(testMap);
691     DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL), Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION);
692
693     DummyControl        dummyControl = DummyControl::New(true);
694     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
695     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
696
697     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
698     application.GetScene().Add(dummyControl);
699
700     TraceCallStack& textureTrace = gl.GetTextureTrace();
701     textureTrace.Enable(true);
702
703     application.SendNotification();
704     application.Render(20);
705
706     // The first frame is loaded synchronously and load next batch with masking
707     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
708
709     application.SendNotification();
710     application.Render();
711
712     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
713     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
714
715     dummyControl.Unparent();
716   }
717   tet_infoline("Test that removing the visual from stage deletes all textures");
718   application.SendNotification();
719   application.Render(16);
720   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
721
722   END_TEST;
723 }
724
725 int UtcDaliAnimatedImageVisualJumpToAction(void)
726 {
727   ToolkitTestApplication application;
728   TestGlAbstraction&     gl = application.GetGlAbstraction();
729
730   Property::Array urls;
731   CopyUrlsIntoArray(urls);
732
733   {
734     Property::Map propertyMap;
735     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
736     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
737     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
738     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 12);
739     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
740
741     VisualFactory factory = VisualFactory::Get();
742     Visual::Base  visual  = factory.CreateVisual(propertyMap);
743
744     DummyControl        dummyControl = DummyControl::New(true);
745     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
746     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
747
748     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
749     application.GetScene().Add(dummyControl);
750     application.SendNotification();
751     application.Render(20);
752
753     tet_infoline("Ready the visual after the visual is on stage");
754     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
755
756     tet_infoline("Test that a timer has been started");
757     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
758
759     TraceCallStack& textureTrace = gl.GetTextureTrace();
760     textureTrace.Enable(true);
761
762     application.SendNotification();
763     application.Render(20);
764
765     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
766
767     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
768
769     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
770
771     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 20);
772
773     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
774
775     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 6);
776
777     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(6), true, TEST_LOCATION);
778     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
779
780     dummyControl.Unparent();
781   }
782   tet_infoline("Test that removing the visual from stage deletes all textures");
783   application.SendNotification();
784   application.Render(16);
785   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
786
787   END_TEST;
788 }
789
790 int UtcDaliAnimatedImageVisualStopBehavior(void)
791 {
792   ToolkitTestApplication application;
793   TestGlAbstraction&     gl = application.GetGlAbstraction();
794
795   Property::Array urls;
796   CopyUrlsIntoArray(urls);
797
798   {
799     Property::Map propertyMap;
800     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
801     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
802     propertyMap.Insert(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME);
803     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
804     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 8);
805     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
806
807     VisualFactory factory = VisualFactory::Get();
808     Visual::Base  visual  = factory.CreateVisual(propertyMap);
809
810     // Expect that a batch of 4 textures has been requested. These will be serially loaded
811     // below.
812
813     DummyControl        dummyControl = DummyControl::New(true);
814     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
815     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
816
817     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
818     application.GetScene().Add(dummyControl);
819     application.SendNotification();
820     application.Render(20);
821
822     tet_infoline("Ready the visual after the visual is on stage");
823     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
824
825     tet_infoline("Test that a timer has been started");
826     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
827
828     TraceCallStack& textureTrace = gl.GetTextureTrace();
829     textureTrace.Enable(true);
830
831     application.SendNotification();
832     application.Render(20);
833
834     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
835
836     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
837
838     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
839
840     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 1);
841
842     // Expect the second batch has been requested
843     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
844
845     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
846
847     dummyControl.Unparent();
848   }
849   tet_infoline("Test that removing the visual from stage deletes all textures");
850   application.SendNotification();
851   application.Render(16);
852   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
853
854   END_TEST;
855 }
856
857 int UtcDaliAnimatedImageVisualStopBehavior02(void)
858 {
859   ToolkitTestApplication application;
860   TestGlAbstraction&     gl = application.GetGlAbstraction();
861
862   Property::Array urls;
863   CopyUrlsIntoArray(urls);
864
865   {
866     Property::Map propertyMap;
867     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
868     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
869     propertyMap.Insert(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::LAST_FRAME);
870     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
871     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
872     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
873
874     VisualFactory factory = VisualFactory::Get();
875     Visual::Base  visual  = factory.CreateVisual(propertyMap);
876
877     // Expect that a batch of 4 textures has been requested. These will be serially loaded
878     // below.
879
880     DummyControl        dummyControl = DummyControl::New(true);
881     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
882     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
883
884     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
885     application.GetScene().Add(dummyControl);
886
887     tet_infoline("Ready the visual after the visual is on stage");
888     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
889
890     TraceCallStack& textureTrace = gl.GetTextureTrace();
891     textureTrace.Enable(true);
892
893     application.SendNotification();
894     application.Render(20);
895
896     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
897
898     Test::EmitGlobalTimerSignal();
899
900     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
901
902     application.SendNotification();
903     application.Render(20);
904
905     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
906
907     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
908
909     tet_infoline("Ready the visual after the visual is on stage");
910     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
911
912     application.SendNotification();
913     application.Render(20);
914
915     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
916
917     dummyControl.Unparent();
918   }
919   tet_infoline("Test that removing the visual from stage deletes all textures");
920   application.SendNotification();
921   application.Render(16);
922   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
923
924   END_TEST;
925 }
926
927 int UtcDaliAnimatedImageVisualAnimatedImage01(void)
928 {
929   ToolkitTestApplication application;
930   TestGlAbstraction&     gl = application.GetGlAbstraction();
931
932   tet_infoline("Set cache size same as GIF frame, and try to load same image at another ImageView");
933   {
934     Property::Map propertyMap;
935     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
936     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
937     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
938     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
939     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
940
941     VisualFactory factory = VisualFactory::Get();
942     Visual::Base  visual  = factory.CreateVisual(propertyMap);
943
944     // Expect that a batch of 4 textures has been requested. These will be serially loaded
945     // below.
946
947     DummyControl        dummyControl = DummyControl::New(true);
948     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
949     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
950
951     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
952     application.GetScene().Add(dummyControl);
953
954     application.SendNotification();
955     application.Render();
956
957     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
958
959     // Batch 2 frames. Now frame 0, 1 cached.
960     application.SendNotification();
961     application.Render(20);
962
963     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
964
965     tet_infoline("Test that a timer has been started");
966
967     TraceCallStack& textureTrace = gl.GetTextureTrace();
968     textureTrace.Enable(true);
969
970     Test::EmitGlobalTimerSignal();
971
972     application.SendNotification();
973     application.Render();
974
975     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
976
977     // 0 frame removed. and after, batch 2 frames. Now frame 1, 2, 3 cached.
978     application.SendNotification();
979     application.Render(20);
980
981     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
982
983     Visual::Base        visual2       = factory.CreateVisual(propertyMap);
984     DummyControl        dummyControl2 = DummyControl::New(true);
985     Impl::DummyControl& dummyImpl2    = static_cast<Impl::DummyControl&>(dummyControl2.GetImplementation());
986     dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual2);
987     application.GetScene().Add(dummyControl2);
988
989     tet_infoline("Add new view with same url");
990
991     application.SendNotification();
992     application.Render();
993
994     // Note that we only re-load 0 frame.
995     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
996
997     tet_infoline("Test that we don't try to re-load new image cause it cached");
998     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 1), false, TEST_LOCATION);
999
1000     // Batch 2 frames. Now visual frame 1, 2, 3 cached and visual2 frame 0, 1 cached.
1001     application.SendNotification();
1002     application.Render(20);
1003
1004     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 5, TEST_LOCATION);
1005
1006     textureTrace.Reset();
1007
1008     tet_infoline("Load some many frames");
1009
1010     const int repeatCount = 10;
1011     for(int repeat = 0; repeat < repeatCount; ++repeat)
1012     {
1013       Test::EmitGlobalTimerSignal();
1014       application.SendNotification();
1015       application.Render(2000);
1016     }
1017
1018     DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION); // A new texture should NOT be generated.
1019     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 5, TEST_LOCATION);
1020
1021     textureTrace.Reset();
1022
1023     dummyControl.Unparent();
1024     dummyControl2.Unparent();
1025   }
1026   tet_infoline("Test that removing the visual from stage deletes all textures");
1027   application.SendNotification();
1028   application.Render(20);
1029   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1030
1031   END_TEST;
1032 }
1033
1034 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask01(void)
1035 {
1036   ToolkitTestApplication application;
1037   tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask01 for CPU Alpha Masking");
1038   TestGlAbstraction& gl = application.GetGlAbstraction();
1039
1040   {
1041     Property::Map propertyMap;
1042     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
1043     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
1044     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1045     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
1046     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
1047     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
1048
1049     VisualFactory factory = VisualFactory::Get();
1050     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1051
1052     DummyControl        dummyControl = DummyControl::New(true);
1053     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1054     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1055
1056     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1057     application.GetScene().Add(dummyControl);
1058
1059     application.SendNotification();
1060     application.Render();
1061
1062     // load two frame(batch size), load mask image, and request two masking
1063     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(5), true, TEST_LOCATION);
1064
1065     application.SendNotification();
1066     application.Render(20);
1067
1068     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
1069
1070     dummyControl.Unparent();
1071   }
1072   tet_infoline("Test that removing the visual from stage deletes all textures");
1073   application.SendNotification();
1074   application.Render(20);
1075   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1076
1077   END_TEST;
1078 }
1079
1080 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask02(void)
1081 {
1082   ToolkitTestApplication application;
1083   tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask02 for GPU Alpha Masking");
1084   TestGlAbstraction& gl = application.GetGlAbstraction();
1085
1086   {
1087     Property::Map propertyMap;
1088     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
1089     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
1090     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1091     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
1092     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
1093     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
1094     propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
1095
1096     VisualFactory factory = VisualFactory::Get();
1097     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1098
1099     DummyControl        dummyControl = DummyControl::New(true);
1100     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1101     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1102
1103     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1104     application.GetScene().Add(dummyControl);
1105
1106     Property::Map attributes;
1107     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, attributes);
1108
1109     application.SendNotification();
1110     application.Render();
1111
1112     // load two frame(batch size), load mask image, and request two masking
1113     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1114
1115     application.SendNotification();
1116     application.Render(20);
1117
1118     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1119
1120     dummyControl.Unparent();
1121   }
1122   tet_infoline("Test that removing the visual from stage deletes all textures");
1123   application.SendNotification();
1124   application.Render(20);
1125   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1126
1127   END_TEST;
1128 }
1129
1130 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask03(void)
1131 {
1132   ToolkitTestApplication application;
1133   tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask03 for GPU Alpha Masking with broken mask texture");
1134   TestGlAbstraction& gl = application.GetGlAbstraction();
1135
1136   {
1137     Property::Map propertyMap;
1138     propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
1139     propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
1140     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1141     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
1142     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
1143     propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, "");
1144     propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
1145
1146     VisualFactory factory = VisualFactory::Get();
1147     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1148
1149     DummyControl        dummyControl = DummyControl::New(true);
1150     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1151     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1152
1153     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1154     application.GetScene().Add(dummyControl);
1155
1156     application.SendNotification();
1157     application.Render();
1158
1159     // load two frame(batch size), load mask image, and request two masking
1160     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1161
1162     application.SendNotification();
1163     application.Render(20);
1164
1165     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 3, TEST_LOCATION);
1166
1167     dummyControl.Unparent();
1168   }
1169   tet_infoline("Test that removing the visual from stage deletes all textures");
1170   application.SendNotification();
1171   application.Render(20);
1172   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1173
1174   END_TEST;
1175 }
1176
1177 int UtcDaliAnimatedImageVisualMultiImage01(void)
1178 {
1179   ToolkitTestApplication application;
1180   TestGlAbstraction&     gl = application.GetGlAbstraction();
1181
1182   Property::Array urls;
1183   CopyUrlsIntoArray(urls);
1184
1185   {
1186     Property::Map propertyMap;
1187     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1188     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1189     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
1190     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 8);
1191     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1192
1193     VisualFactory factory = VisualFactory::Get();
1194     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1195
1196     // Expect that a batch of 4 textures has been requested. These will be serially loaded
1197     // below.
1198
1199     DummyControl        dummyControl = DummyControl::New(true);
1200     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1201     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1202
1203     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1204     application.GetScene().Add(dummyControl);
1205     application.SendNotification();
1206     application.Render(16);
1207
1208     tet_infoline("Ready the visual after the visual is on stage");
1209     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1210
1211     tet_infoline("Test that a timer has been started");
1212     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1213
1214     TraceCallStack& textureTrace = gl.GetTextureTrace();
1215     textureTrace.Enable(true);
1216
1217     application.SendNotification();
1218     application.Render(16);
1219
1220     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
1221     DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
1222
1223     tet_infoline("Test that after 1 tick, and file loads completed, that we have 7 textures");
1224     Test::EmitGlobalTimerSignal();
1225
1226     // Expect the second batch has been requested
1227     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1228
1229     application.SendNotification();
1230     application.Render(16);
1231     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1232
1233     tet_infoline("Test that after 2 ticks that we have 6 textures");
1234
1235     Test::EmitGlobalTimerSignal();
1236     application.SendNotification();
1237     application.Render(16);
1238     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 6, TEST_LOCATION);
1239
1240     tet_infoline("And that at least 2 textures were requested");
1241     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1242     application.SendNotification();
1243     application.Render(16);
1244     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 8, TEST_LOCATION);
1245
1246     tet_infoline("Test that after 3rd tick that we have 7 textures and 1 request");
1247     Test::EmitGlobalTimerSignal();
1248     application.SendNotification();
1249     application.Render(16);
1250     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1251
1252     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1253     application.SendNotification();
1254     application.Render(16);
1255     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 8, TEST_LOCATION);
1256
1257     dummyControl.Unparent();
1258   }
1259   tet_infoline("Test that removing the visual from stage deletes all textures");
1260   application.SendNotification();
1261   application.Render(16);
1262   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1263
1264   END_TEST;
1265 }
1266
1267 int UtcDaliAnimatedImageVisualMultiImage02(void)
1268 {
1269   ToolkitTestApplication application;
1270   TestGlAbstraction&     gl = application.GetGlAbstraction();
1271
1272   tet_infoline("Test that the animated visual has different batch and cache size.");
1273
1274   {
1275     Property::Array urls;
1276     CopyUrlsIntoArray(urls);
1277
1278     Property::Map propertyMap;
1279     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1280     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1281     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 0);
1282     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 0);
1283     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1284
1285     VisualFactory factory = VisualFactory::Get();
1286     Visual::Base  visual  = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1287
1288     // Check the batch size and cache size need to have minimum 2.
1289     Property::Map resultMap;
1290     visual.CreatePropertyMap(resultMap);
1291     Property::Value* value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
1292     DALI_TEST_CHECK(value);
1293     DALI_TEST_EQUALS(value->Get<int>(), 2, TEST_LOCATION);
1294     value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
1295     DALI_TEST_CHECK(value);
1296     DALI_TEST_EQUALS(value->Get<int>(), 2, TEST_LOCATION);
1297     visual.Reset();
1298
1299     // Batch size is 2 and cache size is 3
1300     propertyMap.Clear();
1301     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1302     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1303     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1304     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 3);
1305     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1306
1307     visual = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1308
1309     // Expect that each image is loaded each tick
1310     DummyControl        dummyControl = DummyControl::New(true);
1311     Impl::DummyControl& dummyImpl1   = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1312     dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1313     visual.Reset();
1314
1315     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1316     application.GetScene().Add(dummyControl);
1317     application.SendNotification();
1318     application.Render(16);
1319
1320     tet_infoline("Ready the visual after the visual is on window");
1321     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1322     application.SendNotification();
1323     application.Render(16); //glGenTextures 1 and 2
1324     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
1325
1326     tet_infoline("Test that each tick, a new image is requested");
1327     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:0
1328     application.SendNotification();
1329     application.Render(16);
1330     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1331     application.SendNotification();
1332     application.Render(16); //glGenTextures 3
1333     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1334
1335     tet_infoline("Test that each tick, a new image is requested");
1336     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:1
1337     application.SendNotification();
1338     application.Render(16);
1339     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1340     application.SendNotification();
1341     application.Render(16); //glGenTextures 4
1342     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1343
1344     dummyImpl1.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1345     dummyControl.Unparent();
1346
1347     // Batch size is 9 and cache size is 4
1348     propertyMap.Clear();
1349     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1350     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1351     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 3);
1352     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 7);
1353     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1354
1355     visual = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1356
1357     // Expect that each image is loaded each tick
1358     dummyControl                   = DummyControl::New(true);
1359     Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1360     dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1361     visual.Reset();
1362
1363     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1364     application.GetScene().Add(dummyControl);
1365     application.SendNotification();
1366     application.Render(16);
1367
1368     tet_infoline("Ready the visual after the visual is on window");
1369     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1370     application.SendNotification();
1371     application.Render(16); //glGenTextures 1, 2, and 3
1372     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1373
1374     tet_infoline("Test that each tick, a new image is requested");
1375     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:0
1376     application.SendNotification();
1377     application.Render(16);
1378     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1379     application.SendNotification();
1380     application.Render(16); //glGenTextures 4, 5, and 6
1381     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 5, TEST_LOCATION);
1382
1383     tet_infoline("Test that each tick, a new image is requested");
1384     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:1
1385     application.SendNotification();
1386     application.Render(16);
1387     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1388     application.SendNotification();
1389     application.Render(16); //glGenTextures 7, 1, and 2
1390     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1391
1392     tet_infoline("Test that each tick, a new image is requested");
1393     Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:2
1394     application.SendNotification();
1395     application.Render(16);
1396     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1397     application.SendNotification();
1398     application.Render(16); //glGenTextures 3
1399     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1400
1401     dummyControl.Unparent();
1402   }
1403   tet_infoline("Test that removing the visual from window deletes all textures");
1404   application.SendNotification();
1405   application.Render(16);
1406   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1407
1408   END_TEST;
1409 }
1410
1411 int UtcDaliAnimatedImageVisualMultiImage03(void)
1412 {
1413   ToolkitTestApplication application;
1414   TestGlAbstraction&     gl = application.GetGlAbstraction();
1415
1416   {
1417     Property::Array urls1, urls2;
1418     CopyUrlsIntoArray(urls1);
1419     CopyUrlsIntoArray(urls2);
1420
1421     Property::Map animatedImageMap1;
1422     animatedImageMap1.Insert(Visual::Property::TYPE, Visual::IMAGE);
1423     animatedImageMap1.Insert(ImageVisual::Property::URL, Property::Value(urls1));
1424     animatedImageMap1.Insert(ImageVisual::Property::BATCH_SIZE, 3);
1425     animatedImageMap1.Insert(ImageVisual::Property::CACHE_SIZE, 3);
1426     animatedImageMap1.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1427
1428     Property::Map animatedImageMap2;
1429     animatedImageMap2.Insert(Visual::Property::TYPE, Visual::IMAGE);
1430     animatedImageMap2.Insert(ImageVisual::Property::URL, Property::Value(urls2));
1431     animatedImageMap2.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1432     animatedImageMap2.Insert(ImageVisual::Property::CACHE_SIZE, 2);
1433     animatedImageMap2.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1434
1435     VisualFactory factory              = VisualFactory::Get();
1436     Visual::Base  animatedImageVisual1 = factory.CreateVisual(animatedImageMap1);
1437
1438     tet_infoline("Create two image views with the same URLs, offset by 1 frame.");
1439
1440     DummyControl        dummyControl1 = DummyControl::New(true);
1441     Impl::DummyControl& dummyImpl1    = static_cast<Impl::DummyControl&>(dummyControl1.GetImplementation());
1442     dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual1);
1443     dummyControl1.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1444     application.GetScene().Add(dummyControl1);
1445
1446     application.SendNotification();
1447     application.Render(16);
1448
1449     tet_infoline("Ready the requested image after the first visual is on stage");
1450     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1451     application.SendNotification();
1452     application.Render(16);
1453     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1454
1455     Visual::Base        animatedImageVisual2 = factory.CreateVisual(animatedImageMap2);
1456     DummyControl        dummyControl2        = DummyControl::New(true);
1457     Impl::DummyControl& dummyImpl2           = static_cast<Impl::DummyControl&>(dummyControl2.GetImplementation());
1458     dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual2);
1459     dummyControl2.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1460     application.GetScene().Add(dummyControl2);
1461     application.SendNotification();
1462     application.Render(16);
1463
1464     tet_infoline("The texture cache should be holding the requested images; check that the renderer has a texture");
1465     TextureSet ts = dummyControl2.GetRendererAt(0).GetTextures();
1466     Texture    t1 = ts.GetTexture(0);
1467     DALI_TEST_EQUALS(ts.GetTextureCount(), 1, TEST_LOCATION);
1468
1469     tet_infoline("Test that on the first tick, 1 new image is requested");
1470     Test::EmitGlobalTimerSignal(); // Both visuals should tick
1471
1472     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1473     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1474
1475     ts         = dummyControl2.GetRendererAt(0).GetTextures();
1476     Texture t2 = ts.GetTexture(0);
1477     DALI_TEST_CHECK(t1 != t2);
1478
1479     dummyControl1.Unparent();
1480     dummyControl2.Unparent();
1481   }
1482   tet_infoline("Test that removing the visual from stage deletes all textures");
1483   application.SendNotification();
1484   application.Render(16);
1485   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1486
1487   END_TEST;
1488 }
1489
1490 int UtcDaliAnimatedImageVisualMultiImage04(void)
1491 {
1492   ToolkitTestApplication application;
1493   TestGlAbstraction&     gl           = application.GetGlAbstraction();
1494   TraceCallStack&        textureTrace = gl.GetTextureTrace();
1495   textureTrace.Enable(true);
1496
1497   tet_infoline("Test that if the cache size is the same as the number of urls, that once the cache is full, no new images are loaded");
1498
1499   Property::Array urls;
1500   CopyUrlsIntoArray(urls);
1501
1502   {
1503     Property::Map propertyMap;
1504     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1505     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1506     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 6);
1507     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 11);
1508     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1509
1510     VisualFactory factory = VisualFactory::Get();
1511     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1512
1513     tet_infoline("Expect that a batch of 7 textures has been requested.");
1514
1515     DummyControl        dummyControl = DummyControl::New(true);
1516     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1517     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1518
1519     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1520     application.GetScene().Add(dummyControl);
1521     application.SendNotification();
1522     application.Render(16);
1523
1524     tet_infoline("Wait for the first batch to complete");
1525     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(6), true, TEST_LOCATION);
1526
1527     tet_infoline("Test that a timer has been started");
1528     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1529
1530     application.SendNotification();
1531     application.Render(16);
1532
1533     DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 6, TEST_LOCATION);
1534     tet_infoline("Test that after 1 tick, and 5 file loads completed, that we have 11 textures");
1535     Test::EmitGlobalTimerSignal();
1536     application.SendNotification();
1537     application.Render(16);
1538
1539     // Expect the second batch has been requested
1540     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(5), true, TEST_LOCATION);
1541
1542     application.SendNotification();
1543     application.Render(16);
1544     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1545
1546     tet_infoline("Test that after 2 ticks that we have 11 textures and no requests");
1547
1548     Test::EmitGlobalTimerSignal();
1549     application.SendNotification();
1550     application.Render(16);
1551     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 5), false, TEST_LOCATION);
1552     application.SendNotification();
1553     application.Render(16);
1554     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1555
1556     tet_infoline("Test that after 3rd tick that we have 11 textures and no requests");
1557     Test::EmitGlobalTimerSignal();
1558     application.SendNotification();
1559     application.Render(16);
1560
1561     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 5), false, TEST_LOCATION);
1562     application.SendNotification();
1563     application.Render(16);
1564     DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1565
1566     dummyControl.Unparent();
1567   }
1568
1569   tet_infoline("Test that removing the visual from stage deletes all textures");
1570   application.SendNotification();
1571   application.Render(16);
1572   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1573
1574   END_TEST;
1575 }
1576
1577 int UtcDaliAnimatedImageVisualMultiImage05(void)
1578 {
1579   ToolkitTestApplication application;
1580   TestGlAbstraction&     gl = application.GetGlAbstraction();
1581
1582   tet_infoline("Test that if the cache size is the same as the number of urls, that removing a partially loaded visual removes all textures");
1583
1584   Property::Array urls;
1585   CopyUrlsIntoArray(urls);
1586
1587   {
1588     Property::Map propertyMap;
1589     propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1590     propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1591     propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
1592     propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 11);
1593     propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1594
1595     VisualFactory factory = VisualFactory::Get();
1596     Visual::Base  visual  = factory.CreateVisual(propertyMap);
1597
1598     tet_infoline("Expect that a batch of 4 textures has been requested.");
1599
1600     DummyControl        dummyControl = DummyControl::New(true);
1601     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1602     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1603
1604     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1605     application.GetScene().Add(dummyControl);
1606     application.SendNotification();
1607     application.Render(16);
1608
1609     tet_infoline("Wait for the first batch to complete");
1610     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1611
1612     tet_infoline("Test that a timer has been started");
1613     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1614
1615     application.SendNotification();
1616     application.Render(16);
1617
1618     tet_infoline("Test that a timer has been started");
1619     Test::EmitGlobalTimerSignal();
1620     application.SendNotification();
1621     application.Render(16);
1622
1623     dummyControl.Unparent();
1624   }
1625
1626   application.SendNotification();
1627   application.Render(16);
1628   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1629
1630   tet_infoline("Test that pending batch of image loads are cancelled instead of uploaded");
1631   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1632   application.SendNotification();
1633   application.Render(16);
1634   DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1635
1636   END_TEST;
1637 }
1638
1639 void TestLoopCount(ToolkitTestApplication& application, DummyControl& dummyControl, uint16_t frameCount, uint16_t loopCount, const char* location)
1640 {
1641   TestGlAbstraction& gl           = application.GetGlAbstraction();
1642   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1643
1644   textureTrace.Enable(true);
1645   application.GetScene().Add(dummyControl);
1646
1647   application.SendNotification();
1648   application.Render(16);
1649
1650   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_INNER_LOCATION(location));
1651
1652   application.SendNotification();
1653   application.Render();
1654
1655   tet_infoline("Test that a timer has been created");
1656   DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_INNER_LOCATION(location));
1657
1658   for(uint16_t i = 0; i < loopCount; i++)
1659   {
1660     for(uint16_t j = 0; j < frameCount; j++)
1661     {
1662       if(i == 0 && j == 0)
1663       {
1664         continue; // Because first frame is already showed and we call 2nd frame at the first time of timer animation.
1665       }
1666       tet_printf("Test that after %u ticks, and we have %u frame \n", j + 1u, j + 1u);
1667       Test::EmitGlobalTimerSignal();
1668       application.SendNotification();
1669       application.Render(16);
1670
1671       DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_INNER_LOCATION(location));
1672
1673       application.SendNotification();
1674       application.Render();
1675       DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_INNER_LOCATION(location));
1676       DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_INNER_LOCATION(location));
1677     }
1678     tet_printf("Test Loop %u \n\n", i + 1u);
1679   }
1680
1681   tet_printf("Test that after %u loops, and we have no frame. Timer should stop \n", loopCount);
1682   Test::EmitGlobalTimerSignal();
1683   application.SendNotification();
1684   application.Render(16);
1685   DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_INNER_LOCATION(location));
1686
1687   dummyControl.Unparent();
1688 }
1689
1690 int UtcDaliAnimatedImageVisualLoopCount(void)
1691 {
1692   ToolkitTestApplication application;
1693
1694   tet_infoline("UtcDaliAnimatedImageVisualLoopCount");
1695
1696   {
1697     // request AnimatedImageVisual with a property map
1698     // Test with no (0) loop count
1699     VisualFactory factory             = VisualFactory::Get();
1700     Visual::Base  animatedImageVisual = factory.CreateVisual(
1701       Property::Map()
1702         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1703         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1704         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1705         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1706         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1707         .Add(DevelImageVisual::Property::LOOP_COUNT, 0));
1708
1709     DummyControl        dummyControl = DummyControl::New(true);
1710     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1711     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1712     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1713
1714     TestLoopCount(application, dummyControl, 4, 0, TEST_LOCATION);
1715
1716     dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1717     animatedImageVisual.Reset();
1718
1719     application.SendNotification();
1720     application.Render(16);
1721
1722     // Test with no (1) loop count. Request AnimatedImageVisual with a property map
1723     animatedImageVisual = factory.CreateVisual(
1724       Property::Map()
1725         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1726         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1727         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1728         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1729         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1730         .Add(DevelImageVisual::Property::LOOP_COUNT, 1));
1731
1732     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1733
1734     TestLoopCount(application, dummyControl, 4, 1, TEST_LOCATION);
1735
1736     dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1737     animatedImageVisual.Reset();
1738
1739     application.SendNotification();
1740     application.Render(16);
1741
1742     // Test with no (100) loop count. Request AnimatedImageVisual with a property map
1743     animatedImageVisual = factory.CreateVisual(
1744       Property::Map()
1745         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1746         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1747         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1748         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1749         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1750         .Add(DevelImageVisual::Property::LOOP_COUNT, 100));
1751
1752     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1753
1754     TestLoopCount(application, dummyControl, 4, 100, TEST_LOCATION);
1755   }
1756   END_TEST;
1757 }
1758
1759 int UtcDaliAnimatedImageVisualPlayback(void)
1760 {
1761   ToolkitTestApplication application;
1762   TestGlAbstraction&     gl           = application.GetGlAbstraction();
1763   TraceCallStack&        textureTrace = gl.GetTextureTrace();
1764
1765   tet_infoline("UtcDaliAnimatedImageVisualPlayback");
1766
1767   {
1768     // request AnimatedImageVisual with a property map
1769     // Test with forever (-1) loop count
1770     VisualFactory factory             = VisualFactory::Get();
1771     Visual::Base  animatedImageVisual = factory.CreateVisual(
1772       Property::Map()
1773         .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1774         .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1775         .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1776         .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1777         .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1778         .Add(DevelImageVisual::Property::LOOP_COUNT, -1));
1779
1780     DummyControl        dummyControl = DummyControl::New(true);
1781     Impl::DummyControl& dummyImpl    = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1782     dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1783     dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1784
1785     textureTrace.Enable(true);
1786     application.GetScene().Add(dummyControl);
1787     application.SendNotification();
1788     application.Render(16);
1789
1790     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1791
1792     application.SendNotification();
1793     application.Render();
1794
1795     tet_infoline("Test that a timer has been created");
1796     DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1797
1798     Test::EmitGlobalTimerSignal();
1799     application.SendNotification();
1800     application.Render(16);
1801
1802     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1803
1804     application.SendNotification();
1805     application.Render();
1806     DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1807
1808     Property::Map attributes;
1809     tet_infoline("Test Pause action. Timer should stop after Pause action");
1810     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PAUSE, attributes);
1811     Test::EmitGlobalTimerSignal();
1812     application.SendNotification();
1813     application.Render(16);
1814     DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_LOCATION);
1815
1816     tet_infoline("Test Play action. Timer should Restart after Play action");
1817     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes);
1818     Test::EmitGlobalTimerSignal();
1819     application.SendNotification();
1820     application.Render(16);
1821
1822     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1823
1824     application.SendNotification();
1825     application.Render();
1826     DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1827
1828     tet_infoline("Test Stop action. Timer should stop after Stop action");
1829     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, attributes);
1830     Test::EmitGlobalTimerSignal();
1831     application.SendNotification();
1832     application.Render(16);
1833     DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_LOCATION);
1834
1835     tet_infoline("Test Play action. Timer should Restart after Play action");
1836     DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes);
1837     Test::EmitGlobalTimerSignal();
1838     application.SendNotification();
1839     application.Render(16);
1840
1841     DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1842
1843     application.SendNotification();
1844     application.Render();
1845     DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1846
1847     dummyControl.Unparent();
1848   }
1849
1850   END_TEST;
1851 }
1852
1853 int UtcDaliAnimatedImageVisualWrapMode(void)
1854 {
1855   ToolkitTestApplication application;
1856   tet_infoline("UtcDaliAnimatedImageVisualWrapMode");
1857
1858   VisualFactory factory = VisualFactory::Get();
1859   DALI_TEST_CHECK(factory);
1860
1861   // Test wrap mode in animated image visual.
1862   const int     width  = 950;
1863   const int     height = 1080;
1864   const Vector4 pixelArea(0.0f, 0.0f, 950 / 40, 1.0f);
1865
1866   Property::Map propertyMap;
1867   propertyMap.Insert(Toolkit::Visual::Property::TYPE, Visual::IMAGE);
1868   propertyMap.Insert(ImageVisual::Property::URL, TEST_WEBP_FILE_NAME);
1869   propertyMap.Insert(ImageVisual::Property::PIXEL_AREA, pixelArea);
1870   propertyMap.Insert(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT);
1871
1872   Visual::Base visual = factory.CreateVisual(propertyMap);
1873   DALI_TEST_CHECK(visual);
1874
1875   TestGlAbstraction& gl           = application.GetGlAbstraction();
1876   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1877   textureTrace.Enable(true);
1878   textureTrace.EnableLogging(true);
1879   TraceCallStack& texParameterTrace = gl.GetTexParameterTrace();
1880   texParameterTrace.Enable(true);
1881   texParameterTrace.EnableLogging(true);
1882
1883   DummyControl      actor     = DummyControl::New();
1884   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1885   dummyImpl.RegisterVisual(Control::CONTROL_PROPERTY_END_INDEX + 1, visual);
1886   actor.SetProperty(Actor::Property::SIZE, Vector2(width, height));
1887   actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER);
1888
1889   DALI_TEST_EQUALS(actor.GetRendererCount(), 0u, TEST_LOCATION);
1890   application.GetScene().Add(actor);
1891   application.SendNotification();
1892   application.Render();
1893
1894   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1895
1896   application.SendNotification();
1897   application.Render();
1898
1899   DALI_TEST_CHECK(actor.GetRendererCount() == 1u);
1900
1901   DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
1902
1903   // WITHOUT atlasing, the wrapping is handled by setting gl texture parameters
1904   std::stringstream out;
1905   out << std::hex << GL_TEXTURE_2D << ", " << GL_TEXTURE_WRAP_S << ", " << GL_REPEAT;
1906   DALI_TEST_CHECK(texParameterTrace.FindMethodAndParams("TexParameteri", out.str()));
1907
1908   // test the uniforms which used to handle the wrap mode
1909   Renderer renderer = actor.GetRendererAt(0u);
1910   DALI_TEST_CHECK(renderer);
1911
1912   Property::Value pixelAreaValue = renderer.GetProperty(renderer.GetPropertyIndex("pixelArea"));
1913   DALI_TEST_EQUALS(pixelAreaValue.Get<Vector4>(), pixelArea, TEST_LOCATION);
1914
1915   actor.Unparent();
1916   DALI_TEST_CHECK(actor.GetRendererCount() == 0u);
1917
1918   END_TEST;
1919 }
1920
1921 int UtcDaliAnimatedImageVisualDesiredSize(void)
1922 {
1923   ToolkitTestApplication application;
1924   tet_infoline("UtcDaliAnimatedImageVisualDesiredSize");
1925
1926   TestGlAbstraction& gl           = application.GetGlAbstraction();
1927   TraceCallStack&    textureTrace = gl.GetTextureTrace();
1928
1929   // Set desiredWidth < 37 and desiredHeight < 50, which is smaller than original image's size.
1930   int desiredWidth  = 15;
1931   int desiredHeight = 20;
1932
1933   Visual::Base visual = VisualFactory::Get().CreateVisual(TEST_GIF_FILE_NAME, ImageDimensions(desiredWidth, desiredHeight));
1934   DALI_TEST_CHECK(visual);
1935
1936   DummyControl      actor     = DummyControl::New(true);
1937   DummyControlImpl& dummyImpl = static_cast<DummyControlImpl&>(actor.GetImplementation());
1938   dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1939
1940   application.GetScene().Add(actor);
1941
1942   application.SendNotification();
1943   application.Render();
1944
1945   // Trigger count is 2 - first frame and second frame.
1946   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1947
1948   textureTrace.Enable(true);
1949   textureTrace.EnableLogging(true);
1950
1951   application.SendNotification();
1952   application.Render();
1953
1954   {
1955     std::stringstream out;
1956     out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight;
1957     DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str()));
1958   }
1959
1960   // Unparent to make next trigger
1961   actor.Unparent();
1962
1963   application.SendNotification();
1964   application.Render();
1965
1966   // Set visual size
1967   actor.SetProperty(Actor::Property::SIZE, Vector2(300.0f, 300.0f));
1968   application.GetScene().Add(actor);
1969
1970   application.SendNotification();
1971   application.Render();
1972
1973   // Trigger count is 2 - first frame and second frame.
1974   DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1975
1976   textureTrace.Reset();
1977
1978   application.SendNotification();
1979   application.Render();
1980
1981   {
1982     std::stringstream out;
1983     out << GL_TEXTURE_2D << ", " << 0u << ", " << desiredWidth << ", " << desiredHeight;
1984     DALI_TEST_CHECK(textureTrace.FindMethodAndParams("TexImage2D", out.str().c_str())); // The size should not be changed
1985   }
1986
1987   END_TEST;
1988 }