libopenraw
peffile.cpp
1/*
2 * libopenraw - peffile.cpp
3 *
4 * Copyright (C) 2006-2017 Hubert Figuiere
5 *
6 * This library is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation, either version 3 of
9 * the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library. If not, see
18 * <http://www.gnu.org/licenses/>.
19 */
20
21
22#include <libopenraw/cameraids.h>
23
24#include "rawdata.hpp"
25#include "ifd.hpp"
26#include "ifdfilecontainer.hpp"
27#include "ifddir.hpp"
28#include "peffile.hpp"
29#include "rawfile_private.hpp"
30
31using namespace Debug;
32
33namespace OpenRaw {
34namespace Internals {
35
36#define OR_MAKE_PENTAX_TYPEID(camid) \
37 OR_MAKE_FILE_TYPEID(OR_TYPEID_VENDOR_PENTAX,camid)
38
39/* taken from dcraw, by default */
40static const BuiltinColourMatrix s_matrices[] = {
41 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_D_PEF),
42 0,
43 0,
44 { 9651, -2059, -1189, -8881, 16512, 2487, -1460, 1345, 10687 } },
45 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL_PEF),
46 0,
47 0,
48 { 10829, -2838, -1115, -8339, 15817, 2696, -837, 680, 11939 } },
49 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DS_PEF),
50 0,
51 0,
52 { 10371, -2333, -1206, -8688, 16231, 2602, -1230, 1116, 11282 } },
53 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K10D_PEF),
54 0,
55 0,
56 { 9566, -2863, -803, -7170, 15172, 2112, -818, 803, 9705 } },
57 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_PEF),
58 0,
59 0,
60 { 8566, -2746, -1201, -3612, 12204, 1550, -893, 1680, 6264 } },
61 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_PEF),
62 0,
63 0,
64 { 11095, -3157, -1324, -8377, 15834, 2720, -1108, 947, 11688 } },
65 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_PEF),
66 0,
67 0,
68 { 11095, -3157, -1324, -8377, 15834, 2720, -1108, 947, 11688 } },
69 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K20D_PEF),
70 0,
71 0,
72 { 9427, -2714, -868, -7493, 16092, 1373, -2199, 3264, 7180 } },
73 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K200D_PEF),
74 0,
75 0,
76 { 9186, -2678, -907, -8693, 16517, 2260, -1129, 1094, 8524 } },
77 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KR_PEF),
78 0,
79 0,
80 { 9895, -3077, -850, -5304, 13035, 2521, -883, 1768, 6936 } },
81 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_PEF),
82 0,
83 0,
84 { 8713, -2833, -743, -4342, 11900, 2772, -722, 1543, 6247 } },
85 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_IIS_PEF),
86 0,
87 0,
88 { 8170, -2725, -639, -4440, 12017, 2744, -771, 1465, 6599 } },
89 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K7_PEF),
90 0,
91 0,
92 { 9142, -2947, -678, -8648, 16967, 1663, -2224, 2898, 8615 } },
93 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KX_PEF),
94 0,
95 0,
96 { 8843, -2837, -625, -5025, 12644, 2668, -411, 1234, 7410 } },
97 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS2_PEF),
98 0,
99 0,
100 { 8662, -3280, -798, -3928, 11771, 2444, -586, 1232, 6054 } },
101 { OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_645D_PEF),
102 0,
103 0x3e00,
104 { 10646, -3593, -1158, -3329, 11699, 1831, -667, 2874, 6287 } },
105
106 { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
107};
108
109const struct IfdFile::camera_ids_t PEFFile::s_def[] = {
110 { "PENTAX *ist D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_D_PEF) },
111 { "PENTAX *ist DL ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DL_PEF) },
112 { "PENTAX *ist DS ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_IST_DS_PEF) },
113 { "PENTAX K10D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K10D_PEF) },
114 { "PENTAX K100D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_PEF) },
115 { "PENTAX K100D Super ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K100D_PEF) },
116 { "PENTAX K20D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K20D_PEF) },
117 { "PENTAX K200D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K200D_PEF) },
118 { "PENTAX K-1 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K1_PEF) },
119 { "PENTAX K-r ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KR_PEF) },
120 { "PENTAX K-5 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_PEF) },
121 { "PENTAX K-5 II s ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K5_IIS_PEF) },
122 { "PENTAX K-7 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K7_PEF) },
123 { "PENTAX K-70 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_K70_PEF) },
124 { "PENTAX K-S2 ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KS2_PEF) },
125 { "PENTAX K-x ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_KX_PEF) },
126 { "PENTAX 645D ", OR_MAKE_PENTAX_TYPEID(OR_TYPEID_PENTAX_645D_PEF) },
127 { 0, 0 }
128};
129
130
131RawFile *PEFFile::factory(const IO::Stream::Ptr &s)
132{
133 return new PEFFile(s);
134}
135
136PEFFile::PEFFile(const IO::Stream::Ptr &s)
137 : IfdFile(s, OR_RAWFILE_TYPE_PEF)
138{
139 _setIdMap(s_def);
140 _setMatrices(s_matrices);
141}
142
143PEFFile::~PEFFile()
144{
145}
146
147IfdDir::Ref PEFFile::_locateCfaIfd()
148{
149 // in PEF the CFA IFD is the main IFD
150 return mainIfd();
151}
152
153IfdDir::Ref PEFFile::_locateMainIfd()
154{
155 return m_container->setDirectory(0);
156}
157
158::or_error PEFFile::_getRawData(RawData & data, uint32_t options)
159{
160 ::or_error err;
161 const IfdDir::Ref & _cfaIfd = cfaIfd();
162 err = _getRawDataFromDir(data, _cfaIfd);
163 if(err == OR_ERROR_NONE) {
164 uint16_t compression = data.compression();
165 switch(compression) {
166 case IFD::COMPRESS_CUSTOM:
167 if((options & OR_OPTIONS_DONT_DECOMPRESS) == 0) {
168 // TODO decompress
169 }
170 break;
171 default:
172 break;
173 }
174 }
175 return err;
176}
177
178}
179}
180/*
181 Local Variables:
182 mode:c++
183 c-file-style:"stroustrup"
184 c-file-offsets:((innamespace . 0))
185 indent-tabs-mode:nil
186 fill-column:80
187 End:
188*/
189
IfdFileContainer * m_container
Definition: ifdfile.hpp:90
::or_error _getRawDataFromDir(RawData &data, const IfdDir::Ref &dir)
Definition: ifdfile.cpp:510
const IfdDir::Ref & cfaIfd()
Definition: ifdfile.cpp:332
CIFF is the container for CRW files. It is an attempt from Canon to make this a standard....
Definition: arwfile.cpp:30
virtual ::or_error _getRawData(RawData &data, uint32_t options) override
Definition: peffile.cpp:158