Coverage Report

Created: 2025-08-29 06:06

/src/libexif/libexif/fuji/mnote-fuji-entry.c
Line
Count
Source (jump to first uncovered line)
1
/* mnote-fuji-entry.c
2
 *
3
 * Copyright (c) 2002 Lutz Mueller <lutz@users.sourceforge.net>
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 <stdlib.h>
24
#include <stdio.h>
25
#include <string.h>
26
27
#include <config.h>
28
29
#include <libexif/i18n.h>
30
31
#include "mnote-fuji-entry.h"
32
33
13.9k
#define CF(format,target,v,maxlen)                              \
34
13.9k
{                                                               \
35
13.9k
        if (format != target) {                                 \
36
8.92k
                snprintf (v, maxlen,                          \
37
8.92k
                        _("Invalid format '%s', "               \
38
8.92k
                        "expected '%s'."),                      \
39
8.92k
                        exif_format_get_name (format),          \
40
8.92k
                        exif_format_get_name (target));         \
41
8.92k
                break;                                          \
42
8.92k
        }                                                       \
43
13.9k
}
44
45
4.98k
#define CC(number,target,v,maxlen)                                      \
46
4.98k
{                                                                       \
47
4.98k
        if (number != target) {                                         \
48
1.19k
                snprintf (v, maxlen,                                    \
49
1.19k
                        _("Invalid number of components (%i, "          \
50
1.19k
                        "expected %i)."), (int) number, (int) target);  \
51
1.19k
                break;                                                  \
52
1.19k
        }                                                               \
53
4.98k
}
54
55
static const struct {
56
  MnoteFujiTag tag;
57
  struct {
58
    int index;
59
    const char *string;
60
  } elem[22];
61
} items[] = {
62
#ifndef NO_VERBOSE_TAG_DATA
63
  { MNOTE_FUJI_TAG_SHARPNESS,
64
    { {1, N_("Softest")},
65
      {2, N_("Soft")},
66
      {3, N_("Normal")},
67
      {4, N_("Hard")},
68
      {5, N_("Hardest")},
69
      {0x0082, N_("Medium soft")},
70
      {0x0084, N_("Medium hard")},
71
      {0x8000, N_("Film simulation mode")},
72
      {0xFFFF, N_("Off")},
73
      {0, NULL}}},
74
  { MNOTE_FUJI_TAG_WHITE_BALANCE,
75
    { {0, N_("Auto")},
76
      {0x100, N_("Daylight")},
77
      {0x200, N_("Cloudy")},
78
      {0x300, N_("Daylight fluorescent")},
79
      {0x301, N_("Day white fluorescent")},
80
      {0x302, N_("White fluorescent")},
81
      {0x400, N_("Incandescent")},
82
      {0x500, N_("Flash")},
83
      {0xF00, N_("Custom")},
84
      {0, NULL}}},
85
  { MNOTE_FUJI_TAG_COLOR,
86
    { {0, N_("Standard")},
87
      {0x0080, N_("Medium high")},
88
      {0x0100, N_("High")},
89
      {0x0180, N_("Medium low")},
90
      {0x0200, N_("Original")},
91
      {0x0300, N_("Black & white")},
92
      {0x8000, N_("Film simulation mode")},
93
      {0, NULL}}},
94
  { MNOTE_FUJI_TAG_TONE,
95
    { {0, N_("Standard")},
96
      {0x0080, N_("Medium hard")},
97
      {0x0100, N_("Hard")},
98
      {0x0180, N_("Medium soft")},
99
      {0x0200, N_("Original")},
100
      {0x8000, N_("Film simulation mode")},
101
      {0, NULL}}},
102
  { MNOTE_FUJI_TAG_FLASH_MODE,
103
    { {0, N_("Auto")},
104
      {1, N_("On")},
105
      {2, N_("Off")},
106
      {3, N_("Red-eye reduction")},
107
      {0, NULL}}},
108
  { MNOTE_FUJI_TAG_MACRO,
109
    { {0, N_("Off")},
110
      {1, N_("On")},
111
      {0, NULL}}},
112
  { MNOTE_FUJI_TAG_FOCUS_MODE,
113
    { {0, N_("Auto")},
114
      {1, N_("Manual")},
115
      {0, NULL}}},
116
  { MNOTE_FUJI_TAG_SLOW_SYNC,
117
    { {0, N_("Off")},
118
      {1, N_("On")},
119
      {0, NULL}}},
120
  { MNOTE_FUJI_TAG_PICTURE_MODE,
121
    { {0, N_("Auto")},
122
      {1, N_("Portrait")},
123
      {2, N_("Landscape")},
124
      {4, N_("Sports")},
125
      {5, N_("Night")},
126
      {6, N_("Program AE")},
127
      {7, N_("Natural photo")},
128
      {8, N_("Vibration reduction")},
129
      {0x000A, N_("Sunset")},
130
      {0x000B, N_("Museum")},
131
      {0x000C, N_("Party")},
132
      {0x000D, N_("Flower")},
133
      {0x000E, N_("Text")},
134
      {0x000F, N_("NP & flash")},
135
      {0x0010, N_("Beach")},
136
      {0x0011, N_("Snow")},
137
      {0x0012, N_("Fireworks")},
138
      {0x0013, N_("Underwater")},
139
      {0x0100, N_("Aperture priority AE")},
140
      {0x0200, N_("Shutter priority AE")},
141
      {0x0300, N_("Manual exposure")},
142
      {0, NULL}}},
143
  { MNOTE_FUJI_TAG_CONT_TAKING,
144
    { {0, N_("Off")},
145
      {1, N_("On")},
146
      {0, NULL}}},
147
  { MNOTE_FUJI_TAG_FINEPIX_COLOR,
148
    { {0x00, N_("F-Standard")},
149
      {0x10, N_("F-Chrome")},
150
      {0x30, N_("F-B&W")},
151
      {0, NULL}}},
152
  { MNOTE_FUJI_TAG_BLUR_CHECK,
153
    { {0, N_("No blur")},
154
      {1, N_("Blur warning")},
155
      {0, NULL}}},
156
  { MNOTE_FUJI_TAG_FOCUS_CHECK,
157
    { {0, N_("Focus good")},
158
      {1, N_("Out of focus")},
159
      {0, NULL}}},
160
  { MNOTE_FUJI_TAG_AUTO_EXPOSURE_CHECK,
161
    { {0, N_("AE good")},
162
      {1, N_("Over exposed")},
163
      {0, NULL}}},
164
  { MNOTE_FUJI_TAG_DYNAMIC_RANGE,
165
    { {1, N_("Standard")},
166
      {3, N_("Wide")},
167
      {0, NULL}}},
168
  { MNOTE_FUJI_TAG_FILM_MODE,
169
    { {0, N_("F0/Standard")},
170
      {0x0100, N_("F1/Studio portrait")},
171
      {0x0110, N_("F1a/Professional portrait")},
172
      {0x0120, N_("F1b/Professional portrait")},
173
      {0x0130, N_("F1c/Professional portrait")},
174
      {0x0200, N_("F2/Fujichrome")},
175
      {0x0300, N_("F3/Studio portrait Ex")},
176
      {0x0400, N_("F4/Velvia")},
177
      {0, NULL}}},
178
  { MNOTE_FUJI_TAG_DYNAMIC_RANGE_SETTING,
179
    { {0, N_("Auto (100-400%)")},
180
      {1, N_("RAW")},
181
      {0x0100, N_("Standard (100%)")},
182
      {0x0200, N_("Wide1 (230%)")},
183
      {0x0201, N_("Wide2 (400%)")},
184
      {0x8000, N_("Film simulation mode")},
185
      {0, NULL}}},
186
#endif
187
  {0, {{0, NULL}}}
188
};
189
190
191
char *
192
mnote_fuji_entry_get_value (MnoteFujiEntry *entry,
193
            char *val, unsigned int maxlen)
194
32.2k
{
195
32.2k
  ExifLong  vl;
196
32.2k
  ExifSLong vsl;
197
32.2k
  ExifShort vs, vs2;
198
32.2k
  ExifSShort vss;
199
32.2k
  ExifRational vr;
200
32.2k
  ExifSRational vsr;
201
32.2k
  int i, j;
202
203
32.2k
  if (!entry) return (NULL);
204
205
32.2k
  memset (val, 0, maxlen);
206
32.2k
  maxlen--;
207
208
32.2k
  switch (entry->tag) {
209
5.81k
    case MNOTE_FUJI_TAG_VERSION:
210
5.81k
    CF (entry->format, EXIF_FORMAT_UNDEFINED, val, maxlen)
211
390
    CC (entry->components, 4, val, maxlen)
212
108
    memcpy (val, entry->data, MIN(maxlen, entry->size));
213
108
    break;
214
466
    case MNOTE_FUJI_TAG_SHARPNESS:
215
938
    case MNOTE_FUJI_TAG_WHITE_BALANCE:
216
1.10k
    case MNOTE_FUJI_TAG_COLOR:
217
1.69k
      case MNOTE_FUJI_TAG_TONE:
218
2.18k
    case MNOTE_FUJI_TAG_FLASH_MODE:
219
2.51k
    case MNOTE_FUJI_TAG_MACRO:
220
2.80k
    case MNOTE_FUJI_TAG_FOCUS_MODE:
221
3.19k
    case MNOTE_FUJI_TAG_SLOW_SYNC:
222
3.56k
    case MNOTE_FUJI_TAG_PICTURE_MODE:
223
4.00k
    case MNOTE_FUJI_TAG_CONT_TAKING:
224
4.12k
    case MNOTE_FUJI_TAG_FINEPIX_COLOR:
225
4.33k
    case MNOTE_FUJI_TAG_BLUR_CHECK:
226
4.73k
    case MNOTE_FUJI_TAG_FOCUS_CHECK:
227
5.01k
    case MNOTE_FUJI_TAG_AUTO_EXPOSURE_CHECK:
228
5.51k
    case MNOTE_FUJI_TAG_DYNAMIC_RANGE:
229
5.87k
    case MNOTE_FUJI_TAG_FILM_MODE:
230
6.22k
    case MNOTE_FUJI_TAG_DYNAMIC_RANGE_SETTING:
231
6.22k
    CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen)
232
3.25k
    CC (entry->components, 1, val, maxlen)
233
2.63k
    vs = exif_get_short (entry->data, entry->order);
234
235
    /* search the tag */
236
21.7k
    for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++);
237
2.63k
    if (!items[i].tag) {
238
0
      snprintf (val, maxlen,
239
0
          _("Internal error (unknown value %i)"), vs);
240
0
        break;
241
0
    }
242
243
    /* find the value */
244
12.6k
    for (j = 0; items[i].elem[j].string &&
245
12.6k
        (items[i].elem[j].index < vs); j++);
246
2.63k
    if (items[i].elem[j].index != vs) {
247
1.71k
      snprintf (val, maxlen,
248
1.71k
          _("Internal error (unknown value %i)"), vs);
249
1.71k
      break;
250
1.71k
    }
251
915
    strncpy (val, _(items[i].elem[j].string), maxlen);
252
915
    break;
253
563
    case MNOTE_FUJI_TAG_FOCUS_POINT:
254
563
    CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen)
255
267
    CC (entry->components, 2, val, maxlen)
256
159
    vs = exif_get_short (entry->data, entry->order);
257
159
    vs2 = exif_get_short (entry->data+2, entry->order);
258
159
    snprintf (val, maxlen, "%i, %i", vs, vs2);
259
159
    break;
260
797
    case MNOTE_FUJI_TAG_MIN_FOCAL_LENGTH:
261
1.30k
    case MNOTE_FUJI_TAG_MAX_FOCAL_LENGTH:
262
1.30k
    CF (entry->format, EXIF_FORMAT_RATIONAL, val, maxlen)
263
1.07k
    CC (entry->components, 1, val, maxlen)
264
895
    vr = exif_get_rational (entry->data, entry->order);
265
895
    if (!vr.denominator) break;
266
479
    snprintf (val, maxlen, _("%2.2f mm"), (double) vr.numerator /
267
479
        vr.denominator);
268
479
    break;
269
270
18.2k
  default:
271
18.2k
    switch (entry->format) {
272
1.13k
    case EXIF_FORMAT_ASCII:
273
1.13k
      strncpy (val, (char *)entry->data, MIN(maxlen, entry->size));
274
1.13k
      break;
275
753
    case EXIF_FORMAT_SHORT:
276
753
      vs = exif_get_short (entry->data, entry->order);
277
753
      snprintf (val, maxlen, "%hu", vs);
278
753
      break;
279
629
    case EXIF_FORMAT_SSHORT:
280
629
      vss = exif_get_sshort (entry->data, entry->order);
281
629
      snprintf (val, maxlen, "%hi", vss);
282
629
      break;
283
344
    case EXIF_FORMAT_LONG:
284
344
      vl = exif_get_long (entry->data, entry->order);
285
344
      snprintf (val, maxlen, "%lu", (long unsigned) vl);
286
344
      break;
287
343
    case EXIF_FORMAT_SLONG:
288
343
      vsl = exif_get_slong (entry->data, entry->order);
289
343
      snprintf (val, maxlen, "%li", (long int) vsl);
290
343
      break;
291
1.04k
    case EXIF_FORMAT_RATIONAL:
292
1.04k
      vr = exif_get_rational (entry->data, entry->order);
293
1.04k
      if (!vr.denominator) break;
294
672
      snprintf (val, maxlen, "%2.4f", (double) vr.numerator /
295
672
                vr.denominator);
296
672
      break;
297
684
    case EXIF_FORMAT_SRATIONAL:
298
684
      vsr = exif_get_srational (entry->data, entry->order);
299
684
      if (!vsr.denominator) break;
300
381
      snprintf (val, maxlen, "%2.4f", (double) vsr.numerator /
301
381
        vsr.denominator);
302
381
      break;
303
662
    case EXIF_FORMAT_UNDEFINED:
304
13.3k
    default:
305
13.3k
      snprintf (val, maxlen, _("%i bytes unknown data"),
306
13.3k
        entry->size);
307
13.3k
      break;
308
18.2k
    }
309
18.2k
    break;
310
32.2k
  }
311
312
32.2k
  return (val);
313
32.2k
}