mnote-olympus-entry.c

Go to the documentation of this file.
00001 /* mnote-olympus-entry.c
00002  *
00003  * Copyright © 2002 Lutz Müller <lutz@users.sourceforge.net>
00004  *
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Lesser General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2 of the License, or (at your option) any later version.
00009  *
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public
00016  * License along with this library; if not, write to the
00017  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018  * Boston, MA 02111-1307, USA.
00019  */
00020 
00021 #include <config.h>
00022 #include "mnote-olympus-entry.h"
00023 
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <string.h>
00027 
00028 #include <libexif/exif-format.h>
00029 #include <libexif/exif-utils.h>
00030 #include <libexif/exif-entry.h>
00031 #include <libexif/i18n.h>
00032 
00033 #define CF(format,target,v,maxlen)                              \
00034 {                                                               \
00035         if (format != target) {                                 \
00036                 snprintf (v, maxlen,                            \
00037                         _("Invalid format '%s', "               \
00038                         "expected '%s'."),                      \
00039                         exif_format_get_name (format),          \
00040                         exif_format_get_name (target));         \
00041                 break;                                          \
00042         }                                                       \
00043 }
00044 
00045 #define CC(number,target,v,maxlen)                                      \
00046 {                                                                       \
00047         if (number != target) {                                         \
00048                 snprintf (v, maxlen,                                    \
00049                         _("Invalid number of components (%i, "          \
00050                         "expected %i)."), (int) number, (int) target);  \
00051                 break;                                                  \
00052         }                                                               \
00053 }
00054 
00055 #define CC2(number,t1,t2,v,maxlen)                                      \
00056 {                                                                       \
00057         if ((number != t1) && (number != t2)) {                         \
00058                 snprintf (v, maxlen,                                    \
00059                         _("Invalid number of components (%i, "          \
00060                         "expected %i or %i)."), (int) number,           \
00061                         (int) t1, (int) t2);                            \
00062                 break;                                                  \
00063         }                                                               \
00064 }
00065 
00066 static struct {
00067         ExifTag tag;
00068     ExifFormat fmt;
00069         struct {
00070                 int index;
00071                 const char *string;
00072         } elem[10];
00073 } items[] = {
00074   { MNOTE_NIKON_TAG_LENSTYPE, EXIF_FORMAT_BYTE,
00075     { {0, N_("AF non D Lens")},
00076       {1, N_("Manual")},
00077       {2, N_("AF-D or AF-S Lens")},
00078       {6, N_("AF-D G Lens")},
00079       {10, N_("AF-D VR Lens")},
00080       {0, NULL}}},
00081   { MNOTE_NIKON_TAG_FLASHUSED, EXIF_FORMAT_BYTE,
00082     { {0, N_("Flash did not fire")},
00083       {4, N_("Flash unit unknown")},
00084       {7, N_("Flash is external")},
00085       {9, N_("Flash is on Camera")},
00086       {0, NULL}}},
00087   { MNOTE_NIKON1_TAG_QUALITY, EXIF_FORMAT_SHORT,
00088     { {1, N_("VGA Basic")},
00089       {2, N_("VGA Normal")},
00090       {3, N_("VGA Fine")},
00091       {4, N_("SXGA Basic")},
00092       {5, N_("SXGA Normal")},
00093       {6, N_("SXGA Fine")},
00094       {10, N_("2 MPixel Basic")},
00095       {11, N_("2 MPixel Normal")},
00096       {12, N_("2 MPixel Fine")},
00097       {0, NULL}}},
00098   { MNOTE_NIKON1_TAG_COLORMODE, EXIF_FORMAT_SHORT,
00099     { {1, N_("Color")},
00100       {2, N_("Monochrome")},
00101       {0, NULL}}},
00102   { MNOTE_NIKON1_TAG_IMAGEADJUSTMENT, EXIF_FORMAT_SHORT,
00103     { {0, N_("Normal")},
00104       {1, N_("Bright+")},
00105       {2, N_("Bright-")},
00106       {3, N_("Contrast+")},
00107       {4, N_("Contrast-")},
00108       {0, NULL}}},
00109   { MNOTE_NIKON1_TAG_CCDSENSITIVITY, EXIF_FORMAT_SHORT,
00110     { {0, N_("ISO80")},
00111       {2, N_("ISO160")},
00112       {4, N_("ISO320")},
00113       {5, N_("ISO100")},
00114       {0, NULL}}},
00115   { MNOTE_NIKON1_TAG_WHITEBALANCE, EXIF_FORMAT_SHORT,
00116     { {0, N_("Auto")},
00117       {1, N_("Preset")},
00118       {2, N_("Daylight")},
00119       {3, N_("Incandescence")},
00120       {4, N_("Fluorescence")},
00121       {5, N_("Cloudy")},
00122       {6, N_("SpeedLight")},
00123       {0, NULL}}},
00124   { MNOTE_NIKON1_TAG_CONVERTER, EXIF_FORMAT_SHORT,
00125     { {0, N_("No Fisheye")},
00126       {1, N_("Fisheye On")},
00127       {0, NULL}}},
00128   { MNOTE_OLYMPUS_TAG_QUALITY, EXIF_FORMAT_SHORT,
00129     { {1, N_("SQ")},
00130       {2, N_("HQ")},
00131       {3, N_("SHQ")},
00132       {0, NULL}}},
00133   { MNOTE_OLYMPUS_TAG_MACRO, EXIF_FORMAT_SHORT,
00134     { {0, N_("No")},
00135       {1, N_("Yes")},
00136       {0, NULL}}},
00137   { MNOTE_OLYMPUS_TAG_DIGIZOOM, EXIF_FORMAT_SHORT,
00138     { {0, N_("1x")},
00139       {2, N_("2x")},
00140       {0, NULL}}},
00141   { MNOTE_OLYMPUS_TAG_FLASHMODE, EXIF_FORMAT_SHORT,
00142     { {0, N_("Auto")},
00143       {1, N_("Red-eye reduction")},
00144       {2, N_("Fill")},
00145       {3, N_("Off")},
00146       {0, NULL}}},
00147   { MNOTE_OLYMPUS_TAG_SHARPNESS, EXIF_FORMAT_SHORT,
00148     { {0, N_("Normal")},
00149       {1, N_("Hard")},
00150       {2, N_("Soft")},
00151       {0, NULL}}},
00152   { MNOTE_OLYMPUS_TAG_CONTRAST, EXIF_FORMAT_SHORT,
00153     { {0, N_("Hard")},
00154       {1, N_("Normal")},
00155       {2, N_("Soft")},
00156       {0, NULL}}},
00157   { MNOTE_OLYMPUS_TAG_MANFOCUS, EXIF_FORMAT_SHORT,
00158     { {0, N_("No")},
00159       {1, N_("Yes")},
00160       {0, NULL}}},
00161   { 0, }
00162 };
00163 
00164 char *
00165 mnote_olympus_entry_get_value (MnoteOlympusEntry *entry, char *v, unsigned int maxlen)
00166 {
00167         char         buf[30];
00168         ExifLong     vl;
00169         ExifShort    vs = 0;
00170         ExifRational vr, vr2;
00171         int          i, j;
00172         double       r, b;
00173 
00174         if (!entry)
00175                 return (NULL);
00176 
00177         memset (v, 0, maxlen);
00178         maxlen--;
00179 
00180         if ((!entry->data) && (entry->components > 0)) return (v);
00181 
00182         switch (entry->tag) {
00183         
00184         /* Nikon */
00185         case MNOTE_NIKON_TAG_FIRMWARE:
00186                 CF (entry->format,  EXIF_FORMAT_UNDEFINED, v, maxlen);
00187                 CC (entry->components, 4, v, maxlen);
00188                 vl = exif_get_long (entry->data, entry->order);
00189                 if ((vl & 0xF0F0F0F0) == 0x30303030) {
00190                         memcpy (v, entry->data, MIN (maxlen, 4));
00191                 } else {
00192                         snprintf (v, maxlen, "%04lx", (long unsigned int) vl);
00193                 }
00194                 break;
00195         case MNOTE_NIKON_TAG_ISO:
00196                 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen);
00197                 CC (entry->components, 2, v, maxlen);
00198                 //vs = exif_get_short (entry->data, entry->order);
00199                 vs = exif_get_short (entry->data + 2, entry->order);
00200                 snprintf (v, maxlen, "ISO %hd", vs);
00201                 break;
00202         case MNOTE_NIKON_TAG_ISO2:
00203                 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen);
00204                 CC (entry->components, 2, v, maxlen);
00205                 //vs = exif_get_short (entry->data, entry->order);
00206                 vs = exif_get_short (entry->data + 2, entry->order);
00207                 snprintf (v, maxlen, "ISO2 %hd", vs);
00208                 break;
00209         case MNOTE_NIKON_TAG_QUALITY:
00210                 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen);
00211                 //CC (entry->components, 8, v, maxlen);
00212                 //vl =  exif_get_long (entry->data  , entry->order);
00213                 //printf("-> 0x%04x\n",entry->data);
00214                 //printf("-> 0x%s<\n",entry->data - 0);
00215                 memcpy(v, entry->data ,entry->components);
00216                 //snprintf (v, maxlen, "%s<",  ( entry->data - 9  );
00217                 break;
00218         case MNOTE_NIKON_TAG_COLORMODE:
00219         case MNOTE_NIKON_TAG_COLORMODE1:
00220         case MNOTE_NIKON_TAG_WHITEBALANCE:
00221         case MNOTE_NIKON_TAG_SHARPENING:
00222         case MNOTE_NIKON_TAG_FOCUSMODE:
00223         case MNOTE_NIKON_TAG_FLASHSETTING:
00224         case MNOTE_NIKON_TAG_ISOSELECTION:
00225         case MNOTE_NIKON_TAG_FLASHMODE:
00226         case MNOTE_NIKON_TAG_IMAGEADJUSTMENT:
00227         case MNOTE_NIKON_TAG_ADAPTER:
00228         case MNOTE_NIKON_TAG_SATURATION2:
00229                 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen);
00230                 memcpy(v, entry->data, MIN (maxlen, entry->components));
00231                 break;
00232         case MNOTE_NIKON_TAG_TOTALPICTURES:
00233                 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen);
00234                 CC (entry->components, 1, v, maxlen);
00235                 vl =  exif_get_long (entry->data, entry->order);
00236                 snprintf (v, maxlen, "%lu",  (long unsigned int) vl );
00237                 break;
00238         case MNOTE_NIKON_TAG_LENS_FSTOPS:
00239         case MNOTE_NIKON_TAG_EXPOSUREDIFF: {
00240                 unsigned char a,b,c,d;
00241                 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen);
00242                 CC (entry->components, 4, v, maxlen);
00243                 vl =  exif_get_long (entry->data, entry->order);
00244                 a = (vl>>24)&0xff; b = (vl>>16)&0xff; c = (vl>>8)&0xff; d = (vl)&0xff;
00245                 snprintf (v, maxlen, "%.1f",  c?(float)a*((float)b/(float)c):0 );
00246                 break;
00247         }
00248         case MNOTE_NIKON_TAG_FLASHEXPCOMPENSATION:
00249         case MNOTE_NIKON_TAG_FLASHEXPOSUREBRACKETVAL:
00250                 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen);
00251                 CC (entry->components, 4, v, maxlen);
00252                 vl =  exif_get_long (entry->data, entry->order);
00253                 snprintf (v, maxlen, "%.1f",  ((long unsigned int) vl>>24)/6.0 );
00254                 break;
00255         case MNOTE_NIKON_TAG_SATURATION:
00256         case MNOTE_NIKON_TAG_WHITEBALANCEFINE:
00257                 CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen);
00258                 CC (entry->components, 1, v, maxlen);
00259                 vs = exif_get_short (entry->data, entry->order);
00260                 snprintf (v, maxlen, "%hd", vs);
00261                 break;
00262         case MNOTE_NIKON_TAG_WHITEBALANCERB:
00263                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00264                 CC (entry->components, 4, v, maxlen);
00265                 vr = exif_get_rational (entry->data, entry->order);
00266                 r = (double)vr.numerator / vr.denominator;
00267                 vr = exif_get_rational (entry->data+8, entry->order);
00268                 b = (double)vr.numerator / vr.denominator;
00269                 //printf("numerator %li, denominator %li\n", vr.numerator, vr.denominator);
00270                 snprintf (v, maxlen, _("Red Correction %f, Blue Correction %f"), r,b);
00271                 break;
00272         case MNOTE_NIKON_TAG_MANUALFOCUSDISTANCE:
00273                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00274                 CC (entry->components, 1, v, maxlen);
00275                 vr = exif_get_rational (entry->data, entry->order);
00276                 if (vr.numerator) {
00277                         r = (double)vr.numerator / vr.denominator;
00278                         snprintf (v, maxlen, _("%2.2f meters"), r);
00279                 } else {
00280                         strncpy (v, _("No manual focus selection"), maxlen);
00281                 }
00282                 break;
00283         case MNOTE_NIKON_TAG_DIGITALZOOM:
00284         case MNOTE_NIKON1_TAG_DIGITALZOOM:
00285                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00286                 CC (entry->components, 1, v, maxlen);
00287                 vr = exif_get_rational (entry->data, entry->order);
00288                 r = (double)vr.numerator / vr.denominator;
00289                 snprintf (v, maxlen, "%2.2f", r);
00290                 break;
00291         case MNOTE_NIKON_TAG_SENSORPIXELSIZE:
00292                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00293                 CC (entry->components, 2, v, maxlen);
00294                 vr = exif_get_rational (entry->data, entry->order);
00295                 vr2 = exif_get_rational (entry->data+8, entry->order);
00296                 r = (double)vr.numerator / vr.denominator;
00297                 b = (double)vr2.numerator / vr2.denominator;
00298                 snprintf (v, maxlen, "%2.2f x %2.2f um", r, b);
00299                 break;
00300         case MNOTE_NIKON_TAG_HUE:
00301                 CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen);
00302                 CC (entry->components, 1, v, maxlen);
00303                 vs = exif_get_short (entry->data, entry->order);
00304                 snprintf (v, maxlen, "%hd", vs);
00305                 break;
00306         case MNOTE_NIKON_TAG_AFFOCUSPOSITION:
00307                 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen);
00308                 CC (entry->components, 4, v, maxlen);
00309                 switch (  *( entry->data+1)  ) {
00310                         case  0: strncpy (v, _("AF Position: Center"), maxlen); break;
00311                         case  1: strncpy (v, _("AF Position: Top"), maxlen); break;
00312                         case  2: strncpy (v, _("AF Position: Bottom"), maxlen); break;
00313                         case  3: strncpy (v, _("AF Position: Left"), maxlen); break;
00314                         case  4: strncpy (v, _("AF Position: Right"), maxlen); break;
00315          case  5: strncpy (v, _("AF Position: Upper-left"), maxlen); break;
00316                         case  6: strncpy (v, _("AF Position: Upper-right"), maxlen); break;
00317                         case  7: strncpy (v, _("AF Position: Lower-left"), maxlen); break;
00318                         case  8: strncpy (v, _("AF Position: Lower-right"), maxlen); break;
00319                         case  9: strncpy (v, _("AF Position: Far Left"), maxlen); break;
00320                         case  10: strncpy (v, _("AF Position: Far Right"), maxlen); break;
00321                         default: strncpy (v, _("Unknown AF Position"), maxlen);
00322                 }     
00323                 break;
00324         case MNOTE_OLYMPUS_TAG_DIGIZOOM:
00325                 if (entry->format == EXIF_FORMAT_RATIONAL) {
00326                         CC (entry->components, 1, v, maxlen);
00327                         vr = exif_get_rational (entry->data, entry->order);
00328                         r = (double)vr.numerator / vr.denominator;
00329                         if (!vr.numerator) {
00330                                 strncpy (v, _("None"), maxlen);
00331                         } else {
00332                                 snprintf (v, maxlen, "%2.2f", r);
00333                         }
00334                         break;
00335                 }
00336                 /* fall through to handle SHORT version of this tag */
00337         case MNOTE_NIKON_TAG_LENSTYPE:
00338         case MNOTE_NIKON_TAG_FLASHUSED:
00339         case MNOTE_NIKON1_TAG_QUALITY:
00340         case MNOTE_NIKON1_TAG_COLORMODE:
00341         case MNOTE_NIKON1_TAG_IMAGEADJUSTMENT:
00342         case MNOTE_NIKON1_TAG_CCDSENSITIVITY:
00343         case MNOTE_NIKON1_TAG_WHITEBALANCE:
00344         case MNOTE_NIKON1_TAG_CONVERTER:
00345         case MNOTE_OLYMPUS_TAG_QUALITY:
00346         case MNOTE_OLYMPUS_TAG_MACRO:
00347         case MNOTE_OLYMPUS_TAG_FLASHMODE:
00348         case MNOTE_OLYMPUS_TAG_SHARPNESS:
00349         case MNOTE_OLYMPUS_TAG_CONTRAST:
00350         case MNOTE_OLYMPUS_TAG_MANFOCUS:
00351                 /* search the tag */
00352                 for (i = 0; (items[i].tag && items[i].tag != entry->tag); i++);
00353                 if (!items[i].tag) {
00354                         strncpy (v, _("Internal error"), maxlen);
00355                         break;
00356                 }
00357                 CF (entry->format, items[i].fmt, v, maxlen);
00358                 CC (entry->components, 1, v, maxlen);
00359                 switch (entry->format) {
00360                 case EXIF_FORMAT_BYTE:
00361                 case EXIF_FORMAT_UNDEFINED:
00362                         vs = entry->data[0];
00363                         break;
00364                 case EXIF_FORMAT_SHORT:
00365                         vs = exif_get_short(entry->data, entry->order);
00366                         break;
00367                 default:
00368                         vs = 0;
00369                         break;
00370                 }
00371                 /* find the value */
00372                 for (j = 0; items[i].elem[j].string &&
00373                             (items[i].elem[j].index < vs); j++);
00374                 if (items[i].elem[j].index != vs) {
00375                         snprintf (v, maxlen, _("Unknown value %hi"), vs);
00376                         break;
00377                 }
00378                 strncpy (v, items[i].elem[j].string, maxlen);
00379                 break;
00380 
00381         case MNOTE_NIKON_TAG_LENS:
00382                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00383                 CC (entry->components, 4, v, maxlen);
00384                 {
00385                         double c,d;
00386                         unsigned long a,b;
00387                         vr = exif_get_rational (entry->data, entry->order);
00388                         a = vr.numerator / vr.denominator;
00389                         vr = exif_get_rational (entry->data+8, entry->order);
00390                         b = vr.numerator / vr.denominator;
00391                         vr = exif_get_rational (entry->data+16, entry->order);
00392                         c = (double)vr.numerator / vr.denominator;
00393                         vr = exif_get_rational (entry->data+24, entry->order);
00394                         d = (double)vr.numerator / vr.denominator;
00395                         //printf("numerator %li, denominator %li\n", vr.numerator, vr.denominator);
00396                         snprintf (v, maxlen, "%ld-%ldmm 1:%3.1f - %3.1f",a,b,c,d);
00397                 }
00398                 break;
00399         case MNOTE_NIKON1_TAG_FOCUS:
00400                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00401                 CC (entry->components, 1, v, maxlen);
00402                 vr = exif_get_rational (entry->data, entry->order);
00403                 if (!vr.denominator) {
00404                         strncpy (v, _("Infinite"), maxlen);
00405                 } else {
00406                         r = (double)vr.numerator / vr.denominator;
00407                         snprintf (v, maxlen, "%2.2f", r);
00408                 }
00409                 break;
00410 
00411         /* Olympus */
00412         case MNOTE_OLYMPUS_TAG_MODE:
00413                 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen);
00414                 CC (entry->components, 3, v, maxlen);
00415                 vl = exif_get_long (entry->data, entry->order);
00416                 switch (vl) {
00417                 case 0:
00418                         strncpy (v, _("normal"), maxlen);
00419                         break;
00420                 case 1:
00421                         strncpy (v, _("unknown"), maxlen);
00422                         break;
00423                 case 2:
00424                         strncpy (v, _("fast"), maxlen);
00425                         break;
00426                 case 3:
00427                         strncpy (v, _("panorama"), maxlen);
00428                         break;
00429                 default:
00430                         snprintf (v, maxlen, _("%li"), (long int) vl);
00431                 }
00432                 vl = exif_get_long (entry->data + 4, entry->order);
00433                 snprintf (buf, sizeof (buf), "/%li/", (long int) vl);
00434                 strncat (v, buf, maxlen - strlen (v));
00435                 vl = exif_get_long (entry->data + 4, entry->order);
00436                 switch (vl) {
00437                 case 1:
00438                         strncat (v, _("left to right"), maxlen - strlen (v));
00439                         break;
00440                 case 2:
00441                         strncat (v, _("right to left"), maxlen - strlen (v));
00442                         break;
00443                 case 3:
00444                         strncat (v, _("bottom to top"), maxlen - strlen (v));
00445                         break;
00446                 case 4:
00447                         strncat (v, _("top to bottom"), maxlen - strlen (v));
00448                         break;
00449                 default:
00450                         snprintf (buf, sizeof (buf), _("%li"),
00451                                   (long int) vl);
00452                         strncat (v, buf, maxlen - strlen (v));
00453                 }
00454                 break;
00455         case MNOTE_OLYMPUS_TAG_UNKNOWN_1:
00456                 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen);
00457                 CC (entry->components, 1, v, maxlen);
00458                 strncpy (v, _("Unknown tag."), maxlen);
00459                 break;
00460         case MNOTE_OLYMPUS_TAG_UNKNOWN_2:
00461                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00462                 CC (entry->components, 1, v, maxlen);
00463                 break;
00464         case MNOTE_OLYMPUS_TAG_UNKNOWN_3:
00465                 CF (entry->format, EXIF_FORMAT_SSHORT, v, maxlen);
00466                 CC (entry->components, 1, v, maxlen);
00467                 break;
00468         case MNOTE_OLYMPUS_TAG_VERSION:
00469                 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen);
00470                 CC2 (entry->components, 5, 8, v, maxlen);
00471                 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
00472                 break;
00473         case MNOTE_OLYMPUS_TAG_INFO:
00474                 CF (entry->format, EXIF_FORMAT_ASCII, v, maxlen);
00475                 CC2 (entry->components, 52, 53, v, maxlen);
00476                 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
00477                 break;
00478         case MNOTE_OLYMPUS_TAG_ID:
00479                 CF (entry->format, EXIF_FORMAT_UNDEFINED, v, maxlen);
00480                 CC (entry->components, 32, v, maxlen);
00481                 strncpy (v, (char *)entry->data, MIN (maxlen, entry->size));
00482                 break;
00483         case MNOTE_OLYMPUS_TAG_UNKNOWN_4:
00484                 CF (entry->format, EXIF_FORMAT_LONG, v, maxlen);
00485                 CC (entry->components, 30, v, maxlen);
00486                 break;
00487         case MNOTE_OLYMPUS_TAG_FOCUSDIST:
00488                 CF (entry->format, EXIF_FORMAT_RATIONAL, v, maxlen);
00489                 CC (entry->components, 1, v, maxlen);
00490                 vr = exif_get_rational (entry->data, entry->order);
00491                 if (vr.numerator == 0) {
00492                         strncpy (v, _("Unknown"), maxlen);
00493                 }
00494                 else {
00495                         unsigned long tmp = vr.numerator / vr.denominator;
00496                         /* printf("numerator %li, denominator %li\n", vr.numerator, vr.denominator); */
00497                         snprintf (v, maxlen, "%li mm", tmp);
00498                 }
00499                 break;
00500         case MNOTE_OLYMPUS_TAG_WBALANCE:
00501                 CF (entry->format, EXIF_FORMAT_SHORT, v, maxlen);
00502                 CC (entry->components, 2, v, maxlen);
00503                 vs = exif_get_short (entry->data, entry->order);
00504                 switch (vs) {
00505                 case 1:
00506                         strncpy (v, _("Automatic"), maxlen);
00507                         break;
00508                 case 2:
00509                         {
00510                                 ExifShort v2 = exif_get_short (entry->data + 2, entry->order);
00511                                 unsigned long colorTemp = 0;
00512                                 switch (v2) {
00513                                 case 2:
00514                                         colorTemp = 3000;
00515                                         break;
00516                                 case 3:
00517                                         colorTemp = 3700;
00518                                         break;
00519                                 case 4:
00520                                         colorTemp = 4000;
00521                                         break;
00522                                 case 5:
00523                                         colorTemp = 4500;
00524                                         break;
00525                                 case 6:
00526                                         colorTemp = 5500;
00527                                         break;
00528                                 case 7:
00529                                         colorTemp = 6500;
00530                                         break;
00531                                 case 9:
00532                                         colorTemp = 7500;
00533                                         break;
00534                                 }
00535                                 if (colorTemp) {
00536                                         snprintf (v, maxlen, "Manual: %liK", colorTemp);
00537                                 }
00538                                 else {
00539                                         strncpy (v, _("Manual: Unknown"), maxlen);
00540                                 }
00541 
00542                         }
00543                         break;
00544                 case 3:
00545                         strncpy (v, _("One-touch"), maxlen);
00546                         break;
00547                 default:
00548                         strncpy (v, _("Unknown"), maxlen);
00549                         break;
00550                 }
00551                 break;
00552         default:
00553                 switch (entry->format) {
00554                 case EXIF_FORMAT_ASCII:
00555                         strncpy (v, (char *)entry->data,
00556                                  MIN (maxlen, entry->components));
00557                         break;
00558                 case EXIF_FORMAT_SHORT:
00559                         vs = exif_get_short (entry->data, entry->order);
00560                         snprintf (v, maxlen, "%hi", vs);
00561                         break;
00562                 case EXIF_FORMAT_LONG:
00563                         vl = exif_get_long (entry->data, entry->order);
00564                         snprintf (v, maxlen, "%li", (long int) vl);
00565                         break;
00566                 case EXIF_FORMAT_UNDEFINED:
00567                 default:
00568                         snprintf (v, maxlen, _("%li bytes unknown data: "),
00569                                   (long int) entry->size);
00570                         for (i = 0; i < (int)entry->size; i++) {
00571                                 sprintf (buf, "%02x", entry->data[i]);
00572                                 strncat (v, buf, maxlen - strlen (v));
00573                         }
00574                         break;
00575                 }
00576                 break;
00577         }
00578 
00579         return (v);
00580 }

Generated on Fri Jun 15 20:58:44 2007 for EXIF library (libexif) Internals by  doxygen 1.5.0