/src/dng_sdk/source/dng_bad_pixels.h
Line | Count | Source |
1 | | /*****************************************************************************/ |
2 | | // Copyright 2008 Adobe Systems Incorporated |
3 | | // All Rights Reserved. |
4 | | // |
5 | | // NOTICE: Adobe permits you to use, modify, and distribute this file in |
6 | | // accordance with the terms of the Adobe license agreement accompanying it. |
7 | | /*****************************************************************************/ |
8 | | |
9 | | /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_bad_pixels.h#3 $ */ |
10 | | /* $DateTime: 2012/07/11 10:36:56 $ */ |
11 | | /* $Change: 838485 $ */ |
12 | | /* $Author: tknoll $ */ |
13 | | |
14 | | /** \file |
15 | | * Opcodes to fix defective pixels, including individual pixels and regions (such as |
16 | | * defective rows and columns). |
17 | | */ |
18 | | |
19 | | /*****************************************************************************/ |
20 | | |
21 | | #ifndef __dng_bad_pixels__ |
22 | | #define __dng_bad_pixels__ |
23 | | |
24 | | /*****************************************************************************/ |
25 | | |
26 | | #include "dng_memory.h" |
27 | | #include "dng_opcodes.h" |
28 | | |
29 | | #include <vector> |
30 | | |
31 | | /*****************************************************************************/ |
32 | | |
33 | | /// \brief An opcode to fix individual bad pixels that are marked with a constant |
34 | | /// value (e.g., 0) in a Bayer image. |
35 | | |
36 | | class dng_opcode_FixBadPixelsConstant: public dng_filter_opcode |
37 | | { |
38 | | |
39 | | private: |
40 | | |
41 | | uint32 fConstant; |
42 | | |
43 | | uint32 fBayerPhase; |
44 | | |
45 | | public: |
46 | | |
47 | | /// Construct an opcode to fix an individual bad pixels that are marked with |
48 | | /// a constant value in a Bayer image. |
49 | | /// \param constant The constant value that indicates a bad pixel. |
50 | | /// \param bayerPhase The phase of the Bayer mosaic pattern (0, 1, 2, 3). |
51 | | |
52 | | dng_opcode_FixBadPixelsConstant (uint32 constant, |
53 | | uint32 bayerPhase); |
54 | | |
55 | | dng_opcode_FixBadPixelsConstant (dng_stream &stream); |
56 | | |
57 | | virtual void PutData (dng_stream &stream) const; |
58 | | |
59 | | virtual dng_point SrcRepeat (); |
60 | | |
61 | | virtual dng_rect SrcArea (const dng_rect &dstArea, |
62 | | const dng_rect &imageBounds); |
63 | | |
64 | | virtual void Prepare (dng_negative &negative, |
65 | | uint32 threadCount, |
66 | | const dng_point &tileSize, |
67 | | const dng_rect &imageBounds, |
68 | | uint32 imagePlanes, |
69 | | uint32 bufferPixelType, |
70 | | dng_memory_allocator &allocator); |
71 | | |
72 | | virtual void ProcessArea (dng_negative &negative, |
73 | | uint32 threadIndex, |
74 | | dng_pixel_buffer &srcBuffer, |
75 | | dng_pixel_buffer &dstBuffer, |
76 | | const dng_rect &dstArea, |
77 | | const dng_rect &imageBounds); |
78 | | |
79 | | protected: |
80 | | |
81 | | #if defined(__clang__) && defined(__has_attribute) |
82 | | #if __has_attribute(no_sanitize) |
83 | | __attribute__((no_sanitize("unsigned-integer-overflow"))) |
84 | | #endif |
85 | | #endif |
86 | | bool IsGreen (int32 row, int32 col) const |
87 | 0 | { |
88 | 0 | return (((uint32) row + (uint32) col + fBayerPhase + (fBayerPhase >> 1)) & 1) == 0; |
89 | 0 | } |
90 | | |
91 | | }; |
92 | | |
93 | | /*****************************************************************************/ |
94 | | |
95 | | /// \brief A list of bad pixels and rectangles (usually single rows or columns). |
96 | | |
97 | | class dng_bad_pixel_list |
98 | | { |
99 | | |
100 | | public: |
101 | | |
102 | | enum |
103 | | { |
104 | | kNoIndex = 0xFFFFFFFF |
105 | | }; |
106 | | |
107 | | private: |
108 | | |
109 | | // List of bad single pixels. |
110 | | |
111 | | dng_std_vector<dng_point> fBadPoints; |
112 | | |
113 | | // List of bad rectangles (usually single rows or columns). |
114 | | |
115 | | dng_std_vector<dng_rect> fBadRects; |
116 | | |
117 | | public: |
118 | | |
119 | | /// Create an empty bad pixel list. |
120 | | |
121 | | dng_bad_pixel_list (); |
122 | | |
123 | | /// Returns the number of bad single pixels. |
124 | | |
125 | | uint32 PointCount () const |
126 | 4.45k | { |
127 | 4.45k | return (uint32) fBadPoints.size (); |
128 | 4.45k | } |
129 | | |
130 | | /// Retrieves the bad single pixel coordinate via the specified list index. |
131 | | /// |
132 | | /// \param index The list index from which to retrieve the bad single pixel |
133 | | /// coordinate. |
134 | | |
135 | | const dng_point & Point (uint32 index) const |
136 | 0 | { |
137 | 0 | return fBadPoints [index]; |
138 | 0 | } |
139 | | |
140 | | /// Returns the number of bad rectangles. |
141 | | |
142 | | uint32 RectCount () const |
143 | 4.45k | { |
144 | 4.45k | return (uint32) fBadRects.size (); |
145 | 4.45k | } |
146 | | |
147 | | /// Retrieves the bad rectangle via the specified list index. |
148 | | /// |
149 | | /// \param index The list index from which to retrieve the bad rectangle |
150 | | /// coordinates. |
151 | | |
152 | | const dng_rect & Rect (uint32 index) const |
153 | 0 | { |
154 | 0 | return fBadRects [index]; |
155 | 0 | } |
156 | | |
157 | | /// Returns true iff there are zero bad single pixels and zero bad |
158 | | /// rectangles. |
159 | | |
160 | | bool IsEmpty () const |
161 | 0 | { |
162 | 0 | return PointCount () == 0 && |
163 | 0 | RectCount () == 0; |
164 | 0 | } |
165 | | |
166 | | /// Returns true iff there is at least one bad single pixel or at least one |
167 | | /// bad rectangle. |
168 | | |
169 | | bool NotEmpty () const |
170 | 0 | { |
171 | 0 | return !IsEmpty (); |
172 | 0 | } |
173 | | |
174 | | /// Add the specified coordinate to the list of bad single pixels. |
175 | | /// |
176 | | /// \param pt The bad single pixel to add. |
177 | | |
178 | | void AddPoint (const dng_point &pt); |
179 | | |
180 | | /// Add the specified rectangle to the list of bad rectangles. |
181 | | /// |
182 | | /// \param pt The bad rectangle to add. |
183 | | |
184 | | void AddRect (const dng_rect &r); |
185 | | |
186 | | /// Sort the bad single pixels and bad rectangles by coordinates (top to |
187 | | /// bottom, then left to right). |
188 | | |
189 | | void Sort (); |
190 | | |
191 | | /// Returns true iff the specified bad single pixel is isolated, i.e., there |
192 | | /// is no other bad single pixel or bad rectangle that lies within radius |
193 | | /// pixels of this bad single pixel. |
194 | | /// |
195 | | /// \param index The index of the bad single pixel to test. |
196 | | /// \param radius The pixel radius to test for isolation. |
197 | | |
198 | | bool IsPointIsolated (uint32 index, |
199 | | uint32 radius) const; |
200 | | |
201 | | /// Returns true iff the specified bad rectangle is isolated, i.e., there |
202 | | /// is no other bad single pixel or bad rectangle that lies within radius |
203 | | /// pixels of this bad rectangle. |
204 | | /// |
205 | | /// \param index The index of the bad rectangle to test. |
206 | | /// \param radius The pixel radius to test for isolation. |
207 | | |
208 | | bool IsRectIsolated (uint32 index, |
209 | | uint32 radius) const; |
210 | | |
211 | | /// Returns true iff the specified point is valid, i.e., lies within the |
212 | | /// specified image bounds, is different from all other bad single pixels, |
213 | | /// and is not contained in any bad rectangle. The second and third |
214 | | /// conditions are only checked if provided with a starting search index. |
215 | | /// |
216 | | /// \param pt The point to test for validity. |
217 | | /// \param imageBounds The pt must lie within imageBounds to be valid. |
218 | | /// \index The search index to use (or kNoIndex, to avoid a search) for |
219 | | /// checking for validity. |
220 | | |
221 | | bool IsPointValid (const dng_point &pt, |
222 | | const dng_rect &imageBounds, |
223 | | uint32 index = kNoIndex) const; |
224 | | |
225 | | }; |
226 | | |
227 | | /*****************************************************************************/ |
228 | | |
229 | | /// \brief An opcode to fix lists of bad pixels (indicated by position) in a Bayer |
230 | | /// image. |
231 | | |
232 | | class dng_opcode_FixBadPixelsList: public dng_filter_opcode |
233 | | { |
234 | | |
235 | | protected: |
236 | | |
237 | | enum |
238 | | { |
239 | | kBadPointPadding = 2, |
240 | | kBadRectPadding = 4 |
241 | | }; |
242 | | |
243 | | private: |
244 | | |
245 | | AutoPtr<dng_bad_pixel_list> fList; |
246 | | |
247 | | uint32 fBayerPhase; |
248 | | |
249 | | public: |
250 | | |
251 | | /// Construct an opcode to fix lists of bad pixels (indicated by position) in |
252 | | /// a Bayer image. |
253 | | /// \param list The list of bad pixels to fix. |
254 | | /// \param bayerPhase The phase of the Bayer mosaic pattern (0, 1, 2, 3). |
255 | | |
256 | | dng_opcode_FixBadPixelsList (AutoPtr<dng_bad_pixel_list> &list, |
257 | | uint32 bayerPhase); |
258 | | |
259 | | dng_opcode_FixBadPixelsList (dng_stream &stream); |
260 | | |
261 | | virtual void PutData (dng_stream &stream) const; |
262 | | |
263 | | virtual dng_point SrcRepeat (); |
264 | | |
265 | | virtual dng_rect SrcArea (const dng_rect &dstArea, |
266 | | const dng_rect &imageBounds); |
267 | | |
268 | | virtual void Prepare (dng_negative &negative, |
269 | | uint32 threadCount, |
270 | | const dng_point &tileSize, |
271 | | const dng_rect &imageBounds, |
272 | | uint32 imagePlanes, |
273 | | uint32 bufferPixelType, |
274 | | dng_memory_allocator &allocator); |
275 | | |
276 | | virtual void ProcessArea (dng_negative &negative, |
277 | | uint32 threadIndex, |
278 | | dng_pixel_buffer &srcBuffer, |
279 | | dng_pixel_buffer &dstBuffer, |
280 | | const dng_rect &dstArea, |
281 | | const dng_rect &imageBounds); |
282 | | |
283 | | protected: |
284 | | |
285 | | bool IsGreen (int32 row, int32 col) const |
286 | 0 | { |
287 | 0 | return ((row + col + fBayerPhase + (fBayerPhase >> 1)) & 1) == 0; |
288 | 0 | } |
289 | | |
290 | | virtual void FixIsolatedPixel (dng_pixel_buffer &buffer, |
291 | | dng_point &badPoint); |
292 | | |
293 | | virtual void FixClusteredPixel (dng_pixel_buffer &buffer, |
294 | | uint32 pointIndex, |
295 | | const dng_rect &imageBounds); |
296 | | |
297 | | virtual void FixSingleColumn (dng_pixel_buffer &buffer, |
298 | | const dng_rect &badRect); |
299 | | |
300 | | virtual void FixSingleRow (dng_pixel_buffer &buffer, |
301 | | const dng_rect &badRect); |
302 | | |
303 | | virtual void FixClusteredRect (dng_pixel_buffer &buffer, |
304 | | const dng_rect &badRect, |
305 | | const dng_rect &imageBounds); |
306 | | |
307 | | }; |
308 | | |
309 | | /*****************************************************************************/ |
310 | | |
311 | | #endif |
312 | | |
313 | | /*****************************************************************************/ |