22 #include <libopenraw/cameraids.h>
24 #include "rawdata.hpp"
26 #include "ifdfilecontainer.hpp"
28 #include "peffile.hpp"
29 #include "rawfile_private.hpp"
31 using namespace Debug;
36 #define OR_MAKE_PENTAX_TYPEID(camid) \
37 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,camid)
38 #define OR_MAKE_RICOH_TYPEID(camid) \
39 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_RICOH,camid)
42 { 0x12994, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_D_PEF) },
43 { 0x12aa2, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DS_PEF) },
44 { 0x12b1a, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL_PEF) },
46 { 0x12b7e, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL2_PEF) },
47 { 0x12b9c, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_PEF) },
48 { 0x12b9d, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K110D_PEF) },
49 { 0x12ba2, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_SUPER_PEF) },
50 { 0x12c1e, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K10D_PEF) },
51 { 0x12cd2, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K20D_PEF) },
52 { 0x12cfa, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K200D_PEF) },
53 { 0x12d72, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K2000_PEF) },
54 { 0x12d73, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KM_PEF) },
55 { 0x12db8, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K7_PEF) },
56 { 0x12dfe, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KX_PEF) },
57 { 0x12e08, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_645D_PEF) },
58 { 0x12e6c, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KR_PEF) },
59 { 0x12e76, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_PEF) },
64 { 0x12f70, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_II_PEF) },
65 { 0x12f71, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_IIS_PEF) },
68 { 0x12fc0, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_PEF) },
70 { 0x13010, OR_MAKE_RICOH_TYPEID(OR_TYPEID_PENTAX_645Z_PEF) },
71 { 0x1301a, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS1_PEF) },
72 { 0x13024, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS2_PEF) },
74 { 0x13092, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_PEF) },
75 { 0x1309c, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_II_PEF) },
77 { 0x13222, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K70_PEF) },
78 { 0x1322c, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KP_PEF) },
79 { 0x13240, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_MKII_PEF) },
80 { 0x13254, OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_MKIII_PEF) },
84 static const BuiltinColourMatrix s_matrices[] = {
85 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_D_PEF),
88 { 9651, -2059, -1189, -8881, 16512, 2487, -1460, 1345, 10687 } },
89 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL_PEF),
92 { 10829, -2838, -1115, -8339, 15817, 2696, -837, 680, 11939 } },
93 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL2_PEF),
96 { 10504, -2439, -1189, -8603, 16208, 2531, -1022, 863, 12242 } },
97 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DS_PEF),
100 { 10371, -2333, -1206, -8688, 16231, 2602, -1230, 1116, 11282 } },
101 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K10D_PEF),
104 { 9566, -2863, -803, -7170, 15172, 2112, -818, 803, 9705 } },
105 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_PEF),
108 { 8566, -2746, -1201, -3612, 12204, 1550, -893, 1680, 6264 } },
109 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_MKII_PEF),
112 { 8596, -2981, -639, -4202, 12046, 2431, -685, 1424, 6122 } },
113 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_PEF),
116 { 11095, -3157, -1324, -8377, 15834, 2720, -1108, 947, 11688 } },
117 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_SUPER_PEF),
120 { 11095, -3157, -1324, -8377, 15834, 2720, -1108, 947, 11688 } },
121 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K110D_PEF),
124 { 11095, -3157, -1324, -8377, 15834, 2720, -1108, 947, 11688 } },
125 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K20D_PEF),
128 { 9427, -2714, -868, -7493, 16092, 1373, -2199, 3264, 7180 } },
129 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K200D_PEF),
132 { 9186, -2678, -907, -8693, 16517, 2260, -1129, 1094, 8524 } },
133 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K2000_PEF),
136 { 9730, -2989, -970, -8527, 16258, 2381, -1060, 970, 8362 } },
137 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KR_PEF),
140 { 9895, -3077, -850, -5304, 13035, 2521, -883, 1768, 6936 } },
141 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_PEF),
144 { 8542, -2581, -1144, -3995, 12301, 1881, -863, 1514, 5755 } },
145 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_II_PEF),
148 { 9251, -3817, -1069, -4627, 12667, 2175, -798, 1660, 5633 } },
149 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_MKIII_PEF),
152 { 8571, -2590, -1148, -3995, 12301, 1881, -1052, 1844, 7013 } },
153 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_PEF),
156 { 8713, -2833, -743, -4342, 11900, 2772, -722, 1543, 6247 } },
157 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_II_PEF),
160 { 8435, -2549, -1130, -3995, 12301, 1881, -989, 1734, 6591 } },
161 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_IIS_PEF),
164 { 8170, -2725, -639, -4440, 12017, 2744, -771, 1465, 6599 } },
165 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K7_PEF),
168 { 9142, -2947, -678, -8648, 16967, 1663, -2224, 2898, 8615 } },
169 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K70_PEF),
172 { 8766, -3149, -747, -3976, 11943, 2292, -517, 1259, 5552 } },
173 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KM_PEF),
176 { 9730, -2989, -970, -8527, 16258, 2381, -1060, 970, 8362 } },
177 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KX_PEF),
180 { 8843, -2837, -625, -5025, 12644, 2668, -411, 1234, 7410 } },
181 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS1_PEF),
184 { 7989, -2511, -1137, -3882, 12350, 1689, -862, 1524, 6444 } },
185 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS2_PEF),
188 { 8662, -3280, -798, -3928, 11771, 2444, -586, 1232, 6054 } },
189 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KP_PEF),
192 { 8617, -3228, -1034, -4674, 12821, 2044, -803, 1577, 5728 } },
193 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_645D_PEF),
196 { 10646, -3593, -1158, -3329, 11699, 1831, -667, 2874, 6287 } },
197 { OR_MAKE_RICOH_TYPEID(OR_TYPEID_PENTAX_645Z_PEF),
200 { 9519, -3591, -664, -4074, 11725, 2671, -624, 1501, 6653 } },
202 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
206 {
"PENTAX *ist D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_D_PEF) },
207 {
"PENTAX *ist DL ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL_PEF) },
208 {
"PENTAX *ist DL2 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL2_PEF) },
209 {
"PENTAX *ist DS ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DS_PEF) },
210 {
"PENTAX K10D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K10D_PEF) },
211 {
"PENTAX K100D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_PEF) },
212 {
"PENTAX K100D Super ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_SUPER_PEF) },
213 {
"PENTAX K110D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K110D_PEF) },
214 {
"PENTAX K20D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K20D_PEF) },
215 {
"PENTAX K200D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K200D_PEF) },
216 {
"PENTAX K2000 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K2000_PEF) },
217 {
"PENTAX K-1 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_PEF) },
218 {
"PENTAX K-1 Mark II ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_MKII_PEF) },
219 {
"PENTAX K-r ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KR_PEF) },
220 {
"PENTAX K-3 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_PEF) },
221 {
"PENTAX K-3 II ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_II_PEF) },
222 {
"PENTAX K-3 Mark III ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K3_MKIII_PEF) },
223 {
"PENTAX K-5 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_PEF) },
224 {
"PENTAX K-5 II ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_II_PEF) },
225 {
"PENTAX K-5 II s ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_IIS_PEF) },
226 {
"PENTAX K-7 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K7_PEF) },
227 {
"PENTAX K-70 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K70_PEF) },
228 {
"PENTAX K-S1 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS1_PEF) },
229 {
"PENTAX K-S2 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS2_PEF) },
230 {
"PENTAX K-m ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KM_PEF) },
231 {
"PENTAX K-x ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KX_PEF) },
232 {
"PENTAX KP ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KP_PEF) },
233 {
"PENTAX 645D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_645D_PEF) },
234 {
"PENTAX 645Z ", OR_MAKE_RICOH_TYPEID(OR_TYPEID_PENTAX_645Z_PEF) },
248 _setMatrices(s_matrices);
260 auto e = makerNote->getEntry(MNOTE_PENTAX_PREVIEW_IMAGE_SIZE);
262 auto w = makerNote->getEntryValue<uint16_t>(*e, 0);
263 auto h = makerNote->getEntryValue<uint16_t>(*e, 1);
264 auto dim = std::max(w, h);
267 auto offset = makerNote->getIntegerValue(MNOTE_PENTAX_PREVIEW_IMAGE_START).value_or(0);
269 offset += makerNote->getMnoteOffset();
271 auto length = makerNote->getIntegerValue(MNOTE_PENTAX_PREVIEW_IMAGE_LENGTH).value_or(0);
272 if (offset != 0 && length != 0) {
290 index = IFD::MNOTE_PENTAX_MODEL_ID;
291 model_map = &modelid_map;
304 auto offset = mnote->getEntry(MNOTE_PENTAX_IMAGEAREAOFFSET);
306 auto x = mnote->getEntryValue<uint16_t>(*offset, 0);
307 auto y = mnote->getEntryValue<uint16_t>(*offset, 1);
308 auto image_size = mnote->getEntry(MNOTE_PENTAX_RAWIMAGESIZE);
310 auto w = mnote->getEntryValue<uint16_t>(*image_size, 0);
311 auto h = mnote->getEntryValue<uint16_t>(*image_size, 1);
312 data.setActiveArea(x, y, w, h);
316 auto white_level = mnote->getIntegerValue(MNOTE_PENTAX_WHITELEVEL);
318 data.setWhiteLevel(white_level.value());
321 uint16_t compression = data.compression();
322 switch(compression) {
334 auto p = data.data();
335 uint16_t* pixels = (uint16_t*)p;
336 for (
size_t i = 0; i < data.
size() / 2; i++) {
337 *pixels = be16toh(*pixels);
size_t size() const
Get the size of the data.
std::shared_ptr< Stream > Ptr
std::shared_ptr< IfdDir > Ref
Shared ptr of an IfdDir.
virtual ::or_error _enumThumbnailSizes(std::vector< uint32_t > &list) override
List the thumbnails in the IFD.
::or_error _getRawDataFromDir(RawData &data, const IfdDir::Ref &dir)
Load the compressed raw data from a standard location in an IFD.
Represent camera raw data.
Internals::MakerNoteDir::Ref makerNoteIfd()
Get the MakerNote IFD.
Internals::IfdDir::Ref cfaIfd()
Get the IFD containing the CFA.
or_error
Error codes returned by libopenraw.
@ OR_OPTIONS_DONT_DECOMPRESS
std::map< uint32_t, ::or_rawfile_typeid > ModelIdMap
Global namespace for libopenraw.
virtual ::or_error _getRawData(RawData &data, uint32_t options) override
Get the RAW data.
virtual bool vendorCameraIdLocation(Internals::IfdDir::Ref &ifd, uint16_t &index, const Internals::ModelIdMap *&model_map) override
Get the vendor camera ID location.
virtual ::or_error _enumThumbnailSizes(std::vector< uint32_t > &list) override
List the thumbnails in the IFD.