1 | /*****************************************************************************/ |
2 | // Copyright 2006-2008 Adobe Systems Incorporated |
3 | // All Rights Reserved. |
4 | // |
5 | // NOTICE: Adobe permits you to use, modify, and distribute this file in |
6 | // accordance with the terms of the Adobe license agreement accompanying it. |
7 | /*****************************************************************************/ |
8 | |
9 | /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_image.h#1 $ */ |
10 | /* $DateTime: 2012/05/30 13:28:51 $ */ |
11 | /* $Change: 832332 $ */ |
12 | /* $Author: tknoll $ */ |
13 | |
14 | /** \file |
15 | * Support for working with image data in DNG SDK. |
16 | */ |
17 | |
18 | /*****************************************************************************/ |
19 | |
20 | #ifndef __dng_image__ |
21 | #define __dng_image__ |
22 | |
23 | /*****************************************************************************/ |
24 | |
25 | #include "dng_assertions.h" |
26 | #include "dng_classes.h" |
27 | #include "dng_pixel_buffer.h" |
28 | #include "dng_point.h" |
29 | #include "dng_rect.h" |
30 | #include "dng_tag_types.h" |
31 | #include "dng_types.h" |
32 | |
33 | /*****************************************************************************/ |
34 | |
35 | /// \brief Class to get resource acquisition is instantiation behavior for tile |
36 | /// buffers. Can be dirty or constant tile access. |
37 | |
38 | class dng_tile_buffer: public dng_pixel_buffer |
39 | { |
40 | |
41 | protected: |
42 | |
43 | const dng_image &fImage; |
44 | |
45 | void *fRefData; |
46 | |
47 | protected: |
48 | |
49 | /// Obtain a tile from an image. |
50 | /// \param image Image tile will come from. |
51 | /// \param tile Rectangle denoting extent of tile. |
52 | /// \param dirty Flag indicating whether this is read-only or read-write acesss. |
53 | |
54 | dng_tile_buffer (const dng_image &image, |
55 | const dng_rect &tile, |
56 | bool dirty); |
57 | |
58 | virtual ~dng_tile_buffer (); |
59 | |
60 | public: |
61 | |
62 | void SetRefData (void *refData) |
63 | { |
64 | fRefData = refData; |
65 | } |
66 | |
67 | void * GetRefData () const |
68 | { |
69 | return fRefData; |
70 | } |
71 | |
72 | private: |
73 | |
74 | // Hidden copy constructor and assignment operator. |
75 | |
76 | dng_tile_buffer (const dng_tile_buffer &buffer); |
77 | |
78 | dng_tile_buffer & operator= (const dng_tile_buffer &buffer); |
79 | |
80 | }; |
81 | |
82 | /*****************************************************************************/ |
83 | |
84 | /// \brief Class to get resource acquisition is instantiation behavior for |
85 | /// constant (read-only) tile buffers. |
86 | |
87 | class dng_const_tile_buffer: public dng_tile_buffer |
88 | { |
89 | |
90 | public: |
91 | |
92 | /// Obtain a read-only tile from an image. |
93 | /// \param image Image tile will come from. |
94 | /// \param tile Rectangle denoting extent of tile. |
95 | |
96 | dng_const_tile_buffer (const dng_image &image, |
97 | const dng_rect &tile); |
98 | |
99 | virtual ~dng_const_tile_buffer (); |
100 | |
101 | }; |
102 | |
103 | /*****************************************************************************/ |
104 | |
105 | /// \brief Class to get resource acquisition is instantiation behavior for |
106 | /// dirty (writable) tile buffers. |
107 | |
108 | class dng_dirty_tile_buffer: public dng_tile_buffer |
109 | { |
110 | |
111 | public: |
112 | |
113 | /// Obtain a writable tile from an image. |
114 | /// \param image Image tile will come from. |
115 | /// \param tile Rectangle denoting extent of tile. |
116 | |
117 | dng_dirty_tile_buffer (dng_image &image, |
118 | const dng_rect &tile); |
119 | |
120 | virtual ~dng_dirty_tile_buffer (); |
121 | |
122 | }; |
123 | |
124 | /*****************************************************************************/ |
125 | |
126 | /// \brief Base class for holding image data in DNG SDK. See dng_simple_image |
127 | /// for derived class most often used in DNG SDK. |
128 | |
129 | class dng_image |
130 | { |
131 | |
132 | friend class dng_tile_buffer; |
133 | |
134 | protected: |
135 | |
136 | // Bounds for this image. |
137 | |
138 | dng_rect fBounds; |
139 | |
140 | // Number of image planes. |
141 | |
142 | uint32 fPlanes; |
143 | |
144 | // Basic pixel type (TIFF tag type code). |
145 | |
146 | uint32 fPixelType; |
147 | |
148 | public: |
149 | |
150 | /// How to handle requests to get image areas outside the image bounds. |
151 | |
152 | enum edge_option |
153 | { |
154 | |
155 | /// Leave edge pixels unchanged. |
156 | |
157 | edge_none, |
158 | |
159 | /// Pad with zeros. |
160 | |
161 | edge_zero, |
162 | |
163 | /// Repeat edge pixels. |
164 | |
165 | edge_repeat, |
166 | |
167 | /// Repeat edge pixels, except for last plane which is zero padded. |
168 | |
169 | edge_repeat_zero_last |
170 | |
171 | }; |
172 | |
173 | protected: |
174 | |
175 | dng_image (const dng_rect &bounds, |
176 | uint32 planes, |
177 | uint32 pixelType); |
178 | |
179 | public: |
180 | |
181 | virtual ~dng_image (); |
182 | |
183 | virtual dng_image * Clone () const; |
184 | |
185 | /// Getter method for bounds of an image. |
186 | |
187 | const dng_rect & Bounds () const |
188 | { |
189 | return fBounds; |
190 | } |
191 | |
192 | /// Getter method for size of an image. |
193 | |
194 | dng_point Size () const |
195 | { |
196 | return Bounds ().Size (); |
197 | } |
198 | |
199 | /// Getter method for width of an image. |
200 | |
201 | uint32 Width () const |
202 | { |
203 | return Bounds ().W (); |
204 | } |
205 | |
206 | /// Getter method for height of an image. |
207 | |
208 | uint32 Height () const |
209 | { |
210 | return Bounds ().H (); |
211 | } |
212 | |
213 | /// Getter method for number of planes in an image. |
214 | |
215 | uint32 Planes () const |
216 | { |
217 | return fPlanes; |
218 | } |
219 | |
220 | /// Getter for pixel type. |
221 | /// \retval See dng_tagtypes.h . Valid values are ttByte, ttShort, ttSShort, |
222 | /// ttLong, ttFloat . |
223 | |
224 | uint32 PixelType () const |
225 | { |
226 | return fPixelType; |
227 | } |
228 | |
229 | /// Setter for pixel type. |
230 | /// \param pixelType The new pixel type . |
231 | |
232 | virtual void SetPixelType (uint32 pixelType); |
233 | |
234 | /// Getter for pixel size. |
235 | /// \retval Size, in bytes, of pixel type for this image . |
236 | |
237 | uint32 PixelSize () const; |
238 | |
239 | /// Getter for pixel range. |
240 | /// For unsigned types, range is 0 to return value. |
241 | /// For signed types, range is return value - 0x8000U. |
242 | /// For ttFloat type, pixel range is 0.0 to 1.0 and this routine returns 1. |
243 | |
244 | uint32 PixelRange () const; |
245 | |
246 | /// Getter for best "tile stride" for accessing image. |
247 | |
248 | virtual dng_rect RepeatingTile () const; |
249 | |
250 | /// Get a pixel buffer of data on image with proper edge padding. |
251 | /// \param buffer Receives resulting pixel buffer. |
252 | /// \param edgeOption edge_option describing how to pad edges. |
253 | /// \param repeatV Amount of repeated padding needed in vertical for |
254 | /// edge_repeat and edge_repeat_zero_last edgeOption cases. |
255 | /// \param repeatH Amount of repeated padding needed in horizontal for |
256 | /// edge_repeat and edge_repeat_zero_last edgeOption cases. |
257 | |
258 | void Get (dng_pixel_buffer &buffer, |
259 | edge_option edgeOption = edge_none, |
260 | uint32 repeatV = 1, |
261 | uint32 repeatH = 1) const; |
262 | |
263 | /// Put a pixel buffer into image. |
264 | /// \param buffer Pixel buffer to copy from. |
265 | |
266 | void Put (const dng_pixel_buffer &buffer); |
267 | |
268 | /// Shrink bounds of image to given rectangle. |
269 | /// \param r Rectangle to crop to. |
270 | |
271 | virtual void Trim (const dng_rect &r); |
272 | |
273 | /// Rotate image to reflect given orientation change. |
274 | /// \param orientation Directive to rotate image in a certain way. |
275 | |
276 | virtual void Rotate (const dng_orientation &orientation); |
277 | |
278 | /// Copy image data from an area of one image to same area of another. |
279 | /// \param src Image to copy from. |
280 | /// \param area Rectangle of images to copy. |
281 | /// \param srcPlane Plane to start copying in src. |
282 | /// \param dstPlane Plane to start copying in this. |
283 | /// \param planes Number of planes to copy. |
284 | |
285 | void CopyArea (const dng_image &src, |
286 | const dng_rect &area, |
287 | uint32 srcPlane, |
288 | uint32 dstPlane, |
289 | uint32 planes); |
290 | |
291 | /// Copy image data from an area of one image to same area of another. |
292 | /// \param src Image to copy from. |
293 | /// \param area Rectangle of images to copy. |
294 | /// \param plane Plane to start copying in src and this. |
295 | /// \param planes Number of planes to copy. |
296 | |
297 | void CopyArea (const dng_image &src, |
298 | const dng_rect &area, |
299 | uint32 plane, |
300 | uint32 planes) |
301 | { |
302 | |
303 | CopyArea (src, area, plane, plane, planes); |
304 | |
305 | } |
306 | |
307 | /// Return true if the contents of an area of the image are the same as those of another. |
308 | /// \param rhs Image to compare against. |
309 | /// \param area Rectangle of image to test. |
310 | /// \param plane Plane to start comparing. |
311 | /// \param planes Number of planes to compare. |
312 | |
313 | bool EqualArea (const dng_image &rhs, |
314 | const dng_rect &area, |
315 | uint32 plane, |
316 | uint32 planes) const; |
317 | |
318 | // Routines to set the entire image to a constant value. |
319 | |
320 | void SetConstant_uint8 (uint8 value, |
321 | const dng_rect &area) |
322 | { |
323 | |
324 | DNG_ASSERT (fPixelType == ttByte, "Mismatched pixel type" ); |
325 | |
326 | SetConstant ((uint32) value, area); |
327 | |
328 | } |
329 | |
330 | void SetConstant_uint8 (uint8 value) |
331 | { |
332 | SetConstant (value, Bounds ()); |
333 | } |
334 | |
335 | void SetConstant_uint16 (uint16 value, |
336 | const dng_rect &area) |
337 | { |
338 | |
339 | DNG_ASSERT (fPixelType == ttShort, "Mismatched pixel type" ); |
340 | |
341 | SetConstant ((uint32) value, area); |
342 | |
343 | } |
344 | |
345 | void SetConstant_uint16 (uint16 value) |
346 | { |
347 | SetConstant_uint16 (value, Bounds ()); |
348 | } |
349 | |
350 | void SetConstant_int16 (int16 value, |
351 | const dng_rect &area) |
352 | { |
353 | |
354 | DNG_ASSERT (fPixelType == ttSShort, "Mismatched pixel type" ); |
355 | |
356 | SetConstant ((uint32) (uint16) value, area); |
357 | |
358 | } |
359 | |
360 | void SetConstant_int16 (int16 value) |
361 | { |
362 | SetConstant_int16 (value, Bounds ()); |
363 | } |
364 | |
365 | void SetConstant_uint32 (uint32 value, |
366 | const dng_rect &area) |
367 | { |
368 | |
369 | DNG_ASSERT (fPixelType == ttLong, "Mismatched pixel type" ); |
370 | |
371 | SetConstant (value, area); |
372 | |
373 | } |
374 | |
375 | void SetConstant_uint32 (uint32 value) |
376 | { |
377 | SetConstant_uint32 (value, Bounds ()); |
378 | } |
379 | |
380 | void SetConstant_real32 (real32 value, |
381 | const dng_rect &area) |
382 | { |
383 | |
384 | DNG_ASSERT (fPixelType == ttFloat, "Mismatched pixel type" ); |
385 | |
386 | union |
387 | { |
388 | uint32 i; |
389 | real32 f; |
390 | } x; |
391 | |
392 | x.f = value; |
393 | |
394 | SetConstant (x.i, area); |
395 | |
396 | } |
397 | |
398 | void SetConstant_real32 (real32 value) |
399 | { |
400 | SetConstant_real32 (value, Bounds ()); |
401 | } |
402 | |
403 | virtual void GetRepeat (dng_pixel_buffer &buffer, |
404 | const dng_rect &srcArea, |
405 | const dng_rect &dstArea) const; |
406 | |
407 | protected: |
408 | |
409 | virtual void AcquireTileBuffer (dng_tile_buffer &buffer, |
410 | const dng_rect &area, |
411 | bool dirty) const; |
412 | |
413 | virtual void ReleaseTileBuffer (dng_tile_buffer &buffer) const; |
414 | |
415 | virtual void DoGet (dng_pixel_buffer &buffer) const; |
416 | |
417 | virtual void DoPut (const dng_pixel_buffer &buffer); |
418 | |
419 | void GetEdge (dng_pixel_buffer &buffer, |
420 | edge_option edgeOption, |
421 | const dng_rect &srcArea, |
422 | const dng_rect &dstArea) const; |
423 | |
424 | virtual void SetConstant (uint32 value, |
425 | const dng_rect &area); |
426 | |
427 | }; |
428 | |
429 | /*****************************************************************************/ |
430 | |
431 | #endif |
432 | |
433 | /*****************************************************************************/ |
434 | |