2 * Copyright (c) 2014 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.
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23 #include <test-native-image.h>
27 void utc_dali_image_startup(void)
29 test_return_value = TET_UNDEF;
32 void utc_dali_image_cleanup(void)
34 test_return_value = TET_PASS;
37 static const char* gTestImageFilename = "icon_wrt.png";
41 void LoadBitmapResource(TestPlatformAbstraction& platform)
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);
50 platform.SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
56 int UtcDaliImageDownCast(void)
58 TestApplication application;
59 tet_infoline("Testing Dali::Image::DownCast()");
61 Image image = ResourceImage::New(gTestImageFilename);
63 BaseHandle object(image);
65 Image image2 = Image::DownCast(object);
66 DALI_TEST_CHECK(image2);
68 Image image3 = DownCast< Image >(object);
69 DALI_TEST_CHECK(image3);
71 BaseHandle unInitializedObject;
72 Image image4 = Image::DownCast(unInitializedObject);
73 DALI_TEST_CHECK(!image4);
75 Image image5 = DownCast< Image >(unInitializedObject);
76 DALI_TEST_CHECK(!image5);
80 int UtcDaliImageGetReleasePolicy(void)
82 TestApplication application;
84 tet_infoline("UtcDaliImageGetReleasePolicy");
86 Image image = ResourceImage::New(gTestImageFilename, ResourceImage::IMMEDIATE, Image::UNUSED);
88 DALI_TEST_CHECK( image );
90 DALI_TEST_CHECK( Image::UNUSED == image.GetReleasePolicy() );
95 int UtcDaliImageGetWidthHeight(void)
97 TestApplication application;
99 tet_infoline("UtcDaliImageGetWidthHeight - Image::GetWidth() & Image::GetHeight");
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 );
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 );
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);
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);
126 static bool SignalUploadedFlag = false;
128 static void SignalUploadedHandler(Image image)
130 tet_infoline("Received image uploaded signal");
132 SignalUploadedFlag = true;
135 int UtcDaliImageSignalUploaded(void)
137 TestApplication application;
138 TestPlatformAbstraction& platform = application.GetPlatform();
139 tet_infoline("UtcDaliImageSignalUploaded - Image::SignalUploaded()");
141 // set up image in fake platform abstraction
142 Vector2 testSize(80.0f, 80.0f);
143 platform.SetClosestImageSize(testSize);
145 ResourceImage image = ResourceImage::New(gTestImageFilename);
148 application.SendNotification();
149 application.Render(16);
150 std::vector<GLuint> ids;
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);
160 platform.SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
162 application.Render(16);
163 application.SendNotification();
165 image.UploadedSignal().Connect( SignalUploadedHandler );
167 Dali::ImageActor imageActor = ImageActor::New(image);
168 Stage::GetCurrent().Add(imageActor);
169 imageActor.SetSize(80, 80);
170 imageActor.SetVisible(true);
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();
183 DALI_TEST_CHECK( SignalUploadedFlag == true );
184 SignalUploadedFlag = false;
187 bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 160, 160, 160, 160);
190 application.SendNotification();
191 application.Render(16);
192 application.Render(16);
193 application.SendNotification();
196 application.Render(16);
197 application.SendNotification();
198 application.Render(16);
199 application.SendNotification();
200 DALI_TEST_CHECK( SignalUploadedFlag == true );
204 int UtcDaliImageDiscard01(void)
206 TestApplication application;
207 tet_infoline("UtcDaliImageDiscard01 - no actors");
210 Image image = ResourceImage::New(gTestImageFilename);
213 application.SendNotification();
214 application.Render(16);
215 std::vector<GLuint> ids;
217 application.GetGlAbstraction().SetNextTextureIds( ids );
218 TestPlatformAbstraction& platform = application.GetPlatform();
219 LoadBitmapResource( platform );
220 application.Render(16);
221 application.SendNotification();
222 } // Drop image handle
224 application.SendNotification();
225 application.Render(16);
226 application.Render(16);
227 application.SendNotification();
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 );
236 int UtcDaliImageDiscard02(void)
238 TestApplication application;
239 application.GetGlAbstraction().EnableTextureCallTrace( true );
240 tet_infoline("UtcDaliImageDiscard02 - one actor, tests TextureCache::DiscardTexture");
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);
253 application.SendNotification();
254 application.Render(16);
256 std::vector<GLuint> ids;
258 application.GetGlAbstraction().SetNextTextureIds( ids );
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);
269 Stage::GetCurrent().Remove(actor);
270 application.SendNotification();
271 application.Render(16);
273 application.SendNotification();
274 application.Render(16);
278 application.SendNotification();
279 application.Render(16);
280 application.Render(16);
281 application.SendNotification();
283 // texture should have been removed:
284 DALI_TEST_CHECK( application.GetGlAbstraction().CheckTextureDeleted( 23 ));
288 int UtcDaliImageDiscard03(void)
290 TestApplication application;
291 tet_infoline("UtcDaliImageDiscard03 - one actor, tests TextureCache::RemoveObserver");
293 const Vector2 closestImageSize( 1, 1);
294 application.GetPlatform().SetClosestImageSize(closestImageSize);
296 Image image = ResourceImage::New(gTestImageFilename);
297 ImageActor actor = ImageActor::New(image);
298 Stage::GetCurrent().Add(actor);
300 application.SendNotification();
301 application.Render(16);
303 std::vector<GLuint> ids;
305 application.GetGlAbstraction().SetNextTextureIds( ids );
307 TestPlatformAbstraction& platform = application.GetPlatform();
308 LoadBitmapResource( platform );
309 application.Render(16);
310 application.SendNotification();
311 application.SendNotification();
312 application.Render(16);
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 );
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
330 int UtcDaliImageContextLoss(void)
332 TestApplication application; // Default config: DALI_DISCARDS_ALL_DATA
334 const Vector2 closestImageSize( 80, 80 );
335 TestPlatformAbstraction& platform = application.GetPlatform();
336 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
338 platform.SetClosestImageSize(closestImageSize);
340 tet_infoline("UtcDaliImageContextLoss - Load image with LoadPolicy::Immediate, ReleasePolicy::Never, bitmap discard. Check that the image is re-requested on context regain\n");
342 Image image = ResourceImage::New("image.png", ResourceImage::IMMEDIATE, Image::NEVER);
344 DALI_TEST_CHECK( image );
346 application.SendNotification();
347 application.Render(16);
349 // request file loading immediately
351 DALI_TEST_CHECK( platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
352 ImageActor actor = ImageActor::New(image);
353 Stage::GetCurrent().Add(actor);
355 application.SendNotification();
356 application.Render(16);
358 TraceCallStack& textureTrace = glAbstraction.GetTextureTrace();
359 textureTrace.Enable(true);
361 std::vector<GLuint> ids;
363 glAbstraction.SetNextTextureIds( ids );
365 LoadBitmapResource(platform);
367 application.Render(16);
368 application.SendNotification();
370 DALI_TEST_CHECK( textureTrace.FindMethod("GenTextures") );
372 textureTrace.Reset();
373 textureTrace.Enable(true);
374 platform.ResetTrace();
375 platform.EnableTrace(true);
377 // Lose & regain context (in render 'thread')
378 application.ResetContext();
380 application.GetCore().RecoverFromContextLoss(); // start the recovery process
381 application.SendNotification();
383 // Run update/render loop
384 application.Render(16);
385 application.SendNotification();
387 // Expect new load request
388 DALI_TEST_CHECK( platform.WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
390 // Finish loading image
391 LoadBitmapResource(platform);
394 glAbstraction.SetNextTextureIds(ids);
396 // Run update/render loop
397 application.Render(16);
398 application.SendNotification();
400 // Expect new GenTextures
401 DALI_TEST_CHECK( textureTrace.FindMethod("GenTextures") );