Merge "Klockwork fixes: Distance field iteration Checking for null...
[platform/core/uifw/dali-core.git] / automated-tests / src / dali / utc-Dali-Image.cpp
1 /*
2  * Copyright (c) 2014 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
18 #include <iostream>
19 #include <algorithm>
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23 #include <test-native-image.h>
24
25 using namespace Dali;
26
27 void utc_dali_image_startup(void)
28 {
29   test_return_value = TET_UNDEF;
30 }
31
32 void utc_dali_image_cleanup(void)
33 {
34   test_return_value = TET_PASS;
35 }
36
37 static const char* gTestImageFilename = "icon_wrt.png";
38
39
40 // 1.1
41 int UtcDaliImageNew01(void)
42 {
43   TestApplication application;
44
45   tet_infoline("UtcDaliImageNew01 - Image::New(const std::string&)");
46
47   // invoke default handle constructor
48   Image image;
49
50   DALI_TEST_CHECK( !image );
51
52   // initialise handle
53   image = Image::New(gTestImageFilename);
54
55   DALI_TEST_CHECK( image );
56   END_TEST;
57 }
58
59 // 1.2
60 int UtcDaliImageNew02(void)
61 {
62   TestApplication application;
63
64   tet_infoline("UtcDaliImageNew02 - Image::New(const std::string&, const ImageAttributes&)");
65
66   // invoke default handle constructor
67   Image image;
68
69   DALI_TEST_CHECK( !image );
70
71   // initialise handle
72   Dali::ImageAttributes imageAttributes;
73   imageAttributes.SetSize(128, 256);
74   imageAttributes.SetScalingMode(Dali::ImageAttributes::FitHeight);
75   image = Image::New(gTestImageFilename, imageAttributes);
76
77   DALI_TEST_CHECK( image );
78   END_TEST;
79 }
80
81 // 1.3
82 int UtcDaliImageNew03(void)
83 {
84   TestApplication application;
85
86   tet_infoline("UtcDaliImageNew03 - Image::New(NativeImage&)");
87
88   // invoke default handle constructor
89   Image image;
90   TestNativeImagePointer nativeImage = TestNativeImage::New(16, 16);
91
92   DALI_TEST_CHECK( !image );
93
94   // initialise handle
95   image = Image::New(*(nativeImage.Get()));
96
97   DALI_TEST_CHECK( image );
98   END_TEST;
99 }
100
101 // 1.4
102 int UtcDaliImageNewWithPolicies01(void)
103 {
104   TestApplication application;
105
106   // testing delayed loading
107   tet_infoline("UtcDaliImageNewWithPolicies01 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Never");
108   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
109   Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Never);
110
111   DALI_TEST_CHECK( image );
112
113   application.SendNotification();
114   application.Render(16);
115
116   // request file loading only when actor added to stage
117   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
118
119   ImageActor actor = ImageActor::New(image);
120
121   Stage::GetCurrent().Add(actor);
122
123   application.SendNotification();
124   application.Render(16);
125
126   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
127
128   // testing ReleasePolicy::Never
129   // fake loading image
130   std::vector<GLuint> ids;
131   ids.push_back( 23 );
132   application.GetGlAbstraction().SetNextTextureIds( ids );
133   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
134   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
135   Integration::ResourcePointer resource(bitmap);
136   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
137
138   if(request)
139   {
140     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
141   }
142   application.Render(16);
143   application.SendNotification();
144
145   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
146
147   // never discard texture
148   Stage::GetCurrent().Remove(actor);
149   application.Render(16);
150   application.SendNotification();
151   application.Render(16);
152   application.SendNotification();
153   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
154   END_TEST;
155 }
156
157 // 1.5
158 int UtcDaliImageNewWithPolicies02(void)
159 {
160   TestApplication application;
161   const Vector2 closestImageSize( 80, 45);
162   application.GetPlatform().SetClosestImageSize(closestImageSize);
163
164   // testing resource deletion when taken off stage
165   tet_infoline("UtcDaliImageNewWithPolicies02 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
166
167   Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Unused);
168
169   DALI_TEST_CHECK( image );
170
171   application.SendNotification();
172   application.Render(16);
173
174   // request file loading only when actor added to stage
175   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
176
177   ImageActor actor = ImageActor::New(image);
178
179   Stage::GetCurrent().Add(actor);
180
181   application.SendNotification();
182   application.Render(16);
183
184   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
185
186   // testing ReleasePolicy::Unused
187   // fake loading image
188   std::vector<GLuint> ids;
189   ids.push_back( 23 );
190   application.GetGlAbstraction().SetNextTextureIds( ids );
191   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
192   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
193   Integration::ResourcePointer resource(bitmap);
194   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
195
196   if(request)
197   {
198     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
199   }
200   application.Render(16);
201   application.SendNotification();
202
203   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
204
205   // discard texture when actor comes off stage
206   Stage::GetCurrent().Remove(actor);
207   application.Render(16);
208   application.SendNotification();
209   application.Render(16);
210   application.SendNotification();
211   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
212   END_TEST;
213 }
214
215 // 1.6
216 int UtcDaliImageNewWithPolicies03(void)
217 {
218   TestApplication application;
219   const Vector2 closestImageSize( 80, 45);
220   application.GetPlatform().SetClosestImageSize(closestImageSize);
221
222   // load immediately -> resource deletion when taken off stage -> put actor back on stage -> load resource again
223   tet_infoline("UtcDaliImageNewWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Unused");
224
225   Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Unused);
226
227   DALI_TEST_CHECK( image );
228
229   application.SendNotification();
230   application.Render(16);
231
232   // request file loading immediately
233   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
234
235   ImageActor actor = ImageActor::New(image);
236
237   Stage::GetCurrent().Add(actor);
238
239   application.SendNotification();
240   application.Render(16);
241
242   // testing ReleasePolicy::Unused
243   // fake loading image
244   std::vector<GLuint> ids;
245   ids.push_back( 23 );
246   application.GetGlAbstraction().SetNextTextureIds( ids );
247   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
248   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
249   Integration::ResourcePointer resource(bitmap);
250   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
251
252   if(request)
253   {
254     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
255   }
256   application.Render(16);
257   application.SendNotification();
258
259   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
260
261   // discard texture when actor comes off stage
262   Stage::GetCurrent().Remove(actor);
263   application.Render(16);
264   application.SendNotification();
265   application.Render(16);
266   application.SendNotification();
267   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
268
269   // check load request when actor added back to stage
270   application.GetPlatform().ResetTrace();
271
272   Stage::GetCurrent().Add(actor);
273
274   application.SendNotification();
275   application.Render(16);
276   application.SendNotification();
277   application.Render(16);
278
279   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
280   END_TEST;
281 }
282
283 // 1.7
284 int UtcDaliImageNewWithPolicies04(void)
285 {
286   TestApplication application;
287
288   // load immediately, don't release texture when off stage
289   tet_infoline("UtcDaliImageNewWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Never");
290
291   Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Never);
292
293   DALI_TEST_CHECK( image );
294
295   application.SendNotification();
296   application.Render(16);
297
298   // request file loading immediately
299   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
300
301   ImageActor actor = ImageActor::New(image);
302
303   Stage::GetCurrent().Add(actor);
304
305   application.SendNotification();
306   application.Render(16);
307
308   // testing ReleasePolicy::Never
309   // fake loading image
310   std::vector<GLuint> ids;
311   ids.push_back( 23 );
312   application.GetGlAbstraction().SetNextTextureIds( ids );
313   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
314   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
315   Integration::ResourcePointer resource(bitmap);
316   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
317
318   if(request)
319   {
320     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
321   }
322   application.Render(16);
323   application.SendNotification();
324
325   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
326
327   // texture is not discarded
328   Stage::GetCurrent().Remove(actor);
329   application.Render(16);
330   application.SendNotification();
331   application.Render(16);
332   application.SendNotification();
333   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
334
335   // no load request when actor added back to stage
336   application.GetPlatform().ResetTrace();
337
338   Stage::GetCurrent().Add(actor);
339
340   application.SendNotification();
341   application.Render(16);
342   application.SendNotification();
343   application.Render(16);
344
345   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
346   END_TEST;
347 }
348
349 // 1.8
350 int UtcDaliImageNewDistanceField(void)
351 {
352   TestApplication application;
353
354   tet_infoline("UtcDaliImageNewDistanceField - Image::NewDistanceField(const std::string&)");
355
356   // invoke default handle constructor
357   Image image;
358
359   DALI_TEST_CHECK( !image );
360
361   // initialise handle
362   image = Image::NewDistanceField(gTestImageFilename);
363
364   DALI_TEST_CHECK( image );
365   END_TEST;
366 }
367
368 // 1.9
369 int UtcDaliImageNewDistanceFieldWithPolicies01(void)
370 {
371   TestApplication application;
372
373   // testing delayed loading
374   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies01 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Never");
375   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
376   Image image = Image::NewDistanceField(gTestImageFilename, Image::OnDemand, Image::Never);
377
378   DALI_TEST_CHECK( image );
379
380   application.SendNotification();
381   application.Render(16);
382
383   // request file loading only when actor added to stage
384   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
385
386   ImageActor actor = ImageActor::New(image);
387
388   Stage::GetCurrent().Add(actor);
389
390   application.SendNotification();
391   application.Render(16);
392
393   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
394
395   // testing ReleasePolicy::Never
396   // fake loading image
397   std::vector<GLuint> ids;
398   ids.push_back( 23 );
399   application.GetGlAbstraction().SetNextTextureIds( ids );
400   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
401   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
402   Integration::ResourcePointer resource(bitmap);
403   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
404
405   if(request)
406   {
407     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
408   }
409   application.Render(16);
410   application.SendNotification();
411
412   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
413
414   // never discard texture
415   Stage::GetCurrent().Remove(actor);
416   application.Render(16);
417   application.SendNotification();
418   application.Render(16);
419   application.SendNotification();
420   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
421   END_TEST;
422 }
423
424 // 1.10
425 int UtcDaliImageNewDistanceFieldWithPolicies02(void)
426 {
427   TestApplication application;
428
429   const Vector2 closestImageSize( 80, 45);
430   application.GetPlatform().SetClosestImageSize(closestImageSize);
431
432   // testing resource deletion when taken off stage
433   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies02 - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
434
435   Image image = Image::NewDistanceField(gTestImageFilename, Image::OnDemand, Image::Unused);
436
437   DALI_TEST_CHECK( image );
438
439   application.SendNotification();
440   application.Render(16);
441
442   // request file loading only when actor added to stage
443   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
444
445   ImageActor actor = ImageActor::New(image);
446
447   Stage::GetCurrent().Add(actor);
448
449   application.SendNotification();
450   application.Render(16);
451
452   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
453
454   // testing ReleasePolicy::Unused
455   // fake loading image
456   std::vector<GLuint> ids;
457   ids.push_back( 23 );
458   application.GetGlAbstraction().SetNextTextureIds( ids );
459   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
460   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
461   Integration::ResourcePointer resource(bitmap);
462   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
463
464   if(request)
465   {
466     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
467   }
468   application.Render(16);
469   application.SendNotification();
470
471   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
472
473   // discard texture when actor comes off stage
474   Stage::GetCurrent().Remove(actor);
475   application.Render(16);
476   application.SendNotification();
477   application.Render(16);
478   application.SendNotification();
479   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
480   END_TEST;
481 }
482
483 // 1.11
484 int UtcDaliImageNewDistanceFieldWithPolicies03(void)
485 {
486   TestApplication application;
487   const Vector2 closestImageSize( 80, 45);
488   application.GetPlatform().SetClosestImageSize(closestImageSize);
489
490   // load immediately -> resource deletion when taken off stage -> put actor back on stage -> load resource again
491   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies03 - Load image with LoadPolicy::Immediate, ReleasePolicy::Unused");
492
493   Image image = Image::NewDistanceField(gTestImageFilename, Image::Immediate, Image::Unused);
494
495   DALI_TEST_CHECK( image );
496
497   application.SendNotification();
498   application.Render(16);
499
500   // request file loading immediately
501   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
502
503   ImageActor actor = ImageActor::New(image);
504
505   Stage::GetCurrent().Add(actor);
506
507   application.SendNotification();
508   application.Render(16);
509
510   // testing ReleasePolicy::Unused
511   // fake loading image
512   std::vector<GLuint> ids;
513   ids.push_back( 23 );
514   application.GetGlAbstraction().SetNextTextureIds( ids );
515   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
516   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
517   Integration::ResourcePointer resource(bitmap);
518   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
519
520   if(request)
521   {
522     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
523   }
524   application.Render(16);
525   application.SendNotification();
526
527   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
528
529   // discard texture when actor comes off stage
530   Stage::GetCurrent().Remove(actor);
531   application.Render(16);
532   application.SendNotification();
533   application.Render(16);
534   application.SendNotification();
535   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
536
537   // check load request when actor added back to stage
538   application.GetPlatform().ResetTrace();
539
540   Stage::GetCurrent().Add(actor);
541
542   application.SendNotification();
543   application.Render(16);
544   application.SendNotification();
545   application.Render(16);
546
547   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
548   END_TEST;
549 }
550
551 // 1.12
552 int UtcDaliImageNewDistanceFieldWithPolicies04(void)
553 {
554   TestApplication application;
555
556   // load immediately, don't release texture when off stage
557   tet_infoline("UtcDaliImageNewDistanceFieldWithPolicies04 - Load image with LoadPolicy::Immediate, ReleasePolicy::Never");
558
559   Image image = Image::NewDistanceField(gTestImageFilename, Image::Immediate, Image::Never);
560
561   DALI_TEST_CHECK( image );
562
563   application.SendNotification();
564   application.Render(16);
565
566   // request file loading immediately
567   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
568
569   ImageActor actor = ImageActor::New(image);
570
571   Stage::GetCurrent().Add(actor);
572
573   application.SendNotification();
574   application.Render(16);
575
576   // testing ReleasePolicy::Never
577   // fake loading image
578   std::vector<GLuint> ids;
579   ids.push_back( 23 );
580   application.GetGlAbstraction().SetNextTextureIds( ids );
581   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
582   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
583   Integration::ResourcePointer resource(bitmap);
584   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
585
586   if(request)
587   {
588     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
589   }
590   application.Render(16);
591   application.SendNotification();
592
593   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
594
595   // texture is not discarded
596   Stage::GetCurrent().Remove(actor);
597   application.Render(16);
598   application.SendNotification();
599   application.Render(16);
600   application.SendNotification();
601   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
602
603   // no load request when actor added back to stage
604   application.GetPlatform().ResetTrace();
605
606   Stage::GetCurrent().Add(actor);
607
608   application.SendNotification();
609   application.Render(16);
610   application.SendNotification();
611   application.Render(16);
612
613   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
614   END_TEST;
615 }
616
617 // 1.13
618 int UtcDaliImageNewDistanceFieldWithAttributes(void)
619 {
620   TestApplication application;
621
622   tet_infoline("UtcDaliImageNewDistanceFieldWithAttributes - Image::NewDistanceField(const std::string&, const ImageAttributes& attributes)");
623
624   // invoke default handle constructor
625   Image image;
626   Dali::ImageAttributes imageAttributes = Dali::ImageAttributes::NewDistanceField(6.0f, 12);
627
628   DALI_TEST_CHECK( !image );
629
630   // initialise handle
631   image = Image::NewDistanceField(gTestImageFilename, imageAttributes);
632
633   DALI_TEST_CHECK( image );
634   END_TEST;
635 }
636
637 // 1.14
638 int UtcDaliImageNewDistanceFieldWithAttrandPol(void)
639 {
640   TestApplication application;
641
642   const Vector2 closestImageSize( 80, 45);
643   application.GetPlatform().SetClosestImageSize(closestImageSize);
644
645   tet_infoline("UtcDaliImageNewDistanceFieldWithAttrandPol - Load image with LoadPolicy::OnDemand, ReleasePolicy::Unused");
646
647   Dali::ImageAttributes imageAttributes = Dali::ImageAttributes::NewDistanceField(6.0f, 12);
648
649   Image image = Image::NewDistanceField(gTestImageFilename, imageAttributes, Image::OnDemand, Image::Unused);
650
651   DALI_TEST_CHECK( image );
652
653   application.SendNotification();
654   application.Render(16);
655
656   // request file loading only when actor added to stage
657   DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
658
659   ImageActor actor = ImageActor::New(image);
660
661   Stage::GetCurrent().Add(actor);
662
663   application.SendNotification();
664   application.Render(16);
665
666   DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
667
668   // testing ReleasePolicy::Unused
669   // fake loading image
670   std::vector<GLuint> ids;
671   ids.push_back( 23 );
672   application.GetGlAbstraction().SetNextTextureIds( ids );
673   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
674   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
675   Integration::ResourcePointer resource(bitmap);
676   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
677
678   if(request)
679   {
680     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
681   }
682   application.Render(16);
683   application.SendNotification();
684
685   DALI_TEST_CHECK ( !application.GetGlAbstraction().CheckTextureDeleted(23) );
686
687   // discard texture when actor comes off stage
688   Stage::GetCurrent().Remove(actor);
689   application.Render(16);
690   application.SendNotification();
691   application.Render(16);
692   application.SendNotification();
693   DALI_TEST_CHECK ( application.GetGlAbstraction().CheckTextureDeleted(23) );
694   END_TEST;
695 }
696
697 // 1.15
698 int UtcDaliImageDownCast(void)
699 {
700   TestApplication application;
701   tet_infoline("Testing Dali::Image::DownCast()");
702
703   Image image = Image::New(gTestImageFilename);
704
705   BaseHandle object(image);
706
707   Image image2 = Image::DownCast(object);
708   DALI_TEST_CHECK(image2);
709
710   Image image3 = DownCast< Image >(object);
711   DALI_TEST_CHECK(image3);
712
713   BaseHandle unInitializedObject;
714   Image image4 = Image::DownCast(unInitializedObject);
715   DALI_TEST_CHECK(!image4);
716
717   Image image5 = DownCast< Image >(unInitializedObject);
718   DALI_TEST_CHECK(!image5);
719   END_TEST;
720 }
721
722 // 1.16
723 int UtcDaliImageGetImageSize(void)
724 {
725   TestApplication application;
726   TestPlatformAbstraction& platform = application.GetPlatform();
727
728   tet_infoline("UtcDaliImageGetImageSize - Image::GetImageSize()");
729
730   Vector2 testSize(8.0f, 16.0f);
731   platform.SetClosestImageSize(testSize);
732
733   Vector2 size = Image::GetImageSize(gTestImageFilename);
734
735   DALI_TEST_CHECK( application.GetPlatform().GetTrace().FindMethod("GetClosestImageSize"));
736   DALI_TEST_EQUALS( size, testSize, TEST_LOCATION);
737   END_TEST;
738 }
739
740 // 1.17
741 int UtcDaliImageGetFilename(void)
742 {
743   TestApplication application;
744
745   tet_infoline("UtcDaliImageGetFilename");
746
747   // invoke default handle constructor
748   Image image;
749
750   DALI_TEST_CHECK( !image );
751
752   // initialise handle
753   image = Image::New(gTestImageFilename);
754
755   DALI_TEST_EQUALS( image.GetFilename(), gTestImageFilename, TEST_LOCATION);
756   END_TEST;
757 }
758
759 // 1.18
760 int UtcDaliImageGetLoadingState01(void)
761 {
762   TestApplication application;
763   tet_infoline("UtcDaliImageGetLoadingState01");
764
765   Image image = Image::New(gTestImageFilename);
766   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoading);
767   application.SendNotification();
768   application.Render(16);
769
770   // simulate load success
771   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
772   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
773   Integration::ResourcePointer resource(bitmap);
774   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
775
776   if(request)
777   {
778     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
779   }
780   application.Render(16);
781   application.SendNotification();
782
783   // Test state == ResourceLoadingSucceeded
784   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoadingSucceeded);
785   END_TEST;
786 }
787
788 // 1.19
789 int UtcDaliImageGetLoadingState02(void)
790 {
791   TestApplication application;
792
793   tet_infoline("UtcDaliImageGetLoadingState02");
794
795   // invoke default handle constructor
796   Image image;
797
798   DALI_TEST_CHECK( !image );
799
800   // initialise handle
801   image = Image::New(gTestImageFilename);
802
803   // Test state == ResourceLoading
804   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoading);
805   application.SendNotification();
806   application.Render(16);
807
808   // simulate load failure
809   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
810   if(request)
811   {
812     application.GetPlatform().SetResourceLoadFailed(request->GetId(), Integration::FailureUnknown);
813   }
814   application.Render(16);
815   application.SendNotification();
816
817   // Test state == ResourceLoadingFailed
818   DALI_TEST_CHECK(image.GetLoadingState() == ResourceLoadingFailed);
819   END_TEST;
820 }
821
822 // 1.20
823 int UtcDaliImageGetReleasePolicy(void)
824 {
825   TestApplication application;
826
827   tet_infoline("UtcDaliImageGetReleasePolicy");
828
829   Image image = Image::New(gTestImageFilename, Image::Immediate, Image::Unused);
830
831   DALI_TEST_CHECK( image );
832
833   DALI_TEST_CHECK( Image::Unused == image.GetReleasePolicy() );
834
835   END_TEST;
836 }
837
838 // 1.21
839 int UtcDaliImageGetLoadPolicy(void)
840 {
841   TestApplication application;
842
843   tet_infoline("UtcDaliImageGetLoadPolicy");
844
845   Image image = Image::New(gTestImageFilename, Image::OnDemand, Image::Never);
846
847   DALI_TEST_CHECK( image );
848
849   DALI_TEST_CHECK( Image::OnDemand == image.GetLoadPolicy());
850   END_TEST;
851 }
852
853 static bool SignalLoadFlag = false;
854
855 static void SignalLoadHandler(Image image)
856 {
857   tet_infoline("Received image load finished signal");
858
859   SignalLoadFlag = true;
860 }
861
862 static bool SignalUploadedFlag = false;
863
864 static void SignalUploadedHandler(Image image)
865 {
866   tet_infoline("Received image uploaded signal");
867
868   SignalUploadedFlag = true;
869 }
870
871 // 1.22
872 int UtcDaliImageSignalLoadingFinished(void)
873 {
874   TestApplication application;
875
876   tet_infoline("UtcDaliImageSignalLoadingFinished");
877
878   SignalLoadFlag = false;
879
880   Image image = Image::New(gTestImageFilename);
881
882   image.LoadingFinishedSignal().Connect( SignalLoadHandler );
883   application.SendNotification();
884   application.Render(16);
885
886   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
887   if(request)
888   {
889     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, Integration::ResourcePointer(Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD)));
890   }
891
892   application.Render(16);
893   application.SendNotification();
894
895   DALI_TEST_CHECK( SignalLoadFlag == true );
896   END_TEST;
897 }
898
899 // 1.23
900 int UtcDaliImageSignalUploaded(void)
901 {
902   TestApplication application;
903   tet_infoline("UtcDaliImageSignalUploaded - Image::SignalUploaded()");
904
905   // set up image in fake platform abstraction
906   Vector2 testSize(80.0f, 80.0f);
907   application.GetPlatform().SetClosestImageSize(testSize);
908
909   Image image = Image::New(gTestImageFilename);
910   image.LoadingFinishedSignal().Connect( SignalLoadHandler );
911
912   // Load image
913   application.SendNotification();
914   application.Render(16);
915   std::vector<GLuint> ids;
916   ids.push_back( 23 );
917   application.GetGlAbstraction().SetNextTextureIds( ids );
918   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
919   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
920   Integration::ResourcePointer resource(bitmap);
921   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
922   if(request)
923   {
924     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
925   }
926   application.Render(16);
927   application.SendNotification();
928
929   image.UploadedSignal().Connect( SignalUploadedHandler );
930
931   Dali::ImageActor imageActor = ImageActor::New(image);
932   Stage::GetCurrent().Add(imageActor);
933   imageActor.SetSize(80, 80);
934   imageActor.SetVisible(true);
935
936   application.SendNotification();
937   application.Render(0);
938   application.Render(16);
939   application.SendNotification();
940   application.Render(16);
941   application.SendNotification();
942   application.Render(16);
943   application.SendNotification();
944   application.Render(16);
945   application.SendNotification();
946
947   DALI_TEST_CHECK( SignalLoadFlag == true );
948   DALI_TEST_CHECK( SignalUploadedFlag == true );
949   SignalLoadFlag = false;
950   SignalUploadedFlag = false;
951
952   image.Reload();
953   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 160, 160, 160, 160);
954
955   application.SendNotification();
956   application.Render(16);
957   application.Render(16);
958   application.SendNotification();
959   DALI_TEST_CHECK( SignalLoadFlag == true );
960
961   application.Render(16);
962   application.SendNotification();
963   application.Render(16);
964   application.SendNotification();
965   DALI_TEST_CHECK( SignalUploadedFlag == true );
966   END_TEST;
967 }
968
969
970 // 1.24
971 int UtcDaliImageDiscard01(void)
972 {
973   TestApplication application;
974   tet_infoline("UtcDaliImageDiscard01 - no actors");
975
976   {
977     Image image = Image::New(gTestImageFilename);
978
979     // Load image
980     application.SendNotification();
981     application.Render(16);
982     std::vector<GLuint> ids;
983     ids.push_back( 23 );
984     application.GetGlAbstraction().SetNextTextureIds( ids );
985     Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
986     Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
987     Integration::ResourcePointer resource(bitmap);
988     bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
989     if(request)
990     {
991     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
992     }
993     application.Render(16);
994     application.SendNotification();
995   } // Drop image handle
996
997   application.SendNotification();
998   application.Render(16);
999   application.Render(16);
1000   application.SendNotification();
1001
1002   // Shouldn't have been sent to GL...
1003   const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
1004   DALI_TEST_CHECK( texIds.size() == 1 );
1005   DALI_TEST_CHECK( texIds[0] == 23 );
1006   END_TEST;
1007 }
1008
1009 // 1.25
1010 int UtcDaliImageDiscard02(void)
1011 {
1012   TestApplication application;
1013   application.GetGlAbstraction().EnableTextureCallTrace( true );
1014   tet_infoline("UtcDaliImageDiscard02 - one actor, tests TextureCache::DiscardTexture");
1015
1016   {
1017     {
1018       ImageActor actor;
1019       {
1020         ImageAttributes attrs;
1021         const Vector2 requestedSize( 40, 30 );
1022         attrs.SetSize( requestedSize.width, requestedSize.height );
1023         Image image = Image::New(gTestImageFilename, attrs);
1024         actor = ImageActor::New(image);
1025         Stage::GetCurrent().Add(actor);
1026
1027         application.SendNotification();
1028         application.Render(16);
1029
1030         std::vector<GLuint> ids;
1031         ids.push_back( 23 );
1032         application.GetGlAbstraction().SetNextTextureIds( ids );
1033
1034         Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
1035         Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
1036         Integration::ResourcePointer resource(bitmap);
1037         bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
1038         if(request)
1039         {
1040           application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
1041         }
1042         application.Render(16);
1043         application.SendNotification();
1044         DALI_TEST_CHECK( application.GetGlAbstraction().GetTextureTrace().FindMethod("BindTexture") );
1045       } // lose image handle, actor should still keep one
1046       application.SendNotification();
1047       application.Render(16);
1048
1049       Stage::GetCurrent().Remove(actor);
1050       application.SendNotification();
1051       application.Render(16);
1052     } // lose actor
1053     application.SendNotification();
1054     application.Render(16);
1055   }
1056
1057   // Cleanup
1058   application.SendNotification();
1059   application.Render(16);
1060   application.Render(16);
1061   application.SendNotification();
1062
1063   // texture should have been removed:
1064   DALI_TEST_CHECK( application.GetGlAbstraction().CheckTextureDeleted( 23 ));
1065   END_TEST;
1066 }
1067
1068 // 1.26
1069 int UtcDaliImageDiscard03(void)
1070 {
1071   TestApplication application;
1072   tet_infoline("UtcDaliImageDiscard03 - one actor, tests TextureCache::RemoveObserver");
1073
1074   const Vector2 closestImageSize( 1, 1);
1075   application.GetPlatform().SetClosestImageSize(closestImageSize);
1076
1077   Image image = Image::New(gTestImageFilename);
1078   ImageActor actor = ImageActor::New(image);
1079   Stage::GetCurrent().Add(actor);
1080
1081   application.SendNotification();
1082   application.Render(16);
1083
1084   std::vector<GLuint> ids;
1085   ids.push_back( 23 );
1086   application.GetGlAbstraction().SetNextTextureIds( ids );
1087
1088   Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
1089   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
1090
1091   Integration::ResourcePointer resource(bitmap);
1092   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
1093   if(request)
1094   {
1095     application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
1096   }
1097   application.Render(16);
1098   application.SendNotification();
1099   application.SendNotification();
1100   application.Render(16);
1101
1102   const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
1103   DALI_TEST_CHECK( texIds.size() == 0 );
1104   const std::vector<GLuint>& boundTexIds = application.GetGlAbstraction().GetBoundTextures();
1105   DALI_TEST_CHECK( boundTexIds[0] == 23 );
1106
1107   Stage::GetCurrent().Remove(actor);
1108   application.SendNotification();
1109   application.Render(16);
1110   application.SendNotification();
1111   application.Render(16);
1112   application.SendNotification();
1113   application.Render(16); // Should remove image renderer
1114
1115   END_TEST;
1116 }
1117
1118
1119 namespace
1120 {
1121 void LoadBitmapResource(TestPlatformAbstraction& platform)
1122 {
1123   Integration::ResourceRequest* request = platform.GetRequest();
1124   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
1125   Integration::ResourcePointer resource(bitmap);
1126   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
1127
1128   if(request)
1129   {
1130     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
1131   }
1132 }
1133
1134 }
1135
1136 int UtcDaliImageContextLoss(void)
1137 {
1138   TestApplication application; // Default config: DALI_DISCARDS_ALL_DATA
1139
1140   const Vector2 closestImageSize( 80, 80 );
1141   TestPlatformAbstraction& platform = application.GetPlatform();
1142   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
1143
1144   platform.SetClosestImageSize(closestImageSize);
1145
1146   tet_infoline("UtcDaliImageContextLoss - Load image with LoadPolicy::Immediate, ReleasePolicy::Never, bitmap discard. Check that the image is re-requested on context regain\n");
1147
1148   Image image = Image::New("image.png", Image::Immediate, Image::Never);
1149
1150   DALI_TEST_CHECK( image );
1151
1152   application.SendNotification();
1153   application.Render(16);
1154
1155   // request file loading immediately
1156
1157   DALI_TEST_CHECK( platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
1158   ImageActor actor = ImageActor::New(image);
1159   Stage::GetCurrent().Add(actor);
1160
1161   application.SendNotification();
1162   application.Render(16);
1163
1164   TraceCallStack& textureTrace = glAbstraction.GetTextureTrace();
1165   textureTrace.Enable(true);
1166
1167   std::vector<GLuint> ids;
1168   ids.push_back( 23 );
1169   glAbstraction.SetNextTextureIds( ids );
1170
1171   LoadBitmapResource(platform);
1172
1173   application.Render(16);
1174   application.SendNotification();
1175
1176   DALI_TEST_CHECK( textureTrace.FindMethod("GenTextures") );
1177
1178   textureTrace.Reset();
1179   textureTrace.Enable(true);
1180   platform.ResetTrace();
1181   platform.EnableTrace(true);
1182
1183   // Lose & regain context (in render 'thread')
1184   application.ResetContext();
1185
1186   application.GetCore().RecoverFromContextLoss(); // start the recovery process
1187   application.SendNotification();
1188
1189   // Run update/render loop
1190   application.Render(16);
1191   application.SendNotification();
1192
1193   // Expect new load request
1194   DALI_TEST_CHECK( platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
1195
1196   // Finish loading image
1197   LoadBitmapResource(platform);
1198   ids.clear();
1199   ids.push_back( 57 );
1200   glAbstraction.SetNextTextureIds(ids);
1201
1202   // Run update/render loop
1203   application.Render(16);
1204   application.SendNotification();
1205
1206   // Expect new GenTextures
1207   DALI_TEST_CHECK( textureTrace.FindMethod("GenTextures") );
1208
1209   END_TEST;
1210 }