EXIF library (libexif) Internals 0.6.26
mnote-pentax-entry.c
Go to the documentation of this file.
1/* mnote-pentax-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 <config.h>
24#include "mnote-pentax-entry.h"
25
26#include <libexif/i18n.h>
27
28#include <stdio.h>
29#include <stdlib.h>
30#include <string.h>
31
32#include <libexif/exif-format.h>
33#include <libexif/exif-utils.h>
34#include <libexif/exif-entry.h>
35
36
37#define CF(format,target,v,maxlen) \
38{ \
39 if (format != target) { \
40 snprintf (v, maxlen, \
41 _("Invalid format '%s', " \
42 "expected '%s'."), \
43 exif_format_get_name (format), \
44 exif_format_get_name (target)); \
45 break; \
46 } \
47}
48
49#define CC(number,target,v,maxlen) \
50{ \
51 if (number != target) { \
52 snprintf (v, maxlen, \
53 _("Invalid number of components (%i, " \
54 "expected %i)."), (int) number, (int) target); \
55 break; \
56 } \
57}
58
59#define CC2(number,t1,t2,v,maxlen) \
60{ \
61 if ((number != t1) && (number != t2)) { \
62 snprintf (v, maxlen, \
63 _("Invalid number of components (%i, " \
64 "expected %i or %i)."), (int) number, \
65 (int) t1, (int) t2); \
66 break; \
67 } \
68}
69
70static const struct {
72 struct {
73 int index;
74 const char *string;
75 } elem[33];
76} items[] = {
77#ifndef NO_VERBOSE_TAG_DATA
79 { {0, N_("Auto")},
80 {1, N_("Night scene")},
81 {2, N_("Manual")},
82 {4, N_("Multi-exposure")},
83 {0, NULL}}},
85 { {0, N_("Good")},
86 {1, N_("Better")},
87 {2, N_("Best")},{0,NULL}}},
89 { {2, N_("Custom")},
90 {3, N_("Auto")},
91 {0, NULL}}},
93 { {1, N_("Auto")},
94 {2, N_("Flash on")},
95 {4, N_("Flash off")},
96 {6, N_("Red-eye reduction")},
97 {0, NULL}}},
99 { {0, N_("Auto")},
100 {1, N_("Daylight")},
101 {2, N_("Shade")},
102 {3, N_("Tungsten")},
103 {4, N_("Fluorescent")},
104 {5, N_("Manual")},
105 {0, NULL}}},
107 { {0, N_("Normal")},
108 {1, N_("Soft")},
109 {2, N_("Hard")},
110 {0, NULL}}},
112 { {0, N_("Normal")},
113 {1, N_("Low")},
114 {2, N_("High")},
115 {0, NULL}}},
117 { {0, N_("Normal")},
118 {1, N_("Low")},
119 {2, N_("High")},
120 {0, NULL}}},
122 { {10, N_("100")},
123 {16, N_("200")},
124 {100, N_("100")},
125 {200, N_("200")},
126 { 0, NULL}}},
128 { {1, N_("Full")},
129 {2, N_("Black & white")},
130 {3, N_("Sepia")},
131 {0, NULL}}},
133 { {0, N_("Auto")},
134 {1, N_("Night scene")},
135 {2, N_("Manual")},
136 {4, N_("Multi-exposure")},
137 {0, NULL}}},
139 { {0, N_("Good")},
140 {1, N_("Better")},
141 {2, N_("Best")},
142 {3, N_("TIFF")},
143 {4, N_("RAW")},
144 {0, NULL}}},
146 { {0, "640x480"},
147 {1, N_("Full")},
148 {2, "1024x768"},
149 {3, "1280x960"},
150 {4, "1600x1200"},
151 {5, "2048x1536"},
152 {8, N_("2560x1920 or 2304x1728")},
153 {9, "3072x2304"},
154 {10, "3264x2448"},
155 {19, "320x240"},
156 {20, "2288x1712"},
157 {21, "2592x1944"},
158 {22, N_("2304x1728 or 2592x1944")},
159 {23, "3056x2296"},
160 {25, N_("2816x2212 or 2816x2112")},
161 {27, "3648x2736"},
162 {36, "3008x2008"},
163 {0, NULL}}},
165 { {0, N_("Program")},
166 {2, N_("Program AE")},
167 {3, N_("Manual")},
168 {5, N_("Portrait")},
169 {6, N_("Landscape")},
170 {8, N_("Sport")},
171 {9, N_("Night scene")},
172 {11, N_("Soft")},
173 {12, N_("Surf & snow")},
174 {13, N_("Sunset or candlelight")},
175 {14, N_("Autumn")},
176 {15, N_("Macro")},
177 {17, N_("Fireworks")},
178 {18, N_("Text")},
179 {19, N_("Panorama")},
180 {30, N_("Self portrait")},
181 {31, N_("Illustrations")},
182 {33, N_("Digital filter")},
183 {37, N_("Museum")},
184 {38, N_("Food")},
185 {40, N_("Green mode")},
186 {49, N_("Light pet")},
187 {50, N_("Dark pet")},
188 {51, N_("Medium pet")},
189 {53, N_("Underwater")},
190 {54, N_("Candlelight")},
191 {55, N_("Natural skin tone")},
192 {56, N_("Synchro sound record")},
193 {58, N_("Frame composite")},
194 {0, NULL}}},
196 { {0x0000, N_("Auto, did not fire")},
197 {0x0001, N_("Off")},
198 {0x0003, N_("Auto, did not fire, red-eye reduction")},
199 {0x0100, N_("Auto, fired")},
200 {0x0102, N_("On")},
201 {0x0103, N_("Auto, fired, red-eye reduction")},
202 {0x0104, N_("On, red-eye reduction")},
203 {0x0105, N_("On, wireless")},
204 {0x0108, N_("On, soft")},
205 {0x0109, N_("On, slow-sync")},
206 {0x010a, N_("On, slow-sync, red-eye reduction")},
207 {0x010b, N_("On, trailing-curtain sync")},
208 {0, NULL}}},
210 { {0, N_("Normal")},
211 {1, N_("Macro")},
212 {2, N_("Infinity")},
213 {3, N_("Manual")},
214 {5, N_("Pan focus")},
215 {16, N_("AF-S")},
216 {17, N_("AF-C")},
217 {0, NULL}}},
219 { {1, N_("Upper-left")},
220 {2, N_("Top")},
221 {3, N_("Upper-right")},
222 {4, N_("Left")},
223 {5, N_("Mid-left")},
224 {6, N_("Center")},
225 {7, N_("Mid-right")},
226 {8, N_("Right")},
227 {9, N_("Lower-left")},
228 {10, N_("Bottom")},
229 {11, N_("Lower-right")},
230 {0xfffe, N_("Fixed center")},
231 {0xffff, N_("Auto")},
232 {0, NULL}}},
234 { {0, N_("Multiple")},
235 {1, N_("Top-left")},
236 {2, N_("Top-center")},
237 {3, N_("Top-right")},
238 {4, N_("Left")},
239 {5, N_("Center")},
240 {6, N_("Right")},
241 {7, N_("Bottom-left")},
242 {8, N_("Bottom-center")},
243 {9, N_("Bottom-right")},
244 {0xffff, N_("None")},
245 {0, NULL}}},
247 { {0, N_("Auto")},
248 {1, N_("Daylight")},
249 {2, N_("Shade")},
250 {3, N_("Fluorescent")},
251 {4, N_("Tungsten")},
252 {5, N_("Manual")},
253 {6, N_("Daylight fluorescent")},
254 {7, N_("Day white fluorescent")},
255 {8, N_("White fluorescent")},
256 {9, N_("Flash")},
257 {10, N_("Cloudy")},
258 {0xfffe, N_("Unknown")},
259 {0xffff, N_("User selected")},
260 {0, NULL}}},
262 { {0, N_("Off")},
263 {1, N_("On")},
264 {0, NULL}}},
265#endif
266 {0, {{0, NULL}}}
268
269/* Two-component values */
270static const struct {
272 struct {
274 const char *string;
275 } elem[39];
276} items2[] = {
277#ifndef NO_VERBOSE_TAG_DATA
279 { {0, 0, "2304x1728"},
280 {4, 0, "1600x1200"},
281 {5, 0, "2048x1536"},
282 {8, 0, "2560x1920"},
283 {34, 0, "1536x1024"},
284 {36, 0, N_("3008x2008 or 3040x2024")},
285 {37, 0, "3008x2000"},
286 {35, 1, "2400x1600"},
287 {32, 2, "960x480"},
288 {33, 2, "1152x768"},
289 {34, 2, "1536x1024"},
290 {0, 0, NULL}}},
292 { {0, 0, N_("Auto")},
293 {5, 0, N_("Portrait")},
294 {53, 0, N_("Underwater")},
295 {255, 0, N_("Digital filter?")},
296 {5, 1, N_("Portrait")},
297 {9, 1, N_("Night scene")},
298 {13, 1, N_("Candlelight")},
299 {15, 1, N_("Macro")},
300 {53, 1, N_("Underwater")},
301 {0, 2, N_("Program AE")},
302 {5, 2, N_("Portrait")},
303 {6, 2, N_("Landscape")},
304 {0, 0, NULL}}},
305#endif
306 {0, {{0, 0, NULL}}}
308
309char *
311 char *val, unsigned int maxlen)
312{
313 ExifLong vl;
314 ExifSLong vsl;
315 ExifShort vs, vs2;
316 ExifSShort vss;
317 int i = 0, j = 0;
318
319 if (!entry) return (NULL);
320 if (maxlen < 1) return (NULL);
321
322 memset (val, 0, maxlen);
323 maxlen--;
324
325 switch (entry->tag) {
346 CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen)
347 CC2 (entry->components, 1, 2, val, maxlen)
348 if (entry->components == 1) {
349 vs = exif_get_short (entry->data, entry->order);
350
351 /* search the tag */
352 for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++);
353 if (!items[i].tag) {
354 snprintf (val, maxlen,
355 _("Internal error (unknown value %hu)"), vs);
356 break;
357 }
358
359 /* find the value */
360 for (j = 0; items[i].elem[j].string &&
361 (items[i].elem[j].index < vs); j++);
362 if (items[i].elem[j].index != vs) {
363 snprintf (val, maxlen,
364 _("Internal error (unknown value %hu)"), vs);
365 break;
366 }
367 strncpy (val, _(items[i].elem[j].string), maxlen);
368 } else {
369 /* Two-component values */
370 CF (entry->format, EXIF_FORMAT_SHORT, val, maxlen)
371 CC2 (entry->components, 1, 2, val, maxlen)
372 vs = exif_get_short (entry->data, entry->order);
373 vs2 = ((unsigned int)exif_get_short (entry->data+2, entry->order)) << 16;
374
375 /* search the tag */
376 for (i = 0; (items2[i].tag && items2[i].tag != entry->tag); i++);
377 if (!items2[i].tag) {
378 snprintf (val, maxlen,
379 _("Internal error (unknown value %hu %hu)"), vs, vs2);
380 break;
381 }
382
383 /* find the value */
384 for (j = 0; items2[i].elem[j].string && ((items2[i].elem[j].index2 < vs2)
385 || ((items2[i].elem[j].index2 == vs2) && (items2[i].elem[j].index1 < vs))); j++);
386 if ((items2[i].elem[j].index1 != vs) || (items2[i].elem[j].index2 != vs2)) {
387 snprintf (val, maxlen,
388 _("Internal error (unknown value %hi %hi)"), vs, vs2);
389 break;
390 }
391 strncpy (val, _(items2[i].elem[j].string), maxlen);
392 }
393 break;
394
396 CF (entry->format, EXIF_FORMAT_LONG, val, maxlen)
397 CC (entry->components, 1, val, maxlen)
398 vl = exif_get_long (entry->data, entry->order);
399 snprintf (val, maxlen, "%lu", (long unsigned) vl);
400 break;
402 CF (entry->format, EXIF_FORMAT_UNDEFINED, val, maxlen)
403 CC (entry->components, 124, val, maxlen)
404 snprintf (val, maxlen, _("%i bytes unknown data"),
405 entry->size);
406 break;
409 CF (entry->format, EXIF_FORMAT_UNDEFINED, val, maxlen)
410 CC (entry->components, 4, val, maxlen)
411 strncpy (val, (char*)entry->data, MIN(maxlen, entry->size));
412 break;
414 CF (entry->format, EXIF_FORMAT_UNDEFINED, val, maxlen)
415 CC (entry->components, 4, val, maxlen)
416 /* Note: format is UNDEFINED, not SHORT -> order is fixed: MOTOROLA */
418 snprintf (val, maxlen, "%hi:%02i:%02i", vs, entry->data[2], entry->data[3]);
419 break;
421 CF (entry->format, EXIF_FORMAT_UNDEFINED, val, maxlen)
422 CC2 (entry->components, 3, 4, val, maxlen)
423 snprintf (val, maxlen, "%02i:%02i:%02i", entry->data[0], entry->data[1], entry->data[2]);
424 break;
425 default:
426 switch (entry->format) {
428 strncpy (val, (char *)entry->data, MIN(maxlen, entry->size));
429 break;
431 {
432 const unsigned char *data = entry->data;
433 size_t k, len = strlen(val), sizeleft;
434
435 sizeleft = entry->size;
436 for(k=0; k<entry->components; k++) {
437 if (sizeleft < 2)
438 break;
439 vs = exif_get_short (data, entry->order);
440 snprintf (val+len, maxlen-len, "%hu ", vs);
441 len = strlen(val);
442 data += 2;
443 sizeleft -= 2;
444 }
445 }
446 break;
448 {
449 const unsigned char *data = entry->data;
450 size_t k, len = strlen(val), sizeleft;
451
452 sizeleft = entry->size;
453 for(k=0; k<entry->components; k++) {
454 if (sizeleft < 2)
455 break;
456 vss = exif_get_sshort (data, entry->order);
457 snprintf (val+len, maxlen-len, "%hi ", vss);
458 len = strlen(val);
459 data += 2;
460 sizeleft -= 2;
461 }
462 }
463 break;
464 case EXIF_FORMAT_LONG:
465 {
466 const unsigned char *data = entry->data;
467 size_t k, len = strlen(val), sizeleft;
468
469 sizeleft = entry->size;
470 for(k=0; k<entry->components; k++) {
471 if (sizeleft < 4)
472 break;
473 vl = exif_get_long (data, entry->order);
474 snprintf (val+len, maxlen-len, "%lu ", (long unsigned) vl);
475 len = strlen(val);
476 data += 4;
477 sizeleft -= 4;
478 }
479 }
480 break;
482 {
483 const unsigned char *data = entry->data;
484 size_t k, len = strlen(val), sizeleft;
485
486 sizeleft = entry->size;
487 for(k=0; k<entry->components; k++) {
488 if (sizeleft < 4)
489 break;
490 vsl = exif_get_slong (data, entry->order);
491 snprintf (val+len, maxlen-len, "%li ", (long int) vsl);
492 len = strlen(val);
493 data += 4;
494 sizeleft -= 4;
495 }
496 }
497 break;
499 default:
500 snprintf (val, maxlen, _("%i bytes unknown data"),
501 entry->size);
502 break;
503 }
504 break;
505 }
506
507 return val;
508}
@ EXIF_BYTE_ORDER_MOTOROLA
Big-endian byte order.
Handling EXIF entries.
Handling native EXIF data types.
@ EXIF_FORMAT_SLONG
Definition exif-format.h:43
@ EXIF_FORMAT_LONG
Definition exif-format.h:38
@ EXIF_FORMAT_UNDEFINED
Definition exif-format.h:41
@ EXIF_FORMAT_SHORT
Definition exif-format.h:37
@ EXIF_FORMAT_SSHORT
Definition exif-format.h:42
@ EXIF_FORMAT_ASCII
Definition exif-format.h:36
ExifLong exif_get_long(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifLong value from memory.
Definition exif-utils.c:167
ExifShort exif_get_short(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifShort value from memory.
Definition exif-utils.c:104
ExifSLong exif_get_slong(const unsigned char *b, ExifByteOrder order)
Retrieve an ExifSLong value from memory.
Definition exif-utils.c:132
ExifSShort exif_get_sshort(const unsigned char *buf, ExifByteOrder order)
Retrieve an ExifSShort value from memory.
Definition exif-utils.c:89
EXIF data manipulation functions and types.
uint32_t ExifLong
EXIF Unsigned Long data type.
Definition exif-utils.h:56
int32_t ExifSLong
EXIF Signed Long data type.
Definition exif-utils.h:59
uint16_t ExifShort
EXIF Unsigned Short data type.
Definition exif-utils.h:50
#define MIN(a, b)
Definition exif-utils.h:182
int16_t ExifSShort
EXIF Signed Short data type.
Definition exif-utils.h:53
#define _(String)
Definition i18n.h:50
#define N_(String)
Definition i18n.h:51
#define CC(number, target, v, maxlen)
MnotePentaxTag tag
char * mnote_pentax_entry_get_value(MnotePentaxEntry *entry, char *val, unsigned int maxlen)
int index2
static const struct @17 items2[]
int index
static const struct @16 items[]
int index1
#define CF(format, target, v, maxlen)
#define CC2(number, t1, t2, v, maxlen)
const char * string
struct @16::@18 elem[33]
enum _MnotePentaxTag MnotePentaxTag
@ MNOTE_PENTAX2_TAG_FLASH_MODE
@ MNOTE_PENTAX2_TAG_QUALITY
@ MNOTE_PENTAX_TAG_MODE
@ MNOTE_PENTAX_TAG_SHARPNESS
@ MNOTE_PENTAX2_TAG_AUTO_AFPOINT
@ MNOTE_PENTAX_TAG_TZ_DST
@ MNOTE_PENTAX_TAG_CONTRAST
@ MNOTE_PENTAX_TAG_QUALITY
@ MNOTE_PENTAX2_TAG_IMAGE_SIZE
@ MNOTE_PENTAX2_TAG_TIME
@ MNOTE_PENTAX_TAG_SATURATION
@ MNOTE_PENTAX_TAG_FOCUS
@ MNOTE_PENTAX2_TAG_AFPOINT_SELECTED
@ MNOTE_PENTAX_TAG_FLASH
@ MNOTE_PENTAX2_TAG_DATE
@ MNOTE_PENTAX2_TAG_FOCUS_MODE
@ MNOTE_PENTAX_TAG_COLOR
@ MNOTE_CASIO2_TAG_BESTSHOT_MODE
@ MNOTE_PENTAX_TAG_ISO_SPEED
@ MNOTE_PENTAX2_TAG_PICTURE_MODE
@ MNOTE_PENTAX_TAG_ZOOM
@ MNOTE_PENTAX_TAG_WHITE_BALANCE
@ MNOTE_PENTAX2_TAG_WHITE_BALANCE
@ MNOTE_PENTAX2_TAG_MODE
@ MNOTE_PENTAX_TAG_PRINTIM
@ MNOTE_PENTAX_TAG_TZ_CITY
unsigned long components
unsigned char * data

libexif Generated by doxygen