2 * Copyright (c) 2021 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/adaptor-framework/image-loading.h>
32 const uint32_t DEFAULT_ATLAS_SIZE(1024u); // this size can fit 8 by 8 images of average size 128*128
33 const uint32_t MAX_ITEM_SIZE(512u);
34 const uint32_t MAX_ITEM_AREA(MAX_ITEM_SIZE* MAX_ITEM_SIZE);
37 ImageAtlasManager::ImageAtlasManager()
42 ImageAtlasManager::~ImageAtlasManager()
46 TextureSet ImageAtlasManager::Add(Vector4& textureRect,
47 const std::string& url,
48 ImageDimensions& size,
49 FittingMode::Type fittingMode,
50 bool orientationCorrection,
51 AtlasUploadObserver* atlasUploadObserver)
53 ImageDimensions dimensions = size;
57 dimensions = Dali::GetClosestImageSize(url);
60 // big image, atlasing is not applied
61 if(static_cast<uint32_t>(dimensions.GetWidth()) * static_cast<uint32_t>(dimensions.GetHeight()) > MAX_ITEM_AREA || dimensions.GetWidth() > DEFAULT_ATLAS_SIZE || dimensions.GetHeight() > DEFAULT_ATLAS_SIZE)
68 for(AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
70 if((*iter).Upload(textureRect, url, size, fittingMode, orientationCorrection, atlasUploadObserver))
72 return mTextureSetList[i];
78 mAtlasList.back().Upload(textureRect, url, size, fittingMode, orientationCorrection, atlasUploadObserver);
79 return mTextureSetList.back();
82 TextureSet ImageAtlasManager::Add(Vector4& textureRect,
85 // big buffer, atlasing is not applied
86 if(static_cast<uint32_t>(pixelData.GetWidth()) * static_cast<uint32_t>(pixelData.GetHeight()) > MAX_ITEM_AREA || pixelData.GetWidth() > DEFAULT_ATLAS_SIZE || pixelData.GetHeight() > DEFAULT_ATLAS_SIZE)
92 for(AtlasContainer::iterator iter = mAtlasList.begin(); iter != mAtlasList.end(); ++iter)
94 if((*iter).Upload(textureRect, pixelData))
96 return mTextureSetList[i];
102 mAtlasList.back().Upload(textureRect, pixelData);
103 return mTextureSetList.back();
106 void ImageAtlasManager::Remove(TextureSet textureSet, const Vector4& textureRect)
109 for(TextureSetContainer::iterator iter = mTextureSetList.begin(); iter != mTextureSetList.end(); ++iter)
111 if((*iter) == textureSet)
113 mAtlasList[i].Remove(textureRect);
120 void ImageAtlasManager::SetBrokenImage(const std::string& brokenImageUrl)
122 if(!brokenImageUrl.empty())
124 mBrokenImageUrl = brokenImageUrl;
128 void ImageAtlasManager::CreateNewAtlas()
130 Toolkit::ImageAtlas newAtlas = Toolkit::ImageAtlas::New(DEFAULT_ATLAS_SIZE, DEFAULT_ATLAS_SIZE);
131 if(!mBrokenImageUrl.empty())
133 newAtlas.SetBrokenImage(mBrokenImageUrl);
135 mAtlasList.push_back(newAtlas);
136 TextureSet textureSet = TextureSet::New();
137 textureSet.SetTexture(0u, newAtlas.GetAtlas());
138 mTextureSetList.push_back(textureSet);
141 } // namespace Internal
143 } // namespace Toolkit