OLD | NEW |
(Empty) | |
| 1 /* mnote-fuji-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 |
| 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 } |
OLD | NEW |