Mercurial > geeqie
annotate src/format_olympus.c @ 1367:fe4da037be21
When g_new0() is used, drop redundant initializations to NULL, FALSE or 0, second pass.
| author | zas_ |
|---|---|
| date | Sun, 01 Mar 2009 23:14:19 +0000 |
| parents | 8b89e3ff286b |
| children | bc3f5c0432f6 |
| rev | line source |
|---|---|
| 57 | 1 /* |
| 541 | 2 * Geeqie |
| 3 * (C) 2005 John Ellis | |
| 1284 | 4 * Copyright (C) 2008 - 2009 The Geeqie Team |
| 57 | 5 * |
| 6 * This software is released under the GNU General Public License (GNU GPL). | |
| 7 * Please read the included file COPYING for more information. | |
| 8 * This software comes with no warranty of any kind, use at your own risk! | |
| 9 */ | |
| 10 | |
| 11 #ifdef HAVE_CONFIG_H | |
| 12 # include "config.h" | |
| 13 #endif | |
| 14 | |
| 177 | 15 #ifndef HAVE_EXIV2 |
| 57 | 16 |
| 17 #include <stdio.h> | |
| 18 #include <string.h> | |
| 19 #include <unistd.h> | |
| 20 | |
| 21 #include <glib.h> | |
| 22 | |
| 23 #include "intl.h" | |
| 24 | |
| 281 | 25 #include "main.h" |
| 57 | 26 #include "format_olympus.h" |
| 27 #include "format_raw.h" | |
| 28 | |
| 29 #include "exif.h" | |
| 30 | |
| 31 | |
| 32 /* | |
| 33 *----------------------------------------------------------------------------- | |
|
101
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
34 * Raw ORF embedded jpeg extraction for Olympus |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
35 *----------------------------------------------------------------------------- |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
36 */ |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
37 |
|
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
541
diff
changeset
|
38 static guint olympus_tiff_table(guchar *data, const guint len, guint offset, ExifByteOrder bo, |
|
101
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
39 gint level, |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
40 guint *image_offset, guint *exif_offset); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
41 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
42 |
|
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
541
diff
changeset
|
43 static void olympus_tiff_entry(guchar *data, const guint len, guint offset, ExifByteOrder bo, |
|
101
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
44 gint level, |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
45 guint *image_offset, guint *exif_offset) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
46 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
47 guint tag; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
48 guint type; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
49 guint count; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
50 guint segment; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
51 guint seg_len; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
52 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
53 tag = exif_byte_get_int16(data + offset + EXIF_TIFD_OFFSET_TAG, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
54 type = exif_byte_get_int16(data + offset + EXIF_TIFD_OFFSET_FORMAT, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
55 count = exif_byte_get_int32(data + offset + EXIF_TIFD_OFFSET_COUNT, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
56 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
57 /* so far, we only care about tags with type long */ |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
58 if (type != EXIF_FORMAT_LONG_UNSIGNED && type != EXIF_FORMAT_LONG) return; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
59 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
60 seg_len = ExifFormatList[type].size * count; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
61 if (seg_len > 4) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
62 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
63 segment = exif_byte_get_int32(data + offset + EXIF_TIFD_OFFSET_DATA, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
64 if (segment + seg_len > len) return; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
65 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
66 else |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
67 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
68 segment = offset + EXIF_TIFD_OFFSET_DATA; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
69 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
70 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
71 if (tag == 0x201) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
72 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
73 /* start of embedded jpeg, not all olympus cameras embed a jpeg */ |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
74 *image_offset = exif_byte_get_int32(data + segment, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
75 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
76 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
77 if (tag == 0x8769) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
78 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
79 /* This is the Exif info */ |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
80 *exif_offset = exif_byte_get_int32(data + segment, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
81 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
82 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
83 |
|
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
541
diff
changeset
|
84 static guint olympus_tiff_table(guchar *data, const guint len, guint offset, ExifByteOrder bo, |
|
101
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
85 gint level, |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
86 guint *image_offset, guint *exif_offset) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
87 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
88 guint count; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
89 guint i; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
90 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
91 if (level > EXIF_TIFF_MAX_LEVELS) return 0; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
92 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
93 if (len < offset + 2) return FALSE; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
94 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
95 count = exif_byte_get_int16(data + offset, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
96 offset += 2; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
97 if (len < offset + count * EXIF_TIFD_SIZE + 4) return 0; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
98 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
99 for (i = 0; i < count; i++) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
100 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
101 olympus_tiff_entry(data, len, offset + i * EXIF_TIFD_SIZE, bo, level, |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
102 image_offset, exif_offset); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
103 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
104 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
105 return exif_byte_get_int32(data + offset + count * EXIF_TIFD_SIZE, bo); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
106 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
107 |
|
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
541
diff
changeset
|
108 gint format_olympus_raw(guchar *data, const guint len, |
|
101
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
109 guint *image_offset, guint *exif_offset) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
110 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
111 guint i_off = 0; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
112 guint e_off = 0; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
113 guint offset; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
114 gint level; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
115 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
116 if (len < 8) return FALSE; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
117 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
118 /* these are in tiff file format with a different magick header */ |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
119 if (memcmp(data, "IIR", 3) != 0) return FALSE; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
120 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
121 offset = exif_byte_get_int32(data + 4, EXIF_BYTE_ORDER_INTEL); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
122 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
123 level = 0; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
124 while (offset && level < EXIF_TIFF_MAX_LEVELS) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
125 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
126 offset = olympus_tiff_table(data, len, offset, EXIF_BYTE_ORDER_INTEL, 0, &i_off, &e_off); |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
127 level++; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
128 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
129 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
130 if (i_off != 0 || e_off != 0) |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
131 { |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
132 if (image_offset) *image_offset = i_off; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
133 if (exif_offset) *exif_offset = e_off; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
134 return TRUE; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
135 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
136 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
137 return FALSE; |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
138 } |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
139 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
140 |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
141 /* |
|
847e4bc6b54c
Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents:
100
diff
changeset
|
142 *----------------------------------------------------------------------------- |
| 57 | 143 * EXIF Makernote for Olympus |
| 144 *----------------------------------------------------------------------------- | |
| 145 */ | |
| 146 | |
| 147 static ExifTextList KonMinTagColorMode[]= { | |
| 148 { 0, "natural" }, | |
| 149 { 1, "black and white" }, | |
| 150 { 2, "vivid" }, | |
| 151 { 3, "solarization" }, | |
| 152 { 4, "Adobe RGB" }, | |
| 153 EXIF_TEXT_LIST_END | |
| 154 }; | |
| 155 | |
| 156 static ExifTextList KonMinTagQuality[]= { | |
| 157 { 0, "raw" }, | |
| 158 { 1, "super fine" }, | |
| 159 { 2, "find" }, | |
| 160 { 3, "standard" }, | |
| 161 { 4, "extra fine" }, | |
| 162 EXIF_TEXT_LIST_END | |
| 163 }; | |
| 164 | |
| 165 static ExifTextList OlympusTagJpegQuality[]= { | |
| 166 { 1, "standard" }, | |
| 167 { 2, "high" }, | |
| 168 { 3, "super high" }, | |
| 169 EXIF_TEXT_LIST_END | |
| 170 }; | |
| 171 | |
| 172 static ExifTextList OlympusTagMacro[]= { | |
| 173 { 0, "off" }, | |
| 174 { 1, "on" }, | |
| 175 { 2, "view" }, | |
| 176 { 3, "manual" }, | |
| 177 EXIF_TEXT_LIST_END | |
| 178 }; | |
| 179 | |
| 180 static ExifTextList OlympusTagFlashMode[]= { | |
| 181 { 0, "auto" }, | |
| 182 { 1, "red-eye reduction" }, | |
| 183 { 2, "fill" }, | |
| 184 { 3, "off" }, | |
| 185 EXIF_TEXT_LIST_END | |
| 186 }; | |
| 187 | |
| 188 static ExifTextList OlympusTagFocusMode[]= { | |
| 189 { 0, "auto" }, | |
| 190 { 1, "manual" }, | |
| 191 EXIF_TEXT_LIST_END | |
| 192 }; | |
| 193 | |
| 194 static ExifTextList OlympusTagSharpness[]= { | |
| 195 { 0, "normal" }, | |
| 196 { 1, "hard" }, | |
| 197 { 2, "soft" }, | |
| 198 EXIF_TEXT_LIST_END | |
| 199 }; | |
| 200 | |
| 201 static ExifTextList OlympusTagContrast[]= { | |
| 202 { 0, "hard" }, | |
| 203 { 1, "normal" }, | |
| 204 { 2, "soft" }, | |
| 205 EXIF_TEXT_LIST_END | |
| 206 }; | |
| 207 | |
| 208 #if 0 | |
| 209 static ExifTextList OlympusTag[]= { | |
| 210 { , "" }, | |
| 211 { , "" }, | |
| 212 EXIF_TEXT_LIST_END | |
| 213 }; | |
| 214 #endif | |
| 215 | |
| 216 | |
| 217 static ExifMarker OlympusExifMarkersList[] = { | |
| 218 { 0x0001, EXIF_FORMAT_LONG_UNSIGNED, -1, "Konica/MinoltaSettings", "Konica / Minolta settings", NULL }, | |
| 219 { 0x0003, EXIF_FORMAT_LONG_UNSIGNED, -1, "Konica/MinoltaSettings", "Konica / Minolta settings", NULL }, | |
| 220 { 0x0040, EXIF_FORMAT_LONG_UNSIGNED, -1, "CompressedImageSize", "Compressed image size", NULL }, | |
| 221 { 0x0081, EXIF_FORMAT_LONG_UNSIGNED, 1, "ThumbnailOffset", "Thumbnail offset", NULL }, | |
| 222 { 0x0088, EXIF_FORMAT_LONG_UNSIGNED, 1, "ThumbnailOffset", "Thumbnail offset", NULL }, | |
| 223 { 0x0089, EXIF_FORMAT_LONG_UNSIGNED, 1, "ThumbnailLength", "Thumbnail length", NULL }, | |
| 224 { 0x0101, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Konica/Minolta.ColorMode", "Color mode", KonMinTagColorMode }, | |
| 225 { 0x0102, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Konica/Minolta.Quality", "Quality", KonMinTagQuality }, | |
| 226 { 0x0103, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Konica/Minolta.Quality", "Quality", KonMinTagQuality }, | |
| 227 { 0x0200, EXIF_FORMAT_LONG_UNSIGNED, 3, "Olympus.SpecialMode", "Special mode", NULL }, | |
| 228 { 0x0201, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.JpegQuality", "Jpeg quality", OlympusTagJpegQuality }, | |
| 229 { 0x0202, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.Macro", "Macro", OlympusTagMacro }, | |
| 230 { 0x0204, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Olympus.DigitalZoom", "Digital zoom", NULL }, | |
| 231 { 0x0207, EXIF_FORMAT_STRING, -1, "Olympus.Firmware", "Firmware version", NULL }, | |
| 232 { 0x0208, EXIF_FORMAT_STRING, -1, "Olympus.PictureInfo", "Picture info", NULL }, | |
| 233 { 0x0209, EXIF_FORMAT_UNDEFINED, -1, "Olympus.CameraID", "Camera ID", NULL }, | |
| 234 { 0x020b, EXIF_FORMAT_LONG_UNSIGNED, 1, "Epson.ImageWidth", "Image width", NULL }, | |
| 235 { 0x020c, EXIF_FORMAT_LONG_UNSIGNED, 1, "Epson.ImageHeight", "Image height", NULL }, | |
| 236 { 0x020d, EXIF_FORMAT_STRING, -1, "Epson.Manufacturer", "Manufacturer", NULL }, | |
| 237 { 0x0e00, EXIF_FORMAT_BYTE, -1, "Olympus.PrintImageMatching", "Print image matching", NULL }, | |
| 238 { 0x1004, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.FlashMode", "Flash mode", OlympusTagFlashMode }, | |
|
100
deafec7cd99f
Mon Nov 6 20:53:22 2006 John Ellis <johne@verizon.net>
gqview
parents:
58
diff
changeset
|
239 { 0x1006, EXIF_FORMAT_RATIONAL, 1, "Olympus.Bracket", "Bracket", NULL }, |
| 57 | 240 { 0x100b, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.FocusMode", "Focus mode", OlympusTagFocusMode }, |
|
100
deafec7cd99f
Mon Nov 6 20:53:22 2006 John Ellis <johne@verizon.net>
gqview
parents:
58
diff
changeset
|
241 { 0x100c, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Olympus.FocusDistance", "Focus distance", NULL }, |
| 57 | 242 { 0x100d, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.Zoom", "Zoom", NULL }, |
| 243 { 0x1006, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.MacroFocus", "Macro focus", NULL }, | |
| 244 { 0x100f, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.Sharpness", "Sharpness", OlympusTagSharpness }, | |
| 245 { 0x1011, EXIF_FORMAT_SHORT_UNSIGNED, 9, "Olympus.ColorMatrix", "Color matrix", NULL }, | |
| 246 { 0x1012, EXIF_FORMAT_SHORT_UNSIGNED, 4, "Olympus.BlackLevel", "Black level", NULL }, | |
| 247 { 0x1015, EXIF_FORMAT_SHORT_UNSIGNED, 2, "Olympus.WhiteBalance", "White balance", NULL }, | |
| 248 { 0x1017, EXIF_FORMAT_SHORT_UNSIGNED, 2, "Olympus.RedBias", "Red bias", NULL }, | |
| 249 { 0x1018, EXIF_FORMAT_SHORT_UNSIGNED, 2, "Olympus.BlueBias", "Blue bias", NULL }, | |
|
100
deafec7cd99f
Mon Nov 6 20:53:22 2006 John Ellis <johne@verizon.net>
gqview
parents:
58
diff
changeset
|
250 { 0x101a, EXIF_FORMAT_STRING, -1, "Olympus.SerialNumber", "Serial number", NULL }, |
|
deafec7cd99f
Mon Nov 6 20:53:22 2006 John Ellis <johne@verizon.net>
gqview
parents:
58
diff
changeset
|
251 { 0x1023, EXIF_FORMAT_RATIONAL, 1, "Olympus.FlashBias", "Flash bias", NULL }, |
| 57 | 252 { 0x1029, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.Contrast", "Contrast", OlympusTagContrast }, |
| 253 { 0x102a, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.SharpnessFactor", "Sharpness factor", NULL }, | |
| 254 { 0x102b, EXIF_FORMAT_SHORT_UNSIGNED, 6, "Olympus.ColorControl", "Color control", NULL }, | |
| 255 { 0x102c, EXIF_FORMAT_SHORT_UNSIGNED, 2, "Olympus.ValidBits", "Valid bits", NULL }, | |
| 256 { 0x102d, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.CoringFilter", "Coring filter", NULL }, | |
| 257 { 0x102e, EXIF_FORMAT_LONG_UNSIGNED, 1, "Olympus.FinalWidth", "Final width", NULL }, | |
| 258 { 0x102f, EXIF_FORMAT_LONG_UNSIGNED, 1, "Olympus.FinalHeight", "Final height", NULL }, | |
| 259 { 0x1034, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Olympus.CompressionRatio", "Compression ratio", NULL }, | |
| 260 EXIF_MARKER_LIST_END | |
| 261 }; | |
| 262 | |
| 263 static ExifTextList OlympusShootingMode[]= { | |
| 264 { 0, "normal" }, | |
| 265 { 1, "unknown" }, | |
| 266 { 2, "fast" }, | |
| 267 { 3, "panorama" }, | |
| 268 EXIF_TEXT_LIST_END | |
| 269 }; | |
| 270 | |
| 271 static ExifTextList OlympusPanoramaDirection[]= { | |
| 272 { 1, "left to right" }, | |
| 273 { 2, "right to left" }, | |
| 274 { 3, "bottom to top" }, | |
| 275 { 4, "top to bottom" }, | |
| 276 EXIF_TEXT_LIST_END | |
| 277 }; | |
| 278 | |
| 279 static ExifTextList OlympusWB[]= { | |
| 280 { 1, "auto" }, | |
| 281 { 2, "manual" }, | |
| 282 { 3, "one-touch" }, | |
| 283 EXIF_TEXT_LIST_END | |
| 284 }; | |
| 285 | |
| 286 static ExifTextList OlympusWBColorTemp[]= { | |
| 287 { 2, "3000" }, | |
| 288 { 3, "3700" }, | |
| 289 { 4, "4000" }, | |
| 290 { 5, "4500" }, | |
| 291 { 6, "5500" }, | |
| 292 { 7, "6500" }, | |
| 293 { 8, "7500" }, | |
| 294 EXIF_TEXT_LIST_END | |
| 295 }; | |
| 296 | |
|
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
541
diff
changeset
|
297 gint format_olympus_makernote(ExifData *exif, guchar *tiff, guint offset, |
| 57 | 298 guint size, ExifByteOrder bo) |
| 299 { | |
|
1000
4fe8f9656107
For the sake of consistency, use glib basic types everywhere.
zas_
parents:
541
diff
changeset
|
300 guchar *data; |
| 57 | 301 ExifItem *item; |
| 302 | |
| 303 if (offset + 8 + 4 >= size) return FALSE; | |
| 304 | |
| 305 data = tiff + offset; | |
| 306 | |
| 307 /* Olympus tag format starts with "OLYMP\x00\x01" or "OLYMP\x00\x02", | |
| 308 * plus an unknown byte, | |
| 309 * followed by IFD data using Olympus tags. | |
| 310 */ | |
| 311 if (memcmp(data, "OLYMP\x00\x01", 7) != 0 && | |
| 312 memcmp(data, "OLYMP\x00\x02", 7) != 0) return FALSE; | |
| 313 | |
| 314 if (exif_parse_IFD_table(exif, tiff, offset + 8, size, | |
| 315 bo, 0, OlympusExifMarkersList) != 0) | |
| 316 { | |
| 317 return FALSE; | |
| 318 } | |
| 319 | |
| 320 item = exif_get_item(exif, "Olympus.SpecialMode"); | |
| 321 if (item && item->data_len == 3 * sizeof(guint32)) | |
| 322 { | |
| 323 static ExifMarker marker = { 0x0200, EXIF_FORMAT_STRING, -1, | |
| 324 "Olympus.ShootingMode", "Shooting mode", NULL }; | |
| 325 guint32 *array = item->data; | |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
326 gchar *mode; |
|
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
327 gchar *pdir = NULL; |
| 57 | 328 gchar *text; |
| 329 gint l; | |
| 330 | |
| 331 mode = exif_text_list_find_value(OlympusShootingMode, array[0]); | |
| 332 if (array[0] == 3) | |
| 333 { | |
| 334 pdir = exif_text_list_find_value(OlympusPanoramaDirection, array[2]); | |
| 335 } | |
| 336 | |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
337 text = g_strdup_printf("%s%s%s, seq %d", mode, |
| 57 | 338 (pdir) ? " " : "", (pdir) ? pdir : "", |
| 339 array[1] + 1); | |
| 340 l = strlen(text) + 1; | |
| 341 item = exif_item_new(marker.format, marker.tag, l, &marker); | |
| 342 memcpy(item->data, text, l); | |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
343 |
| 57 | 344 g_free(text); |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
345 g_free(pdir); |
|
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
346 g_free(mode); |
| 57 | 347 |
| 348 exif->items = g_list_prepend(exif->items, item); | |
| 349 } | |
| 350 | |
| 351 item = exif_get_item(exif, "Olympus.WhiteBalance"); | |
| 352 if (item && item->data_len == 2 * sizeof(guint16)) | |
| 353 { | |
| 354 static ExifMarker marker = { 0x1015, EXIF_FORMAT_STRING, -1, | |
| 355 "Olympus.WhiteBalance", "White balance", NULL }; | |
| 356 guint16 *array = item->data; | |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
357 gchar *mode; |
|
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
358 gchar *color = NULL; |
| 57 | 359 gchar *text; |
| 360 gint l; | |
| 361 | |
| 362 mode = exif_text_list_find_value(OlympusWB, array[0]); | |
| 363 if (array[0] == 2) | |
| 364 { | |
| 365 color = exif_text_list_find_value(OlympusWBColorTemp, array[1]); | |
| 366 } | |
| 367 | |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
368 text = g_strdup_printf("%s%s%s", mode, |
| 57 | 369 (color) ? " " : "", (color) ? color : ""); |
| 370 l = strlen(text) + 1; | |
| 371 item = exif_item_new(marker.format, marker.tag, l, &marker); | |
| 372 memcpy(item->data, text, l); | |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
373 |
| 57 | 374 g_free(text); |
|
58
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
375 g_free(color); |
|
df73b94154e4
Sat Jun 11 01:06:49 2005 John Ellis <johne@verizon.net>
gqview
parents:
57
diff
changeset
|
376 g_free(mode); |
| 57 | 377 |
| 378 exif->items = g_list_prepend(exif->items, item); | |
| 379 } | |
| 380 | |
| 381 return TRUE; | |
| 382 } | |
| 383 | |
| 384 | |
| 442 | 385 #endif |
| 177 | 386 /* not HAVE_EXIV2 */ |
|
1055
1646720364cf
Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents:
1000
diff
changeset
|
387 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ |
