Home | History | Annotate | Download | only in source
      1 /*****************************************************************************/
      2 // Copyright 2006 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_filter_task.cpp#1 $ */
     10 /* $DateTime: 2012/05/30 13:28:51 $ */
     11 /* $Change: 832332 $ */
     12 /* $Author: tknoll $ */
     13 
     14 /*****************************************************************************/
     15 
     16 #include "dng_filter_task.h"
     17 
     18 #include "dng_bottlenecks.h"
     19 #include "dng_exceptions.h"
     20 #include "dng_image.h"
     21 #include "dng_memory.h"
     22 #include "dng_tag_types.h"
     23 #include "dng_tag_values.h"
     24 #include "dng_utils.h"
     25 
     26 /*****************************************************************************/
     27 
     28 dng_filter_task::dng_filter_task (const dng_image &srcImage,
     29 						 		  dng_image &dstImage)
     30 
     31 	:	fSrcImage     (srcImage)
     32 	,	fDstImage     (dstImage)
     33 
     34 	,	fSrcPlane     (0                    )
     35 	,	fSrcPlanes    (srcImage.Planes    ())
     36 	,	fSrcPixelType (srcImage.PixelType ())
     37 
     38 	,	fDstPlane     (0                    )
     39 	,	fDstPlanes    (dstImage.Planes    ())
     40 	,	fDstPixelType (dstImage.PixelType ())
     41 
     42 	,	fSrcRepeat    (1, 1)
     43 	,	fSrcTileSize  (0, 0)
     44 
     45 	{
     46 
     47 	}
     48 
     49 /*****************************************************************************/
     50 
     51 dng_filter_task::~dng_filter_task ()
     52 	{
     53 
     54 	}
     55 
     56 /*****************************************************************************/
     57 
     58 void dng_filter_task::Start (uint32 threadCount,
     59 							 const dng_point &tileSize,
     60 							 dng_memory_allocator *allocator,
     61 							 dng_abort_sniffer * /* sniffer */)
     62 	{
     63 
     64 	fSrcTileSize = SrcTileSize (tileSize);
     65 
     66 		uint32 srcBufferSize = ComputeBufferSize(fSrcPixelType, fSrcTileSize,
     67 												 fSrcPlanes, pad16Bytes);
     68 		uint32 dstBufferSize = ComputeBufferSize(fDstPixelType, tileSize,
     69 												 fDstPlanes, pad16Bytes);
     70 
     71 		for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++)
     72 		{
     73 
     74 		fSrcBuffer [threadIndex] . Reset (allocator->Allocate (srcBufferSize));
     75 
     76 		fDstBuffer [threadIndex] . Reset (allocator->Allocate (dstBufferSize));
     77 
     78 		// Zero buffers so any pad bytes have defined values.
     79 
     80 		DoZeroBytes (fSrcBuffer [threadIndex]->Buffer      (),
     81 					 fSrcBuffer [threadIndex]->LogicalSize ());
     82 
     83 		DoZeroBytes (fDstBuffer [threadIndex]->Buffer      (),
     84 					 fDstBuffer [threadIndex]->LogicalSize ());
     85 
     86 		}
     87 
     88 	}
     89 
     90 /*****************************************************************************/
     91 
     92 void dng_filter_task::Process (uint32 threadIndex,
     93 							   const dng_rect &area,
     94 							   dng_abort_sniffer * /* sniffer */)
     95 	{
     96 
     97 	// Find source area for this destination area.
     98 
     99 	dng_rect srcArea = SrcArea (area);
    100 
    101 	int32 src_area_w;
    102 	int32 src_area_h;
    103 	if (!ConvertUint32ToInt32 (srcArea.W (), &src_area_w) || !ConvertUint32ToInt32 (srcArea.H (), &src_area_h) || src_area_w > fSrcTileSize.h || src_area_h > fSrcTileSize.v)
    104 		{
    105 
    106 		ThrowMemoryFull("Area exceeds tile size.");
    107 
    108 		}
    109 
    110 	// Setup srcBuffer.
    111 
    112 	dng_pixel_buffer srcBuffer(srcArea, fSrcPlane, fSrcPlanes, fSrcPixelType,
    113 							   pcRowInterleavedAlign16,
    114 							   fSrcBuffer [threadIndex]->Buffer ());
    115 
    116 	// Setup dstBuffer.
    117 
    118 	dng_pixel_buffer dstBuffer(area, fDstPlane, fDstPlanes, fDstPixelType,
    119 							   pcRowInterleavedAlign16,
    120 							   fDstBuffer [threadIndex]->Buffer ());
    121 
    122 	// Get source pixels.
    123 
    124 	fSrcImage.Get (srcBuffer,
    125 				   dng_image::edge_repeat,
    126 				   fSrcRepeat.v,
    127 				   fSrcRepeat.h);
    128 
    129 	// Process area.
    130 
    131 	ProcessArea (threadIndex,
    132 				 srcBuffer,
    133 				 dstBuffer);
    134 
    135 	// Save result pixels.
    136 
    137 	fDstImage.Put (dstBuffer);
    138 
    139 	}
    140 
    141 /*****************************************************************************/
    142