1 #ifndef DALI_INTERNAL_ADAPTOR_PIXEL_BUFFER_H
2 #define DALI_INTERNAL_ADAPTOR_PIXEL_BUFFER_H
5 * Copyright (c) 2017 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 <pixel-buffer.h>
23 #include <dali/public-api/images/image-operations.h> // For ImageDimensions
24 #include <dali/public-api/images/pixel-data.h>
25 #include <dali/public-api/object/base-object.h>
37 typedef IntrusivePtr<PixelBuffer> PixelBufferPtr;
39 class PixelBuffer : public BaseObject
44 * @brief Create a PixelBuffer object with a pre-allocated buffer.
45 * The PixelBuffer object owns this buffer, which may be retrieved
46 * and modified using GetBuffer().
48 * @param [in] width Buffer width in pixels
49 * @param [in] height Buffer height in pixels
50 * @param [in] pixelFormat The pixel format
52 static PixelBufferPtr New( unsigned int width,
54 Pixel::Format pixelFormat );
57 * @brief Create a PixelBuffer object. For internal use only.
59 * @param [in] buffer The raw pixel data.
60 * @param [in] bufferSize The size of the buffer in bytes
61 * @param [in] width Buffer width in pixels
62 * @param [in] height Buffer height in pixels
63 * @param [in] pixelFormat The pixel format
64 * @param [in] releaseFunction The function used to release the memory.
66 static PixelBufferPtr New( unsigned char* buffer,
67 unsigned int bufferSize,
70 Pixel::Format pixelFormat );
73 * Convert a pixelBuffer object into a PixelData object.
74 * The new object takes ownership of the buffer data, and the
75 * mBuffer pointer is reset to NULL.
76 * @param[in] pixelBuffer The buffer to convert
77 * @return the pixelData
79 static Dali::PixelData Convert( PixelBuffer& pixelBuffer );
84 * @param [in] buffer The raw pixel data.
85 * @param [in] bufferSize The size of the buffer in bytes
86 * @param [in] width Buffer width in pixels
87 * @param [in] height Buffer height in pixels
88 * @param [in] pixelFormat The pixel format
90 PixelBuffer( unsigned char* buffer,
91 unsigned int bufferSize,
94 Pixel::Format pixelFormat );
101 * Release the pixel buffer if exists.
108 * Get the width of the buffer in pixels.
109 * @return The width of the buffer in pixels
111 unsigned int GetWidth() const;
114 * Get the height of the buffer in pixels
115 * @return The height of the buffer in pixels
117 unsigned int GetHeight() const;
120 * Get the pixel format
121 * @return The pixel format
123 Pixel::Format GetPixelFormat() const;
126 * Get the pixel buffer if it's present.
127 * @return The buffer if exists, or NULL if there is no pixel buffer.
129 unsigned char* GetBuffer() const;
132 * Get the size of the buffer in bytes
133 * @return The size of the buffer
135 unsigned int GetBufferSize() const;
138 * Copy the buffer into a new PixelData
140 Dali::PixelData CreatePixelData() const;
143 * Apply the mask to the current buffer. This method may update the
144 * internal object - e.g. the new buffer may have a different pixel
145 * format - as an alpha channel may be added.
146 * @param[in] mask The mask to apply to this pixel buffer
147 * @param[in] contentScale The scaling factor to apply to the content
148 * @param[in] cropToMask Whether to crop the output to the mask size (true) or scale the
149 * mask to the content size (false)
151 void ApplyMask( const PixelBuffer& mask, float contentScale, bool cropToMask );
155 * Undefined copy constructor.
157 PixelBuffer(const PixelBuffer& other);
160 * Undefined assignment operator.
162 PixelBuffer& operator= (const PixelBuffer& other);
165 * Internal method to apply the mask to this buffer. Expects that they are the same size.
167 void ApplyMaskInternal( const PixelBuffer& mask );
170 * Takes ownership of the other object's pixel buffer.
172 void TakeOwnershipOfBuffer( PixelBuffer& pixelBuffer );
177 void ReleaseBuffer();
180 * Scales this buffer buffer by the given factor, and crops at the center to the
183 void ScaleAndCrop( float scaleFactor, ImageDimensions cropDimensions );
186 * Creates a new buffer which is a crop of the passed in buffer,
187 * using the given crop rectangle. Assumes the crop rectangle is
188 * within the bounds of this size.
189 * @param[in] inBuffer The source buffer
190 * @param[in] x The top left corner's X
191 * @param[in] y The top left corner's y
192 * @param[in] cropDimensions The dimensions of the crop
193 * @return the new pixel buffer
195 static PixelBufferPtr NewCrop( const PixelBuffer& inBuffer, uint16_t x, uint16_t y, ImageDimensions cropDimensions );
198 * Creates a new buffer which is a resized version of the passed in buffer.
199 * Uses either Lanczos4 for downscaling, or Mitchell for upscaling.
200 * @param[in] inBuffer The source buffer
201 * @param[in] outDimensions The new dimensions
202 * @return a new buffer of the given size.
204 static PixelBufferPtr NewResize( const PixelBuffer& inBuffer, ImageDimensions outDimensions );
207 * Crops this buffer to the given crop rectangle. Assumes the crop rectangle
208 * is within the bounds of this size.
209 * @param[in] x The top left corner's X
210 * @param[in] y The top left corner's y
211 * @param[in] cropDimensions The dimensions of the crop
213 void Crop( uint16_t x, uint16_t y, ImageDimensions cropDimensions );
216 * Resizes the buffer to the given dimensions. Uses either Lanczos4 for downscaling
217 * or Mitchell for upscaling
218 * @param[in] outDimensions The new dimensions
220 void Resize( ImageDimensions outDimensions );
224 unsigned char* mBuffer; ///< The raw pixel data
225 unsigned int mBufferSize; ///< Buffer sized in bytes
226 unsigned int mWidth; ///< Buffer width in pixels
227 unsigned int mHeight; ///< Buffer height in pixels
228 Pixel::Format mPixelFormat; ///< Pixel format
231 } // namespace Adaptor
233 } // namespace Internal
236 * Helper methods for public API
238 inline Internal::Adaptor::PixelBuffer& GetImplementation( Devel::PixelBuffer& handle )
240 DALI_ASSERT_ALWAYS( handle && "handle is empty" );
242 BaseObject& object = handle.GetBaseObject();
244 return static_cast<Internal::Adaptor::PixelBuffer&>( object );
247 inline const Internal::Adaptor::PixelBuffer& GetImplementation( const Devel::PixelBuffer& handle )
249 DALI_ASSERT_ALWAYS( handle && "handle is empty" );
251 const BaseObject& object = handle.GetBaseObject();
253 return static_cast<const Internal::Adaptor::PixelBuffer&>( object );
258 #endif // __DALI_INTERNAL_ADAPTOR_PIXEL_BUFFER_H__