10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2006 Adobe Systems Incorporated
30b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// All Rights Reserved.
40b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener//
50b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// NOTICE:  Adobe permits you to use, modify, and distribute this file in
60b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// accordance with the terms of the Adobe license agreement accompanying it.
70b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
80b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
90b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_filter_task.h#2 $ */
100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/07/11 10:36:56 $ */
110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 838485 $ */
120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */
130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file
150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * Specialization of dng_area_task for processing an area from one dng_image to an
160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * area of another.
170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */
180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_filter_task__
220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_filter_task__
230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_area_task.h"
270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_auto_ptr.h"
280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_point.h"
290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_rect.h"
300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_sdk_limits.h"
310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief Represents a task which filters an area of a source dng_image to an area
350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// of a destination dng_image.
360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_filter_task: public dng_area_task
380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	{
390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	protected:
410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		const dng_image &fSrcImage;
430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_image &fDstImage;
450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSrcPlane;
470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSrcPlanes;
480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fSrcPixelType;
490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fDstPlane;
510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fDstPlanes;
520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		uint32 fDstPixelType;
530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point fSrcRepeat;
550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_point fSrcTileSize;
560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fSrcBuffer [kMaxMPThreads];
580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		AutoPtr<dng_memory_block> fDstBuffer [kMaxMPThreads];
590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	public:
610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Construct a filter task given a source and destination images.
630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param srcImage Image from which source pixels are read.
640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param dstImage Image to which result pixels are written.
650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		dng_filter_task (const dng_image &srcImage,
670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener						 dng_image &dstImage);
680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual ~dng_filter_task ();
700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Compute the source area needed for a given destination area. Default
720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// implementation assumes destination area is equal to source area for all
730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// cases.
740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param dstArea Area to for which pixels will be computed.
760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \retval The source area needed as input to calculate the requested
780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// destination area.
790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_rect SrcArea (const dng_rect &dstArea)
810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return dstArea;
830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Given a destination tile size, calculate input tile size. Simlar to
860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// SrcArea, and should seldom be overridden.
870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param dstTileSize The destination tile size that is targeted for output.
890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \retval The source tile size needed to compute a tile of the destination
910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// size.
920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual dng_point SrcTileSize (const dng_point &dstTileSize)
940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			{
950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			return SrcArea (dng_rect (dstTileSize)).Size ();
960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener			}
970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Implements filtering operation from one buffer to another. Source and
990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// destination pixels are set up in member fields of this class. Ideally, no
1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// allocation should be done in this routine.
1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param threadIndex The thread on which this routine is being called,
1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// between 0 and threadCount - 1 for the threadCount passed to Start method.
1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param srcBuffer Input area and source pixels.
1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param dstBuffer Output area and destination pixels.
1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void ProcessArea (uint32 threadIndex,
1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &srcBuffer,
1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener								  dng_pixel_buffer &dstBuffer) = 0;
1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Called prior to processing on specific threads. Can be used to allocate
1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// per-thread memory buffers, etc.
1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param threadCount Total number of threads that will be used for
1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// processing. Less than or equal to MaxThreads of dng_area_task.
1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param tileSize Size of source tiles which will be processed. (Not all
1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// tiles will be this size due to edge conditions.)
1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param allocator dng_memory_allocator to use for allocating temporary
1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// buffers, etc.
1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param sniffer Sniffer to test for user cancellation and to set up
1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// progress.
1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Start (uint32 threadCount,
1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							const dng_point &tileSize,
1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							dng_memory_allocator *allocator,
1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							dng_abort_sniffer *sniffer);
1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Process one tile or partitioned area. Should not be overridden. Instead,
1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// override ProcessArea, which is where to implement filter processing for a
1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// specific type of dng_filter_task. There is no allocator parameter as all
1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// allocation should be done in Start.
1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param threadIndex 0 to threadCount - 1 index indicating which thread
1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// this is. (Can be used to get a thread-specific buffer allocated in the
1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// Start method.)
1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param area Size of tiles to be used for sizing buffers, etc. (Edges of
1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// processing can be smaller.)
1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		///
1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// \param sniffer dng_abort_sniffer to use to check for user cancellation
1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		/// and progress updates.
1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener		virtual void Process (uint32 threadIndex,
1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							  const dng_rect &area,
1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener							  dng_abort_sniffer *sniffer);
1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener	};
1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif
1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener
1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/
159