1/*****************************************************************************/
2// Copyright 2006-2007 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_mosaic_info.h#1 $ */
10/* $DateTime: 2012/05/30 13:28:51 $ */
11/* $Change: 832332 $ */
12/* $Author: tknoll $ */
13
14/** \file
15 * Support for descriptive information about color filter array patterns.
16 */
17
18/*****************************************************************************/
19
20#ifndef __dng_mosaic_info__
21#define __dng_mosaic_info__
22
23/*****************************************************************************/
24
25#include "dng_classes.h"
26#include "dng_rect.h"
27#include "dng_sdk_limits.h"
28#include "dng_types.h"
29
30/*****************************************************************************/
31
32/// \brief Support for describing color filter array patterns and manipulating mosaic sample data.
33///
34/// See CFAPattern tag in \ref spec_tiff_ep "TIFF/EP specification" and CFAPlaneColor, CFALayout, and BayerGreenSplit
35/// tags in the \ref spec_dng "DNG 1.1.0 specification".
36
37class dng_mosaic_info
38 {
39
40 public:
41
42 /// Size of fCFAPattern.
43
44 dng_point fCFAPatternSize;
45
46 /// CFA pattern from CFAPattern tag in the \ref spec_tiff_ep "TIFF/EP specification."
47
48 uint8 fCFAPattern [kMaxCFAPattern] [kMaxCFAPattern];
49
50 /// Number of color planes in DNG input.
51
52 uint32 fColorPlanes;
53
54 uint8 fCFAPlaneColor [kMaxColorPlanes];
55
56 /// Value of CFALayout tag in the \ref spec_dng "DNG 1.3 specification."
57 /// CFALayout describes the spatial layout of the CFA. The currently defined values are:
58 /// - 1 = Rectangular (or square) layout.
59 /// - 2 = Staggered layout A: even columns are offset down by 1/2 row.
60 /// - 3 = Staggered layout B: even columns are offset up by 1/2 row.
61 /// - 4 = Staggered layout C: even rows are offset right by 1/2 column.
62 /// - 5 = Staggered layout D: even rows are offset left by 1/2 column.
63 /// - 6 = Staggered layout E: even rows are offset up by 1/2 row, even columns are offset left by 1/2 column.
64 /// - 7 = Staggered layout F: even rows are offset up by 1/2 row, even columns are offset right by 1/2 column.
65 /// - 8 = Staggered layout G: even rows are offset down by 1/2 row, even columns are offset left by 1/2 column.
66 /// - 9 = Staggered layout H: even rows are offset down by 1/2 row, even columns are offset right by 1/2 column.
67
68 uint32 fCFALayout;
69
70 /// Value of BayerGreeSplit tag in DNG file.
71 /// BayerGreenSplit only applies to CFA images using a Bayer pattern filter array. This tag
72 /// specifies, in arbitrary units, how closely the values of the green pixels in the blue/green rows
73 /// track the values of the green pixels in the red/green rows.
74 ///
75 /// A value of zero means the two kinds of green pixels track closely, while a non-zero value
76 /// means they sometimes diverge. The useful range for this tag is from 0 (no divergence) to about
77 /// 5000 (large divergence).
78
79 uint32 fBayerGreenSplit;
80
81 protected:
82
83 dng_point fSrcSize;
84
85 dng_point fCroppedSize;
86
87 real64 fAspectRatio;
88
89 public:
90
91 dng_mosaic_info ();
92
93 virtual ~dng_mosaic_info ();
94
95 virtual void Parse (dng_host &host,
96 dng_stream &stream,
97 dng_info &info);
98
99 virtual void PostParse (dng_host &host,
100 dng_negative &negative);
101
102 /// Returns whether the RAW data in this DNG file from a color filter array (mosaiced) source.
103 /// \retval true if this DNG file is from a color filter array (mosiaced) source.
104
105 bool IsColorFilterArray () const
106 {
107 return fCFAPatternSize != dng_point (0, 0);
108 }
109
110 /// Enable generating four-plane output from three-plane Bayer input.
111 /// Extra plane is a second version of the green channel. First green is produced
112 /// using green mosaic samples from one set of rows/columns (even/odd) and the second
113 /// green channel is produced using the other set of rows/columns. One can compare the
114 /// two versions to judge whether BayerGreenSplit needs to be set for a given input source.
115
116 virtual bool SetFourColorBayer ();
117
118 /// Returns scaling factor relative to input size needed to capture output data.
119 /// Staggered (or rotated) sensing arrays are produced to a larger output than the number of input samples.
120 /// This method indicates how much larger.
121 /// \retval a point with integer scaling factors for the horizotal and vertical dimensions.
122
123 virtual dng_point FullScale () const;
124
125 /// Returns integer factors by which mosaic data must be downsampled to produce an image which is as close
126 /// to prefSize as possible in longer dimension, but no smaller than minSize.
127 /// \param minSize Number of pixels as minium for longer dimension of downsampled image.
128 /// \param prefSize Number of pixels as target for longer dimension of downsampled image.
129 /// \param cropFactor Faction of the image to be used after cropping.
130 /// \retval Point containing integer factors by which image must be downsampled.
131
132 virtual dng_point DownScale (uint32 minSize,
133 uint32 prefSize,
134 real64 cropFactor) const;
135
136 /// Return size of demosaiced image for passed in downscaling factor.
137 /// \param downScale Integer downsampling factor obtained from DownScale method.
138 /// \retval Size of resulting demosaiced image.
139
140 virtual dng_point DstSize (const dng_point &downScale) const;
141
142 /// Demosaic interpolation of a single plane for non-downsampled case.
143 /// \param host dng_host to use for buffer allocation requests, user cancellation testing, and progress updates.
144 /// \param negative DNG negative of mosaiced data.
145 /// \param srcImage Source image for mosaiced data.
146 /// \param dstImage Destination image for resulting interpolated data.
147 /// \param srcPlane Which plane to interpolate.
148
149 virtual void InterpolateGeneric (dng_host &host,
150 dng_negative &negative,
151 const dng_image &srcImage,
152 dng_image &dstImage,
153 uint32 srcPlane = 0) const;
154
155 /// Demosaic interpolation of a single plane for downsampled case.
156 /// \param host dng_host to use for buffer allocation requests, user cancellation testing, and progress updates.
157 /// \param negative DNG negative of mosaiced data.
158 /// \param srcImage Source image for mosaiced data.
159 /// \param dstImage Destination image for resulting interpolated data.
160 /// \param downScale Amount (in horizontal and vertical) by which to subsample image.
161 /// \param srcPlane Which plane to interpolate.
162
163 virtual void InterpolateFast (dng_host &host,
164 dng_negative &negative,
165 const dng_image &srcImage,
166 dng_image &dstImage,
167 const dng_point &downScale,
168 uint32 srcPlane = 0) const;
169
170 /// Demosaic interpolation of a single plane. Chooses between generic and fast interpolators based on parameters.
171 /// \param host dng_host to use for buffer allocation requests, user cancellation testing, and progress updates.
172 /// \param negative DNG negative of mosaiced data.
173 /// \param srcImage Source image for mosaiced data.
174 /// \param dstImage Destination image for resulting interpolated data.
175 /// \param downScale Amount (in horizontal and vertical) by which to subsample image.
176 /// \param srcPlane Which plane to interpolate.
177
178 virtual void Interpolate (dng_host &host,
179 dng_negative &negative,
180 const dng_image &srcImage,
181 dng_image &dstImage,
182 const dng_point &downScale,
183 uint32 srcPlane = 0) const;
184
185 protected:
186
187 virtual bool IsSafeDownScale (const dng_point &downScale) const;
188
189 uint32 SizeForDownScale (const dng_point &downScale) const;
190
191 virtual bool ValidSizeDownScale (const dng_point &downScale,
192 uint32 minSize) const;
193
194 };
195
196/*****************************************************************************/
197
198#endif
199
200/*****************************************************************************/
201