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.
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <toolkit-event-thread-callback.h>
24 #include <toolkit-timer.h>
26 #include <dali-toolkit/internal/texture-manager/texture-async-loading-helper.h>
27 #include <dali-toolkit/internal/texture-manager/texture-manager-impl.h>
28 #include <dali-toolkit/internal/texture-manager/texture-upload-observer.h>
29 #include <dali-toolkit/internal/visuals/image-atlas-manager.h>
30 #include <dali-toolkit/internal/visuals/visual-factory-impl.h> ///< For VisualFactory's member TextureManager.
31 #include <dali/devel-api/adaptor-framework/pixel-buffer.h>
33 #include <test-encoded-image-buffer.h>
35 #if defined(ELDBUS_ENABLED)
36 #include <automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/dbus-wrapper.h>
39 using namespace Dali::Toolkit::Internal;
41 void utc_dali_toolkit_texture_manager_startup(void)
43 setenv("LOG_TEXTURE_MANAGER", "3", 1);
44 test_return_value = TET_UNDEF;
45 #if defined(ELDBUS_ENABLED)
46 DBusWrapper::Install(std::unique_ptr<DBusWrapper>(new TestDBusWrapper));
50 void utc_dali_toolkit_texture_manager_cleanup(void)
52 test_return_value = TET_PASS;
57 const char* TEST_IMAGE_FILE_NAME = TEST_RESOURCE_DIR "/gallery-small-1.jpg";
61 class TestObserver : public Dali::Toolkit::TextureUploadObserver
64 enum class CompleteType
73 : mCompleteType(CompleteType::NOT_COMPLETED),
75 mObserverCalled(false),
80 virtual void LoadComplete(bool loadSuccess, TextureInformation textureInformation) override
82 if(textureInformation.returnType == TextureUploadObserver::ReturnType::TEXTURE)
84 mCompleteType = CompleteType::UPLOAD_COMPLETE;
88 mCompleteType = CompleteType::LOAD_COMPLETE;
90 mLoaded = loadSuccess;
91 mObserverCalled = true;
92 mTextureSet = textureInformation.textureSet;
95 CompleteType mCompleteType;
98 TextureSet mTextureSet;
101 int UtcTextureManagerRequestLoad(void)
103 ToolkitTestApplication application;
105 TextureManager textureManager; // Create new texture manager
107 TestObserver observer;
108 std::string filename("image.png");
109 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
110 TextureManager::TextureId textureId = textureManager.RequestLoad(
113 FittingMode::SCALE_TO_FILL,
114 SamplingMode::BOX_THEN_LINEAR,
115 TextureManager::UseAtlas::NO_ATLAS,
118 TextureManager::ReloadPolicy::CACHED,
121 VisualUrl url = textureManager.GetVisualUrl(textureId);
123 DALI_TEST_EQUALS(url.GetUrl().compare(filename), 0, TEST_LOCATION);
128 int UtcTextureManagerGenerateHash(void)
130 ToolkitTestApplication application;
132 TextureManager textureManager; // Create new texture manager
134 TestObserver observer;
135 std::string filename("image.png");
136 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
137 TextureManager::TextureId textureId = textureManager.RequestLoad(
140 FittingMode::SCALE_TO_FILL,
141 SamplingMode::BOX_THEN_LINEAR,
142 TextureManager::UseAtlas::NO_ATLAS,
145 TextureManager::ReloadPolicy::CACHED,
148 VisualUrl url = textureManager.GetVisualUrl(textureId);
150 DALI_TEST_EQUALS(url.GetUrl().compare(filename), 0, TEST_LOCATION);
155 int UtcTextureManagerEncodedImageBuffer(void)
157 ToolkitTestApplication application;
158 tet_infoline("UtcTextureManagerEncodedImageBuffer");
160 auto visualFactory = Toolkit::VisualFactory::Get();
161 auto& textureManager = GetImplementation(visualFactory).GetTextureManager(); // Use VisualFactory's texture manager
163 // Get encoded raw-buffer image and generate url
164 EncodedImageBuffer buffer1 = ConvertFileToEncodedImageBuffer(TEST_IMAGE_FILE_NAME);
165 EncodedImageBuffer buffer2 = ConvertFileToEncodedImageBuffer(TEST_IMAGE_FILE_NAME);
167 std::string url1 = textureManager.AddExternalEncodedImageBuffer(buffer1);
168 std::string url2 = textureManager.AddExternalEncodedImageBuffer(buffer1);
169 std::string url3 = VisualUrl::CreateBufferUrl(""); ///< Impossible Buffer URL. for coverage
171 // Check if same EncodedImageBuffer get same url
172 DALI_TEST_CHECK(url1 == url2);
173 // Reduce reference count
174 textureManager.RemoveExternalEncodedImageBuffer(url1);
175 // Check whethere url1 still valid
176 DALI_TEST_CHECK(textureManager.GetEncodedImageBuffer(url1));
178 url2 = textureManager.AddExternalEncodedImageBuffer(buffer2);
179 // Check if difference EncodedImageBuffer get difference url
180 DALI_TEST_CHECK(url1 != url2);
182 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
184 TestObserver observer1;
185 textureManager.RequestLoad(
188 FittingMode::SCALE_TO_FILL,
189 SamplingMode::BOX_THEN_LINEAR,
190 TextureManager::UseAtlas::NO_ATLAS,
192 true, ///< orientationCorrection
193 TextureManager::ReloadPolicy::CACHED,
196 DALI_TEST_EQUALS(observer1.mLoaded, false, TEST_LOCATION);
197 DALI_TEST_EQUALS(observer1.mObserverCalled, false, TEST_LOCATION);
199 application.SendNotification();
200 application.Render();
202 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
204 application.SendNotification();
205 application.Render();
207 DALI_TEST_EQUALS(observer1.mLoaded, true, TEST_LOCATION);
208 DALI_TEST_EQUALS(observer1.mObserverCalled, true, TEST_LOCATION);
209 DALI_TEST_EQUALS(observer1.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
211 TestObserver observer2;
213 Devel::PixelBuffer pixelBuffer = textureManager.LoadPixelBuffer(
216 FittingMode::SCALE_TO_FILL,
217 SamplingMode::BOX_THEN_LINEAR,
218 true, ///< synchronousLoading
220 true, ///< orientationCorrection
223 DALI_TEST_CHECK(pixelBuffer);
224 DALI_TEST_EQUALS(observer2.mLoaded, false, TEST_LOCATION);
225 DALI_TEST_EQUALS(observer2.mObserverCalled, false, TEST_LOCATION);
228 pixelBuffer = textureManager.LoadPixelBuffer(
231 FittingMode::SCALE_TO_FILL,
232 SamplingMode::BOX_THEN_LINEAR,
233 false, ///< synchronousLoading
235 true, ///< orientationCorrection
238 DALI_TEST_EQUALS(observer2.mLoaded, false, TEST_LOCATION);
239 DALI_TEST_EQUALS(observer2.mObserverCalled, false, TEST_LOCATION);
241 application.SendNotification();
242 application.Render();
244 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
246 application.SendNotification();
247 application.Render();
249 DALI_TEST_EQUALS(observer2.mLoaded, true, TEST_LOCATION);
250 DALI_TEST_EQUALS(observer2.mObserverCalled, true, TEST_LOCATION);
251 DALI_TEST_EQUALS(observer2.mCompleteType, TestObserver::CompleteType::LOAD_COMPLETE, TEST_LOCATION);
253 textureManager.RemoveExternalEncodedImageBuffer(url1);
254 textureManager.RemoveExternalEncodedImageBuffer(url2);
256 // Now url1 and url2 is invalid type. mLoaded will return false
258 TestObserver observer3;
259 textureManager.RequestLoad(
262 FittingMode::SCALE_TO_FILL,
263 SamplingMode::BOX_THEN_LINEAR,
264 TextureManager::UseAtlas::NO_ATLAS,
266 true, ///< orientationCorrection
267 TextureManager::ReloadPolicy::CACHED,
270 // Load will be success because url1 is cached
271 DALI_TEST_EQUALS(observer3.mLoaded, true, TEST_LOCATION);
272 DALI_TEST_EQUALS(observer3.mObserverCalled, true, TEST_LOCATION);
273 DALI_TEST_EQUALS(observer3.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
275 TestObserver observer4;
276 textureManager.RequestLoad(
279 FittingMode::SCALE_TO_FILL,
280 SamplingMode::BOX_THEN_LINEAR,
281 TextureManager::UseAtlas::NO_ATLAS,
283 true, ///< orientationCorrection
284 TextureManager::ReloadPolicy::FORCED,
287 DALI_TEST_EQUALS(observer4.mLoaded, false, TEST_LOCATION);
288 DALI_TEST_EQUALS(observer4.mObserverCalled, false, TEST_LOCATION);
289 application.SendNotification();
290 application.Render();
292 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
294 application.SendNotification();
295 application.Render();
297 // Load will be failed becuase reloadpolicy is forced
298 DALI_TEST_EQUALS(observer4.mLoaded, false, TEST_LOCATION);
299 DALI_TEST_EQUALS(observer4.mObserverCalled, true, TEST_LOCATION);
300 DALI_TEST_EQUALS(observer4.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
302 TestObserver observer5;
303 pixelBuffer = textureManager.LoadPixelBuffer(
306 FittingMode::SCALE_TO_FILL,
307 SamplingMode::BOX_THEN_LINEAR,
308 true, ///< synchronousLoading
310 true, ///< orientationCorrection
313 // Load will be faild because synchronousLoading doesn't use cached texture
314 DALI_TEST_CHECK(!pixelBuffer);
315 DALI_TEST_EQUALS(observer5.mLoaded, false, TEST_LOCATION);
316 DALI_TEST_EQUALS(observer5.mObserverCalled, false, TEST_LOCATION);
318 TestObserver observer6;
319 pixelBuffer = textureManager.LoadPixelBuffer(
322 FittingMode::SCALE_TO_FILL,
323 SamplingMode::BOX_THEN_LINEAR,
324 false, ///< synchronousLoading
326 true, ///< orientationCorrection
329 DALI_TEST_EQUALS(observer6.mLoaded, false, TEST_LOCATION);
330 DALI_TEST_EQUALS(observer6.mObserverCalled, false, TEST_LOCATION);
332 application.SendNotification();
333 application.Render();
335 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
337 application.SendNotification();
338 application.Render();
340 // Load will be failed because url3 is invalid URL
341 DALI_TEST_EQUALS(observer6.mLoaded, false, TEST_LOCATION);
342 DALI_TEST_EQUALS(observer6.mObserverCalled, true, TEST_LOCATION);
343 DALI_TEST_EQUALS(observer6.mCompleteType, TestObserver::CompleteType::LOAD_COMPLETE, TEST_LOCATION);
348 int UtcTextureManagerEncodedImageBufferReferenceCount(void)
350 ToolkitTestApplication application;
351 tet_infoline("UtcTextureManagerEncodedImageBuffer check reference count works well");
353 auto visualFactory = Toolkit::VisualFactory::Get();
354 auto& textureManager = GetImplementation(visualFactory).GetTextureManager(); // Use VisualFactory's texture manager
356 // Get encoded raw-buffer image and generate url
357 EncodedImageBuffer buffer1 = ConvertFileToEncodedImageBuffer(TEST_IMAGE_FILE_NAME);
358 EncodedImageBuffer buffer2 = ConvertFileToEncodedImageBuffer(TEST_IMAGE_FILE_NAME);
360 std::string url1 = textureManager.AddExternalEncodedImageBuffer(buffer1);
361 std::string url2 = textureManager.AddExternalEncodedImageBuffer(buffer1);
363 // Check if same EncodedImageBuffer get same url
364 DALI_TEST_CHECK(url1 == url2);
366 // Reduce reference count
367 textureManager.RemoveExternalEncodedImageBuffer(url1);
368 // Check whethere url1 still valid
369 DALI_TEST_CHECK(textureManager.GetEncodedImageBuffer(url1));
371 // Reduce reference count
372 textureManager.RemoveExternalEncodedImageBuffer(url1);
373 // Check whethere url1 is not valid anymore
374 DALI_TEST_CHECK(!textureManager.GetEncodedImageBuffer(url1));
376 // UseExternalTexture doesn't create new buffer.
377 // So, reference count is still zero.
378 textureManager.UseExternalResource(url1);
379 DALI_TEST_CHECK(!textureManager.GetEncodedImageBuffer(url1));
381 url1 = textureManager.AddExternalEncodedImageBuffer(buffer1);
382 // Check if difference EncodedImageBuffer get difference url
383 // Previous EncodedImageBuffer was deleted, so we get new url even same buffer.
384 DALI_TEST_CHECK(url1 != url2);
386 url2 = textureManager.AddExternalEncodedImageBuffer(buffer2);
387 // Check if difference EncodedImageBuffer get difference url
388 DALI_TEST_CHECK(url1 != url2);
390 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
392 // url1 load image by cache
393 TestObserver observer1;
394 textureManager.RequestLoad(
397 FittingMode::SCALE_TO_FILL,
398 SamplingMode::BOX_THEN_LINEAR,
399 TextureManager::UseAtlas::NO_ATLAS,
401 true, ///< orientationCorrection
402 TextureManager::ReloadPolicy::CACHED,
405 DALI_TEST_EQUALS(observer1.mLoaded, false, TEST_LOCATION);
406 DALI_TEST_EQUALS(observer1.mObserverCalled, false, TEST_LOCATION);
408 application.SendNotification();
409 application.Render();
411 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
413 application.SendNotification();
414 application.Render();
416 DALI_TEST_EQUALS(observer1.mLoaded, true, TEST_LOCATION);
417 DALI_TEST_EQUALS(observer1.mObserverCalled, true, TEST_LOCATION);
418 DALI_TEST_EQUALS(observer1.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
420 // LoadPixelBuffer doen't use cache. url2 will not be cached
421 TestObserver observer2;
422 Devel::PixelBuffer pixelBuffer = textureManager.LoadPixelBuffer(
425 FittingMode::SCALE_TO_FILL,
426 SamplingMode::BOX_THEN_LINEAR,
427 false, ///< synchronousLoading
429 true, ///< orientationCorrection
432 DALI_TEST_EQUALS(observer2.mLoaded, false, TEST_LOCATION);
433 DALI_TEST_EQUALS(observer2.mObserverCalled, false, TEST_LOCATION);
435 application.SendNotification();
436 application.Render();
438 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
440 application.SendNotification();
441 application.Render();
443 DALI_TEST_EQUALS(observer2.mLoaded, true, TEST_LOCATION);
444 DALI_TEST_EQUALS(observer2.mObserverCalled, true, TEST_LOCATION);
445 DALI_TEST_EQUALS(observer2.mCompleteType, TestObserver::CompleteType::LOAD_COMPLETE, TEST_LOCATION);
447 // Decrease each url's reference count.
448 textureManager.RemoveExternalEncodedImageBuffer(url1);
449 textureManager.RemoveExternalEncodedImageBuffer(url2);
451 // url1 buffer is still have 1 reference count because it is cached.
452 // But url2 not valid because it is not cached.
453 DALI_TEST_CHECK(textureManager.GetEncodedImageBuffer(url1));
454 DALI_TEST_CHECK(!textureManager.GetEncodedImageBuffer(url2));
456 // Check url1 buffer have 1 reference count because it is cached.
457 textureManager.RemoveExternalEncodedImageBuffer(url1);
458 DALI_TEST_CHECK(!textureManager.GetEncodedImageBuffer(url1));
463 int UtcTextureManagerCachingForDifferentLoadingType(void)
465 ToolkitTestApplication application;
466 tet_infoline("UtcTextureManagerCachingForDifferentLoadingType");
468 TextureManager textureManager; // Create new texture manager
470 TestObserver observer1;
471 std::string filename(TEST_IMAGE_FILE_NAME);
472 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
473 textureManager.RequestLoad(
476 FittingMode::SCALE_TO_FILL,
477 SamplingMode::BOX_THEN_LINEAR,
478 TextureManager::UseAtlas::NO_ATLAS,
481 TextureManager::ReloadPolicy::CACHED,
484 DALI_TEST_EQUALS(observer1.mLoaded, false, TEST_LOCATION);
485 DALI_TEST_EQUALS(observer1.mObserverCalled, false, TEST_LOCATION);
487 application.SendNotification();
488 application.Render();
490 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
492 application.SendNotification();
493 application.Render();
495 DALI_TEST_EQUALS(observer1.mLoaded, true, TEST_LOCATION);
496 DALI_TEST_EQUALS(observer1.mObserverCalled, true, TEST_LOCATION);
497 DALI_TEST_EQUALS(observer1.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
499 TestObserver observer2;
500 Devel::PixelBuffer pixelBuffer = textureManager.LoadPixelBuffer(
503 FittingMode::SCALE_TO_FILL,
504 SamplingMode::BOX_THEN_LINEAR,
510 DALI_TEST_EQUALS(observer2.mLoaded, false, TEST_LOCATION);
511 DALI_TEST_EQUALS(observer2.mObserverCalled, false, TEST_LOCATION);
513 application.SendNotification();
514 application.Render();
516 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
518 application.SendNotification();
519 application.Render();
521 DALI_TEST_EQUALS(observer2.mLoaded, true, TEST_LOCATION);
522 DALI_TEST_EQUALS(observer2.mObserverCalled, true, TEST_LOCATION);
523 DALI_TEST_EQUALS(observer2.mCompleteType, TestObserver::CompleteType::LOAD_COMPLETE, TEST_LOCATION);
528 int UtcTextureManagerUseInvalidMask(void)
530 ToolkitTestApplication application;
531 tet_infoline("UtcTextureManagerUseInvalidMask");
533 TextureManager textureManager; // Create new texture manager
535 TestObserver observer;
536 std::string filename(TEST_IMAGE_FILE_NAME);
537 std::string maskname("");
538 TextureManager::MaskingDataPointer maskInfo = nullptr;
539 maskInfo.reset(new TextureManager::MaskingData());
540 maskInfo->mAlphaMaskUrl = maskname;
541 maskInfo->mAlphaMaskId = TextureManager::INVALID_TEXTURE_ID;
542 maskInfo->mCropToMask = true;
543 maskInfo->mContentScaleFactor = 1.0f;
545 auto textureId(TextureManager::INVALID_TEXTURE_ID);
546 Vector4 atlasRect(0.f, 0.f, 1.f, 1.f);
547 Dali::ImageDimensions atlasRectSize(0, 0);
548 bool synchronousLoading(false);
549 bool atlasingStatus(false);
550 bool loadingStatus(false);
551 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
552 ImageAtlasManagerPtr atlasManager = nullptr;
553 Toolkit::AtlasUploadObserver* atlasUploadObserver = nullptr;
555 textureManager.LoadTexture(
558 FittingMode::SCALE_TO_FILL,
559 SamplingMode::BOX_THEN_LINEAR,
573 TextureManager::ReloadPolicy::CACHED,
576 DALI_TEST_EQUALS(observer.mLoaded, false, TEST_LOCATION);
577 DALI_TEST_EQUALS(observer.mObserverCalled, false, TEST_LOCATION);
579 application.SendNotification();
580 application.Render();
582 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
584 application.SendNotification();
585 application.Render();
587 DALI_TEST_EQUALS(observer.mLoaded, true, TEST_LOCATION);
588 DALI_TEST_EQUALS(observer.mObserverCalled, true, TEST_LOCATION);
589 DALI_TEST_EQUALS(observer.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
594 int UtcTextureManagerUseInvalidMaskAndMaskLoadedFirst(void)
596 ToolkitTestApplication application;
597 tet_infoline("UtcTextureManagerUseInvalidMask when normal image loaded first, and mask image loaded first");
598 tet_infoline("Try to check PostLoad works well");
600 TextureManager textureManager; // Create new texture manager
602 TestObserver observer;
603 std::string filename(TEST_IMAGE_FILE_NAME);
604 std::string maskname("invalid.png");
605 TextureManager::MaskingDataPointer maskInfo = nullptr;
606 maskInfo.reset(new TextureManager::MaskingData());
607 maskInfo->mAlphaMaskUrl = maskname;
608 maskInfo->mAlphaMaskId = TextureManager::INVALID_TEXTURE_ID;
609 maskInfo->mCropToMask = true;
610 maskInfo->mContentScaleFactor = 1.0f;
612 auto textureId(TextureManager::INVALID_TEXTURE_ID);
613 Vector4 atlasRect(0.f, 0.f, 1.f, 1.f);
614 Dali::ImageDimensions atlasRectSize(0, 0);
615 bool synchronousLoading(false);
616 bool atlasingStatus(false);
617 bool loadingStatus(false);
618 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
619 ImageAtlasManagerPtr atlasManager = nullptr;
620 Toolkit::AtlasUploadObserver* atlasUploadObserver = nullptr;
622 textureManager.LoadTexture(
625 FittingMode::SCALE_TO_FILL,
626 SamplingMode::BOX_THEN_LINEAR,
640 TextureManager::ReloadPolicy::CACHED,
643 DALI_TEST_EQUALS(observer.mLoaded, false, TEST_LOCATION);
644 DALI_TEST_EQUALS(observer.mObserverCalled, false, TEST_LOCATION);
646 application.SendNotification();
647 application.Render();
649 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
651 application.SendNotification();
652 application.Render();
654 DALI_TEST_EQUALS(observer.mLoaded, true, TEST_LOCATION);
655 DALI_TEST_EQUALS(observer.mObserverCalled, true, TEST_LOCATION);
656 DALI_TEST_EQUALS(observer.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
661 int UtcTextureManagerUseInvalidMaskAndMaskLoadedLater(void)
663 ToolkitTestApplication application;
664 tet_infoline("UtcTextureManagerUseInvalidMask when normal image loaded first, and mask image loaded later");
665 tet_infoline("Try to check CheckForWaitingTexture called");
667 TextureManager textureManager; // Create new texture manager
669 TestObserver observer;
670 std::string filename(TEST_IMAGE_FILE_NAME);
671 std::string maskname("invalid.png");
672 TextureManager::MaskingDataPointer maskInfo = nullptr;
673 maskInfo.reset(new TextureManager::MaskingData());
674 maskInfo->mAlphaMaskUrl = maskname;
675 maskInfo->mAlphaMaskId = TextureManager::INVALID_TEXTURE_ID;
676 maskInfo->mCropToMask = true;
677 maskInfo->mContentScaleFactor = 1.0f;
679 auto textureId(TextureManager::INVALID_TEXTURE_ID);
680 Vector4 atlasRect(0.f, 0.f, 1.f, 1.f);
681 Dali::ImageDimensions atlasRectSize(0, 0);
682 bool synchronousLoading(false);
683 bool atlasingStatus(false);
684 bool loadingStatus(false);
685 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
686 ImageAtlasManagerPtr atlasManager = nullptr;
687 Toolkit::AtlasUploadObserver* atlasUploadObserver = nullptr;
689 textureManager.LoadTexture(
692 FittingMode::SCALE_TO_FILL,
693 SamplingMode::BOX_THEN_LINEAR,
707 TextureManager::ReloadPolicy::CACHED,
710 DALI_TEST_EQUALS(observer.mLoaded, false, TEST_LOCATION);
711 DALI_TEST_EQUALS(observer.mObserverCalled, false, TEST_LOCATION);
713 application.SendNotification();
714 application.Render();
716 // CAPTION : HARD-CODING for coverage. If you are a good boy, Do not follow this code.
718 Dali::Devel::PixelBuffer pixelBuffer = textureManager.LoadPixelBuffer(
721 FittingMode::SCALE_TO_FILL,
722 SamplingMode::BOX_THEN_LINEAR,
723 true, ///< synchronousLoading
725 true, ///< orientationCorrection
728 textureManager.AsyncLoadComplete(textureId, pixelBuffer);
729 textureManager.AsyncLoadComplete(maskInfo->mAlphaMaskId, Dali::Devel::PixelBuffer());
730 textureManager.Remove(maskInfo->mAlphaMaskId, nullptr);
731 textureManager.Remove(textureId, &observer);
734 application.SendNotification();
735 application.Render();
737 DALI_TEST_EQUALS(observer.mLoaded, true, TEST_LOCATION);
738 DALI_TEST_EQUALS(observer.mObserverCalled, true, TEST_LOCATION);
739 DALI_TEST_EQUALS(observer.mCompleteType, TestObserver::CompleteType::UPLOAD_COMPLETE, TEST_LOCATION);
741 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(2), true, TEST_LOCATION);
746 int UtcTextureManagerSynchronousLoadingFail(void)
748 ToolkitTestApplication application;
749 tet_infoline("UtcTextureManagerSynchronousLoadingFail");
751 TextureManager textureManager; // Create new texture manager
753 std::string maskname("");
754 TextureManager::MaskingDataPointer maskInfo = nullptr;
755 maskInfo.reset(new TextureManager::MaskingData());
756 maskInfo->mAlphaMaskUrl = maskname;
757 maskInfo->mAlphaMaskId = TextureManager::INVALID_TEXTURE_ID;
758 maskInfo->mCropToMask = true;
759 maskInfo->mContentScaleFactor = 1.0f;
761 std::string filename("dummy");
762 auto textureId(TextureManager::INVALID_TEXTURE_ID);
763 Vector4 atlasRect(0.f, 0.f, 0.f, 0.f);
764 Dali::ImageDimensions atlasRectSize(0, 0);
765 bool atlasingStatus(false);
766 bool loadingStatus(false);
767 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
768 ImageAtlasManagerPtr atlasManager = nullptr;
769 Toolkit::AtlasUploadObserver* atlasUploadObserver = nullptr;
771 // load image synchronously.
772 TestObserver observer;
773 TextureSet textureSet = textureManager.LoadTexture(
776 FittingMode::SCALE_TO_FILL,
777 SamplingMode::BOX_THEN_LINEAR,
779 true, // synchronous loading.
791 TextureManager::ReloadPolicy::CACHED,
794 DALI_TEST_EQUALS(loadingStatus, false, TEST_LOCATION);
795 DALI_TEST_CHECK(!textureSet); // texture loading fail.
796 DALI_TEST_CHECK(textureId == TextureManager::INVALID_TEXTURE_ID); // invalid texture id is returned.
801 int UtcTextureManagerCachingSynchronousLoading(void)
803 ToolkitTestApplication application;
804 tet_infoline("UtcTextureManagerCachingSynchronousLoading");
806 TextureManager textureManager; // Create new texture manager
808 std::string filename(TEST_IMAGE_FILE_NAME);
810 std::string maskname("");
811 TextureManager::MaskingDataPointer maskInfo = nullptr;
812 maskInfo.reset(new TextureManager::MaskingData());
813 maskInfo->mAlphaMaskUrl = maskname;
814 maskInfo->mAlphaMaskId = TextureManager::INVALID_TEXTURE_ID;
815 maskInfo->mCropToMask = true;
816 maskInfo->mContentScaleFactor = 1.0f;
818 Vector4 atlasRect(0.f, 0.f, 0.f, 0.f);
819 Dali::ImageDimensions atlasRectSize(0, 0);
820 bool atlasingStatus(false);
821 bool loadingStatus(false);
822 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
823 ImageAtlasManagerPtr atlasManager = nullptr;
824 Toolkit::AtlasUploadObserver* atlasUploadObserver = nullptr;
826 // load image synchronously.
827 TestObserver observer;
828 auto textureId(TextureManager::INVALID_TEXTURE_ID);
829 TextureSet textureSet = textureManager.LoadTexture(
832 FittingMode::SCALE_TO_FILL,
833 SamplingMode::BOX_THEN_LINEAR,
835 true, // synchronous loading.
847 TextureManager::ReloadPolicy::CACHED,
850 DALI_TEST_EQUALS(loadingStatus, false, TEST_LOCATION);
851 DALI_TEST_CHECK(textureSet); // texture is loaded.
853 // observer isn't called in synchronous loading.
854 DALI_TEST_EQUALS(observer.mLoaded, false, TEST_LOCATION);
855 DALI_TEST_EQUALS(observer.mObserverCalled, false, TEST_LOCATION);
857 // load same image asynchronously.
858 TestObserver asyncObserver;
859 auto asyncTextureId(TextureManager::INVALID_TEXTURE_ID);
860 loadingStatus = false;
861 TextureSet asyncTextureSet = textureManager.LoadTexture(
864 FittingMode::SCALE_TO_FILL,
865 SamplingMode::BOX_THEN_LINEAR,
867 false, // asynchronous loading.
879 TextureManager::ReloadPolicy::CACHED,
882 DALI_TEST_EQUALS(asyncTextureId, textureId, TEST_LOCATION); // texture is loaded.
883 DALI_TEST_EQUALS(loadingStatus, false, TEST_LOCATION);
884 DALI_TEST_CHECK(asyncTextureSet); // Cached texture.
886 // observer is directly called because textureSet is retrieved by cache.
887 DALI_TEST_EQUALS(asyncObserver.mLoaded, true, TEST_LOCATION);
888 DALI_TEST_EQUALS(asyncObserver.mObserverCalled, true, TEST_LOCATION);
893 int UtcTextureManagerAsyncSyncAsync(void)
895 ToolkitTestApplication application;
896 tet_infoline("UtcTextureManagerAsyncSyncAsync");
898 TextureManager textureManager; // Create new texture manager
900 std::string filename(TEST_IMAGE_FILE_NAME);
902 std::string maskname("");
903 TextureManager::MaskingDataPointer maskInfo = nullptr;
904 maskInfo.reset(new TextureManager::MaskingData());
905 maskInfo->mAlphaMaskUrl = maskname;
906 maskInfo->mAlphaMaskId = TextureManager::INVALID_TEXTURE_ID;
907 maskInfo->mCropToMask = true;
908 maskInfo->mContentScaleFactor = 1.0f;
910 Vector4 atlasRect(0.f, 0.f, 0.f, 0.f);
911 Dali::ImageDimensions atlasRectSize(0, 0);
912 bool atlasingStatus(false);
913 auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY;
914 ImageAtlasManagerPtr atlasManager = nullptr;
915 Toolkit::AtlasUploadObserver* atlasUploadObserver = nullptr;
917 // load image asynchronously.
918 TestObserver asyncObserver1;
919 auto asyncTextureId1(TextureManager::INVALID_TEXTURE_ID);
920 bool asyncLoadingStatus1 = false;
921 TextureSet asyncTextureSet1 = textureManager.LoadTexture(
924 FittingMode::SCALE_TO_FILL,
925 SamplingMode::BOX_THEN_LINEAR,
927 false, // asynchronous loading.
939 TextureManager::ReloadPolicy::CACHED,
942 DALI_TEST_EQUALS(asyncLoadingStatus1, true, TEST_LOCATION); // texture is loading now.
943 DALI_TEST_CHECK(!asyncTextureSet1); // texture is not loaded yet.
945 // observer is still not called.
946 DALI_TEST_EQUALS(asyncObserver1.mLoaded, false, TEST_LOCATION);
947 DALI_TEST_EQUALS(asyncObserver1.mObserverCalled, false, TEST_LOCATION);
949 // load same image synchronously just after asynchronous loading.
950 TestObserver syncObserver;
951 auto textureId(TextureManager::INVALID_TEXTURE_ID);
952 bool syncLoadingStatus = false;
953 TextureSet syncTextureSet = textureManager.LoadTexture(
956 FittingMode::SCALE_TO_FILL,
957 SamplingMode::BOX_THEN_LINEAR,
959 true, // synchronous loading.
971 TextureManager::ReloadPolicy::CACHED,
974 DALI_TEST_EQUALS(asyncTextureId1, textureId, TEST_LOCATION); // texture is loaded.
975 DALI_TEST_EQUALS(syncLoadingStatus, false, TEST_LOCATION); // texture is loaded.
976 DALI_TEST_CHECK(syncTextureSet); // texture is loaded.
978 // syncObserver isn't called in synchronous loading.
979 DALI_TEST_EQUALS(syncObserver.mLoaded, false, TEST_LOCATION);
980 DALI_TEST_EQUALS(syncObserver.mObserverCalled, false, TEST_LOCATION);
982 // asyncObserver1 is still not called too.
983 DALI_TEST_EQUALS(asyncObserver1.mLoaded, false, TEST_LOCATION);
984 DALI_TEST_EQUALS(asyncObserver1.mObserverCalled, false, TEST_LOCATION);
986 // load image asynchronously.
987 TestObserver asyncObserver2;
988 auto asyncTextureId2(TextureManager::INVALID_TEXTURE_ID);
989 bool asyncLoadingStatus2 = false;
990 TextureSet asyncTextureSet2 = textureManager.LoadTexture(
993 FittingMode::SCALE_TO_FILL,
994 SamplingMode::BOX_THEN_LINEAR,
996 false, // asynchronous loading.
1001 asyncLoadingStatus2,
1005 atlasUploadObserver,
1008 TextureManager::ReloadPolicy::CACHED,
1011 DALI_TEST_EQUALS(asyncLoadingStatus2, false, TEST_LOCATION); // texture is loaded by previous sync request
1012 DALI_TEST_CHECK(asyncTextureSet2); // texture is loaded
1013 DALI_TEST_CHECK(asyncTextureSet2 == syncTextureSet); // check loaded two texture is same.
1015 // observer is called synchronously because the texture is cached.
1016 DALI_TEST_EQUALS(asyncObserver2.mLoaded, true, TEST_LOCATION);
1017 DALI_TEST_EQUALS(asyncObserver2.mObserverCalled, true, TEST_LOCATION);
1019 asyncObserver2.mLoaded = false;
1020 asyncObserver2.mObserverCalled = false;
1022 application.SendNotification();
1023 application.Render();
1025 // Requested asynchronous loading at first is finished now and async observer is called now.
1026 DALI_TEST_EQUALS(Test::WaitForEventThreadTrigger(1), true, TEST_LOCATION);
1027 DALI_TEST_EQUALS(asyncObserver1.mLoaded, true, TEST_LOCATION);
1028 DALI_TEST_EQUALS(asyncObserver1.mObserverCalled, true, TEST_LOCATION);
1029 DALI_TEST_CHECK(asyncObserver1.mTextureSet == asyncTextureSet2); // check loaded two texture is same.
1031 // asyncObserver2 was already called so it isn't called here.
1032 DALI_TEST_EQUALS(asyncObserver2.mLoaded, false, TEST_LOCATION);
1033 DALI_TEST_EQUALS(asyncObserver2.mObserverCalled, false, TEST_LOCATION);