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