2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
20 #include <dali-toolkit-test-suite-utils.h>
22 #include <toolkit-event-thread-callback.h>
23 #include <toolkit-timer.h>
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>
32 #include "dummy-control.h"
35 using namespace Dali::Toolkit;
37 void dali_animated_image_visual_startup(void)
39 test_return_value = TET_UNDEF;
42 void dali_animated_image_visual_cleanup(void)
44 test_return_value = TET_PASS;
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";
54 void CopyUrlsIntoArray(Property::Array& urls, int startIndex = 0)
56 for(int i = 20 + startIndex; i <= 30; ++i)
59 if(asprintf(&url, TEST_IMAGE_FILE_NAME, i) > 0)
61 Property::Value value(url);
68 int UtcDaliAnimatedImageVisualGetPropertyMap01(void)
70 ToolkitTestApplication application;
71 tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap");
73 // request AnimatedImageVisual with a property map
74 VisualFactory factory = VisualFactory::Get();
75 Visual::Base animatedImageVisual = factory.CreateVisual(
77 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
78 .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
79 .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
80 .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
81 .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
82 .Add(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME)
83 .Add(ImageVisual::Property::MASK_CONTENT_SCALE, 1.6f)
84 .Add(ImageVisual::Property::CROP_TO_MASK, true)
85 .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
86 .Add(DevelVisual::Property::CORNER_RADIUS, 22.2f)
87 .Add(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE)
88 .Add(DevelVisual::Property::BORDERLINE_WIDTH, 33.3f)
89 .Add(DevelVisual::Property::BORDERLINE_COLOR, Color::RED)
90 .Add(DevelVisual::Property::BORDERLINE_OFFSET, 0.3f));
92 Property::Map resultMap;
93 animatedImageVisual.CreatePropertyMap(resultMap);
94 // check the property values from the returned map from a visual
95 Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
96 DALI_TEST_CHECK(value);
97 DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
99 value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
100 DALI_TEST_CHECK(value);
101 DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
103 value = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4);
104 DALI_TEST_CHECK(value);
105 DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(22.2f, 22.2f, 22.2f, 22.2f), TEST_LOCATION);
107 value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, Property::INTEGER);
108 DALI_TEST_CHECK(value);
109 DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::ABSOLUTE);
111 value = resultMap.Find(DevelVisual::Property::BORDERLINE_WIDTH, Property::FLOAT);
112 DALI_TEST_CHECK(value);
113 DALI_TEST_EQUALS(value->Get<float>(), 33.3f, TEST_LOCATION);
115 value = resultMap.Find(DevelVisual::Property::BORDERLINE_COLOR, Property::VECTOR4);
116 DALI_TEST_CHECK(value);
117 DALI_TEST_EQUALS(value->Get<Vector4>(), Color::RED, TEST_LOCATION);
119 value = resultMap.Find(DevelVisual::Property::BORDERLINE_OFFSET, Property::FLOAT);
120 DALI_TEST_CHECK(value);
121 DALI_TEST_EQUALS(value->Get<float>(), 0.3f, TEST_LOCATION);
123 // Check mask properties
124 value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, Property::STRING);
125 DALI_TEST_CHECK(value);
126 DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
128 value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, Property::FLOAT);
129 DALI_TEST_CHECK(value);
130 DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
132 value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, Property::BOOLEAN);
133 DALI_TEST_CHECK(value);
134 DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
136 value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
137 DALI_TEST_CHECK(value);
138 DALI_TEST_CHECK(value->Get<int>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
141 animatedImageVisual.GetNaturalSize(naturalSize);
142 DALI_TEST_EQUALS(naturalSize, Vector2(100, 100), TEST_LOCATION);
144 // request AnimatedImageVisual with an URL
145 Visual::Base animatedImageVisual2 = factory.CreateVisual(TEST_GIF_FILE_NAME, ImageDimensions());
147 animatedImageVisual2.CreatePropertyMap(resultMap);
148 // check the property values from the returned map from a visual
149 value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
150 DALI_TEST_CHECK(value);
151 DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
153 value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
154 DALI_TEST_CHECK(value);
155 DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
160 int UtcDaliAnimatedImageVisualGetPropertyMap02(void)
162 ToolkitTestApplication application;
163 tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap for multi image with fixed cache");
165 // request AnimatedImageVisual with a property map
166 VisualFactory factory = VisualFactory::Get();
167 Property::Array urls;
168 CopyUrlsIntoArray(urls);
170 Visual::Base animatedImageVisual = factory.CreateVisual(
172 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
175 .Add("cacheSize", 20)
176 .Add("loopCount", 10)
177 .Add("frameDelay", 200)
178 .Add("pixelArea", Vector4())
179 .Add("wrapModeU", WrapMode::REPEAT)
180 .Add("wrapModeV", WrapMode::DEFAULT)
181 .Add("alphaMaskUrl", TEST_MASK_IMAGE_FILE_NAME)
182 .Add("maskContentScale", 1.6f)
183 .Add("cropToMask", true)
184 .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
185 .Add("cornerRadius", Vector4(50.0f, 25.0f, 12.5f, 33.0f))
186 .Add("cornerRadiusPolicy", Visual::Transform::Policy::RELATIVE)
187 .Add("borderlineWidth", 20.0f)
188 .Add("borderlineColor", Vector4())
189 .Add("borderlineOffset", -1.0f));
191 Property::Map resultMap;
192 animatedImageVisual.CreatePropertyMap(resultMap);
193 // check the property values from the returned map from a visual
194 Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
195 DALI_TEST_CHECK(value);
196 DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
198 value = resultMap.Find(ImageVisual::Property::URL, "url");
199 DALI_TEST_CHECK(value);
200 Property::Array* resultUrls = value->GetArray();
201 DALI_TEST_CHECK(resultUrls);
202 DALI_TEST_EQUALS(resultUrls->Count(), urls.Count(), TEST_LOCATION);
204 value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
205 DALI_TEST_CHECK(value);
206 DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
208 value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
209 DALI_TEST_CHECK(value);
210 DALI_TEST_EQUALS(value->Get<int>(), 20, TEST_LOCATION);
212 value = resultMap.Find(Toolkit::DevelImageVisual::Property::LOOP_COUNT, "loopCount");
213 DALI_TEST_CHECK(value);
214 DALI_TEST_EQUALS(value->Get<int>(), 10, TEST_LOCATION);
216 value = resultMap.Find(ImageVisual::Property::FRAME_DELAY, "frameDelay");
217 DALI_TEST_CHECK(value);
218 DALI_TEST_EQUALS(value->Get<int>(), 200, TEST_LOCATION);
220 value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
221 DALI_TEST_CHECK(value);
222 DALI_TEST_EQUALS(value->Get<int>(), 11, TEST_LOCATION);
224 value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius");
225 DALI_TEST_CHECK(value);
226 DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(50.0f, 25.0f, 12.5f, 33.0f), TEST_LOCATION);
228 value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy");
229 DALI_TEST_CHECK(value);
230 DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::RELATIVE);
232 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
233 DALI_TEST_CHECK(value);
234 DALI_TEST_EQUALS(value->Get<float>(), 20.0f, TEST_LOCATION);
236 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
237 DALI_TEST_CHECK(value);
238 DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4::ZERO, TEST_LOCATION);
240 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
241 DALI_TEST_CHECK(value);
242 DALI_TEST_EQUALS(value->Get<float>(), -1.0f, TEST_LOCATION);
244 // Check mask properties
245 value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
246 DALI_TEST_CHECK(value);
247 DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
249 value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, "maskContentScale");
250 DALI_TEST_CHECK(value);
251 DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
253 value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, "cropToMask");
254 DALI_TEST_CHECK(value);
255 DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
257 value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
258 DALI_TEST_CHECK(value);
259 DALI_TEST_CHECK(value->Get<int>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
264 int UtcDaliAnimatedImageVisualGetPropertyMap03(void)
266 ToolkitTestApplication application;
267 tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap for multi image rolling cache");
269 // request AnimatedImageVisual with a property map
270 VisualFactory factory = VisualFactory::Get();
271 Property::Array urls;
272 CopyUrlsIntoArray(urls);
274 Visual::Base animatedImageVisual = factory.CreateVisual(
276 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
280 .Add("loopCount", 10)
281 .Add("frameDelay", 200)
282 .Add("pixelArea", Vector4())
283 .Add("wrapModeU", WrapMode::REPEAT)
284 .Add("wrapModeV", WrapMode::DEFAULT)
285 .Add("alphaMaskUrl", TEST_MASK_IMAGE_FILE_NAME)
286 .Add("maskContentScale", 1.6f)
287 .Add("cropToMask", true)
288 .Add(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING)
289 .Add("cornerRadius", 50.5f));
291 Property::Map resultMap;
292 animatedImageVisual.CreatePropertyMap(resultMap);
293 // check the property values from the returned map from a visual
294 Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
295 DALI_TEST_CHECK(value);
296 DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
298 value = resultMap.Find(ImageVisual::Property::URL, "url");
299 DALI_TEST_CHECK(value);
300 Property::Array* resultUrls = value->GetArray();
301 DALI_TEST_CHECK(resultUrls);
302 DALI_TEST_EQUALS(resultUrls->Count(), urls.Count(), TEST_LOCATION);
304 value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
305 DALI_TEST_CHECK(value);
306 DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
308 value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
309 DALI_TEST_CHECK(value);
310 DALI_TEST_EQUALS(value->Get<int>(), 8, TEST_LOCATION);
312 value = resultMap.Find(Toolkit::DevelImageVisual::Property::LOOP_COUNT, "loopCount");
313 DALI_TEST_CHECK(value);
314 DALI_TEST_EQUALS(value->Get<int>(), 10, TEST_LOCATION);
316 value = resultMap.Find(ImageVisual::Property::FRAME_DELAY, "frameDelay");
317 DALI_TEST_CHECK(value);
318 DALI_TEST_EQUALS(value->Get<int>(), 200, TEST_LOCATION);
320 value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
321 DALI_TEST_CHECK(value);
322 DALI_TEST_EQUALS(value->Get<int>(), 11, TEST_LOCATION);
324 value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS, "cornerRadius");
325 DALI_TEST_CHECK(value);
326 DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(50.5f, 50.5f, 50.5f, 50.5f), TEST_LOCATION);
328 value = resultMap.Find(Toolkit::DevelVisual::Property::CORNER_RADIUS_POLICY, "cornerRadiusPolicy");
329 DALI_TEST_CHECK(value);
330 DALI_TEST_CHECK(value->Get<int>() == Visual::Transform::Policy::ABSOLUTE);
332 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
333 DALI_TEST_CHECK(value);
334 DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
336 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
337 DALI_TEST_CHECK(value);
338 DALI_TEST_EQUALS(value->Get<Vector4>(), Color::BLACK, TEST_LOCATION);
340 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
341 DALI_TEST_CHECK(value);
342 DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
344 // Check mask properties
345 value = resultMap.Find(ImageVisual::Property::ALPHA_MASK_URL, "alphaMaskUrl");
346 DALI_TEST_CHECK(value);
347 DALI_TEST_CHECK(value->Get<std::string>() == TEST_MASK_IMAGE_FILE_NAME);
349 value = resultMap.Find(ImageVisual::Property::MASK_CONTENT_SCALE, "maskContentScale");
350 DALI_TEST_CHECK(value);
351 DALI_TEST_EQUALS(value->Get<float>(), 1.6f, TEST_LOCATION);
353 value = resultMap.Find(ImageVisual::Property::CROP_TO_MASK, "cropToMask");
354 DALI_TEST_CHECK(value);
355 DALI_TEST_EQUALS(value->Get<bool>(), true, TEST_LOCATION);
357 value = resultMap.Find(DevelImageVisual::Property::MASKING_TYPE, Property::INTEGER);
358 DALI_TEST_CHECK(value);
359 DALI_TEST_CHECK(value->Get<bool>() == DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
364 int UtcDaliAnimatedImageVisualGetPropertyMap04(void)
366 ToolkitTestApplication application;
367 tet_infoline("UtcDaliAnimatedImageVisualGetPropertyMap");
369 // request AnimatedImageVisual with a property map
370 VisualFactory factory = VisualFactory::Get();
371 Visual::Base animatedImageVisual = factory.CreateVisual(
373 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
374 .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
375 .Add(ImageVisual::Property::BATCH_SIZE, 1)
376 .Add(ImageVisual::Property::CACHE_SIZE, 1)
377 .Add(ImageVisual::Property::SYNCHRONOUS_LOADING, true)
378 .Add(ImageVisual::Property::RELEASE_POLICY, ImageVisual::ReleasePolicy::DETACHED)
379 .Add(ImageVisual::Property::LOAD_POLICY, ImageVisual::LoadPolicy::ATTACHED)
380 .Add(DevelVisual::Property::BORDERLINE_WIDTH, 0.4f));
382 Property::Map resultMap;
383 animatedImageVisual.CreatePropertyMap(resultMap);
385 // check the property values from the returned map from a visual
386 Property::Value* value = resultMap.Find(Toolkit::Visual::Property::TYPE, Property::INTEGER);
387 DALI_TEST_CHECK(value);
388 DALI_TEST_CHECK(value->Get<int>() == Visual::ANIMATED_IMAGE);
390 value = resultMap.Find(ImageVisual::Property::URL, Property::STRING);
391 DALI_TEST_CHECK(value);
392 DALI_TEST_CHECK(value->Get<std::string>() == TEST_GIF_FILE_NAME);
394 value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, Property::INTEGER);
395 DALI_TEST_CHECK(value);
396 DALI_TEST_CHECK(value->Get<int>() == 2);
398 value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, Property::INTEGER);
399 DALI_TEST_CHECK(value);
400 DALI_TEST_CHECK(value->Get<int>() == 2);
402 value = resultMap.Find(ImageVisual::Property::SYNCHRONOUS_LOADING, Property::BOOLEAN);
403 DALI_TEST_CHECK(value);
404 DALI_TEST_CHECK(value->Get<bool>() == true);
406 value = resultMap.Find(ImageVisual::Property::RELEASE_POLICY, Property::INTEGER);
407 DALI_TEST_CHECK(value);
408 DALI_TEST_CHECK(value->Get<int>() == ImageVisual::ReleasePolicy::DETACHED);
410 value = resultMap.Find(ImageVisual::Property::LOAD_POLICY, Property::INTEGER);
411 DALI_TEST_CHECK(value);
412 DALI_TEST_CHECK(value->Get<int>() == ImageVisual::LoadPolicy::ATTACHED);
414 value = resultMap.Find(Toolkit::DevelImageVisual::Property::TOTAL_FRAME_NUMBER, "totalFrameNumber");
415 DALI_TEST_CHECK(value);
416 DALI_TEST_EQUALS(value->Get<int>(), 4, TEST_LOCATION);
418 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_WIDTH, "borderlineWidth");
419 DALI_TEST_CHECK(value);
420 DALI_TEST_EQUALS(value->Get<float>(), 0.4f, TEST_LOCATION);
422 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_COLOR, "borderlineColor");
423 DALI_TEST_CHECK(value);
424 DALI_TEST_EQUALS(value->Get<Vector4>(), Vector4(0.0f, 0.0f, 0.0f, 1.0f), TEST_LOCATION);
426 value = resultMap.Find(Toolkit::DevelVisual::Property::BORDERLINE_OFFSET, "borderlineOffset");
427 DALI_TEST_CHECK(value);
428 DALI_TEST_EQUALS(value->Get<float>(), 0.0f, TEST_LOCATION);
433 int UtcDaliAnimatedImageVisualImageLoadingFail01(void)
435 ToolkitTestApplication application;
436 TestGlAbstraction& gl = application.GetGlAbstraction();
439 Property::Map propertyMap;
440 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
441 propertyMap.Insert(ImageVisual::Property::URL, "dummy.gif");
442 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
443 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
444 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
445 propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
446 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
447 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
449 VisualFactory factory = VisualFactory::Get();
450 Visual::Base visual = factory.CreateVisual(propertyMap);
452 DummyControl dummyControl = DummyControl::New(true);
453 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
454 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
456 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
457 application.GetScene().Add(dummyControl);
459 TraceCallStack& textureTrace = gl.GetTextureTrace();
460 textureTrace.Enable(true);
462 application.SendNotification();
463 application.Render(20);
465 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 1, TEST_LOCATION);
467 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 6);
469 application.SendNotification();
470 application.Render(20);
472 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 1, TEST_LOCATION);
474 dummyControl.Unparent();
480 int UtcDaliAnimatedImageVisualSynchronousLoading(void)
482 ToolkitTestApplication application;
483 TestGlAbstraction& gl = application.GetGlAbstraction();
486 Property::Map propertyMap;
487 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
488 propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
489 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
490 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
491 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
492 propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
493 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
494 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
496 VisualFactory factory = VisualFactory::Get();
497 Visual::Base visual = factory.CreateVisual(propertyMap);
499 DummyControl dummyControl = DummyControl::New(true);
500 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
501 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
503 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
504 application.GetScene().Add(dummyControl);
506 TraceCallStack& textureTrace = gl.GetTextureTrace();
507 textureTrace.Enable(true);
509 application.SendNotification();
510 application.Render(20);
512 // The first frame is loaded synchronously and load next batch.
513 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
515 application.SendNotification();
516 application.Render();
518 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
519 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
521 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 3);
523 application.SendNotification();
524 application.Render(20);
526 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
528 application.SendNotification();
529 application.Render();
531 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
533 dummyControl.Unparent();
535 tet_infoline("Test that removing the visual from stage deletes all textures");
536 application.SendNotification();
537 application.Render(16);
538 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
543 int UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask01(void)
545 ToolkitTestApplication application;
546 tet_infoline("UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask01 for CPU Alpha Masking");
547 TestGlAbstraction& gl = application.GetGlAbstraction();
550 Property::Map propertyMap;
551 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
552 propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
553 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
554 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
555 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
556 propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
557 propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
558 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
559 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
561 VisualFactory factory = VisualFactory::Get();
562 Visual::Base visual = factory.CreateVisual(propertyMap);
564 Property::Map testMap;
565 visual.CreatePropertyMap(testMap);
566 DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL), Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION);
568 DummyControl dummyControl = DummyControl::New(true);
569 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
570 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
572 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
573 application.GetScene().Add(dummyControl);
575 TraceCallStack& textureTrace = gl.GetTextureTrace();
576 textureTrace.Enable(true);
578 application.SendNotification();
579 application.Render(20);
581 // The first frame is loaded synchronously and load next batch with masking
582 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
584 application.SendNotification();
585 application.Render();
587 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
588 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
590 dummyControl.Unparent();
592 tet_infoline("Test that removing the visual from stage deletes all textures");
593 application.SendNotification();
594 application.Render(16);
595 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
600 int UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask02(void)
602 ToolkitTestApplication application;
603 tet_infoline("UtcDaliAnimatedImageVisualSynchronousLoadingWithAlphaMask02 for GPU Alpha Masking");
604 TestGlAbstraction& gl = application.GetGlAbstraction();
607 Property::Map propertyMap;
608 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
609 propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
610 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
611 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
612 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
613 propertyMap.Insert(ImageVisual::Property::SYNCHRONOUS_LOADING, true);
614 propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
615 propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
616 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS, 0.23f);
617 propertyMap.Insert(DevelVisual::Property::CORNER_RADIUS_POLICY, Visual::Transform::Policy::ABSOLUTE);
619 VisualFactory factory = VisualFactory::Get();
620 Visual::Base visual = factory.CreateVisual(propertyMap);
622 Property::Map testMap;
623 visual.CreatePropertyMap(testMap);
624 DALI_TEST_EQUALS(*testMap.Find(ImageVisual::Property::ALPHA_MASK_URL), Property::Value(TEST_MASK_IMAGE_FILE_NAME), TEST_LOCATION);
626 DummyControl dummyControl = DummyControl::New(true);
627 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
628 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
630 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
631 application.GetScene().Add(dummyControl);
633 TraceCallStack& textureTrace = gl.GetTextureTrace();
634 textureTrace.Enable(true);
636 application.SendNotification();
637 application.Render(20);
639 // The first frame is loaded synchronously and load next batch with masking
640 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
642 application.SendNotification();
643 application.Render();
645 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
646 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
648 dummyControl.Unparent();
650 tet_infoline("Test that removing the visual from stage deletes all textures");
651 application.SendNotification();
652 application.Render(16);
653 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
658 int UtcDaliAnimatedImageVisualJumpToAction(void)
660 ToolkitTestApplication application;
661 TestGlAbstraction& gl = application.GetGlAbstraction();
663 Property::Array urls;
664 CopyUrlsIntoArray(urls);
667 Property::Map propertyMap;
668 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
669 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
670 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
671 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 12);
672 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
674 VisualFactory factory = VisualFactory::Get();
675 Visual::Base visual = factory.CreateVisual(propertyMap);
677 DummyControl dummyControl = DummyControl::New(true);
678 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
679 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
681 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
682 application.GetScene().Add(dummyControl);
683 application.SendNotification();
684 application.Render(20);
686 tet_infoline("Ready the visual after the visual is on stage");
687 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
689 tet_infoline("Test that a timer has been started");
690 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
692 TraceCallStack& textureTrace = gl.GetTextureTrace();
693 textureTrace.Enable(true);
695 application.SendNotification();
696 application.Render(20);
698 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
700 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
702 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
704 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 20);
706 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
708 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 6);
710 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(6), true, TEST_LOCATION);
711 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
713 dummyControl.Unparent();
715 tet_infoline("Test that removing the visual from stage deletes all textures");
716 application.SendNotification();
717 application.Render(16);
718 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
723 int UtcDaliAnimatedImageVisualStopBehavior(void)
725 ToolkitTestApplication application;
726 TestGlAbstraction& gl = application.GetGlAbstraction();
728 Property::Array urls;
729 CopyUrlsIntoArray(urls);
732 Property::Map propertyMap;
733 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
734 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
735 propertyMap.Insert(DevelImageVisual::Property::STOP_BEHAVIOR, DevelImageVisual::StopBehavior::FIRST_FRAME);
736 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
737 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 8);
738 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
740 VisualFactory factory = VisualFactory::Get();
741 Visual::Base visual = factory.CreateVisual(propertyMap);
743 // Expect that a batch of 4 textures has been requested. These will be serially loaded
746 DummyControl dummyControl = DummyControl::New(true);
747 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
748 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
750 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
751 application.GetScene().Add(dummyControl);
752 application.SendNotification();
753 application.Render(20);
755 tet_infoline("Ready the visual after the visual is on stage");
756 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
758 tet_infoline("Test that a timer has been started");
759 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
761 TraceCallStack& textureTrace = gl.GetTextureTrace();
762 textureTrace.Enable(true);
764 application.SendNotification();
765 application.Render(20);
767 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
769 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
771 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
773 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::JUMP_TO, 1);
775 // Expect the second batch has been requested
776 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
778 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 4, TEST_LOCATION);
780 dummyControl.Unparent();
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);
790 int UtcDaliAnimatedImageVisualStopBehavior02(void)
792 ToolkitTestApplication application;
793 TestGlAbstraction& gl = application.GetGlAbstraction();
795 Property::Array urls;
796 CopyUrlsIntoArray(urls);
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::LAST_FRAME);
803 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
804 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 2);
805 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
807 VisualFactory factory = VisualFactory::Get();
808 Visual::Base visual = factory.CreateVisual(propertyMap);
810 // Expect that a batch of 4 textures has been requested. These will be serially loaded
813 DummyControl dummyControl = DummyControl::New(true);
814 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
815 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
817 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
818 application.GetScene().Add(dummyControl);
820 tet_infoline("Ready the visual after the visual is on stage");
821 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
823 TraceCallStack& textureTrace = gl.GetTextureTrace();
824 textureTrace.Enable(true);
826 application.SendNotification();
827 application.Render(20);
829 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
831 Test::EmitGlobalTimerSignal();
833 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
835 application.SendNotification();
836 application.Render(20);
838 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
840 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, Property::Map());
842 tet_infoline("Ready the visual after the visual is on stage");
843 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
845 application.SendNotification();
846 application.Render(20);
848 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
850 dummyControl.Unparent();
852 tet_infoline("Test that removing the visual from stage deletes all textures");
853 application.SendNotification();
854 application.Render(16);
855 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
860 int UtcDaliAnimatedImageVisualAnimatedImage01(void)
862 ToolkitTestApplication application;
863 TestGlAbstraction& gl = application.GetGlAbstraction();
865 tet_infoline("Set cache size same as GIF frame, and try to load same image at another ImageView");
867 Property::Map propertyMap;
868 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
869 propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
870 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
871 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
872 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
874 VisualFactory factory = VisualFactory::Get();
875 Visual::Base visual = factory.CreateVisual(propertyMap);
877 // Expect that a batch of 4 textures has been requested. These will be serially loaded
880 DummyControl dummyControl = DummyControl::New(true);
881 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
882 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
884 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
885 application.GetScene().Add(dummyControl);
887 application.SendNotification();
888 application.Render();
890 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
892 // Batch 2 frames. Now frame 0, 1 cached.
893 application.SendNotification();
894 application.Render(20);
896 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
898 tet_infoline("Test that a timer has been started");
900 TraceCallStack& textureTrace = gl.GetTextureTrace();
901 textureTrace.Enable(true);
903 Test::EmitGlobalTimerSignal();
905 application.SendNotification();
906 application.Render();
908 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
910 // 0 frame removed. and after, batch 2 frames. Now frame 1, 2, 3 cached.
911 application.SendNotification();
912 application.Render(20);
914 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
916 Visual::Base visual2 = factory.CreateVisual(propertyMap);
917 DummyControl dummyControl2 = DummyControl::New(true);
918 Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(dummyControl2.GetImplementation());
919 dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual2);
920 application.GetScene().Add(dummyControl2);
922 tet_infoline("Add new view with same url");
924 application.SendNotification();
925 application.Render();
927 // Note that we only re-load 0 frame.
928 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
930 // To do: we need to fix caching bug in animated-visual
931 //tet_infoline("Test that we don't try to re-load new image cause it cached");
932 //DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 1), false, TEST_LOCATION);
934 // Batch 2 frames. Now visual frame 1, 2, 3 cached and visual2 frame 0, 1 cached.
935 application.SendNotification();
936 application.Render(20);
938 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 5, TEST_LOCATION);
940 textureTrace.Reset();
942 tet_infoline("Load some many frames");
944 const int repeatCount = 10;
945 for(int repeat = 0; repeat < repeatCount; ++repeat)
947 Test::EmitGlobalTimerSignal();
948 application.SendNotification();
949 application.Render(2000);
952 DALI_TEST_EQUALS(textureTrace.FindMethod("GenTextures"), false, TEST_LOCATION); // A new texture should NOT be generated.
953 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 5, TEST_LOCATION);
955 textureTrace.Reset();
957 dummyControl.Unparent();
958 dummyControl2.Unparent();
960 tet_infoline("Test that removing the visual from stage deletes all textures");
961 application.SendNotification();
962 application.Render(20);
963 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
968 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask01(void)
970 ToolkitTestApplication application;
971 tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask01 for CPU Alpha Masking");
972 TestGlAbstraction& gl = application.GetGlAbstraction();
975 Property::Map propertyMap;
976 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
977 propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
978 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
979 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
980 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
981 propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
983 VisualFactory factory = VisualFactory::Get();
984 Visual::Base visual = factory.CreateVisual(propertyMap);
986 DummyControl dummyControl = DummyControl::New(true);
987 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
988 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
990 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
991 application.GetScene().Add(dummyControl);
993 application.SendNotification();
994 application.Render();
996 // load two frame(batch size), load mask image, and request two masking
997 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(5), true, TEST_LOCATION);
999 application.SendNotification();
1000 application.Render(20);
1002 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 2, TEST_LOCATION);
1004 dummyControl.Unparent();
1006 tet_infoline("Test that removing the visual from stage deletes all textures");
1007 application.SendNotification();
1008 application.Render(20);
1009 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1014 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask02(void)
1016 ToolkitTestApplication application;
1017 tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask02 for GPU Alpha Masking");
1018 TestGlAbstraction& gl = application.GetGlAbstraction();
1021 Property::Map propertyMap;
1022 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
1023 propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
1024 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1025 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
1026 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
1027 propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, TEST_MASK_IMAGE_FILE_NAME);
1028 propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
1030 VisualFactory factory = VisualFactory::Get();
1031 Visual::Base visual = factory.CreateVisual(propertyMap);
1033 DummyControl dummyControl = DummyControl::New(true);
1034 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1035 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1037 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1038 application.GetScene().Add(dummyControl);
1040 application.SendNotification();
1041 application.Render();
1043 // load two frame(batch size), load mask image, and request two masking
1044 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1046 application.SendNotification();
1047 application.Render(20);
1049 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 3, TEST_LOCATION);
1051 dummyControl.Unparent();
1053 tet_infoline("Test that removing the visual from stage deletes all textures");
1054 application.SendNotification();
1055 application.Render(20);
1056 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1061 int UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask03(void)
1063 ToolkitTestApplication application;
1064 tet_infoline("UtcDaliAnimatedImageVisualAnimatedImageWithAlphaMask03 for GPU Alpha Masking with broken mask texture");
1065 TestGlAbstraction& gl = application.GetGlAbstraction();
1068 Property::Map propertyMap;
1069 propertyMap.Insert(Visual::Property::TYPE, Visual::ANIMATED_IMAGE);
1070 propertyMap.Insert(ImageVisual::Property::URL, TEST_GIF_FILE_NAME);
1071 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1072 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 4);
1073 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 20);
1074 propertyMap.Insert(ImageVisual::Property::ALPHA_MASK_URL, "");
1075 propertyMap.Insert(DevelImageVisual::Property::MASKING_TYPE, DevelImageVisual::MaskingType::MASKING_ON_RENDERING);
1077 VisualFactory factory = VisualFactory::Get();
1078 Visual::Base visual = factory.CreateVisual(propertyMap);
1080 DummyControl dummyControl = DummyControl::New(true);
1081 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1082 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1084 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1085 application.GetScene().Add(dummyControl);
1087 application.SendNotification();
1088 application.Render();
1090 // load two frame(batch size), load mask image, and request two masking
1091 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1093 application.SendNotification();
1094 application.Render(20);
1096 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 3, TEST_LOCATION);
1098 dummyControl.Unparent();
1100 tet_infoline("Test that removing the visual from stage deletes all textures");
1101 application.SendNotification();
1102 application.Render(20);
1103 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1108 int UtcDaliAnimatedImageVisualMultiImage01(void)
1110 ToolkitTestApplication application;
1111 TestGlAbstraction& gl = application.GetGlAbstraction();
1113 Property::Array urls;
1114 CopyUrlsIntoArray(urls);
1117 Property::Map propertyMap;
1118 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1119 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1120 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
1121 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 8);
1122 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1124 VisualFactory factory = VisualFactory::Get();
1125 Visual::Base visual = factory.CreateVisual(propertyMap);
1127 // Expect that a batch of 4 textures has been requested. These will be serially loaded
1130 DummyControl dummyControl = DummyControl::New(true);
1131 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1132 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1134 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1135 application.GetScene().Add(dummyControl);
1136 application.SendNotification();
1137 application.Render(16);
1139 tet_infoline("Ready the visual after the visual is on stage");
1140 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1142 tet_infoline("Test that a timer has been started");
1143 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1145 TraceCallStack& textureTrace = gl.GetTextureTrace();
1146 textureTrace.Enable(true);
1148 application.SendNotification();
1149 application.Render(16);
1151 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 4, TEST_LOCATION);
1152 DALI_TEST_EQUALS(textureTrace.FindMethod("BindTexture"), true, TEST_LOCATION);
1154 tet_infoline("Test that after 1 tick, and file loads completed, that we have 7 textures");
1155 Test::EmitGlobalTimerSignal();
1157 // Expect the second batch has been requested
1158 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1160 application.SendNotification();
1161 application.Render(16);
1162 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1164 tet_infoline("Test that after 2 ticks that we have 6 textures");
1166 Test::EmitGlobalTimerSignal();
1167 application.SendNotification();
1168 application.Render(16);
1169 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 6, TEST_LOCATION);
1171 tet_infoline("And that at least 2 textures were requested");
1172 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1173 application.SendNotification();
1174 application.Render(16);
1175 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 8, TEST_LOCATION);
1177 tet_infoline("Test that after 3rd tick that we have 7 textures and 1 request");
1178 Test::EmitGlobalTimerSignal();
1179 application.SendNotification();
1180 application.Render(16);
1181 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1183 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1184 application.SendNotification();
1185 application.Render(16);
1186 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 8, TEST_LOCATION);
1188 dummyControl.Unparent();
1190 tet_infoline("Test that removing the visual from stage deletes all textures");
1191 application.SendNotification();
1192 application.Render(16);
1193 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1198 int UtcDaliAnimatedImageVisualMultiImage02(void)
1200 ToolkitTestApplication application;
1201 TestGlAbstraction& gl = application.GetGlAbstraction();
1203 tet_infoline("Test that the animated visual has different batch and cache size.");
1206 Property::Array urls;
1207 CopyUrlsIntoArray(urls);
1209 Property::Map propertyMap;
1210 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1211 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1212 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 0);
1213 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 0);
1214 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1216 VisualFactory factory = VisualFactory::Get();
1217 Visual::Base visual = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1219 // Check the batch size and cache size need to have minimum 2.
1220 Property::Map resultMap;
1221 visual.CreatePropertyMap(resultMap);
1222 Property::Value* value = resultMap.Find(ImageVisual::Property::BATCH_SIZE, "batchSize");
1223 DALI_TEST_CHECK(value);
1224 DALI_TEST_EQUALS(value->Get<int>(), 2, TEST_LOCATION);
1225 value = resultMap.Find(ImageVisual::Property::CACHE_SIZE, "cacheSize");
1226 DALI_TEST_CHECK(value);
1227 DALI_TEST_EQUALS(value->Get<int>(), 2, TEST_LOCATION);
1230 // Batch size is 2 and cache size is 3
1231 propertyMap.Clear();
1232 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1233 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1234 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1235 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 3);
1236 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1238 visual = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1240 // Expect that each image is loaded each tick
1241 DummyControl dummyControl = DummyControl::New(true);
1242 Impl::DummyControl& dummyImpl1 = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1243 dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1246 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1247 application.GetScene().Add(dummyControl);
1248 application.SendNotification();
1249 application.Render(16);
1251 tet_infoline("Ready the visual after the visual is on window");
1252 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1253 application.SendNotification();
1254 application.Render(16); //glGenTextures 1 and 2
1255 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_LOCATION);
1257 tet_infoline("Test that each tick, a new image is requested");
1258 Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:0
1259 application.SendNotification();
1260 application.Render(16);
1261 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1262 application.SendNotification();
1263 application.Render(16); //glGenTextures 3
1264 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1266 tet_infoline("Test that each tick, a new image is requested");
1267 Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:1
1268 application.SendNotification();
1269 application.Render(16);
1270 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1271 application.SendNotification();
1272 application.Render(16); //glGenTextures 4
1273 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1275 dummyImpl1.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1276 dummyControl.Unparent();
1278 // Batch size is 9 and cache size is 4
1279 propertyMap.Clear();
1280 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1281 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1282 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 3);
1283 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 7);
1284 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1286 visual = factory.CreateVisual(propertyMap); // TexMgr::Request load tId:0
1288 // Expect that each image is loaded each tick
1289 dummyControl = DummyControl::New(true);
1290 Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1291 dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1294 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1295 application.GetScene().Add(dummyControl);
1296 application.SendNotification();
1297 application.Render(16);
1299 tet_infoline("Ready the visual after the visual is on window");
1300 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1301 application.SendNotification();
1302 application.Render(16); //glGenTextures 1, 2, and 3
1303 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1305 tet_infoline("Test that each tick, a new image is requested");
1306 Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:0
1307 application.SendNotification();
1308 application.Render(16);
1309 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1310 application.SendNotification();
1311 application.Render(16); //glGenTextures 4, 5, and 6
1312 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 5, TEST_LOCATION);
1314 tet_infoline("Test that each tick, a new image is requested");
1315 Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:1
1316 application.SendNotification();
1317 application.Render(16);
1318 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1319 application.SendNotification();
1320 application.Render(16); //glGenTextures 7, 1, and 2
1321 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1323 tet_infoline("Test that each tick, a new image is requested");
1324 Test::EmitGlobalTimerSignal(); // TexMgr::Remove tId:2
1325 application.SendNotification();
1326 application.Render(16);
1327 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1328 application.SendNotification();
1329 application.Render(16); //glGenTextures 3
1330 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 7, TEST_LOCATION);
1332 dummyControl.Unparent();
1334 tet_infoline("Test that removing the visual from window deletes all textures");
1335 application.SendNotification();
1336 application.Render(16);
1337 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1342 int UtcDaliAnimatedImageVisualMultiImage03(void)
1344 ToolkitTestApplication application;
1345 TestGlAbstraction& gl = application.GetGlAbstraction();
1348 Property::Array urls1, urls2;
1349 CopyUrlsIntoArray(urls1);
1350 CopyUrlsIntoArray(urls2);
1352 Property::Map animatedImageMap1;
1353 animatedImageMap1.Insert(Visual::Property::TYPE, Visual::IMAGE);
1354 animatedImageMap1.Insert(ImageVisual::Property::URL, Property::Value(urls1));
1355 animatedImageMap1.Insert(ImageVisual::Property::BATCH_SIZE, 3);
1356 animatedImageMap1.Insert(ImageVisual::Property::CACHE_SIZE, 3);
1357 animatedImageMap1.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1359 Property::Map animatedImageMap2;
1360 animatedImageMap2.Insert(Visual::Property::TYPE, Visual::IMAGE);
1361 animatedImageMap2.Insert(ImageVisual::Property::URL, Property::Value(urls2));
1362 animatedImageMap2.Insert(ImageVisual::Property::BATCH_SIZE, 2);
1363 animatedImageMap2.Insert(ImageVisual::Property::CACHE_SIZE, 2);
1364 animatedImageMap2.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1366 VisualFactory factory = VisualFactory::Get();
1367 Visual::Base animatedImageVisual1 = factory.CreateVisual(animatedImageMap1);
1369 tet_infoline("Create two image views with the same URLs, offset by 1 frame.");
1371 DummyControl dummyControl1 = DummyControl::New(true);
1372 Impl::DummyControl& dummyImpl1 = static_cast<Impl::DummyControl&>(dummyControl1.GetImplementation());
1373 dummyImpl1.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual1);
1374 dummyControl1.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1375 application.GetScene().Add(dummyControl1);
1377 application.SendNotification();
1378 application.Render(16);
1380 tet_infoline("Ready the requested image after the first visual is on stage");
1381 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(3), true, TEST_LOCATION);
1382 application.SendNotification();
1383 application.Render(16);
1384 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1386 Visual::Base animatedImageVisual2 = factory.CreateVisual(animatedImageMap2);
1387 DummyControl dummyControl2 = DummyControl::New(true);
1388 Impl::DummyControl& dummyImpl2 = static_cast<Impl::DummyControl&>(dummyControl2.GetImplementation());
1389 dummyImpl2.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual2);
1390 dummyControl2.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1391 application.GetScene().Add(dummyControl2);
1392 application.SendNotification();
1393 application.Render(16);
1395 tet_infoline("The texture cache should be holding the requested images; check that the renderer has a texture");
1396 TextureSet ts = dummyControl2.GetRendererAt(0).GetTextures();
1397 Texture t1 = ts.GetTexture(0);
1398 DALI_TEST_EQUALS(ts.GetTextureCount(), 1, TEST_LOCATION);
1400 tet_infoline("Test that on the first tick, 1 new image is requested");
1401 Test::EmitGlobalTimerSignal(); // Both visuals should tick
1403 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1404 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 3, TEST_LOCATION);
1406 ts = dummyControl2.GetRendererAt(0).GetTextures();
1407 Texture t2 = ts.GetTexture(0);
1408 DALI_TEST_CHECK(t1 != t2);
1410 dummyControl1.Unparent();
1411 dummyControl2.Unparent();
1413 tet_infoline("Test that removing the visual from stage deletes all textures");
1414 application.SendNotification();
1415 application.Render(16);
1416 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1421 int UtcDaliAnimatedImageVisualMultiImage04(void)
1423 ToolkitTestApplication application;
1424 TestGlAbstraction& gl = application.GetGlAbstraction();
1425 TraceCallStack& textureTrace = gl.GetTextureTrace();
1426 textureTrace.Enable(true);
1428 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");
1430 Property::Array urls;
1431 CopyUrlsIntoArray(urls);
1434 Property::Map propertyMap;
1435 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1436 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1437 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 6);
1438 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 11);
1439 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1441 VisualFactory factory = VisualFactory::Get();
1442 Visual::Base visual = factory.CreateVisual(propertyMap);
1444 tet_infoline("Expect that a batch of 7 textures has been requested.");
1446 DummyControl dummyControl = DummyControl::New(true);
1447 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1448 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1450 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1451 application.GetScene().Add(dummyControl);
1452 application.SendNotification();
1453 application.Render(16);
1455 tet_infoline("Wait for the first batch to complete");
1456 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(6), true, TEST_LOCATION);
1458 tet_infoline("Test that a timer has been started");
1459 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1461 application.SendNotification();
1462 application.Render(16);
1464 DALI_TEST_EQUALS(gl.GetLastGenTextureId(), 6, TEST_LOCATION);
1465 tet_infoline("Test that after 1 tick, and 5 file loads completed, that we have 11 textures");
1466 Test::EmitGlobalTimerSignal();
1467 application.SendNotification();
1468 application.Render(16);
1470 // Expect the second batch has been requested
1471 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(5), true, TEST_LOCATION);
1473 application.SendNotification();
1474 application.Render(16);
1475 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1477 tet_infoline("Test that after 2 ticks that we have 11 textures and no requests");
1479 Test::EmitGlobalTimerSignal();
1480 application.SendNotification();
1481 application.Render(16);
1482 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 5), false, TEST_LOCATION);
1483 application.SendNotification();
1484 application.Render(16);
1485 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1487 tet_infoline("Test that after 3rd tick that we have 11 textures and no requests");
1488 Test::EmitGlobalTimerSignal();
1489 application.SendNotification();
1490 application.Render(16);
1492 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1, 5), false, TEST_LOCATION);
1493 application.SendNotification();
1494 application.Render(16);
1495 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 11, TEST_LOCATION);
1497 dummyControl.Unparent();
1500 tet_infoline("Test that removing the visual from stage deletes all textures");
1501 application.SendNotification();
1502 application.Render(16);
1503 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1508 int UtcDaliAnimatedImageVisualMultiImage05(void)
1510 ToolkitTestApplication application;
1511 TestGlAbstraction& gl = application.GetGlAbstraction();
1513 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");
1515 Property::Array urls;
1516 CopyUrlsIntoArray(urls);
1519 Property::Map propertyMap;
1520 propertyMap.Insert(Visual::Property::TYPE, Visual::IMAGE);
1521 propertyMap.Insert(ImageVisual::Property::URL, Property::Value(urls));
1522 propertyMap.Insert(ImageVisual::Property::BATCH_SIZE, 4);
1523 propertyMap.Insert(ImageVisual::Property::CACHE_SIZE, 11);
1524 propertyMap.Insert(ImageVisual::Property::FRAME_DELAY, 100);
1526 VisualFactory factory = VisualFactory::Get();
1527 Visual::Base visual = factory.CreateVisual(propertyMap);
1529 tet_infoline("Expect that a batch of 4 textures has been requested.");
1531 DummyControl dummyControl = DummyControl::New(true);
1532 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1533 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, visual);
1535 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1536 application.GetScene().Add(dummyControl);
1537 application.SendNotification();
1538 application.Render(16);
1540 tet_infoline("Wait for the first batch to complete");
1541 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1543 tet_infoline("Test that a timer has been started");
1544 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1546 application.SendNotification();
1547 application.Render(16);
1549 tet_infoline("Test that a timer has been started");
1550 Test::EmitGlobalTimerSignal();
1551 application.SendNotification();
1552 application.Render(16);
1554 dummyControl.Unparent();
1557 application.SendNotification();
1558 application.Render(16);
1559 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1561 tet_infoline("Test that pending batch of image loads are cancelled instead of uploaded");
1562 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(4), true, TEST_LOCATION);
1563 application.SendNotification();
1564 application.Render(16);
1565 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 0, TEST_LOCATION);
1570 void TestLoopCount(ToolkitTestApplication& application, DummyControl& dummyControl, uint16_t frameCount, uint16_t loopCount, const char* location)
1572 TestGlAbstraction& gl = application.GetGlAbstraction();
1573 TraceCallStack& textureTrace = gl.GetTextureTrace();
1575 textureTrace.Enable(true);
1576 application.GetScene().Add(dummyControl);
1578 application.SendNotification();
1579 application.Render(16);
1581 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_INNER_LOCATION(location));
1583 application.SendNotification();
1584 application.Render();
1586 tet_infoline("Test that a timer has been created");
1587 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_INNER_LOCATION(location));
1589 for(uint16_t i = 0; i < loopCount; i++)
1591 for(uint16_t j = 0; j < frameCount; j++)
1593 if(i == 0 && j == 0)
1595 continue; // Because first frame is already showed and we call 2nd frame at the first time of timer animation.
1597 tet_printf("Test that after %u ticks, and we have %u frame \n", j + 1u, j + 1u);
1598 Test::EmitGlobalTimerSignal();
1599 application.SendNotification();
1600 application.Render(16);
1602 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_INNER_LOCATION(location));
1604 application.SendNotification();
1605 application.Render();
1606 DALI_TEST_EQUALS(gl.GetNumGeneratedTextures(), 2, TEST_INNER_LOCATION(location));
1607 DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_INNER_LOCATION(location));
1609 tet_printf("Test Loop %u \n\n", i + 1u);
1612 tet_printf("Test that after %u loops, and we have no frame. Timer should stop \n", loopCount);
1613 Test::EmitGlobalTimerSignal();
1614 application.SendNotification();
1615 application.Render(16);
1616 DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_INNER_LOCATION(location));
1618 dummyControl.Unparent();
1621 int UtcDaliAnimatedImageVisualLoopCount(void)
1623 ToolkitTestApplication application;
1625 tet_infoline("UtcDaliAnimatedImageVisualLoopCount");
1628 // request AnimatedImageVisual with a property map
1629 // Test with no (0) loop count
1630 VisualFactory factory = VisualFactory::Get();
1631 Visual::Base animatedImageVisual = factory.CreateVisual(
1633 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1634 .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1635 .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1636 .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1637 .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1638 .Add(DevelImageVisual::Property::LOOP_COUNT, 0));
1640 DummyControl dummyControl = DummyControl::New(true);
1641 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1642 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1643 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1645 TestLoopCount(application, dummyControl, 4, 0, TEST_LOCATION);
1647 dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1648 animatedImageVisual.Reset();
1650 application.SendNotification();
1651 application.Render(16);
1653 // Test with no (1) loop count. Request AnimatedImageVisual with a property map
1654 animatedImageVisual = factory.CreateVisual(
1656 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1657 .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1658 .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1659 .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1660 .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1661 .Add(DevelImageVisual::Property::LOOP_COUNT, 1));
1663 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1665 TestLoopCount(application, dummyControl, 4, 1, TEST_LOCATION);
1667 dummyImpl.UnregisterVisual(DummyControl::Property::TEST_VISUAL);
1668 animatedImageVisual.Reset();
1670 application.SendNotification();
1671 application.Render(16);
1673 // Test with no (100) loop count. Request AnimatedImageVisual with a property map
1674 animatedImageVisual = factory.CreateVisual(
1676 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1677 .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1678 .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1679 .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1680 .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1681 .Add(DevelImageVisual::Property::LOOP_COUNT, 100));
1683 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1685 TestLoopCount(application, dummyControl, 4, 100, TEST_LOCATION);
1690 int UtcDaliAnimatedImageVisualPlayback(void)
1692 ToolkitTestApplication application;
1693 TestGlAbstraction& gl = application.GetGlAbstraction();
1694 TraceCallStack& textureTrace = gl.GetTextureTrace();
1696 tet_infoline("UtcDaliAnimatedImageVisualPlayback");
1699 // request AnimatedImageVisual with a property map
1700 // Test with forever (-1) loop count
1701 VisualFactory factory = VisualFactory::Get();
1702 Visual::Base animatedImageVisual = factory.CreateVisual(
1704 .Add(Toolkit::Visual::Property::TYPE, Visual::ANIMATED_IMAGE)
1705 .Add(ImageVisual::Property::URL, TEST_GIF_FILE_NAME)
1706 .Add(ImageVisual::Property::PIXEL_AREA, Vector4())
1707 .Add(ImageVisual::Property::WRAP_MODE_U, WrapMode::REPEAT)
1708 .Add(ImageVisual::Property::WRAP_MODE_V, WrapMode::DEFAULT)
1709 .Add(DevelImageVisual::Property::LOOP_COUNT, -1));
1711 DummyControl dummyControl = DummyControl::New(true);
1712 Impl::DummyControl& dummyImpl = static_cast<Impl::DummyControl&>(dummyControl.GetImplementation());
1713 dummyImpl.RegisterVisual(DummyControl::Property::TEST_VISUAL, animatedImageVisual);
1714 dummyControl.SetResizePolicy(ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS);
1716 textureTrace.Enable(true);
1717 application.GetScene().Add(dummyControl);
1718 application.SendNotification();
1719 application.Render(16);
1721 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
1723 application.SendNotification();
1724 application.Render();
1726 tet_infoline("Test that a timer has been created");
1727 DALI_TEST_EQUALS(Test::GetTimerCount(), 1, TEST_LOCATION);
1729 Test::EmitGlobalTimerSignal();
1730 application.SendNotification();
1731 application.Render(16);
1733 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1735 application.SendNotification();
1736 application.Render();
1737 DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1739 Property::Map attributes;
1740 tet_infoline("Test Pause action. Timer should stop after Pause action");
1741 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PAUSE, attributes);
1742 Test::EmitGlobalTimerSignal();
1743 application.SendNotification();
1744 application.Render(16);
1745 DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_LOCATION);
1747 tet_infoline("Test Play action. Timer should Restart after Play action");
1748 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes);
1749 Test::EmitGlobalTimerSignal();
1750 application.SendNotification();
1751 application.Render(16);
1753 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1755 application.SendNotification();
1756 application.Render();
1757 DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1759 tet_infoline("Test Stop action. Timer should stop after Stop action");
1760 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::STOP, attributes);
1761 Test::EmitGlobalTimerSignal();
1762 application.SendNotification();
1763 application.Render(16);
1764 DALI_TEST_EQUALS(Test::AreTimersRunning(), false, TEST_LOCATION);
1766 tet_infoline("Test Play action. Timer should Restart after Play action");
1767 DevelControl::DoAction(dummyControl, DummyControl::Property::TEST_VISUAL, Dali::Toolkit::DevelAnimatedImageVisual::Action::PLAY, attributes);
1768 Test::EmitGlobalTimerSignal();
1769 application.SendNotification();
1770 application.Render(16);
1772 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1774 application.SendNotification();
1775 application.Render();
1776 DALI_TEST_EQUALS(Test::AreTimersRunning(), true, TEST_LOCATION);
1778 dummyControl.Unparent();