Home | History | Annotate | Download | only in source
      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