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