From 67edc0b3c42e3e9e330c51636045fcdf36adbb24 Mon Sep 17 00:00:00 2001 From: Ferran Sole Date: Fri, 20 Jan 2017 09:29:39 +0000 Subject: [PATCH] Delete ImageFactory and ImageFactoryCache as they are unused Change-Id: Ia76278fc6d2c3c62e2789f46320e2fc897089603 --- automated-tests/src/dali-internal/CMakeLists.txt | 1 - .../utc-Dali-Internal-ImageFactory.cpp | 623 --------------------- dali/integration-api/profiling.cpp | 4 +- dali/integration-api/resource-declarations.h | 1 - dali/internal/common/core-impl.cpp | 13 - dali/internal/common/core-impl.h | 8 - .../internal/event/common/thread-local-storage.cpp | 7 +- dali/internal/event/common/thread-local-storage.h | 9 +- dali/internal/event/images/atlas-impl.cpp | 4 - dali/internal/event/images/atlas-impl.h | 1 - dali/internal/event/images/buffer-image-impl.cpp | 1 - .../event/images/encoded-buffer-image-impl.cpp | 1 - dali/internal/event/images/image-connector.cpp | 82 --- dali/internal/event/images/image-connector.h | 88 --- dali/internal/event/images/image-factory-cache.cpp | 83 --- dali/internal/event/images/image-factory-cache.h | 134 ----- dali/internal/event/images/image-factory.cpp | 517 ----------------- dali/internal/event/images/image-factory.h | 245 -------- .../event/images/nine-patch-image-impl.cpp | 1 - dali/internal/event/images/resource-image-impl.h | 1 - dali/internal/event/rendering/sampler-impl.h | 1 - dali/internal/event/rendering/texture-set-impl.h | 1 + dali/internal/file.list | 3 - 23 files changed, 4 insertions(+), 1825 deletions(-) delete mode 100644 automated-tests/src/dali-internal/utc-Dali-Internal-ImageFactory.cpp delete mode 100644 dali/internal/event/images/image-connector.cpp delete mode 100644 dali/internal/event/images/image-connector.h delete mode 100644 dali/internal/event/images/image-factory-cache.cpp delete mode 100644 dali/internal/event/images/image-factory-cache.h delete mode 100644 dali/internal/event/images/image-factory.cpp delete mode 100644 dali/internal/event/images/image-factory.h diff --git a/automated-tests/src/dali-internal/CMakeLists.txt b/automated-tests/src/dali-internal/CMakeLists.txt index 469511c..aa640b1 100644 --- a/automated-tests/src/dali-internal/CMakeLists.txt +++ b/automated-tests/src/dali-internal/CMakeLists.txt @@ -8,7 +8,6 @@ SET(CAPI_LIB "dali-internal") SET(TC_SOURCES utc-Dali-Internal-Core.cpp utc-Dali-Internal-Handles.cpp - utc-Dali-Internal-ImageFactory.cpp utc-Dali-Internal-ResourceClient.cpp utc-Dali-Internal-FixedSizeMemoryPool.cpp utc-Dali-Internal-MemoryPoolObjectAllocator.cpp diff --git a/automated-tests/src/dali-internal/utc-Dali-Internal-ImageFactory.cpp b/automated-tests/src/dali-internal/utc-Dali-Internal-ImageFactory.cpp deleted file mode 100644 index 65833e8..0000000 --- a/automated-tests/src/dali-internal/utc-Dali-Internal-ImageFactory.cpp +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#include - -#include -#include -#include - -// Internal headers are allowed here -#include -#include -#include -#include - -using namespace Dali; - -using Internal::ResourceTicketPtr; -using Internal::ImageFactory; -using Internal::ImageFactoryCache::RequestPtr; -using Internal::ImageAttributes; - -namespace -{ - -static const char* gTestImageFilename = "icon_wrt.png"; - -static void EmulateImageLoaded( TestApplication& application, unsigned int width, unsigned int height ) -{ - // emulate load success - Integration::ResourceRequest* request = application.GetPlatform().GetRequest(); - Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::OWNED_DISCARD ); - Integration::ResourcePointer resource( bitmap ); - bitmap->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, width, height, width, height ); - if( request ) - { - application.GetPlatform().SetResourceLoaded( request->GetId(), request->GetType()->id, resource ); - } - - application.SendNotification(); - application.Render(); - - application.SendNotification(); - application.Render(); -} - -} //anonymous namespace - - -// High-level test for image factory request cache -int UtcDaliImageFactoryUseCachedRequest01(void) -{ - TestApplication application; - - tet_infoline( "UtcDaliImageFactoryCachedRequest01 - Request same image more than once" ); - - Image image = ResourceImage::New( gTestImageFilename ); - - application.SendNotification(); - application.Render(); - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceSynchronouslyFunc ) ); - application.GetPlatform().ResetTrace(); - - Image image2 = ResourceImage::New( gTestImageFilename ); - - application.SendNotification(); - application.Render(); - - // Resource is loaded twice - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceSynchronouslyFunc ) ); - application.GetPlatform().ResetTrace(); - - Image image3 = ResourceImage::New( gTestImageFilename ); - - application.SendNotification(); - application.Render(); - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceSynchronouslyFunc ) ); - END_TEST; -} - -// High-level test for image factory request cache -int UtcDaliImageFactoryUseCachedRequest02(void) -{ - TestApplication application; - - // testing resource deletion when taken off stage - tet_infoline( "UtcDaliImageFactoryCachedRequest02 - Discard previously requested resource" ); - - Image image = ResourceImage::New( gTestImageFilename ); - Actor actor = CreateRenderableActor( image ); - - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceSynchronouslyFunc ) ); - application.GetPlatform().ResetTrace(); - - // Add actor to stage - Stage::GetCurrent().Add( actor ); - - application.Render(); - application.SendNotification(); - application.Render(); - application.SendNotification(); - - // Release the resource, request is still cached - Stage::GetCurrent().Remove( actor ); - application.Render(); - application.SendNotification(); - application.Render(); - application.SendNotification(); - - // Should find stale request in cache, so load image from filesystem - Image image2 = ResourceImage::New( gTestImageFilename ); - - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceSynchronouslyFunc ) ); - application.GetPlatform().ResetTrace(); - - // Resource is reloaded - Image image3 = ResourceImage::New( gTestImageFilename ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - END_TEST; -} - -// Low-level test for image factory request cache -int UtcDaliImageFactoryUseCachedRequest03(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryCachedRequest03 - Request same image more than once - Request Ids" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket2 = imageFactory.Load( *req2.Get() ); - DALI_TEST_EQUALS( req, req2, TEST_LOCATION ); - DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION ); - - req2 = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket3 = imageFactory.Load( *req2.Get() ); - DALI_TEST_EQUALS( req, req2, TEST_LOCATION ); - DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION ); - - // request differs in scaled size - not default size - ImageAttributes attr = ImageAttributes::New( 80, 160); - req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - ResourceTicketPtr ticket4 = imageFactory.Load( *req2.Get() ); - DALI_TEST_CHECK( req != req2 ); - END_TEST; -} - -// Low-level test for image factory request cache -int UtcDaliImageFactoryUseCachedRequest04(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryCachedRequest04 - Request same image with different Image objects - Request Ids" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - ImageAttributes attr = ImageAttributes::New( 80, 160 ); - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - - ImageAttributes attr2 = ImageAttributes::New( 80, 160 ); - RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr2 ); - DALI_TEST_EQUALS( req, req2, TEST_LOCATION ); - END_TEST; -} - -// Different requests, compatible resource -int UtcDaliImageFactoryCompatibleResource01(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryCompatibleResource01 - Two requests mapping to same resource" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize(80.0f, 80.0f); - application.GetPlatform().SetClosestImageSize(testSize); - - // request with default attributes ( size is 0,0 ) - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - // emulate load success - EmulateImageLoaded( application, 80, 80 ); - - // Request a second load using exact-match image size: - ImageAttributes attr = ImageAttributes::New(); - attr.SetSize( 80, 80 ); - RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - ResourceTicketPtr ticket2 = imageFactory.Load( *req2.Get() ); - - DALI_TEST_CHECK( req != req2 ); // different requests - DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource - END_TEST; -} - -// Different requests, compatible resource -int UtcDaliImageFactoryCompatibleResource02(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryCompatibleResource02 - Two requests mapping to same resource." ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize( 2048.0f, 2048.0f ); - application.GetPlatform().SetClosestImageSize( testSize ); - - // request with default attributes ( size is 0,0 ) - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - // emulate load success - EmulateImageLoaded( application, testSize.x, testSize.y ); - - // Request slightly bigger size than actual image. - // This will load the same resource as the ImageFactory cache uses a small fudge factor in matching. - // See UtcDaliImageFactoryReload06 - ImageAttributes attr = ImageAttributes::New(); - attr.SetSize( testSize.x + 1, testSize.y + 1 ); - RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - ResourceTicketPtr ticket2 = imageFactory.Load( *req2.Get() ); - - DALI_TEST_CHECK( req != req2 ); // different requests - DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource - END_TEST; -} - -// Different requests, incompatible resource, so two loads result: -int UtcDaliImageFactoryInCompatibleResource(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryCompatibleResource02 - Two requests mapping to same resource." ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize(2048.0f, 2048.0f); - application.GetPlatform().SetClosestImageSize(testSize); - - // request with default attributes ( size is 0,0 ) - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - // emulate load success - EmulateImageLoaded( application, testSize.x, testSize.y ); - - // Request substantially different size than actual image. - // This will issue a second resource load as difference in sizes is greater than - // the small fudge factor used in the ImageFactory cache. - ImageAttributes attr = ImageAttributes::New(); - attr.SetSize( testSize.x - 16, testSize.y - 16 ); - RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - ResourceTicketPtr ticket2 = imageFactory.Load( *req2.Get() ); - - DALI_TEST_CHECK( req != req2 ); // different requests - DALI_TEST_CHECK( ticket->GetId() != ticket2->GetId() ); // differnet resources - END_TEST; -} - -// Different requests, compatible resource -int UtcDaliImageFactoryCompatibleResource03(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryCompatibleResource03 - Two requests mapping to same resource" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize(80.0f, 80.0f); - application.GetPlatform().SetClosestImageSize(testSize); - - // this time use defined attributes, nut just NULL - ImageAttributes attr = ImageAttributes::New(); - attr.SetSize( 120, 120 ); - - // request with default attributes ( size is 0,0 ) - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - // emulate load success - EmulateImageLoaded( application, 80, 80 ); - - ImageAttributes attr2 = ImageAttributes::New(); - attr2.SetSize( 80, 80 ); - RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr2 ); - ResourceTicketPtr ticket2 = imageFactory.Load( *req2.Get() ); - - DALI_TEST_CHECK( req != req2 ); // different requests - DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource - END_TEST; -} - -// Test for reloading image -int UtcDaliImageFactoryReload01(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryReload01 - Reload unchanged image" ); - - Vector2 testSize(80.0f, 80.0f); - application.GetPlatform().SetClosestImageSize(testSize); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - ResourceTicketPtr ticket2 = imageFactory.Reload( *req.Get() ); - DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION ); - - ResourceTicketPtr ticket3 = imageFactory.Reload( *req.Get() ); - DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION ); - END_TEST; -} - -// Testing file system access when reloading image -int UtcDaliImageFactoryReload02(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryReload02 - Reload unchanged image" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize(80.0f, 80.0f); - application.GetPlatform().SetClosestImageSize(testSize); - - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - application.GetPlatform().ResetTrace(); - - ResourceTicketPtr ticket2 = imageFactory.Reload( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION ); - // resource is still loading, do not issue another request - DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - - // emulate load success - EmulateImageLoaded( application, 80, 80 ); - - ResourceTicketPtr ticket3 = imageFactory.Reload( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION ); - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - application.GetPlatform().ResetTrace(); - - ticket3 = imageFactory.Reload( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - END_TEST; -} - -// Test for reloading changed image -int UtcDaliImageFactoryReload03(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryReload03 - Reload changed image" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize( 80.0f, 80.0f ); - application.GetPlatform().SetClosestImageSize( testSize ); - - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - - // emulate load success - EmulateImageLoaded( application, 80, 80 ); - - Vector2 newSize( 192.0f, 192.0f ); - application.GetPlatform().SetClosestImageSize( newSize ); - - // Image file changed size, new resource request should be issued - ResourceTicketPtr ticket2 = imageFactory.Reload( *req.Get() ); - DALI_TEST_CHECK( ticket != ticket2 ); - - ResourceTicketPtr ticket3 = imageFactory.Reload( *req.Get() ); - DALI_TEST_EQUALS( ticket2, ticket3, TEST_LOCATION ); - END_TEST; -} - -// Testing file system access when reloading image -int UtcDaliImageFactoryReload04(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryReload04 - Reload unchanged image" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize(80.0f, 80.0f); - application.GetPlatform().SetClosestImageSize(testSize); - - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - application.GetPlatform().ResetTrace(); - - ResourceTicketPtr ticket2 = imageFactory.Reload( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - DALI_TEST_EQUALS( ticket, ticket2, TEST_LOCATION ); - // resource is still loading, do not issue another request - DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - - // emulate load success - EmulateImageLoaded( application, 80, 80 ); - - ResourceTicketPtr ticket3 = imageFactory.Reload( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - // size didn't change, using same ticket - DALI_TEST_EQUALS( ticket, ticket3, TEST_LOCATION ); - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - application.GetPlatform().ResetTrace(); - - // still loading - ticket3 = imageFactory.Reload( *req.Get() ); - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - END_TEST; -} - -// Testing OnDemand + Reload -// Reload should have no effect if OnDemand Image is not loaded yet, as stated in the API documentation -int UtcDaliImageFactoryReload05(void) -{ - TestApplication application; - - tet_infoline( "UtcDaliImageFactoryReload05 - Reload OnDemand image" ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize(80.0f, 80.0f); - application.GetPlatform().SetClosestImageSize(testSize); - - RequestPtr req; - ImageAttributes attr = ImageAttributes::New(); - attr.SetSize( 80, 80 ); - - // this happens first when loading Image OnDemand - req = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - - application.SendNotification(); - application.Render(); - - ResourceTicketPtr ticket = imageFactory.Reload( *req.Get() ); - - DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - DALI_TEST_CHECK( !ticket ); - - // this happens when Image is put on stage - ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - DALI_TEST_CHECK( ticket ); - application.GetPlatform().ResetTrace(); - - ticket = imageFactory.Reload( *req.Get() ); - DALI_TEST_CHECK( ticket ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - // still loading, no new request - DALI_TEST_CHECK( !application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - - // emulate load success - EmulateImageLoaded( application, 80, 80 ); - - ticket = imageFactory.Reload( *req.Get() ); - DALI_TEST_CHECK( ticket ); - - application.SendNotification(); - application.Render(); - - application.SendNotification(); - application.Render(); - - - DALI_TEST_CHECK( application.GetPlatform().WasCalled( TestPlatformAbstraction::LoadResourceFunc ) ); - END_TEST; -} - -// Initally two different requests map to same resource. -// After overwriting the file, they load different image resources. -int UtcDaliImageFactoryReload06(void) -{ - TestApplication application; - tet_infoline( "UtcDaliImageFactoryReload06 - Two requests first mapping to same resource, then different resources." ); - - ImageFactory& imageFactory = Internal::ThreadLocalStorage::Get().GetImageFactory(); - - Vector2 testSize(2048.0f, 2048.0f); - application.GetPlatform().SetClosestImageSize( testSize ); - - // request with default attributes ( size is 0,0 ) - RequestPtr req = imageFactory.RegisterRequest( gTestImageFilename, NULL ); - ResourceTicketPtr ticket = imageFactory.Load( *req.Get() ); - - application.SendNotification(); - application.Render(); - application.SendNotification(); - application.Render(); - - // emulate load success - EmulateImageLoaded( application, testSize.x, testSize.y ); - - // Request bigger size than actual image. - // This will load the same resource. - // However if image size changes later on to eg. 512*512 (file is overwritten), - // reissuing these two requests will load different resources. - ImageAttributes attr = ImageAttributes::New(); - attr.SetSize( testSize.x + 1, testSize.y + 1 ); - RequestPtr req2 = imageFactory.RegisterRequest( gTestImageFilename, &attr ); - ResourceTicketPtr ticket2 = imageFactory.Load( *req2.Get() ); - - DALI_TEST_CHECK( req != req2 ); // different requests - DALI_TEST_EQUALS( ticket->GetId(), ticket2->GetId(), TEST_LOCATION ); // same resource - - Vector2 newSize(512.0f, 512.0f); - application.GetPlatform().SetClosestImageSize(newSize); - - // reload fixed size (192,192) request - ticket2 = imageFactory.Reload( *req2.Get() ); - - // emulate load success - // note: this is the only way to emulate what size is loaded by platform abstraction - EmulateImageLoaded( application, testSize.x + 1, testSize.y + 1 ); - - // reload default size request - ticket = imageFactory.Reload( *req.Get() ); - - DALI_TEST_CHECK( ticket->GetId() != ticket2->GetId() ); // different resources - END_TEST; -} diff --git a/dali/integration-api/profiling.cpp b/dali/integration-api/profiling.cpp index 57a798d..a4e97d1 100644 --- a/dali/integration-api/profiling.cpp +++ b/dali/integration-api/profiling.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -37,7 +37,6 @@ #include -#include #include #include @@ -105,7 +104,6 @@ const int LAYER_MEMORY_SIZE( sizeof( Internal::SceneGraph::Layer ) ); const int IMAGE_MEMORY_SIZE( sizeof( Internal::Image ) + - sizeof( Internal::ImageFactoryCache::Request ) + sizeof( Integration::Bitmap ) + sizeof( Internal::TextureMetadata ) + sizeof( Internal::BitmapTexture ) + diff --git a/dali/integration-api/resource-declarations.h b/dali/integration-api/resource-declarations.h index 16118aa..a17af2e 100644 --- a/dali/integration-api/resource-declarations.h +++ b/dali/integration-api/resource-declarations.h @@ -46,7 +46,6 @@ namespace Integration * @sa Dali::Integration::PlatformAbstraction::LoadResource * Dali::Integration::PlatformAbstraction::GetResources * Dali::Integration::ResourceCache - * Dali::Internal::ImageFactoryCache::RequestId */ typedef unsigned int ResourceId; const ResourceId InvalidResourceId = (ResourceId)-1; diff --git a/dali/internal/common/core-impl.cpp b/dali/internal/common/core-impl.cpp index c9a810c..c7f51ae 100644 --- a/dali/internal/common/core-impl.cpp +++ b/dali/internal/common/core-impl.cpp @@ -37,7 +37,6 @@ #include #include #include -#include #include #include @@ -97,7 +96,6 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, mDiscardQueue(NULL), mTextureUploadedQueue(), mNotificationManager(NULL), - mImageFactory(NULL), mShaderFactory(NULL), mGeometryBatcher( NULL ), mIsActive(true), @@ -170,7 +168,6 @@ Core::Core( RenderController& renderController, PlatformAbstraction& platform, mGestureEventProcessor = new GestureEventProcessor(*mStage, gestureManager, mRenderController); mEventProcessor = new EventProcessor(*mStage, *mNotificationManager, *mGestureEventProcessor); - mImageFactory = new ImageFactory( *mResourceClient ); mShaderFactory = new ShaderFactory(); mUpdateManager->SetShaderSaver( *mShaderFactory ); @@ -210,7 +207,6 @@ Core::~Core() delete mEventProcessor; delete mGestureEventProcessor; delete mNotificationManager; - delete mImageFactory; delete mShaderFactory; delete mResourceClient; delete mResourceManager; @@ -232,7 +228,6 @@ void Core::RecoverFromContextLoss() { DALI_LOG_INFO(gCoreFilter, Debug::Verbose, "Core::RecoverFromContextLoss()\n"); - mImageFactory->RecoverFromContextLoss(); // Reload images from files mStage->GetRenderTaskList().RecoverFromContextLoss(); // Re-trigger render-tasks } @@ -359,9 +354,6 @@ void Core::ProcessEvents() // Run the size negotiation after event processing finished signal mRelayoutController->Relayout(); - // Flush discard queue for image factory - mImageFactory->FlushReleaseQueue(); - // Flush any queued messages for the update-thread const bool messagesToProcess = mUpdateManager->FlushQueue(); @@ -446,11 +438,6 @@ ResourceClient& Core::GetResourceClient() return *(mResourceClient); } -ImageFactory& Core::GetImageFactory() -{ - return *(mImageFactory); -} - ShaderFactory& Core::GetShaderFactory() { return *(mShaderFactory); diff --git a/dali/internal/common/core-impl.h b/dali/internal/common/core-impl.h index 0b13383..091408f 100644 --- a/dali/internal/common/core-impl.h +++ b/dali/internal/common/core-impl.h @@ -55,7 +55,6 @@ class EventProcessor; class GestureEventProcessor; class ResourceClient; class ResourceManager; -class ImageFactory; class ShaderFactory; class TouchResampler; class RelayoutController; @@ -244,12 +243,6 @@ private: // for use by ThreadLocalStorage ResourceClient& GetResourceClient(); /** - * Returns the Image factory - * @return A reference to the Image factory. - */ - ImageFactory& GetImageFactory(); - - /** * Returns the Shader factory * @return A reference to the Shader binary factory. */ @@ -296,7 +289,6 @@ private: NotificationManager* mNotificationManager; ///< Notification manager AnimationPlaylistOwner mAnimationPlaylist; ///< For 'Fire and forget' animation support OwnerPointer mPropertyNotificationManager; ///< For safe signal emmision of property changed notifications - ImageFactory* mImageFactory; ///< Image resource factory ShaderFactory* mShaderFactory; ///< Shader resource factory ResourceClient* mResourceClient; ///< Asynchronous Resource Loading ResourceManager* mResourceManager; ///< Asynchronous Resource Loading diff --git a/dali/internal/event/common/thread-local-storage.cpp b/dali/internal/event/common/thread-local-storage.cpp index 9202734..33d4540 100644 --- a/dali/internal/event/common/thread-local-storage.cpp +++ b/dali/internal/event/common/thread-local-storage.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -97,11 +97,6 @@ ResourceClient& ThreadLocalStorage::GetResourceClient() return mCore->GetResourceClient(); } -ImageFactory& ThreadLocalStorage::GetImageFactory() -{ - return mCore->GetImageFactory(); -} - ShaderFactory& ThreadLocalStorage::GetShaderFactory() { return mCore->GetShaderFactory(); diff --git a/dali/internal/event/common/thread-local-storage.h b/dali/internal/event/common/thread-local-storage.h index 73a4021..4b16f1f 100644 --- a/dali/internal/event/common/thread-local-storage.h +++ b/dali/internal/event/common/thread-local-storage.h @@ -2,7 +2,7 @@ #define __DALI_INTERNAL_THREAD_LOCAL_STORAGE_H__ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2017 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,7 +38,6 @@ class Core; class NotificationManager; class ResourceClient; class ResourceManager; -class ImageFactory; class ShaderFactory; class GestureEventProcessor; class RelayoutController; @@ -123,12 +122,6 @@ public: ResourceClient& GetResourceClient(); /** - * Returns the Image Factory - * @return reference to the Image Factory - */ - ImageFactory& GetImageFactory(); - - /** * Returns the Shader Factory * @return reference to the Shader Factory */ diff --git a/dali/internal/event/images/atlas-impl.cpp b/dali/internal/event/images/atlas-impl.cpp index 97ab217..e5e3080 100644 --- a/dali/internal/event/images/atlas-impl.cpp +++ b/dali/internal/event/images/atlas-impl.cpp @@ -24,7 +24,6 @@ // INTERNAL INCLUDES #include #include -#include #include #include #include @@ -156,7 +155,6 @@ Atlas::Atlas( SizeType width, Pixel::Format pixelFormat, bool recoverContext ) : mResourceClient( ThreadLocalStorage::Get().GetResourceClient() ), - mImageFactory( ThreadLocalStorage::Get().GetImageFactory() ), mClearColor( Vector4::ZERO ), mPixelFormat( pixelFormat ), mClear( false ), @@ -208,7 +206,6 @@ void Atlas::AllocateAtlas() { mTicket = mResourceClient.AllocateTexture( mWidth, mHeight, mPixelFormat ); mTicket->AddObserver( *this ); - mImageFactory.RegisterForContextRecovery( this ); } } @@ -216,7 +213,6 @@ void Atlas::ReleaseAtlas() { mTicket.Reset(); ClearCache(); - mImageFactory.UnregisterFromContextRecovery( this ); } void Atlas::ClearBackground(const Vector4& color ) diff --git a/dali/internal/event/images/atlas-impl.h b/dali/internal/event/images/atlas-impl.h index d7e704b..8edab85 100644 --- a/dali/internal/event/images/atlas-impl.h +++ b/dali/internal/event/images/atlas-impl.h @@ -179,7 +179,6 @@ private: private: ResourceClient& mResourceClient; - ImageFactory& mImageFactory; Vector4 mClearColor; ///< The background clear color Vector mTiles; ///< The url resources, which would recover automatically when regaining context Pixel::Format mPixelFormat; ///< The pixel format (rgba 32 bit by default) diff --git a/dali/internal/event/images/buffer-image-impl.cpp b/dali/internal/event/images/buffer-image-impl.cpp index 2b82133..8f8f786 100644 --- a/dali/internal/event/images/buffer-image-impl.cpp +++ b/dali/internal/event/images/buffer-image-impl.cpp @@ -26,7 +26,6 @@ #include #include #include -#include using namespace Dali::Integration; diff --git a/dali/internal/event/images/encoded-buffer-image-impl.cpp b/dali/internal/event/images/encoded-buffer-image-impl.cpp index d69d23e..5538994 100644 --- a/dali/internal/event/images/encoded-buffer-image-impl.cpp +++ b/dali/internal/event/images/encoded-buffer-image-impl.cpp @@ -52,7 +52,6 @@ EncodedBufferImagePtr EncodedBufferImage::New( const uint8_t * const encodedImag EncodedBufferImagePtr image( new EncodedBufferImage() ); image->Initialize(); // Second stage initialization - // Replicate the functionality of ImageFactory::load() without the filesystem caching: Dali::Integration::BitmapResourceType resourceType( size, fittingMode, samplingMode, orientationCorrection ); RequestBufferPtr buffer( new RequestBuffer ); buffer->GetVector().Resize( encodedImageByteCount ); diff --git a/dali/internal/event/images/image-connector.cpp b/dali/internal/event/images/image-connector.cpp deleted file mode 100644 index 265115c..0000000 --- a/dali/internal/event/images/image-connector.cpp +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// CLASS HEADER -#include - -// INTERNAL INCLUDES -#include - -namespace Dali -{ - -namespace Internal -{ - -ImageConnector::ImageConnector() -: mImage(NULL) -{ -} - -ImageConnector::~ImageConnector() -{ -} - -ImagePtr ImageConnector::Get() const -{ - return mImage; -} - -void ImageConnector::Set( ImagePtr image, bool onStage ) -{ - if ( mImage != image ) - { - // Disconnect from old image - if ( mImage && onStage ) - { - mImage->Disconnect(); - } - - mImage = image; - - // Connect to new image - if ( mImage && onStage ) - { - mImage->Connect(); - } - } -} - -void ImageConnector::OnStageConnect() -{ - if ( mImage ) - { - mImage->Connect(); - } -} - -void ImageConnector::OnStageDisconnect() -{ - if ( mImage ) - { - mImage->Disconnect(); - } -} - -} // namespace Internal - -} // namespace Dali diff --git a/dali/internal/event/images/image-connector.h b/dali/internal/event/images/image-connector.h deleted file mode 100644 index a778ed8..0000000 --- a/dali/internal/event/images/image-connector.h +++ /dev/null @@ -1,88 +0,0 @@ -#ifndef __DALI_INTERNAL_IMAGE_CONNECTOR_H__ -#define __DALI_INTERNAL_IMAGE_CONNECTOR_H__ - -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// EXTERNAL INCLUDES -#include - -// INTERNAL INCLUDES -#include - -namespace Dali -{ - -namespace Internal -{ - -/** - * Wrapper class which helps managing intrusive pointer assignments and Connect / Disconnect. - */ -class ImageConnector -{ - -public: - /** - * Constructor. Takes no parameters. - */ - ImageConnector(); - - /** - * Destructor. - */ - ~ImageConnector(); - - /** - * Returns a smart pointer to the image - * @return a smart pointer to the image - */ - ImagePtr Get() const; - - /** - * Assigns image, calling Connect and Disconnect methods accordingly, taking onStage into account. - * @param [in] image smart pointer to new Image - * @param [in] onStage whether Image is used on stage or not - */ - void Set( ImagePtr image, bool onStage ); - - /** - * Manages connection reference count. - * Must be called from owner when connected to stage. - */ - void OnStageConnect(); - - /** - * Manages connection reference count. - * Must be called from owner when disconnecting from stage. - */ - void OnStageDisconnect(); - -private: - - ImageConnector( const ImageConnector& ptr ); ///< copy constructor, not defined - const ImageConnector& operator=( const ImageConnector& ptr ); ///< copy assignment operator, not defined - - ImagePtr mImage; ///< intrusive pointer to the Image. ImageConnector owns this. - -}; - -} // namespace Internal - -} // namespace Dali - -#endif // __DALI_INTERNAL_IMAGE_CONNECTOR_H__ diff --git a/dali/internal/event/images/image-factory-cache.cpp b/dali/internal/event/images/image-factory-cache.cpp deleted file mode 100644 index 1dee4c9..0000000 --- a/dali/internal/event/images/image-factory-cache.cpp +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// CLASS HEADER -#include - -// INTERNAL INCLUDES -#include -#include -#include -#include - -// EXTERNAL INCLUDES - - -using namespace Dali::Internal::ImageFactoryCache; - -namespace Dali -{ - -namespace Internal -{ - -namespace ImageFactoryCache -{ - Request::Request( RequestLifetimeObserver& observer, - RequestId reqId, - ResourceId resId, - const std::string& path, - const ImageAttributes* attr ) - : resourceId( resId ), - url( path ), - mId( reqId ), - mLifetimeObserver( &observer ) - { - if( attr ) - { - attributes = new ImageAttributes( *attr ); - } - else - { - attributes = NULL; - } - } - - Request::~Request() - { - if( Stage::IsInstalled() && mLifetimeObserver ) - { - mLifetimeObserver->RequestDiscarded( *this ); - } - delete attributes; - } - - RequestId Request::GetId() const - { - return mId; - } - - void Request::StopLifetimeObservation() - { - mLifetimeObserver = NULL; - } - -} // namespace ImageFactoryCache - -} // namespace Internal - -} // namespace Dali diff --git a/dali/internal/event/images/image-factory-cache.h b/dali/internal/event/images/image-factory-cache.h deleted file mode 100644 index fea0406..0000000 --- a/dali/internal/event/images/image-factory-cache.h +++ /dev/null @@ -1,134 +0,0 @@ -#ifndef __DALI_INTERNAL_IMAGE_FACTORY_CACHE_H__ -#define __DALI_INTERNAL_IMAGE_FACTORY_CACHE_H__ - -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// INTERNAL INCLUDES -#include -#include -#include - -// EXTERNAL INCLUDES - - -namespace Dali -{ - -namespace Internal -{ - -namespace ImageFactoryCache -{ - -/** - * Request contains information about requests made when loading image resources. - */ -struct Request; - -/** - * @brief Unique ID for image resource requests. - * - * Images are loaded from a string locator (typically a file path) using a set - * of ImageAttributes. Each unique pair of string and attributes is mapped to a - * unique RequestId value. This ensures multiple Image objects loading the same - * image file with the same attributes only generate one resource request and - * Core only issues one IO operation to Adaptor to do the load. - * - * @sa Dali::Integration::ResourceId - */ -typedef unsigned int RequestId; - -typedef std::multimap RequestPathHashMap; -typedef std::pair RequestPathHashPair; -typedef std::map RequestIdMap; -typedef std::pair RequestIdPair; - -typedef IntrusivePtr RequestPtr; - -/** - * The RequestLifetimeObserver observes the lifetime of image requests. - */ -class RequestLifetimeObserver -{ -public: - - /** - * Called when an image request is discarded. - * This occurs during the ImageFactoryCache::Request destructor. - * @param[in] request The discarded request. - */ - virtual void RequestDiscarded( const Request& request ) = 0; -}; - -/** -* Request is a reference counted object to control the lifetime of elements in ImageFactory's cache. -* When no more Image objects reference a request, it gets removed from ImageFactory cache. -*/ -struct Request : public RefObject -{ - /** - * Image request. - * These requests are stored in ImageFactory's cache. - * @param [in] observer The object which observes request lifetime. - * @param [in] reqId A unique ID for this request. - * @param [ib] resId A unique ticket ID. - * @param [in] path Url of request. - * @param [in] attr Requested ImageAttributes. - */ - Request( RequestLifetimeObserver& observer, RequestId reqId, ResourceId resId, const std::string& path, const ImageAttributes *attr ); - - ResourceId resourceId; ///< The Ticket ID. This can be used to acquire details of the loaded resource from ResourceClient. - const std::string url; ///< Path to the image resource - ImageAttributes* attributes; ///< ImageAttributes that were used - -public: - /** - * Retrieve the unique ID of this request. - * @return The unique ID for this request. - */ - RequestId GetId() const; - - /** - * Called when the RequestLifetimeObserver is being destroyed. - * This method should only be called during destruction of the Dali core. - */ - void StopLifetimeObservation(); - -protected: - virtual ~Request(); - -private: - Request(); ///< not defined - Request(const Request& rhs); ///< not defined - Request& operator=(const Request& rhs); ///< not defined - -private: - RequestId mId; ///< Request id assigned by ImageFactory - RequestLifetimeObserver* mLifetimeObserver; ///< reference to the lifetime-observer; not owned -}; - -typedef std::pair RequestPathHashRange; - -} // namespace ImageFactoryCache - -} // namespace Internal - -} // namespace Dali - -#endif // __DALI_INTERNAL_IMAGE_FACTORY_CACHE_H__ - diff --git a/dali/internal/event/images/image-factory.cpp b/dali/internal/event/images/image-factory.cpp deleted file mode 100644 index 88d24a6..0000000 --- a/dali/internal/event/images/image-factory.cpp +++ /dev/null @@ -1,517 +0,0 @@ -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// CLASS HEADER -#include - -// INTERNAL INCLUDES -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// EXTERNAL INCLUDES -#include - -using namespace Dali::Integration; -using namespace Dali::Internal::ImageFactoryCache; - -namespace Dali -{ - -namespace Internal -{ - -ImageFactory::ImageFactory( ResourceClient& resourceClient ) -: mResourceClient(resourceClient), - mMaxScale( 4 / 1024.0f ), ///< Only allow a very tiny fudge factor in matching new requests to existing resource transactions: 4 pixels at a dimension of 1024, 2 at 512, ... - mReqIdCurrent(0) -{ -} - -ImageFactory::~ImageFactory() -{ - // Request memory is freed up by intrusive_ptr - - mRequestCache.clear(); -} - -Request* ImageFactory::RegisterRequest( const std::string &filename, const ImageAttributes *attr ) -{ - // check url cache - // check if same request exists - std::size_t urlHash = CalculateHash( filename ); - - Request* foundReq( NULL ); - foundReq = FindRequest( filename, urlHash, attr ); - - if( !foundReq ) - { - // the same request hasn't been made before - foundReq = InsertNewRequest( 0, filename, urlHash, attr ); - } - - return foundReq; -} - -ResourceTicketPtr ImageFactory::Load( Request& request ) -{ - ResourceTicketPtr ticket; - - // See if any resource transaction has already been associated with this request: - const ResourceId resId = request.resourceId; - if( resId != 0 ) - { - // An IO operation has been started at some time for the request so recover the - // ticket that was created for that: - ticket = mResourceClient.RequestResourceTicket( resId ); ///@note Always succeeds in normal use. - } - else - { - // Request not yet associated with a ticketed async resource transaction, so - // attempt to find a compatible cached one: - const std::size_t urlHash = GetHashForCachedRequest( request ); - ticket = FindCompatibleResource( request.url, urlHash, request.attributes ); - } - - // Start a new resource IO transaction for the request if none is already happening: - if( !ticket ) - { - ticket = IssueLoadRequest( request.url, request.attributes ); - } - request.resourceId = ticket->GetId(); - - DALI_ASSERT_DEBUG( ticket->GetTypePath().type->id == ResourceBitmap || - ticket->GetTypePath().type->id == ResourceNativeImage || - ticket->GetTypePath().type->id == ResourceTargetImage ); - return ticket; -} - -// File can change on fs, but still requesting same attributes. -// Returning the ticket is important, because if two different requests mapped to the same resource -// before, it is not guaranteed that they will still map to the same resource after reloading. -// Example: -// Image size (40, 40), Req1(img, 40, 40), Req2(img, 256, 256) -// In this case both requests will be associated with the resource of size (40, 40) -// If image changes on filesystem to size (96, 96) -> now after reloading Req2 would load a -// new resource of size (96, 96), but reloading Req1 would load a scaled down version -ResourceTicketPtr ImageFactory::Reload( Request& request ) -{ - // go through requests, check real size and attributes again. If different, update related ticket. - ResourceTicketPtr ticket; - - if( !request.resourceId ) - { - // in case of OnDemand loading, just return - return NULL; - } - - ticket = mResourceClient.RequestResourceTicket( request.resourceId ); - - // ticket might have been deleted, eg. Image::Disconnect - if( !ticket ) - { - ticket = IssueLoadRequest( request.url, request.attributes ); - request.resourceId = ticket->GetId(); - } - else // ticket still alive - { - DALI_ASSERT_DEBUG( ticket->GetTypePath().type->id == ResourceBitmap || - ticket->GetTypePath().type->id == ResourceNativeImage || - ticket->GetTypePath().type->id == ResourceTargetImage ); - - // do not reload if still loading - if ( ticket->GetLoadingState() == ResourceLoading ) - { - return ticket; - } - - ImageDimensions closestSize; - if( request.attributes ) - { - closestSize = Internal::ThreadLocalStorage::Get().GetPlatformAbstraction(). - GetClosestImageSize( request.url, ImageDimensions( request.attributes->GetSize().width, request.attributes->GetSize().width ), - request.attributes->GetScalingMode(), request.attributes->GetFilterMode(), request.attributes->GetOrientationCorrection() ); - } - else - { - closestSize = Internal::ThreadLocalStorage::Get().GetPlatformAbstraction().GetClosestImageSize( request.url ); - } - Vector2 size( closestSize.GetX(), closestSize.GetY() ); - - const ImageAttributes& attrib = static_cast(ticket.Get())->GetAttributes(); - - if( size == attrib.GetSize() ) - { - mResourceClient.ReloadResource( ticket->GetId(), false ); - } - else - { - // if not, return a different ticket - ticket = IssueLoadRequest( request.url, request.attributes ); - request.resourceId = ticket->GetId(); - } - } - return ticket; -} - -void ImageFactory::RecoverFromContextLoss() -{ - for( RequestIdMap::iterator it = mRequestCache.begin(); it != mRequestCache.end(); ++it ) - { - // go through requests, reload with resource ticket's attributes. - Request* request = (*it).second; - if( request->resourceId ) - { - ResourceTicketPtr ticket = mResourceClient.RequestResourceTicket( request->resourceId ); - - // do not reload if still loading - // check ticket is not NULL as the resource could have already been destroyed - if ( ticket && ticket->GetLoadingState() != ResourceLoading ) - { - // Ensure the finished status is reset - mResourceClient.ReloadResource( ticket->GetId(), true ); - } - } - } - - Vector< ContextRecoveryInterface* >::ConstIterator end = mContextRecoveryList.End(); - for( Vector< ContextRecoveryInterface* >::Iterator iter = mContextRecoveryList.Begin(); - iter != end; iter++) - { - (*iter)->RecoverFromContextLoss(); - } -} - - -void ImageFactory::RegisterForContextRecovery( ContextRecoveryInterface* object ) -{ - bool exist( false ); - // To avoid registering the same object again - Vector< ContextRecoveryInterface* >::ConstIterator end = mContextRecoveryList.End(); - for( Vector< ContextRecoveryInterface* >::Iterator iter = mContextRecoveryList.Begin(); - iter != end; iter++) - { - if( object == *(iter) ) - { - exist = true; - break; - } - } - if( !exist ) - { - mContextRecoveryList.PushBack( object ); - } -} -void ImageFactory::UnregisterFromContextRecovery( ContextRecoveryInterface* object ) -{ - Vector< ContextRecoveryInterface* >::ConstIterator end = mContextRecoveryList.End(); - for( Vector< ContextRecoveryInterface* >::Iterator iter = mContextRecoveryList.Begin(); - iter != end; iter++ ) - { - if( object == *(iter) ) - { - iter = mContextRecoveryList.Erase( iter ); - break; - } - } -} - -const std::string& ImageFactory::GetRequestPath( const ImageFactoryCache::RequestPtr& request ) const -{ - if( request ) - { - return request->url; - } - - // Only create empty string if required - static std::string empty; - return empty; -} - -const ImageAttributes& ImageFactory::GetActualAttributes( const ResourceTicketPtr& ticket ) const -{ - if( ticket ) - { - DALI_ASSERT_DEBUG( ticket->GetTypePath().type->id == ResourceBitmap || - ticket->GetTypePath().type->id == ResourceNativeImage || - ticket->GetTypePath().type->id == ResourceTargetImage ); - const ImageAttributes& attrib = static_cast(ticket.Get())->GetAttributes(); - return attrib; - } - return ImageAttributes::DEFAULT_ATTRIBUTES; -} - -const ImageAttributes& ImageFactory::GetRequestAttributes( const ImageFactoryCache::RequestPtr& request ) const -{ - if( request && request->attributes ) - { - return *(request->attributes); - } - - return ImageAttributes::DEFAULT_ATTRIBUTES; -} - -void ImageFactory::GetImageSize( const ImageFactoryCache::RequestPtr& request, const ResourceTicketPtr& ticket, Size& size ) -{ - if( ticket && ticket->GetLoadingState() != ResourceLoading ) - { - // it is loaded so get the size from actual attributes - size = GetActualAttributes( ticket ).GetSize(); - } - else - { - // not loaded so either loading or not yet loaded, ask platform abstraction - Integration::PlatformAbstraction& platformAbstraction = Internal::ThreadLocalStorage::Get().GetPlatformAbstraction(); - - const ImageAttributes& attributes = GetRequestAttributes( request ); - const ImageDimensions closestSize = platformAbstraction.GetClosestImageSize( GetRequestPath( request ), - ImageDimensions( attributes.GetSize().width, attributes.GetSize().width ), - attributes.GetScalingMode(), attributes.GetFilterMode(), attributes.GetOrientationCorrection() ); - size[0] = closestSize.GetX(); - size[1] = closestSize.GetY(); - } -} - -void ImageFactory::ReleaseTicket( ResourceTicket* ticket ) -{ - ResourceTicketPtr ticketPtr(ticket); - mTicketsToRelease.push_back(ticketPtr); -} - -void ImageFactory::FlushReleaseQueue() -{ - mTicketsToRelease.clear(); -} - -bool ImageFactory::CompareAttributes( const ImageAttributes& requested, - const ImageAttributes& actual ) const -{ - // do not load image resource again if there is a similar resource loaded: - // see explanation in image.h of what is deemed compatible - return (requested.GetScalingMode() == actual.GetScalingMode()) && - ( - (requested.GetFilterMode() == actual.GetFilterMode()) || - (requested.GetFilterMode() == SamplingMode::DONT_CARE) - ) && - (fabsf(static_cast(requested.GetWidth()) - static_cast(actual.GetWidth())) <= actual.GetWidth() * mMaxScale) && - (fabsf(static_cast(requested.GetHeight()) - static_cast(actual.GetHeight())) <= actual.GetHeight() * mMaxScale); -} - -Request* ImageFactory::InsertNewRequest( ResourceId resourceId, const std::string& filename, std::size_t urlHash, const ImageAttributes* attr ) -{ - ++mReqIdCurrent; - Request* request = new Request( *this, mReqIdCurrent, resourceId, filename, attr ); - mRequestCache.insert( RequestIdPair( mReqIdCurrent, request ) ); - mUrlCache.insert( RequestPathHashPair( urlHash, mReqIdCurrent ) ); - return request; -} - -Request* ImageFactory::FindRequest( const std::string& filename, size_t hash, const ImageAttributes* attributes ) -{ - // Search for a matching resource - - // check whether the url has been used before - RequestPathHashRange foundRequests = mUrlCache.equal_range( hash ); - - // look for exact matches first - for( RequestPathHashMap::iterator it = foundRequests.first; it != foundRequests.second; ++it ) - { - RequestId cachedReqId = it->second; - - // get cached request - RequestIdMap::iterator foundRequestIter = mRequestCache.find( cachedReqId ); - DALI_ASSERT_DEBUG( foundRequestIter != mRequestCache.end() && "Only requests that are live in mRequestCache should appear in mUrlCache which is an index to speed-up lookups into it."); - if( foundRequestIter != mRequestCache.end() ) - { - const Request& cachedRequest = *(foundRequestIter->second); - const ImageAttributes* storedAttributes = cachedRequest.attributes; - - // compare attributes: NULL means default attributes - if( !attributes ) - { - attributes = &ImageAttributes::DEFAULT_ATTRIBUTES; - } - if( !storedAttributes ) - { - storedAttributes = &ImageAttributes::DEFAULT_ATTRIBUTES; - } - - if( *attributes != *storedAttributes ) - { - continue; - } - - if( filename.compare( cachedRequest.url ) ) - { - // hash collision, filenames don't match - continue; - } - - // we've found an exact match - return foundRequestIter->second; - } - } - - return NULL; -} - -ResourceTicketPtr ImageFactory::FindCompatibleResource( const std::string& filename, size_t hash, const ImageAttributes* attr ) -{ - ResourceTicketPtr ticket; - // check whether the url has been used before - RequestPathHashRange foundRequests = mUrlCache.equal_range( hash ); - - bool foundCompatible = false; - if( foundRequests.first != mUrlCache.end() ) - { - // check if we have a compatible resource already loaded - for( RequestPathHashMap::iterator it = foundRequests.first; it != foundRequests.second; ++it ) - { - RequestId cachedReqId = it->second; - - // get cached request - RequestIdMap::iterator foundRequestIter = mRequestCache.find( cachedReqId ); - DALI_ASSERT_DEBUG( foundRequestIter != mRequestCache.end() ); - if( foundRequestIter != mRequestCache.end() ) - { - Request& cachedRequest = *(foundRequestIter->second); - if( filename.compare( cachedRequest.url ) ) - { - // hash collision, filenames don't match - continue; - } - - if( !cachedRequest.resourceId ) - { - continue; - } - - ticket = mResourceClient.RequestResourceTicket( cachedRequest.resourceId ); - if( !ticket ) - { - cachedRequest.resourceId = 0; - continue; - } - - DALI_ASSERT_DEBUG( ticket->GetTypePath().type->id == ResourceBitmap || - ticket->GetTypePath().type->id == ResourceNativeImage || - ticket->GetTypePath().type->id == ResourceTargetImage ); - - // check for compatible ImageAttributes - const ImageAttributes& storedAttributes = static_cast(ticket.Get())->GetAttributes(); - if( !attr ) - { - attr = &ImageAttributes::DEFAULT_ATTRIBUTES; - } - - // in case both attributes are default or they are matching custom ones - if( CompareAttributes( *attr, storedAttributes ) ) - { - // found compatible resource - foundCompatible = true; - break; - } - } - } // for( it ... - } // foundRequests.first - - if( !foundCompatible ) - { - ticket.Reset(); - } - - return ticket; -} - -ResourceTicketPtr ImageFactory::IssueLoadRequest( const std::string& filename, const ImageAttributes* attr ) -{ - ImageDimensions dimensions; - FittingMode::Type fittingMode = FittingMode::DEFAULT; - SamplingMode::Type samplingMode = SamplingMode::DEFAULT; - bool orientation = true; - - if( attr ) - { - dimensions = ImageDimensions::FromFloatVec2( attr->GetSize() ); - fittingMode = attr->GetScalingMode(); - samplingMode = attr->GetFilterMode(); - orientation = attr->GetOrientationCorrection(); - } - else - { - // query image size from file if NULL was provided - dimensions = Dali::ResourceImage::GetImageSize( filename ); - ///@ToDo: This is weird and pointless: we introduce a synchronous load of the image header on the event thread here to learn the image's on-disk dimensions to pass on to the resource system, - /// but the default behaviour of the resource system when no dimensions are provided is to use exactly these on-disk dimensions when it eventually does the full load and decode. - } - - BitmapResourceType resourceType( dimensions, fittingMode, samplingMode, orientation ); - ResourceTicketPtr ticket = mResourceClient.RequestResource( resourceType, filename ); - return ticket; -} - -void ImageFactory::RequestDiscarded( const Request& req ) -{ - RequestId id( req.GetId() ); - // find in mRequestCache - RequestIdMap::iterator foundRequestIter = mRequestCache.find( id ); - DALI_ASSERT_DEBUG( foundRequestIter != mRequestCache.end() ); - - // memory is freed up by intrusive_ptr - - mRequestCache.erase( foundRequestIter ); - - // find in mUrlCache - for( RequestPathHashMap::iterator it = mUrlCache.begin(); it != mUrlCache.end(); ++it ) - { - if( id == it->second ) - { - mUrlCache.erase( it ); - break; - } - } -} - -std::size_t ImageFactory::GetHashForCachedRequest( const Request& request ) -{ - const RequestId requestId = request.GetId(); - std::size_t locatorHash(0); - RequestPathHashMap::const_iterator it; - - for( it = mUrlCache.begin(); it != mUrlCache.end(); ++it ) - { - if( it->second == requestId ) - { - locatorHash = it->first; - break; - } - } - DALI_ASSERT_DEBUG( it!=mUrlCache.end() && "Only already-cached requests can have their locator hashes looked-up." ); - return locatorHash; -} - -} // namespace Internal - -} // namespace Dali diff --git a/dali/internal/event/images/image-factory.h b/dali/internal/event/images/image-factory.h deleted file mode 100644 index 4f235ed..0000000 --- a/dali/internal/event/images/image-factory.h +++ /dev/null @@ -1,245 +0,0 @@ -#ifndef __DALI_INTERNAL_IMAGE_FACTORY_H__ -#define __DALI_INTERNAL_IMAGE_FACTORY_H__ - -/* - * Copyright (c) 2014 Samsung Electronics Co., Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -// INTERNAL INCLUDES -#include -#include -#include -#include - -namespace Dali -{ - -namespace Internal -{ -class ResourceType; - -namespace ImageFactoryCache -{ -struct Request; -} - -/** - * ImageFactory is an object that manages Image resource load requests. - * It utilises an internal caching system where previous requests and associated - * resources are stored to avoid accessing the file system when not necessary. - */ -class ImageFactory : public ImageFactoryCache::RequestLifetimeObserver -{ -public: - - /** - * default constructor - */ - ImageFactory( ResourceClient& resourceClient ); - - /** - * Default destructor - */ - virtual ~ImageFactory(); - - /** - * Registers a request for an image resource if not yet available, but does not start loading yet. - * Use Load( req ) to issue load request. - * If image was already requested, an existing request is returned. - * @param [in] filename path of requested image resource - * @param [in] attributes pointer to the ImageAttributes of the request. If NULL, default attributes are used. - * @return request pointer - */ - ImageFactoryCache::Request* RegisterRequest( const std::string& filename, const ImageAttributes *attributes ); - - /** - * Issue a request which has already been registered with ImageFactory. - * If the associated Ticket is no longer alive ImageFactory issues a resource load request. - * @param [in] request Request to be loaded. - * @return intrusive pointer to image ticket. If Load fails, returned pointer is invalid. (!ret) - */ - ResourceTicketPtr Load( ImageFactoryCache::Request& request ); - - /** - * Tells ResourceManager to reload image from filesystem. - * Also sends message to render thread. - * This operation uses the originally requested attributes when reloading the image. - * @pre req must be registered with ImageFactory - * @note if image is still loading, no new load request will be issued - * @param[in] request Request to be reloaded. - * @return the ResourceTicket mapped to the request - */ - ResourceTicketPtr Reload( ImageFactoryCache::Request& request ); - - /** - * Ensures all filesystem images are reloaded into textures. - * This operation uses the originally requested attributes when reloading the image. - * - * Recovering from context loss does not change the number of tickets if the - * image size has changed on the file system since the last load/reload. - * - * If two different requests mapped to the same resource before, they will still - * map to the same resource after context regain even if there would be a better - * fitting texture. - * @pre requests must be registered with ImageFactory - * @note If an image is still loading, no new load request will be issued. - */ - void RecoverFromContextLoss(); - - /** - * Register an object into the context recovery list of the image factory. - * Thus its RecoverFromContextLoss() function would be called when the Stage regaining context. - * @param[in] object The object whose RecoverFromContextLoss() function needs to be called to regain the context. - */ - void RegisterForContextRecovery( ContextRecoveryInterface* object ); - - /** - * Unregister an object from the context recovery list of the image factory - * @param[in] object The object whose RecoverFromContextLoss() function needs to be called to regain the context. - */ - void UnregisterFromContextRecovery( ContextRecoveryInterface* object ); - - /** - * Get resource path used in request. - * @param [in] request of the image - * @return resource path - */ - const std::string& GetRequestPath( const ImageFactoryCache::RequestPtr& request ) const; - - /** - * Get ImageAttributes for an already requested image resource. - * @pre id should mark an existing Resource (Ticket is alive) - * @param [in] ticket of the image - * @return ImageAttributes used for request. - * @throws Throws exception if id is not valid. - */ - const ImageAttributes& GetActualAttributes( const ResourceTicketPtr& ticket ) const; - - /** - * Get ImageAttributes used for request. - * @pre req must point to a Request registered with ImageFactory - * @param [in] request of the image - * @return ImageAttributes used for request. - */ - const ImageAttributes& GetRequestAttributes( const ImageFactoryCache::RequestPtr& request ) const; - - /** - * Retrieve the size of an image. This is either the application requested size or - * the actual (full size) that is or will be loaded. - * @param[in] request of the image - * @param[in] ticket of the image - * @param[out] size of the image - */ - void GetImageSize( const ImageFactoryCache::RequestPtr& request, const ResourceTicketPtr& ticket, Size& size ); - - /** - * Prevents releasing and reloading image resources in the same frame - * @param [in] ticket the resource ticket to queue for releasing - */ - void ReleaseTicket( ResourceTicket* ticket ); - - /** - * Flush the queue of resource tickets that were about to be relased. - * This discards the kept ticket handles at the end of each frame, and this way prevents - * releasing and reloading image resources in the same frame. - */ - void FlushReleaseQueue(); - -public: // From RequestLifetimeObserver - - /** - * Finds request by id in mRequestCache and mUrlCache and removes relevant entries. - * @param [in] id request id - */ - virtual void RequestDiscarded( const ImageFactoryCache::Request& request ); - -private: - - // Undefined - ImageFactory( const ImageFactory& ); - - // Undefined - ImageFactory& operator=( const ImageFactory& rhs ); - - /** - * Checks if the previously loaded image's attributes are compatible with a new request - * @param [in] requested The requested attributes - * @param [in] actual The actual attributes - * @return True if the attributes are compatible - */ - bool CompareAttributes( const ImageAttributes& requested, - const ImageAttributes& actual ) const; - - /** - * Inserts a new request to the request cache and url cache. - * @note this method increases the current request Id counter (mReqIdCurrent) - * @param [in] resourceId Ticket id to insert. - * @param [in] url The requested url to insert. - * @param [in] urlHash Calculated hash value for the url. - * @param [in] attr Pointer to the requested attributes, NULL if default values are used. - * @return pointer to Request - */ - ImageFactoryCache::Request* InsertNewRequest( ResourceId resourceId, const std::string& url, std::size_t urlHash, const ImageAttributes* attr ); - - /** - * Searches request cache for exact match. - * @param [in] filename The url of the image resource. - * @param [in] hash Hash value for the filename. - * @param [in] attributes Pointer to ImageAttributes used for the request or NULL if default attributes were used. - * @return pointer to the found request or NULL if no exact match is found. - */ - ImageFactoryCache::Request* FindRequest( const std::string& filename, size_t hash, const ImageAttributes *attributes ); - - /** - * Searches through tickets to find a compatible resource. - * @param [in] filename The url of the image resource. - * @param [in] hash Hash value for the filename. - * @param [in] attributes Pointer to ImageAttributes used for the request or NULL if default attributes were used. - * @return A ticket pointer to the found resource or an unitialized pointer if no compatible one is found. - */ - ResourceTicketPtr FindCompatibleResource( const std::string& filename, size_t hash, const ImageAttributes* attributes ); - - /** - * Helper function that requests the image resource from platform abstraction. - * @param [in] filename The url of the image resource. - * @param [in] attributes Pointer to ImageAttributes to be used for the request or NULL if default attributes are used. - * @return intrusive pointer to Ticket - */ - ResourceTicketPtr IssueLoadRequest( const std::string& filename, const ImageAttributes* attributes ); - - /** - * Looks-up the hash of the string locator of the already-registered Request - * passed in. - * @param[in] request The image load request to return a locator string hash for. - * @return The hash of the locator string used in the request. - */ - std::size_t GetHashForCachedRequest( const ImageFactoryCache::Request& request ); - -private: - ResourceClient& mResourceClient; - ImageFactoryCache::RequestPathHashMap mUrlCache; ///< A multimap of url hashes and request IDs - ImageFactoryCache::RequestIdMap mRequestCache; ///< A map of request IDs and request information. - ResourceTicketContainer mTicketsToRelease; ///< List of ticket handles - Vector mContextRecoveryList; ///< List of the objects who needs context recovery - float mMaxScale; ///< Defines maximum size difference between compatible resources - ImageFactoryCache::RequestId mReqIdCurrent; ///< Internal counter for Request IDs -}; - -} // namespace Internal - -} // namespace Dali - -#endif // __DALI_INTERNAL_IMAGE_FACTORY_H__ diff --git a/dali/internal/event/images/nine-patch-image-impl.cpp b/dali/internal/event/images/nine-patch-image-impl.cpp index 14c33f4..16f2f89 100644 --- a/dali/internal/event/images/nine-patch-image-impl.cpp +++ b/dali/internal/event/images/nine-patch-image-impl.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include diff --git a/dali/internal/event/images/resource-image-impl.h b/dali/internal/event/images/resource-image-impl.h index 26eb252..9ab3503 100644 --- a/dali/internal/event/images/resource-image-impl.h +++ b/dali/internal/event/images/resource-image-impl.h @@ -24,7 +24,6 @@ // INTERNAL INCLUDES #include #include -#include #include // For DALI_LOG_OBJECT_STRING_DECLARATION namespace Dali diff --git a/dali/internal/event/rendering/sampler-impl.h b/dali/internal/event/rendering/sampler-impl.h index 28384ec..fc43ebd 100644 --- a/dali/internal/event/rendering/sampler-impl.h +++ b/dali/internal/event/rendering/sampler-impl.h @@ -26,7 +26,6 @@ #include // Dali::Internal::Connectable #include // Dali::Internal::ObjectConnector #include // Dali::Internal::Object -#include // Dali::Internal::ImageConnector namespace Dali { diff --git a/dali/internal/event/rendering/texture-set-impl.h b/dali/internal/event/rendering/texture-set-impl.h index 865b868..1916e53 100644 --- a/dali/internal/event/rendering/texture-set-impl.h +++ b/dali/internal/event/rendering/texture-set-impl.h @@ -29,6 +29,7 @@ #include // Dali::Internal::ObjectConnector #include // Dali::Internal::Object #include // Dali::Internal::PropertyBuffer +#include // Dali::Internal::Image #include // Dali::Internal::Sampler #include // Dali::Internal::Texture #include // Dali::Internal::Shader diff --git a/dali/internal/file.list b/dali/internal/file.list index 168959e..5358b5f 100644 --- a/dali/internal/file.list +++ b/dali/internal/file.list @@ -69,9 +69,6 @@ internal_src_files = \ $(internal_src_dir)/event/images/buffer-image-impl.cpp \ $(internal_src_dir)/event/images/frame-buffer-image-impl.cpp \ $(internal_src_dir)/event/images/encoded-buffer-image-impl.cpp \ - $(internal_src_dir)/event/images/image-connector.cpp \ - $(internal_src_dir)/event/images/image-factory.cpp \ - $(internal_src_dir)/event/images/image-factory-cache.cpp \ $(internal_src_dir)/event/images/nine-patch-image-impl.cpp \ $(internal_src_dir)/event/images/resource-image-impl.cpp \ $(internal_src_dir)/event/images/native-image-impl.cpp \ -- 2.7.4