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