1 /* mnote-fuji-entry.c 2 * 3 * Copyright (c) 2002 Lutz Mueller <lutz (at) 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 53 static 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 fluorescent")}, 77 {0x301, N_("Day white 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 189 char * 190 mnote_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