1 #ifndef DALI_TOOLKIT_IMAGE_ATLAS_H
2 #define DALI_TOOLKIT_IMAGE_ATLAS_H
4 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
21 #include <dali/public-api/common/vector-wrapper.h>
22 #include <dali/public-api/images/image-operations.h>
23 #include <dali/public-api/images/pixel-data.h>
24 #include <dali/public-api/images/pixel.h>
25 #include <dali/public-api/object/base-handle.h>
26 #include <dali/public-api/rendering/texture.h>
31 #include <dali-toolkit/devel-api/image-loader/atlas-upload-observer.h>
37 namespace Internal DALI_INTERNAL
43 * @brief An ImageAtlas is a large texture containing multiple smaller images.
45 * Only images with url provided or pixel data are supported for uploading.
46 * The images are loaded by a worker thread to avoid blocking the main event thread.
48 class DALI_TOOLKIT_API ImageAtlas : public BaseHandle
51 typedef uint32_t SizeType;
55 * @brief Pack a group of pixel data into atlas.
56 * @param[in] pixelData The group of the pixel data to be packed into the atlas.
57 * @param[out] textureRects The list of texture areas where each frame is located inside the atlas.
58 * @return The atlas texture.
60 static Texture PackToAtlas(const std::vector<PixelData>& pixelData, Dali::Vector<Vector4>& textureRects);
63 * @brief Create a new ImageAtlas.
65 * @param [in] width The atlas width in pixels.
66 * @param [in] height The atlas height in pixels.
67 * @param [in] pixelFormat The pixel format (rgba 32 bit by default).
68 * @return A handle to a new ImageAtlas.
70 static ImageAtlas New(SizeType width, SizeType height, Pixel::Format pixelFormat = Pixel::RGBA8888);
73 * @brief Create an empty handle.
75 * Calling member functions of an empty handle is not allowed.
85 * @brief This copy constructor is required for (smart) pointer semantics.
87 * @param [in] handle A reference to the copied handle
89 ImageAtlas(const ImageAtlas& handle);
92 * @brief This assignment operator is required for (smart) pointer semantics.
94 * @param [in] handle A reference to the copied handle
95 * @return A reference to this
97 ImageAtlas& operator=(const ImageAtlas& handle);
100 * @brief Get the atlas image.
102 * This atlas texture is still valid after destroying the ImageAtlas object.
104 * @return The atlas texture
109 * @brief Query what percentage of space is been occupied in the atlas.
111 * @return The occupancy rate of the atlas.
113 float GetOccupancyRate() const;
116 * @brief Set the broken image which is used to replace the image if loading fails.
118 * @param[in] brokenImageUrl The url of the broken image.
120 void SetBrokenImage(const std::string& brokenImageUrl);
123 * @brief Upload a resource image to the atlas.
125 * @note To make the atlasing efficient, a valid size should be provided.
126 * If size is not provided, then the image file will be opened to read the actual size for loading.
127 * Do not set a size that is bigger than the actual image size, as the up-scaling is not available,
128 * the content of the area not covered by actual image is undefined, it will not be cleared.
130 * SamplingMode::BOX_THEN_LINEAR is used to sampling pixels from the input image while fitting it to desired size.
132 * @param [out] textureRect The texture area of the resource image in the atlas.
133 * @param [in] url The URL of the resource image file to use.
134 * @param [in] size The width and height to fit the loaded image to.
135 * @param [in] fittingMode The method used to fit the shape of the image before loading to the shape defined by the size parameter.
136 * @param [in] orientationCorrection Reorient the image to respect any orientation metadata in its header.
137 * @return True if there is enough space to fit this image in,false otherwise.
139 bool Upload(Vector4& textureRect,
140 const std::string& url,
141 ImageDimensions size = ImageDimensions(),
142 FittingMode::Type fittingMode = FittingMode::DEFAULT,
143 bool orientationCorrection = true);
146 * @brief Upload a resource image to the atlas.
148 * @note To make the atlasing efficient, a valid size should be provided.
149 * If size is not provided, then the image file will be opened to read the actual size for loading.
150 * Do not set a size that is bigger than the actual image size, as the up-scaling is not available,
151 * the content of the area not covered by actual image is undefined, it will not be cleared.
153 * SamplingMode::BOX_THEN_LINEAR is used to sampling pixels from the input image while fitting it to desired size.
155 * @param [out] textureRect The texture area of the resource image in the atlas.
156 * @param [in] url The URL of the resource image file to use.
157 * @param [in] size The width and height to fit the loaded image to.
158 * @param [in] fittingMode The method used to fit the shape of the image before loading to the shape defined by the size parameter.
159 * @param [in] orientationCorrection Reorient the image to respect any orientation metadata in its header.
160 * @param[in] atlasUploadObserver The observer to observe the upload state inside the ImageAtlas.
161 * @return True if there is enough space to fit this image in,false otherwise.
162 * @note The valid callback function here is required to have the signature of void( void ).
164 bool Upload(Vector4& textureRect,
165 const std::string& url,
166 ImageDimensions size,
167 FittingMode::Type fittingMode,
168 bool orientationCorrection,
169 AtlasUploadObserver* atlasUploadObserver);
172 * @brief Upload a pixel buffer to atlas
174 * @param [out] textureRect The texture area of the resource image in the atlas.
175 * @param [in] pixelData The pixel data.
177 bool Upload(Vector4& textureRect, PixelData pixelData);
180 * @brief Remove the image at the given rectangle.
182 * The rectangular area is marked unoccupied, so new image can be added to this area.
184 * @param [in] textureRect The texture area to be removed.
186 void Remove(const Vector4& textureRect);
188 public: // Not intended for developer use
189 explicit DALI_INTERNAL ImageAtlas(Internal::ImageAtlas* impl);
192 } // namespace Toolkit
196 #endif // DALI_TOOLKIT_IMAGE_ATLAS_H