Home | History | Annotate | Download | only in source
      1 /*****************************************************************************/
      2 // Copyright 2006-2012 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_host.h#2 $ */
     10 /* $DateTime: 2012/06/14 20:24:41 $ */
     11 /* $Change: 835078 $ */
     12 /* $Author: tknoll $ */
     13 
     14 /** \file
     15  * Class definition for dng_host, initial point of contact and control between
     16  * host application and DNG SDK.
     17  */
     18 
     19 /*****************************************************************************/
     20 
     21 #ifndef __dng_host__
     22 #define __dng_host__
     23 
     24 /*****************************************************************************/
     25 
     26 #include "dng_auto_ptr.h"
     27 #include "dng_classes.h"
     28 #include "dng_errors.h"
     29 #include "dng_types.h"
     30 
     31 /*****************************************************************************/
     32 
     33 /// \brief The main class for communication between the application and the
     34 /// DNG SDK. Used to customize memory allocation and other behaviors.
     35 ///
     36 /// dng_host allows setting parameters for the DNG conversion, mediates callback
     37 /// style interactions between the host application and the DNG SDK, and allows
     38 /// controlling certain internal behavior of the SDK such as memory allocation.
     39 /// Many applications will be able to use the default implementation of dng_host
     40 /// by just setting the dng_memory_allocator and dng_abort_sniffer in the
     41 /// constructor. More complex interactions will require deriving a class from
     42 /// dng_host.
     43 ///
     44 /// Multiple dng_host objects can be allocated in a single process. This may
     45 /// be useful for DNG processing on separate threads. (Distinct dng_host objects
     46 /// are completely threadsafe for read/write. The application is responsible for
     47 /// establishing mutual exclusion for read/write access to a single dng_host
     48 /// object if it is used in multiple threads.)
     49 
     50 class dng_host
     51 	{
     52 
     53 	private:
     54 
     55 		dng_memory_allocator *fAllocator;
     56 
     57 		dng_abort_sniffer *fSniffer;
     58 
     59 		// Does the host require all the image metadata (vs. just checking
     60 		// to see if the file is readable)?
     61 
     62 		bool fNeedsMeta;
     63 
     64 		// Does the host require actual image data (vs. just getting metadata
     65 		// or just checking to see if the file is readable)?
     66 
     67 		bool fNeedsImage;
     68 
     69 		// If we need the image data, can it be read at preview quality?
     70 
     71 		bool fForPreview;
     72 
     73 		// If non-zero, the minimum size (longer of the two pixel dimensions)
     74 		// image to read.  If zero, or if the full size image is smaller than
     75 		// this, read the full size image.
     76 
     77 		uint32 fMinimumSize;
     78 
     79 		// What is the preferred size for a preview image?  This can
     80 		// be slightly larger than the minimum size.  Zero if we want
     81 		// the full resolution image.
     82 
     83 		uint32 fPreferredSize;
     84 
     85 		// What is the maximum size for a preview image?  Zero if there
     86 		// is no maximum size limit.
     87 
     88 		uint32 fMaximumSize;
     89 
     90 		// The fraction of the image kept after a crop.  This is used to
     91 		// adjust the sizes to take into account the cropping that
     92 		// will be peformed.
     93 
     94 		real64 fCropFactor;
     95 
     96 		// What DNG version should we keep enough data to save?
     97 
     98 		uint32 fSaveDNGVersion;
     99 
    100 		// Do we want to force saving to a linear DNG?
    101 
    102 		bool fSaveLinearDNG;
    103 
    104 		// Keep the original raw file data block?
    105 
    106 		bool fKeepOriginalFile;
    107 
    108 	public:
    109 
    110 		/// Allocate a dng_host object, possiblly with custom allocator and sniffer.
    111 		/// \param allocator Allows controlling all memory allocation done via this
    112 		/// dng_host. Defaults to singleton global dng_memory_allocator, which calls
    113 		/// new/delete dng_malloc_block for appropriate size.
    114 		/// \param sniffer Used to periodically check if pending DNG conversions
    115 		/// should be aborted and to communicate progress updates. Defaults to singleton
    116 		/// global dng_abort_sniffer, which never aborts and ignores progress updated.
    117 
    118 		dng_host (dng_memory_allocator *allocator = NULL,
    119 				  dng_abort_sniffer *sniffer = NULL);
    120 
    121 		/// Clean up direct memory for dng_host. Memory allocator and abort sniffer
    122 		/// are not deleted. Objects such as dng_image and others returned from
    123 		/// host can still be used after host is deleted.
    124 
    125 		virtual ~dng_host ();
    126 
    127 		/// Getter for host's memory allocator.
    128 
    129 		dng_memory_allocator & Allocator ();
    130 
    131 		/// Alocate a new dng_memory_block using the host's memory allocator.
    132 		/// Uses the Allocator() property of host to allocate a new block of memory.
    133 		/// Will call ThrowMemoryFull if block cannot be allocated.
    134 		/// \param logicalSize Number of usable bytes returned dng_memory_block
    135 		/// must contain.
    136 
    137 		virtual dng_memory_block * Allocate (uint32 logicalSize);
    138 
    139 		/// Setter for host's abort sniffer.
    140 
    141 		void SetSniffer (dng_abort_sniffer *sniffer)
    142 			{
    143 			fSniffer = sniffer;
    144 			}
    145 
    146 		/// Getter for host's abort sniffer.
    147 
    148 		dng_abort_sniffer * Sniffer ()
    149 			{
    150 			return fSniffer;
    151 			}
    152 
    153 		/// Check for pending abort. Should call ThrowUserCanceled if an abort
    154 		/// is pending.
    155 
    156 		virtual void SniffForAbort ();
    157 
    158 		/// Setter for flag determining whether all XMP metadata should be parsed.
    159 		/// Defaults to true. One might not want metadata when doing a quick check
    160 		/// to see if a file is readable.
    161 		/// \param needs If true, metadata is needed.
    162 
    163 		void SetNeedsMeta (bool needs)
    164 			{
    165 			fNeedsMeta = needs;
    166 			}
    167 
    168 		/// Getter for flag determining whether all XMP metadata should be parsed.
    169 
    170 		bool NeedsMeta () const
    171 			{
    172 			return fNeedsMeta;
    173 			}
    174 
    175 		/// Setter for flag determining whether DNG image data is needed. Defaults
    176 		/// to true. Image data might not be needed for applications which only
    177 		/// manipulate metadata.
    178 		/// \param needs If true, image data is needed.
    179 
    180 		void SetNeedsImage (bool needs)
    181 			{
    182 			fNeedsImage = needs;
    183 			}
    184 
    185 		/// Setter for flag determining whether DNG image data is needed.
    186 
    187 		bool NeedsImage () const
    188 			{
    189 			return fNeedsImage;
    190 			}
    191 
    192 		/// Setter for flag determining whether	image should be preview quality,
    193 		/// or full quality.
    194 		/// \param preview If true, rendered images are for preview.
    195 
    196 		void SetForPreview (bool preview)
    197 			{
    198 			fForPreview = preview;
    199 			}
    200 
    201 		/// Getter for flag determining whether image should be preview quality.
    202 		/// Preview quality images may be rendered more quickly. Current DNG SDK
    203 		/// does not change rendering behavior based on this flag, but derived
    204 		/// versions may use this getter to choose between a slower more accurate path
    205 		/// and a faster "good enough for preview" one. Data produce with ForPreview set
    206 		/// to true should not be written back to a DNG file, except as a preview image.
    207 
    208 		bool ForPreview () const
    209 			{
    210 			return fForPreview;
    211 			}
    212 
    213 		/// Setter for the minimum preview size.
    214 		/// \param size Minimum pixel size (long side of image).
    215 
    216 		void SetMinimumSize (uint32 size)
    217 			{
    218 			fMinimumSize = size;
    219 			}
    220 
    221 		/// Getter for the minimum preview size.
    222 
    223 		uint32 MinimumSize () const
    224 			{
    225 			return fMinimumSize;
    226 			}
    227 
    228 		/// Setter for the preferred preview size.
    229 		/// \param size Preferred pixel size (long side of image).
    230 
    231 		void SetPreferredSize (uint32 size)
    232 			{
    233 			fPreferredSize = size;
    234 			}
    235 
    236 		/// Getter for the preferred preview size.
    237 
    238 		uint32 PreferredSize () const
    239 			{
    240 			return fPreferredSize;
    241 			}
    242 
    243 		/// Setter for the maximum preview size.
    244 		/// \param size Maximum pixel size (long side of image).
    245 
    246 		void SetMaximumSize (uint32 size)
    247 			{
    248 			fMaximumSize = size;
    249 			}
    250 
    251 		/// Getter for the maximum preview size.
    252 
    253 		uint32 MaximumSize () const
    254 			{
    255 			return fMaximumSize;
    256 			}
    257 
    258 		/// Setter for the cropping factor.
    259 		/// \param cropFactor Fraction of image to be used after crop.
    260 
    261 		void SetCropFactor (real64 cropFactor)
    262 			{
    263 			fCropFactor = cropFactor;
    264 			}
    265 
    266 		/// Getter for the cropping factor.
    267 
    268 		real64 CropFactor () const
    269 			{
    270 			return fCropFactor;
    271 			}
    272 
    273 		/// Makes sures minimum, preferred, and maximum sizes are reasonable.
    274 
    275 		void ValidateSizes ();
    276 
    277 		/// Setter for what version to save DNG file compatible with.
    278 		/// \param version What version to save DNG file compatible with.
    279 
    280 		void SetSaveDNGVersion (uint32 version)
    281 			{
    282 			fSaveDNGVersion = version;
    283 			}
    284 
    285 		/// Getter for what version to save DNG file compatible with.
    286 
    287 		virtual uint32 SaveDNGVersion () const;
    288 
    289 		/// Setter for flag determining whether to force saving a linear DNG file.
    290 		/// \param linear If true, we should force saving a linear DNG file.
    291 
    292 		void SetSaveLinearDNG (bool linear)
    293 			{
    294 			fSaveLinearDNG = linear;
    295 			}
    296 
    297 		/// Getter for flag determining whether to save a linear DNG file.
    298 
    299 		virtual bool SaveLinearDNG (const dng_negative &negative) const;
    300 
    301 		/// Setter for flag determining whether to keep original RAW file data.
    302 		/// \param keep If true, origianl RAW data will be kept.
    303 
    304 		void SetKeepOriginalFile (bool keep)
    305 			{
    306 			fKeepOriginalFile = keep;
    307 			}
    308 
    309 		/// Getter for flag determining whether to keep original RAW file data.
    310 
    311 		bool KeepOriginalFile ()
    312 			{
    313 			return fKeepOriginalFile;
    314 			}
    315 
    316 		/// Determine if an error is the result of a temporary, but planned-for
    317 		/// occurence such as user cancellation or memory exhaustion. This method is
    318 		/// sometimes used to determine whether to try and continue processing a DNG
    319 		/// file despite errors in the file format, etc. In such cases, processing will
    320 		/// be continued if IsTransientError returns false. This is so that user cancellation
    321 		/// and memory exhaustion always terminate processing.
    322 		/// \param code Error to test for transience.
    323 
    324 		virtual bool IsTransientError (dng_error_code code);
    325 
    326 		/// General top-level botttleneck for image processing tasks.
    327 		/// Default implementation calls dng_area_task::PerformAreaTask method on
    328 		/// task. Can be overridden in derived classes to support multiprocessing,
    329 		/// for example.
    330 		/// \param task Image processing task to perform on area.
    331 		/// \param area Rectangle over which to perform image processing task.
    332 
    333 		virtual void PerformAreaTask (dng_area_task &task,
    334 									  const dng_rect &area);
    335 
    336 		/// How many multiprocessing threads does PerformAreaTask use?
    337 		/// Default implementation always returns 1 since it is single threaded.
    338 
    339 		virtual uint32 PerformAreaTaskThreads ();
    340 
    341 		/// Factory method for dng_exif class. Can be used to customize allocation or
    342 		/// to ensure a derived class is used instead of dng_exif.
    343 
    344 		virtual dng_exif * Make_dng_exif ();
    345 
    346 		/// Factory method for dng_xmp class. Can be used to customize allocation or
    347 		/// to ensure a derived class is used instead of dng_xmp.
    348 
    349 		#if qDNGUseXMP
    350 
    351 		virtual dng_xmp * Make_dng_xmp ();
    352 
    353 		#endif
    354 
    355 		/// Factory method for dng_shared class. Can be used to customize allocation
    356 		/// or to ensure a derived class is used instead of dng_shared.
    357 
    358 		virtual dng_shared * Make_dng_shared ();
    359 
    360 		/// Factory method for dng_ifd class. Can be used to customize allocation or
    361 		/// to ensure a derived class is used instead of dng_ifd.
    362 
    363 		virtual dng_ifd * Make_dng_ifd ();
    364 
    365 		/// Factory method for dng_negative class. Can be used to customize allocation
    366 		/// or to ensure a derived class is used instead of dng_negative.
    367 
    368 		virtual dng_negative * Make_dng_negative ();
    369 
    370 		/// Factory method for dng_image class. Can be used to customize allocation
    371 		/// or to ensure a derived class is used instead of dng_simple_image.
    372 
    373 		virtual dng_image * Make_dng_image (const dng_rect &bounds,
    374 											uint32 planes,
    375 											uint32 pixelType);
    376 
    377 		/// Factory method for parsing dng_opcode based classs. Can be used to
    378 		/// override opcode implementations.
    379 
    380 		virtual dng_opcode * Make_dng_opcode (uint32 opcodeID,
    381 											  dng_stream &stream);
    382 
    383 		/// Factory method to apply a dng_opcode_list. Can be used to override
    384 		/// opcode list applications.
    385 
    386 		virtual void ApplyOpcodeList (dng_opcode_list &list,
    387 									  dng_negative &negative,
    388 									  AutoPtr<dng_image> &image);
    389 
    390 		/// Factory method to resample an image.  Can be used to override
    391 		/// image method used to resample images.
    392 
    393 		virtual void ResampleImage (const dng_image &srcImage,
    394 									dng_image &dstImage);
    395 
    396 	private:
    397 
    398 		// Hidden copy constructor and assignment operator.
    399 
    400 		dng_host (const dng_host &host);
    401 
    402 		dng_host & operator= (const dng_host &host);
    403 
    404 	};
    405 
    406 /*****************************************************************************/
    407 
    408 #endif
    409 
    410 /*****************************************************************************/
    411