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