| 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 |  | 
|---|