kopia lustrzana https://github.com/gopro/gpr
168 wiersze
4.4 KiB
C++
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);
|
|
|
|
}
|
|
|
|
/*****************************************************************************/
|