Merge remote-tracking branch 'origin/tizen' into new_text
[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 namespace
40 {
41 void LoadBitmapResource(TestPlatformAbstraction& platform)
42 {
43   Integration::ResourceRequest* request = platform.GetRequest();
44   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
45   Integration::ResourcePointer resource(bitmap);
46   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
47
48   if(request)
49   {
50     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
51   }
52 }
53
54 }
55
56 int UtcDaliImageDownCast(void)
57 {
58   TestApplication application;
59   tet_infoline("Testing Dali::Image::DownCast()");
60
61   Image image = ResourceImage::New(gTestImageFilename);
62
63   BaseHandle object(image);
64
65   Image image2 = Image::DownCast(object);
66   DALI_TEST_CHECK(image2);
67
68   Image image3 = DownCast< Image >(object);
69   DALI_TEST_CHECK(image3);
70
71   BaseHandle unInitializedObject;
72   Image image4 = Image::DownCast(unInitializedObject);
73   DALI_TEST_CHECK(!image4);
74
75   Image image5 = DownCast< Image >(unInitializedObject);
76   DALI_TEST_CHECK(!image5);
77   END_TEST;
78 }
79
80 int UtcDaliImageGetReleasePolicy(void)
81 {
82   TestApplication application;
83
84   tet_infoline("UtcDaliImageGetReleasePolicy");
85
86   Image image = ResourceImage::New(gTestImageFilename, ResourceImage::IMMEDIATE, Image::UNUSED);
87
88   DALI_TEST_CHECK( image );
89
90   DALI_TEST_CHECK( Image::UNUSED == image.GetReleasePolicy() );
91
92   END_TEST;
93 }
94
95 int UtcDaliImageGetWidthHeight(void)
96 {
97   TestApplication application;
98
99   tet_infoline("UtcDaliImageGetWidthHeight - Image::GetWidth() & Image::GetHeight");
100
101   Vector2 testSize(8.0f, 16.0f);
102   application.GetPlatform().SetClosestImageSize(testSize);
103   Image image1 = ResourceImage::New(gTestImageFilename);
104   DALI_TEST_EQUALS( image1.GetWidth(), testSize.width, TEST_LOCATION );
105   DALI_TEST_EQUALS( image1.GetHeight(), testSize.height, TEST_LOCATION );
106
107   Dali::ImageAttributes imageAttributes;
108   imageAttributes.SetSize(128, 256);
109   imageAttributes.SetScalingMode(Dali::ImageAttributes::FitHeight);
110   Image image2 = ResourceImage::New(gTestImageFilename, imageAttributes);
111   DALI_TEST_EQUALS( image2.GetWidth(), 128u, TEST_LOCATION );
112   DALI_TEST_EQUALS( image2.GetHeight(), 256u, TEST_LOCATION );
113
114   Image image3 = FrameBufferImage::New(16, 32);
115   DALI_TEST_EQUALS(image3.GetWidth(), 16u, TEST_LOCATION);
116   DALI_TEST_EQUALS(image3.GetHeight(), 32u, TEST_LOCATION);
117
118   TestNativeImagePointer nativeImage = TestNativeImage::New(32, 64);
119   Image image4 = NativeImage::New(*(nativeImage.Get()));
120   DALI_TEST_EQUALS(image4.GetWidth(), 32u, TEST_LOCATION);
121   DALI_TEST_EQUALS(image4.GetHeight(), 64u, TEST_LOCATION);
122
123   END_TEST;
124 }
125
126 static bool SignalUploadedFlag = false;
127
128 static void SignalUploadedHandler(Image image)
129 {
130   tet_infoline("Received image uploaded signal");
131
132   SignalUploadedFlag = true;
133 }
134
135 int UtcDaliImageSignalUploaded(void)
136 {
137   TestApplication application;
138   TestPlatformAbstraction& platform = application.GetPlatform();
139   tet_infoline("UtcDaliImageSignalUploaded - Image::SignalUploaded()");
140
141   // set up image in fake platform abstraction
142   Vector2 testSize(80.0f, 80.0f);
143   platform.SetClosestImageSize(testSize);
144
145   ResourceImage image = ResourceImage::New(gTestImageFilename);
146
147   // Load image
148   application.SendNotification();
149   application.Render(16);
150   std::vector<GLuint> ids;
151   ids.push_back( 23 );
152   application.GetGlAbstraction().SetNextTextureIds( ids );
153   Integration::ResourceRequest* request = platform.GetRequest();
154   Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
155   Integration::ResourcePointer resource(bitmap);
156   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
157
158   if(request)
159   {
160     platform.SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
161   }
162   application.Render(16);
163   application.SendNotification();
164
165   image.UploadedSignal().Connect( SignalUploadedHandler );
166
167   Dali::ImageActor imageActor = ImageActor::New(image);
168   Stage::GetCurrent().Add(imageActor);
169   imageActor.SetSize(80, 80);
170   imageActor.SetVisible(true);
171
172   application.SendNotification();
173   application.Render(0);
174   application.Render(16);
175   application.SendNotification();
176   application.Render(16);
177   application.SendNotification();
178   application.Render(16);
179   application.SendNotification();
180   application.Render(16);
181   application.SendNotification();
182
183   DALI_TEST_CHECK( SignalUploadedFlag == true );
184   SignalUploadedFlag = false;
185
186   image.Reload();
187   bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 160, 160, 160, 160);
188
189   // image loading
190   application.SendNotification();
191   application.Render(16);
192   application.Render(16);
193   application.SendNotification();
194
195   //upload
196   application.Render(16);
197   application.SendNotification();
198   application.Render(16);
199   application.SendNotification();
200   DALI_TEST_CHECK( SignalUploadedFlag == true );
201   END_TEST;
202 }
203
204 int UtcDaliImageDiscard01(void)
205 {
206   TestApplication application;
207   tet_infoline("UtcDaliImageDiscard01 - no actors");
208
209   {
210     Image image = ResourceImage::New(gTestImageFilename);
211
212     // Load image
213     application.SendNotification();
214     application.Render(16);
215     std::vector<GLuint> ids;
216     ids.push_back( 23 );
217     application.GetGlAbstraction().SetNextTextureIds( ids );
218     TestPlatformAbstraction& platform = application.GetPlatform();
219     LoadBitmapResource( platform );
220     application.Render(16);
221     application.SendNotification();
222   } // Drop image handle
223
224   application.SendNotification();
225   application.Render(16);
226   application.Render(16);
227   application.SendNotification();
228
229   // Shouldn't have been sent to GL...
230   const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
231   DALI_TEST_CHECK( texIds.size() == 1 );
232   DALI_TEST_CHECK( texIds[0] == 23 );
233   END_TEST;
234 }
235
236 int UtcDaliImageDiscard02(void)
237 {
238   TestApplication application;
239   application.GetGlAbstraction().EnableTextureCallTrace( true );
240   tet_infoline("UtcDaliImageDiscard02 - one actor, tests TextureCache::DiscardTexture");
241
242   {
243     {
244       ImageActor actor;
245       {
246         ImageAttributes attrs;
247         const Vector2 requestedSize( 40, 30 );
248         attrs.SetSize( requestedSize.width, requestedSize.height );
249         Image image = ResourceImage::New(gTestImageFilename, attrs);
250         actor = ImageActor::New(image);
251         Stage::GetCurrent().Add(actor);
252
253         application.SendNotification();
254         application.Render(16);
255
256         std::vector<GLuint> ids;
257         ids.push_back( 23 );
258         application.GetGlAbstraction().SetNextTextureIds( ids );
259
260         TestPlatformAbstraction& platform = application.GetPlatform();
261         LoadBitmapResource( platform );
262         application.Render(16);
263         application.SendNotification();
264         DALI_TEST_CHECK( application.GetGlAbstraction().GetTextureTrace().FindMethod("BindTexture") );
265       } // lose image handle, actor should still keep one
266       application.SendNotification();
267       application.Render(16);
268
269       Stage::GetCurrent().Remove(actor);
270       application.SendNotification();
271       application.Render(16);
272     } // lose actor
273     application.SendNotification();
274     application.Render(16);
275   }
276
277   // Cleanup
278   application.SendNotification();
279   application.Render(16);
280   application.Render(16);
281   application.SendNotification();
282
283   // texture should have been removed:
284   DALI_TEST_CHECK( application.GetGlAbstraction().CheckTextureDeleted( 23 ));
285   END_TEST;
286 }
287
288 int UtcDaliImageDiscard03(void)
289 {
290   TestApplication application;
291   tet_infoline("UtcDaliImageDiscard03 - one actor, tests TextureCache::RemoveObserver");
292
293   const Vector2 closestImageSize( 1, 1);
294   application.GetPlatform().SetClosestImageSize(closestImageSize);
295
296   Image image = ResourceImage::New(gTestImageFilename);
297   ImageActor actor = ImageActor::New(image);
298   Stage::GetCurrent().Add(actor);
299
300   application.SendNotification();
301   application.Render(16);
302
303   std::vector<GLuint> ids;
304   ids.push_back( 23 );
305   application.GetGlAbstraction().SetNextTextureIds( ids );
306
307   TestPlatformAbstraction& platform = application.GetPlatform();
308   LoadBitmapResource( platform );
309   application.Render(16);
310   application.SendNotification();
311   application.SendNotification();
312   application.Render(16);
313
314   const std::vector<GLuint>& texIds = application.GetGlAbstraction().GetNextTextureIds();
315   DALI_TEST_CHECK( texIds.size() == 0 );
316   const std::vector<GLuint>& boundTexIds = application.GetGlAbstraction().GetBoundTextures();
317   DALI_TEST_CHECK( boundTexIds[0] == 23 );
318
319   Stage::GetCurrent().Remove(actor);
320   application.SendNotification();
321   application.Render(16);
322   application.SendNotification();
323   application.Render(16);
324   application.SendNotification();
325   application.Render(16); // Should remove image renderer
326
327   END_TEST;
328 }
329
330 int UtcDaliImageContextLoss(void)
331 {
332   TestApplication application; // Default config: DALI_DISCARDS_ALL_DATA
333
334   const Vector2 closestImageSize( 80, 80 );
335   TestPlatformAbstraction& platform = application.GetPlatform();
336   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
337
338   platform.SetClosestImageSize(closestImageSize);
339
340   tet_infoline("UtcDaliImageContextLoss - Load image with LoadPolicy::Immediate, ReleasePolicy::Never, bitmap discard. Check that the image is re-requested on context regain\n");
341
342   Image image = ResourceImage::New("image.png", ResourceImage::IMMEDIATE, Image::NEVER);
343
344   DALI_TEST_CHECK( image );
345
346   application.SendNotification();
347   application.Render(16);
348
349   // request file loading immediately
350
351   DALI_TEST_CHECK( platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
352   ImageActor actor = ImageActor::New(image);
353   Stage::GetCurrent().Add(actor);
354
355   application.SendNotification();
356   application.Render(16);
357
358   TraceCallStack& textureTrace = glAbstraction.GetTextureTrace();
359   textureTrace.Enable(true);
360
361   std::vector<GLuint> ids;
362   ids.push_back( 23 );
363   glAbstraction.SetNextTextureIds( ids );
364
365   LoadBitmapResource(platform);
366
367   application.Render(16);
368   application.SendNotification();
369
370   DALI_TEST_CHECK( textureTrace.FindMethod("GenTextures") );
371
372   textureTrace.Reset();
373   textureTrace.Enable(true);
374   platform.ResetTrace();
375   platform.EnableTrace(true);
376
377   // Lose & regain context (in render 'thread')
378   application.ResetContext();
379
380   application.GetCore().RecoverFromContextLoss(); // start the recovery process
381   application.SendNotification();
382
383   // Run update/render loop
384   application.Render(16);
385   application.SendNotification();
386
387   // Expect new load request
388   DALI_TEST_CHECK( platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
389
390   // Finish loading image
391   LoadBitmapResource(platform);
392   ids.clear();
393   ids.push_back( 57 );
394   glAbstraction.SetNextTextureIds(ids);
395
396   // Run update/render loop
397   application.Render(16);
398   application.SendNotification();
399
400   // Expect new GenTextures
401   DALI_TEST_CHECK( textureTrace.FindMethod("GenTextures") );
402
403   END_TEST;
404 }