2 * Copyright (c) 2016 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.
19 #include "image-atlas-manager.h"
22 #include <dali/devel-api/images/texture-set-image.h>
23 #include <dali/devel-api/adaptor-framework/image-loading.h>
36 const uint32_t DEFAULT_ATLAS_SIZE( 1024u ); // this size can fit 8 by 8 images of average size 128*128
37 const uint32_t MAX_ITEM_SIZE( 512u );
38 const uint32_t MAX_ITEM_AREA( MAX_ITEM_SIZE*MAX_ITEM_SIZE );
41 ImageAtlasManager::ImageAtlasManager()
42 : mBrokenImageUrl( "" )
46 ImageAtlasManager::~ImageAtlasManager()
50 TextureSet ImageAtlasManager::Add( Vector4& textureRect,
51 const std::string& url,
52 ImageDimensions& size,
53 FittingMode::Type fittingMode,
54 bool orientationCorrection,
55 AtlasUploadObserver* atlasUploadObserver )
57 ImageDimensions dimensions = size;
61 dimensions = Dali::GetClosestImageSize( url );
64 // big image, atlasing is not applied
65 if( static_cast<uint32_t>(dimensions.GetWidth()) * static_cast<uint32_t>(dimensions.GetHeight()) > MAX_ITEM_AREA
66 || dimensions.GetWidth()>DEFAULT_ATLAS_SIZE
67 || dimensions.GetHeight()>DEFAULT_ATLAS_SIZE)
74 for( AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
76 if( (*iter).Upload( textureRect, url, size, fittingMode, orientationCorrection, atlasUploadObserver ) )
78 return mTextureSetList[i];
84 mAtlasList.back().Upload( textureRect, url, size, fittingMode, orientationCorrection, atlasUploadObserver );
85 return mTextureSetList.back();
88 TextureSet ImageAtlasManager::Add( Vector4& textureRect,
92 // big buffer, atlasing is not applied
93 if( static_cast<uint32_t>(pixelData.GetWidth()) * static_cast<uint32_t>(pixelData.GetHeight()) > MAX_ITEM_AREA
94 || pixelData.GetWidth()>DEFAULT_ATLAS_SIZE
95 || pixelData.GetHeight()>DEFAULT_ATLAS_SIZE )
101 for( AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
103 if( (*iter).Upload( textureRect, pixelData ) )
105 return mTextureSetList[i];
111 mAtlasList.back().Upload( textureRect, pixelData );
112 return mTextureSetList.back();
116 void ImageAtlasManager::Remove( TextureSet textureSet, const Vector4& textureRect )
119 for( TextureSetContainer::iterator iter = mTextureSetList.begin(); iter != mTextureSetList.end(); ++iter)
121 if( (*iter) == textureSet )
123 mAtlasList[i].Remove(textureRect);
130 void ImageAtlasManager::SetBrokenImage( const std::string& brokenImageUrl )
132 if( !brokenImageUrl.empty() )
134 mBrokenImageUrl = brokenImageUrl;
138 void ImageAtlasManager::CreateNewAtlas()
140 Toolkit::ImageAtlas newAtlas = Toolkit::ImageAtlas::New( DEFAULT_ATLAS_SIZE, DEFAULT_ATLAS_SIZE );
141 if( !mBrokenImageUrl.empty() )
143 newAtlas.SetBrokenImage( mBrokenImageUrl );
145 mAtlasList.push_back( newAtlas );
146 TextureSet textureSet = TextureSet::New();
147 textureSet.SetTexture( 0u, newAtlas.GetAtlas() );
148 mTextureSetList.push_back( textureSet );
151 } // namespace Internal
153 } // namespace Toolkit