annotate src/exif.c @ 222:77f1bcc6c161

various exif improvements based on patch by Uwe Ohse try to compute 35mm focal length
author nadvornik
date Wed, 02 Apr 2008 20:44:40 +0000
parents d324b284e183
children 59eac2063093
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
2 * GQView
107
a01d8c49ca2f fix comments
gqview
parents: 106
diff changeset
3 * (C) 2006 John Ellis
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
4 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
5 * Authors:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
6 * Support for Exif file format, originally written by Eric Swalens.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
7 * Modified by Quy Tonthat
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
8 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
9 * Reimplemented with generic data storage by John Ellis (Nov 2003)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
10 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
11 * The tags were added with information from the FREE document:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
12 * http://www.ba.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
13 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
14 * For the official Exif Format, please refer to:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
15 * http://www.exif.org
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
16 * http://www.exif.org/specifications.html (PDF spec sheets)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
17 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
18 * Notes:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
19 * Additional tag formats should be added to the proper
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
20 * location in ExifKnownMarkersList[].
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
21 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
22 * Human readable ouput (that needs additional processing of data to
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
23 * be useable) can be defined by adding a key to ExifFormattedList[],
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
24 * then handling that tag in the function exif_get_formatted_by_key().
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
25 * The human readable formatted keys must begin with the character 'f'.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
26 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
27 * Unsupported at this time:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
28 * IFD1 (thumbnail)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
29 * MakerNote
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
30 * GPSInfo
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
31 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
32 * TODO:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
33 * Convert data to useable form in the ??_as_text function for:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
34 * ComponentsConfiguration
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
35 * UserComment (convert this to UTF-8?)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
36 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
37
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
38 This program is free software; you can redistribute it and/or modify
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
39 it under the terms of the GNU General Public License as published by
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
40 the Free Software Foundation; either version 2 of the License, or
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
41 (at your option) any later version.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
42
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
43 This program is distributed in the hope that it will be useful,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
44 but WITHOUT ANY WARRANTY; without even the implied warranty of
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
45 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
46 GNU General Public License for more details.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
47
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
48 You should have received a copy of the GNU General Public License
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
49 along with this program; if not, write to the Free Software
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
50 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
51 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
52
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
53 #ifdef HAVE_CONFIG_H
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
54 # include "config.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
55 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
56
177
0ca3b4c8ffae started exiv2 integration
nadvornik
parents: 176
diff changeset
57 #ifndef HAVE_EXIV2
0ca3b4c8ffae started exiv2 integration
nadvornik
parents: 176
diff changeset
58
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
59 #include <stdio.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
60 #include <string.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
61 #include <fcntl.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
62 #include <unistd.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
63 #include <sys/types.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
64 #include <sys/stat.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
65 #include <sys/mman.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
66 #include <math.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
67
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
68 #include <glib.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
69
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
70 #include "intl.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
71
138
71e1ebee420e replaced gchar* path with FileData *fd
nadvornik
parents: 114
diff changeset
72 #include "gqview.h"
176
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
73 #include "exif-int.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
74
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
75 #include "format_raw.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
76 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
77
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
78
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
79 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
80 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
81 * Tag formats
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
82 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
83 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
84
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
85 ExifFormatAttrib ExifFormatList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
86 { EXIF_FORMAT_UNKNOWN, 1, "unknown", "unknown" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
87 { EXIF_FORMAT_BYTE_UNSIGNED, 1, "ubyte", "unsigned byte" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
88 { EXIF_FORMAT_STRING, 1, "string", "string" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89 { EXIF_FORMAT_SHORT_UNSIGNED, 2, "ushort", "unsigned short" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
90 { EXIF_FORMAT_LONG_UNSIGNED, 4, "ulong", "unsigned long" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
91 { EXIF_FORMAT_RATIONAL_UNSIGNED,8, "urational", "unsigned rational" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92 { EXIF_FORMAT_BYTE, 1, "byte", "byte" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
93 { EXIF_FORMAT_UNDEFINED, 1, "undefined", "undefined" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
94 { EXIF_FORMAT_SHORT, 2, "sshort", "signed short" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
95 { EXIF_FORMAT_LONG, 4, "slong", "signed long" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96 { EXIF_FORMAT_RATIONAL, 8, "srational", "signed rational" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
97 { EXIF_FORMAT_FLOAT, 4, "float", "float" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
98 { EXIF_FORMAT_DOUBLE, 8, "double", "double" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
99 { -1, 0, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
100 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
102 /* tags that are special, or need special treatment */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
103 #define TAG_EXIFOFFSET 0x8769
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
104 #define TAG_EXIFMAKERNOTE 0x927c
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
105
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
106
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
107 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
108 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
109 * Data
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
110 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
111 */
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
112 static ExifTextList ExifCompressionList[] = {
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
113 { 1, "Uncompressed" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
114 { 2, "CCITT 1D" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
115 { 3, "T4/Group 3 Fax" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
116 { 4, "T6/Group 4 Fax" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
117 { 5, "LZW" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
118 { 6, "JPEG (old style)" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
119 { 7, "JPEG" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
120 { 8, "Adobe Deflate" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
121 { 9, "JBIG B&W" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
122 { 10, "JBIG Color" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
123 { 32766, "Next" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
124 { 32771, "CCIRLEW" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
125 { 32773, "PackBits" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
126 { 32809, "ThunderScan" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
127 { 32895, "IT8CTPAD" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
128 { 32896, "IT8LW" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
129 { 32897, "IT8MP" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
130 { 32898, "IT8BL" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
131 { 32908, "PixasFilm" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
132 { 32909, "PixasLog" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
133 { 32946, "Deflate" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
134 { 32947, "DCS" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
135 { 34661, "JBIG" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
136 { 34676, "SGILog" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
137 { 34677, "SGILog24" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
138 { 34712, "JPEF 2000" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
139 { 34713, "Nikon NEF Compressed" },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
140 EXIF_TEXT_LIST_END
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
141 };
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
142
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
143 static ExifTextList ExifOrientationList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
144 { EXIF_ORIENTATION_UNKNOWN, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
145 { EXIF_ORIENTATION_TOP_LEFT, N_("top left") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146 { EXIF_ORIENTATION_TOP_RIGHT, N_("top right") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147 { EXIF_ORIENTATION_BOTTOM_RIGHT,N_("bottom right") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
148 { EXIF_ORIENTATION_BOTTOM_LEFT, N_("bottom left") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
149 { EXIF_ORIENTATION_LEFT_TOP, N_("left top") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
150 { EXIF_ORIENTATION_RIGHT_TOP, N_("right top") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
151 { EXIF_ORIENTATION_RIGHT_BOTTOM,N_("right bottom") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
152 { EXIF_ORIENTATION_LEFT_BOTTOM, N_("left bottom") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
153 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
154 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
155
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
156 static ExifTextList ExifUnitList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157 { EXIF_UNIT_UNKNOWN, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
158 { EXIF_UNIT_NOUNIT, "" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
159 { EXIF_UNIT_INCH, N_("inch") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
160 { EXIF_UNIT_CENTIMETER, N_("centimeter") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
161 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
162 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
163
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
164 static ExifTextList ExifYCbCrPosList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
165 { 1, "center" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 { 2, "datum" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
167 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
170 static ExifTextList ExifMeteringModeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
171 { 0, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
172 { 1, N_("average") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173 { 2, N_("center weighted") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
174 { 3, N_("spot") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 { 4, N_("multi-spot") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 { 5, N_("multi-segment") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177 { 6, N_("partial") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
178 { 255, N_("other") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
179 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
180 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
181
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
182 static ExifTextList ExifExposureProgramList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
183 { 0, N_("not defined") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
184 { 1, N_("manual") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
185 { 2, N_("normal") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
186 { 3, N_("aperture") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
187 { 4, N_("shutter") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
188 { 5, N_("creative") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
189 { 6, N_("action") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
190 { 7, N_("portrait") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
191 { 8, N_("landscape") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
192 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
193 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
194
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
195 static ExifTextList ExifLightSourceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
196 { 0, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
197 { 1, N_("daylight") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
198 { 2, N_("fluorescent") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
199 { 3, N_("tungsten (incandescent)") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200 { 4, N_("flash") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
201 { 9, "fine weather" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
202 { 10, "cloudy weather" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
203 { 11, "shade" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
204 { 12, "daylight fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
205 { 13, "day white fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
206 { 14, "cool white fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
207 { 15, "while fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
208 { 17, "standard light A" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
209 { 18, "standard light B" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
210 { 19, "standard light C" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
211 { 20, "D55" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
212 { 21, "D65" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
213 { 22, "D75" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
214 { 23, "D50" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
215 { 24, "ISO studio tungsten" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
216 { 255, N_("other") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
217 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
218 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
219
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
220 static ExifTextList ExifFlashList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
221 { 0, N_("no") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
222 { 1, N_("yes") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
223 { 5, N_("yes, not detected by strobe") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
224 { 7, N_("yes, detected by strobe") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
225 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
226 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
227
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
228 static ExifTextList ExifColorSpaceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
229 { 1, "sRGB" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
230 { 65535,"uncalibrated" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
231 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
233
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
234 static ExifTextList ExifSensorList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
235 { 1, "not defined" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
236 { 2, "1 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
237 { 2, "2 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
238 { 4, "3 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
239 { 5, "color sequential area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
240 { 7, "trilinear" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
241 { 8, "color sequential linear" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
242 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
243 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 static ExifTextList ExifSourceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 { 3, "digital still camera" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
247 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
248 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
249
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
250 static ExifTextList ExifSceneList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
251 { 1, "direct photo" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
252 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
253 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
254
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
255 static ExifTextList ExifCustRenderList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
256 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
257 { 1, "custom" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
258 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
259 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
260
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
261 static ExifTextList ExifExposureModeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262 { 0, "auto" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
263 { 1, "manual" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264 { 2, "auto bracket" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
265 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
266 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
267
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
268 static ExifTextList ExifWhiteBalanceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
269 { 0, "auto" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
270 { 1, "manual" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
271 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
272 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
273
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
274 static ExifTextList ExifSceneCaptureList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
275 { 0, "standard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
276 { 1, "landscape" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
277 { 2, "portrait" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
278 { 3, "night scene" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
279 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
280 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
281
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
282 static ExifTextList ExifGainControlList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
283 { 0, "none" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
284 { 1, "low gain up" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
285 { 2, "high gain up" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
286 { 3, "low gain down" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
287 { 4, "high gain down" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
288 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
289 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
290
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
291 static ExifTextList ExifContrastList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
292 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
293 { 1, "soft" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
294 { 2, "hard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
295 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
296 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
297
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
298 static ExifTextList ExifSaturationList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
299 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
300 { 1, "low" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
301 { 2, "high" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
302 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
303 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
304
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
305 static ExifTextList ExifSharpnessList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
306 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
307 { 1, "soft" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
308 { 2, "hard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
309 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
310 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
311
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
312 static ExifTextList ExifSubjectRangeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
313 { 0, "unknown" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
314 { 1, "macro" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
315 { 2, "close" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
316 { 3, "distant" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
317 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
318 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
319
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
320 /*
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
321 Tag names should match to exiv2 keys, http://www.exiv2.org/metadata.html
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
322 Tags that don't match are not supported by exiv2 and should not be used anywhere in the code
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
323 */
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
324
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
325 ExifMarker ExifKnownMarkersList[] = {
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
326 { 0x0100, EXIF_FORMAT_LONG_UNSIGNED, 1, "Exif.Image.ImageWidth", N_("Image Width"), NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
327 { 0x0101, EXIF_FORMAT_LONG_UNSIGNED, 1, "Exif.Image.ImageLength", N_("Image Height"), NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
328 { 0x0102, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Image.BitsPerSample", N_("Bits per Sample/Pixel"), NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
329 { 0x0103, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Image.Compression", N_("Compression"), ExifCompressionList },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
330 { 0x010e, EXIF_FORMAT_STRING, -1, "Exif.Image.ImageDescription", N_("Image description"), NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
331 { 0x010f, EXIF_FORMAT_STRING, -1, "Exif.Image.Make", "Camera make", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
332 { 0x0110, EXIF_FORMAT_STRING, -1, "Exif.Image.Model", "Camera model", NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
333 { 0x0112, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Image.Orientation", N_("Orientation"), ExifOrientationList },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
334 { 0x011a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Image.XResolution", "X resolution", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
335 { 0x011b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Image.YResolution", "Y Resolution", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
336 { 0x0128, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Image.ResolutionUnit", "Resolution units", ExifUnitList },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
337 { 0x0131, EXIF_FORMAT_STRING, -1, "Exif.Image.Software", "Firmware", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
338 { 0x0132, EXIF_FORMAT_STRING, 20, "Exif.Image.DateTime", N_("Date"), NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
339 { 0x013e, EXIF_FORMAT_RATIONAL_UNSIGNED, 2, "Exif.Image.WhitePoint", "White point", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
340 { 0x013f, EXIF_FORMAT_RATIONAL_UNSIGNED, 6, "Exif.Image.PrimaryChromaticities","Primary chromaticities", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
341 { 0x0211, EXIF_FORMAT_RATIONAL_UNSIGNED, 3, "Exif.Image.YCbCrCoefficients", "YCbCy coefficients", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
342 { 0x0213, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Image.YCbCrPositioning", "YCbCr positioning", ExifYCbCrPosList },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
343 { 0x0214, EXIF_FORMAT_RATIONAL_UNSIGNED, 6, "Exif.Image.ReferenceBlackWhite","Black white reference", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
344 { 0x8298, EXIF_FORMAT_STRING, -1, "Exif.Image.Copyright", N_("Copyright"), NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
345 { 0x8769, EXIF_FORMAT_LONG_UNSIGNED, 1, "Exif.Image.ExifTag", "SubIFD Exif offset", NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
346 /* subIFD follows */
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
347 { 0x829a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.ExposureTime", "Exposure time (seconds)", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
348 { 0x829d, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.FNumber", "FNumber", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
349 { 0x8822, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.ExposureProgram", N_("Exposure program"), ExifExposureProgramList },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
350 { 0x8824, EXIF_FORMAT_STRING, -1, "Exif.Photo.SpectralSensitivity","Spectral Sensitivity", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
351 { 0x8827, EXIF_FORMAT_SHORT_UNSIGNED, -1, "Exif.Photo.ISOSpeedRatings", N_("ISO sensitivity"), NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
352 { 0x8828, EXIF_FORMAT_UNDEFINED, -1, "Exif.Photo.OECF", "Optoelectric conversion factor", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
353 { 0x9000, EXIF_FORMAT_UNDEFINED, 4, "Exif.Photo.ExifVersion", "Exif version", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
354 { 0x9003, EXIF_FORMAT_STRING, 20, "Exif.Photo.DateTimeOriginal", N_("Date original"), NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
355 { 0x9004, EXIF_FORMAT_STRING, 20, "Exif.Photo.DateTimeDigitized", N_("Date digitized"), NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
356 { 0x9101, EXIF_FORMAT_UNDEFINED, -1, "Exif.Photo.ComponentsConfiguration","Pixel format", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
357 { 0x9102, EXIF_FORMAT_RATIONAL_UNSIGNED,1, "Exif.Photo.CompressedBitsPerPixel","Compression ratio", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
358 { 0x9201, EXIF_FORMAT_RATIONAL, 1, "Exif.Photo.ShutterSpeedValue", N_("Shutter speed"), NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
359 { 0x9202, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.ApertureValue", N_("Aperture"), NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
360 { 0x9203, EXIF_FORMAT_RATIONAL, 1, "Exif.Photo.BrightnessValue", "Brightness", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
361 { 0x9204, EXIF_FORMAT_RATIONAL, 1, "Exif.Photo.ExposureBiasValue", N_("Exposure bias"), NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
362 { 0x9205, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.MaxApertureValue", "Maximum aperture", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
363 { 0x9206, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.SubjectDistance", N_("Subject distance"), NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
364 { 0x9207, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.MeteringMode", N_("Metering mode"), ExifMeteringModeList },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
365 { 0x9208, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.LightSource", N_("Light source"), ExifLightSourceList },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
366 { 0x9209, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.Flash", N_("Flash"), ExifFlashList },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
367 { 0x920a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.FocalLength", N_("Focal length"), NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
368 { 0x9214, EXIF_FORMAT_SHORT_UNSIGNED, -1, "Exif.Photo.SubjectArea", "Subject area", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
369 { 0x927c, EXIF_FORMAT_UNDEFINED, -1, "Exif.Photo.MakerNote", "MakerNote", NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
370 { 0x9286, EXIF_FORMAT_UNDEFINED, -1, "Exif.Photo.UserComment", "UserComment", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
371 { 0x9290, EXIF_FORMAT_STRING, -1, "Exif.Photo.SubSecTime", "Subsecond time", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
372 { 0x9291, EXIF_FORMAT_STRING, -1, "Exif.Photo.SubSecTimeOriginal","Subsecond time original", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
373 { 0x9292, EXIF_FORMAT_STRING, -1, "Exif.Photo.SubSecTimeDigitized","Subsecond time digitized", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
374 { 0xa000, EXIF_FORMAT_UNDEFINED, 4, "Exif.Photo.FlashpixVersion", "FlashPix version", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
375 { 0xa001, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.ColorSpace", "Colorspace", ExifColorSpaceList },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
376 /* ExifImageWidth, ExifImageHeight can also be unsigned short */
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
377 { 0xa002, EXIF_FORMAT_LONG_UNSIGNED, 1, "Exif.Photo.PixelXDimension", N_("Width"), NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
378 { 0xa003, EXIF_FORMAT_LONG_UNSIGNED, 1, "Exif.Photo.PixelYDimension", N_("Height"), NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
379 { 0xa004, EXIF_FORMAT_STRING, -1, "Exif.Photo.RelatedSoundFile", "Audio data", NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
380 { 0xa005, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifInteroperabilityOffset", "ExifR98 extension", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
381 { 0xa20b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.FlashEnergy", "Flash strength", NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
382 { 0xa20c, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.SpatialFrequencyResponse","Spatial frequency response", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
383 { 0xa20e, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.FocalPlaneXResolution", "X Pixel density", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
384 { 0xa20f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.FocalPlaneYResolution", "Y Pixel density", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
385 { 0xa210, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.FocalPlaneResolutionUnit", "Pixel density units", ExifUnitList },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
386 { 0x0214, EXIF_FORMAT_SHORT_UNSIGNED, 2, "Exif.Photo.SubjectLocation", "Subject location", NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
387 { 0xa215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.ExposureIndex", N_("ISO sensitivity"), NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
388 { 0xa217, EXIF_FORMAT_SHORT_UNSIGNED, -1, "Exif.Photo.SensingMethod", "Sensor type", ExifSensorList },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
389 { 0xa300, EXIF_FORMAT_UNDEFINED, 1, "Exif.Photo.FileSource", "Source type", ExifSourceList },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
390 { 0xa301, EXIF_FORMAT_UNDEFINED, 1, "Exif.Photo.SceneType", "Scene type", ExifSceneList },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
391 { 0xa302, EXIF_FORMAT_UNDEFINED, -1, "Exif.Image.CFAPattern", "Color filter array pattern", NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
392 /* tags a4xx were added for Exif 2.2 (not just these - some above, as well) */
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
393 { 0xa401, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.CustomRendered", "Render process", ExifCustRenderList },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
394 { 0xa402, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.ExposureMode", "Exposure mode", ExifExposureModeList },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
395 { 0xa403, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.WhiteBalance", "White balance", ExifWhiteBalanceList },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
396 { 0xa404, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.DigitalZoomRatio", "Digital zoom ratio", NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
397 { 0xa405, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.FocalLengthIn35mmFilm","Focal length (35mm)", NULL },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
398 { 0xa406, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.SceneCaptureType", "Scene capture type", ExifSceneCaptureList },
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
399 { 0xa407, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.GainControl", "Gain control", ExifGainControlList },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
400 { 0xa408, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.Contrast", "Contrast", ExifContrastList },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
401 { 0xa409, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.Saturation", "Saturation", ExifSaturationList },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
402 { 0xa40a, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.Sharpness", "Sharpness", ExifSharpnessList },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
403 { 0xa40b, EXIF_FORMAT_UNDEFINED, -1, "Exif.Photo.DeviceSettingDescription","Device setting", NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
404 { 0xa40c, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Exif.Photo.SubjectDistanceRange","Subject range", ExifSubjectRangeList },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
405 { 0xa420, EXIF_FORMAT_STRING, -1, "Exif.Photo.ImageUniqueID", "Image serial number", NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
406 /* place known, but undocumented or lesser used tags here */
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
407 { 0x00fe, EXIF_FORMAT_LONG_UNSIGNED, 1, "Exif.Image.NewSubfileType", NULL, NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
408 { 0x00ff, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SubfileType", NULL, NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
409 { 0x012d, EXIF_FORMAT_SHORT_UNSIGNED, 3, "Exif.Image.TransferFunction", NULL, NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
410 { 0x013b, EXIF_FORMAT_STRING, -1, "Exif.Image.Artist", "Artist", NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
411 { 0x013d, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Predictor", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
412 { 0x0142, EXIF_FORMAT_SHORT_UNSIGNED, 1, "TileWidth", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
413 { 0x0143, EXIF_FORMAT_SHORT_UNSIGNED, 1, "TileLength", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
414 { 0x0144, EXIF_FORMAT_LONG_UNSIGNED, -1, "TileOffsets", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
415 { 0x0145, EXIF_FORMAT_SHORT_UNSIGNED, -1, "TileByteCounts", NULL, NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
416 { 0x014a, EXIF_FORMAT_LONG_UNSIGNED, -1, "Exif.Image.SubIFDs", NULL, NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
417 { 0x015b, EXIF_FORMAT_UNDEFINED, -1, "JPEGTables", NULL, NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
418 { 0x828d, EXIF_FORMAT_SHORT_UNSIGNED, 2, "Exif.Image.CFARepeatPatternDim", NULL, NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
419 { 0x828e, EXIF_FORMAT_BYTE_UNSIGNED, -1, "Exif.Image.CFAPattern", NULL, NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
420 { 0x828f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Image.BatteryLevel", NULL, NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
421 { 0x83bb, EXIF_FORMAT_LONG_UNSIGNED, -1, "IPTC/NAA", NULL, NULL },
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
422 { 0x8773, EXIF_FORMAT_UNDEFINED, -1, "Exif.Image.InterColorProfile", NULL, NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
423 { 0x8825, EXIF_FORMAT_LONG_UNSIGNED, 1, "GPSInfo", "SubIFD GPS offset", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
424 { 0x8829, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Interlace", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
425 { 0x882a, EXIF_FORMAT_SHORT, 1, "TimeZoneOffset", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
426 { 0x882b, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SelfTimerMode", NULL, NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
427 { 0x920b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.FlashEnergy", NULL, NULL },
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
428 { 0x920c, EXIF_FORMAT_UNDEFINED, -1, "Exif.Photo.SpatialFrequencyResponse", NULL, NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
429 { 0x920d, EXIF_FORMAT_UNDEFINED, -1, "Noise", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
430 { 0x9211, EXIF_FORMAT_LONG_UNSIGNED, 1, "ImageNumber", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
431 { 0x9212, EXIF_FORMAT_STRING, 1, "SecurityClassification", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
432 { 0x9213, EXIF_FORMAT_STRING, -1, "ImageHistory", NULL, NULL },
181
c01dd7c9c7dc unified tag names between exiv2 and internal rxif parser
nadvornik
parents: 177
diff changeset
433 { 0x9215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "Exif.Photo.ExposureIndex", NULL, NULL },
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
434 { 0x9216, EXIF_FORMAT_BYTE_UNSIGNED, 4, "TIFF/EPStandardID", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
435
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
436 EXIF_MARKER_LIST_END
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
437 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
438
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
439 ExifMarker ExifUnknownMarkersList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
440 { 0x0000, EXIF_FORMAT_UNKNOWN, 0, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
441 { 0x0000, EXIF_FORMAT_BYTE_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
442 { 0x0000, EXIF_FORMAT_STRING, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
443 { 0x0000, EXIF_FORMAT_SHORT_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
444 { 0x0000, EXIF_FORMAT_LONG_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
445 { 0x0000, EXIF_FORMAT_RATIONAL_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
446 { 0x0000, EXIF_FORMAT_BYTE, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
447 { 0x0000, EXIF_FORMAT_UNDEFINED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
448 { 0x0000, EXIF_FORMAT_SHORT, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
449 { 0x0000, EXIF_FORMAT_LONG, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
450 { 0x0000, EXIF_FORMAT_RATIONAL, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
451 { 0x0000, EXIF_FORMAT_FLOAT, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
452 { 0x0000, EXIF_FORMAT_DOUBLE, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
453 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
454
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
455 static const ExifMarker *exif_marker_from_tag(guint16 tag, const ExifMarker *list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
456
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
457 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
458 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
459 * ExifItem
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
460 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
461 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
462
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
463 ExifItem *exif_item_new(ExifFormatType format, guint tag,
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
464 guint elements, const ExifMarker *marker)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
465 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
466 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
467
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
468 item = g_new0(ExifItem, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
469 item->format = format;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
470 item->tag = tag;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
471 item->marker = marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
472 item->elements = elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
473 item->data = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
474 item->data_len = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
475
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
476 switch (format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
477 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
478 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
479 /* unknown, data is NULL */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
480 return item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
481 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
482 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
483 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
484 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
485 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
486 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
487 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
488 case EXIF_FORMAT_SHORT_UNSIGNED:
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
489 item->data_len = sizeof(guint16) * elements;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
490 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
491 case EXIF_FORMAT_LONG_UNSIGNED:
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
492 item->data_len = sizeof(guint32) * elements;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
493 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
494 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
495 item->data_len = sizeof(ExifRational) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
496 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
497 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
498 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
499 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
500 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
501 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
502 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
503 case EXIF_FORMAT_SHORT:
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
504 item->data_len = sizeof(gint16) * elements;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
505 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
506 case EXIF_FORMAT_LONG:
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
507 item->data_len = sizeof(gint32) * elements;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
508 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
509 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
510 item->data_len = sizeof(ExifRational) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
511 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
512 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
513 item->data_len = sizeof(float) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
514 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
515 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
516 item->data_len = sizeof(double) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
517 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
518 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
519
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
520 item->data = g_malloc0(item->data_len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
521
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
522 return item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
523 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
524
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
525 static void exif_item_free(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
526 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
527 if (!item) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
528
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
529 g_free(item->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
530 g_free(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
531 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
532
192
d324b284e183 configure --without-exiv2
nadvornik
parents: 188
diff changeset
533 char *exif_item_get_tag_name(ExifItem *item)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
534 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
535 if (!item || !item->marker) return NULL;
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 182
diff changeset
536 return g_strdup(item->marker->key);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
537 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
538
176
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
539 guint exif_item_get_tag_id(ExifItem *item)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
540 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
541 return item->tag;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
542 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
543
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
544 guint exif_item_get_elements(ExifItem *item)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
545 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
546 return item->elements;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
547 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
548
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
549 char *exif_item_get_data(ExifItem *item, guint *data_len)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
550 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
551 if (data_len)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
552 *data_len = item->data_len;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
553 return item->data;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
554 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
555
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
556 guint exif_item_get_format_id(ExifItem *item)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
557 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
558 return item->format;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
559 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
560
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
561
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 181
diff changeset
562 char *exif_item_get_description(ExifItem *item)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
563 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
564 if (!item || !item->marker) return NULL;
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 181
diff changeset
565 return g_strdup(_(item->marker->description));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
566 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
567
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
568 const char *exif_item_get_format_name(ExifItem *item, gint brief)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
569 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
570 if (!item || !item->marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
571 return (brief) ? ExifFormatList[item->format].short_name : ExifFormatList[item->format].description;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
572 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
573
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
574 static GString *string_append_raw_bytes(GString *string, gpointer data, gint ne)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
575 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
576 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
577
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
578 for (i = 0 ; i < ne; i++)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
579 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
580 unsigned char c = ((char *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
581 if (c < 32 || c > 127) c = '.';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
582 g_string_append_printf(string, "%c", c);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
583 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
584 string = g_string_append(string, " : ");
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
585 for (i = 0 ; i < ne; i++)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
586 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
587 const gchar *spacer;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
588 if (i > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
589 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
590 if (i%8 == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
591 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
592 spacer = " - ";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
593 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
594 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
595 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
596 spacer = " ";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
597 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
598 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
599 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
600 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
601 spacer = "";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
602 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
603 g_string_append_printf(string, "%s%02x", spacer, ((char *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
604 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
605
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
606 return string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
607 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
608
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 181
diff changeset
609
57
a8c9992320f4 Fri Jun 10 20:57:42 2005 John Ellis <johne@verizon.net>
gqview
parents: 55
diff changeset
610 gchar *exif_text_list_find_value(ExifTextList *list, guint value)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
611 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
612 gchar *result = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
613 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
614
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
615 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
616 while (!result && list[i].value >= 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
617 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
618 if (value == list[i].value) result = g_strdup(_(list[i].description));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
619 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
620 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
621 if (!result) result = g_strdup_printf("%d (%s)", value, _("unknown"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
622
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
623 return result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
624 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
625
176
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
626
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
627 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
628 *-------------------------------------------------------------------
107
a01d8c49ca2f fix comments
gqview
parents: 106
diff changeset
629 * byte order utils
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
630 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
631 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
632
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
633 /* note: the align_buf is used to avoid alignment issues (on sparc) */
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
634
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
635 guint16 exif_byte_get_int16(unsigned char *f, ExifByteOrder bo)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
636 {
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
637 guint16 align_buf;
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
638
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
639 memcpy(&align_buf, f, sizeof(guint16));
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
640
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
641 if (bo == EXIF_BYTE_ORDER_INTEL)
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
642 return GUINT16_FROM_LE(align_buf);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
643 else
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
644 return GUINT16_FROM_BE(align_buf);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
645 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
646
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
647 guint32 exif_byte_get_int32(unsigned char *f, ExifByteOrder bo)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
648 {
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
649 guint32 align_buf;
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
650
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
651 memcpy(&align_buf, f, sizeof(guint32));
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
652
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
653 if (bo == EXIF_BYTE_ORDER_INTEL)
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
654 return GUINT32_FROM_LE(align_buf);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
655 else
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
656 return GUINT32_FROM_BE(align_buf);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
657 }
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
658
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
659 void exif_byte_put_int16(unsigned char *f, guint16 n, ExifByteOrder bo)
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
660 {
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
661 guint16 align_buf;
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
662
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
663 if (bo == EXIF_BYTE_ORDER_INTEL)
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
664 {
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
665 align_buf = GUINT16_TO_LE(n);
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
666 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
667 else
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
668 {
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
669 align_buf = GUINT16_TO_BE(n);
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
670 }
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
671
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
672 memcpy(f, &align_buf, sizeof(guint16));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
673 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
674
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
675 void exif_byte_put_int32(unsigned char *f, guint32 n, ExifByteOrder bo)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
676 {
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
677 guint32 align_buf;
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
678
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
679 if (bo == EXIF_BYTE_ORDER_INTEL)
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
680 {
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
681 align_buf = GUINT32_TO_LE(n);
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
682 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
683 else
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
684 {
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
685 align_buf = GUINT32_TO_BE(n);
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
686 }
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
687
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
688 memcpy(f, &align_buf, sizeof(guint32));
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
689 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
690
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
691
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
692 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
693 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
694 * IFD utils
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
695 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
696 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
697
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
698 static const ExifMarker *exif_marker_from_tag(guint16 tag, const ExifMarker *list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
699 {
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
700 gint i = 0;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
701
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
702 if (!list) return NULL;
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
703
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
704 while (list[i].tag != 0 && list[i].tag != tag)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
705 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
706 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
707 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
708
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
709 return (list[i].tag == 0 ? NULL : &list[i]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
710 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
711
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
712 static void rational_from_data(ExifRational *r, void *src, ExifByteOrder bo)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
713 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
714 r->num = exif_byte_get_int32(src, bo);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
715 r->den = exif_byte_get_int32(src + sizeof(guint32), bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
716 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
717
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
718 /* src_format and item->format must be compatible
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
719 * and not overrun src or item->data.
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
720 */
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
721 void exif_item_copy_data(ExifItem *item, void *src, guint len,
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
722 ExifFormatType src_format, ExifByteOrder bo)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
723 {
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
724 gint bs;
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
725 gint ne;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
726 gpointer dest;
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
727 gint i;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
728
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
729 bs = ExifFormatList[item->format].size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
730 ne = item->elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
731 dest = item->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
732
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
733 if (!dest ||
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
734 ExifFormatList[src_format].size * ne > len)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
735 {
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 182
diff changeset
736 gchar *tag = exif_item_get_tag_name(item);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 182
diff changeset
737 printf("exif tag %s data size mismatch\n", tag);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 182
diff changeset
738 g_free(tag);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
739 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
740 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
741
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
742 switch (item->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
743 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
744 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
745 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
746 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
747 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
748 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
749 memcpy(dest, src, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
750 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
751 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
752 memcpy(dest, src, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
753 /* string is NULL terminated, make sure this is true */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
754 if (((char *)dest)[len - 1] != '\0') ((char *)dest)[len - 1] = '\0';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
755 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
756 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
757 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
758 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
759 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
760 ((guint16 *)dest)[i] = exif_byte_get_int16(src + i * bs, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
761 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
762 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
763 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
764 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
765 if (src_format == EXIF_FORMAT_SHORT_UNSIGNED ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
766 src_format == EXIF_FORMAT_SHORT)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
767 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
768 /* a short fits into a long, so allow it */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
769 gint ss;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
770
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
771 ss = ExifFormatList[src_format].size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
772 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
773 {
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
774 ((gint32 *)dest)[i] =
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
775 (gint32)exif_byte_get_int16(src + i * ss, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
776 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
777 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
778 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
779 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
780 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
781 {
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
782 ((gint32 *)dest)[i] =
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
783 exif_byte_get_int32(src + i * bs, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
784 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
785 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
786 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
787 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
788 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
789 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
790 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
791 rational_from_data(&((ExifRational *)dest)[i], src + i * bs, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
792 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
793 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
794 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
795 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
796 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
797 ((float *)dest)[i] = exif_byte_get_int32(src + i * bs, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
798 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
799 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
800 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
801 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
802 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
803 ExifRational r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
804
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
805 rational_from_data(&r, src + i * bs, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
806 if (r.den) ((double *)dest)[i] = (double)r.num / r.den;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
807 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
808 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
809 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
810 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
811
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
812 static gint exif_parse_IFD_entry(ExifData *exif, unsigned char *tiff, guint offset,
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
813 guint size, ExifByteOrder bo,
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
814 gint level,
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
815 const ExifMarker *list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
816 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
817 guint tag;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
818 guint format;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
819 guint count;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
820 guint data_val;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
821 guint data_offset;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
822 guint data_length;
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
823 const ExifMarker *marker;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
824 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
825
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
826 tag = exif_byte_get_int16(tiff + offset + EXIF_TIFD_OFFSET_TAG, bo);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
827 format = exif_byte_get_int16(tiff + offset + EXIF_TIFD_OFFSET_FORMAT, bo);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
828 count = exif_byte_get_int32(tiff + offset + EXIF_TIFD_OFFSET_COUNT, bo);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
829 data_val = exif_byte_get_int32(tiff + offset + EXIF_TIFD_OFFSET_DATA, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
830
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
831 /* Check tag type. If it does not match, either the format is wrong,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
832 * either it is a unknown tag; so it is not really an error.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
833 */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
834 marker = exif_marker_from_tag(tag, list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
835 if (!marker)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
836 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
837 if (format >= EXIF_FORMAT_COUNT)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
838 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
839 printf("warning: exif tag 0x%4x has invalid format %d\n", tag, format);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
840 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
841 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
842 /* allow non recognized tags to be displayed */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
843 marker = &ExifUnknownMarkersList[format];
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
844 }
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
845 if (marker->format != format)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
846 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
847 /* Some cameras got mixed up signed/unsigned_rational
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
848 * eg KODAK DC4800 on object_distance tag
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
849 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
850 * FIXME: what exactly is this test trying to do?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
851 * ok, so this test is to allow the case of swapped signed/unsigned mismatch to leak through?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
852 */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
853 if (!(marker->format == EXIF_FORMAT_RATIONAL_UNSIGNED && format == EXIF_FORMAT_RATIONAL) &&
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
854 !(marker->format == EXIF_FORMAT_RATIONAL && format == EXIF_FORMAT_RATIONAL_UNSIGNED) &&
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
855 /* short fits into a long so allow this mismatch
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
856 * as well (some tags allowed to be unsigned short _or_ unsigned long)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
857 */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
858 !(marker->format == EXIF_FORMAT_LONG_UNSIGNED && format == EXIF_FORMAT_SHORT_UNSIGNED) )
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
859 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
860 if (format < EXIF_FORMAT_COUNT)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
861 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
862 printf("warning: exif tag %s format mismatch, found %s exif spec requests %s\n",
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
863 marker->key, ExifFormatList[format].short_name,
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
864 ExifFormatList[marker->format].short_name);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
865 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
866 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
867 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
868 printf("warning: exif tag %s format mismatch, found unknown id %d exif spec requests %d (%s)\n",
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
869 marker->key, format, marker->format,
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
870 ExifFormatList[marker->format].short_name);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
871 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
872 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
873 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
874 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
875
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
876 /* Where is the data, is it available?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
877 */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
878 if (marker->components > 0 && marker->components != count)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
879 {
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
880 printf("warning: exif tag %s has %d elements, exif spec requests %d\n",
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
881 marker->key, count, marker->components);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
882 }
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
883
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
884 data_length = ExifFormatList[marker->format].size * count;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
885 if (data_length > 4)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
886 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
887 data_offset = data_val;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
888 if (size < data_offset + data_length)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
889 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
890 printf("warning: exif tag %s data will overrun end of file, ignored.\n", marker->key);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
891 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
892 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
893 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
894 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
895 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
896 data_offset = offset + EXIF_TIFD_OFFSET_DATA;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
897 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
898
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
899 item = exif_item_new(marker->format, tag, count, marker);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
900 exif_item_copy_data(item, tiff + data_offset, data_length, format, bo);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
901 exif->items = g_list_prepend(exif->items, item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
902
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
903 if (list == ExifKnownMarkersList)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
904 {
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
905 switch (item->tag)
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
906 {
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
907 case TAG_EXIFOFFSET:
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
908 exif_parse_IFD_table(exif, tiff, data_val, size, bo, level + 1, list);
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
909 break;
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
910 case TAG_EXIFMAKERNOTE:
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
911 format_exif_makernote_parse(exif, tiff, data_val, size, bo);
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
912 break;
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
913 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
914 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
915
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
916 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
917 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
918
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
919 gint exif_parse_IFD_table(ExifData *exif,
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
920 unsigned char *tiff, guint offset,
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
921 guint size, ExifByteOrder bo,
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
922 gint level,
51
276ea4c98d33 Sat Jun 4 22:24:00 2005 John Ellis <johne@verizon.net>
gqview
parents: 47
diff changeset
923 const ExifMarker *list)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
924 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
925 guint count;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
926 guint i;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
927
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
928 /* limit damage from infinite loops */
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
929 if (level > EXIF_TIFF_MAX_LEVELS) return -1;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
930
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
931 /* We should be able to read number of entries in IFD0) */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
932 if (size < offset + 2) return -1;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
933
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
934 count = exif_byte_get_int16(tiff + offset, bo);
57
a8c9992320f4 Fri Jun 10 20:57:42 2005 John Ellis <johne@verizon.net>
gqview
parents: 55
diff changeset
935 offset += 2;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
936
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
937 /* Entries and next IFD offset must be readable */
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
938 if (size < offset + count * EXIF_TIFD_SIZE + 4) return -1;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
939
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
940 for (i = 0; i < count; i++)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
941 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
942 exif_parse_IFD_entry(exif, tiff, offset + i * EXIF_TIFD_SIZE, size, bo, level, list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
943 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
944
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
945 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
946 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
947
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
948 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
949 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
950 * file formats
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
951 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
952 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
953
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
954 gint exif_tiff_directory_offset(unsigned char *data, const guint len,
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
955 guint *offset, ExifByteOrder *bo)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
956 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
957 if (len < 8) return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
958
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
959 if (memcmp(data, "II", 2) == 0)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
960 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
961 *bo = EXIF_BYTE_ORDER_INTEL;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
962 }
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
963 else if (memcmp(data, "MM", 2) == 0)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
964 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
965 *bo = EXIF_BYTE_ORDER_MOTOROLA;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
966 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
967 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
968 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
969 return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
970 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
971
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
972 if (exif_byte_get_int16(data + 2, *bo) != 0x002A)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
973 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
974 return FALSE;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
975 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
976
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
977 *offset = exif_byte_get_int32(data + 4, *bo);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
978
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
979 return (*offset < len);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
980 }
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
981
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
982 gint exif_tiff_parse(ExifData *exif, unsigned char *tiff, guint size, ExifMarker *list)
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
983 {
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
984 ExifByteOrder bo;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
985 guint offset;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
986
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
987 if (!exif_tiff_directory_offset(tiff, size, &offset, &bo)) return -1;
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
988
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
989 return exif_parse_IFD_table(exif, tiff, offset, size, bo, 0, list);
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
990 }
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
991
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
992 /*
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
993 *-------------------------------------------------------------------
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
994 * jpeg marker utils
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
995 *-------------------------------------------------------------------
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
996 */
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
997
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
998 #define JPEG_MARKER 0xFF
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
999 #define JPEG_MARKER_SOI 0xD8
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1000 #define JPEG_MARKER_EOI 0xD9
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1001 #define JPEG_MARKER_APP1 0xE1
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1002 #define JPEG_MARKER_APP2 0xE2
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1003
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1004 /* jpeg container format:
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1005 all data markers start with 0XFF
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1006 2 byte long file start and end markers: 0xFFD8(SOI) and 0XFFD9(EOI)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1007 4 byte long data segment markers in format: 0xFFTTSSSSNNN...
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1008 FF: 1 byte standard marker identifier
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1009 TT: 1 byte data type
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1010 SSSS: 2 bytes in Motorola byte alignment for length of the data.
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1011 This value includes these 2 bytes in the count, making actual
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1012 length of NN... == SSSS - 2.
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1013 NNN.: the data in this segment
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1014 */
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1015
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1016 static gint exif_jpeg_segment_find(unsigned char *data, guint size,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1017 guchar app_marker, const gchar *magic, guint magic_len,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1018 guint *seg_offset, guint *seg_length)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1019 {
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1020 guchar marker = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1021 guint offset = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1022 guint length = 0;
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1023
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1024 while (marker != app_marker &&
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1025 marker != JPEG_MARKER_EOI)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1026 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1027 offset += length;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1028 length = 2;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1029
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1030 if (offset + 2 >= size ||
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1031 data[offset] != JPEG_MARKER) return FALSE;
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1032
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1033 marker = data[offset + 1];
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1034 if (marker != JPEG_MARKER_SOI &&
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1035 marker != JPEG_MARKER_EOI)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1036 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1037 if (offset + 4 >= size) return FALSE;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1038 length += exif_byte_get_int16(data + offset + 2, EXIF_BYTE_ORDER_MOTOROLA);
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1039 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1040 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1041
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1042 if (marker == app_marker &&
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1043 offset + length < size &&
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1044 length >= 4 + magic_len &&
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1045 memcmp(data + offset + 4, magic, magic_len) == 0)
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1046 {
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1047 *seg_offset = offset + 4;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1048 *seg_length = length - 4;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1049 return TRUE;
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1050 }
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1051
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1052 return FALSE;
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1053 }
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1054
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 192
diff changeset
1055 static ExifMarker jpeg_color_marker = { 0x8773, EXIF_FORMAT_UNDEFINED, -1, "Exif.Image.InterColorProfile", NULL, NULL };
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1056
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1057 static gint exif_jpeg_parse_color(ExifData *exif, unsigned char *data, guint size)
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1058 {
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1059 guint seg_offset = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1060 guint seg_length = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1061 guint chunk_offset[255];
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1062 guint chunk_length[255];
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1063 guint chunk_count = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1064
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1065 /* For jpeg/jfif, ICC color profile data can be in more than one segment.
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1066 the data is in APP2 data segments that start with "ICC_PROFILE\x00\xNN\xTT"
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1067 NN = segment number for data
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1068 TT = total number of ICC segments (TT in each ICC segment should match)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1069 */
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1070
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1071 while (exif_jpeg_segment_find(data + seg_offset + seg_length,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1072 size - seg_offset - seg_length,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1073 JPEG_MARKER_APP2,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1074 "ICC_PROFILE\x00", 12,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1075 &seg_offset, &seg_length))
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1076 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1077 guchar chunk_num;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1078 guchar chunk_tot;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1079
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1080 if (seg_length < 14) return FALSE;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1081
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1082 chunk_num = data[seg_offset + 12];
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1083 chunk_tot = data[seg_offset + 13];
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1084
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1085 if (chunk_num == 0 || chunk_tot == 0) return FALSE;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1086
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1087 if (chunk_count == 0)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1088 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1089 guint i;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1090
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1091 chunk_count = (guint)chunk_tot;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1092 for (i = 0; i < chunk_count; i++) chunk_offset[i] = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1093 for (i = 0; i < chunk_count; i++) chunk_length[i] = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1094 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1095
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1096 if (chunk_tot != chunk_count ||
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1097 chunk_num > chunk_count) return FALSE;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1098
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1099 chunk_num--;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1100 chunk_offset[chunk_num] = seg_offset + 14;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1101 chunk_length[chunk_num] = seg_length - 14;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1102 }
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1103
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1104 if (chunk_count > 0)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1105 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1106 ExifItem *item;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1107 unsigned char *cp_data;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1108 guint cp_length = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1109 guint i;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1110
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1111 for (i = 0; i < chunk_count; i++) cp_length += chunk_length[i];
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1112 cp_data = g_malloc(cp_length);
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1113
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1114 for (i = 0; i < chunk_count; i++)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1115 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1116 if (chunk_offset[i] == 0)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1117 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1118 /* error, we never saw this chunk */
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1119 g_free(cp_data);
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1120 return FALSE;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1121 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1122 memcpy(cp_data, data + chunk_offset[i], chunk_length[i]);
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1123 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1124
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1125 item = exif_item_new(jpeg_color_marker.format, jpeg_color_marker.tag, 1,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1126 &jpeg_color_marker);
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1127 g_free(item->data);
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1128 item->data = cp_data;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1129 item->elements = cp_length;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1130 item->data_len = cp_length;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1131 exif->items = g_list_prepend(exif->items, item);
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1132
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1133 return TRUE;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1134 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1135
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1136 return FALSE;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1137 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1138
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1139 static gint exif_jpeg_parse(ExifData *exif,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1140 unsigned char *data, guint size,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1141 ExifMarker *list, gint parse_color)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1142 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1143 guint seg_offset = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1144 guint seg_length = 0;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1145 gint res = -1;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1146
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1147 if (size < 4 ||
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1148 memcmp(data, "\xFF\xD8", 2) != 0)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1149 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1150 return -2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1151 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1152
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1153 if (exif_jpeg_segment_find(data, size, JPEG_MARKER_APP1,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1154 "Exif\x00\x00", 6,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1155 &seg_offset, &seg_length))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1156 {
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1157 res = exif_tiff_parse(exif, data + seg_offset + 6, seg_length - 6, list);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1158 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1159
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1160 if (parse_color &&
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1161 exif_jpeg_parse_color(exif, data, size))
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1162 {
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1163 res = 0;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1164 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1165
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1166 return res;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1167 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1168
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1169
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1170 /*
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1171 *-------------------------------------------------------------------
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1172 * misc
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1173 *-------------------------------------------------------------------
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1174 */
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1175
176
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1176
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1177 ExifItem *exif_get_first_item(ExifData *exif)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1178 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1179 if (exif->items)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1180 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1181 ExifItem *ret = (ExifItem *)exif->items->data;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1182 exif->current = exif->items->next;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1183 return ret;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1184 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1185 exif->current = NULL;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1186 return NULL;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1187 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1188
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1189 ExifItem *exif_get_next_item(ExifData *exif)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1190 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1191 if (exif->current)
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1192 {
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1193 ExifItem *ret = (ExifItem *)exif->current->data;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1194 exif->current = exif->current->next;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1195 return ret;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1196 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1197 return NULL;
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1198 }
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1199
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1200
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1201
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1202 static gint map_file(const gchar *path, void **mapping, int *size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1203 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1204 int fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1205 struct stat fs;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1206
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1207 if ((fd = open(path, O_RDONLY)) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1208 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1209 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1210 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1211 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1212
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1213 if (fstat(fd, &fs) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1214 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1215 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1216 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1217 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1218 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1219
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1220 *size = fs.st_size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1221
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1222 if ((*mapping = mmap(0, *size, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0)) == MAP_FAILED)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1223 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1224 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1225 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1226 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1227 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1228
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1229 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1230 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1231 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1232
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1233 static gint unmap_file(void *mapping, int size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1234 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1235 if (munmap(mapping, size) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1236 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1237 perror("munmap");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1238 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1239 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1240
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1241 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1242 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1243
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1244 void exif_free(ExifData *exif)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1245 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1246 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1247
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1248 if (!exif) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1249
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1250 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1251 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1252 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1253 ExifItem *item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1254 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1255 exif_item_free(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1256 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1257
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1258 g_list_free(exif->items);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1259 g_free(exif);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1260 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1261
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 187
diff changeset
1262 ExifData *exif_read(gchar *path, gchar *sidecar_path, gint parse_color_profile)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1263 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1264 ExifData *exif;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1265 void *f;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1266 int size, res;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1267 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1268
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 181
diff changeset
1269 if (!path) return NULL;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1270
177
0ca3b4c8ffae started exiv2 integration
nadvornik
parents: 176
diff changeset
1271 pathl = path_from_utf8(path);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1272 if (map_file(pathl, &f, &size) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1273 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1274 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1275 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1276 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1277 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1278
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1279 exif = g_new0(ExifData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1280 exif->items = NULL;
176
695e1ad3b169 simplified exif.h, moved implementation-specific stuff to exif-int.h
nadvornik
parents: 138
diff changeset
1281 exif->current = NULL;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1282
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1283 if ((res = exif_jpeg_parse(exif, (unsigned char *)f, size,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1284 ExifKnownMarkersList,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1285 parse_color_profile)) == -2)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1286 {
54
b58cac75ad12 Thu Jun 9 22:23:18 2005 John Ellis <johne@verizon.net>
gqview
parents: 51
diff changeset
1287 res = exif_tiff_parse(exif, (unsigned char *)f, size, ExifKnownMarkersList);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1288 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1289
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1290 if (res != 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1291 {
101
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1292 FormatRawExifType exif_type;
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1293 FormatRawExifParseFunc exif_parse_func;
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1294 guint32 offset = 0;
101
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1295
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1296 exif_type = format_raw_exif_offset(f, size, &offset, &exif_parse_func);
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1297 switch (exif_type)
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1298 {
101
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1299 case FORMAT_RAW_EXIF_NONE:
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1300 default:
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1301 break;
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1302 case FORMAT_RAW_EXIF_TIFF:
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1303 res = exif_tiff_parse(exif, (unsigned char*)f + offset, size - offset,
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1304 ExifKnownMarkersList);
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1305 break;
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1306 case FORMAT_RAW_EXIF_JPEG:
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1307 res = exif_jpeg_parse(exif, (unsigned char*)f + offset, size - offset,
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1308 ExifKnownMarkersList, FALSE);
101
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1309 break;
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1310 case FORMAT_RAW_EXIF_IFD_II:
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1311 case FORMAT_RAW_EXIF_IFD_MM:
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1312 res = exif_parse_IFD_table(exif, (unsigned char*)f, offset, size - offset,
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1313 (exif_type == FORMAT_RAW_EXIF_IFD_II) ?
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1314 EXIF_BYTE_ORDER_INTEL : EXIF_BYTE_ORDER_MOTOROLA,
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1315 0, ExifKnownMarkersList);
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1316 break;
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1317 case FORMAT_RAW_EXIF_PROPRIETARY:
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1318 if (exif_parse_func)
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1319 {
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1320 res = exif_parse_func((unsigned char*)f + offset, size - offset, exif);
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1321 }
847e4bc6b54c Tue Nov 7 15:35:59 2006 John Ellis <johne@verizon.net>
gqview
parents: 64
diff changeset
1322 break;
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1323 }
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1324 }
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1325
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1326 if (res != 0)
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1327 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1328 exif_free(exif);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1329 exif = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1330 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1331
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1332 unmap_file(f, size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1333
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1334 if (exif) exif->items = g_list_reverse(exif->items);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1335
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1336 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1337 exif_write_data_list(exif, stdout, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1338 exif_write_data_list(exif, stdout, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1339 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1340
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1341 return exif;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1342 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1343
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1344 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1345 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1346 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1347
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1348 if (!key) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1349
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1350 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1351 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1352 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1353 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1354
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1355 item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1356 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1357 if (item->marker->key && strcmp(key, item->marker->key) == 0) return item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1358 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1359 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1360 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1361
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1362 #define EXIF_DATA_AS_TEXT_MAX_COUNT 16
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1363
192
d324b284e183 configure --without-exiv2
nadvornik
parents: 188
diff changeset
1364 gchar *exif_item_get_string(ExifItem *item, int idx)
d324b284e183 configure --without-exiv2
nadvornik
parents: 188
diff changeset
1365 {
d324b284e183 configure --without-exiv2
nadvornik
parents: 188
diff changeset
1366 return exif_item_get_data_as_text(item);
d324b284e183 configure --without-exiv2
nadvornik
parents: 188
diff changeset
1367 }
d324b284e183 configure --without-exiv2
nadvornik
parents: 188
diff changeset
1368
d324b284e183 configure --without-exiv2
nadvornik
parents: 188
diff changeset
1369
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1370 gchar *exif_item_get_data_as_text(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1371 {
47
aa4c0e1b54b0 Fri Jun 3 01:49:20 2005 John Ellis <johne@verizon.net>
gqview
parents: 45
diff changeset
1372 const ExifMarker *marker;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1373 gpointer data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1374 GString *string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1375 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1376 gint ne;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1377 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1378
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1379 if (!item) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1380
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1381 marker = item->marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1382 if (!marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1383
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1384 data = item->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1385 ne = item->elements;
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1386 if (ne > EXIF_DATA_AS_TEXT_MAX_COUNT) ne = EXIF_DATA_AS_TEXT_MAX_COUNT;
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1387 string = g_string_new("");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1388 switch (item->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1389 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1390 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1391 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1392 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1393 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1394 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1395 if (ne == 1 && marker->list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1396 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1397 gchar *result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1398 unsigned char val;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1399
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1400 if (item->format == EXIF_FORMAT_BYTE_UNSIGNED ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1401 item->format == EXIF_FORMAT_UNDEFINED)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1402 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1403 val = ((unsigned char *)data)[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1404 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1405 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1406 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1407 val = (unsigned char)(((signed char *)data)[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1408 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1409
57
a8c9992320f4 Fri Jun 10 20:57:42 2005 John Ellis <johne@verizon.net>
gqview
parents: 55
diff changeset
1410 result = exif_text_list_find_value(marker->list, (guint)val);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1411 string = g_string_append(string, result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1412 g_free(result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1413 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1414 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1415 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1416 string = string_append_raw_bytes(string, data, ne);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1417 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1418 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1419 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1420 string = g_string_append(string, (gchar *)(item->data));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1421 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1422 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1423 if (ne == 1 && marker->list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1424 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1425 gchar *result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1426
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1427 result = exif_text_list_find_value(marker->list, ((guint16 *)data)[0]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1428 string = g_string_append(string, result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1429 g_free(result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1430 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1431 else for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1432 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1433 g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1434 ((guint16 *)data)[i]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1435 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1436 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1437 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1438 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1439 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1440 g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1441 (unsigned long int)((guint32 *)data)[i]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1442 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1443 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1444 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1445 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1446 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1447 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1448
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1449 r = &((ExifRational *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1450 g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1451 (unsigned long)r->num, (unsigned long)r->den);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1452 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1453 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1454 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1455 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1456 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1457 g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1458 ((gint16 *)data)[i]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1459 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1460 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1461 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1462 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1463 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1464 g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1465 (long int)((gint32 *)data)[i]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1466 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1467 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1468 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1469 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1470 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1471 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1472
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1473 r = &((ExifRational *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1474 g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1475 (long)r->num, (long)r->den);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1476 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1477 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1478 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1479 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1480 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1481 g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1482 ((float *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1483 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1484 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1485 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1486 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1487 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1488 g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1489 ((double *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1490 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1491 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1492 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1493
114
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1494 if (item->elements > EXIF_DATA_AS_TEXT_MAX_COUNT &&
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1495 item->format != EXIF_FORMAT_STRING)
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1496 {
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1497 g_string_append(string, " ...");
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1498 }
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1499
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1500 text = string->str;
50fc73e08550 Mon Nov 27 01:23:23 2006 John Ellis <johne@verizon.net>
gqview
parents: 110
diff changeset
1501 g_string_free(string, FALSE);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1502
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1503 return text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1504 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1505
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1506 gint exif_item_get_integer(ExifItem *item, gint *value)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1507 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1508 if (!item) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1509
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1510 switch (item->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1511 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1512 case EXIF_FORMAT_SHORT:
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1513 *value = (gint)(((gint16 *)(item->data))[0]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1514 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1515 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1516 case EXIF_FORMAT_SHORT_UNSIGNED:
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1517 *value = (gint)(((guint16 *)(item->data))[0]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1518 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1519 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1520 case EXIF_FORMAT_LONG:
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1521 *value = (gint)(((gint32 *)(item->data))[0]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1522 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1523 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1524 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1525 /* FIXME: overflow possible */
110
9fbf210edc6f Tue Nov 14 15:36:14 2006 John Ellis <johne@verizon.net>
gqview
parents: 107
diff changeset
1526 *value = (gint)(((guint32 *)(item->data))[0]);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1527 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1528 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1529 /* all other type return FALSE */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1530 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1531 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1532 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1533 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1534
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1535
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1536 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1537 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1538 if (!item) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1539
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1540 if (item->format == EXIF_FORMAT_RATIONAL ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1541 item->format == EXIF_FORMAT_RATIONAL_UNSIGNED)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1542 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1543 if (sign) *sign = (item->format == EXIF_FORMAT_RATIONAL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1544 return &((ExifRational *)(item->data))[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1545 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1546
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1547 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1548 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1549
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents: 181
diff changeset
1550 const gchar *exif_get_tag_description_by_key(const gchar *key)
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1551 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1552 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1553
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1554 if (!key) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1555
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1556 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1557 while (ExifKnownMarkersList[i].tag > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1558 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1559 if (strcmp(key, ExifKnownMarkersList[i].key) == 0) return _(ExifKnownMarkersList[i].description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1560 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1561 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1562
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1563 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1564 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1565
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1566 static void exif_write_item(FILE *f, ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1567 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1568 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1569
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1570 text = exif_item_get_data_as_text(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1571 if (text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1572 {
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 182
diff changeset
1573 gchar *tag = exif_item_get_tag_name(item);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1574 fprintf(f, "%4x %9s %30s %s\n", item->tag, ExifFormatList[item->format].short_name,
185
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 182
diff changeset
1575 tag, text);
354da67a7ca2 read also iptc and xmp
nadvornik
parents: 182
diff changeset
1576 g_free(tag);
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1577 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1578 g_free(text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1579 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1580
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1581 void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1582 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1583 if (!f || !exif) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1584
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1585 fprintf(f, " tag format key value\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1586 fprintf(f, "----------------------------------------------------\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1587
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1588 if (human_readable_list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1589 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1590 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1591
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1592 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1593 while (ExifFormattedList[i].key)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1594 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1595 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1596
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1597 text = exif_get_formatted_by_key(exif, ExifFormattedList[i].key, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1598 if (text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1599 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1600 fprintf(f, " %9s %30s %s\n", "string", ExifFormattedList[i].key, text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1601 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1602 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1603 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1604 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1605 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1606 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1607 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1608
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1609 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1610 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1611 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1612 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1613
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1614 item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1615 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1616
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1617 exif_write_item(f, item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1618 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1619 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1620 fprintf(f, "----------------------------------------------------\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1621 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1622
187
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1623 int exif_write(ExifData *exif)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1624 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1625 printf("Not compiled with EXIF write support");
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1626 return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1627 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1628
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1629 ExifItem *exif_add_item(ExifData *exif, const gchar *key)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1630 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1631 return NULL;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1632 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1633
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1634 int exif_item_delete(ExifData *exif, ExifItem *item)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1635 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1636 return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1637 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1638
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1639 int exif_item_set_string(ExifItem *item, const char *str)
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1640 {
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1641 return 0;
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1642 }
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1643
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1644
9eafc4957f1a write support in Exiv2 wrapper; for now only string values
nadvornik
parents: 185
diff changeset
1645
177
0ca3b4c8ffae started exiv2 integration
nadvornik
parents: 176
diff changeset
1646 #endif
0ca3b4c8ffae started exiv2 integration
nadvornik
parents: 176
diff changeset
1647 /* not HAVE_EXIV2 */