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
53static 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-color fluorescent")},
77      {0x301, N_("DayWhite-color 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
189char *
190mnote_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