1 /*
2  *  This file is part of RawTherapee.
3  *
4  *  Copyright (c) 2004-2010 Gabor Horvath <hgabor@rawtherapee.com>
5  *
6  *  RawTherapee is free software: you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation, either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  RawTherapee 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
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with RawTherapee.  If not, see <https://www.gnu.org/licenses/>.
18  */
19 #ifndef _OLYMPUSATTRIBS_
20 #define _OLYMPUSATTRIBS_
21 
22 #include <string>
23 #include <cmath>
24 #include <iomanip>
25 #include <sstream>
26 
27 #include "rtexif.h"
28 
29 namespace rtexif
30 {
31 
32 class OLOnOffInterpreter : public Interpreter
33 {
34 public:
OLOnOffInterpreter()35     OLOnOffInterpreter () {}
toString(const Tag * t) const36     std::string toString (const Tag* t) const override
37     {
38         if (t->toInt() == 0) {
39             return "Off";
40         } else {
41             return "On";
42         }
43     }
44 };
45 OLOnOffInterpreter olOnOffInterpreter;
46 
47 class OLYesNoInterpreter : public Interpreter
48 {
49 public:
OLYesNoInterpreter()50     OLYesNoInterpreter () {}
toString(const Tag * t) const51     std::string toString (const Tag* t) const override
52     {
53         if (t->toInt() == 0) {
54             return "No";
55         } else {
56             return "Yes";
57         }
58     }
59 };
60 OLYesNoInterpreter olYesNoInterpreter;
61 
62 class OLApertureInterpreter : public Interpreter
63 {
64 public:
OLApertureInterpreter()65     OLApertureInterpreter () {}
toString(const Tag * t) const66     std::string toString (const Tag* t) const override
67     {
68         std::ostringstream str;
69         str.precision (2);
70         str << pow (2, t->toInt() / 512.0);
71         return str.str();
72     }
73 };
74 OLApertureInterpreter olApertureInterpreter;
75 
76 class OLLensTypeInterpreter : public Interpreter
77 {
78     std::map<std::string, std::string> lenses;
79 public:
OLLensTypeInterpreter()80     OLLensTypeInterpreter ()
81     {
82         lenses["00 01 00"] = "Olympus Zuiko Digital ED 50mm f/2.0 Macro";
83         lenses["00 01 01"] = "Olympus Zuiko Digital 40-150mm f/3.5-4.5";
84         lenses["00 01 10"] = "Olympus M.Zuiko Digital ED 14-42mm f/3.5-5.6";
85         lenses["00 02 00"] = "Olympus Zuiko Digital ED 150mm f/2.0";
86         lenses["00 02 10"] = "Olympus M.Zuiko Digital 17mm f/2.8 Pancake";
87         lenses["00 03 00"] = "Olympus Zuiko Digital ED 300mm f/2.8";
88         lenses["00 03 10"] = "Olympus M.Zuiko Digital ED 14-150mm f/4.0-5.6 [II]";
89         lenses["00 04 10"] = "Olympus M.Zuiko Digital ED 9-18mm f/4.0-5.6";
90         lenses["00 05 00"] = "Olympus Zuiko Digital 14-54mm f/2.8-3.5";
91         lenses["00 05 01"] = "Olympus Zuiko Digital Pro ED 90-250mm f/2.8";
92         lenses["00 05 10"] = "Olympus M.Zuiko Digital ED 14-42mm f/3.5-5.6 L";
93         lenses["00 06 00"] = "Olympus Zuiko Digital ED 50-200mm f/2.8-3.5";
94         lenses["00 06 01"] = "Olympus Zuiko Digital ED 8mm f/3.5 Fisheye";
95         lenses["00 06 10"] = "Olympus M.Zuiko Digital ED 40-150mm f/4.0-5.6";
96         lenses["00 07 00"] = "Olympus Zuiko Digital 11-22mm f/2.8-3.5";
97         lenses["00 07 01"] = "Olympus Zuiko Digital 18-180mm f/3.5-6.3";
98         lenses["00 07 10"] = "Olympus M.Zuiko Digital ED 12mm f/2.0";
99         lenses["00 08 01"] = "Olympus Zuiko Digital 70-300mm f/4.0-5.6";
100         lenses["00 08 10"] = "Olympus M.Zuiko Digital ED 75-300mm f/4.8-6.7";
101         lenses["00 09 10"] = "Olympus M.Zuiko Digital 14-42mm f/3.5-5.6 II";
102         lenses["00 10 01"] = "Kenko Tokina Reflex 300mm f/6.3 MF Macro";
103         lenses["00 10 10"] = "Olympus M.Zuiko Digital ED 12-50mm f/3.5-6.3 EZ";
104         lenses["00 11 10"] = "Olympus M.Zuiko Digital 45mm f/1.8";
105         lenses["00 12 10"] = "Olympus M.Zuiko Digital ED 60mm f/2.8 Macro";
106         lenses["00 13 10"] = "Olympus M.Zuiko Digital 14-42mm f/3.5-5.6 II R";
107         lenses["00 14 10"] = "Olympus M.Zuiko Digital ED 40-150mm f/4.0-5.6 R";
108         lenses["00 15 00"] = "Olympus Zuiko Digital ED 7-14mm f/4.0";
109         lenses["00 15 10"] = "Olympus M.Zuiko Digital ED 75mm f/1.8";
110         lenses["00 16 10"] = "Olympus M.Zuiko Digital 17mm f/1.8";
111         lenses["00 17 00"] = "Olympus Zuiko Digital Pro ED 35-100mm f/2.0";
112         lenses["00 18 00"] = "Olympus Zuiko Digital 14-45mm f/3.5-5.6";
113         lenses["00 18 10"] = "Olympus M.Zuiko Digital ED 75-300mm f/4.8-6.7 II";
114         lenses["00 19 10"] = "Olympus M.Zuiko Digital ED 12-40mm f/2.8 Pro";
115         lenses["00 20 00"] = "Olympus Zuiko Digital 35mm f/3.5 Macro";
116         lenses["00 20 10"] = "Olympus M.Zuiko Digital ED 40-150mm f/2.8 Pro";
117         lenses["00 21 10"] = "Olympus M.Zuiko Digital ED 14-42mm f/3.5-5.6 EZ";
118         lenses["00 22 00"] = "Olympus Zuiko Digital 17.5-45mm f/3.5-5.6";
119         lenses["00 22 10"] = "Olympus M.Zuiko Digital 25mm f/1.8";
120         lenses["00 23 00"] = "Olympus Zuiko Digital ED 14-42mm f/3.5-5.6";
121         lenses["00 23 10"] = "Olympus M.Zuiko Digital ED 7-14mm f/2.8 Pro";
122         lenses["00 24 00"] = "Olympus Zuiko Digital ED 40-150mm f/4.0-5.6";
123         lenses["00 24 10"] = "Olympus M.Zuiko Digital ED 300mm f/4.0 IS Pro";
124         lenses["00 25 10"] = "Olympus M.Zuiko Digital ED 8mm f/1.8 Fisheye Pro";
125         lenses["00 26 10"] = "Olympus M.Zuiko Digital ED 12-100mm f/4.0 IS Pro";
126         lenses["00 27 10"] = "Olympus M.Zuiko Digital ED 30mm f/3.5 Macro";
127         lenses["00 28 10"] = "Olympus M.Zuiko Digital ED 25mm f/1.2 Pro";
128         lenses["00 29 10"] = "Olympus M.Zuiko Digital ED 17mm f/1.2 Pro";
129         lenses["00 30 00"] = "Olympus Zuiko Digital ED 50-200mm f/2.8-3.5 SWD";
130         lenses["00 30 10"] = "Olympus M.Zuiko Digital ED 45mm f/1.2 Pro";
131         lenses["00 31 00"] = "Olympus Zuiko Digital ED 12-60mm f/2.8-4.0 SWD";
132         lenses["00 32 00"] = "Olympus Zuiko Digital ED 14-35mm f/2.0 SWD";
133         lenses["00 32 10"] = "Olympus M.Zuiko Digital ED 12-200mm f/3.5-6.3";
134         lenses["00 33 00"] = "Olympus Zuiko Digital 25mm f/2.8";
135         lenses["00 34 00"] = "Olympus Zuiko Digital ED 9-18mm f/4.0-5.6";
136         lenses["00 35 00"] = "Olympus Zuiko Digital 14-54mm f/2.8-3.5 II";
137         lenses["01 01 00"] = "Sigma 18-50mm f/3.5-5.6 DC";
138         lenses["01 01 10"] = "Sigma 30mm f/2.8 EX DN";
139         lenses["01 02 00"] = "Sigma 55-200mm f/4.0-5.6 DC";
140         lenses["01 02 10"] = "Sigma 19mm f/2.8 EX DN";
141         lenses["01 03 00"] = "Sigma 18-125mm f/3.5-5.6 DC";
142         lenses["01 03 10"] = "Sigma 30mm f/2.8 DN | A";
143         lenses["01 04 00"] = "Sigma 18-125mm f/3.5-5.6 DC";
144         lenses["01 04 10"] = "Sigma 19mm f/2.8 DN | A";
145         lenses["01 05 00"] = "Sigma 30mm f/1.4 EX DC HSM";
146         lenses["01 05 10"] = "Sigma 60mm f/2.8 DN | A";
147         lenses["01 06 00"] = "Sigma APO 50-500mm f/4.0-6.3 EX DG HSM";
148         lenses["01 06 10"] = "Sigma 30mm f/1.4 DC DN | C";
149         lenses["01 07 00"] = "Sigma Macro 105mm f/2.8 EX DG";
150         lenses["01 07 10"] = "Sigma 16mm f/1.4 DC DN | C (017)";
151         lenses["01 08 00"] = "Sigma APO Macro 150mm f/2.8 EX DG HSM";
152         lenses["01 09 00"] = "Sigma 18-50mm f/2.8 EX DC Macro";
153         lenses["01 10 00"] = "Sigma 24mm f/1.8 EX DG Aspherical Macro";
154         lenses["01 11 00"] = "Sigma APO 135-400mm f/4.5-5.6 DG";
155         lenses["01 12 00"] = "Sigma APO 300-800mm f/5.6 EX DG HSM";
156         lenses["01 13 00"] = "Sigma 30mm f/1.4 EX DC HSM";
157         lenses["01 14 00"] = "Sigma APO 50-500mm f/4.0-6.3 EX DG HSM";
158         lenses["01 15 00"] = "Sigma 10-20mm f/4.0-5.6 EX DC HSM";
159         lenses["01 16 00"] = "Sigma APO 70-200mm f/2.8 II EX DG Macro HSM";
160         lenses["01 17 00"] = "Sigma 50mm f/1.4 EX DG HSM";
161         lenses["02 01 00"] = "Leica D Vario Elmarit 14-50mm f/2.8-3.5 Asph.";
162         lenses["02 01 10"] = "Lumix G Vario 14-45mm f/3.5-5.6 Asph. Mega OIS";
163         lenses["02 02 00"] = "Leica D Summilux 25mm f/1.4 Asph.";
164         lenses["02 02 10"] = "Lumix G Vario 45-200mm f/4.0-5.6 Mega OIS";
165         lenses["02 03 00"] = "Leica D Vario Elmar 14-50mm f/3.8-5.6 Asph. Mega OIS";
166         lenses["02 03 01"] = "Leica D Vario Elmar 14-50mm f/3.8-5.6 Asph.";
167         lenses["02 03 10"] = "Lumix G Vario HD 14-140mm f/4.0-5.8 Asph. Mega OIS";
168         lenses["02 04 00"] = "Leica D Vario Elmar 14-150mm f/3.5-5.6";
169         lenses["02 04 10"] = "Lumix G Vario 7-14mm f/4.0 Asph.";
170         lenses["02 05 10"] = "Lumix G 20mm f/1.7 Asph.";
171         lenses["02 06 10"] = "Leica DG Macro-Elmarit 45mm f/2.8 Asph. Mega OIS";
172         lenses["02 07 10"] = "Lumix G Vario 14-42mm f/3.5-5.6 Asph. Mega OIS";
173         lenses["02 08 10"] = "Lumix G Fisheye 8mm f/3.5";
174         lenses["02 09 10"] = "Lumix G Vario 100-300mm f/4.0-5.6 Mega OIS";
175         lenses["02 10 10"] = "Lumix G 14mm f/2.5 Asph.";
176         lenses["02 11 10"] = "Lumix G 12.5mm f/12 3D";
177         lenses["02 12 10"] = "Leica DG Summilux 25mm f/1.4 Asph.";
178         lenses["02 13 10"] = "Lumix G X Vario PZ 45-175mm f/4.0-5.6 Asph. Power OIS";
179         lenses["02 14 10"] = "Lumix G X Vario PZ 14-42mm f/3.5-5.6 Asph. Power OIS";
180         lenses["02 15 10"] = "Lumix G X Vario 12-35mm f/2.8 Asph. Power OIS";
181         lenses["02 16 10"] = "Lumix G Vario 45-150mm f/4.0-5.6 Asph. Mega OIS";
182         lenses["02 17 10"] = "Lumix G X Vario 35-100mm f/2.8 Power OIS";
183         lenses["02 18 10"] = "Lumix G Vario 14-42mm f/3.5-5.6 II Asph. Mega OIS";
184         lenses["02 19 10"] = "Lumix G Vario 14-140mm f/3.5-5.6 Asph. Power OIS";
185         lenses["02 20 10"] = "Lumix G Vario 12-32mm f/3.5-5.6 Asph. Mega OIS";
186         lenses["02 21 10"] = "Leica DG Nocticron 42.5mm f/1.2 Asph. Power OIS";
187         lenses["02 22 10"] = "Leica DG Summilux 15mm f/1.7 Asph.";
188         lenses["02 23 10"] = "Lumix G Vario 35-100mm f/4.0-5.6 Asph. Mega OIS";
189         lenses["02 24 10"] = "Lumix G Macro 30mm f/2.8 Asph. Mega OIS";
190         lenses["02 25 10"] = "Lumix G 42.5mm f/1.7 Asph. Power OIS";
191         lenses["02 26 10"] = "Lumix G 25mm f/1.7 Asph.";
192         lenses["02 27 10"] = "Leica DG Vario-Elmar 100-400mm f/4.0-6.3 Asph. Power OIS";
193         lenses["02 28 10"] = "Lumix G Vario 12-60mm f/3.5-5.6 Asph. Power OIS";
194         lenses["02 29 10"] = "Leica DG Summilux 12mm f/1.4 Asph.";
195         lenses["02 30 10"] = "Leica DG Vario-Elmarit 12-60mm f/2.8-4 Asph. Power OIS";
196         lenses["02 33 10"] = "Lumix G X Vario 12-35mm f/2.8 II Asph. Power OIS";
197         lenses["02 35 10"] = "Leica DG Vario-Elmarit 8-18mm f/2.8-4 Asph.";
198         lenses["02 36 10"] = "Leica DG Elmarit 200mm f/2.8 Power OIS";
199         lenses["02 37 10"] = "Leica DG Vario-Elmarit 50-200mm f/2.8-4 Asph. Power OIS";
200         lenses["02 38 10"] = "Leica DG Vario-Summilux 10-25mm f/1.7 Asph.";
201         lenses["03 01 00"] = "Leica D Vario Elmarit 14-50mm f/2.8-3.5 Asph.";
202         lenses["03 02 00"] = "Leica D Summilux 25mm f/1.4 Asph.";
203         lenses["05 01 10"] = "Tamron 14-150mm f/3.5-5.8 Di III";
204     }
toString(const Tag * t) const205     std::string toString (const Tag* t) const override
206     {
207         std::ostringstream lid;
208         lid.setf (std::ios_base::hex, std::ios_base::basefield);
209         lid.setf (std::ios_base::uppercase);
210         lid << std::setw (2) << std::setfill ('0') << t->toInt (0) << ' '; //maker
211         lid << std::setw (2) << std::setfill ('0') << t->toInt (2) << ' '; //model
212         lid << std::setw (2) << std::setfill ('0') << t->toInt (3); // submodel
213 
214         std::map<std::string, std::string>::const_iterator r = lenses.find (lid.str());
215 
216         if (r != lenses.end()) {
217             return r->second;
218         } else {
219             return "Unknown";
220         }
221     }
222 };
223 OLLensTypeInterpreter olLensTypeInterpreter;
224 
225 class OLFlashTypeInterpreter : public ChoiceInterpreter<>
226 {
227 public:
OLFlashTypeInterpreter()228     OLFlashTypeInterpreter ()
229     {
230         choices[0]      = "None";
231         choices[2]      = "Simple E-System";
232         choices[3]      = "E-System";
233     }
234 };
235 OLFlashTypeInterpreter olFlashTypeInterpreter;
236 
237 class OLExposureModeInterpreter : public ChoiceInterpreter<>
238 {
239 public:
OLExposureModeInterpreter()240     OLExposureModeInterpreter ()
241     {
242         choices[1] = "Manual";
243         choices[2] = "Program";
244         choices[3] = "Aperture-priority AE";
245         choices[4] = "Shutter speed priority AE";
246         choices[5] = "Program-shift";
247     }
248 };
249 OLExposureModeInterpreter olExposureModeInterpreter;
250 
251 class OLMeteringModeInterpreter : public ChoiceInterpreter<>
252 {
253 public:
OLMeteringModeInterpreter()254     OLMeteringModeInterpreter ()
255     {
256         choices[2] = "Center-weighted average";
257         choices[3] = "Spot";
258         choices[5] = "ESP";
259         choices[261] = "Pattern+AF";
260         choices[515] = "Spot+Highlight control";
261         choices[1027] = "Spot+Shadow control";
262     }
263 };
264 OLMeteringModeInterpreter olMeteringModeInterpreter;
265 
266 class OLFocusModeInterpreter : public ChoiceInterpreter<>
267 {
268 public:
OLFocusModeInterpreter()269     OLFocusModeInterpreter ()
270     {
271         choices[0] = "Single AF";
272         choices[1] = "Sequential shooting AF";
273         choices[2] = "Continuous AF";
274         choices[3] = "Multi AF";
275         choices[4] = "Face detect";
276         choices[10] = "MF";
277     }
278 };
279 OLFocusModeInterpreter olFocusModeInterpreter;
280 
281 class OLWhitebalance2Interpreter : public ChoiceInterpreter<>
282 {
283 public:
OLWhitebalance2Interpreter()284     OLWhitebalance2Interpreter ()
285     {
286         choices[0] = "Auto";
287         choices[1] = "Auto (Keep Warm Color Off)";
288         choices[16] = "7500K (Fine Weather with Shade)";
289         choices[17] = "6000K (Cloudy)";
290         choices[18] = "5300K (Fine Weather)";
291         choices[20] = "3000K (Tungsten light)";
292         choices[21] = "3600K (Tungsten light-like)";
293         choices[22] = "Auto Setup";
294         choices[23] = "5500K (Flash)";
295         choices[33] = "6600K (Daylight fluorescent)";
296         choices[34] = "4500K (Neutral white fluorescent)";
297         choices[35] = "4000K (Cool white fluorescent)";
298         choices[36] = "White Fluorescent";
299         choices[48] = "3600K (Tungsten light-like)";
300         choices[67] = "Underwater";
301         choices[256] = "One Touch WB 1";
302         choices[257] = "One Touch WB 2";
303         choices[258] = "One Touch WB 3";
304         choices[259] = "One Touch WB 4";
305         choices[512] = "Custom WB 1";
306         choices[513] = "Custom WB 2";
307         choices[514] = "Custom WB 3";
308         choices[515] = "Custom WB 4";
309     }
310 };
311 OLWhitebalance2Interpreter olWhitebalance2Interpreter;
312 
313 class OLSceneModeInterpreter : public ChoiceInterpreter<>
314 {
315 public:
OLSceneModeInterpreter()316     OLSceneModeInterpreter ()
317     {
318         choices[0] = "Standard";
319         choices[6] = "Auto";
320         choices[7] = "Sport";
321         choices[8] = "Portrait";
322         choices[9] = "Landscape+Portrait";
323         choices[10] = "Landscape";
324         choices[11] = "Night Scene";
325         choices[12] = "Self Portrait";
326         choices[13] = "Panorama";
327         choices[14] = "2 in 1";
328         choices[15] = "Movie";
329         choices[16] = "Landscape+Portrait";
330         choices[17] = "Night+Portrait";
331         choices[18] = "Indoor";
332         choices[19] = "Fireworks";
333         choices[20] = "Sunset";
334         choices[21] = "Beauty Skin";
335         choices[22] = "Macro";
336         choices[23] = "Super Macro";
337         choices[24] = "Food";
338         choices[25] = "Documents";
339         choices[26] = "Museum";
340         choices[27] = "Shoot & Select";
341         choices[28] = "Beach & Snow";
342         choices[29] = "Self Protrait+Timer";
343         choices[30] = "Candle";
344         choices[31] = "Available Light";
345         choices[32] = "Behind Glass";
346         choices[33] = "My Mode";
347         choices[34] = "Pet";
348         choices[35] = "Underwater Wide1";
349         choices[36] = "Underwater Macro";
350         choices[37] = "Shoot & Select1";
351         choices[38] = "Shoot & Select2";
352         choices[39] = "High Key";
353         choices[40] = "Digital Image Stabilization";
354         choices[41] = "Auction";
355         choices[42] = "Beach";
356         choices[43] = "Snow";
357         choices[44] = "Underwater Wide2";
358         choices[45] = "Low Key";
359         choices[46] = "Children";
360         choices[47] = "Vivid";
361         choices[48] = "Nature Macro";
362         choices[49] = "Underwater Snapshot";
363         choices[50] = "Shooting Guide";
364         choices[54] = "Face Portrait";
365         choices[57] = "Bulb";
366         choices[59] = "Smile Shot";
367         choices[60] = "Quick Shutter";
368         choices[63] = "Slow Shutter";
369         choices[64] = "Bird Watching";
370         choices[65] = "Multiple Exposure";
371         choices[66] = "e-Portrait";
372         choices[67] = "Soft Background Shot";
373         choices[142] = "Hand-held Starlight";
374         choices[154] = "HDR";
375     }
376 };
377 OLSceneModeInterpreter olSceneModeInterpreter;
378 
379 class OLPictureModeBWFilterInterpreter : public ChoiceInterpreter<>
380 {
381 public:
OLPictureModeBWFilterInterpreter()382     OLPictureModeBWFilterInterpreter ()
383     {
384         choices[0] = "n/a";
385         choices[1] = "Neutral";
386         choices[2] = "Yellow";
387         choices[3] = "Orange";
388         choices[4] = "Red";
389         choices[5] = "Green";
390     }
391 };
392 OLPictureModeBWFilterInterpreter olPictureModeBWFilterInterpreter;
393 
394 class OLPictureModeToneInterpreter : public ChoiceInterpreter<>
395 {
396 public:
OLPictureModeToneInterpreter()397     OLPictureModeToneInterpreter ()
398     {
399         choices[0] = "n/a";
400         choices[1] = "Neutral";
401         choices[2] = "Sepia";
402         choices[3] = "Blue";
403         choices[4] = "Purple";
404         choices[5] = "Green";
405     }
406 };
407 OLPictureModeToneInterpreter olPictureModeToneInterpreter;
408 
409 class OLImageQuality2Interpreter : public ChoiceInterpreter<>
410 {
411 public:
OLImageQuality2Interpreter()412     OLImageQuality2Interpreter ()
413     {
414         choices[1] = "SQ";
415         choices[2] = "HQ";
416         choices[3] = "SHQ";
417         choices[4] = "RAW";
418         choices[5] = "SQ (5)";
419     }
420 };
421 OLImageQuality2Interpreter olImageQuality2Interpreter;
422 
423 class OLDevEngineInterpreter : public ChoiceInterpreter<>
424 {
425 public:
426     // RawDevEngine
OLDevEngineInterpreter()427     OLDevEngineInterpreter ()
428     {
429         choices[0] = "High Speed";
430         choices[1] = "High Function";
431         choices[2] = "Advanced High Speed";
432         choices[3] = "Advanced High Function";
433     }
434 };
435 OLDevEngineInterpreter olDevEngineInterpreter;
436 
437 class OLPictureModeInterpreter : public ChoiceInterpreter<>
438 {
439 public:
OLPictureModeInterpreter()440     OLPictureModeInterpreter ()
441     {
442         choices[1] = "Vivid";
443         choices[2] = "Natural";
444         choices[3] = "Muted";
445         choices[4] = "Portrait";
446         choices[5] = "i-Enhance";
447         choices[7] = "Color Creator";
448         choices[9] = "Color Profile 1";
449         choices[10] = "Color Profile 2";
450         choices[11] = "Color Profile 3";
451         choices[12] = "Monochrome Profile 1";
452         choices[13] = "Monochrome Profile 2";
453         choices[14] = "Monochrome Profile 3";
454         choices[256] = "Monotone";
455         choices[512] = "Sepia";
456     }
457 };
458 OLPictureModeInterpreter olPictureModeInterpreter;
459 
460 class OLColorSpaceInterpreter : public ChoiceInterpreter<>
461 {
462 public:
OLColorSpaceInterpreter()463     OLColorSpaceInterpreter ()
464     {
465         choices[0] = "sRGB";
466         choices[1] = "Adobe RGB";
467         choices[2] = "Pro Photo RGB";
468     }
469 };
470 OLColorSpaceInterpreter olColorSpaceInterpreter;
471 
472 class OLNoiseFilterInterpreter : public Interpreter
473 {
474 public:
OLNoiseFilterInterpreter()475     OLNoiseFilterInterpreter () {}
toString(const Tag * t) const476     std::string toString (const Tag* t) const override
477     {
478         int a = t->toInt (0);
479         int b = t->toInt (2);
480         int c = t->toInt (4);
481 
482         if (a == -1 && b == -2 && c == 1) {
483             return "Low";
484         } else if (a == -2 && b == -2 && c == 1) {
485             return "Off";
486         } else if (a == 0 && b == -2 && c == 1) {
487             return "Standard";
488         } else if (a == 1 && b == -2 && c == 1) {
489             return "High";
490         } else {
491             return "Unknown";
492         }
493     }
494 };
495 OLNoiseFilterInterpreter olNoiseFilterInterpreter;
496 
497 class OLFlashModeInterpreter : public Interpreter
498 {
499 public:
OLFlashModeInterpreter()500     OLFlashModeInterpreter () {}
toString(const Tag * t) const501     std::string toString (const Tag* t) const override
502     {
503         std::ostringstream str;
504         int a = t->toInt ();
505         str << "Flash Used = " << ((a & 1) ? "Yes" : "No") << std::endl;
506         str << "Fill-in = " << ((a & 2) ? "On" : "Off") << std::endl;
507         str << "Red-eye = " << ((a & 4) ? "On" : "Off") << std::endl;
508         str << "Slow-sync = " << ((a & 8) ? "On" : "Off") << std::endl;
509         str << "Forced On = " << ((a & 16) ? "On" : "Off") << std::endl;
510         str << "2nd Curtain = " << ((a & 32) ? "On" : "Off");
511         return str.str();
512     }
513 };
514 OLFlashModeInterpreter olFlashModeInterpreter;
515 
516 class OLNoiseReductionInterpreter : public Interpreter
517 {
518 public:
OLNoiseReductionInterpreter()519     OLNoiseReductionInterpreter () {}
toString(const Tag * t) const520     std::string toString (const Tag* t) const override
521     {
522         std::ostringstream str;
523         int a = t->toInt ();
524         str << "Noise Reduction = " << ((a & 1) ? "On" : "Off") << std::endl;
525         str << "Noise Filter = " << ((a & 2) ? "On" : "Off") << std::endl;
526         str << "Noise Filter (ISO Boost) = " << ((a & 4) ? "On" : "Off") << std::endl;
527         str << "Auto = " << ((a & 8) ? "On" : "Off");
528         return str.str();
529     }
530 };
531 OLNoiseReductionInterpreter olNoiseReductionInterpreter;
532 
533 class OLFlashModelInterpreter : public ChoiceInterpreter<>
534 {
535 public:
OLFlashModelInterpreter()536     OLFlashModelInterpreter ()
537     {
538         choices[0]  = "None";
539         choices[1]  = "FL-20";
540         choices[2]  = "FL-50";
541         choices[3]  = "RF-11";
542         choices[4]  = "TF-22";
543         choices[5]  = "FL-36";
544         choices[6]  = "FL-50R";
545         choices[7]  = "FL-36R";
546         choices[9]  = "FL-14";
547         choices[11] = "FL-600R";
548     }
549 };
550 OLFlashModelInterpreter olFlashModelInterpreter;
551 
552 const TagAttrib olyFocusInfoAttribs[] = {
553     {0, AC_WRITE, 0, nullptr, 0x0000, AUTO, "FocusInfoVersion", &stdInterpreter},
554     {0, AC_WRITE, 0, nullptr, 0x0209, AUTO, "AutoFocus", &olOnOffInterpreter},
555     {0, AC_WRITE, 0, nullptr, 0x0210, AUTO, "SceneDetect", &stdInterpreter},
556     {0, AC_WRITE, 0, nullptr, 0x0211, AUTO, "SceneArea", &stdInterpreter},
557     {0, AC_WRITE, 0, nullptr, 0x0212, AUTO, "SceneDetectData", &stdInterpreter},
558     {0, AC_WRITE, 0, nullptr, 0x0300, AUTO, "ZoomStepCount", &stdInterpreter},
559     {0, AC_WRITE, 0, nullptr, 0x0301, AUTO, "FocusStepCount", &stdInterpreter},
560     {0, AC_WRITE, 0, nullptr, 0x0303, AUTO, "FocusStepInfinity", &stdInterpreter},
561     {0, AC_WRITE, 0, nullptr, 0x0304, AUTO, "FocusStepNear", &stdInterpreter},
562     {0, AC_WRITE, 0, nullptr, 0x0305, AUTO, "FocusDistance", &stdInterpreter},
563     {0, AC_WRITE, 0, nullptr, 0x0308, AUTO, "AFPoint", &stdInterpreter},
564     {0, AC_WRITE, 0, nullptr, 0x1201, AUTO, "ExternalFlash", &olOnOffInterpreter},
565     {0, AC_WRITE, 0, nullptr, 0x1203, AUTO, "ExternalFlashGuideNumber", &stdInterpreter},
566     {0, AC_WRITE, 0, nullptr, 0x1204, AUTO, "ExternalFlashBounce", &stdInterpreter},
567     {0, AC_WRITE, 0, nullptr, 0x1205, AUTO, "ExternalFlashZoom", &stdInterpreter},
568     {0, AC_WRITE, 0, nullptr, 0x1208, AUTO, "InternalFlash", &olOnOffInterpreter},
569     {0, AC_WRITE, 0, nullptr, 0x1209, AUTO, "ManualFlash", &olOnOffInterpreter},
570     {0, AC_WRITE, 0, nullptr, 0x1500, AUTO, "SensorTemperature", &stdInterpreter},
571     {0, AC_WRITE, 0, nullptr, 0x1600, AUTO, "ImageStabilization", &stdInterpreter},
572     { -1, AC_DONTWRITE, 0,  nullptr, 0, AUTO, "", nullptr}
573 };
574 
575 const TagAttrib olyImageProcessingAttribs[] = {
576     {0, AC_WRITE, 0, nullptr, 0x0000, AUTO, "ImageProcessingVersion", &stdInterpreter},
577     {0, AC_WRITE, 0, nullptr, 0x0100, AUTO, "WB_RBLevels", &stdInterpreter},
578     {0, AC_WRITE, 0, nullptr, 0x0102, AUTO, "WB_RBLevels3000K", &stdInterpreter},
579     {0, AC_WRITE, 0, nullptr, 0x0103, AUTO, "WB_RBLevels3300K", &stdInterpreter},
580     {0, AC_WRITE, 0, nullptr, 0x0104, AUTO, "WB_RBLevels3600K", &stdInterpreter},
581     {0, AC_WRITE, 0, nullptr, 0x0105, AUTO, "WB_RBLevels3900K", &stdInterpreter},
582     {0, AC_WRITE, 0, nullptr, 0x0106, AUTO, "WB_RBLevels4000K", &stdInterpreter},
583     {0, AC_WRITE, 0, nullptr, 0x0107, AUTO, "WB_RBLevels4300K", &stdInterpreter},
584     {0, AC_WRITE, 0, nullptr, 0x0108, AUTO, "WB_RBLevels4500K", &stdInterpreter},
585     {0, AC_WRITE, 0, nullptr, 0x0109, AUTO, "WB_RBLevels4800K", &stdInterpreter},
586     {0, AC_WRITE, 0, nullptr, 0x010a, AUTO, "WB_RBLevels5300K", &stdInterpreter},
587     {0, AC_WRITE, 0, nullptr, 0x010b, AUTO, "WB_RBLevels6000K", &stdInterpreter},
588     {0, AC_WRITE, 0, nullptr, 0x010c, AUTO, "WB_RBLevels6600K", &stdInterpreter},
589     {0, AC_WRITE, 0, nullptr, 0x010d, AUTO, "WB_RBLevels7500K", &stdInterpreter},
590     {0, AC_WRITE, 0, nullptr, 0x010e, AUTO, "WB_RBLevelsCWB1", &stdInterpreter},
591     {0, AC_WRITE, 0, nullptr, 0x010f, AUTO, "WB_RBLevelsCWB2", &stdInterpreter},
592     {0, AC_WRITE, 0, nullptr, 0x0110, AUTO, "WB_RBLevelsCWB3", &stdInterpreter},
593     {0, AC_WRITE, 0, nullptr, 0x0111, AUTO, "WB_RBLevelsCWB4", &stdInterpreter},
594     {0, AC_WRITE, 0, nullptr, 0x0113, AUTO, "WB_GLevel3000K", &stdInterpreter},
595     {0, AC_WRITE, 0, nullptr, 0x0114, AUTO, "WB_GLevel3300K", &stdInterpreter},
596     {0, AC_WRITE, 0, nullptr, 0x0115, AUTO, "WB_GLevel3600K", &stdInterpreter},
597     {0, AC_WRITE, 0, nullptr, 0x0116, AUTO, "WB_GLevel3900K", &stdInterpreter},
598     {0, AC_WRITE, 0, nullptr, 0x0117, AUTO, "WB_GLevel4000K", &stdInterpreter},
599     {0, AC_WRITE, 0, nullptr, 0x0118, AUTO, "WB_GLevel4300K", &stdInterpreter},
600     {0, AC_WRITE, 0, nullptr, 0x0119, AUTO, "WB_GLevel4500K", &stdInterpreter},
601     {0, AC_WRITE, 0, nullptr, 0x011a, AUTO, "WB_GLevel4800K", &stdInterpreter},
602     {0, AC_WRITE, 0, nullptr, 0x011b, AUTO, "WB_GLevel5300K", &stdInterpreter},
603     {0, AC_WRITE, 0, nullptr, 0x011c, AUTO, "WB_GLevel6000K", &stdInterpreter},
604     {0, AC_WRITE, 0, nullptr, 0x011d, AUTO, "WB_GLevel6600K", &stdInterpreter},
605     {0, AC_WRITE, 0, nullptr, 0x011e, AUTO, "WB_GLevel7500K", &stdInterpreter},
606     {0, AC_WRITE, 0, nullptr, 0x011f, AUTO, "WB_GLevel", &stdInterpreter},
607     {0, AC_WRITE, 0, nullptr, 0x0200, AUTO, "ColorMatrix", &stdInterpreter},
608     {0, AC_WRITE, 0, nullptr, 0x0300, AUTO, "Enhancer", &stdInterpreter},
609     {0, AC_WRITE, 0, nullptr, 0x0301, AUTO, "EnhancerValues", &stdInterpreter},
610     {0, AC_WRITE, 0, nullptr, 0x0310, AUTO, "CoringFilter", &stdInterpreter},
611     {0, AC_WRITE, 0, nullptr, 0x0311, AUTO, "CoringValues", &stdInterpreter},
612     {0, AC_WRITE, 0, nullptr, 0x0600, AUTO, "BlackLevel2", &stdInterpreter},
613     {0, AC_WRITE, 0, nullptr, 0x0610, AUTO, "GainBase", &stdInterpreter},
614     {0, AC_WRITE, 0, nullptr, 0x0611, AUTO, "ValidBits", &stdInterpreter},
615     {0, AC_WRITE, 0, nullptr, 0x0612, AUTO, "CropLeft", &stdInterpreter},
616     {0, AC_WRITE, 0, nullptr, 0x0613, AUTO, "CropTop", &stdInterpreter},
617     {0, AC_WRITE, 0, nullptr, 0x0614, AUTO, "CropWidth", &stdInterpreter},
618     {0, AC_WRITE, 0, nullptr, 0x0615, AUTO, "CropHeight", &stdInterpreter},
619     {0, AC_WRITE, 0, nullptr, 0x1010, AUTO, "NoiseReduction2", &stdInterpreter},
620     {0, AC_WRITE, 0, nullptr, 0x1011, AUTO, "DistortionCorrection2", &olOnOffInterpreter},
621     {0, AC_WRITE, 0, nullptr, 0x1012, AUTO, "ShadingCompensation2", &olOnOffInterpreter},
622     {1, AC_WRITE, 0, nullptr, 0x1103, AUTO, "UnknownBlock", &stdInterpreter},
623     {0, AC_WRITE, 0, nullptr, 0x1200, AUTO, "FaceDetect", &olOnOffInterpreter},
624     {0, AC_WRITE, 0, nullptr, 0x1201, AUTO, "FaceDetectArea", &stdInterpreter},
625     { -1, AC_DONTWRITE, 0,  nullptr, 0, AUTO, "", nullptr}
626 };
627 
628 const TagAttrib olyRawDevelopmentAttribs[] = {
629     {0, AC_WRITE, 0, nullptr, 0x0000, AUTO, "RawDevVersion", &stdInterpreter},
630     {0, AC_WRITE, 0, nullptr, 0x0100, AUTO, "RawDevExposureBiasValue", &stdInterpreter},
631     {0, AC_WRITE, 0, nullptr, 0x0101, AUTO, "RawDevWhiteBalanceValue", &stdInterpreter},
632     {0, AC_WRITE, 0, nullptr, 0x0102, AUTO, "RawDevWBFineAdjustment", &stdInterpreter},
633     {0, AC_WRITE, 0, nullptr, 0x0103, AUTO, "RawDevGrayPoint", &stdInterpreter},
634     {0, AC_WRITE, 0, nullptr, 0x0104, AUTO, "RawDevSaturationEmphasis", &stdInterpreter},
635     {0, AC_WRITE, 0, nullptr, 0x0105, AUTO, "RawDevMemoryColorEmphasis", &stdInterpreter},
636     {0, AC_WRITE, 0, nullptr, 0x0106, AUTO, "RawDevContrastValue", &stdInterpreter},
637     {0, AC_WRITE, 0, nullptr, 0x0107, AUTO, "RawDevSharpnessValue", &stdInterpreter},
638     {0, AC_WRITE, 0, nullptr, 0x0108, AUTO, "RawDevColorSpace", &olColorSpaceInterpreter},
639     {0, AC_WRITE, 0, nullptr, 0x0109, AUTO, "RawDevEngine", &olDevEngineInterpreter},
640     {0, AC_WRITE, 0, nullptr, 0x010a, AUTO, "RawDevNoiseReduction", &olNoiseReductionInterpreter},
641     {0, AC_WRITE, 0, nullptr, 0x010b, AUTO, "RawDevEditStatus", &stdInterpreter},
642     {0, AC_WRITE, 0, nullptr, 0x010c, AUTO, "RawDevSettings", &stdInterpreter},
643     { -1, AC_DONTWRITE, 0,  nullptr, 0, AUTO, "", nullptr}
644 };
645 
646 const TagAttrib olyRawDevelopment2Attribs[] = {
647     {0, AC_WRITE, 0, nullptr, 0x0000, AUTO, "RawDevVersion", &stdInterpreter},
648     {0, AC_WRITE, 0, nullptr, 0x0100, AUTO, "RawDevExposureBiasValue", &stdInterpreter},
649     {0, AC_WRITE, 0, nullptr, 0x0101, AUTO, "RawDevWhiteBalance", &stdInterpreter},
650     {0, AC_WRITE, 0, nullptr, 0x0102, AUTO, "RawDevWhiteBalanceValue", &stdInterpreter},
651     {0, AC_WRITE, 0, nullptr, 0x0103, AUTO, "RawDevWBFineAdjustment", &stdInterpreter},
652     {0, AC_WRITE, 0, nullptr, 0x0104, AUTO, "RawDevGrayPoint", &stdInterpreter},
653     {0, AC_WRITE, 0, nullptr, 0x0105, AUTO, "RawDevContrastValue", &stdInterpreter},
654     {0, AC_WRITE, 0, nullptr, 0x0106, AUTO, "RawDevSharpnessValue", &stdInterpreter},
655     {0, AC_WRITE, 0, nullptr, 0x0107, AUTO, "RawDevSaturationEmphasis", &stdInterpreter},
656     {0, AC_WRITE, 0, nullptr, 0x0108, AUTO, "RawDevMemoryColorEmphasis", &stdInterpreter},
657     {0, AC_WRITE, 0, nullptr, 0x0109, AUTO, "RawDevColorSpace", &olColorSpaceInterpreter},
658     {0, AC_WRITE, 0, nullptr, 0x010a, AUTO, "RawDevNoiseReduction", &olNoiseReductionInterpreter},
659     {0, AC_WRITE, 0, nullptr, 0x010b, AUTO, "RawDevEngine", &olDevEngineInterpreter},
660     {0, AC_WRITE, 0, nullptr, 0x010c, AUTO, "RawDevPictureMode", &olPictureModeInterpreter},
661     {0, AC_WRITE, 0, nullptr, 0x010d, AUTO, "RawDevPMSaturation", &stdInterpreter},
662     {0, AC_WRITE, 0, nullptr, 0x010e, AUTO, "RawDevPMContrast", &stdInterpreter},
663     {0, AC_WRITE, 0, nullptr, 0x010f, AUTO, "RawDevPMSharpness", &stdInterpreter},
664     {0, AC_WRITE, 0, nullptr, 0x0110, AUTO, "RawDevPM_BWFilter", &olPictureModeBWFilterInterpreter},
665     {0, AC_WRITE, 0, nullptr, 0x0111, AUTO, "RawDevPMPictureTone", &olPictureModeToneInterpreter},
666     {0, AC_WRITE, 0, nullptr, 0x0112, AUTO, "RawDevGradation", &stdInterpreter},
667     {0, AC_WRITE, 0, nullptr, 0x0113, AUTO, "RawDevSaturation3", &stdInterpreter},
668     {0, AC_WRITE, 0, nullptr, 0x0119, AUTO, "RawDevAutoGradation", &olOnOffInterpreter},
669     {0, AC_WRITE, 0, nullptr, 0x0120, AUTO, "RawDevPMNoiseFilter", &stdInterpreter},
670     { -1, AC_DONTWRITE, 0,  nullptr, 0, AUTO, "", nullptr}
671 };
672 
673 const TagAttrib olyCameraSettingsAttribs[] = {
674     {0, AC_WRITE, 0, nullptr, 0x0000, AUTO, "CameraSettingsVersion", &stdInterpreter},
675     {1, AC_WRITE, 0, nullptr, 0x0100, AUTO, "PreviewImageValid", &olYesNoInterpreter},
676     {1, AC_WRITE, 0, nullptr, 0x0101, AUTO, "PreviewImageStart", &stdInterpreter},
677     {1, AC_WRITE, 0, nullptr, 0x0102, AUTO, "PreviewImageLength", &stdInterpreter},
678     {0, AC_WRITE, 0, nullptr, 0x0200, AUTO, "ExposureMode", &olExposureModeInterpreter},
679     {0, AC_WRITE, 0, nullptr, 0x0201, AUTO, "AELock", &olOnOffInterpreter},
680     {0, AC_WRITE, 0, nullptr, 0x0202, AUTO, "MeteringMode", &olMeteringModeInterpreter},
681     {0, AC_WRITE, 0, nullptr, 0x0300, AUTO, "MacroMode", &olOnOffInterpreter},
682     {0, AC_WRITE, 0, nullptr, 0x0301, AUTO, "FocusMode", &olFocusModeInterpreter},
683     {0, AC_WRITE, 0, nullptr, 0x0302, AUTO, "FocusProcess", &stdInterpreter},
684     {0, AC_WRITE, 0, nullptr, 0x0303, AUTO, "AFSearch", &stdInterpreter},
685     {0, AC_WRITE, 0, nullptr, 0x0304, AUTO, "AFAreas", &stdInterpreter},
686     {0, AC_WRITE, 0, nullptr, 0x0400, AUTO, "FlashMode", &stdInterpreter},
687     {0, AC_WRITE, 0, nullptr, 0x0401, AUTO, "FlashExposureComp", &stdInterpreter},
688     {0, AC_WRITE, 0, nullptr, 0x0500, AUTO, "WhiteBalance2", &olWhitebalance2Interpreter},
689     {0, AC_WRITE, 0, nullptr, 0x0501, AUTO, "WhiteBalanceTemperature", &stdInterpreter},
690     {0, AC_WRITE, 0, nullptr, 0x0502, AUTO, "WhiteBalanceBracket", &stdInterpreter},
691     {0, AC_WRITE, 0, nullptr, 0x0503, AUTO, "CustomSaturation", &stdInterpreter},
692     {0, AC_WRITE, 0, nullptr, 0x0504, AUTO, "ModifiedSaturation", &stdInterpreter},
693     {0, AC_WRITE, 0, nullptr, 0x0505, AUTO, "ContrastSetting", &stdInterpreter},
694     {0, AC_WRITE, 0, nullptr, 0x0506, AUTO, "SharpnessSetting", &stdInterpreter},
695     {0, AC_WRITE, 0, nullptr, 0x0507, AUTO, "ColorSpace", &olColorSpaceInterpreter},
696     {0, AC_WRITE, 0, nullptr, 0x0509, AUTO, "SceneMode", &olSceneModeInterpreter},
697     {0, AC_WRITE, 0, nullptr, 0x050a, AUTO, "NoiseReduction", &olNoiseReductionInterpreter},
698     {0, AC_WRITE, 0, nullptr, 0x050b, AUTO, "DistortionCorrection", &olOnOffInterpreter},
699     {0, AC_WRITE, 0, nullptr, 0x050c, AUTO, "ShadingCompensation", &olOnOffInterpreter},
700     {0, AC_WRITE, 0, nullptr, 0x050d, AUTO, "CompressionFactor", &stdInterpreter},
701     {0, AC_WRITE, 0, nullptr, 0x050f, AUTO, "Gradation", &stdInterpreter},
702     {0, AC_WRITE, 0, nullptr, 0x0520, AUTO, "PictureMode", &olPictureModeInterpreter},
703     {0, AC_WRITE, 0, nullptr, 0x0521, AUTO, "PictureModeSaturation", &stdInterpreter},
704     {0, AC_WRITE, 0, nullptr, 0x0522, AUTO, "PictureModeHue", &stdInterpreter},
705     {0, AC_WRITE, 0, nullptr, 0x0523, AUTO, "PictureModeContrast", &stdInterpreter},
706     {0, AC_WRITE, 0, nullptr, 0x0524, AUTO, "PictureModeSharpness", &stdInterpreter},
707     {0, AC_WRITE, 0, nullptr, 0x0525, AUTO, "PictureModeBWFilter", &olPictureModeBWFilterInterpreter},
708     {0, AC_WRITE, 0, nullptr, 0x0526, AUTO, "PictureModeTone", &olPictureModeToneInterpreter},
709     {0, AC_WRITE, 0, nullptr, 0x0527, AUTO, "NoiseFilter", &olNoiseFilterInterpreter},
710     {0, AC_WRITE, 0, nullptr, 0x0600, AUTO, "DriveMode", &stdInterpreter},
711     {0, AC_WRITE, 0, nullptr, 0x0601, AUTO, "PanoramaMode", &stdInterpreter},
712     {0, AC_WRITE, 0, nullptr, 0x0603, AUTO, "ImageQuality2", &olImageQuality2Interpreter},
713     {0, AC_WRITE, 0, nullptr, 0x0900, AUTO, "ManometerPressure", &stdInterpreter},
714     {0, AC_WRITE, 0, nullptr, 0x0901, AUTO, "ManometerReading", &stdInterpreter},
715     {0, AC_WRITE, 0, nullptr, 0x0902, AUTO, "ExtendedWBDetect", &olOnOffInterpreter},
716     { -1, AC_DONTWRITE, 0,  nullptr, 0, AUTO, "", nullptr}
717 };
718 
719 const TagAttrib olyEquipmentAttribs[] = {
720     {0, AC_WRITE, 0, nullptr, 0x0000, AUTO, "EquipmentVersion", &stdInterpreter},
721     {0, AC_WRITE, 0, nullptr, 0x0100, AUTO, "CameraType2", &stdInterpreter},
722     {0, AC_WRITE, 0, nullptr, 0x0101, AUTO, "SerialNumber", &stdInterpreter},
723     {0, AC_WRITE, 0, nullptr, 0x0102, AUTO, "InternalSerialNumber", &stdInterpreter},
724     {0, AC_WRITE, 0, nullptr, 0x0103, AUTO, "FocalPlaneDiagonal", &stdInterpreter},
725     {0, AC_WRITE, 0, nullptr, 0x0104, AUTO, "BodyFirmwareVersion", &stdInterpreter},
726     {0, AC_WRITE, 0, nullptr, 0x0201, AUTO, "LensType", &olLensTypeInterpreter},
727     {0, AC_WRITE, 0, nullptr, 0x0202, AUTO, "LensSerialNumber", &stdInterpreter},
728     {0, AC_WRITE, 0, nullptr, 0x0204, AUTO, "LensFirmwareVersion", &stdInterpreter},
729     {0, AC_WRITE, 0, nullptr, 0x0205, AUTO, "MaxApertureAtMinFocal", &olApertureInterpreter},
730     {0, AC_WRITE, 0, nullptr, 0x0206, AUTO, "MaxApertureAtMaxFocal", &olApertureInterpreter},
731     {0, AC_WRITE, 0, nullptr, 0x0207, AUTO, "MinFocalLength", &stdInterpreter},
732     {0, AC_WRITE, 0, nullptr, 0x0208, AUTO, "MaxFocalLength", &stdInterpreter},
733     {0, AC_WRITE, 0, nullptr, 0x020a, AUTO, "MaxApertureAtCurrentFocal", &olApertureInterpreter},
734     {0, AC_WRITE, 0, nullptr, 0x020b, AUTO, "LensProperties", &stdInterpreter},
735     {0, AC_WRITE, 0, nullptr, 0x0301, AUTO, "Extender", &stdInterpreter},
736     {0, AC_WRITE, 0, nullptr, 0x0302, AUTO, "ExtenderSerialNumber", &stdInterpreter},
737     {0, AC_WRITE, 0, nullptr, 0x0303, AUTO, "ExtenderModel", &stdInterpreter},
738     {0, AC_WRITE, 0, nullptr, 0x0304, AUTO, "ExtenderFirmwareVersion", &stdInterpreter},
739     {0, AC_WRITE, 0, nullptr, 0x1000, AUTO, "FlashType", &olFlashTypeInterpreter},
740     {0, AC_WRITE, 0, nullptr, 0x1001, AUTO, "FlashModel", &olFlashModelInterpreter},
741     {0, AC_WRITE, 0, nullptr, 0x1002, AUTO, "FlashFirmwareVersion", &stdInterpreter},
742     {0, AC_WRITE, 0, nullptr, 0x1003, AUTO, "FlashSerialNumber", &stdInterpreter},
743     { -1, AC_DONTWRITE, 0,  nullptr, 0, AUTO, "", nullptr}
744 };
745 
746 const TagAttrib olympusAttribs[] = {
747     {0, AC_WRITE,  0, nullptr, 0x0104, AUTO, "BodyFirmwareVersion", &stdInterpreter},
748     {0, AC_WRITE,  0, nullptr, 0x0200, AUTO, "SpecialMode", &stdInterpreter},
749     {0, AC_WRITE,  0, nullptr, 0x0201, AUTO, "Quality", &stdInterpreter},
750     {0, AC_WRITE,  0, nullptr, 0x0202, AUTO, "Macro", &olOnOffInterpreter},
751     {0, AC_WRITE,  0, nullptr, 0x0203, AUTO, "BWMode", &olOnOffInterpreter},
752     {0, AC_WRITE,  0, nullptr, 0x0204, AUTO, "DigitalZoom", &stdInterpreter},
753     {0, AC_WRITE,  0, nullptr, 0x0205, AUTO, "FocalPlaneDiagonal", &stdInterpreter},
754     {0, AC_WRITE,  0, nullptr, 0x0206, AUTO, "LensDistortionParams", &stdInterpreter},
755     {0, AC_WRITE,  0, nullptr, 0x0207, AUTO, "CameraType", &stdInterpreter},
756     {1, AC_WRITE,  0, nullptr, 0x0208, AUTO, "TextInfo", &stdInterpreter},
757     {0, AC_WRITE,  0, nullptr, 0x0209, AUTO, "CameraID", &stdInterpreter},
758     {0, AC_WRITE,  0, nullptr, 0x020b, AUTO, "EpsonImageWidth", &stdInterpreter},
759     {0, AC_WRITE,  0, nullptr, 0x020c, AUTO, "EpsonImageHeight", &stdInterpreter},
760     {0, AC_WRITE,  0, nullptr, 0x020d, AUTO, "EpsonSoftware", &stdInterpreter},
761     {0, AC_SYSTEM, 0, nullptr, 0x0280, AUTO, "PreviewImage", &stdInterpreter},
762     {0, AC_WRITE,  0, nullptr, 0x0300, AUTO, "PreCaptureFrames", &stdInterpreter},
763     {0, AC_WRITE,  0, nullptr, 0x0301, AUTO, "WhiteBoard", &stdInterpreter},
764     {0, AC_WRITE,  0, nullptr, 0x0302, AUTO, "OneTouchWB", &olOnOffInterpreter},
765     {0, AC_WRITE,  0, nullptr, 0x0303, AUTO, "WhiteBalanceBracket", &stdInterpreter},
766     {0, AC_WRITE,  0, nullptr, 0x0304, AUTO, "WhiteBalanceBias", &stdInterpreter},
767     {0, AC_WRITE,  0, nullptr, 0x0403, AUTO, "SceneMode", &stdInterpreter},
768     {0, AC_WRITE,  0, nullptr, 0x0404, AUTO, "SerialNumber", &stdInterpreter},
769     {0, AC_WRITE,  0, nullptr, 0x0405, AUTO, "Firmware", &stdInterpreter},
770     {1, AC_WRITE,  0, nullptr, 0x0e00, AUTO, "PrintIM", &stdInterpreter},
771     {0, AC_WRITE,  0, nullptr, 0x0f00, AUTO, "DataDump", &stdInterpreter},
772     {0, AC_WRITE,  0, nullptr, 0x0f01, AUTO, "DataDump2", &stdInterpreter},
773     {0, AC_WRITE,  0, nullptr, 0x1000, AUTO, "ShutterSpeedValue", &stdInterpreter},
774     {0, AC_WRITE,  0, nullptr, 0x1001, AUTO, "ISOValue", &stdInterpreter},
775     {0, AC_WRITE,  0, nullptr, 0x1002, AUTO, "ApertureValue", &stdInterpreter},
776     {0, AC_WRITE,  0, nullptr, 0x1003, AUTO, "BrightnessValue", &stdInterpreter},
777     {0, AC_WRITE,  0, nullptr, 0x1004, AUTO, "FlashMode", &stdInterpreter},
778     {0, AC_WRITE,  0, nullptr, 0x1005, AUTO, "FlashDevice", &stdInterpreter},
779     {0, AC_WRITE,  0, nullptr, 0x1006, AUTO, "ExposureCompensation", &stdInterpreter},
780     {0, AC_WRITE,  0, nullptr, 0x1007, AUTO, "SensorTemperature", &stdInterpreter},
781     {0, AC_WRITE,  0, nullptr, 0x1008, AUTO, "LensTemperature", &stdInterpreter},
782     {0, AC_WRITE,  0, nullptr, 0x1009, AUTO, "LightCondition", &stdInterpreter},
783     {0, AC_WRITE,  0, nullptr, 0x100a, AUTO, "FocusRange", &stdInterpreter},
784     {0, AC_WRITE,  0, nullptr, 0x100b, AUTO, "FocusMode", &stdInterpreter},
785     {0, AC_WRITE,  0, nullptr, 0x100c, AUTO, "ManualFocusDistance", &stdInterpreter},
786     {0, AC_WRITE,  0, nullptr, 0x100d, AUTO, "ZoomStepCount", &stdInterpreter},
787     {0, AC_WRITE,  0, nullptr, 0x100e, AUTO, "FocusStepCount", &stdInterpreter},
788     {0, AC_WRITE,  0, nullptr, 0x100f, AUTO, "Sharpness", &stdInterpreter},
789     {0, AC_WRITE,  0, nullptr, 0x1010, AUTO, "FlashChargeLevel", &stdInterpreter},
790     {0, AC_WRITE,  0, nullptr, 0x1011, AUTO, "ColorMatrix", &stdInterpreter},
791     {0, AC_WRITE,  0, nullptr, 0x1012, AUTO, "BlackLevel", &stdInterpreter},
792     {0, AC_WRITE,  0, nullptr, 0x1013, AUTO, "ColorTemperatureBG", &stdInterpreter},
793     {0, AC_WRITE,  0, nullptr, 0x1014, AUTO, "ColorTemperatureRG", &stdInterpreter},
794     {0, AC_WRITE,  0, nullptr, 0x1015, AUTO, "WBMode", &stdInterpreter},
795     {0, AC_WRITE,  0, nullptr, 0x1017, AUTO, "RedBalance", &stdInterpreter},
796     {0, AC_WRITE,  0, nullptr, 0x1018, AUTO, "BlueBalance", &stdInterpreter},
797     {0, AC_WRITE,  0, nullptr, 0x1019, AUTO, "ColorMatrixNumber", &stdInterpreter},
798     {0, AC_WRITE,  0, nullptr, 0x101a, AUTO, "SerialNumber", &stdInterpreter},
799     {0, AC_WRITE,  0, nullptr, 0x101b, AUTO, "ExternalFlashAE1_0", &stdInterpreter},
800     {0, AC_WRITE,  0, nullptr, 0x101c, AUTO, "ExternalFlashAE2_0", &stdInterpreter},
801     {0, AC_WRITE,  0, nullptr, 0x101d, AUTO, "InternalFlashAE1_0", &stdInterpreter},
802     {0, AC_WRITE,  0, nullptr, 0x101e, AUTO, "InternalFlashAE2_0", &stdInterpreter},
803     {0, AC_WRITE,  0, nullptr, 0x101f, AUTO, "ExternalFlashAE1", &stdInterpreter},
804     {0, AC_WRITE,  0, nullptr, 0x1020, AUTO, "ExternalFlashAE2", &stdInterpreter},
805     {0, AC_WRITE,  0, nullptr, 0x1021, AUTO, "InternalFlashAE1", &stdInterpreter},
806     {0, AC_WRITE,  0, nullptr, 0x1022, AUTO, "InternalFlashAE2", &stdInterpreter},
807     {0, AC_WRITE,  0, nullptr, 0x1023, AUTO, "FlashExposureComp", &stdInterpreter},
808     {0, AC_WRITE,  0, nullptr, 0x1024, AUTO, "InternalFlashTable", &stdInterpreter},
809     {0, AC_WRITE,  0, nullptr, 0x1025, AUTO, "ExternalFlashGValue", &stdInterpreter},
810     {0, AC_WRITE,  0, nullptr, 0x1026, AUTO, "ExternalFlashBounce", &olYesNoInterpreter},
811     {0, AC_WRITE,  0, nullptr, 0x1027, AUTO, "ExternalFlashZoom", &stdInterpreter},
812     {0, AC_WRITE,  0, nullptr, 0x1028, AUTO, "ExternalFlashMode", &stdInterpreter},
813     {0, AC_WRITE,  0, nullptr, 0x1029, AUTO, "Contrast", &stdInterpreter},
814     {0, AC_WRITE,  0, nullptr, 0x102a, AUTO, "SharpnessFactor", &stdInterpreter},
815     {0, AC_WRITE,  0, nullptr, 0x102b, AUTO, "ColorControl", &stdInterpreter},
816     {0, AC_WRITE,  0, nullptr, 0x102c, AUTO, "ValidBits", &stdInterpreter},
817     {0, AC_WRITE,  0, nullptr, 0x102d, AUTO, "CoringFilter", &stdInterpreter},
818     {0, AC_WRITE,  0, nullptr, 0x102e, AUTO, "OlympusImageWidth", &stdInterpreter},
819     {0, AC_WRITE,  0, nullptr, 0x102f, AUTO, "OlympusImageHeight", &stdInterpreter},
820     {0, AC_WRITE,  0, nullptr, 0x1030, AUTO, "SceneDetect", &stdInterpreter},
821     {0, AC_WRITE,  0, nullptr, 0x1031, AUTO, "SceneArea", &stdInterpreter},
822     {0, AC_WRITE,  0, nullptr, 0x1033, AUTO, "SceneDetectData", &stdInterpreter},
823     {0, AC_WRITE,  0, nullptr, 0x1034, AUTO, "CompressionRatio", &stdInterpreter},
824     {1, AC_WRITE,  0, nullptr, 0x1035, AUTO, "PreviewImageValid", &olYesNoInterpreter},
825     {1, AC_WRITE,  0, nullptr, 0x1036, AUTO, "PreviewImageStart", &stdInterpreter},
826     {1, AC_WRITE,  0, nullptr, 0x1037, AUTO, "PreviewImageLength", &stdInterpreter},
827     {0, AC_WRITE,  0, nullptr, 0x1038, AUTO, "AFResult", &stdInterpreter},
828     {0, AC_WRITE,  0, nullptr, 0x1039, AUTO, "CCDScanMode", &stdInterpreter},
829     {0, AC_WRITE,  0, nullptr, 0x103a, AUTO, "NoiseReduction", &olOnOffInterpreter},
830     {0, AC_WRITE,  0, nullptr, 0x103b, AUTO, "InfinityLensStep", &stdInterpreter},
831     {0, AC_WRITE,  0, nullptr, 0x103c, AUTO, "NearLensStep", &stdInterpreter},
832     {0, AC_WRITE,  0, nullptr, 0x103d, AUTO, "LightValueCenter", &stdInterpreter},
833     {0, AC_WRITE,  0, nullptr, 0x103e, AUTO, "LightValuePeriphery", &stdInterpreter},
834     {0, AC_WRITE,  0, nullptr, 0x103f, AUTO, "FieldCount", &stdInterpreter},
835     {0, AC_WRITE,  0, olyEquipmentAttribs, 0x2010, AUTO, "Equipment", &stdInterpreter},
836     {0, AC_WRITE,  0, olyCameraSettingsAttribs, 0x2020, AUTO, "CameraSettings", &stdInterpreter},
837     {0, AC_WRITE,  0, olyRawDevelopmentAttribs, 0x2030, AUTO, "RawDevelopment", &stdInterpreter},
838     {0, AC_WRITE,  0, olyRawDevelopment2Attribs, 0x2031, AUTO, "RawDev2", &stdInterpreter},
839     {0, AC_WRITE,  0, olyImageProcessingAttribs, 0x2040, AUTO, "ImageProcessing", &stdInterpreter},
840     {0, AC_WRITE,  0, olyFocusInfoAttribs, 0x2050, AUTO, "FocusInfo", &stdInterpreter},
841     {1, AC_WRITE,  0, nullptr, 0x2100, AUTO, "Olympus2100", &stdInterpreter},
842     {1, AC_WRITE,  0, nullptr, 0x2300, AUTO, "Olympus2300", &stdInterpreter},
843     {1, AC_WRITE,  0, nullptr, 0x2400, AUTO, "Olympus2400", &stdInterpreter},
844     {1, AC_WRITE,  0, nullptr, 0x2500, AUTO, "Olympus2500", &stdInterpreter},
845     {1, AC_WRITE,  0, nullptr, 0x2600, AUTO, "Olympus2600", &stdInterpreter},
846     {1, AC_WRITE,  0, nullptr, 0x2700, AUTO, "Olympus2700", &stdInterpreter},
847     {1, AC_WRITE,  0, nullptr, 0x2800, AUTO, "Olympus2800", &stdInterpreter},
848     {1, AC_WRITE,  0, nullptr, 0x2900, AUTO, "Olympus2900", &stdInterpreter},
849     {0, AC_WRITE,  0, nullptr, 0x3000, AUTO, "RawInfo", &stdInterpreter},
850     { -1, AC_DONTWRITE, 0,  nullptr, 0, AUTO, "", nullptr}
851 };
852 }
853 #endif
854 
855