]>
Commit | Line | Data |
---|---|---|
6aca4d39 | 1 | // Created on: 2012-07-18 |
692613e5 | 2 | // Created by: Kirill GAVRILOV |
6aca4d39 | 3 | // Copyright (c) 2012-2014 OPEN CASCADE SAS |
692613e5 | 4 | // |
973c2be1 | 5 | // This file is part of Open CASCADE Technology software library. |
692613e5 | 6 | // |
d5f74e42 | 7 | // This library is free software; you can redistribute it and/or modify it under |
8 | // the terms of the GNU Lesser General Public License version 2.1 as published | |
973c2be1 | 9 | // by the Free Software Foundation, with special exception defined in the file |
10 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT | |
11 | // distribution for complete text of the license and disclaimer of any warranty. | |
692613e5 | 12 | // |
973c2be1 | 13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. | |
692613e5 | 15 | |
16 | #ifndef _Image_PixMap_H__ | |
17 | #define _Image_PixMap_H__ | |
18 | ||
dc858f4c | 19 | #include <Image_Format.hxx> |
692613e5 | 20 | #include <Image_PixMapData.hxx> |
21 | #include <Standard_Transient.hxx> | |
decdee7d | 22 | #include <Quantity_ColorRGBA.hxx> |
692613e5 | 23 | |
24 | //! Class represents packed image plane. | |
25 | class Image_PixMap : public Standard_Transient | |
26 | { | |
dc858f4c | 27 | DEFINE_STANDARD_RTTIEXT(Image_PixMap, Standard_Transient) |
692613e5 | 28 | public: |
29 | ||
692613e5 | 30 | //! Determine Big-Endian at runtime |
31 | static inline bool IsBigEndianHost() | |
32 | { | |
33 | union { int myInt; char myChar[sizeof(int)]; } aUnion; | |
34 | aUnion.myInt = 1; | |
35 | return !aUnion.myChar[0]; | |
36 | } | |
37 | ||
f9f740d6 | 38 | //! Auxiliary method for swapping bytes between RGB and BGR formats. |
39 | //! This method modifies the image data but does not change pixel format! | |
40 | //! Method will fail if pixel format is not one of the following: | |
dc858f4c | 41 | //! - Image_Format_RGB32 / Image_Format_BGR32 |
42 | //! - Image_Format_RGBA / Image_Format_BGRA | |
43 | //! - Image_Format_RGB / Image_Format_BGR | |
44 | //! - Image_Format_RGBF / Image_Format_BGRF | |
45 | //! - Image_Format_RGBAF / Image_Format_BGRAF | |
f9f740d6 | 46 | Standard_EXPORT static bool SwapRgbaBgra (Image_PixMap& theImage); |
47 | ||
e958a649 | 48 | //! Convert image to Black/White. |
49 | Standard_EXPORT static void ToBlackWhite (Image_PixMap& theImage); | |
50 | ||
692613e5 | 51 | public: // high-level API |
52 | ||
dc858f4c | 53 | Image_Format Format() const { return myImgFormat; } |
692613e5 | 54 | |
076ca35c | 55 | //! Override pixel format specified by InitXXX() methods. |
56 | //! Will throw exception if pixel size of new format is not equal to currently initialized format. | |
57 | //! Intended to switch formats indicating different interpretation of the same data | |
58 | //! (e.g. ImgGray and ImgAlpha). | |
dc858f4c | 59 | Standard_EXPORT void SetFormat (const Image_Format thePixelFormat); |
076ca35c | 60 | |
692613e5 | 61 | //! @return image width in pixels |
62 | inline Standard_Size Width() const | |
63 | { | |
ca0c0b11 | 64 | return myData.SizeX; |
692613e5 | 65 | } |
66 | ||
67 | //! @return image height in pixels | |
68 | inline Standard_Size Height() const | |
69 | { | |
ca0c0b11 | 70 | return myData.SizeY; |
692613e5 | 71 | } |
72 | ||
73 | //! @return image width in pixels | |
74 | inline Standard_Size SizeX() const | |
75 | { | |
ca0c0b11 | 76 | return myData.SizeX; |
692613e5 | 77 | } |
78 | ||
79 | //! @return image height in pixels | |
80 | inline Standard_Size SizeY() const | |
81 | { | |
ca0c0b11 | 82 | return myData.SizeY; |
692613e5 | 83 | } |
84 | ||
85 | //! @return width / height. | |
86 | inline Standard_Real Ratio() const | |
87 | { | |
ca0c0b11 | 88 | return (SizeY() > 0) ? (Standard_Real(SizeX()) / Standard_Real(SizeY())) : 1.0; |
692613e5 | 89 | } |
90 | ||
91 | //! @return true if data is NULL. | |
92 | bool IsEmpty() const | |
93 | { | |
ca0c0b11 | 94 | return myData.IsEmpty(); |
692613e5 | 95 | } |
96 | ||
97 | //! Empty constructor. Initialize the NULL image plane. | |
98 | Standard_EXPORT Image_PixMap(); | |
99 | ||
100 | //! Destructor | |
101 | Standard_EXPORT virtual ~Image_PixMap(); | |
102 | ||
103 | //! Returns the pixel color. This function is relatively slow. | |
decdee7d | 104 | //! Beware that this method takes coordinates in opposite order in contrast to ::Value() and ::ChangeValue(). |
aaf8d6a9 | 105 | //! @param theX [in] column index from left |
106 | //! @param theY [in] row index from top | |
107 | //! @param theToLinearize [in] when TRUE, the color stored in non-linear color space (e.g. Image_Format_RGB) will be linearized | |
692613e5 | 108 | //! @return the pixel color |
e958a649 | 109 | Standard_EXPORT Quantity_ColorRGBA PixelColor (const Standard_Integer theX, |
aaf8d6a9 | 110 | const Standard_Integer theY, |
111 | const Standard_Boolean theToLinearize = Standard_False) const; | |
decdee7d | 112 | |
113 | //! Sets the pixel color. This function is relatively slow. | |
114 | //! Beware that this method takes coordinates in opposite order in contrast to ::Value() and ::ChangeValue(). | |
aaf8d6a9 | 115 | //! @param theX [in] column index from left |
116 | //! @param theY [in] row index from top | |
117 | //! @param theColor [in] color to store | |
118 | //! @param theToDeLinearize [in] when TRUE, the gamma correction will be applied for storing in non-linear color space (e.g. Image_Format_RGB) | |
e958a649 | 119 | void SetPixelColor (const Standard_Integer theX, |
120 | const Standard_Integer theY, | |
aaf8d6a9 | 121 | const Quantity_Color& theColor, |
122 | const Standard_Boolean theToDeLinearize = Standard_False) | |
decdee7d | 123 | { |
aaf8d6a9 | 124 | SetPixelColor (theX, theY, Quantity_ColorRGBA (theColor, 1.0f), theToDeLinearize); |
decdee7d | 125 | } |
126 | ||
127 | //! Sets the pixel color. This function is relatively slow. | |
128 | //! Beware that this method takes coordinates in opposite order in contrast to ::Value() and ::ChangeValue(). | |
aaf8d6a9 | 129 | //! @param theX [in] column index from left |
130 | //! @param theY [in] row index from top | |
131 | //! @param theColor [in] color to store | |
132 | //! @param theToDeLinearize [in] when TRUE, the gamma correction will be applied for storing in non-linear color space (e.g. Image_Format_RGB) | |
decdee7d | 133 | Standard_EXPORT void SetPixelColor (const Standard_Integer theX, |
134 | const Standard_Integer theY, | |
aaf8d6a9 | 135 | const Quantity_ColorRGBA& theColor, |
136 | const Standard_Boolean theToDeLinearize = Standard_False); | |
decdee7d | 137 | |
692613e5 | 138 | //! Initialize image plane as wrapper over alien data. |
139 | //! Data will not be copied! Notice that caller should ensure | |
140 | //! that data pointer will not be released during this wrapper lifetime. | |
141 | //! You may call InitCopy() to perform data copying. | |
dc858f4c | 142 | Standard_EXPORT virtual bool InitWrapper (Image_Format thePixelFormat, |
692613e5 | 143 | Standard_Byte* theDataPtr, |
144 | const Standard_Size theSizeX, | |
145 | const Standard_Size theSizeY, | |
146 | const Standard_Size theSizeRowBytes = 0); | |
147 | ||
148 | //! Initialize image plane with required dimensions. | |
149 | //! Memory will be left uninitialized (performance trick). | |
dc858f4c | 150 | Standard_EXPORT virtual bool InitTrash (Image_Format thePixelFormat, |
692613e5 | 151 | const Standard_Size theSizeX, |
152 | const Standard_Size theSizeY, | |
153 | const Standard_Size theSizeRowBytes = 0); | |
154 | ||
155 | //! Initialize by copying data. | |
156 | //! If you want to copy alien data you should create wrapper using InitWrapper() before. | |
157 | Standard_EXPORT virtual bool InitCopy (const Image_PixMap& theCopy); | |
158 | ||
159 | //! Initialize image plane with required dimensions. | |
160 | //! Buffer will be zeroed (black color for most formats). | |
dc858f4c | 161 | Standard_EXPORT bool InitZero (Image_Format thePixelFormat, |
692613e5 | 162 | const Standard_Size theSizeX, |
163 | const Standard_Size theSizeY, | |
164 | const Standard_Size theSizeRowBytes = 0, | |
165 | const Standard_Byte theValue = 0); | |
166 | ||
167 | //! Method correctly deallocate internal buffer. | |
ca0c0b11 | 168 | Standard_EXPORT virtual void Clear(); |
692613e5 | 169 | |
ca0c0b11 | 170 | public: //! @name low-level API for batch-processing (pixels reading / comparison / modification) |
692613e5 | 171 | |
f823def0 | 172 | //! Returns TRUE if image data is stored from Top to the Down. |
173 | //! By default Bottom Up order is used instead | |
692613e5 | 174 | //! (topmost scanlines starts from the bottom in memory). |
f823def0 | 175 | //! which is most image frameworks naturally support. |
176 | //! | |
692613e5 | 177 | //! Notice that access methods within this class automatically |
178 | //! convert input row-index to apply this flag! | |
179 | //! You should use this flag only if interconnect with alien APIs and buffers. | |
f823def0 | 180 | //! @return true if image data is top-down |
692613e5 | 181 | inline bool IsTopDown() const |
182 | { | |
ca0c0b11 | 183 | return myData.TopToDown == 1; |
692613e5 | 184 | } |
185 | ||
186 | //! Setup scanlines order in memory - top-down or bottom-up. | |
187 | //! Drawers should explicitly specify this value if current state IsTopDown() was ignored! | |
f823def0 | 188 | //! @param theIsTopDown top-down flag |
189 | inline void SetTopDown (const bool theIsTopDown) | |
692613e5 | 190 | { |
ca0c0b11 | 191 | myData.SetTopDown (theIsTopDown); |
692613e5 | 192 | } |
193 | ||
194 | //! Returns +1 if scanlines ordered in Top->Down order in memory and -1 otherwise. | |
195 | //! @return scanline increment for Top->Down iteration | |
196 | inline Standard_Size TopDownInc() const | |
197 | { | |
ca0c0b11 | 198 | return myData.TopToDown; |
692613e5 | 199 | } |
200 | ||
201 | //! @return data pointer for low-level operations (copying entire buffer, parsing with extra tools etc.). | |
202 | inline const Standard_Byte* Data() const | |
203 | { | |
ca0c0b11 | 204 | return myData.Data(); |
692613e5 | 205 | } |
206 | ||
207 | //! @return data pointer for low-level operations (copying entire buffer, parsing with extra tools etc.). | |
208 | inline Standard_Byte* ChangeData() | |
209 | { | |
ca0c0b11 | 210 | return myData.ChangeData(); |
692613e5 | 211 | } |
212 | ||
213 | //! @return data pointer to requested row (first column). | |
214 | inline const Standard_Byte* Row (const Standard_Size theRow) const | |
215 | { | |
216 | return myData.Row (theRow); | |
217 | } | |
218 | ||
219 | //! @return data pointer to requested row (first column). | |
220 | inline Standard_Byte* ChangeRow (const Standard_Size theRow) | |
221 | { | |
222 | return myData.ChangeRow (theRow); | |
223 | } | |
224 | ||
225 | //! @return bytes reserved for one pixel (may include extra bytes for alignment). | |
226 | inline Standard_Size SizePixelBytes() const | |
227 | { | |
ca0c0b11 | 228 | return myData.SizeBPP; |
692613e5 | 229 | } |
230 | ||
231 | //! @return bytes reserved for one pixel (may include extra bytes for alignment). | |
dc858f4c | 232 | Standard_EXPORT static Standard_Size SizePixelBytes (const Image_Format thePixelFormat); |
692613e5 | 233 | |
234 | //! @return bytes reserved per row. | |
235 | //! Could be larger than needed to store packed row (extra bytes for alignment etc.). | |
236 | inline Standard_Size SizeRowBytes() const | |
237 | { | |
ca0c0b11 | 238 | return myData.SizeRowBytes; |
692613e5 | 239 | } |
240 | ||
241 | //! @return the extra bytes in the row. | |
242 | inline Standard_Size RowExtraBytes() const | |
243 | { | |
ca0c0b11 | 244 | return SizeRowBytes() - SizeX() * SizePixelBytes(); |
692613e5 | 245 | } |
246 | ||
247 | //! Compute the maximal row alignment for current row size. | |
248 | //! @return maximal row alignment in bytes (up to 16 bytes). | |
249 | inline Standard_Size MaxRowAligmentBytes() const | |
250 | { | |
251 | return myData.MaxRowAligmentBytes(); | |
252 | } | |
253 | ||
ca0c0b11 | 254 | //! @return buffer size |
692613e5 | 255 | inline Standard_Size SizeBytes() const |
256 | { | |
ca0c0b11 | 257 | return myData.Size(); |
692613e5 | 258 | } |
259 | ||
ca0c0b11 | 260 | //! Access image pixel with specified color type. |
261 | //! This method does not perform any type checks - use on own risk (check Format() before)! | |
692613e5 | 262 | template <typename ColorType_t> |
ca0c0b11 | 263 | inline const ColorType_t& Value (const Standard_Size theRow, |
264 | const Standard_Size theCol) const | |
692613e5 | 265 | { |
ca0c0b11 | 266 | return *reinterpret_cast<const ColorType_t*>(myData.Value (theRow, theCol)); |
692613e5 | 267 | } |
268 | ||
269 | //! Access image pixel with specified color type. | |
ca0c0b11 | 270 | //! This method does not perform any type checks - use on own risk (check Format() before)! |
692613e5 | 271 | template <typename ColorType_t> |
ca0c0b11 | 272 | inline ColorType_t& ChangeValue (const Standard_Size theRow, |
273 | const Standard_Size theCol) | |
692613e5 | 274 | { |
ca0c0b11 | 275 | return *reinterpret_cast<ColorType_t* >(myData.ChangeValue (theRow, theCol)); |
692613e5 | 276 | } |
277 | ||
56cc44e0 | 278 | //! Access image pixel as raw data pointer. |
279 | //! This method does not perform any type checks - use on own risk (check Format() before)! | |
280 | const Standard_Byte* RawValue (Standard_Size theRow, | |
281 | Standard_Size theCol) const | |
282 | { | |
283 | return myData.Value (theRow, theCol); | |
284 | } | |
285 | ||
286 | //! Access image pixel as raw data pointer. | |
287 | //! This method does not perform any type checks - use on own risk (check Format() before)! | |
288 | Standard_Byte* ChangeRawValue (Standard_Size theRow, | |
289 | Standard_Size theCol) | |
290 | { | |
291 | return myData.ChangeValue (theRow, theCol); | |
292 | } | |
293 | ||
dc858f4c | 294 | public: |
295 | ||
296 | Standard_DEPRECATED("This member is deprecated, use Image_Format enumeration instead") | |
297 | typedef Image_Format ImgFormat; | |
298 | static const Image_Format ImgUNKNOWN = Image_Format_UNKNOWN; | |
299 | static const Image_Format ImgGray = Image_Format_Gray; | |
300 | static const Image_Format ImgAlpha = Image_Format_Alpha; | |
301 | static const Image_Format ImgRGB = Image_Format_RGB; | |
302 | static const Image_Format ImgBGR = Image_Format_BGR; | |
303 | static const Image_Format ImgRGB32 = Image_Format_RGB32; | |
304 | static const Image_Format ImgBGR32 = Image_Format_BGR32; | |
305 | static const Image_Format ImgRGBA = Image_Format_RGBA; | |
306 | static const Image_Format ImgBGRA = Image_Format_BGRA; | |
307 | static const Image_Format ImgGrayF = Image_Format_GrayF; | |
308 | static const Image_Format ImgAlphaF = Image_Format_AlphaF; | |
309 | static const Image_Format ImgRGBF = Image_Format_RGBF; | |
310 | static const Image_Format ImgBGRF = Image_Format_BGRF; | |
311 | static const Image_Format ImgRGBAF = Image_Format_RGBAF; | |
312 | static const Image_Format ImgBGRAF = Image_Format_BGRAF; | |
313 | ||
692613e5 | 314 | protected: |
315 | ||
ca0c0b11 | 316 | Image_PixMapData myData; //!< data buffer |
dc858f4c | 317 | Image_Format myImgFormat; //!< pixel format |
692613e5 | 318 | |
319 | private: | |
320 | ||
321 | //! Copying allowed only within Handles | |
322 | Image_PixMap (const Image_PixMap& ); | |
323 | Image_PixMap& operator= (const Image_PixMap& ); | |
324 | ||
692613e5 | 325 | }; |
326 | ||
a13f2dc4 | 327 | DEFINE_STANDARD_HANDLE(Image_PixMap, Standard_Transient) |
328 | ||
692613e5 | 329 | #endif // _Image_PixMap_H__ |