OLD | NEW |
1 /* mnote-olympus-entry.c | 1 /* mnote-olympus-entry.c |
2 * | 2 * |
3 * Copyright (c) 2002-2009 Lutz Mueller <lutz@users.sourceforge.net> et. al. | 3 * Copyright (c) 2002-2009 Lutz Mueller <lutz@users.sourceforge.net> et. al. |
4 * | 4 * |
5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Lesser General Public | 6 * modify it under the terms of the GNU Lesser General Public |
7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
9 * | 9 * |
10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
69 { \ | 69 { \ |
70 if ((number < t1) || (number > t2)) { \ | 70 if ((number < t1) || (number > t2)) { \ |
71 snprintf (v, maxlen, \ | 71 snprintf (v, maxlen, \ |
72 _("Invalid number of components (%i, " \ | 72 _("Invalid number of components (%i, " \ |
73 "expected %i or %i)."), (int) number, \ | 73 "expected %i or %i)."), (int) number, \ |
74 (int) t1, (int) t2); \ | 74 (int) t1, (int) t2); \ |
75 break; \ | 75 break; \ |
76 } \ | 76 } \ |
77 } | 77 } |
78 | 78 |
| 79 #define R2L(n) ((n).denominator ? (long)(n).numerator/(n).denominator : 0L) |
| 80 #define R2D(n) ((n).denominator ? (double)(n).numerator/(n).denominator : 0.0) |
| 81 |
79 static const struct { | 82 static const struct { |
80 ExifTag tag; | 83 ExifTag tag; |
81 ExifFormat fmt; | 84 ExifFormat fmt; |
82 struct { | 85 struct { |
83 int index; | 86 int index; |
84 const char *string; | 87 const char *string; |
85 } elem[24]; | 88 } elem[24]; |
86 } items[] = { | 89 } items[] = { |
87 #ifndef NO_VERBOSE_TAG_DATA | 90 #ifndef NO_VERBOSE_TAG_DATA |
88 { MNOTE_NIKON_TAG_LENSTYPE, EXIF_FORMAT_BYTE, | 91 { MNOTE_NIKON_TAG_LENSTYPE, EXIF_FORMAT_BYTE, |
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 | 283 |
281 if (!entry) | 284 if (!entry) |
282 return (NULL); | 285 return (NULL); |
283 | 286 |
284 memset (v, 0, maxlen); | 287 memset (v, 0, maxlen); |
285 maxlen--; | 288 maxlen--; |
286 | 289 |
287 if ((!entry->data) && (entry->components > 0)) | 290 if ((!entry->data) && (entry->components > 0)) |
288 return (v); | 291 return (v); |
289 | 292 |
| 293 if ((!entry->data) && (entry->size > 0)) |
| 294 return NULL; /* internal inconsistency error */ |
| 295 |
290 switch (entry->tag) { | 296 switch (entry->tag) { |
291 | 297 |
292 /* Nikon */ | 298 /* Nikon */ |
293 case MNOTE_NIKON_TAG_FIRMWARE: | 299 case MNOTE_NIKON_TAG_FIRMWARE: |
294 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen); | 300 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen); |
295 CC (entry->components, 4, v, maxlen); | 301 CC (entry->components, 4, v, maxlen); |
296 vl = exif_get_long (entry->data, entry->order); | 302 vl = exif_get_long (entry->data, entry->order); |
297 if ((vl & 0xF0F0F0F0) == 0x30303030) { | 303 if ((vl & 0xF0F0F0F0) == 0x30303030) { |
298 memcpy (v, entry->data, MIN (maxlen, 4)); | 304 memcpy (v, entry->data, MIN (maxlen, 4)); |
299 } else { | 305 } else { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
362 case MNOTE_OLYMPUS_TAG_LENSTEMPERATURE: | 368 case MNOTE_OLYMPUS_TAG_LENSTEMPERATURE: |
363 CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen); | 369 CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen); |
364 CC (entry->components, 1, v, maxlen); | 370 CC (entry->components, 1, v, maxlen); |
365 vs = exif_get_short (entry->data, entry->order); | 371 vs = exif_get_short (entry->data, entry->order); |
366 snprintf (v, maxlen, "%hd", vs); | 372 snprintf (v, maxlen, "%hd", vs); |
367 break; | 373 break; |
368 case MNOTE_NIKON_TAG_WHITEBALANCERB: | 374 case MNOTE_NIKON_TAG_WHITEBALANCERB: |
369 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); | 375 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
370 CC (entry->components, 4, v, maxlen); | 376 CC (entry->components, 4, v, maxlen); |
371 vr = exif_get_rational (entry->data, entry->order); | 377 vr = exif_get_rational (entry->data, entry->order); |
372 » » r = (double)vr.numerator / vr.denominator; | 378 » » r = R2D(vr); |
373 vr = exif_get_rational (entry->data+8, entry->order); | 379 vr = exif_get_rational (entry->data+8, entry->order); |
374 » » b = (double)vr.numerator / vr.denominator; | 380 » » b = R2D(vr); |
375 snprintf (v, maxlen, _("Red Correction %f, blue Correction %f"),
r,b); | 381 snprintf (v, maxlen, _("Red Correction %f, blue Correction %f"),
r,b); |
376 break; | 382 break; |
377 case MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE: | 383 case MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE: |
378 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); | 384 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
379 CC (entry->components, 1, v, maxlen); | 385 CC (entry->components, 1, v, maxlen); |
380 vr = exif_get_rational (entry->data, entry->order); | 386 vr = exif_get_rational (entry->data, entry->order); |
381 » » if (vr.numerator) { | 387 » » if (!vr.numerator || !vr.denominator) { |
382 » » » r = (double)vr.numerator / vr.denominator; | 388 » » » strncpy (v, _("No manual focus selection"), maxlen); |
| 389 » » } else { |
| 390 » » » r = R2D(vr); |
383 snprintf (v, maxlen, _("%2.2f meters"), r); | 391 snprintf (v, maxlen, _("%2.2f meters"), r); |
384 } else { | |
385 strncpy (v, _("No manual focus selection"), maxlen); | |
386 } | 392 } |
387 break; | 393 break; |
388 case MNOTE_NIKON_TAG_SENSORPIXELSIZE: | 394 case MNOTE_NIKON_TAG_SENSORPIXELSIZE: |
389 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); | 395 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
390 CC (entry->components, 2, v, maxlen); | 396 CC (entry->components, 2, v, maxlen); |
391 vr = exif_get_rational (entry->data, entry->order); | 397 vr = exif_get_rational (entry->data, entry->order); |
392 vr2 = exif_get_rational (entry->data+8, entry->order); | 398 vr2 = exif_get_rational (entry->data+8, entry->order); |
393 » » r = (double)vr.numerator / vr.denominator; | 399 » » r = R2D(vr); |
394 » » b = (double)vr2.numerator / vr2.denominator; | 400 » » b = R2D(vr2); |
395 snprintf (v, maxlen, "%2.2f x %2.2f um", r, b); | 401 snprintf (v, maxlen, "%2.2f x %2.2f um", r, b); |
396 break; | 402 break; |
397 case MNOTE_NIKON_TAG_BRACKETING: | 403 case MNOTE_NIKON_TAG_BRACKETING: |
398 CF2 (entry->format, EXIF_FORMAT_BYTE, EXIF_FORMAT_SHORT, v, maxl
en); | 404 CF2 (entry->format, EXIF_FORMAT_BYTE, EXIF_FORMAT_SHORT, v, maxl
en); |
399 CC (entry->components, 1, v, maxlen); | 405 CC (entry->components, 1, v, maxlen); |
400 if (EXIF_FORMAT_SHORT == entry->format) { | 406 if (EXIF_FORMAT_SHORT == entry->format) { |
401 vs = exif_get_short (entry->data, entry->order); | 407 vs = exif_get_short (entry->data, entry->order); |
402 } else { | 408 } else { |
403 vs = entry->data[0]; | 409 vs = entry->data[0]; |
404 } | 410 } |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 if (items[i].elem[j].index != vs) { | 446 if (items[i].elem[j].index != vs) { |
441 snprintf (v, maxlen, _("Unknown value %hi"), vs); | 447 snprintf (v, maxlen, _("Unknown value %hi"), vs); |
442 break; | 448 break; |
443 } | 449 } |
444 strncpy (v, _(items[i].elem[j].string), maxlen); | 450 strncpy (v, _(items[i].elem[j].string), maxlen); |
445 break; | 451 break; |
446 case MNOTE_OLYMPUS_TAG_DIGIZOOM: | 452 case MNOTE_OLYMPUS_TAG_DIGIZOOM: |
447 if (entry->format == EXIF_FORMAT_RATIONAL) { | 453 if (entry->format == EXIF_FORMAT_RATIONAL) { |
448 CC (entry->components, 1, v, maxlen); | 454 CC (entry->components, 1, v, maxlen); |
449 vr = exif_get_rational (entry->data, entry->order); | 455 vr = exif_get_rational (entry->data, entry->order); |
450 » » » if (!vr.numerator) { | 456 » » » if (!vr.numerator || !vr.denominator) { |
451 strncpy (v, _("None"), maxlen); | 457 strncpy (v, _("None"), maxlen); |
452 } else { | 458 } else { |
453 » » » » r = (double)vr.numerator / vr.denominator; | 459 » » » » r = R2D(vr); |
454 snprintf (v, maxlen, "%2.2f", r); | 460 snprintf (v, maxlen, "%2.2f", r); |
455 } | 461 } |
456 break; | 462 break; |
457 } | 463 } |
458 /* fall through to handle SHORT version of this tag */ | 464 /* fall through to handle SHORT version of this tag */ |
459 case MNOTE_NIKON_TAG_LENSTYPE: | 465 case MNOTE_NIKON_TAG_LENSTYPE: |
460 case MNOTE_NIKON_TAG_FLASHUSED: | 466 case MNOTE_NIKON_TAG_FLASHUSED: |
461 case MNOTE_NIKON1_TAG_QUALITY: | 467 case MNOTE_NIKON1_TAG_QUALITY: |
462 case MNOTE_NIKON1_TAG_COLORMODE: | 468 case MNOTE_NIKON1_TAG_COLORMODE: |
463 case MNOTE_NIKON1_TAG_IMAGEADJUSTMENT: | 469 case MNOTE_NIKON1_TAG_IMAGEADJUSTMENT: |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
558 break; | 564 break; |
559 } | 565 } |
560 break; | 566 break; |
561 case MNOTE_NIKON_TAG_LENS: | 567 case MNOTE_NIKON_TAG_LENS: |
562 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); | 568 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
563 CC (entry->components, 4, v, maxlen); | 569 CC (entry->components, 4, v, maxlen); |
564 { | 570 { |
565 double c,d; | 571 double c,d; |
566 unsigned long a,b; | 572 unsigned long a,b; |
567 vr = exif_get_rational (entry->data, entry->order); | 573 vr = exif_get_rational (entry->data, entry->order); |
568 » » » a = vr.numerator / vr.denominator; | 574 » » » a = R2L(vr); |
569 vr = exif_get_rational (entry->data+8, entry->order); | 575 vr = exif_get_rational (entry->data+8, entry->order); |
570 » » » b = vr.numerator / vr.denominator; | 576 » » » b = R2L(vr); |
571 vr = exif_get_rational (entry->data+16, entry->order); | 577 vr = exif_get_rational (entry->data+16, entry->order); |
572 » » » c = (double)vr.numerator / vr.denominator; | 578 » » » c = R2D(vr); |
573 vr = exif_get_rational (entry->data+24, entry->order); | 579 vr = exif_get_rational (entry->data+24, entry->order); |
574 » » » d = (double)vr.numerator / vr.denominator; | 580 » » » d = R2D(vr); |
575 snprintf (v, maxlen, "%ld-%ldmm 1:%3.1f - %3.1f",a,b,c,d
); | 581 snprintf (v, maxlen, "%ld-%ldmm 1:%3.1f - %3.1f",a,b,c,d
); |
576 } | 582 } |
577 break; | 583 break; |
578 | 584 |
579 /* Olympus */ | 585 /* Olympus */ |
580 case MNOTE_OLYMPUS_TAG_MODE: | 586 case MNOTE_OLYMPUS_TAG_MODE: |
581 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen); | 587 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen); |
582 CC (entry->components, 3, v, maxlen); | 588 CC (entry->components, 3, v, maxlen); |
583 vl = exif_get_long (entry->data, entry->order); | 589 vl = exif_get_long (entry->data, entry->order); |
584 switch (vl) { | 590 switch (vl) { |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 for (i=0; i < (int)entry->components; ++i) { | 678 for (i=0; i < (int)entry->components; ++i) { |
673 vl = exif_get_long (entry->data+4*i, entry->order); | 679 vl = exif_get_long (entry->data+4*i, entry->order); |
674 sprintf (buf, "%lu ", (unsigned long)vl); | 680 sprintf (buf, "%lu ", (unsigned long)vl); |
675 strncat (v, buf, maxlen - strlen (v)); | 681 strncat (v, buf, maxlen - strlen (v)); |
676 } | 682 } |
677 break; | 683 break; |
678 case MNOTE_OLYMPUS_TAG_FOCUSDIST: | 684 case MNOTE_OLYMPUS_TAG_FOCUSDIST: |
679 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); | 685 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen); |
680 CC (entry->components, 1, v, maxlen); | 686 CC (entry->components, 1, v, maxlen); |
681 vr = exif_get_rational (entry->data, entry->order); | 687 vr = exif_get_rational (entry->data, entry->order); |
682 » » if (vr.numerator == 0) { | 688 » » if (!vr.numerator || !vr.denominator) { |
683 strncpy (v, _("Unknown"), maxlen); | 689 strncpy (v, _("Unknown"), maxlen); |
684 } | 690 } |
685 else { | 691 else { |
686 unsigned long tmp = vr.numerator / vr.denominator; | 692 unsigned long tmp = vr.numerator / vr.denominator; |
687 snprintf (v, maxlen, "%li mm", tmp); | 693 snprintf (v, maxlen, "%li mm", tmp); |
688 } | 694 } |
689 break; | 695 break; |
690 case MNOTE_OLYMPUS_TAG_WBALANCE: | 696 case MNOTE_OLYMPUS_TAG_WBALANCE: |
691 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); | 697 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen); |
692 CC (entry->components, 2, v, maxlen); | 698 CC (entry->components, 2, v, maxlen); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
783 CC (entry->components, 1, v, maxlen); | 789 CC (entry->components, 1, v, maxlen); |
784 vl = exif_get_long (entry->data, entry->order); | 790 vl = exif_get_long (entry->data, entry->order); |
785 snprintf (v, maxlen, "%li", (long int) vl); | 791 snprintf (v, maxlen, "%li", (long int) vl); |
786 break; | 792 break; |
787 case EXIF_FORMAT_RATIONAL: | 793 case EXIF_FORMAT_RATIONAL: |
788 CC (entry->components, 1, v, maxlen); | 794 CC (entry->components, 1, v, maxlen); |
789 vr = exif_get_rational (entry->data, entry->order); | 795 vr = exif_get_rational (entry->data, entry->order); |
790 if (!vr.denominator) { | 796 if (!vr.denominator) { |
791 strncpy (v, _("Infinite"), maxlen); | 797 strncpy (v, _("Infinite"), maxlen); |
792 } else { | 798 } else { |
793 » » » » r = (double)vr.numerator / vr.denominator; | 799 » » » » r = R2D(vr); |
794 snprintf (v, maxlen, "%2.3f", r); | 800 snprintf (v, maxlen, "%2.3f", r); |
795 } | 801 } |
796 break; | 802 break; |
797 case EXIF_FORMAT_SRATIONAL: | 803 case EXIF_FORMAT_SRATIONAL: |
798 CC (entry->components, 1, v, maxlen); | 804 CC (entry->components, 1, v, maxlen); |
799 vsr = exif_get_srational (entry->data, entry->order); | 805 vsr = exif_get_srational (entry->data, entry->order); |
800 if (!vsr.denominator) { | 806 if (!vsr.denominator) { |
801 strncpy (v, _("Infinite"), maxlen); | 807 strncpy (v, _("Infinite"), maxlen); |
802 } else { | 808 } else { |
803 » » » » r = (double)vsr.numerator / vsr.denominator; | 809 » » » » r = R2D(vsr); |
804 snprintf (v, maxlen, "%2.3f", r); | 810 snprintf (v, maxlen, "%2.3f", r); |
805 } | 811 } |
806 break; | 812 break; |
807 case EXIF_FORMAT_UNDEFINED: | 813 case EXIF_FORMAT_UNDEFINED: |
808 default: | 814 default: |
809 snprintf (v, maxlen, _("%i bytes unknown data: "), | 815 snprintf (v, maxlen, _("%i bytes unknown data: "), |
810 entry->size); | 816 entry->size); |
811 for (i = 0; i < (int)entry->size; i++) { | 817 for (i = 0; i < (int)entry->size; i++) { |
812 sprintf (buf, "%02x", entry->data[i]); | 818 sprintf (buf, "%02x", entry->data[i]); |
813 strncat (v, buf, maxlen - strlen (v)); | 819 strncat (v, buf, maxlen - strlen (v)); |
814 } | 820 } |
815 break; | 821 break; |
816 } | 822 } |
817 break; | 823 break; |
818 } | 824 } |
819 | 825 |
820 return (v); | 826 return (v); |
821 } | 827 } |
OLD | NEW |