3
* Copyright � 2001 Lutz M�ller <lutz@users.sourceforge.net>
3
* Copyright (c) 2001 Lutz Mueller <lutz@users.sourceforge.net>
5
5
* This library is free software; you can redistribute it and/or
6
6
* modify it under the terms of the GNU Lesser General Public
42
42
/* This function is hidden in exif-data.c */
43
43
ExifLog *exif_data_get_log (ExifData *);
45
#ifndef NO_VERBOSE_TAG_STRINGS
46
47
exif_entry_log (ExifEntry *e, ExifLogCode code, const char *format, ...)
54
55
exif_logv (l, code, "ExifEntry", format, args);
59
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
60
#define exif_entry_log(...) do { } while (0)
61
#elif defined(__GNUC__)
62
#define exif_entry_log(x...) do { } while (0)
64
#define exif_entry_log (void)
59
69
exif_entry_alloc (ExifEntry *e, unsigned int i)
391
static const struct {
383
393
const char *strings[10];
395
#ifndef NO_VERBOSE_TAG_DATA
385
396
{ EXIF_TAG_PLANAR_CONFIGURATION,
386
397
{ N_("chunky format"), N_("planar format"), NULL}},
387
398
{ EXIF_TAG_SENSING_METHOD,
414
425
{ N_("Normal"), N_("Low saturation"), N_("High saturation"), NULL}},
415
426
{ EXIF_TAG_CONTRAST , {N_("Normal"), N_("Soft"), N_("Hard"), NULL}},
416
427
{ EXIF_TAG_SHARPNESS, {N_("Normal"), N_("Soft"), N_("Hard"), NULL}},
432
static const struct {
424
436
const char *values[4];
439
#ifndef NO_VERBOSE_TAG_DATA
427
440
{ EXIF_TAG_METERING_MODE,
428
441
{ { 0, {N_("Unknown"), NULL}},
429
442
{ 1, {N_("Average"), N_("avg"), NULL}},
449
462
{ 3, {N_("Tungsten incandescent light"), N_("Tungsten"), NULL}},
450
463
{ 4, {N_("Flash"), NULL}},
451
464
{ 9, {N_("Fine weather"), NULL}},
452
{ 10, {N_("Cloudy weather"), N_("cloudy"), NULL}},
465
{ 10, {N_("Cloudy weather"), N_("Cloudy"), NULL}},
453
466
{ 11, {N_("Shade"), NULL}},
454
467
{ 12, {N_("Daylight fluorescent"), NULL}},
455
468
{ 13, {N_("Day white fluorescent"), NULL}},
527
540
{EXIF_TAG_SUBJECT_DISTANCE_RANGE,
528
541
{ {0, {N_("Unknown"), N_("?"), NULL}},
529
542
{1, {N_("Macro"), NULL}},
530
{2, {N_("Close view"), N_("close"), NULL}},
531
{3, {N_("Distant view"), N_("distant"), NULL}},
543
{2, {N_("Close view"), N_("Close"), NULL}},
544
{3, {N_("Distant view"), N_("Distant"), NULL}},
533
546
{ EXIF_TAG_COLOR_SPACE,
534
547
{ {1, {N_("sRGB"), NULL}},
535
548
{2, {N_("Adobe RGB"), NULL}},
536
549
{0xffff, {N_("Uncalibrated"), NULL}},
537
550
{0x0000, {NULL}}}},
552
{0, { { 0, {NULL}}} }
577
591
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
579
/* We need the byte order */
580
if (!e || !e->parent || !e->parent->parent)
582
o = exif_data_get_byte_order (e->parent->parent);
593
/* make sure the returned string is zero terminated */
584
594
memset (val, 0, maxlen);
585
596
memset (b, 0, sizeof (b));
598
/* We need the byte order */
599
if (!e || !e->parent || !e->parent->parent)
601
o = exif_data_get_byte_order (e->parent->parent);
588
603
/* Sanity check */
589
604
if (e->size != e->components * exif_format_get_size (e->format)) {
707
722
CC (e, 1, val, maxlen);
708
723
v_rat = exif_get_rational (e->data, o);
709
724
if (!v_rat.denominator) return val;
710
snprintf (val, maxlen, "f/%.01f", (float) v_rat.numerator /
711
(float) v_rat.denominator);
725
d = (double) v_rat.numerator / (double) v_rat.denominator;
726
snprintf (val, maxlen, "f/%.01lf", d);
713
728
case EXIF_TAG_APERTURE_VALUE:
714
729
case EXIF_TAG_MAX_APERTURE_VALUE:
717
732
v_rat = exif_get_rational (e->data, o);
718
733
if (!v_rat.denominator) return val;
719
734
d = (double) v_rat.numerator / (double) v_rat.denominator;
720
snprintf (val, maxlen, _("%.02f EV"), d);
735
snprintf (val, maxlen, _("%.02lf EV"), d);
721
736
snprintf (b, sizeof (b), _(" (f/%.01f)"), pow (2, d / 2.));
722
737
if (maxlen > strlen (val) + strlen (b))
723
738
strncat (val, b, maxlen - strlen (val) - 1);
753
768
(int) (d * (double) v_rat.numerator /
754
769
(double) v_rat.denominator));
756
snprintf (val, maxlen, "%.1f mm",
757
(float) v_rat.numerator / (float) v_rat.denominator);
771
d = (double) v_rat.numerator / (double) v_rat.denominator;
772
snprintf (val, maxlen, "%.1lf mm", d);
758
773
if (maxlen > strlen (val) + strlen (b))
759
774
strncat (val, b, maxlen - strlen (val) - 1);
763
778
CC (e, 1, val, maxlen);
764
779
v_rat = exif_get_rational (e->data, o);
765
780
if (!v_rat.denominator) return val;
766
snprintf (val, maxlen, "%.1f m", (float) v_rat.numerator /
767
(float) v_rat.denominator);
781
d = (double) v_rat.numerator / (double) v_rat.denominator;
782
snprintf (val, maxlen, "%.1lf m", d);
769
784
case EXIF_TAG_EXPOSURE_TIME:
770
785
CF (e, EXIF_FORMAT_RATIONAL, val, maxlen);
773
788
if (!v_rat.denominator) return val;
774
789
d = (double) v_rat.numerator / (double) v_rat.denominator;
776
snprintf (val, maxlen, _("1/%d"),
791
snprintf (val, maxlen, _("1/%d"), (int) (0.5 + 1. / d));
779
793
snprintf (val, maxlen, _("%d"), (int) d);
780
794
if (maxlen > strlen (val) + strlen (_(" sec.")))
861
875
snprintf (val, maxlen, "%i, %i", v_short, v_short2);
863
case EXIF_TAG_MAKER_NOTE:
864
CF (e, EXIF_FORMAT_UNDEFINED, val, maxlen);
865
snprintf (val, maxlen, _("%i bytes unknown data"),
866
(int) e->components);
868
877
case EXIF_TAG_SUBJECT_AREA:
869
878
CF (e, EXIF_FORMAT_SHORT, val, maxlen);
870
879
switch (e->components) {
914
923
/* Search the tag */
915
924
for (i = 0; list2[i].tag && (list2[i].tag != e->tag); i++);
916
925
if (!list2[i].tag) {
917
strncpy (val, _("Internal error."), maxlen - 1);
926
snprintf (val, maxlen, _("Internal error (unknown "
927
"value %i)"), v_short);
932
942
for (k = 0; list2[i].elem[j].values[k]; k++) {
933
943
l = strlen (_(list2[i].elem[j].values[k]));
934
944
if ((maxlen > l) && (strlen (val) < l))
935
strncpy (val, _(list2[i].elem[j].values[k]), maxlen - 1);
945
strncpy (val, _(list2[i].elem[j].values[k]), maxlen);
937
947
if (!strlen (val)) snprintf (val, maxlen, "%i", v_short);
957
967
/* Search the tag */
958
968
for (i = 0; list[i].tag && (list[i].tag != e->tag); i++);
959
969
if (!list[i].tag) {
960
strncpy (val, _("Internal error."), maxlen - 1);
970
snprintf (val, maxlen, _("Internal error (unknown "
971
"value %i)"), v_short);
965
976
for (j = 0; list[i].strings[j] && (j < v_short); j++);
966
977
if (!list[i].strings[j])
967
978
snprintf (val, maxlen, "%i", v_short);
979
else if (!*list[i].strings[j])
969
strncpy (val, _(list[i].strings[j]), maxlen - 1);
982
strncpy (val, _(list[i].strings[j]), maxlen);
971
984
case EXIF_TAG_XP_TITLE:
972
985
case EXIF_TAG_XP_COMMENT:
988
1001
case EXIF_FORMAT_UNDEFINED:
989
1002
if ((e->tag == EXIF_TAG_SCENE_TYPE) && (e->size == 1)) {
990
1003
snprintf (val, maxlen, "%i", e->data[0]);
1005
snprintf (val, maxlen, _("%i bytes undefined data"),
993
1009
case EXIF_FORMAT_BYTE:
1054
1070
case EXIF_FORMAT_RATIONAL:
1055
1071
v_rat = exif_get_rational (e->data, o);
1056
if (v_rat.denominator) {
1057
snprintf (val, maxlen, "%2.2f", (double)v_rat.numerator / v_rat.denominator);
1059
snprintf (val, maxlen, "%i/%i", v_rat.numerator, v_rat.denominator);
1072
if (v_rat.denominator)
1073
snprintf (val, maxlen, "%2.2lf",
1074
(double) v_rat.numerator /
1075
(double) v_rat.denominator);
1077
snprintf (val, maxlen, "%2.2lf/%2.2lf",
1078
(double) v_rat.numerator,
1079
(double) v_rat.denominator);
1061
1080
maxlen -= strlen (val);
1062
1081
for (i = 1; i < e->components; i++) {
1063
1082
v_rat = exif_get_rational (
1064
1083
e->data + 8 * i, o);
1065
snprintf (b, sizeof (b), ", %2.2f",
1066
(double)v_rat.numerator / v_rat.denominator);
1084
if (v_rat.denominator)
1085
snprintf (b, sizeof (b), ", %2.2lf",
1086
(double) v_rat.numerator /
1087
(double) v_rat.denominator);
1089
snprintf (b, sizeof (b), ", %2.2lf/%2.2lf",
1090
(double) v_rat.numerator,
1091
(double) v_rat.denominator);
1067
1092
strncat (val, b, maxlen);
1068
1093
maxlen -= strlen (b);
1069
if ((signed)maxlen <= 0) break;
1094
if ((signed) maxlen <= 0) break;
1072
1097
case EXIF_FORMAT_SRATIONAL:
1126
1155
e->format = EXIF_FORMAT_LONG;
1127
1156
e->size = exif_format_get_size (e->format) * e->components;
1128
1157
e->data = exif_entry_alloc (e, e->size);
1158
if (!e->data) break;
1131
1161
/* SHORT, 1 component, no default */
1138
1168
case EXIF_TAG_FOCAL_LENGTH_IN_35MM_FILM:
1139
1169
case EXIF_TAG_GAIN_CONTROL:
1140
1170
case EXIF_TAG_SUBJECT_DISTANCE_RANGE:
1171
case EXIF_TAG_COLOR_SPACE:
1172
case EXIF_TAG_FLASH:
1142
1174
/* SHORT, 1 component, default 0 */
1143
1175
case EXIF_TAG_IMAGE_WIDTH:
1154
1186
e->format = EXIF_FORMAT_SHORT;
1155
1187
e->size = exif_format_get_size (e->format) * e->components;
1156
1188
e->data = exif_entry_alloc (e, e->size);
1189
if (!e->data) break;
1157
1190
exif_set_short (e->data, o, 0);
1165
1198
e->format = EXIF_FORMAT_SHORT;
1166
1199
e->size = exif_format_get_size (e->format) * e->components;
1167
1200
e->data = exif_entry_alloc (e, e->size);
1201
if (!e->data) break;
1168
1202
exif_set_short (e->data, o, 1);
1175
1209
e->format = EXIF_FORMAT_SHORT;
1176
1210
e->size = exif_format_get_size (e->format) * e->components;
1177
1211
e->data = exif_entry_alloc (e, e->size);
1212
if (!e->data) break;
1178
1213
exif_set_short (e->data, o, 2);
1184
1219
e->format = EXIF_FORMAT_SHORT;
1185
1220
e->size = exif_format_get_size (e->format) * e->components;
1186
1221
e->data = exif_entry_alloc (e, e->size);
1222
if (!e->data) break;
1187
1223
exif_set_short (e->data, o, 3);
1221
1257
e->format = EXIF_FORMAT_SRATIONAL;
1222
1258
e->size = exif_format_get_size (e->format) * e->components;
1223
1259
e->data = exif_entry_alloc (e, e->size);
1260
if (!e->data) break;
1226
1263
/* RATIONAL, 1 component, no default */
1241
1278
e->format = EXIF_FORMAT_RATIONAL;
1242
1279
e->size = exif_format_get_size (e->format) * e->components;
1243
1280
e->data = exif_entry_alloc (e, e->size);
1281
if (!e->data) break;
1246
1284
/* RATIONAL, 1 component, default 72/1 */
1250
1288
e->format = EXIF_FORMAT_RATIONAL;
1251
1289
e->size = exif_format_get_size (e->format) * e->components;
1252
1290
e->data = exif_entry_alloc (e, e->size);
1291
if (!e->data) break;
1253
1292
r.numerator = 72;
1254
1293
r.denominator = 1;
1255
1294
exif_set_rational (e->data, o, r);
1261
1300
e->format = EXIF_FORMAT_RATIONAL;
1262
1301
e->size = exif_format_get_size (e->format) * e->components;
1263
1302
e->data = exif_entry_alloc (e, e->size);
1303
if (!e->data) break;
1266
1306
/* RATIONAL, 6 components */
1341
1381
/* UNDEFINED, no components, no default */
1382
/* Use this if the tag is otherwise unsupported */
1342
1383
case EXIF_TAG_MAKER_NOTE:
1343
1384
case EXIF_TAG_USER_COMMENT:
1344
1386
e->components = 0;
1345
1387
e->format = EXIF_FORMAT_UNDEFINED;