/*****************************************************************************/
|
// 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.h#2 $ */
|
/* $DateTime: 2012/07/11 10:36:56 $ */
|
/* $Change: 838485 $ */
|
/* $Author: tknoll $ */
|
|
/** \file
|
* Specialization of dng_area_task for processing an area from one dng_image to an
|
* area of another.
|
*/
|
|
/*****************************************************************************/
|
|
#ifndef __dng_filter_task__
|
#define __dng_filter_task__
|
|
/*****************************************************************************/
|
|
#include "dng_area_task.h"
|
#include "dng_auto_ptr.h"
|
#include "dng_point.h"
|
#include "dng_rect.h"
|
#include "dng_sdk_limits.h"
|
|
/*****************************************************************************/
|
|
/// \brief Represents a task which filters an area of a source dng_image to an area
|
/// of a destination dng_image.
|
|
class dng_filter_task: public dng_area_task
|
{
|
|
protected:
|
|
const dng_image &fSrcImage;
|
|
dng_image &fDstImage;
|
|
uint32 fSrcPlane;
|
uint32 fSrcPlanes;
|
uint32 fSrcPixelType;
|
|
uint32 fDstPlane;
|
uint32 fDstPlanes;
|
uint32 fDstPixelType;
|
|
dng_point fSrcRepeat;
|
dng_point fSrcTileSize;
|
|
AutoPtr<dng_memory_block> fSrcBuffer [kMaxMPThreads];
|
AutoPtr<dng_memory_block> fDstBuffer [kMaxMPThreads];
|
|
public:
|
|
/// Construct a filter task given a source and destination images.
|
/// \param srcImage Image from which source pixels are read.
|
/// \param dstImage Image to which result pixels are written.
|
|
dng_filter_task (const dng_image &srcImage,
|
dng_image &dstImage);
|
|
virtual ~dng_filter_task ();
|
|
/// Compute the source area needed for a given destination area. Default
|
/// implementation assumes destination area is equal to source area for all
|
/// cases.
|
///
|
/// \param dstArea Area to for which pixels will be computed.
|
///
|
/// \retval The source area needed as input to calculate the requested
|
/// destination area.
|
|
virtual dng_rect SrcArea (const dng_rect &dstArea)
|
{
|
return dstArea;
|
}
|
|
/// Given a destination tile size, calculate input tile size. Simlar to
|
/// SrcArea, and should seldom be overridden.
|
///
|
/// \param dstTileSize The destination tile size that is targeted for output.
|
///
|
/// \retval The source tile size needed to compute a tile of the destination
|
/// size.
|
|
virtual dng_point SrcTileSize (const dng_point &dstTileSize)
|
{
|
return SrcArea (dng_rect (dstTileSize)).Size ();
|
}
|
|
/// Implements filtering operation from one buffer to another. Source and
|
/// destination pixels are set up in member fields of this class. Ideally, no
|
/// allocation should be done in this routine.
|
///
|
/// \param threadIndex The thread on which this routine is being called,
|
/// between 0 and threadCount - 1 for the threadCount passed to Start method.
|
///
|
/// \param srcBuffer Input area and source pixels.
|
///
|
/// \param dstBuffer Output area and destination pixels.
|
|
virtual void ProcessArea (uint32 threadIndex,
|
dng_pixel_buffer &srcBuffer,
|
dng_pixel_buffer &dstBuffer) = 0;
|
|
/// Called prior to processing on specific threads. Can be used to allocate
|
/// per-thread memory buffers, etc.
|
///
|
/// \param threadCount Total number of threads that will be used for
|
/// processing. Less than or equal to MaxThreads of dng_area_task.
|
///
|
/// \param tileSize Size of source tiles which will be processed. (Not all
|
/// tiles will be this size due to edge conditions.)
|
///
|
/// \param allocator dng_memory_allocator to use for allocating temporary
|
/// buffers, etc.
|
///
|
/// \param sniffer Sniffer to test for user cancellation and to set up
|
/// progress.
|
|
virtual void Start (uint32 threadCount,
|
const dng_point &tileSize,
|
dng_memory_allocator *allocator,
|
dng_abort_sniffer *sniffer);
|
|
/// Process one tile or partitioned area. Should not be overridden. Instead,
|
/// override ProcessArea, which is where to implement filter processing for a
|
/// specific type of dng_filter_task. There is no allocator parameter as all
|
/// allocation should be done in Start.
|
///
|
/// \param threadIndex 0 to threadCount - 1 index indicating which thread
|
/// this is. (Can be used to get a thread-specific buffer allocated in the
|
/// Start method.)
|
///
|
/// \param area Size of tiles to be used for sizing buffers, etc. (Edges of
|
/// processing can be smaller.)
|
///
|
/// \param sniffer dng_abort_sniffer to use to check for user cancellation
|
/// and progress updates.
|
|
virtual void Process (uint32 threadIndex,
|
const dng_rect &area,
|
dng_abort_sniffer *sniffer);
|
|
};
|
|
/*****************************************************************************/
|
|
#endif
|
|
/*****************************************************************************/
|