Coverage Report

Created: 2026-03-20 07:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libexif/libexif/olympus/mnote-olympus-entry.c
Line
Count
Source
1
/* mnote-olympus-entry.c
2
 *
3
 * Copyright (c) 2002-2009 Lutz Mueller <lutz@users.sourceforge.net> et. al.
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU Lesser General Public
7
 * License as published by the Free Software Foundation; either
8
 * version 2 of the License, or (at your option) any later version.
9
 *
10
 * This library is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
 * Lesser General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU Lesser General Public
16
 * License along with this library; if not, write to the
17
 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18
 * Boston, MA  02110-1301  USA.
19
 *
20
 * SPDX-License-Identifier: LGPL-2.0-or-later
21
 */
22
23
#include <config.h>
24
#include "mnote-olympus-entry.h"
25
26
#include <stdio.h>
27
#include <stdlib.h>
28
#include <string.h>
29
30
#include <libexif/exif-format.h>
31
#include <libexif/exif-utils.h>
32
#include <libexif/exif-entry.h>
33
#include <libexif/i18n.h>
34
35
40.0k
#define CF(format,target,v,maxlen)                              \
36
40.0k
{                                                               \
37
40.0k
        if (format != target) {                                 \
38
11.4k
                snprintf (v, maxlen,                          \
39
11.4k
                        _("Invalid format '%s', "               \
40
11.4k
                        "expected '%s'."),                      \
41
11.4k
                        exif_format_get_name (format),          \
42
11.4k
                        exif_format_get_name (target));         \
43
11.4k
                break;                                          \
44
11.4k
        }                                                       \
45
40.0k
}
46
47
666
#define CF2(format,target1,target2,v,maxlen)                    \
48
666
{                                                               \
49
666
        if ((format != target1) && (format != target2)) {       \
50
336
                snprintf (v, maxlen,                          \
51
336
                        _("Invalid format '%s', "               \
52
336
                        "expected '%s' or '%s'."),              \
53
336
                        exif_format_get_name (format),          \
54
336
                        exif_format_get_name (target1),         \
55
336
                        exif_format_get_name (target2));        \
56
336
                break;                                          \
57
336
        }                                                       \
58
666
}
59
60
34.9k
#define CC(number,target,v,maxlen)                                      \
61
34.9k
{                                                                       \
62
34.9k
        if (number != target) {                                         \
63
10.4k
                snprintf (v, maxlen,                                    \
64
10.4k
                        _("Invalid number of components (%i, "          \
65
10.4k
                        "expected %i)."), (int) number, (int) target);  \
66
10.4k
                break;                                                  \
67
10.4k
        }                                                               \
68
34.9k
}
69
70
834
#define CC2(number,t1,t2,v,maxlen)                                      \
71
834
{                                                                       \
72
834
  if ((number < t1) || (number > t2)) {                           \
73
528
    snprintf (v, maxlen,                                    \
74
528
      _("Invalid number of components (%i, "          \
75
528
      "expected %i or %i)."), (int) number,   \
76
528
      (int) t1, (int) t2);          \
77
528
    break;                                                  \
78
528
  }                                                               \
79
834
}
80
81
2.49k
#define R2L(n) ((n).denominator ? (unsigned long)(n).numerator/(n).denominator : 0L)
82
7.64k
#define R2D(n) ((n).denominator ? (double)(n).numerator/(n).denominator : 0.0)
83
84
static const struct {
85
  MnoteOlympusTag tag;
86
  ExifFormat fmt;
87
  struct {
88
    int index;
89
    const char *string;
90
  } elem[24];
91
} items[] = {
92
#ifndef NO_VERBOSE_TAG_DATA
93
  { MNOTE_NIKON_TAG_LENSTYPE, EXIF_FORMAT_BYTE,
94
    { {0, N_("AF non D lens")},
95
      {1, N_("Manual")},
96
      {2, N_("AF-D or AF-S lens")},
97
      {6, N_("AF-D G lens")},
98
      {10, N_("AF-D VR lens")},
99
      {14, N_("AF-D G VR lens")},
100
      {0, NULL}}},
101
  { MNOTE_NIKON_TAG_FLASHUSED, EXIF_FORMAT_BYTE,
102
    { {0, N_("Flash did not fire")},
103
      {4, N_("Flash unit unknown")},
104
      {7, N_("Flash is external")},
105
      {9, N_("Flash is on camera")},
106
      {0, NULL}}},
107
  { MNOTE_NIKON1_TAG_QUALITY, EXIF_FORMAT_SHORT,
108
    { {1, N_("VGA basic")},
109
      {2, N_("VGA normal")},
110
      {3, N_("VGA fine")},
111
      {4, N_("SXGA basic")},
112
      {5, N_("SXGA normal")},
113
      {6, N_("SXGA fine")},
114
      {10, N_("2 Mpixel basic")},
115
      {11, N_("2 Mpixel normal")},
116
      {12, N_("2 Mpixel fine")},
117
      {0, NULL}}},
118
  { MNOTE_NIKON1_TAG_COLORMODE, EXIF_FORMAT_SHORT,
119
    { {1, N_("Color")},
120
      {2, N_("Monochrome")},
121
      {0, NULL}}},
122
  { MNOTE_NIKON1_TAG_IMAGEADJUSTMENT, EXIF_FORMAT_SHORT,
123
    { {0, N_("Normal")},
124
      {1, N_("Bright+")},
125
      {2, N_("Bright-")},
126
      {3, N_("Contrast+")},
127
      {4, N_("Contrast-")},
128
      {0, NULL}}},
129
  { MNOTE_NIKON1_TAG_CCDSENSITIVITY, EXIF_FORMAT_SHORT,
130
    { {0, N_("ISO 80")},
131
      {2, N_("ISO 160")},
132
      {4, N_("ISO 320")},
133
      {5, N_("ISO 100")},
134
      {0, NULL}}},
135
  { MNOTE_NIKON1_TAG_WHITEBALANCE, EXIF_FORMAT_SHORT,
136
    { {0, N_("Auto")},
137
      {1, N_("Preset")},
138
      {2, N_("Daylight")},
139
      {3, N_("Incandescence")},
140
      {4, N_("Fluorescence")},
141
      {5, N_("Cloudy")},
142
      {6, N_("SpeedLight")},
143
      {0, NULL}}},
144
  { MNOTE_NIKON1_TAG_CONVERTER, EXIF_FORMAT_SHORT,
145
    { {0, N_("No fisheye")},
146
      {1, N_("Fisheye on")},
147
      {0, NULL}}},
148
  { MNOTE_OLYMPUS_TAG_QUALITY, EXIF_FORMAT_SHORT,
149
    { {1, N_("Normal, SQ")},
150
      {2, N_("Normal, HQ")},
151
      {3, N_("Normal, SHQ")},
152
      {4, N_("Normal, RAW")},
153
      {5, N_("Normal, SQ1")},
154
      {6, N_("Normal, SQ2")},
155
      {7, N_("Normal, super high")},
156
      {17, N_("Normal, standard")},
157
      {0x101, N_("Fine, SQ")},
158
      {0x102, N_("Fine, HQ")},
159
      {0x103, N_("Fine, SHQ")},
160
      {0x104, N_("Fine, RAW")},
161
      {0x105, N_("Fine, SQ1")},
162
      {0x106, N_("Fine, SQ2")},
163
      {0x107, N_("Fine, super high")},
164
      {0x201, N_("Super fine, SQ")},
165
      {0x202, N_("Super fine, HQ")},
166
      {0x203, N_("Super fine, SHQ")},
167
      {0x204, N_("Super fine, RAW")},
168
      {0x205, N_("Super fine, SQ1")},
169
      {0x206, N_("Super fine, SQ2")},
170
      {0x207, N_("Super fine, super high")},
171
      {0x211, N_("Super fine, high")},
172
      {0, NULL}}},
173
  { MNOTE_OLYMPUS_TAG_MACRO, EXIF_FORMAT_SHORT,
174
    { {0, N_("No")},
175
      {1, N_("Yes")},
176
      {2, N_("Super macro")},
177
      {0, NULL}}},
178
  { MNOTE_OLYMPUS_TAG_BWMODE, EXIF_FORMAT_SHORT,
179
    { {0, N_("No")},
180
      {1, N_("Yes")},
181
      {0, NULL}}},
182
  { MNOTE_OLYMPUS_TAG_ONETOUCHWB, EXIF_FORMAT_SHORT,
183
    { {0, N_("Off")},
184
      {1, N_("On")},
185
      {2, N_("On (Preset)")},
186
      {0, NULL}}},
187
  { MNOTE_OLYMPUS_TAG_FLASHMODE, EXIF_FORMAT_SHORT,
188
    { {0, N_("Auto")},
189
      {1, N_("Red-eye reduction")},
190
      {2, N_("Fill")},
191
      {3, N_("Off")},
192
      {0, NULL}}},
193
  { MNOTE_OLYMPUS_TAG_FLASHDEVICE, EXIF_FORMAT_SHORT,
194
    { {0, N_("None")},
195
      {1, N_("Internal")},
196
      {4, N_("External")},
197
      {5, N_("Internal + external")},
198
      {0, NULL}}},
199
  { MNOTE_OLYMPUS_TAG_FOCUSRANGE, EXIF_FORMAT_SHORT,
200
    { {0, N_("Normal")},
201
      {1, N_("Macro")},
202
      {0, NULL}}},
203
  { MNOTE_OLYMPUS_TAG_MANFOCUS, EXIF_FORMAT_SHORT,
204
    { {0, N_("Auto")},
205
      {1, N_("Manual")},
206
      {0, NULL}}},
207
  { MNOTE_OLYMPUS_TAG_SHARPNESS, EXIF_FORMAT_SHORT,
208
    { {0, N_("Normal")},
209
      {1, N_("Hard")},
210
      {2, N_("Soft")},
211
      {0, NULL}}},
212
  { MNOTE_OLYMPUS_TAG_EXTERNALFLASHBOUNCE, EXIF_FORMAT_SHORT,
213
    { {0, N_("No")},
214
      {1, N_("Yes")},
215
      {0, NULL}}},
216
  { MNOTE_OLYMPUS_TAG_CONTRAST, EXIF_FORMAT_SHORT,
217
    { {0, N_("Hard")},
218
      {1, N_("Normal")},
219
      {2, N_("Soft")},
220
      {0, NULL}}},
221
  { MNOTE_OLYMPUS_TAG_PREVIEWIMAGEVALID, EXIF_FORMAT_LONG,
222
    { {0, N_("No")},
223
      {1, N_("Yes")},
224
      {0, NULL}}},
225
  { MNOTE_OLYMPUS_TAG_CCDSCANMODE, EXIF_FORMAT_SHORT,
226
    { {0, N_("Interlaced")},
227
      {1, N_("Progressive")},
228
      {0, NULL}}},
229
230
  { MNOTE_SANYO_TAG_SEQUENTIALSHOT, EXIF_FORMAT_SHORT,
231
    { {0, N_("None")},
232
      {1, N_("Standard")},
233
      {2, N_("Best")},
234
      {3, N_("Adjust exposure")},
235
      {0, NULL}}},
236
  { MNOTE_SANYO_TAG_FOCUSMODE, EXIF_FORMAT_SHORT,
237
    { {1, N_("Spot focus")},
238
      {2, N_("Normal focus")},
239
      {0, NULL}}},
240
  { MNOTE_SANYO_TAG_RECORDSHUTTERRELEASE, EXIF_FORMAT_SHORT,
241
    { {0, N_("Record while down")},
242
      {1, N_("Press start, press stop")},
243
      {0, NULL}}},
244
  { MNOTE_SANYO_TAG_RESAVED, EXIF_FORMAT_SHORT,
245
    { {0, N_("No")},
246
      {1, N_("Yes")},
247
      {0, NULL}}},
248
  { MNOTE_SANYO_TAG_CCDSENSITIVITY, EXIF_FORMAT_SHORT,
249
    { {0, N_("Auto")},
250
      {1, N_("ISO 50")},
251
      {3, N_("ISO 100")},
252
      {4, N_("ISO 200")},
253
      {5, N_("ISO 400")},
254
      {0, NULL}}},
255
  { MNOTE_SANYO_TAG_SCENESELECT, EXIF_FORMAT_SHORT,
256
    { {0, N_("Off")},
257
      {1, N_("Sport")},
258
      {2, N_("TV")},
259
      {3, N_("Night")},
260
      {4, N_("User 1")},
261
      {5, N_("User 2")},
262
      {6, N_("Lamp")},
263
      {0, NULL}}},
264
  { MNOTE_SANYO_TAG_SEQUENCESHOTINTERVAL, EXIF_FORMAT_SHORT,
265
    { {0, N_("5 frames/sec")},
266
      {1, N_("10 frames/sec")},
267
      {2, N_("15 frames/sec")},
268
      {3, N_("20 frames/sec")},
269
      {0, NULL}}},
270
#endif
271
  { 0, 0, { { 0, NULL } } }
272
};
273
274
char *
275
mnote_olympus_entry_get_value (MnoteOlympusEntry *entry, char *v, unsigned int maxlen)
276
51.5k
{
277
51.5k
  char         buf[30];
278
51.5k
  ExifLong     vl;
279
51.5k
  ExifSLong    vsl;
280
51.5k
  ExifShort    vs = 0;
281
51.5k
  ExifSShort   vss = 0;
282
51.5k
  ExifRational vr, vr2;
283
51.5k
  ExifSRational vsr;
284
51.5k
  int          i, j;
285
51.5k
  double       r, b;
286
287
51.5k
  if (!entry)
288
0
    return (NULL);
289
51.5k
  if (maxlen < 1)
290
0
    return NULL;
291
292
51.5k
  memset (v, 0, maxlen);
293
51.5k
  maxlen--;
294
295
51.5k
  if ((!entry->data) && (entry->components > 0)) 
296
3.56k
    return (v);
297
298
47.9k
  if ((!entry->data) && (entry->size > 0))
299
0
    return NULL;  /* internal inconsistency error */
300
301
47.9k
  switch (entry->tag) {
302
  
303
  /* Nikon */
304
675
  case MNOTE_NIKON_TAG_FIRMWARE:
305
675
    CF (entry->format,  EXIF_FORMAT_UNDEFINED, v, maxlen)
306
410
    CC (entry->components, 4, v, maxlen)
307
317
    vl = exif_get_long (entry->data, EXIF_BYTE_ORDER_INTEL);
308
317
    if ((vl & 0xF0F0F0F0) == 0x30303030) {
309
67
      memcpy (v, entry->data, MIN (maxlen, 4));
310
250
    } else {
311
250
      snprintf (v, maxlen, "%04lx", (long unsigned int) vl);
312
250
    }
313
317
    break;
314
659
  case MNOTE_NIKON_TAG_ISO:
315
659
                CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
316
421
                CC (entry->components, 2, v, maxlen)
317
                /*vs = exif_get_short (entry->data, entry->order);*/
318
195
                vs = exif_get_short (entry->data + 2, entry->order);
319
195
                snprintf (v, maxlen, "ISO %hd", vs);
320
195
                break;
321
480
  case MNOTE_NIKON_TAG_ISO2:
322
480
                CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
323
272
                CC (entry->components, 2, v, maxlen)
324
                /*vs = exif_get_short (entry->data, entry->order);*/
325
66
                vs = exif_get_short (entry->data + 2, entry->order);
326
66
                snprintf (v, maxlen, "ISO2 %hd", vs);
327
66
                break;
328
218
  case MNOTE_NIKON_TAG_QUALITY:
329
478
  case MNOTE_NIKON_TAG_COLORMODE:
330
850
  case MNOTE_NIKON_TAG_COLORMODE1:
331
1.15k
  case MNOTE_NIKON_TAG_WHITEBALANCE:
332
1.38k
  case MNOTE_NIKON_TAG_SHARPENING:
333
1.66k
  case MNOTE_NIKON_TAG_FOCUSMODE:
334
2.02k
  case MNOTE_NIKON_TAG_FLASHSETTING:
335
2.27k
  case MNOTE_NIKON_TAG_ISOSELECTION:
336
2.47k
  case MNOTE_NIKON_TAG_FLASHMODE:
337
2.69k
  case MNOTE_NIKON_TAG_IMAGEADJUSTMENT:
338
2.89k
  case MNOTE_NIKON_TAG_ADAPTER:
339
2.97k
  case MNOTE_NIKON_TAG_SATURATION2:
340
3.04k
  case MNOTE_EPSON_TAG_SOFTWARE:
341
3.04k
    CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
342
496
    memcpy(v, entry->data, MIN (maxlen, entry->size));
343
496
    break;
344
196
  case MNOTE_NIKON_TAG_TOTALPICTURES:
345
459
  case MNOTE_EPSON_TAG_IMAGE_WIDTH:
346
844
  case MNOTE_EPSON_TAG_IMAGE_HEIGHT:
347
844
    CF (entry->format, EXIF_FORMAT_LONG, v, maxlen)
348
567
    CC (entry->components, 1, v, maxlen)
349
231
    vl =  exif_get_long (entry->data, entry->order);
350
231
    snprintf (v, maxlen, "%lu",  (long unsigned int) vl );
351
231
    break;
352
565
  case MNOTE_NIKON_TAG_LENS_FSTOPS:
353
1.04k
  case MNOTE_NIKON_TAG_EXPOSUREDIFF: {
354
1.04k
    unsigned char h,m,l;
355
1.04k
    CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
356
840
    CC (entry->components, 4, v, maxlen)
357
547
    vl =  exif_get_long (entry->data, entry->order);
358
547
    h = (vl>>24)&0xff; m = (vl>>16)&0xff; l = (vl>>8)&0xff;
359
547
    snprintf (v, maxlen, "%.1f",  l?(double)h*((double)m/(double)l):0 );
360
547
    break;
361
840
  }
362
376
  case MNOTE_NIKON_TAG_FLASHEXPCOMPENSATION:
363
822
  case MNOTE_NIKON_TAG_FLASHEXPOSUREBRACKETVAL:
364
822
    CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
365
488
    CC (entry->components, 4, v, maxlen)
366
321
    vl =  exif_get_long (entry->data, entry->order);
367
321
    snprintf (v, maxlen, "%.1f",  ((long unsigned int) vl>>24)/6.0 );
368
321
    break;
369
709
  case MNOTE_NIKON_TAG_SATURATION:
370
967
  case MNOTE_NIKON_TAG_WHITEBALANCEFINE:
371
1.16k
  case MNOTE_NIKON_TAG_HUE:
372
1.37k
  case MNOTE_OLYMPUS_TAG_SENSORTEMPERATURE:
373
1.58k
  case MNOTE_OLYMPUS_TAG_LENSTEMPERATURE:
374
1.58k
    CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen)
375
849
    CC (entry->components, 1, v, maxlen)
376
427
    vs = exif_get_short (entry->data, entry->order);
377
427
    snprintf (v, maxlen, "%hd", vs);
378
427
    break;
379
1.28k
  case MNOTE_NIKON_TAG_WHITEBALANCERB:
380
1.28k
    CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
381
1.05k
    CC (entry->components, 4, v, maxlen)
382
818
    vr = exif_get_rational (entry->data, entry->order);
383
818
    r = R2D(vr);
384
818
    vr = exif_get_rational (entry->data+8, entry->order);
385
818
    b = R2D(vr);
386
818
    snprintf (v, maxlen, _("Red Correction %f, blue Correction %f"), r,b);
387
818
    break;
388
908
  case MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE:
389
908
    CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
390
768
    CC (entry->components, 1, v, maxlen)
391
557
    vr = exif_get_rational (entry->data, entry->order);
392
557
    if (!vr.numerator || !vr.denominator) {
393
263
      strncpy (v, _("No manual focus selection"), maxlen);
394
294
    } else {
395
294
      r = R2D(vr);
396
294
      snprintf (v, maxlen, _("%2.2f meters"), r);
397
294
    }
398
557
    break;
399
1.61k
  case MNOTE_NIKON_TAG_SENSORPIXELSIZE:
400
1.61k
    CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
401
1.38k
    CC (entry->components, 2, v, maxlen)
402
1.11k
    vr = exif_get_rational (entry->data, entry->order);
403
1.11k
    vr2 = exif_get_rational (entry->data+8, entry->order);
404
1.11k
    r = R2D(vr);
405
1.11k
    b = R2D(vr2);
406
1.11k
    snprintf (v, maxlen, "%2.2f x %2.2f um", r, b);
407
1.11k
    break;
408
666
  case MNOTE_NIKON_TAG_BRACKETING:
409
666
    CF2 (entry->format, EXIF_FORMAT_BYTE, EXIF_FORMAT_SHORT, v, maxlen)
410
330
    CC (entry->components, 1, v, maxlen)
411
132
    if (EXIF_FORMAT_SHORT == entry->format) {
412
66
      vs = exif_get_short (entry->data, entry->order);
413
66
    } else {
414
66
      vs = entry->data[0];
415
66
    }
416
132
    snprintf (v, maxlen, "%hd", vs);
417
132
    break;
418
2.62k
  case MNOTE_NIKON_TAG_AFFOCUSPOSITION:
419
2.62k
    CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
420
2.39k
    CC (entry->components, 4, v, maxlen)
421
2.09k
    switch (  *( entry->data+1)  ) {
422
218
        case  0: strncpy (v, _("AF position: center"), maxlen); break;
423
66
        case  1: strncpy (v, _("AF position: top"), maxlen); break;
424
141
        case  2: strncpy (v, _("AF position: bottom"), maxlen); break;
425
194
        case  3: strncpy (v, _("AF position: left"), maxlen); break;
426
201
        case  4: strncpy (v, _("AF position: right"), maxlen); break;
427
196
      case  5: strncpy (v, _("AF position: upper-left"), maxlen); break;
428
160
        case  6: strncpy (v, _("AF position: upper-right"), maxlen); break;
429
195
        case  7: strncpy (v, _("AF position: lower-left"), maxlen); break;
430
236
        case  8: strncpy (v, _("AF position: lower-right"), maxlen); break;
431
205
        case  9: strncpy (v, _("AF position: far left"), maxlen); break;
432
66
        case  10: strncpy (v, _("AF position: far right"), maxlen); break;
433
215
        default: strncpy (v, _("Unknown AF position"), maxlen);
434
2.09k
    }     
435
2.09k
    break;
436
2.09k
  case MNOTE_OLYMPUS_TAG_FLASHDEVICE:
437
1.40k
    CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
438
1.19k
    CC (entry->components, 2, v, maxlen)
439
995
    vs = exif_get_short(entry->data, entry->order);
440
    /* search for the tag */
441
13.9k
    for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++)
442
12.9k
      ;
443
995
    if (!items[i].tag) {
444
0
        snprintf (v, maxlen, _("Internal error (unknown value %hi)"), vs);
445
0
        break;
446
0
    }
447
995
    CF (entry->format, items[i].fmt, v, maxlen)
448
    /* find the value */
449
2.81k
    for (j = 0; items[i].elem[j].string &&
450
2.53k
          (items[i].elem[j].index < vs); j++);
451
995
    if (items[i].elem[j].index != vs) {
452
289
      snprintf (v, maxlen, _("Unknown value %hi"), vs);
453
289
      break;
454
289
    }
455
706
    strncpy (v, _(items[i].elem[j].string), maxlen);
456
706
    break;
457
1.18k
  case MNOTE_OLYMPUS_TAG_DIGIZOOM:
458
1.18k
    if (entry->format == EXIF_FORMAT_RATIONAL) {
459
900
      CC (entry->components, 1, v, maxlen)
460
754
      vr = exif_get_rational (entry->data, entry->order);
461
754
      if (!vr.numerator || !vr.denominator) {
462
422
        strncpy (v, _("None"), maxlen);
463
422
      } else {
464
332
        r = R2D(vr);
465
332
        snprintf (v, maxlen, "%2.2f", r);
466
332
      }
467
754
      break;
468
900
    }
469
    /* to handle SHORT version of this tag, */
470
    /* fall through */
471
476
  case MNOTE_NIKON_TAG_LENSTYPE:
472
840
  case MNOTE_NIKON_TAG_FLASHUSED:
473
1.05k
  case MNOTE_NIKON1_TAG_QUALITY:
474
1.31k
  case MNOTE_NIKON1_TAG_COLORMODE:
475
1.53k
  case MNOTE_NIKON1_TAG_IMAGEADJUSTMENT:
476
1.73k
  case MNOTE_NIKON1_TAG_CCDSENSITIVITY:
477
1.95k
  case MNOTE_NIKON1_TAG_WHITEBALANCE:
478
2.15k
  case MNOTE_NIKON1_TAG_CONVERTER:
479
2.46k
  case MNOTE_OLYMPUS_TAG_QUALITY:
480
2.69k
  case MNOTE_OLYMPUS_TAG_MACRO:
481
2.91k
  case MNOTE_OLYMPUS_TAG_BWMODE:
482
3.13k
  case MNOTE_OLYMPUS_TAG_ONETOUCHWB:
483
3.34k
  case MNOTE_OLYMPUS_TAG_FLASHMODE:
484
3.53k
  case MNOTE_OLYMPUS_TAG_FOCUSRANGE:
485
3.61k
  case MNOTE_OLYMPUS_TAG_MANFOCUS:
486
3.82k
  case MNOTE_OLYMPUS_TAG_SHARPNESS:
487
4.08k
  case MNOTE_OLYMPUS_TAG_EXTERNALFLASHBOUNCE:
488
4.57k
  case MNOTE_OLYMPUS_TAG_CONTRAST:
489
4.80k
  case MNOTE_OLYMPUS_TAG_PREVIEWIMAGEVALID:
490
5.00k
  case MNOTE_OLYMPUS_TAG_CCDSCANMODE:
491
5.24k
  case MNOTE_SANYO_TAG_SEQUENTIALSHOT:
492
5.45k
  case MNOTE_SANYO_TAG_FOCUSMODE:
493
5.66k
  case MNOTE_SANYO_TAG_RECORDSHUTTERRELEASE:
494
5.86k
  case MNOTE_SANYO_TAG_RESAVED:
495
6.06k
  case MNOTE_SANYO_TAG_CCDSENSITIVITY:
496
6.26k
  case MNOTE_SANYO_TAG_SCENESELECT:
497
6.51k
  case MNOTE_SANYO_TAG_SEQUENCESHOTINTERVAL:
498
6.51k
    CC (entry->components, 1, v, maxlen)
499
3.71k
    switch (entry->format) {
500
826
    case EXIF_FORMAT_BYTE:
501
1.10k
    case EXIF_FORMAT_UNDEFINED:
502
1.10k
      vs = entry->data[0];
503
1.10k
      break;
504
1.62k
    case EXIF_FORMAT_SHORT:
505
1.62k
      vs = exif_get_short(entry->data, entry->order);
506
1.62k
      break;
507
987
    default:
508
987
      vs = 0;
509
987
      break;
510
3.71k
    }
511
    /* search for the tag */
512
60.5k
    for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++)
513
56.8k
      ;
514
3.71k
    if (!items[i].tag) {
515
209
        snprintf (v, maxlen, _("Internal error (unknown value %hi)"), vs);
516
209
        break;
517
209
    }
518
3.50k
    CF (entry->format, items[i].fmt, v, maxlen)
519
    /* find the value */
520
9.59k
    for (j = 0; items[i].elem[j].string &&
521
8.62k
          (items[i].elem[j].index < vs); j++);
522
1.92k
    if (items[i].elem[j].index != vs) {
523
1.01k
      snprintf (v, maxlen, _("Unknown value %hi"), vs);
524
1.01k
      break;
525
1.01k
    }
526
912
    strncpy (v, _(items[i].elem[j].string), maxlen);
527
912
    break;
528
78
  case MNOTE_OLYMPUS_TAG_NOISEREDUCTION:
529
296
  case MNOTE_SANYO_TAG_WIDERANGE:
530
418
  case MNOTE_SANYO_TAG_COLORADJUSTMENTMODE:
531
756
  case MNOTE_SANYO_TAG_QUICKSHOT:
532
1.01k
  case MNOTE_SANYO_TAG_VOICEMEMO:
533
1.13k
  case MNOTE_SANYO_TAG_FLICKERREDUCE:
534
1.46k
  case MNOTE_SANYO_TAG_OPTICALZOOM:
535
1.71k
  case MNOTE_SANYO_TAG_DIGITALZOOM:
536
2.13k
  case MNOTE_SANYO_TAG_LIGHTSOURCESPECIAL:
537
2.13k
    CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
538
1.58k
    CC (entry->components, 1, v, maxlen)
539
1.16k
    vs = exif_get_short (entry->data, entry->order);
540
1.16k
    switch (vs) {
541
341
    case 0:
542
341
      strncpy (v, _("Off"), maxlen);
543
341
      break;
544
335
    case 1:
545
335
      strncpy (v, _("On"), maxlen);
546
335
      break;
547
493
    default:
548
493
      sprintf (buf, _("Unknown %hu"), vs);
549
493
      strncat (v, buf, maxlen - strlen (v));
550
493
      break;
551
1.16k
    }
552
1.16k
    break;
553
1.16k
  case MNOTE_SANYO_TAG_SELFTIMER:
554
1.00k
    CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
555
789
    CC (entry->components, 1, v, maxlen)
556
572
    vs = exif_get_short (entry->data, entry->order);
557
572
    switch (vs) {
558
202
    case 0:
559
202
      strncpy (v, _("Off"), maxlen);
560
202
      break;
561
66
    case 1:
562
66
      strncpy (v, _("On"), maxlen);
563
66
      break;
564
66
    case 2:
565
66
      strncpy (v, _("2 sec."), maxlen);
566
66
      break;
567
238
    default:
568
238
      sprintf (buf, _("Unknown %hu"), vs);
569
238
      strncat (v, buf, maxlen - strlen (v));
570
238
      break;
571
572
    }
572
572
    break;
573
1.70k
  case MNOTE_NIKON_TAG_LENS:
574
1.70k
    CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
575
1.47k
    CC (entry->components, 4, v, maxlen)
576
1.24k
    {
577
1.24k
      double ao,ac;
578
1.24k
      unsigned long fs,fl;
579
1.24k
      vr = exif_get_rational (entry->data, entry->order);
580
1.24k
      fs = R2L(vr);
581
1.24k
      vr = exif_get_rational (entry->data+8, entry->order);
582
1.24k
      fl = R2L(vr);
583
1.24k
      vr = exif_get_rational (entry->data+16, entry->order);
584
1.24k
      ao = R2D(vr);
585
1.24k
      vr = exif_get_rational (entry->data+24, entry->order);
586
1.24k
      ac = R2D(vr);
587
1.24k
      snprintf (v, maxlen, "%ld-%ldmm 1:%3.1f - %3.1f",fs,fl,ao,ac);
588
1.24k
    }
589
1.24k
    break;
590
591
  /* Olympus */
592
2.29k
  case MNOTE_OLYMPUS_TAG_MODE:
593
2.29k
    CF (entry->format, EXIF_FORMAT_LONG, v, maxlen)
594
2.07k
    CC (entry->components, 3, v, maxlen)
595
1.84k
    vl = exif_get_long (entry->data, entry->order);
596
1.84k
    switch (vl) {
597
298
    case 0:
598
298
      strncpy (v, _("Normal"), maxlen);
599
298
      break;
600
194
    case 1:
601
194
      strncpy (v, _("Unknown"), maxlen);
602
194
      break;
603
225
    case 2:
604
225
      strncpy (v, _("Fast"), maxlen);
605
225
      break;
606
294
    case 3:
607
294
      strncpy (v, _("Panorama"), maxlen);
608
294
      break;
609
834
    default:
610
834
      snprintf (v, maxlen, "%li", (long int) vl);
611
1.84k
    }
612
1.84k
    vl = exif_get_long (entry->data + 4, entry->order);
613
1.84k
    snprintf (buf, sizeof (buf), "/%li/", (long int) vl);
614
1.84k
    strncat (v, buf, maxlen - strlen (v));
615
1.84k
    vl = exif_get_long (entry->data + 8, entry->order);
616
1.84k
    switch (vl) {
617
194
    case 1:
618
194
      strncat (v, _("Left to right"), maxlen - strlen (v));
619
194
      break;
620
195
    case 2:
621
195
      strncat (v, _("Right to left"), maxlen - strlen (v));
622
195
      break;
623
198
    case 3:
624
198
      strncat (v, _("Bottom to top"), maxlen - strlen (v));
625
198
      break;
626
194
    case 4:
627
194
      strncat (v, _("Top to bottom"), maxlen - strlen (v));
628
194
      break;
629
1.06k
    default:
630
1.06k
      snprintf (buf, sizeof (buf), "%li",
631
1.06k
          (long int) vl);
632
1.06k
      strncat (v, buf, maxlen - strlen (v));
633
1.84k
    }
634
1.84k
    break;
635
1.84k
  case MNOTE_OLYMPUS_TAG_LENSDISTORTION:
636
1.60k
    if (entry->format == EXIF_FORMAT_SHORT) {
637
      /* Epson uses a single SHORT here */
638
490
      CC (entry->components, 1, v, maxlen)
639
197
      vs = exif_get_short (entry->data, entry->order);
640
197
      sprintf (buf, "%hu", vs);
641
197
      strncat (v, buf, maxlen - strlen (v));
642
1.11k
    } else {
643
      /* Others use an array of SSHORT here */
644
1.11k
      CC (entry->components, 6, v, maxlen)
645
889
      CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen)
646
4.83k
      for (i=0; i < (int)entry->components; ++i) {
647
4.14k
        vss = exif_get_sshort (entry->data+2*i, entry->order);
648
4.14k
        sprintf (buf, "%hd ", vss);
649
4.14k
        strncat (v, buf, maxlen - strlen (v));
650
4.14k
      }
651
690
    }
652
887
    break;
653
1.19k
  case MNOTE_OLYMPUS_TAG_COLORCONTROL:
654
1.19k
    CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
655
996
    CC (entry->components, 6, v, maxlen)
656
5.39k
    for (i=0; i < (int)entry->components; ++i) {
657
4.62k
      vs = exif_get_short (entry->data+2*i, entry->order);
658
4.62k
      sprintf (buf, "%hu ", vs);
659
4.62k
      strncat (v, buf, maxlen - strlen (v));
660
4.62k
    }
661
770
    break;
662
714
  case MNOTE_OLYMPUS_TAG_VERSION:
663
714
    CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
664
502
    CC2 (entry->components, 5, 8, v, maxlen)
665
216
    strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
666
216
    break;
667
875
  case MNOTE_OLYMPUS_TAG_SERIALNUMBER2:
668
875
    CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
669
536
    strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
670
536
    break;
671
551
  case MNOTE_OLYMPUS_TAG_INFO:
672
551
    CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen)
673
332
    CC2 (entry->components, 52, 60, v, maxlen)
674
90
    strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
675
90
    break;
676
528
  case MNOTE_OLYMPUS_TAG_ID:
677
528
    CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen)
678
323
    CC (entry->components, 32, v, maxlen)
679
235
    strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
680
235
    break;
681
0
  case MNOTE_OLYMPUS_TAG_UNKNOWN_4:
682
0
    CF (entry->format, EXIF_FORMAT_LONG, v, maxlen)
683
0
    CC (entry->components, 30, v, maxlen)
684
0
    for (i=0; i < (int)entry->components; ++i) {
685
0
      vl = exif_get_long (entry->data+4*i, entry->order);
686
0
      sprintf (buf, "%lu ", (unsigned long)vl);
687
0
      strncat (v, buf, maxlen - strlen (v));
688
0
    }
689
0
    break;
690
1.18k
  case MNOTE_OLYMPUS_TAG_FOCUSDIST:
691
1.18k
    CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
692
1.05k
    CC (entry->components, 1, v, maxlen)
693
822
    vr = exif_get_rational (entry->data, entry->order);
694
822
    if (!vr.numerator || !vr.denominator) {
695
474
      strncpy (v, _("Unknown"), maxlen);
696
474
    }
697
348
    else {
698
348
      unsigned long tmp = vr.numerator / vr.denominator;
699
348
      snprintf (v, maxlen, "%li mm", tmp);
700
348
    }
701
822
    break;
702
2.37k
  case MNOTE_OLYMPUS_TAG_WBALANCE:
703
2.37k
    CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
704
2.15k
    CC (entry->components, 2, v, maxlen)
705
1.96k
    vs = exif_get_short (entry->data, entry->order);
706
1.96k
    switch (vs) {
707
194
    case 1:
708
194
      strncpy (v, _("Automatic"), maxlen);
709
194
      break;
710
1.33k
    case 2:
711
1.33k
      {
712
1.33k
        ExifShort v2 = exif_get_short (entry->data + 2, entry->order);
713
1.33k
        unsigned long colorTemp = 0;
714
1.33k
        switch (v2) {
715
207
        case 2:
716
207
          colorTemp = 3000;
717
207
          break;
718
66
        case 3:
719
66
          colorTemp = 3700;
720
66
          break;
721
213
        case 4:
722
213
          colorTemp = 4000;
723
213
          break;
724
66
        case 5:
725
66
          colorTemp = 4500;
726
66
          break;
727
196
        case 6:
728
196
          colorTemp = 5500;
729
196
          break;
730
197
        case 7:
731
197
          colorTemp = 6500;
732
197
          break;
733
195
        case 9:
734
195
          colorTemp = 7500;
735
195
          break;
736
1.33k
        }
737
1.33k
        if (colorTemp) {
738
1.14k
          snprintf (v, maxlen, _("Manual: %liK"), colorTemp);
739
1.14k
        }
740
199
        else {
741
199
          strncpy (v, _("Manual: unknown"), maxlen);
742
199
        }
743
744
1.33k
      }
745
0
      break;
746
196
    case 3:
747
196
      strncpy (v, _("One-touch"), maxlen);
748
196
      break;
749
232
    default:
750
232
      strncpy (v, _("Unknown"), maxlen);
751
232
      break;
752
1.96k
    }
753
1.96k
    break;
754
1.96k
  case MNOTE_OLYMPUS_TAG_REDBALANCE:
755
898
  case MNOTE_OLYMPUS_TAG_BLUEBALANCE:
756
898
    CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
757
568
    CC (entry->components, 2, v, maxlen)
758
218
    vs = exif_get_short (entry->data, entry->order);
759
218
    snprintf (v, maxlen, "%hu ", vs);
760
218
    vs = exif_get_short (entry->data + 2, entry->order);
761
218
    sprintf (buf, "%hu", vs);
762
218
    strncat (v, buf, maxlen - strlen (v));
763
218
    break;
764
215
  case MNOTE_OLYMPUS_TAG_BLACKLEVEL:
765
633
  case MNOTE_NIKON_TAG_IMAGEBOUNDARY:
766
633
    CC (entry->components, 4, v, maxlen)
767
    /* Fall through to COLORMATRIX */
768
    /* fall through */
769
1.00k
  case MNOTE_OLYMPUS_TAG_COLORMATRIX:
770
1.00k
    CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen)
771
789
    if (entry->tag == MNOTE_OLYMPUS_TAG_COLORMATRIX)
772
424
      CC (entry->components, 9, v, maxlen)
773
3.95k
    for (i=0; i < (int)entry->components; ++i) {
774
3.37k
      vs = exif_get_short (entry->data+2*i, entry->order);
775
3.37k
      sprintf (buf, "%hu ", vs);
776
3.37k
      strncat (v, buf, maxlen - strlen (v));
777
3.37k
    }
778
578
    break;
779
195
  case MNOTE_NIKON1_TAG_FOCUS:
780
537
  case MNOTE_NIKON_TAG_DIGITALZOOM:
781
739
  case MNOTE_NIKON1_TAG_DIGITALZOOM:
782
1.21k
  case MNOTE_OLYMPUS_TAG_FOCALPLANEDIAGONAL:
783
1.21k
    CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen)
784
    /* Fall through to default handler for display */
785
    /* fall through */
786
3.97k
  default:
787
3.97k
    switch (entry->format) {
788
556
    case EXIF_FORMAT_ASCII:
789
556
      strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
790
556
      break;
791
457
    case EXIF_FORMAT_SHORT:
792
457
      CC (entry->components, 1, v, maxlen)
793
213
      vs = exif_get_short (entry->data, entry->order);
794
213
      snprintf (v, maxlen, "%hu", vs);
795
213
      break;
796
407
    case EXIF_FORMAT_SSHORT:
797
407
      CC (entry->components, 1, v, maxlen)
798
196
      vss = exif_get_sshort (entry->data, entry->order);
799
196
      snprintf (v, maxlen, "%hi", vss);
800
196
      break;
801
150
    case EXIF_FORMAT_LONG:
802
150
      CC (entry->components, 1, v, maxlen)
803
69
      vl = exif_get_long (entry->data, entry->order);
804
69
      snprintf (v, maxlen, "%lu", (long unsigned) vl);
805
69
      break;
806
270
    case EXIF_FORMAT_SLONG:
807
270
      CC (entry->components, 1, v, maxlen)
808
67
      vsl = exif_get_slong (entry->data, entry->order);
809
67
      snprintf (v, maxlen, "%li", (long int) vsl);
810
67
      break;
811
780
    case EXIF_FORMAT_RATIONAL:
812
780
      CC (entry->components, 1, v, maxlen)
813
606
      vr = exif_get_rational (entry->data, entry->order);
814
606
      if (!vr.denominator) {
815
258
        strncpy (v, _("Infinite"), maxlen);
816
348
      } else {
817
348
        r = R2D(vr);
818
348
        snprintf (v, maxlen, "%2.3f", r);
819
348
      }
820
606
      break;
821
799
    case EXIF_FORMAT_SRATIONAL:
822
799
      CC (entry->components, 1, v, maxlen)
823
547
      vsr = exif_get_srational (entry->data, entry->order);
824
547
      if (!vsr.denominator) {
825
226
        strncpy (v, _("Infinite"), maxlen);
826
321
      } else {
827
321
        r = R2D(vsr);
828
321
        snprintf (v, maxlen, "%2.3f", r);
829
321
      }
830
547
      break;
831
229
    case EXIF_FORMAT_UNDEFINED:
832
553
    default:
833
553
      snprintf (v, maxlen, _("%i bytes unknown data: "),
834
553
          entry->size);
835
32.3k
      for (i = 0; i < (int)entry->size; i++) {
836
31.7k
        sprintf (buf, "%02x", entry->data[i]);
837
31.7k
        strncat (v, buf, maxlen - strlen (v));
838
31.7k
      }
839
553
      break;
840
3.97k
    }
841
3.97k
    break;
842
47.9k
  }
843
844
47.9k
  return (v);
845
47.9k
}