10b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 20b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener// Copyright 2008 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_bad_pixels.h#3 $ */ 100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $DateTime: 2012/07/11 10:36:56 $ */ 110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Change: 838485 $ */ 120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/* $Author: tknoll $ */ 130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/** \file 150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * Opcodes to fix defective pixels, including individual pixels and regions (such as 160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener * defective rows and columns). 170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener */ 180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#ifndef __dng_bad_pixels__ 220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#define __dng_bad_pixels__ 230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_memory.h" 270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include "dng_opcodes.h" 280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#include <vector> 300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to fix individual bad pixels that are marked with a constant 340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// value (e.g., 0) in a Bayer image. 350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_FixBadPixelsConstant: public dng_filter_opcode 370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 fConstant; 420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 fBayerPhase; 440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Construct an opcode to fix an individual bad pixels that are marked with 480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// a constant value in a Bayer image. 490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param constant The constant value that indicates a bad pixel. 500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param bayerPhase The phase of the Bayer mosaic pattern (0, 1, 2, 3). 510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_FixBadPixelsConstant (uint32 constant, 530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 bayerPhase); 540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_FixBadPixelsConstant (dng_stream &stream); 560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void PutData (dng_stream &stream) const; 580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual dng_point SrcRepeat (); 600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual dng_rect SrcArea (const dng_rect &dstArea, 620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds); 630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void Prepare (dng_negative &negative, 650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 threadCount, 660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point &tileSize, 670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds, 680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 imagePlanes, 690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 bufferPixelType, 700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_memory_allocator &allocator); 710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void ProcessArea (dng_negative &negative, 730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 threadIndex, 740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_pixel_buffer &srcBuffer, 750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_pixel_buffer &dstBuffer, 760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &dstArea, 770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds); 780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener protected: 800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#if defined(__clang__) && defined(__has_attribute) 820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#if __has_attribute(no_sanitize) 830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener__attribute__((no_sanitize("unsigned-integer-overflow"))) 840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif 850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif 860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool IsGreen (int32 row, int32 col) const 870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return (((uint32) row + (uint32) col + fBayerPhase + (fBayerPhase >> 1)) & 1) == 0; 890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief A list of bad pixels and rectangles (usually single rows or columns). 960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_bad_pixel_list 980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 1010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener enum 1030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener kNoIndex = 0xFFFFFFFF 1050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 1060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 1080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener // List of bad single pixels. 1100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_std_vector<dng_point> fBadPoints; 1120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener // List of bad rectangles (usually single rows or columns). 1140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_std_vector<dng_rect> fBadRects; 1160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 1180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Create an empty bad pixel list. 1200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_bad_pixel_list (); 1220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Returns the number of bad single pixels. 1240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 PointCount () const 1260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return (uint32) fBadPoints.size (); 1280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Retrieves the bad single pixel coordinate via the specified list index. 1310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// 1320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param index The list index from which to retrieve the bad single pixel 1330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// coordinate. 1340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point & Point (uint32 index) const 1360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fBadPoints [index]; 1380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Returns the number of bad rectangles. 1410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 RectCount () const 1430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return (uint32) fBadRects.size (); 1450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Retrieves the bad rectangle via the specified list index. 1480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// 1490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param index The list index from which to retrieve the bad rectangle 1500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// coordinates. 1510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect & Rect (uint32 index) const 1530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return fBadRects [index]; 1550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Returns true iff there are zero bad single pixels and zero bad 1580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// rectangles. 1590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool IsEmpty () const 1610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return PointCount () == 0 && 1630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener RectCount () == 0; 1640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Returns true iff there is at least one bad single pixel or at least one 1670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// bad rectangle. 1680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool NotEmpty () const 1700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 1710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return !IsEmpty (); 1720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 1730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Add the specified coordinate to the list of bad single pixels. 1750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// 1760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param pt The bad single pixel to add. 1770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener void AddPoint (const dng_point &pt); 1790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Add the specified rectangle to the list of bad rectangles. 1810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// 1820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param pt The bad rectangle to add. 1830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener void AddRect (const dng_rect &r); 1850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Sort the bad single pixels and bad rectangles by coordinates (top to 1870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// bottom, then left to right). 1880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener void Sort (); 1900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Returns true iff the specified bad single pixel is isolated, i.e., there 1920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// is no other bad single pixel or bad rectangle that lies within radius 1930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// pixels of this bad single pixel. 1940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// 1950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param index The index of the bad single pixel to test. 1960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param radius The pixel radius to test for isolation. 1970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 1980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool IsPointIsolated (uint32 index, 1990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 radius) const; 2000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Returns true iff the specified bad rectangle is isolated, i.e., there 2020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// is no other bad single pixel or bad rectangle that lies within radius 2030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// pixels of this bad rectangle. 2040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// 2050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param index The index of the bad rectangle to test. 2060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param radius The pixel radius to test for isolation. 2070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool IsRectIsolated (uint32 index, 2090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 radius) const; 2100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Returns true iff the specified point is valid, i.e., lies within the 2120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// specified image bounds, is different from all other bad single pixels, 2130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// and is not contained in any bad rectangle. The second and third 2140b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// conditions are only checked if provided with a starting search index. 2150b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// 2160b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param pt The point to test for validity. 2170b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param imageBounds The pt must lie within imageBounds to be valid. 2180b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \index The search index to use (or kNoIndex, to avoid a search) for 2190b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// checking for validity. 2200b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2210b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool IsPointValid (const dng_point &pt, 2220b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds, 2230b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 index = kNoIndex) const; 2240b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2250b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 2260b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2270b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 2280b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2290b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// \brief An opcode to fix lists of bad pixels (indicated by position) in a Bayer 2300b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/// image. 2310b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2320b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Krienerclass dng_opcode_FixBadPixelsList: public dng_filter_opcode 2330b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 2340b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2350b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener protected: 2360b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2370b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener enum 2380b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 2390b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener kBadPointPadding = 2, 2400b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener kBadRectPadding = 4 2410b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 2420b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2430b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener private: 2440b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2450b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener AutoPtr<dng_bad_pixel_list> fList; 2460b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2470b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 fBayerPhase; 2480b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2490b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener public: 2500b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2510b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// Construct an opcode to fix lists of bad pixels (indicated by position) in 2520b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// a Bayer image. 2530b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param list The list of bad pixels to fix. 2540b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener /// \param bayerPhase The phase of the Bayer mosaic pattern (0, 1, 2, 3). 2550b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2560b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_FixBadPixelsList (AutoPtr<dng_bad_pixel_list> &list, 2570b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 bayerPhase); 2580b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2590b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_opcode_FixBadPixelsList (dng_stream &stream); 2600b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2610b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void PutData (dng_stream &stream) const; 2620b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2630b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual dng_point SrcRepeat (); 2640b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2650b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual dng_rect SrcArea (const dng_rect &dstArea, 2660b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds); 2670b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2680b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void Prepare (dng_negative &negative, 2690b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 threadCount, 2700b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_point &tileSize, 2710b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds, 2720b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 imagePlanes, 2730b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 bufferPixelType, 2740b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_memory_allocator &allocator); 2750b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2760b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void ProcessArea (dng_negative &negative, 2770b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 threadIndex, 2780b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_pixel_buffer &srcBuffer, 2790b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_pixel_buffer &dstBuffer, 2800b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &dstArea, 2810b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds); 2820b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2830b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener protected: 2840b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2850b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener bool IsGreen (int32 row, int32 col) const 2860b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener { 2870b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener return ((row + col + fBayerPhase + (fBayerPhase >> 1)) & 1) == 0; 2880b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener } 2890b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2900b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void FixIsolatedPixel (dng_pixel_buffer &buffer, 2910b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener dng_point &badPoint); 2920b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2930b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void FixClusteredPixel (dng_pixel_buffer &buffer, 2940b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener uint32 pointIndex, 2950b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds); 2960b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 2970b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void FixSingleColumn (dng_pixel_buffer &buffer, 2980b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &badRect); 2990b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 3000b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void FixSingleRow (dng_pixel_buffer &buffer, 3010b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &badRect); 3020b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 3030b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener virtual void FixClusteredRect (dng_pixel_buffer &buffer, 3040b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &badRect, 3050b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener const dng_rect &imageBounds); 3060b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 3070b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener }; 3080b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 3090b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 3100b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 3110b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener#endif 3120b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener 3130b098b759cf9a2a8659babaf8c3b74e1b48ca604Florian Kriener/*****************************************************************************/ 314