/*****************************************************************************/ // Copyright 2006-2012 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in // accordance with the terms of the Adobe license agreement accompanying it. /*****************************************************************************/ /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_host.cpp#2 $ */ /* $DateTime: 2012/06/14 20:24:41 $ */ /* $Change: 835078 $ */ /* $Author: tknoll $ */ /*****************************************************************************/ #include "dng_host.h" #include "dng_abort_sniffer.h" #include "dng_area_task.h" #include "dng_bad_pixels.h" #include "dng_exceptions.h" #include "dng_exif.h" #include "dng_gain_map.h" #include "dng_ifd.h" #include "dng_lens_correction.h" #include "dng_memory.h" #include "dng_misc_opcodes.h" #include "dng_negative.h" #include "dng_resample.h" #include "dng_shared.h" #include "dng_simple_image.h" #if qDNGUseXMP #include "dng_xmp.h" #endif /*****************************************************************************/ dng_host::dng_host (dng_memory_allocator *allocator, dng_abort_sniffer *sniffer) : fAllocator (allocator) , fSniffer (sniffer) , fNeedsMeta (true) , fNeedsImage (true) , fForPreview (false) , fMinimumSize (0) , fPreferredSize (0) , fMaximumSize (0) , fCropFactor (1.0) , fSaveDNGVersion (dngVersion_None) , fSaveLinearDNG (false) , fKeepOriginalFile (false) { } /*****************************************************************************/ dng_host::~dng_host () { } /*****************************************************************************/ dng_memory_allocator & dng_host::Allocator () { if (fAllocator) { return *fAllocator; } else { return gDefaultDNGMemoryAllocator; } } /*****************************************************************************/ dng_memory_block * dng_host::Allocate (uint32 logicalSize) { return Allocator ().Allocate (logicalSize); } /*****************************************************************************/ void dng_host::SniffForAbort () { dng_abort_sniffer::SniffForAbort (Sniffer ()); } /*****************************************************************************/ void dng_host::ValidateSizes () { // The maximum size limits the other two sizes. if (MaximumSize ()) { SetMinimumSize (Min_uint32 (MinimumSize (), MaximumSize ())); SetPreferredSize (Min_uint32 (PreferredSize (), MaximumSize ())); } // If we have a preferred size, it limits the minimum size. if (PreferredSize ()) { SetMinimumSize (Min_uint32 (MinimumSize (), PreferredSize ())); } // Else find default value for preferred size. else { // If preferred size is zero, then we want the maximim // size image. if (MaximumSize ()) { SetPreferredSize (MaximumSize ()); } } // If we don't have a minimum size, find default. if (!MinimumSize ()) { // A common size for embedded thumbnails is 120 by 160 pixels, // So allow 120 by 160 pixels to be used for thumbnails when the // preferred size is 256 pixel. if (PreferredSize () >= 160 && PreferredSize () <= 256) { SetMinimumSize (160); } // Many sensors are near a multiple of 1024 pixels in size, but after // the default crop, they are a just under. We can get an extra factor // of size reduction if we allow a slight undershoot in the final size // when computing large previews. else if (PreferredSize () >= 490 && PreferredSize () <= 512) { SetMinimumSize (490); } else if (PreferredSize () >= 980 && PreferredSize () <= 1024) { SetMinimumSize (980); } else if (PreferredSize () >= 1470 && PreferredSize () <= 1536) { SetMinimumSize (1470); } else if (PreferredSize () >= 1960 && PreferredSize () <= 2048) { SetMinimumSize (1960); } // Else minimum size is same as preferred size. else { SetMinimumSize (PreferredSize ()); } } } /*****************************************************************************/ uint32 dng_host::SaveDNGVersion () const { return fSaveDNGVersion; } /*****************************************************************************/ bool dng_host::SaveLinearDNG (const dng_negative & /* negative */) const { return fSaveLinearDNG; } /*****************************************************************************/ bool dng_host::IsTransientError (dng_error_code code) { switch (code) { case dng_error_memory: case dng_error_user_canceled: { return true; } default: break; } return false; } /*****************************************************************************/ void dng_host::PerformAreaTask (dng_area_task &task, const dng_rect &area) { dng_area_task::Perform (task, area, &Allocator (), Sniffer ()); } /*****************************************************************************/ uint32 dng_host::PerformAreaTaskThreads () { return 1; } /*****************************************************************************/ dng_exif * dng_host::Make_dng_exif () { dng_exif *result = new dng_exif (); if (!result) { ThrowMemoryFull (); } return result; } /*****************************************************************************/ #if qDNGUseXMP dng_xmp * dng_host::Make_dng_xmp () { dng_xmp *result = new dng_xmp (Allocator ()); if (!result) { ThrowMemoryFull (); } return result; } #endif /*****************************************************************************/ dng_shared * dng_host::Make_dng_shared () { dng_shared *result = new dng_shared (); if (!result) { ThrowMemoryFull (); } return result; } /*****************************************************************************/ dng_ifd * dng_host::Make_dng_ifd () { dng_ifd *result = new dng_ifd (); if (!result) { ThrowMemoryFull (); } return result; } /*****************************************************************************/ dng_negative * dng_host::Make_dng_negative () { return dng_negative::Make (*this); } /*****************************************************************************/ dng_image * dng_host::Make_dng_image (const dng_rect &bounds, uint32 planes, uint32 pixelType) { dng_image *result = new dng_simple_image (bounds, planes, pixelType, Allocator ()); if (!result) { ThrowMemoryFull (); } return result; } /*****************************************************************************/ dng_opcode * dng_host::Make_dng_opcode (uint32 opcodeID, dng_stream &stream) { dng_opcode *result = NULL; switch (opcodeID) { case dngOpcode_WarpRectilinear: { result = new dng_opcode_WarpRectilinear (stream); break; } case dngOpcode_WarpFisheye: { result = new dng_opcode_WarpFisheye (stream); break; } case dngOpcode_FixVignetteRadial: { result = new dng_opcode_FixVignetteRadial (stream); break; } case dngOpcode_FixBadPixelsConstant: { result = new dng_opcode_FixBadPixelsConstant (stream); break; } case dngOpcode_FixBadPixelsList: { result = new dng_opcode_FixBadPixelsList (stream); break; } case dngOpcode_TrimBounds: { result = new dng_opcode_TrimBounds (stream); break; } case dngOpcode_MapTable: { result = new dng_opcode_MapTable (*this, stream); break; } case dngOpcode_MapPolynomial: { result = new dng_opcode_MapPolynomial (stream); break; } case dngOpcode_GainMap: { result = new dng_opcode_GainMap (*this, stream); break; } case dngOpcode_DeltaPerRow: { result = new dng_opcode_DeltaPerRow (*this, stream); break; } case dngOpcode_DeltaPerColumn: { result = new dng_opcode_DeltaPerColumn (*this, stream); break; } case dngOpcode_ScalePerRow: { result = new dng_opcode_ScalePerRow (*this, stream); break; } case dngOpcode_ScalePerColumn: { result = new dng_opcode_ScalePerColumn (*this, stream); break; } default: { result = new dng_opcode_Unknown (*this, opcodeID, stream); } } if (!result) { ThrowMemoryFull (); } return result; } /*****************************************************************************/ void dng_host::ApplyOpcodeList (dng_opcode_list &list, dng_negative &negative, AutoPtr<dng_image> &image) { list.Apply (*this, negative, image); } /*****************************************************************************/ void dng_host::ResampleImage (const dng_image &srcImage, dng_image &dstImage) { ::ResampleImage (*this, srcImage, dstImage, srcImage.Bounds (), dstImage.Bounds (), dng_resample_bicubic::Get ()); } /*****************************************************************************/