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