1 #ifndef DALI_PIXEL_BUFFER_H
2 #define DALI_PIXEL_BUFFER_H
5 * Copyright (c) 2024 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/images/pixel-data.h>
23 #include <dali/public-api/images/pixel.h>
24 #include <dali/public-api/object/base-handle.h>
27 #include <dali/public-api/dali-adaptor-common.h>
37 } // namespace Internal
39 // Use namespace to separate from PixelBuffer typedef in buffer-image.h
43 * @brief The PixelBuffer object holds a pixel buffer.
45 * The PixelBuffer keeps ownership of it's initial buffer however, the
46 * user is free to modify the pixel data, either directly, or via
49 * In order to upload the pixel data to texture memory, there are two
50 * possibilities - either convert it back to a PixelData object, which
51 * releases the PixelBuffer object, leaving the user with an empty handle
52 * (ideal for one-time indirect image manipulation), or create a new
53 * PixelData object from this object, leaving the buffer intact (ideal
54 * for continuous manipulation)
58 class DALI_ADAPTOR_API PixelBuffer : public BaseHandle
62 * Create a PixelBuffer with it's own data buffer.
64 static PixelBuffer New(uint32_t width,
66 Dali::Pixel::Format pixelFormat);
69 * @brief Creates an empty handle.
70 * Use PixelBuffer::New() to create an initialized object.
84 * @brief This copy constructor is required for (smart) pointer semantics.
87 * @param[in] handle A reference to the copied handle
89 PixelBuffer(const PixelBuffer& handle);
92 * @brief This assignment operator is required for (smart) pointer semantics.
95 * @param[in] rhs A reference to the copied handle
96 * @return A reference to this object
98 PixelBuffer& operator=(const PixelBuffer& rhs);
101 * @brief This move constructor is required for (smart) pointer semantics.
104 * @param[in] handle A reference to the moved handle
106 PixelBuffer(PixelBuffer&& handle);
109 * @brief This move assignment operator is required for (smart) pointer semantics.
112 * @param[in] rhs A reference to the moved handle
113 * @return A reference to this object
115 PixelBuffer& operator=(PixelBuffer&& rhs);
118 * Convert to a pixel data and release the pixelBuffer's object.
119 * This handle is left empty.
121 * @warning Any other handles that keep a reference to this object
122 * will be left with no buffer, trying to access it will return NULL.
125 * @param[in,out] pixelBuffer
126 * @return a new PixelData which takes ownership of the PixelBuffer's buffer.
128 static PixelData Convert(PixelBuffer& pixelBuffer);
131 * Convert to a pixel data and release the pixelBuffer's object.
132 * This handle is left empty.
134 * @warning Any other handles that keep a reference to this object
135 * will be left with no buffer, trying to access it will return NULL.
138 * @param[in,out] pixelBuffer
139 * @param[in] releaseAfterUpload Whether converted PixelData released after upload or not.
140 * @return a new PixelData which takes ownership of the PixelBuffer's buffer.
142 static PixelData Convert(PixelBuffer& pixelBuffer, bool releaseAfterUpload);
145 * Copy the data from this object into a new PixelData object, which could be
146 * used for uploading to a texture.
147 * @return a new PixelData object containing a copy of this pixel buffer's data.
149 Dali::PixelData CreatePixelData() const;
152 * @brief Gets the pixel buffer. This is a pointer to the internal
155 * @warning If there is no pixel buffer (e.g. this object has been
156 * converted to a PixelData), this method will return NULL.
159 * @return The pixel buffer, or NULL.
161 uint8_t* GetBuffer();
164 * @brief Gets the pixel buffer. This is a pointer to the internal
167 * @warning If there is no pixel buffer (e.g. this object has been
168 * converted to a PixelData), this method will return NULL.
170 * @return The pixel buffer, or NULL.
172 const uint8_t* GetBuffer() const;
175 * @brief Gets the width of the buffer in pixels.
178 * @return The width of the buffer in pixels
180 uint32_t GetWidth() const;
183 * @brief Gets the height of the buffer in pixels.
186 * @return The height of the buffer in pixels
188 uint32_t GetHeight() const;
191 * @brief Gets the stride of the buffer in pixels.
194 * @return The stride of the buffer in pixels. 0 means the buffer is tightly packed.
196 uint32_t GetStride() const;
199 * @brief Gets the pixel format.
202 * @return The pixel format
204 Pixel::Format GetPixelFormat() const;
207 * Apply the mask to this pixel data, and return a new pixel data containing
208 * the masked image. If this PixelBuffer doesn't have an alpha channel, then
209 * the resultant PixelBuffer will be converted to a format that supports at
210 * least the width of the color channels and the alpha channel from the mask.
212 * If cropToMask is set to true, then the contentScale is applied first to
213 * this buffer, and the target buffer is cropped to the size of the mask. If
214 * it's set to false, then the mask is scaled to match this buffer's size
215 * before the mask is applied.
217 * @param[in] mask The mask to apply.
218 * @param[in] contentScale The scaling factor to apply to the content
219 * @param[in] cropToMask Whether to crop the output to the mask size (true)
220 * or scale the mask to the content size (false)
222 void ApplyMask(PixelBuffer mask, float contentScale = 1.0f, bool cropToMask = false);
225 * Apply a Gaussian blur to this pixel data with the given radius.
227 * @note A bigger radius will yield a blurrier image. Only works for pixel data in RGBA format.
229 * @param[in] blurRadius The radius for Gaussian blur. A value of 0 or negative value indicates no blur.
231 void ApplyGaussianBlur(const float blurRadius);
234 * @brief Crops this buffer to the given crop rectangle.
236 * The crop rectangle will be clamped to the edges of the buffer if it is larger.
237 * @param[in] x The top left corner's X
238 * @param[in] y The top left corner's y
239 * @param[in] width The crop width
240 * @param[in] height The crop height
242 void Crop(uint16_t x, uint16_t y, uint16_t width, uint16_t height);
245 * @brief Resizes the buffer to the given dimensions.
247 * Uses either Lanczos4 for downscaling or Mitchell for upscaling
248 * @param[in] width The new width
249 * @param[in] height The new height
251 void Resize(uint16_t width, uint16_t height);
254 * @brief Returns Exif metadata as a property map
256 * @param[out] metadata Property map object to write into
257 * @return True on success
259 bool GetMetadata(Property::Map& metadata) const;
262 * @brief Multiplies the image's color values by the alpha value. This provides better
263 * blending capability.
265 void MultiplyColorByAlpha();
268 * @brief Rotates the pixel buffer by the given angle.
270 * @note Operation valid for pixel formats: A8, L8, LA88, RGB888, RGB8888, BGR8888, RGBA8888 and BGRA8888. Fails otherwise.
271 * @note The operation does nothing for angles equivalent to 0 degrees: -360, 360, 720, etc.
272 * @note If the pixel buffer does rotate, all the pointers to the internal pixel buffer retrieved by the method GetPixelBuffer() become invalid.
274 * @param[in] angle The angle in degrees.
276 * @return @e false if the rotation fails (invalid pixel format or memory issues).
278 bool Rotate(Degree angle);
281 * @brief Returns pixel-buffer is premultiplied or not.
282 * @return true if alpha is pre-multiplied.
284 bool IsAlphaPreMultiplied() const;
287 * @brief Get the brightness of the pixel buffer.
288 * @note The range is 255 to 0. The closer to 255, the brighter. 0 is not bright.
289 * @return brightness of the pixel buffer.
291 uint32_t GetBrightness() const;
295 * @brief The constructor.
296 * @note Not intended for application developers.
298 * @param[in] pointer A pointer to a newly allocated PixelBuffer
300 explicit DALI_INTERNAL PixelBuffer(Internal::Adaptor::PixelBuffer* pointer);
306 #endif // DALI_PIXEL_BUFFER_H