gpr-tools/source/lib/dng_sdk/dng_filter_task.cpp

168 wiersze
4.4 KiB
C++

/*****************************************************************************/
// Copyright 2006 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_filter_task.cpp#1 $ */
/* $DateTime: 2012/05/30 13:28:51 $ */
/* $Change: 832332 $ */
/* $Author: tknoll $ */
/*****************************************************************************/
#include "dng_filter_task.h"
#include "dng_bottlenecks.h"
#include "dng_exceptions.h"
#include "dng_image.h"
#include "dng_memory.h"
#include "dng_tag_types.h"
#include "dng_utils.h"
/*****************************************************************************/
dng_filter_task::dng_filter_task (const dng_image &srcImage,
dng_image &dstImage)
: fSrcImage (srcImage)
, fDstImage (dstImage)
, fSrcPlane (0 )
, fSrcPlanes (srcImage.Planes ())
, fSrcPixelType (srcImage.PixelType ())
, fDstPlane (0 )
, fDstPlanes (dstImage.Planes ())
, fDstPixelType (dstImage.PixelType ())
, fSrcRepeat (1, 1)
{
}
/*****************************************************************************/
dng_filter_task::~dng_filter_task ()
{
}
/*****************************************************************************/
void dng_filter_task::Start (uint32 threadCount,
const dng_point &tileSize,
dng_memory_allocator *allocator,
dng_abort_sniffer * /* sniffer */)
{
dng_point srcTileSize = SrcTileSize (tileSize);
uint32 srcPixelSize = TagTypeSize (fSrcPixelType);
uint32 srcBufferSize = srcTileSize.v *
RoundUpForPixelSize (srcTileSize.h, srcPixelSize) *
srcPixelSize *
fSrcPlanes;
uint32 dstPixelSize = TagTypeSize (fDstPixelType);
uint32 dstBufferSize = tileSize.v *
RoundUpForPixelSize (tileSize.h, dstPixelSize) *
dstPixelSize *
fDstPlanes;
for (uint32 threadIndex = 0; threadIndex < threadCount; threadIndex++)
{
fSrcBuffer [threadIndex] . Reset (allocator->Allocate (srcBufferSize));
fDstBuffer [threadIndex] . Reset (allocator->Allocate (dstBufferSize));
// Zero buffers so any pad bytes have defined values.
DoZeroBytes (fSrcBuffer [threadIndex]->Buffer (),
fSrcBuffer [threadIndex]->LogicalSize ());
DoZeroBytes (fDstBuffer [threadIndex]->Buffer (),
fDstBuffer [threadIndex]->LogicalSize ());
}
}
/*****************************************************************************/
void dng_filter_task::Process (uint32 threadIndex,
const dng_rect &area,
dng_abort_sniffer * /* sniffer */)
{
// Find source area for this destination area.
dng_rect srcArea = SrcArea (area);
// Setup srcBuffer.
dng_pixel_buffer srcBuffer;
srcBuffer.fArea = srcArea;
srcBuffer.fPlane = fSrcPlane;
srcBuffer.fPlanes = fSrcPlanes;
srcBuffer.fPixelType = fSrcPixelType;
srcBuffer.fPixelSize = TagTypeSize (fSrcPixelType);
srcBuffer.fPlaneStep = RoundUpForPixelSize (srcArea.W (),
srcBuffer.fPixelSize);
srcBuffer.fRowStep = srcBuffer.fPlaneStep *
srcBuffer.fPlanes;
srcBuffer.fData = fSrcBuffer [threadIndex]->Buffer ();
// Setup dstBuffer.
dng_pixel_buffer dstBuffer;
dstBuffer.fArea = area;
dstBuffer.fPlane = fDstPlane;
dstBuffer.fPlanes = fDstPlanes;
dstBuffer.fPixelType = fDstPixelType;
dstBuffer.fPixelSize = TagTypeSize (fDstPixelType);
dstBuffer.fPlaneStep = RoundUpForPixelSize (area.W (),
dstBuffer.fPixelSize);
dstBuffer.fRowStep = dstBuffer.fPlaneStep *
dstBuffer.fPlanes;
dstBuffer.fData = fDstBuffer [threadIndex]->Buffer ();
// Get source pixels.
fSrcImage.Get (srcBuffer,
dng_image::edge_repeat,
fSrcRepeat.v,
fSrcRepeat.h);
// Process area.
ProcessArea (threadIndex,
srcBuffer,
dstBuffer);
// Save result pixels.
fDstImage.Put (dstBuffer);
}
/*****************************************************************************/