annotate src/exif.c @ 43:ee03f36e9e4b

Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net> * format_raw.[ch]: New files to parse image data and exif offsets for the raw camera formats. * exif.c, image-load.c: Add support calls to format_raw.c functions above. * filelist.c: Add Fujifilm raw file extension to known formats. * thumb_standard.c (thumb_loader_std_start): Check for existing thumbnail file before checking for a failure mark. * src/Makefile.am: Add format_raw.[ch]. ##### Note: GQview CVS on sourceforge is not always up to date, please use ##### ##### an offical release when making enhancements and translation updates. #####
author gqview
date Mon, 16 May 2005 01:49:51 +0000
parents d907d608745f
children 7cfa60beda76
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
3 * (C) 2004 John Ellis
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
57 #include <stdio.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
58 #include <inttypes.h> /* stdint.h is not available on all systems... */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
59 #include <string.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
60 #include <fcntl.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
61 #include <unistd.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
62 #include <sys/types.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
63 #include <sys/stat.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
64 #include <sys/mman.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
65 #include <math.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
66
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
67 #include <glib.h>
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
68
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
69 #include "intl.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
70
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
71 #include "exif.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
72
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
73 #include "format_raw.h"
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
74 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
75
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
76
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 * Tag formats
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 */
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 ExifFormatAttrib ExifFormatList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
84 { EXIF_FORMAT_UNKNOWN, 1, "unknown", "unknown" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
85 { EXIF_FORMAT_BYTE_UNSIGNED, 1, "ubyte", "unsigned byte" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
86 { EXIF_FORMAT_STRING, 1, "string", "string" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
87 { EXIF_FORMAT_SHORT_UNSIGNED, 2, "ushort", "unsigned short" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
88 { EXIF_FORMAT_LONG_UNSIGNED, 4, "ulong", "unsigned long" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89 { EXIF_FORMAT_RATIONAL_UNSIGNED,8, "urational", "unsigned rational" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
90 { EXIF_FORMAT_BYTE, 1, "byte", "byte" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
91 { EXIF_FORMAT_UNDEFINED, 1, "undefined", "undefined" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92 { EXIF_FORMAT_SHORT, 2, "sshort", "signed short" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
93 { EXIF_FORMAT_LONG, 4, "slong", "signed long" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
94 { EXIF_FORMAT_RATIONAL, 8, "srational", "signed rational" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
95 { EXIF_FORMAT_FLOAT, 4, "float", "float" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96 { EXIF_FORMAT_DOUBLE, 8, "double", "double" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
97 { -1, 0, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
98 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
99
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
100 /* tags that are special, or need special treatment */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101 #define TAG_EXIFOFFSET 0x8769
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
102
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
103
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
104 /*
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 * Data
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
110 #define EXIF_TEXT_LIST_END { -1, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
111
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
112 static ExifTextList ExifOrientationList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
113 { EXIF_ORIENTATION_UNKNOWN, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
114 { EXIF_ORIENTATION_TOP_LEFT, N_("top left") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
115 { EXIF_ORIENTATION_TOP_RIGHT, N_("top right") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
116 { EXIF_ORIENTATION_BOTTOM_RIGHT,N_("bottom right") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
117 { EXIF_ORIENTATION_BOTTOM_LEFT, N_("bottom left") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
118 { EXIF_ORIENTATION_LEFT_TOP, N_("left top") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
119 { EXIF_ORIENTATION_RIGHT_TOP, N_("right top") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
120 { EXIF_ORIENTATION_RIGHT_BOTTOM,N_("right bottom") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
121 { EXIF_ORIENTATION_LEFT_BOTTOM, N_("left bottom") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
122 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
123 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
124
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
125 static ExifTextList ExifUnitList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
126 { EXIF_UNIT_UNKNOWN, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
127 { EXIF_UNIT_NOUNIT, "" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
128 { EXIF_UNIT_INCH, N_("inch") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
129 { EXIF_UNIT_CENTIMETER, N_("centimeter") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
130 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
131 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
132
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
133 static ExifTextList ExifYCbCrPosList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
134 { 1, "center" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
135 { 2, "datum" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
136 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
137 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
138
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
139 static ExifTextList ExifMeteringModeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
140 { 0, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
141 { 1, N_("average") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
142 { 2, N_("center weighted") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
143 { 3, N_("spot") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
144 { 4, N_("multi-spot") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
145 { 5, N_("multi-segment") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146 { 6, N_("partial") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147 { 255, N_("other") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
148 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
149 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
150
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
151 static ExifTextList ExifExposureProgramList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
152 { 0, N_("not defined") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
153 { 1, N_("manual") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
154 { 2, N_("normal") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
155 { 3, N_("aperture") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
156 { 4, N_("shutter") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157 { 5, N_("creative") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
158 { 6, N_("action") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
159 { 7, N_("portrait") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
160 { 8, N_("landscape") },
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 ExifLightSourceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
165 { 0, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 { 1, N_("daylight") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
167 { 2, N_("fluorescent") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168 { 3, N_("tungsten (incandescent)") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169 { 4, N_("flash") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
170 { 9, "fine weather" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
171 { 10, "cloudy weather" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
172 { 11, "shade" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173 { 12, "daylight fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
174 { 13, "day white fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 { 14, "cool white fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 { 15, "while fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177 { 17, "standard light A" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
178 { 18, "standard light B" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
179 { 19, "standard light C" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
180 { 20, "D55" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
181 { 21, "D65" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
182 { 22, "D75" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
183 { 23, "D50" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
184 { 24, "ISO studio tungsten" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
185 { 255, N_("other") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
186 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
187 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
188
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
189 static ExifTextList ExifFlashList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
190 { 0, N_("no") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
191 { 1, N_("yes") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
192 { 5, N_("yes, not detected by strobe") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
193 { 7, N_("yes, detected by strobe") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
194 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
195 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
196
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
197 static ExifTextList ExifColorSpaceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
198 { 1, "sRGB" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
199 { 65535,"uncalibrated" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
201 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
202
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
203 static ExifTextList ExifSensorList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
204 { 1, "not defined" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
205 { 2, "1 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
206 { 2, "2 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
207 { 4, "3 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
208 { 5, "color sequential area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
209 { 7, "trilinear" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
210 { 8, "color sequential linear" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
211 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
212 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
213
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
214 static ExifTextList ExifSourceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
215 { 3, "digital still camera" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
216 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
217 };
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 static ExifTextList ExifSceneList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
220 { 1, "direct photo" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
221 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
222 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
223
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
224 static ExifTextList ExifCustRenderList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
225 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
226 { 1, "custom" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
227 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
228 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
229
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
230 static ExifTextList ExifExposureModeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
231 { 0, "auto" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 { 1, "manual" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
233 { 2, "auto bracket" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
234 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
235 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
236
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
237 static ExifTextList ExifWhiteBalanceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
238 { 0, "auto" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
239 { 1, "manual" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
240 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
241 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
242
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
243 static ExifTextList ExifSceneCaptureList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244 { 0, "standard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 { 1, "landscape" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 { 2, "portrait" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
247 { 3, "night scene" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
248 EXIF_TEXT_LIST_END
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
251 static ExifTextList ExifGainControlList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
252 { 0, "none" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
253 { 1, "low gain up" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
254 { 2, "high gain up" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
255 { 3, "low gain down" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
256 { 4, "high gain down" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
257 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
258 };
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 static ExifTextList ExifContrastList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
261 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262 { 1, "soft" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
263 { 2, "hard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
265 };
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 static ExifTextList ExifSaturationList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
268 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
269 { 1, "low" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
270 { 2, "high" },
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 ExifSharpnessList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
275 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
276 { 1, "soft" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
277 { 2, "hard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
278 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
279 };
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 static ExifTextList ExifSubjectRangeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
282 { 0, "unknown" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
283 { 1, "macro" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
284 { 2, "close" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
285 { 3, "distant" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
286 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
287 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
288
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
289 ExifMarker ExifKnownMarkersList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
290 { 0x010e, EXIF_FORMAT_STRING, -1, "ImageDescription", N_("Image description"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
291 { 0x010f, EXIF_FORMAT_STRING, -1, "Make", "Camera make", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
292 { 0x0110, EXIF_FORMAT_STRING, -1, "Model", "Camera model", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
293 { 0x0112, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Orientation", N_("Orientation"), ExifOrientationList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
294 { 0x011a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "XResolution", "X resolution", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
295 { 0x011b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "YResolution", "Y Resolution", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
296 { 0x0128, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ResolutionUnit", "Resolution units", ExifUnitList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
297 { 0x0131, EXIF_FORMAT_STRING, -1, "Software", "Firmware", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
298 { 0x0132, EXIF_FORMAT_STRING, 20, "DateTime", N_("Date"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
299 { 0x013e, EXIF_FORMAT_RATIONAL_UNSIGNED, 2, "WhitePoint", "White point", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
300 { 0x013f, EXIF_FORMAT_RATIONAL_UNSIGNED, 6, "PrimaryChromaticities","Primary chromaticities", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
301 { 0x0211, EXIF_FORMAT_RATIONAL_UNSIGNED, 3, "YCbCrCoefficients", "YCbCy coefficients", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
302 { 0x0213, EXIF_FORMAT_SHORT_UNSIGNED, 1, "YCbCrPositioning", "YCbCr positioning", ExifYCbCrPosList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
303 { 0x0214, EXIF_FORMAT_RATIONAL_UNSIGNED, 6, "ReferenceBlackWhite", "Black white reference", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
304 { 0x8298, EXIF_FORMAT_STRING, -1, "Copyright", N_("Copyright"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
305 { 0x8769, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifOffset", "SubIFD Exif offset", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
306 /* subIFD follows */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
307 { 0x829a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ExposureTime", "Exposure time (seconds)", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
308 { 0x829d, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FNumber", "FNumber", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
309 { 0x8822, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ExposureProgram", N_("Exposure program"), ExifExposureProgramList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
310 { 0x8824, EXIF_FORMAT_STRING, -1, "SpectralSensitivity", "Spectral Sensitivity", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
311 { 0x8827, EXIF_FORMAT_SHORT_UNSIGNED, -1, "ISOSpeedRatings", N_("ISO sensitivity"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
312 { 0x8828, EXIF_FORMAT_UNDEFINED, -1, "OECF", "Optoelectric conversion factor", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
313 { 0x9000, EXIF_FORMAT_UNDEFINED, 4, "ExifVersion", "Exif version", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
314 { 0x9003, EXIF_FORMAT_STRING, 20, "DateTimeOriginal", N_("Date original"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
315 { 0x9004, EXIF_FORMAT_STRING, 20, "DateTimeDigitized", N_("Date digitized"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
316 { 0x9101, EXIF_FORMAT_UNDEFINED, -1, "ComponentsConfiguration","Pixel format", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
317 { 0x9102, EXIF_FORMAT_RATIONAL_UNSIGNED,1, "CompressedBitsPerPixel","Compression ratio", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
318 { 0x9201, EXIF_FORMAT_RATIONAL, 1, "ShutterSpeedValue", N_("Shutter speed"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
319 { 0x9202, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ApertureValue", N_("Aperture"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
320 { 0x9203, EXIF_FORMAT_RATIONAL, 1, "BrightnessValue", "Brightness", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
321 { 0x9204, EXIF_FORMAT_RATIONAL, 1, "ExposureBiasValue", N_("Exposure bias"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
322 { 0x9205, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "MaxApertureValue", "Maximum aperture", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
323 { 0x9206, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "SubjectDistance", N_("Subject distance"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
324 { 0x9207, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MeteringMode", N_("Metering mode"), ExifMeteringModeList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
325 { 0x9208, EXIF_FORMAT_SHORT_UNSIGNED, 1, "LightSource", N_("Light source"), ExifLightSourceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
326 { 0x9209, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Flash", N_("Flash"), ExifFlashList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
327 { 0x920a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FocalLength", N_("Focal length"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
328 { 0x9214, EXIF_FORMAT_SHORT_UNSIGNED, -1, "SubjectArea", "Subject area", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
329 { 0x927c, EXIF_FORMAT_UNDEFINED, -1, "MakerNote", "MakerNote", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
330 { 0x9286, EXIF_FORMAT_UNDEFINED, -1, "UserComment", "UserComment", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
331 { 0x9290, EXIF_FORMAT_STRING, -1, "SubsecTime", "Subsecond time", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
332 { 0x9291, EXIF_FORMAT_STRING, -1, "SubsecTimeOriginal", "Subsecond time original", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
333 { 0x9292, EXIF_FORMAT_STRING, -1, "SubsecTimeDigitized", "Subsecond time digitized", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
334 { 0xa000, EXIF_FORMAT_UNDEFINED, 4, "FlashPixVersion", "FlashPix version", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
335 { 0xa001, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ColorSpace", "Colorspace", ExifColorSpaceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
336 /* ExifImageWidth, ExifImageHeight can also be unsigned short */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
337 { 0xa002, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifImageWidth", N_("Width"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
338 { 0xa003, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifImageHeight", N_("Height"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
339 { 0xa004, EXIF_FORMAT_STRING, -1, "RelatedSoundFile", "Audio data", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
340 { 0xa005, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifInteroperabilityOffset", "ExifR98 extension", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
341 { 0xa20b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FlashEnergy", "Flash strength", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
342 { 0xa20c, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SpatialFrequencyResponse","Spatial frequency response", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
343 { 0xa20e, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FocalPlaneXResolution", "X Pixel density", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
344 { 0xa20f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FocalPlaneYResolution", "Y Pixel density", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
345 { 0xa210, EXIF_FORMAT_SHORT_UNSIGNED, 1, "FocalPlaneResolutionUnit", "Pixel density units", ExifUnitList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
346 { 0x0214, EXIF_FORMAT_SHORT_UNSIGNED, 2, "SubjectLocation", "Subject location", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
347 { 0xa215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ExposureIndex", N_("ISO sensitivity"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
348 { 0xa217, EXIF_FORMAT_SHORT_UNSIGNED, -1, "SensingMethod", "Sensor type", ExifSensorList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
349 { 0xa300, EXIF_FORMAT_UNDEFINED, 1, "FileSource", "Source type", ExifSourceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
350 { 0xa301, EXIF_FORMAT_UNDEFINED, 1, "SceneType", "Scene type", ExifSceneList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
351 { 0xa302, EXIF_FORMAT_UNDEFINED, -1, "CFAPattern", "Color filter array pattern", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
352 /* tags a4xx were added for Exif 2.2 (not just these - some above, as well) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
353 { 0xa401, EXIF_FORMAT_SHORT_UNSIGNED, 1, "CustomRendered", "Render process", ExifCustRenderList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
354 { 0xa402, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ExposureMode", "Exposure mode", ExifExposureModeList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
355 { 0xa403, EXIF_FORMAT_SHORT_UNSIGNED, 1, "WhiteBalance", "White balance", ExifWhiteBalanceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
356 { 0xa404, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "DigitalZoomRatio", "Digital zoom ratio", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
357 { 0xa405, EXIF_FORMAT_SHORT_UNSIGNED, 1, "FocalLength35mmFilm", "Focal length (35mm)", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
358 { 0xa406, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SceneCapturetype", "Scene capture type", ExifSceneCaptureList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
359 { 0xa407, EXIF_FORMAT_SHORT_UNSIGNED, 1, "GainControl", "Gain control", ExifGainControlList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
360 { 0xa408, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Contrast", "Contrast", ExifContrastList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
361 { 0xa409, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Saturation", "Saturation", ExifSaturationList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
362 { 0xa40a, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Sharpness", "Sharpness", ExifSharpnessList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
363 { 0xa40b, EXIF_FORMAT_UNDEFINED, -1, "DeviceSettingDescription","Device setting", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
364 { 0xa40c, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SubjectDistanceRange", "Subject range", ExifSubjectRangeList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
365 { 0xa420, EXIF_FORMAT_STRING, -1, "ImageUniqueID", "Image serial number", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
366 /* place known, but undocumented or lesser used tags here */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
367 { 0x00fe, EXIF_FORMAT_LONG_UNSIGNED, 1, "NewSubfileType", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
368 { 0x00ff, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SubfileType", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
369 { 0x012d, EXIF_FORMAT_SHORT_UNSIGNED, 3, "TransferFunction", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
370 { 0x013b, EXIF_FORMAT_STRING, -1, "Artist", "Artist", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
371 { 0x013d, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Predictor", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
372 { 0x0142, EXIF_FORMAT_SHORT_UNSIGNED, 1, "TileWidth", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
373 { 0x0143, EXIF_FORMAT_SHORT_UNSIGNED, 1, "TileLength", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
374 { 0x0144, EXIF_FORMAT_LONG_UNSIGNED, -1, "TileOffsets", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
375 { 0x0145, EXIF_FORMAT_SHORT_UNSIGNED, -1, "TileByteCounts", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
376 { 0x014a, EXIF_FORMAT_LONG_UNSIGNED, -1, "SubIFDs", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
377 { 0x015b, EXIF_FORMAT_UNDEFINED, -1, "JPEGTables", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
378 { 0x828d, EXIF_FORMAT_SHORT_UNSIGNED, 2, "CFARepeatPatternDim", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
379 { 0x828e, EXIF_FORMAT_BYTE_UNSIGNED, -1, "CFAPattern", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
380 { 0x828f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "BatteryLevel", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
381 { 0x83bb, EXIF_FORMAT_LONG_UNSIGNED, -1, "IPTC/NAA", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
382 { 0x8773, EXIF_FORMAT_UNDEFINED, -1, "InterColorProfile", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
383 { 0x8825, EXIF_FORMAT_LONG_UNSIGNED, 1, "GPSInfo", "SubIFD GPS offset", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
384 { 0x8829, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Interlace", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
385 { 0x882a, EXIF_FORMAT_SHORT, 1, "TimeZoneOffset", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
386 { 0x882b, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SelfTimerMode", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
387 { 0x920b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FlashEnergy", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
388 { 0x920c, EXIF_FORMAT_UNDEFINED, -1, "SpatialFrequencyResponse", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
389 { 0x920d, EXIF_FORMAT_UNDEFINED, -1, "Noise", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
390 { 0x9211, EXIF_FORMAT_LONG_UNSIGNED, 1, "ImageNumber", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
391 { 0x9212, EXIF_FORMAT_STRING, 1, "SecurityClassification", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
392 { 0x9213, EXIF_FORMAT_STRING, -1, "ImageHistory", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
393 { 0x9215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ExposureIndex", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
394 { 0x9216, EXIF_FORMAT_BYTE_UNSIGNED, 4, "TIFF/EPStandardID", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
395
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
396 /* end is marked by 0 tag */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
397 { 0x0000, EXIF_FORMAT_UNKNOWN, 0, NULL, NULL, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
398 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
399
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
400 ExifMarker ExifUnknownMarkersList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
401 { 0x0000, EXIF_FORMAT_UNKNOWN, 0, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
402 { 0x0000, EXIF_FORMAT_BYTE_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
403 { 0x0000, EXIF_FORMAT_STRING, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
404 { 0x0000, EXIF_FORMAT_SHORT_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
405 { 0x0000, EXIF_FORMAT_LONG_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
406 { 0x0000, EXIF_FORMAT_RATIONAL_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
407 { 0x0000, EXIF_FORMAT_BYTE, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
408 { 0x0000, EXIF_FORMAT_UNDEFINED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
409 { 0x0000, EXIF_FORMAT_SHORT, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
410 { 0x0000, EXIF_FORMAT_LONG, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
411 { 0x0000, EXIF_FORMAT_RATIONAL, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
412 { 0x0000, EXIF_FORMAT_FLOAT, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
413 { 0x0000, EXIF_FORMAT_DOUBLE, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
414 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
415
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
416 /* human readable key list */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
417
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
418 ExifFormattedText ExifFormattedList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
419 { "fCamera", N_("Camera") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
420 { "fDateTime", N_("Date") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
421 { "fShutterSpeed", N_("Shutter speed") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
422 { "fAperture", N_("Aperture") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
423 { "fExposureBias", N_("Exposure bias") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
424 { "fISOSpeedRating", N_("ISO sensitivity") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
425 { "fFocalLength", N_("Focal length") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
426 { "fSubjectDistance", N_("Subject distance") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
427 { "fFlash", N_("Flash") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
428 { "fResolution", N_("Resolution") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
429 { NULL, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
430 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
431
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
432
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
433 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
434 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
435 * misc
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
436 *-----------------------------------------------------------------------------
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 #define BYTE_ORDER_INTEL 1
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
440 #define BYTE_ORDER_MOTOROLA 2
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
441
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
442
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
443 #define MARKER_UNKNOWN 0x00
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
444 #define MARKER_SOI 0xD8
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
445 #define MARKER_APP1 0xE1
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
446
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
447 /* These data structs are packed to make sure the
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
448 * byte alignment matches the on-disk data format.
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
449 */
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
450 typedef struct __attribute__((packed)) {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
451 char byte_order[2];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
452 uint16_t magic;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
453 uint32_t IFD_offset;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
454 } TIFFHeader;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
455
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
456 typedef struct __attribute__((packed)) {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
457 uint16_t tag;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
458 uint16_t format;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
459 uint32_t nb;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
460 uint32_t data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
461 } IFDEntry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
462
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
463
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
464 static ExifMarker *exif_marker_from_tag(uint16_t tag);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
465 static int parse_IFD_table(ExifData *exif, unsigned char *tiff, int offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
466 int size, int byte_order);
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 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
469 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
470 * ExifItem
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
471 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
472 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
473
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
474 static ExifItem *exif_item_new(ExifFormatType format, unsigned int tag, unsigned int elements, ExifMarker *marker)
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 ExifItem *item;
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 item = g_new0(ExifItem, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
479 item->format = format;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
480 item->tag = tag;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
481 item->marker = marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
482 item->elements = elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
483 item->data = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
484 item->data_len = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
485
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
486 switch (format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
487 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
488 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
489 /* unknown, data is NULL */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
490 return item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
491 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
492 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
493 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
494 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
495 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
496 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
497 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
498 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
499 item->data_len = sizeof(unsigned short int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
500 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
501 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
502 item->data_len = sizeof(unsigned long int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
503 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
504 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
505 item->data_len = sizeof(ExifRational) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
506 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
507 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
508 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
509 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
510 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
511 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
512 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
513 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
514 item->data_len = sizeof(short int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
515 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
516 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
517 item->data_len = sizeof(long int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
518 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
519 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
520 item->data_len = sizeof(ExifRational) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
521 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
522 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
523 item->data_len = sizeof(float) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
524 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
525 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
526 item->data_len = sizeof(double) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
527 break;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
530 item->data = g_malloc0(item->data_len);
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 return item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
533 }
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 static void exif_item_free(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
536 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
537 if (!item) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
538
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
539 g_free(item->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
540 g_free(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
541 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
542
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
543 const char *exif_item_get_tag_name(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
544 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
545 if (!item || !item->marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
546 return item->marker->key;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
547 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
548
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
549 const char *exif_item_get_description(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
550 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
551 if (!item || !item->marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
552 return _(item->marker->description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
553 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
554
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
555 const char *exif_item_get_format_name(ExifItem *item, gint brief)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
556 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
557 if (!item || !item->marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
558 return (brief) ? ExifFormatList[item->format].short_name : ExifFormatList[item->format].description;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
559 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
560
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
561
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
562 #define UNDEFINED_TEXT_BYTE_COUNT 16
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 static GString *string_append_raw_bytes(GString *string, gpointer data, gint ne)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
565 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
566 gint i;
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 for (i = 0 ; i < ne && i < UNDEFINED_TEXT_BYTE_COUNT; i++)
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 unsigned char c = ((char *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
571 if (c < 32 || c > 127) c = '.';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
572 g_string_append_printf(string, "%c", c);
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 string = g_string_append(string, " : ");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
575 for (i = 0 ; i < ne && i < UNDEFINED_TEXT_BYTE_COUNT; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
576 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
577 const gchar *spacer;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
578 if (i > 0)
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 if (i%8 == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
581 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
582 spacer = " - ";
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 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
585 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
586 spacer = " ";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
587 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
588 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
589 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
590 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
591 spacer = "";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
592 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
593 g_string_append_printf(string, "%s%02x", spacer, ((char *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
594 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
595 if (i >= UNDEFINED_TEXT_BYTE_COUNT) g_string_append_printf(string, " (%d bytes)", ne);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
596
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
597 return string;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
600 static gchar *text_list_find_value(ExifTextList *list, gint value)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
601 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
602 gchar *result = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
603 gint 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 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
606 while (!result && list[i].value >= 0)
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 if (value == list[i].value) result = g_strdup(_(list[i].description));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
609 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
610 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
611 if (!result) result = g_strdup_printf("%d (%s)", value, _("unknown"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
612
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
613 return result;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
616 /*
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 * byte size utils
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
619 *-------------------------------------------------------------------
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
622 static uint16_t get_int16(unsigned char *f, int bo)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
623 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
624 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
625 return *f + (*(f+1)<<8);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
626 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
627 return ((*f)<<8) + *(f+1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
628 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
629
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
630 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
631 /* not used ? */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
632 static uint32_t get_int32(unsigned char *f, int bo)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
633 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
634 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
635 return get_int16(f, BYTE_ORDER_INTEL) + (get_int16(f+2, BYTE_ORDER_INTEL)<<16);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
636 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
637 return (get_int16(f, BYTE_ORDER_MOTOROLA)<<16) + get_int16(f+2, BYTE_ORDER_MOTOROLA);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
638 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
639 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
640
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
641 static uint16_t swab_int16(uint16_t n, int bo)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
642 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
643 #if BYTE_ORDER == LITTLE_ENDIAN
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
644 if (bo == BYTE_ORDER_MOTOROLA)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
645 #else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
646 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
647 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
648 return n>>8 | n<<8 ;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
649 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
650 return n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
651 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
652
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
653 static uint32_t swab_int32(uint32_t n, int bo)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
654 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
655 #if BYTE_ORDER == LITTLE_ENDIAN
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
656 if (bo == BYTE_ORDER_MOTOROLA)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
657 #else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
658 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
659 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
660 return n<<24 | n>>24 | (n & 0xFF0000)>>8 | (n & 0xFF00)<<8;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
661 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
662 return n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
663 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
664
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
665 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
666 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
667 * marker utils
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
668 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
669 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
670
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
671 static int get_marker_size(unsigned char *f)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
672 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
673 /* Size is always in Motorola byte order */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
674 return get_int16(f+2, BYTE_ORDER_MOTOROLA);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
675 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
676
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
677 static int goto_next_marker(unsigned char **f, int *size, int *marker)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
678 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
679 int marker_size = 2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
680
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
681 *marker = MARKER_UNKNOWN;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
682
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
683 /* It is safe to access the marker and its size since we have checked
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
684 * the SOI and this function guaranties the whole next marker is
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
685 * available
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
686 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
687 if (*(*f+1) != MARKER_SOI)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
688 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
689 marker_size += get_marker_size(*f);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
690 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
691
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
692 *size -= marker_size;
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 /* size should be at least 4, so we can read the marker and its size
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
695 * and check data are actually available
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 if (*size < 4) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
698
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
699 /* Jump to the next marker and be sure it begins with 0xFF
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
700 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
701 *f += marker_size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
702 if (**f != 0xFF) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
703
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
704 if (get_marker_size(*f)+2 > *size) return -1;
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 *marker = *(*f+1);
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 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
709 }
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 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
712 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
713 * IFD utils
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
714 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
715 */
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 static ExifMarker *exif_marker_from_tag(uint16_t tag)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
718 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
719 static int len = sizeof(ExifKnownMarkersList)/sizeof(ExifMarker) - 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
720 int i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
721
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
722 while (i < len && ExifKnownMarkersList[i].tag != tag)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
723 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
724 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
725 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
726
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
727 return (i >= len ? NULL : &ExifKnownMarkersList[i]);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
730 static void rational_from_data(ExifRational *r, void *src, int byte_order)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
731 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
732 r->num = swab_int32(*(uint32_t*)src, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
733 r->den = swab_int32(*(uint32_t*)(src + sizeof(uint32_t)), byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
734 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
735
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
736 static void exif_item_copy_data(ExifItem *item, void *src, int len, ExifFormatType src_format, int byte_order)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
737 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
738 int bs;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
739 int ne;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
740 gpointer dest;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
741 int i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
742
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
743 bs = ExifFormatList[item->format].size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
744 ne = item->elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
745 dest = item->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
746
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
747 if (!dest || len > item->data_len)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
748 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
749 printf("exif tag %s data size mismatch\n", exif_item_get_tag_name(item));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
750 return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
751 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
752
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
753 switch (item->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
754 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
755 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
756 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
757 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
758 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
759 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
760 memcpy(dest, src, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
761 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
762 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
763 memcpy(dest, src, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
764 /* string is NULL terminated, make sure this is true */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
765 if (((char *)dest)[len - 1] != '\0') ((char *)dest)[len - 1] = '\0';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
766 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
767 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
768 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
769 for (i = 0; i < ne; i++)
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 ((short *)dest)[i] = swab_int16(*(uint16_t*)(src + i * bs), byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
772 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
773 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
774 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
775 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
776 if (src_format == EXIF_FORMAT_SHORT_UNSIGNED ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
777 src_format == EXIF_FORMAT_SHORT)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
778 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
779 /* a short fits into a long, so allow it */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
780 int ss;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
781
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
782 ss = ExifFormatList[src_format].size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
783 for (i = 0; i < ne; i++)
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 ((long *)dest)[i] = (long)swab_int16(*(uint16_t*)(src + i * ss), byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
786 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
787 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
788 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
789 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
790 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
791 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
792 ((long *)dest)[i] = swab_int32(*(uint32_t*)(src + i * bs), byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
793 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
794 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
795 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
796 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
797 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
798 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
799 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
800 rational_from_data(&((ExifRational *)dest)[i], src + i * bs, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
801 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
802 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
803 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
804 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
805 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
806 ((float *)dest)[i] = swab_int32(*(uint32_t*)(src + i * bs), byte_order);
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 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
810 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
811 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
812 ExifRational r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
813
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
814 rational_from_data(&r, src + i * bs, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
815 if (r.den) ((double *)dest)[i] = (double)r.num / r.den;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
816 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
817 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
818 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
819 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
820
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
821 static int parse_IFD_entry(ExifData *exif, unsigned char *tiff, int offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
822 int size, int byte_order)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
823 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
824 IFDEntry *ent = (IFDEntry*)(tiff+offset);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
825 uint32_t swabed_data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
826 void *data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
827 int data_len;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
828 ExifMarker *marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
829 ExifItem *item;
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 ent->tag = swab_int16(ent->tag, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
832 ent->format = swab_int16(ent->format, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
833 ent->nb = swab_int32(ent->nb, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
834 swabed_data = swab_int32(ent->data, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
835
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
836 /* 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
837 * 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
838 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
839 marker = exif_marker_from_tag(ent->tag);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
840 if (!marker)
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 if (ent->format > EXIF_FORMAT_DOUBLE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
843 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
844 printf("warning: exif tag 0x%4x has invalid format %d\n", ent->tag, ent->format);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
845 return 0;
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 /* allow non recognized tags to be displayed */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
848 marker = &ExifUnknownMarkersList[ent->format];
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 if (marker->format != ent->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
851 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
852 /* Some cameras got mixed up signed/unsigned_rational
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
853 * eg KODAK DC4800 on object_distance tag
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
854 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
855 * FIXME: what exactly is this test trying to do?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
856 * 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
857 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
858 if ( !(marker->format == EXIF_FORMAT_RATIONAL_UNSIGNED && ent->format == EXIF_FORMAT_RATIONAL) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
859 !(marker->format == EXIF_FORMAT_RATIONAL && ent->format == EXIF_FORMAT_RATIONAL_UNSIGNED) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
860 /* short fits into a long so allow this mismatch
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
861 * as well (some tags allowed to be unsigned short _or_ unsigned long)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
862 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
863 !(marker->format == EXIF_FORMAT_LONG_UNSIGNED && ent->format == EXIF_FORMAT_SHORT_UNSIGNED) )
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
864 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
865 if (ent->format <= EXIF_FORMAT_DOUBLE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
866 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
867 printf("warning: exif tag %s format mismatch, found %s exif spec requests %s\n",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
868 marker->key, ExifFormatList[ent->format].short_name, ExifFormatList[marker->format].short_name);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
869 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
870 else
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 printf("warning: exif tag %s format mismatch, found unknown id %d exif spec requests %d (%s)\n",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
873 marker->key, ent->format, marker->format, ExifFormatList[marker->format].short_name);
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 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
876 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
877 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
878
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
879 /* Where is the data, is it available?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
880 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
881 if (marker->components > 0 && marker->components != ent->nb)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
882 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
883 printf("warning: exif tag %s has %d elements, exif spec requests %d\n", marker->key, ent->nb, marker->components);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
884 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
885 data_len = ExifFormatList[marker->format].size * ent->nb;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
886 if (data_len > sizeof(ent->data))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
887 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
888 if (size < swabed_data+data_len)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
889 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
890 printf("warning: exif tag %s will overrun IFD segment, ignored.\n", marker->key);
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 data = (void*)tiff + swabed_data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
894 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
895 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
896 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
897 data = (void*)(&(ent->data));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
898 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
899
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
900 item = exif_item_new(marker->format, ent->tag, ent->nb, marker);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
901 exif_item_copy_data(item, data, data_len, ent->format, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
902 exif->items = g_list_prepend(exif->items, item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
903
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
904 if (item->tag == TAG_EXIFOFFSET)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
905 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
906 parse_IFD_table(exif, tiff, swabed_data, size, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
907 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
908
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
909 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
910 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
911
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
912 static int parse_IFD_table(ExifData *exif, unsigned char *tiff, int offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
913 int size, int byte_order)
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 int i, nb_entries;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
916
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
917 /* We should be able to read number of entries in IFD0) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
918 if (size < offset+2) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
919
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
920 nb_entries = get_int16(tiff+offset, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
921
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
922 /* Entries and next IFD offset must be readable */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
923 if (size < offset+nb_entries*12+4) return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
924
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
925 for (i=0; i<nb_entries; ++i)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
926 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
927 parse_IFD_entry(exif, tiff, offset+2+i*sizeof(IFDEntry), size, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
928 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
929
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
930 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
931 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
932
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
933 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
934 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
935 * file formats
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 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
938
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
939 static int parse_TIFF(ExifData *exif, unsigned char *tiff, int size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
940 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
941 int byte_order, offset=0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
942
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
943 if (size < sizeof(TIFFHeader))
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 -1;
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 if (strncmp(((TIFFHeader*)tiff)->byte_order, "II", 2) == 0)
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 byte_order = BYTE_ORDER_INTEL;
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 else if (strncmp(((TIFFHeader*)tiff)->byte_order, "MM", 2) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
953 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
954 byte_order = BYTE_ORDER_MOTOROLA;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
955 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
956 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
957 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
958 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
959 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
960
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
961 if (swab_int16(((TIFFHeader*)tiff)->magic, byte_order) != 0x002A)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
962 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
963 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
964 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
965
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
966 offset = swab_int32(((TIFFHeader*)tiff)->IFD_offset, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
967
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
968 return parse_IFD_table(exif, tiff, offset, size, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
969 }
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 static int parse_JPEG(ExifData *exif, unsigned char *f, int size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
972 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
973 int marker, marker_size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
974
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
975 if (size<2 || *f!=0xFF || *(f+1)!=MARKER_SOI)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
976 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
977 return -2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
978 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
979
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
980 do {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
981 if (goto_next_marker(&f, &size, &marker) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
982 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
983 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
984 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
985 } while (marker != MARKER_APP1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
986
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
987 if (marker != MARKER_APP1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
988 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
989 return -2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
990 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
991
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
992 marker_size = get_marker_size(f)-2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
993
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
994 if (marker_size<6 || strncmp((char*)f+4, "Exif\0\0", 6)!=0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
995 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
996 return -2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
997 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
998
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
999 return parse_TIFF(exif, f+10, marker_size-6);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1000 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1001
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1002 static gint map_file(const gchar *path, void **mapping, int *size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1003 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1004 int fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1005 struct stat fs;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1006
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1007 if ((fd = open(path, O_RDONLY)) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1008 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1009 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1010 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1011 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1012
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1013 if (fstat(fd, &fs) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1014 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1015 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1016 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1017 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1018 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1019
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1020 *size = fs.st_size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1021
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1022 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
1023 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1024 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1025 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1026 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1027 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1028
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1029 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1030 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1031 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1032
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1033 static gint unmap_file(void *mapping, int size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1034 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1035 if (munmap(mapping, size) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1036 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1037 perror("munmap");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1038 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1039 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1040
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1041 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1042 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1043
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1044 void exif_free(ExifData *exif)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1045 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1046 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1047
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1048 if (!exif) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1049
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1050 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1051 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1052 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1053 ExifItem *item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1054 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1055 exif_item_free(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1056 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1057
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1058 g_list_free(exif->items);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1059 g_free(exif);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1060 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1061
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1062 ExifData *exif_read(const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1063 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1064 ExifData *exif;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1065 void *f;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1066 int size, res;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1067 gchar *pathl;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1068
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1069 if (!path) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1070
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1071 pathl = path_from_utf8(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1072 if (map_file(pathl, &f, &size) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1073 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1074 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1075 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1076 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1077 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1078
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1079 exif = g_new0(ExifData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1080 exif->items = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1081
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1082 if ((res = parse_JPEG(exif, (unsigned char *)f, size)) == -2)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1083 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1084 res = parse_TIFF(exif, (unsigned char *)f, size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1085 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1086
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1087 if (res != 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1088 {
43
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1089 guint32 offset = 0;
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1090
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1091 if (format_raw_img_exif_offsets(-1, f, size, NULL, &offset))
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1092 {
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1093 res = parse_TIFF(exif, (unsigned char*)f + offset, size - offset);
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1094 }
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1095 }
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1096
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1097 if (res != 0)
ee03f36e9e4b Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net>
gqview
parents: 9
diff changeset
1098 {
9
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1099 exif_free(exif);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1100 exif = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1101 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1102
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1103 unmap_file(f, size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1104
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1105 if (exif) exif->items = g_list_reverse(exif->items);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1106
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1107 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1108 exif_write_data_list(exif, stdout, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1109 exif_write_data_list(exif, stdout, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1110 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1111
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1112 return exif;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1113 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1114
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1115 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1116 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1117 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1118
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1119 if (!key) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1120
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1121 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1122 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1123 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1124 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1125
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1126 item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1127 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1128 if (item->marker->key && strcmp(key, item->marker->key) == 0) return item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1129 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1130 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1131 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1132
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1133 gchar *exif_item_get_data_as_text(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1134 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1135 ExifMarker *marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1136 gpointer data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1137 GString *string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1138 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1139 gint ne;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1140 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1141
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1142 if (!item) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1143
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1144 marker = item->marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1145 if (!marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1146
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1147 data = item->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1148 ne = item->elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1149 string = g_string_new("");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1150 switch (item->format)
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 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1153 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1154 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1155 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1156 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1157 if (ne == 1 && marker->list)
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 gchar *result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1160 unsigned char val;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1161
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1162 if (item->format == EXIF_FORMAT_BYTE_UNSIGNED ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1163 item->format == EXIF_FORMAT_UNDEFINED)
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 val = ((unsigned char *)data)[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1166 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1167 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1168 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1169 val = (unsigned char)(((signed char *)data)[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1170 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1171
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1172 result = text_list_find_value(marker->list, (unsigned short)val);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1173 string = g_string_append(string, result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1174 g_free(result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1175 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1176 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1177 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1178 string = string_append_raw_bytes(string, data, ne);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1179 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1180 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1181 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1182 string = g_string_append(string, (gchar *)(item->data));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1183 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1184 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1185 if (ne == 1 && marker->list)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1186 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1187 gchar *result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1188
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1189 result = text_list_find_value(marker->list, ((unsigned short *)data)[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1190 string = g_string_append(string, result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1191 g_free(result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1192 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1193 else for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1194 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1195 g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1196 ((unsigned short *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1197 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1198 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1199 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1200 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1201 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1202 g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1203 ((unsigned long *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1204 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1205 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1206 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1207 for (i = 0; i < ne; i++)
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 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1210
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1211 r = &((ExifRational *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1212 g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1213 (unsigned long)r->num, (unsigned long)r->den);
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 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1216 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1217 for (i = 0; i < ne; i++)
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 g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1220 ((short *)data)[i]);
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 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1223 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1224 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1225 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1226 g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1227 ((long *)data)[i]);
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 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1230 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1231 for (i = 0; i < ne; i++)
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 ExifRational *r;
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 r = &((ExifRational *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1236 g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1237 (long)r->num, (long)r->den);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1238 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1239 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1240 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1241 for (i = 0; i < ne; i++)
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 g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1244 ((float *)data)[i]);
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 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1247 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1248 for (i = 0; i < ne; i++)
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 g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1251 ((double *)data)[i]);
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 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1254 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1255
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1256 text = g_strdup(string->str);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1257 g_string_free(string, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1258
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1259 return text;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1262 gint exif_item_get_integer(ExifItem *item, gint *value)
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 if (!item) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1265
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1266 switch (item->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1267 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1268 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1269 *value = (gint)(((short *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1270 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1271 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1272 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1273 *value = (gint)(((unsigned short *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1274 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1275 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1276 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1277 *value = (gint)(((long *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1278 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1279 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1280 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1281 /* FIXME: overflow possible */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1282 *value = (gint)(((unsigned long *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1283 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1284 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1285 /* all other type return FALSE */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1286 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1287 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1288 return FALSE;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1291 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1292 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1293 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1294
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1295 item = exif_get_item(exif, key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1296 return exif_item_get_integer(item, value);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1297 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1298
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1299 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1300 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1301 if (!item) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1302
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1303 if (item->format == EXIF_FORMAT_RATIONAL ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1304 item->format == EXIF_FORMAT_RATIONAL_UNSIGNED)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1305 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1306 if (sign) *sign = (item->format == EXIF_FORMAT_RATIONAL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1307 return &((ExifRational *)(item->data))[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1308 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1309
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1310 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1311 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1312
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1313 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1314 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1315 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1316
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1317 item = exif_get_item(exif, key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1318 return exif_item_get_rational(item, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1319 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1320
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1321 double exif_rational_to_double(ExifRational *r, gint sign)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1322 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1323 if (!r || r->den == 0.0) return 0.0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1324
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1325 if (sign) return (double)((int)r->num) / (double)((int)r->den);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1326 return (double)r->num / r->den;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1327 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1328
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1329 static double exif_get_rational_as_double(ExifData *exif, const gchar *key)
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 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1332 gint sign;
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 r = exif_get_rational(exif, key, &sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1335 return exif_rational_to_double(r, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1336 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1337
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1338 static GString *append_comma_text(GString *string, const gchar *text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1339 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1340 string = g_string_append(string, ", ");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1341 string = g_string_append(string, text);
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 return string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1344 }
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 static gchar *exif_get_formatted_by_key(ExifData *exif, const gchar *key, gint *key_valid)
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 /* must begin with f, else not formatted */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1349 if (key[0] != 'f')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1350 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1351 if (key_valid) *key_valid = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1352 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1353 }
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 if (key_valid) *key_valid = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1356
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1357 if (strcmp(key, "fCamera") == 0)
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 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1360 gchar *make = exif_get_data_as_text(exif, "Make");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1361 gchar *model = exif_get_data_as_text(exif, "Model");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1362 gchar *software = exif_get_data_as_text(exif, "Software");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1363
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1364 text = g_strdup_printf("%s%s%s%s%s%s", (make) ? make : "", ((make) && (model)) ? " " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1365 (model) ? model : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1366 (software) ? " (" : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1367 (software) ? software : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1368 (software) ? ")" : "");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1369
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1370 g_free(make);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1371 g_free(model);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1372 g_free(software);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1373 return text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1374 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1375 if (strcmp(key, "fDateTime") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1376 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1377 gchar *text = exif_get_data_as_text(exif, "DateTimeOriginal");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1378 gchar *subsec = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1379 if (text) subsec = exif_get_data_as_text(exif, "SubsecTimeOriginal");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1380 if (!text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1381 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1382 text = exif_get_data_as_text(exif, "DateTime");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1383 if (text) subsec = exif_get_data_as_text(exif, "SubsecTime");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1384 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1385 if (subsec)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1386 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1387 gchar *tmp = text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1388 text = g_strconcat(tmp, ".", subsec, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1389 g_free(tmp);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1390 g_free(subsec);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1391 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1392 return text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1393 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1394 if (strcmp(key, "fShutterSpeed") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1395 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1396 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1397
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1398 r = exif_get_rational(exif, "ExposureTime", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1399 if (r && r->num && r->den)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1400 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1401 double n = (double)r->den / (double)r->num;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1402 return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1403 n > 1.0 ? n : 1.0 / n);
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 r = exif_get_rational(exif, "ShutterSpeedValue", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1406 if (r && r->num && r->den)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1407 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1408 double n = pow(2.0, exif_rational_to_double(r, TRUE));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1409
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1410 /* Correct exposure time to avoid values like 1/91s (seen on Minolta DImage 7) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1411 if (n > 1.0 && (int)n - ((int)(n/10))*10 == 1) n--;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1412
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1413 return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1414 n > 1.0 ? floor(n) : 1.0 / n);
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 return NULL;
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 if (strcmp(key, "fAperture") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1419 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1420 double n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1421
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1422 n = exif_get_rational_as_double(exif, "FNumber");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1423 if (n == 0.0) n = exif_get_rational_as_double(exif, "ApertureValue");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1424 if (n == 0.0) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1425
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1426 return g_strdup_printf("f/%.1f", n);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1427 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1428 if (strcmp(key, "fExposureBias") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1429 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1430 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1431 gint sign;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1432 double n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1433
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1434 r = exif_get_rational(exif, "ExposureBiasValue", &sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1435 if (!r) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1436
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1437 n = exif_rational_to_double(r, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1438 return g_strdup_printf("%+.1f", n);
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 if (strcmp(key, "fFocalLength") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1441 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1442 double n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1443
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1444 n = exif_get_rational_as_double(exif, "FocalLength");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1445 if (n == 0.0) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1446 return g_strdup_printf("%.2f mm", n);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1447 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1448 if (strcmp(key, "fISOSpeedRating") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1449 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1450 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1451
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1452 text = exif_get_data_as_text(exif, "ISOSpeedRatings");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1453 /* kodak may set this instead */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1454 if (!text) text = exif_get_data_as_text(exif, "ExposureIndex");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1455 return text;
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 if (strcmp(key, "fSubjectDistance") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1458 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1459 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1460 gint sign;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1461 double n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1462
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1463 r = exif_get_rational(exif, "SubjectDistance", &sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1464 if (!r) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1465
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1466 if ((long)r->num == 0xffffffff) return g_strdup(_("infinity"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1467 if ((long)r->num == 0) return g_strdup(_("unknown"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1468
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1469 n = exif_rational_to_double(r, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1470 if (n == 0.0) return _("unknown");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1471 return g_strdup_printf("%.3f m", n);
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 if (strcmp(key, "fFlash") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1474 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1475 /* grr, flash is a bitmask... */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1476 GString *string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1477 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1478 gint n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1479 gint v;
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 if (!exif_get_integer(exif, "Flash", &n)) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1482
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1483 /* Exif 2.1 only defines first 3 bits */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1484 if (n <= 0x07) return g_strdup(text_list_find_value(ExifFlashList, n));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1485
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1486 /* must be Exif 2.2 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1487 string = g_string_new("");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1488
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1489 /* flash fired (bit 0) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1490 string = g_string_append(string, (n & 0x01) ? _("yes") : _("no"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1491
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1492 /* flash mode (bits 3, 4) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1493 v = (n >> 3) & 0x03;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1494 if (v) string = append_comma_text(string, _("mode:"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1495 switch (v)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1496 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1497 case 1:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1498 string = g_string_append(string, _("on"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1499 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1500 case 2:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1501 string = g_string_append(string, _("off"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1502 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1503 case 3:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1504 string = g_string_append(string, _("auto"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1505 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1506 }
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 /* return light (bits 1, 2) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1509 v = (n >> 1) & 0x03;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1510 if (v == 2) string = append_comma_text(string, _("not detected by strobe"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1511 if (v == 3) string = append_comma_text(string, _("detected by strobe"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1512
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1513 /* we ignore flash function (bit 5) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1514
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1515 /* red-eye (bit 6) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1516 if ((n >> 5) & 0x01) string = append_comma_text(string, _("red-eye reduction"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1517
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1518 text = string->str;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1519 g_string_free(string, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1520 return text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1521 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1522 if (strcmp(key, "fResolution") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1523 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1524 ExifRational *rx, *ry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1525 gchar *units;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1526 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1527
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1528 rx = exif_get_rational(exif, "XResolution", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1529 ry = exif_get_rational(exif, "YResolution", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1530 if (!rx || !ry) return NULL;
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 units = exif_get_data_as_text(exif, "ResolutionUnit");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1533 text = g_strdup_printf("%0.f x %0.f (%s/%s)", rx->den ? (double)rx->num / rx->den : 1.0,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1534 ry->den ? (double)ry->num / ry->den : 1.0,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1535 _("dot"), (units) ? units : _("unknown"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1536
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1537 g_free(units);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1538 return text;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1541 if (key_valid) *key_valid = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1542 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1543 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1544
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1545 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key)
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 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1548 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1549 gint key_valid;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1550
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1551 if (!key) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1552
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1553 text = exif_get_formatted_by_key(exif, key, &key_valid);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1554 if (key_valid) return text;
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 item = exif_get_item(exif, key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1557 if (item) return exif_item_get_data_as_text(item);
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 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1560 }
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 const gchar *exif_get_description_by_key(const gchar *key)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1563 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1564 gint i;
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 if (!key) return NULL;
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 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1569 while (ExifFormattedList[i].key != NULL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1570 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1571 if (strcmp(key, ExifFormattedList[i].key) == 0) return _(ExifFormattedList[i].description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1572 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1573 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1574
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1575 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1576 while (ExifKnownMarkersList[i].tag > 0)
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 if (strcmp(key, ExifKnownMarkersList[i].key) == 0) return _(ExifKnownMarkersList[i].description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1579 i++;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1582 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1583 }
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 static void exif_write_item(FILE *f, ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1586 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1587 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1588
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1589 text = exif_item_get_data_as_text(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1590 if (text)
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 fprintf(f, "%4x %9s %30s %s\n", item->tag, ExifFormatList[item->format].short_name,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1593 exif_item_get_tag_name(item), text);
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 g_free(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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1598 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
1599 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1600 if (!f || !exif) return;
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 fprintf(f, " tag format key value\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1603 fprintf(f, "----------------------------------------------------\n");
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 if (human_readable_list)
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 gint i;
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 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1610 while (ExifFormattedList[i].key)
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 gchar *text;
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 text = exif_get_formatted_by_key(exif, ExifFormattedList[i].key, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1615 if (text)
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 fprintf(f, " %9s %30s %s\n", "string", ExifFormattedList[i].key, text);
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 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1620 }
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 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1623 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1624 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1625
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1626 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1627 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1628 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1629 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1630
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1631 item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1632 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1633
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1634 exif_write_item(f, item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1635 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1636 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1637 fprintf(f, "----------------------------------------------------\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1638 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1639