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.cpp#2 $ */
     10 /* $DateTime: 2012/06/14 20:24:41 $ */
     11 /* $Change: 835078 $ */
     12 /* $Author: tknoll $ */
     13 
     14 /*****************************************************************************/
     15 
     16 #include "dng_host.h"
     17 
     18 #include "dng_abort_sniffer.h"
     19 #include "dng_area_task.h"
     20 #include "dng_bad_pixels.h"
     21 #include "dng_exceptions.h"
     22 #include "dng_exif.h"
     23 #include "dng_gain_map.h"
     24 #include "dng_ifd.h"
     25 #include "dng_lens_correction.h"
     26 #include "dng_memory.h"
     27 #include "dng_misc_opcodes.h"
     28 #include "dng_negative.h"
     29 #include "dng_resample.h"
     30 #include "dng_shared.h"
     31 #include "dng_simple_image.h"
     32 
     33 #if qDNGUseXMP
     34 #include "dng_xmp.h"
     35 #endif
     36 
     37 /*****************************************************************************/
     38 
     39 dng_host::dng_host (dng_memory_allocator *allocator,
     40 					dng_abort_sniffer *sniffer)
     41 
     42 	:	fAllocator	(allocator)
     43 	,	fSniffer	(sniffer)
     44 
     45 	,	fNeedsMeta  		(true)
     46 	,	fNeedsImage 		(true)
     47 	,	fForPreview 		(false)
     48 	,	fMinimumSize 		(0)
     49 	,	fPreferredSize      (0)
     50 	,	fMaximumSize    	(0)
     51 	,	fCropFactor			(1.0)
     52 	,	fSaveDNGVersion		(dngVersion_None)
     53 	,	fSaveLinearDNG		(false)
     54 	,	fKeepOriginalFile	(false)
     55 
     56 	{
     57 
     58 	}
     59 
     60 /*****************************************************************************/
     61 
     62 dng_host::~dng_host ()
     63 	{
     64 
     65 	}
     66 
     67 /*****************************************************************************/
     68 
     69 dng_memory_allocator & dng_host::Allocator ()
     70 	{
     71 
     72 	if (fAllocator)
     73 		{
     74 
     75 		return *fAllocator;
     76 
     77 		}
     78 
     79 	else
     80 		{
     81 
     82 		return gDefaultDNGMemoryAllocator;
     83 
     84 		}
     85 
     86 	}
     87 
     88 /*****************************************************************************/
     89 
     90 dng_memory_block * dng_host::Allocate (uint32 logicalSize)
     91 	{
     92 
     93 	return Allocator ().Allocate (logicalSize);
     94 
     95 	}
     96 
     97 /*****************************************************************************/
     98 
     99 void dng_host::SniffForAbort ()
    100 	{
    101 
    102 	dng_abort_sniffer::SniffForAbort (Sniffer ());
    103 
    104 	}
    105 
    106 /*****************************************************************************/
    107 
    108 void dng_host::ValidateSizes ()
    109 	{
    110 
    111 	// The maximum size limits the other two sizes.
    112 
    113 	if (MaximumSize ())
    114 		{
    115 		SetMinimumSize   (Min_uint32 (MinimumSize   (), MaximumSize ()));
    116 		SetPreferredSize (Min_uint32 (PreferredSize (), MaximumSize ()));
    117 		}
    118 
    119 	// If we have a preferred size, it limits the minimum size.
    120 
    121 	if (PreferredSize ())
    122 		{
    123 		SetMinimumSize (Min_uint32 (MinimumSize (), PreferredSize ()));
    124 		}
    125 
    126 	// Else find default value for preferred size.
    127 
    128 	else
    129 		{
    130 
    131 		// If preferred size is zero, then we want the maximim
    132 		// size image.
    133 
    134 		if (MaximumSize ())
    135 			{
    136 			SetPreferredSize (MaximumSize ());
    137 			}
    138 
    139 		}
    140 
    141 	// If we don't have a minimum size, find default.
    142 
    143 	if (!MinimumSize ())
    144 		{
    145 
    146 		// A common size for embedded thumbnails is 120 by 160 pixels,
    147 		// So allow 120 by 160 pixels to be used for thumbnails when the
    148 		// preferred size is 256 pixel.
    149 
    150 		if (PreferredSize () >= 160 && PreferredSize () <= 256)
    151 			{
    152 			SetMinimumSize (160);
    153 			}
    154 
    155 		// Many sensors are near a multiple of 1024 pixels in size, but after
    156 		// the default crop, they are a just under.  We can get an extra factor
    157 		// of size reduction if we allow a slight undershoot in the final size
    158 		// when computing large previews.
    159 
    160 		else if (PreferredSize () >= 490 && PreferredSize () <= 512)
    161 			{
    162 			SetMinimumSize (490);
    163 			}
    164 
    165 		else if (PreferredSize () >= 980 && PreferredSize () <= 1024)
    166 			{
    167 			SetMinimumSize (980);
    168 			}
    169 
    170 		else if (PreferredSize () >= 1470 && PreferredSize () <= 1536)
    171 			{
    172 			SetMinimumSize (1470);
    173 			}
    174 
    175 		else if (PreferredSize () >= 1960 && PreferredSize () <= 2048)
    176 			{
    177 			SetMinimumSize (1960);
    178 			}
    179 
    180 		// Else minimum size is same as preferred size.
    181 
    182 		else
    183 			{
    184 			SetMinimumSize (PreferredSize ());
    185 			}
    186 
    187 		}
    188 
    189 	}
    190 
    191 /*****************************************************************************/
    192 
    193 uint32 dng_host::SaveDNGVersion () const
    194 	{
    195 
    196 	return fSaveDNGVersion;
    197 
    198 	}
    199 
    200 /*****************************************************************************/
    201 
    202 bool dng_host::SaveLinearDNG (const dng_negative & /* negative */) const
    203 	{
    204 
    205 	return fSaveLinearDNG;
    206 
    207 	}
    208 
    209 /*****************************************************************************/
    210 
    211 bool dng_host::IsTransientError (dng_error_code code)
    212 	{
    213 
    214 	switch (code)
    215 		{
    216 
    217 		case dng_error_memory:
    218 		case dng_error_user_canceled:
    219 			{
    220 			return true;
    221 			}
    222 
    223 		default:
    224 			break;
    225 
    226 		}
    227 
    228 	return false;
    229 
    230 	}
    231 
    232 /*****************************************************************************/
    233 
    234 void dng_host::PerformAreaTask (dng_area_task &task,
    235 								const dng_rect &area)
    236 	{
    237 
    238 	dng_area_task::Perform (task,
    239 							area,
    240 							&Allocator (),
    241 							Sniffer ());
    242 
    243 	}
    244 
    245 /*****************************************************************************/
    246 
    247 uint32 dng_host::PerformAreaTaskThreads ()
    248 	{
    249 
    250 	return 1;
    251 
    252 	}
    253 
    254 /*****************************************************************************/
    255 
    256 dng_exif * dng_host::Make_dng_exif ()
    257 	{
    258 
    259 	dng_exif *result = new dng_exif ();
    260 
    261 	if (!result)
    262 		{
    263 
    264 		ThrowMemoryFull ();
    265 
    266 		}
    267 
    268 	return result;
    269 
    270 	}
    271 
    272 /*****************************************************************************/
    273 
    274 #if qDNGUseXMP
    275 
    276 dng_xmp * dng_host::Make_dng_xmp ()
    277 	{
    278 
    279 	dng_xmp *result = new dng_xmp (Allocator ());
    280 
    281 	if (!result)
    282 		{
    283 
    284 		ThrowMemoryFull ();
    285 
    286 		}
    287 
    288 	return result;
    289 
    290 	}
    291 
    292 #endif
    293 
    294 /*****************************************************************************/
    295 
    296 dng_shared * dng_host::Make_dng_shared ()
    297 	{
    298 
    299 	dng_shared *result = new dng_shared ();
    300 
    301 	if (!result)
    302 		{
    303 
    304 		ThrowMemoryFull ();
    305 
    306 		}
    307 
    308 	return result;
    309 
    310 	}
    311 
    312 /*****************************************************************************/
    313 
    314 dng_ifd * dng_host::Make_dng_ifd ()
    315 	{
    316 
    317 	dng_ifd *result = new dng_ifd ();
    318 
    319 	if (!result)
    320 		{
    321 
    322 		ThrowMemoryFull ();
    323 
    324 		}
    325 
    326 	return result;
    327 
    328 	}
    329 
    330 /*****************************************************************************/
    331 
    332 dng_negative * dng_host::Make_dng_negative ()
    333 	{
    334 
    335 	return dng_negative::Make (*this);
    336 
    337 	}
    338 
    339 /*****************************************************************************/
    340 
    341 dng_image * dng_host::Make_dng_image (const dng_rect &bounds,
    342 									  uint32 planes,
    343 									  uint32 pixelType)
    344 	{
    345 
    346 	dng_image *result = new dng_simple_image (bounds,
    347 											  planes,
    348 											  pixelType,
    349 											  Allocator ());
    350 
    351 	if (!result)
    352 		{
    353 
    354 		ThrowMemoryFull ();
    355 
    356 		}
    357 
    358 	return result;
    359 
    360 	}
    361 
    362 /*****************************************************************************/
    363 
    364 dng_opcode * dng_host::Make_dng_opcode (uint32 opcodeID,
    365 										dng_stream &stream)
    366 	{
    367 
    368 	dng_opcode *result = NULL;
    369 
    370 	switch (opcodeID)
    371 		{
    372 
    373 		case dngOpcode_WarpRectilinear:
    374 			{
    375 
    376 			result = new dng_opcode_WarpRectilinear (stream);
    377 
    378 			break;
    379 
    380 			}
    381 
    382 		case dngOpcode_WarpFisheye:
    383 			{
    384 
    385 			result = new dng_opcode_WarpFisheye (stream);
    386 
    387 			break;
    388 
    389 			}
    390 
    391 		case dngOpcode_FixVignetteRadial:
    392 			{
    393 
    394 			result = new dng_opcode_FixVignetteRadial (stream);
    395 
    396 			break;
    397 
    398 			}
    399 
    400 		case dngOpcode_FixBadPixelsConstant:
    401 			{
    402 
    403 			result = new dng_opcode_FixBadPixelsConstant (stream);
    404 
    405 			break;
    406 
    407 			}
    408 
    409 		case dngOpcode_FixBadPixelsList:
    410 			{
    411 
    412 			result = new dng_opcode_FixBadPixelsList (stream);
    413 
    414 			break;
    415 
    416 			}
    417 
    418 		case dngOpcode_TrimBounds:
    419 			{
    420 
    421 			result = new dng_opcode_TrimBounds (stream);
    422 
    423 			break;
    424 
    425 			}
    426 
    427 		case dngOpcode_MapTable:
    428 			{
    429 
    430 			result = new dng_opcode_MapTable (*this,
    431 											  stream);
    432 
    433 			break;
    434 
    435 			}
    436 
    437 		case dngOpcode_MapPolynomial:
    438 			{
    439 
    440 			result = new dng_opcode_MapPolynomial (stream);
    441 
    442 			break;
    443 
    444 			}
    445 
    446 		case dngOpcode_GainMap:
    447 			{
    448 
    449 			result = new dng_opcode_GainMap (*this,
    450 											 stream);
    451 
    452 			break;
    453 
    454 			}
    455 
    456 		case dngOpcode_DeltaPerRow:
    457 			{
    458 
    459 			result = new dng_opcode_DeltaPerRow (*this,
    460 											     stream);
    461 
    462 			break;
    463 
    464 			}
    465 
    466 		case dngOpcode_DeltaPerColumn:
    467 			{
    468 
    469 			result = new dng_opcode_DeltaPerColumn (*this,
    470 											        stream);
    471 
    472 			break;
    473 
    474 			}
    475 
    476 		case dngOpcode_ScalePerRow:
    477 			{
    478 
    479 			result = new dng_opcode_ScalePerRow (*this,
    480 											     stream);
    481 
    482 			break;
    483 
    484 			}
    485 
    486 		case dngOpcode_ScalePerColumn:
    487 			{
    488 
    489 			result = new dng_opcode_ScalePerColumn (*this,
    490 											        stream);
    491 
    492 			break;
    493 
    494 			}
    495 
    496 		default:
    497 			{
    498 
    499 			result = new dng_opcode_Unknown (*this,
    500 											 opcodeID,
    501 											 stream);
    502 
    503 			}
    504 
    505 		}
    506 
    507 	if (!result)
    508 		{
    509 
    510 		ThrowMemoryFull ();
    511 
    512 		}
    513 
    514 	return result;
    515 
    516 	}
    517 
    518 /*****************************************************************************/
    519 
    520 void dng_host::ApplyOpcodeList (dng_opcode_list &list,
    521 								dng_negative &negative,
    522 								AutoPtr<dng_image> &image)
    523 	{
    524 
    525 	list.Apply (*this,
    526 				negative,
    527 				image);
    528 
    529 	}
    530 
    531 /*****************************************************************************/
    532 
    533 void dng_host::ResampleImage (const dng_image &srcImage,
    534 							  dng_image &dstImage)
    535 	{
    536 
    537 	::ResampleImage (*this,
    538 					 srcImage,
    539 					 dstImage,
    540 					 srcImage.Bounds (),
    541 					 dstImage.Bounds (),
    542 					 dng_resample_bicubic::Get ());
    543 
    544 	}
    545 
    546 /*****************************************************************************/
    547