/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 | } |