/src/skia/third_party/externals/dng_sdk/source/dng_image.h
Line | Count | Source (jump to first uncovered line) |
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 | 0 | { |
64 | 0 | fRefData = refData; |
65 | 0 | } |
66 | | |
67 | | void * GetRefData () const |
68 | 0 | { |
69 | 0 | return fRefData; |
70 | 0 | } |
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 | 0 | { |
189 | 0 | return fBounds; |
190 | 0 | } |
191 | | |
192 | | /// Getter method for size of an image. |
193 | | |
194 | | dng_point Size () const |
195 | 0 | { |
196 | 0 | return Bounds ().Size (); |
197 | 0 | } |
198 | | |
199 | | /// Getter method for width of an image. |
200 | | |
201 | | uint32 Width () const |
202 | 0 | { |
203 | 0 | return Bounds ().W (); |
204 | 0 | } |
205 | | |
206 | | /// Getter method for height of an image. |
207 | | |
208 | | uint32 Height () const |
209 | 0 | { |
210 | 0 | return Bounds ().H (); |
211 | 0 | } |
212 | | |
213 | | /// Getter method for number of planes in an image. |
214 | | |
215 | | uint32 Planes () const |
216 | 0 | { |
217 | 0 | return fPlanes; |
218 | 0 | } |
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 | 0 | { |
226 | 0 | return fPixelType; |
227 | 0 | } |
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 | 0 | { |
302 | 0 | |
303 | 0 | CopyArea (src, area, plane, plane, planes); |
304 | 0 | |
305 | 0 | } |
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 | 0 | { |
323 | 0 | |
324 | 0 | DNG_ASSERT (fPixelType == ttByte, "Mismatched pixel type"); |
325 | 0 | |
326 | 0 | SetConstant ((uint32) value, area); |
327 | 0 | |
328 | 0 | } |
329 | | |
330 | | void SetConstant_uint8 (uint8 value) |
331 | 0 | { |
332 | 0 | SetConstant (value, Bounds ()); |
333 | 0 | } |
334 | | |
335 | | void SetConstant_uint16 (uint16 value, |
336 | | const dng_rect &area) |
337 | 0 | { |
338 | 0 | |
339 | 0 | DNG_ASSERT (fPixelType == ttShort, "Mismatched pixel type"); |
340 | 0 | |
341 | 0 | SetConstant ((uint32) value, area); |
342 | 0 | |
343 | 0 | } |
344 | | |
345 | | void SetConstant_uint16 (uint16 value) |
346 | 0 | { |
347 | 0 | SetConstant_uint16 (value, Bounds ()); |
348 | 0 | } |
349 | | |
350 | | void SetConstant_int16 (int16 value, |
351 | | const dng_rect &area) |
352 | 0 | { |
353 | 0 | |
354 | 0 | DNG_ASSERT (fPixelType == ttSShort, "Mismatched pixel type"); |
355 | 0 | |
356 | 0 | SetConstant ((uint32) (uint16) value, area); |
357 | 0 | |
358 | 0 | } |
359 | | |
360 | | void SetConstant_int16 (int16 value) |
361 | 0 | { |
362 | 0 | SetConstant_int16 (value, Bounds ()); |
363 | 0 | } |
364 | | |
365 | | void SetConstant_uint32 (uint32 value, |
366 | | const dng_rect &area) |
367 | 0 | { |
368 | 0 | |
369 | 0 | DNG_ASSERT (fPixelType == ttLong, "Mismatched pixel type"); |
370 | 0 | |
371 | 0 | SetConstant (value, area); |
372 | 0 | |
373 | 0 | } |
374 | | |
375 | | void SetConstant_uint32 (uint32 value) |
376 | 0 | { |
377 | 0 | SetConstant_uint32 (value, Bounds ()); |
378 | 0 | } |
379 | | |
380 | | void SetConstant_real32 (real32 value, |
381 | | const dng_rect &area) |
382 | 0 | { |
383 | 0 | |
384 | 0 | DNG_ASSERT (fPixelType == ttFloat, "Mismatched pixel type"); |
385 | 0 | |
386 | 0 | union |
387 | 0 | { |
388 | 0 | uint32 i; |
389 | 0 | real32 f; |
390 | 0 | } x; |
391 | 0 | |
392 | 0 | x.f = value; |
393 | 0 | |
394 | 0 | SetConstant (x.i, area); |
395 | 0 | |
396 | 0 | } |
397 | | |
398 | | void SetConstant_real32 (real32 value) |
399 | 0 | { |
400 | 0 | SetConstant_real32 (value, Bounds ()); |
401 | 0 | } |
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 | | /*****************************************************************************/ |