annotate src/exif.c @ 9:d907d608745f

Sync to GQview 1.5.9 release. ######## DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS! This CVS is never up to date with current development and is provided solely for reference purposes, please use the latest official release package when making any changes or translation updates. ########
author gqview
date Sat, 26 Feb 2005 00:13:35 +0000
parents
children ee03f36e9e4b
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
73 #include "ui_fileops.h"
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
74
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 * Tag formats
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
79 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
80 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
81
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
82 ExifFormatAttrib ExifFormatList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
83 { EXIF_FORMAT_UNKNOWN, 1, "unknown", "unknown" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
84 { EXIF_FORMAT_BYTE_UNSIGNED, 1, "ubyte", "unsigned byte" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
85 { EXIF_FORMAT_STRING, 1, "string", "string" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
86 { EXIF_FORMAT_SHORT_UNSIGNED, 2, "ushort", "unsigned short" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
87 { EXIF_FORMAT_LONG_UNSIGNED, 4, "ulong", "unsigned long" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
88 { EXIF_FORMAT_RATIONAL_UNSIGNED,8, "urational", "unsigned rational" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
89 { EXIF_FORMAT_BYTE, 1, "byte", "byte" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
90 { EXIF_FORMAT_UNDEFINED, 1, "undefined", "undefined" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
91 { EXIF_FORMAT_SHORT, 2, "sshort", "signed short" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
92 { EXIF_FORMAT_LONG, 4, "slong", "signed long" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
93 { EXIF_FORMAT_RATIONAL, 8, "srational", "signed rational" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
94 { EXIF_FORMAT_FLOAT, 4, "float", "float" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
95 { EXIF_FORMAT_DOUBLE, 8, "double", "double" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
96 { -1, 0, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
97 };
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 /* tags that are special, or need special treatment */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
100 #define TAG_EXIFOFFSET 0x8769
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
101
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
102
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 * Data
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
106 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
107 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
108
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
109 #define EXIF_TEXT_LIST_END { -1, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
110
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
111 static ExifTextList ExifOrientationList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
112 { EXIF_ORIENTATION_UNKNOWN, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
113 { EXIF_ORIENTATION_TOP_LEFT, N_("top left") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
114 { EXIF_ORIENTATION_TOP_RIGHT, N_("top right") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
115 { EXIF_ORIENTATION_BOTTOM_RIGHT,N_("bottom right") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
116 { EXIF_ORIENTATION_BOTTOM_LEFT, N_("bottom left") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
117 { EXIF_ORIENTATION_LEFT_TOP, N_("left top") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
118 { EXIF_ORIENTATION_RIGHT_TOP, N_("right top") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
119 { EXIF_ORIENTATION_RIGHT_BOTTOM,N_("right bottom") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
120 { EXIF_ORIENTATION_LEFT_BOTTOM, N_("left bottom") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
121 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
122 };
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 static ExifTextList ExifUnitList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
125 { EXIF_UNIT_UNKNOWN, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
126 { EXIF_UNIT_NOUNIT, "" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
127 { EXIF_UNIT_INCH, N_("inch") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
128 { EXIF_UNIT_CENTIMETER, N_("centimeter") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
129 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
130 };
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 static ExifTextList ExifYCbCrPosList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
133 { 1, "center" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
134 { 2, "datum" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
135 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
136 };
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 static ExifTextList ExifMeteringModeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
139 { 0, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
140 { 1, N_("average") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
141 { 2, N_("center weighted") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
142 { 3, N_("spot") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
143 { 4, N_("multi-spot") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
144 { 5, N_("multi-segment") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
145 { 6, N_("partial") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
146 { 255, N_("other") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
147 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
148 };
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 static ExifTextList ExifExposureProgramList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
151 { 0, N_("not defined") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
152 { 1, N_("manual") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
153 { 2, N_("normal") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
154 { 3, N_("aperture") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
155 { 4, N_("shutter") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
156 { 5, N_("creative") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
157 { 6, N_("action") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
158 { 7, N_("portrait") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
159 { 8, N_("landscape") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
160 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
161 };
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 static ExifTextList ExifLightSourceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
164 { 0, N_("unknown") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
165 { 1, N_("daylight") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
166 { 2, N_("fluorescent") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
167 { 3, N_("tungsten (incandescent)") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
168 { 4, N_("flash") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
169 { 9, "fine weather" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
170 { 10, "cloudy weather" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
171 { 11, "shade" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
172 { 12, "daylight fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
173 { 13, "day white fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
174 { 14, "cool white fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
175 { 15, "while fluorescent" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
176 { 17, "standard light A" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
177 { 18, "standard light B" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
178 { 19, "standard light C" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
179 { 20, "D55" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
180 { 21, "D65" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
181 { 22, "D75" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
182 { 23, "D50" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
183 { 24, "ISO studio tungsten" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
184 { 255, N_("other") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
185 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
186 };
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 static ExifTextList ExifFlashList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
189 { 0, N_("no") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
190 { 1, N_("yes") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
191 { 5, N_("yes, not detected by strobe") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
192 { 7, N_("yes, detected by strobe") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
193 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
194 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
195
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
196 static ExifTextList ExifColorSpaceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
197 { 1, "sRGB" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
198 { 65535,"uncalibrated" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
199 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
200 };
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 static ExifTextList ExifSensorList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
203 { 1, "not defined" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
204 { 2, "1 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
205 { 2, "2 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
206 { 4, "3 chip color area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
207 { 5, "color sequential area" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
208 { 7, "trilinear" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
209 { 8, "color sequential linear" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
210 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
211 };
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 static ExifTextList ExifSourceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
214 { 3, "digital still camera" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
215 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
216 };
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 static ExifTextList ExifSceneList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
219 { 1, "direct photo" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
220 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
221 };
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 static ExifTextList ExifCustRenderList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
224 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
225 { 1, "custom" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
226 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
227 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
228
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
229 static ExifTextList ExifExposureModeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
230 { 0, "auto" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
231 { 1, "manual" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
232 { 2, "auto bracket" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
233 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
234 };
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 static ExifTextList ExifWhiteBalanceList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
237 { 0, "auto" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
238 { 1, "manual" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
239 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
240 };
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 static ExifTextList ExifSceneCaptureList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
243 { 0, "standard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
244 { 1, "landscape" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
245 { 2, "portrait" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
246 { 3, "night scene" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
247 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
248 };
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
249
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
250 static ExifTextList ExifGainControlList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
251 { 0, "none" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
252 { 1, "low gain up" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
253 { 2, "high gain up" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
254 { 3, "low gain down" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
255 { 4, "high gain down" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
256 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
257 };
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 static ExifTextList ExifContrastList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
260 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
261 { 1, "soft" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
262 { 2, "hard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
263 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
264 };
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 static ExifTextList ExifSaturationList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
267 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
268 { 1, "low" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
269 { 2, "high" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
270 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
271 };
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 static ExifTextList ExifSharpnessList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
274 { 0, "normal" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
275 { 1, "soft" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
276 { 2, "hard" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
277 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
278 };
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 static ExifTextList ExifSubjectRangeList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
281 { 0, "unknown" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
282 { 1, "macro" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
283 { 2, "close" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
284 { 3, "distant" },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
285 EXIF_TEXT_LIST_END
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
286 };
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 ExifMarker ExifKnownMarkersList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
289 { 0x010e, EXIF_FORMAT_STRING, -1, "ImageDescription", N_("Image description"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
290 { 0x010f, EXIF_FORMAT_STRING, -1, "Make", "Camera make", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
291 { 0x0110, EXIF_FORMAT_STRING, -1, "Model", "Camera model", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
292 { 0x0112, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Orientation", N_("Orientation"), ExifOrientationList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
293 { 0x011a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "XResolution", "X resolution", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
294 { 0x011b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "YResolution", "Y Resolution", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
295 { 0x0128, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ResolutionUnit", "Resolution units", ExifUnitList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
296 { 0x0131, EXIF_FORMAT_STRING, -1, "Software", "Firmware", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
297 { 0x0132, EXIF_FORMAT_STRING, 20, "DateTime", N_("Date"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
298 { 0x013e, EXIF_FORMAT_RATIONAL_UNSIGNED, 2, "WhitePoint", "White point", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
299 { 0x013f, EXIF_FORMAT_RATIONAL_UNSIGNED, 6, "PrimaryChromaticities","Primary chromaticities", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
300 { 0x0211, EXIF_FORMAT_RATIONAL_UNSIGNED, 3, "YCbCrCoefficients", "YCbCy coefficients", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
301 { 0x0213, EXIF_FORMAT_SHORT_UNSIGNED, 1, "YCbCrPositioning", "YCbCr positioning", ExifYCbCrPosList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
302 { 0x0214, EXIF_FORMAT_RATIONAL_UNSIGNED, 6, "ReferenceBlackWhite", "Black white reference", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
303 { 0x8298, EXIF_FORMAT_STRING, -1, "Copyright", N_("Copyright"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
304 { 0x8769, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifOffset", "SubIFD Exif offset", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
305 /* subIFD follows */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
306 { 0x829a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ExposureTime", "Exposure time (seconds)", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
307 { 0x829d, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FNumber", "FNumber", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
308 { 0x8822, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ExposureProgram", N_("Exposure program"), ExifExposureProgramList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
309 { 0x8824, EXIF_FORMAT_STRING, -1, "SpectralSensitivity", "Spectral Sensitivity", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
310 { 0x8827, EXIF_FORMAT_SHORT_UNSIGNED, -1, "ISOSpeedRatings", N_("ISO sensitivity"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
311 { 0x8828, EXIF_FORMAT_UNDEFINED, -1, "OECF", "Optoelectric conversion factor", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
312 { 0x9000, EXIF_FORMAT_UNDEFINED, 4, "ExifVersion", "Exif version", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
313 { 0x9003, EXIF_FORMAT_STRING, 20, "DateTimeOriginal", N_("Date original"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
314 { 0x9004, EXIF_FORMAT_STRING, 20, "DateTimeDigitized", N_("Date digitized"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
315 { 0x9101, EXIF_FORMAT_UNDEFINED, -1, "ComponentsConfiguration","Pixel format", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
316 { 0x9102, EXIF_FORMAT_RATIONAL_UNSIGNED,1, "CompressedBitsPerPixel","Compression ratio", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
317 { 0x9201, EXIF_FORMAT_RATIONAL, 1, "ShutterSpeedValue", N_("Shutter speed"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
318 { 0x9202, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ApertureValue", N_("Aperture"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
319 { 0x9203, EXIF_FORMAT_RATIONAL, 1, "BrightnessValue", "Brightness", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
320 { 0x9204, EXIF_FORMAT_RATIONAL, 1, "ExposureBiasValue", N_("Exposure bias"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
321 { 0x9205, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "MaxApertureValue", "Maximum aperture", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
322 { 0x9206, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "SubjectDistance", N_("Subject distance"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
323 { 0x9207, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MeteringMode", N_("Metering mode"), ExifMeteringModeList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
324 { 0x9208, EXIF_FORMAT_SHORT_UNSIGNED, 1, "LightSource", N_("Light source"), ExifLightSourceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
325 { 0x9209, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Flash", N_("Flash"), ExifFlashList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
326 { 0x920a, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FocalLength", N_("Focal length"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
327 { 0x9214, EXIF_FORMAT_SHORT_UNSIGNED, -1, "SubjectArea", "Subject area", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
328 { 0x927c, EXIF_FORMAT_UNDEFINED, -1, "MakerNote", "MakerNote", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
329 { 0x9286, EXIF_FORMAT_UNDEFINED, -1, "UserComment", "UserComment", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
330 { 0x9290, EXIF_FORMAT_STRING, -1, "SubsecTime", "Subsecond time", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
331 { 0x9291, EXIF_FORMAT_STRING, -1, "SubsecTimeOriginal", "Subsecond time original", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
332 { 0x9292, EXIF_FORMAT_STRING, -1, "SubsecTimeDigitized", "Subsecond time digitized", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
333 { 0xa000, EXIF_FORMAT_UNDEFINED, 4, "FlashPixVersion", "FlashPix version", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
334 { 0xa001, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ColorSpace", "Colorspace", ExifColorSpaceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
335 /* ExifImageWidth, ExifImageHeight can also be unsigned short */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
336 { 0xa002, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifImageWidth", N_("Width"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
337 { 0xa003, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifImageHeight", N_("Height"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
338 { 0xa004, EXIF_FORMAT_STRING, -1, "RelatedSoundFile", "Audio data", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
339 { 0xa005, EXIF_FORMAT_LONG_UNSIGNED, 1, "ExifInteroperabilityOffset", "ExifR98 extension", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
340 { 0xa20b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FlashEnergy", "Flash strength", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
341 { 0xa20c, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SpatialFrequencyResponse","Spatial frequency response", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
342 { 0xa20e, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FocalPlaneXResolution", "X Pixel density", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
343 { 0xa20f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FocalPlaneYResolution", "Y Pixel density", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
344 { 0xa210, EXIF_FORMAT_SHORT_UNSIGNED, 1, "FocalPlaneResolutionUnit", "Pixel density units", ExifUnitList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
345 { 0x0214, EXIF_FORMAT_SHORT_UNSIGNED, 2, "SubjectLocation", "Subject location", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
346 { 0xa215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ExposureIndex", N_("ISO sensitivity"), NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
347 { 0xa217, EXIF_FORMAT_SHORT_UNSIGNED, -1, "SensingMethod", "Sensor type", ExifSensorList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
348 { 0xa300, EXIF_FORMAT_UNDEFINED, 1, "FileSource", "Source type", ExifSourceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
349 { 0xa301, EXIF_FORMAT_UNDEFINED, 1, "SceneType", "Scene type", ExifSceneList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
350 { 0xa302, EXIF_FORMAT_UNDEFINED, -1, "CFAPattern", "Color filter array pattern", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
351 /* 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
352 { 0xa401, EXIF_FORMAT_SHORT_UNSIGNED, 1, "CustomRendered", "Render process", ExifCustRenderList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
353 { 0xa402, EXIF_FORMAT_SHORT_UNSIGNED, 1, "ExposureMode", "Exposure mode", ExifExposureModeList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
354 { 0xa403, EXIF_FORMAT_SHORT_UNSIGNED, 1, "WhiteBalance", "White balance", ExifWhiteBalanceList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
355 { 0xa404, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "DigitalZoomRatio", "Digital zoom ratio", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
356 { 0xa405, EXIF_FORMAT_SHORT_UNSIGNED, 1, "FocalLength35mmFilm", "Focal length (35mm)", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
357 { 0xa406, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SceneCapturetype", "Scene capture type", ExifSceneCaptureList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
358 { 0xa407, EXIF_FORMAT_SHORT_UNSIGNED, 1, "GainControl", "Gain control", ExifGainControlList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
359 { 0xa408, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Contrast", "Contrast", ExifContrastList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
360 { 0xa409, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Saturation", "Saturation", ExifSaturationList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
361 { 0xa40a, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Sharpness", "Sharpness", ExifSharpnessList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
362 { 0xa40b, EXIF_FORMAT_UNDEFINED, -1, "DeviceSettingDescription","Device setting", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
363 { 0xa40c, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SubjectDistanceRange", "Subject range", ExifSubjectRangeList },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
364 { 0xa420, EXIF_FORMAT_STRING, -1, "ImageUniqueID", "Image serial number", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
365 /* place known, but undocumented or lesser used tags here */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
366 { 0x00fe, EXIF_FORMAT_LONG_UNSIGNED, 1, "NewSubfileType", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
367 { 0x00ff, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SubfileType", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
368 { 0x012d, EXIF_FORMAT_SHORT_UNSIGNED, 3, "TransferFunction", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
369 { 0x013b, EXIF_FORMAT_STRING, -1, "Artist", "Artist", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
370 { 0x013d, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Predictor", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
371 { 0x0142, EXIF_FORMAT_SHORT_UNSIGNED, 1, "TileWidth", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
372 { 0x0143, EXIF_FORMAT_SHORT_UNSIGNED, 1, "TileLength", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
373 { 0x0144, EXIF_FORMAT_LONG_UNSIGNED, -1, "TileOffsets", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
374 { 0x0145, EXIF_FORMAT_SHORT_UNSIGNED, -1, "TileByteCounts", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
375 { 0x014a, EXIF_FORMAT_LONG_UNSIGNED, -1, "SubIFDs", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
376 { 0x015b, EXIF_FORMAT_UNDEFINED, -1, "JPEGTables", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
377 { 0x828d, EXIF_FORMAT_SHORT_UNSIGNED, 2, "CFARepeatPatternDim", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
378 { 0x828e, EXIF_FORMAT_BYTE_UNSIGNED, -1, "CFAPattern", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
379 { 0x828f, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "BatteryLevel", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
380 { 0x83bb, EXIF_FORMAT_LONG_UNSIGNED, -1, "IPTC/NAA", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
381 { 0x8773, EXIF_FORMAT_UNDEFINED, -1, "InterColorProfile", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
382 { 0x8825, EXIF_FORMAT_LONG_UNSIGNED, 1, "GPSInfo", "SubIFD GPS offset", NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
383 { 0x8829, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Interlace", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
384 { 0x882a, EXIF_FORMAT_SHORT, 1, "TimeZoneOffset", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
385 { 0x882b, EXIF_FORMAT_SHORT_UNSIGNED, 1, "SelfTimerMode", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
386 { 0x920b, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "FlashEnergy", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
387 { 0x920c, EXIF_FORMAT_UNDEFINED, -1, "SpatialFrequencyResponse", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
388 { 0x920d, EXIF_FORMAT_UNDEFINED, -1, "Noise", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
389 { 0x9211, EXIF_FORMAT_LONG_UNSIGNED, 1, "ImageNumber", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
390 { 0x9212, EXIF_FORMAT_STRING, 1, "SecurityClassification", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
391 { 0x9213, EXIF_FORMAT_STRING, -1, "ImageHistory", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
392 { 0x9215, EXIF_FORMAT_RATIONAL_UNSIGNED, 1, "ExposureIndex", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
393 { 0x9216, EXIF_FORMAT_BYTE_UNSIGNED, 4, "TIFF/EPStandardID", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
394
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
395 /* end is marked by 0 tag */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
396 { 0x0000, EXIF_FORMAT_UNKNOWN, 0, NULL, NULL, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
397 };
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 ExifMarker ExifUnknownMarkersList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
400 { 0x0000, EXIF_FORMAT_UNKNOWN, 0, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
401 { 0x0000, EXIF_FORMAT_BYTE_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
402 { 0x0000, EXIF_FORMAT_STRING, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
403 { 0x0000, EXIF_FORMAT_SHORT_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
404 { 0x0000, EXIF_FORMAT_LONG_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
405 { 0x0000, EXIF_FORMAT_RATIONAL_UNSIGNED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
406 { 0x0000, EXIF_FORMAT_BYTE, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
407 { 0x0000, EXIF_FORMAT_UNDEFINED, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
408 { 0x0000, EXIF_FORMAT_SHORT, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
409 { 0x0000, EXIF_FORMAT_LONG, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
410 { 0x0000, EXIF_FORMAT_RATIONAL, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
411 { 0x0000, EXIF_FORMAT_FLOAT, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
412 { 0x0000, EXIF_FORMAT_DOUBLE, -1, "unknown", NULL, NULL },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
413 };
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 /* human readable key list */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
416
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
417 ExifFormattedText ExifFormattedList[] = {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
418 { "fCamera", N_("Camera") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
419 { "fDateTime", N_("Date") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
420 { "fShutterSpeed", N_("Shutter speed") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
421 { "fAperture", N_("Aperture") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
422 { "fExposureBias", N_("Exposure bias") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
423 { "fISOSpeedRating", N_("ISO sensitivity") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
424 { "fFocalLength", N_("Focal length") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
425 { "fSubjectDistance", N_("Subject distance") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
426 { "fFlash", N_("Flash") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
427 { "fResolution", N_("Resolution") },
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
428 { NULL, NULL }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
429 };
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 * misc
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
435 *-----------------------------------------------------------------------------
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 #define BYTE_ORDER_INTEL 1
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
439 #define BYTE_ORDER_MOTOROLA 2
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
440
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
441 #define MARKER_UNKNOWN 0x00
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
442 #define MARKER_SOI 0xD8
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
443 #define MARKER_APP1 0xE1
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
444
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
445 typedef struct {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
446 char byte_order[2];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
447 uint16_t magic;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
448 uint32_t IFD_offset;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
449 } TIFFHeader;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
450
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
451 typedef struct {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
452 uint16_t tag;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
453 uint16_t format;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
454 uint32_t nb;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
455 uint32_t data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
456 } IFDEntry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
457
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
458
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
459 static ExifMarker *exif_marker_from_tag(uint16_t tag);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
460 static int parse_IFD_table(ExifData *exif, unsigned char *tiff, int offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
461 int size, int byte_order);
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 *-----------------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
465 * ExifItem
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
466 *-----------------------------------------------------------------------------
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 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
470 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
471 ExifItem *item;
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 item = g_new0(ExifItem, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
474 item->format = format;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
475 item->tag = tag;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
476 item->marker = marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
477 item->elements = elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
478 item->data = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
479 item->data_len = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
480
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
481 switch (format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
482 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
483 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
484 /* unknown, data is NULL */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
485 return item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
486 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
487 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
488 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
489 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
490 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
491 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
492 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
493 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
494 item->data_len = sizeof(unsigned short int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
495 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
496 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
497 item->data_len = sizeof(unsigned long int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
498 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
499 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
500 item->data_len = sizeof(ExifRational) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
501 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
502 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
503 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
504 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
505 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
506 item->data_len = sizeof(char) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
507 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
508 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
509 item->data_len = sizeof(short int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
510 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
511 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
512 item->data_len = sizeof(long int) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
513 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
514 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
515 item->data_len = sizeof(ExifRational) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
516 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
517 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
518 item->data_len = sizeof(float) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
519 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
520 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
521 item->data_len = sizeof(double) * elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
522 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
523 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
524
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
525 item->data = g_malloc0(item->data_len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
526
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
527 return item;
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 static void exif_item_free(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
531 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
532 if (!item) return;
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 g_free(item->data);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
535 g_free(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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
538 const char *exif_item_get_tag_name(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
539 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
540 if (!item || !item->marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
541 return item->marker->key;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
544 const char *exif_item_get_description(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
545 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
546 if (!item || !item->marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
547 return _(item->marker->description);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
550 const char *exif_item_get_format_name(ExifItem *item, gint brief)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
551 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
552 if (!item || !item->marker) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
553 return (brief) ? ExifFormatList[item->format].short_name : ExifFormatList[item->format].description;
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
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 #define UNDEFINED_TEXT_BYTE_COUNT 16
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
558
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
559 static GString *string_append_raw_bytes(GString *string, gpointer data, gint ne)
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 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
562
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
563 for (i = 0 ; i < ne && i < UNDEFINED_TEXT_BYTE_COUNT; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
564 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
565 unsigned char c = ((char *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
566 if (c < 32 || c > 127) c = '.';
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
567 g_string_append_printf(string, "%c", c);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
568 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
569 string = g_string_append(string, " : ");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
570 for (i = 0 ; i < ne && i < UNDEFINED_TEXT_BYTE_COUNT; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
571 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
572 const gchar *spacer;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
573 if (i > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
574 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
575 if (i%8 == 0)
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 spacer = " - ";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
578 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
579 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
580 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
581 spacer = " ";
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
582 }
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 g_string_append_printf(string, "%s%02x", spacer, ((char *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
589 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
590 if (i >= UNDEFINED_TEXT_BYTE_COUNT) g_string_append_printf(string, " (%d bytes)", ne);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
591
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
592 return string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
593 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
594
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
595 static gchar *text_list_find_value(ExifTextList *list, gint value)
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 gchar *result = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
598 gint i;
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 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
601 while (!result && list[i].value >= 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
602 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
603 if (value == list[i].value) result = g_strdup(_(list[i].description));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
604 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
605 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
606 if (!result) result = g_strdup_printf("%d (%s)", value, _("unknown"));
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 return result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
609 }
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 /*
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 * byte size utils
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 static uint16_t get_int16(unsigned char *f, int bo)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
618 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
619 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
620 return *f + (*(f+1)<<8);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
621 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
622 return ((*f)<<8) + *(f+1);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
625 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
626 /* not used ? */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
627 static uint32_t get_int32(unsigned char *f, int bo)
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 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
630 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
631 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
632 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
633 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
634 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
635
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
636 static uint16_t swab_int16(uint16_t n, int bo)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
637 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
638 #if BYTE_ORDER == LITTLE_ENDIAN
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
639 if (bo == BYTE_ORDER_MOTOROLA)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
640 #else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
641 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
642 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
643 return n>>8 | n<<8 ;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
644 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
645 return n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
646 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
647
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
648 static uint32_t swab_int32(uint32_t n, int bo)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
649 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
650 #if BYTE_ORDER == LITTLE_ENDIAN
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
651 if (bo == BYTE_ORDER_MOTOROLA)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
652 #else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
653 if (bo == BYTE_ORDER_INTEL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
654 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
655 return n<<24 | n>>24 | (n & 0xFF0000)>>8 | (n & 0xFF00)<<8;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
656 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
657 return n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
658 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
659
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
660 /*
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
661 *-------------------------------------------------------------------
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
662 * marker utils
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 static int get_marker_size(unsigned char *f)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
667 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
668 /* Size is always in Motorola byte order */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
669 return get_int16(f+2, BYTE_ORDER_MOTOROLA);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
672 static int goto_next_marker(unsigned char **f, int *size, int *marker)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
673 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
674 int marker_size = 2;
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 *marker = MARKER_UNKNOWN;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
677
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
678 /* 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
679 * the SOI and this function guaranties the whole next marker is
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
680 * available
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
681 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
682 if (*(*f+1) != MARKER_SOI)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
683 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
684 marker_size += get_marker_size(*f);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
685 }
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 *size -= marker_size;
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 /* 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
690 * and check data are actually available
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 if (*size < 4) return -1;
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 /* Jump to the next marker and be sure it begins with 0xFF
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
695 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
696 *f += marker_size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
697 if (**f != 0xFF) 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 if (get_marker_size(*f)+2 > *size) return -1;
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 *marker = *(*f+1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
702
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
703 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
704 }
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 /*
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 * IFD utils
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 static ExifMarker *exif_marker_from_tag(uint16_t tag)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
713 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
714 static int len = sizeof(ExifKnownMarkersList)/sizeof(ExifMarker) - 1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
715 int i = 0;
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 while (i < len && ExifKnownMarkersList[i].tag != 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 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
720 }
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 return (i >= len ? NULL : &ExifKnownMarkersList[i]);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
725 static void rational_from_data(ExifRational *r, void *src, int byte_order)
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 r->num = swab_int32(*(uint32_t*)src, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
728 r->den = swab_int32(*(uint32_t*)(src + sizeof(uint32_t)), byte_order);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
731 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
732 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
733 int bs;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
734 int ne;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
735 gpointer dest;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
736 int i;
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 bs = ExifFormatList[item->format].size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
739 ne = item->elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
740 dest = item->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
741
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
742 if (!dest || len > item->data_len)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
743 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
744 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
745 return;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
748 switch (item->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
749 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
750 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
751 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
752 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
753 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
754 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
755 memcpy(dest, src, len);
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_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
758 memcpy(dest, src, len);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
759 /* string is NULL terminated, make sure this is true */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
760 if (((char *)dest)[len - 1] != '\0') ((char *)dest)[len - 1] = '\0';
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_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
763 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
764 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
765 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
766 ((short *)dest)[i] = swab_int16(*(uint16_t*)(src + i * bs), byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
767 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
768 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
769 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
770 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
771 if (src_format == EXIF_FORMAT_SHORT_UNSIGNED ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
772 src_format == EXIF_FORMAT_SHORT)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
773 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
774 /* a short fits into a long, so allow it */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
775 int ss;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
776
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
777 ss = ExifFormatList[src_format].size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
778 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
779 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
780 ((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
781 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
782 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
783 else
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 for (i = 0; i < ne; i++)
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 ((long *)dest)[i] = swab_int32(*(uint32_t*)(src + i * bs), byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
788 }
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 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
791 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
792 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
793 for (i = 0; i < ne; i++)
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 rational_from_data(&((ExifRational *)dest)[i], src + i * bs, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
796 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
797 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
798 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
799 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
800 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
801 ((float *)dest)[i] = swab_int32(*(uint32_t*)(src + i * bs), byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
802 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
803 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
804 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
805 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
806 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
807 ExifRational r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
808
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
809 rational_from_data(&r, src + i * bs, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
810 if (r.den) ((double *)dest)[i] = (double)r.num / r.den;
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 break;
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 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
815
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
816 static int parse_IFD_entry(ExifData *exif, unsigned char *tiff, int offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
817 int size, int byte_order)
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 IFDEntry *ent = (IFDEntry*)(tiff+offset);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
820 uint32_t swabed_data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
821 void *data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
822 int data_len;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
823 ExifMarker *marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
824 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
825
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
826 ent->tag = swab_int16(ent->tag, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
827 ent->format = swab_int16(ent->format, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
828 ent->nb = swab_int32(ent->nb, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
829 swabed_data = swab_int32(ent->data, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
830
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
831 /* Check tag type. If it does not match, either the format is wrong,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
832 * either it is a unknown tag; so it is not really an error.
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
833 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
834 marker = exif_marker_from_tag(ent->tag);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
835 if (!marker)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
836 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
837 if (ent->format > EXIF_FORMAT_DOUBLE)
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 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
840 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
841 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
842 /* allow non recognized tags to be displayed */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
843 marker = &ExifUnknownMarkersList[ent->format];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
844 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
845 if (marker->format != ent->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
846 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
847 /* Some cameras got mixed up signed/unsigned_rational
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
848 * eg KODAK DC4800 on object_distance tag
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
849 *
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
850 * FIXME: what exactly is this test trying to do?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
851 * ok, so this test is to allow the case of swapped signed/unsigned mismatch to leak through?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
852 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
853 if ( !(marker->format == EXIF_FORMAT_RATIONAL_UNSIGNED && ent->format == EXIF_FORMAT_RATIONAL) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
854 !(marker->format == EXIF_FORMAT_RATIONAL && ent->format == EXIF_FORMAT_RATIONAL_UNSIGNED) &&
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
855 /* short fits into a long so allow this mismatch
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
856 * as well (some tags allowed to be unsigned short _or_ unsigned long)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
857 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
858 !(marker->format == EXIF_FORMAT_LONG_UNSIGNED && ent->format == EXIF_FORMAT_SHORT_UNSIGNED) )
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
859 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
860 if (ent->format <= EXIF_FORMAT_DOUBLE)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
861 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
862 printf("warning: exif tag %s format mismatch, found %s exif spec requests %s\n",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
863 marker->key, ExifFormatList[ent->format].short_name, ExifFormatList[marker->format].short_name);
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 else
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 unknown id %d exif spec requests %d (%s)\n",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
868 marker->key, ent->format, marker->format, 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 return 0;
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 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
873
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
874 /* Where is the data, is it available?
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
875 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
876 if (marker->components > 0 && marker->components != ent->nb)
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 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
879 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
880 data_len = ExifFormatList[marker->format].size * ent->nb;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
881 if (data_len > sizeof(ent->data))
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 if (size < swabed_data+data_len)
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 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
886 return -1;
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 data = (void*)tiff + swabed_data;
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 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
891 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
892 data = (void*)(&(ent->data));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
893 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
894
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
895 item = exif_item_new(marker->format, ent->tag, ent->nb, marker);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
896 exif_item_copy_data(item, data, data_len, ent->format, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
897 exif->items = g_list_prepend(exif->items, item);
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 if (item->tag == TAG_EXIFOFFSET)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
900 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
901 parse_IFD_table(exif, tiff, swabed_data, size, byte_order);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
902 }
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 return 0;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
907 static int parse_IFD_table(ExifData *exif, unsigned char *tiff, int offset,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
908 int size, int byte_order)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
909 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
910 int i, nb_entries;
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 /* We should be able to read number of entries in IFD0) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
913 if (size < offset+2) return -1;
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 nb_entries = get_int16(tiff+offset, byte_order);
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 /* Entries and next IFD offset must be readable */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
918 if (size < offset+nb_entries*12+4) 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 for (i=0; i<nb_entries; ++i)
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 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
923 }
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 return 0;
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
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 * file formats
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 static int parse_TIFF(ExifData *exif, unsigned char *tiff, int size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
935 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
936 int byte_order, offset=0;
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 if (size < sizeof(TIFFHeader))
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
939 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
940 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
941 }
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 (strncmp(((TIFFHeader*)tiff)->byte_order, "II", 2) == 0)
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 byte_order = BYTE_ORDER_INTEL;
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 else if (strncmp(((TIFFHeader*)tiff)->byte_order, "MM", 2) == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
948 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
949 byte_order = BYTE_ORDER_MOTOROLA;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
950 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
951 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
952 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
953 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
954 }
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 if (swab_int16(((TIFFHeader*)tiff)->magic, byte_order) != 0x002A)
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 offset = swab_int32(((TIFFHeader*)tiff)->IFD_offset, byte_order);
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 parse_IFD_table(exif, tiff, offset, size, byte_order);
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 static int parse_JPEG(ExifData *exif, unsigned char *f, int size)
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 int marker, marker_size;
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 if (size<2 || *f!=0xFF || *(f+1)!=MARKER_SOI)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
971 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
972 return -2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
973 }
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 do {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
976 if (goto_next_marker(&f, &size, &marker) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
977 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
978 break;
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 } while (marker != MARKER_APP1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
981
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
982 if (marker != MARKER_APP1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
983 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
984 return -2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
985 }
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 marker_size = get_marker_size(f)-2;
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 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
990 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
991 return -2;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
992 }
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 return parse_TIFF(exif, f+10, marker_size-6);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
997 static gint map_file(const gchar *path, void **mapping, int *size)
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 int fd;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1000 struct stat fs;
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 if ((fd = open(path, O_RDONLY)) == -1)
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 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1005 return -1;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1008 if (fstat(fd, &fs) == -1)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1009 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1010 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1011 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1012 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1013 }
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 *size = fs.st_size;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1016
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1017 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
1018 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1019 perror(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1020 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1021 return -1;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1022 }
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 close(fd);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1025 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1026 }
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 static gint unmap_file(void *mapping, int size)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1029 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1030 if (munmap(mapping, size) == -1)
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 perror("munmap");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1033 return -1;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1036 return 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1037 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1038
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1039 void exif_free(ExifData *exif)
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 GList *work;
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 if (!exif) return;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1044
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1045 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1046 while (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 ExifItem *item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1049 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1050 exif_item_free(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1051 }
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 g_list_free(exif->items);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1054 g_free(exif);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1055 }
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 ExifData *exif_read(const gchar *path)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1058 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1059 ExifData *exif;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1060 void *f;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1061 int size, res;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1062 gchar *pathl;
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 if (!path) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1065
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1066 pathl = path_from_utf8(path);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1067 if (map_file(pathl, &f, &size) == -1)
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 g_free(pathl);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1070 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1071 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1072 g_free(pathl);
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 exif = g_new0(ExifData, 1);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1075 exif->items = 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 if ((res = parse_JPEG(exif, (unsigned char *)f, size)) == -2)
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 res = parse_TIFF(exif, (unsigned char *)f, size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1080 }
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 != 0)
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 exif_free(exif);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1085 exif = NULL;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1088 unmap_file(f, size);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1089
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1090 if (exif) exif->items = g_list_reverse(exif->items);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1091
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1092 #if 0
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1093 exif_write_data_list(exif, stdout, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1094 exif_write_data_list(exif, stdout, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1095 #endif
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1096
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1097 return exif;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1098 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1099
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1100 ExifItem *exif_get_item(ExifData *exif, const gchar *key)
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 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1103
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1104 if (!key) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1105
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1106 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1107 while (work)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1108 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1109 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1110
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1111 item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1112 work = work->next;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1113 if (item->marker->key && strcmp(key, item->marker->key) == 0) return item;
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 return NULL;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1118 gchar *exif_item_get_data_as_text(ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1119 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1120 ExifMarker *marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1121 gpointer data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1122 GString *string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1123 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1124 gint ne;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1125 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1126
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1127 if (!item) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1128
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1129 marker = item->marker;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1130 if (!marker) 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 data = item->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1133 ne = item->elements;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1134 string = g_string_new("");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1135 switch (item->format)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1136 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1137 case EXIF_FORMAT_UNKNOWN:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1138 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1139 case EXIF_FORMAT_BYTE_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1140 case EXIF_FORMAT_BYTE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1141 case EXIF_FORMAT_UNDEFINED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1142 if (ne == 1 && marker->list)
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 gchar *result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1145 unsigned char val;
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 if (item->format == EXIF_FORMAT_BYTE_UNSIGNED ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1148 item->format == EXIF_FORMAT_UNDEFINED)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1149 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1150 val = ((unsigned char *)data)[0];
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 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1153 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1154 val = (unsigned char)(((signed char *)data)[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1155 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1156
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1157 result = text_list_find_value(marker->list, (unsigned short)val);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1158 string = g_string_append(string, result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1159 g_free(result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1160 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1161 else
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1162 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1163 string = string_append_raw_bytes(string, data, ne);
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 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1166 case EXIF_FORMAT_STRING:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1167 string = g_string_append(string, (gchar *)(item->data));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1168 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1169 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1170 if (ne == 1 && marker->list)
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 gchar *result;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1173
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1174 result = text_list_find_value(marker->list, ((unsigned short *)data)[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1175 string = g_string_append(string, result);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1176 g_free(result);
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 else for (i = 0; i < ne; i++)
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 g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1181 ((unsigned short *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1182 }
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_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1185 for (i = 0; i < ne; i++)
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 g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1188 ((unsigned long *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1189 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1190 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1191 case EXIF_FORMAT_RATIONAL_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1192 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1193 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1194 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1195
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1196 r = &((ExifRational *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1197 g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1198 (unsigned long)r->num, (unsigned long)r->den);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1199 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1200 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1201 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1202 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1203 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1204 g_string_append_printf(string, "%s%hd", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1205 ((short *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1206 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1207 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1208 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1209 for (i = 0; i < ne; i++)
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 g_string_append_printf(string, "%s%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1212 ((long *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1213 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1214 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1215 case EXIF_FORMAT_RATIONAL:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1216 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1217 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1218 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1219
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1220 r = &((ExifRational *)data)[i];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1221 g_string_append_printf(string, "%s%ld/%ld", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1222 (long)r->num, (long)r->den);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1223 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1224 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1225 case EXIF_FORMAT_FLOAT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1226 for (i = 0; i < ne; i++)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1227 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1228 g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1229 ((float *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1230 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1231 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1232 case EXIF_FORMAT_DOUBLE:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1233 for (i = 0; i < ne; i++)
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 g_string_append_printf(string, "%s%f", (i > 0) ? ", " : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1236 ((double *)data)[i]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1237 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1238 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1239 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1240
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1241 text = g_strdup(string->str);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1242 g_string_free(string, TRUE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1243
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1244 return text;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1247 gint exif_item_get_integer(ExifItem *item, gint *value)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1248 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1249 if (!item) return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1250
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1251 switch (item->format)
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 case EXIF_FORMAT_SHORT:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1254 *value = (gint)(((short *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1255 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1256 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1257 case EXIF_FORMAT_SHORT_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1258 *value = (gint)(((unsigned short *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1259 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1260 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1261 case EXIF_FORMAT_LONG:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1262 *value = (gint)(((long *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1263 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1264 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1265 case EXIF_FORMAT_LONG_UNSIGNED:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1266 /* FIXME: overflow possible */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1267 *value = (gint)(((unsigned long *)(item->data))[0]);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1268 return TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1269 default:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1270 /* all other type return FALSE */
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 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1273 return FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1274 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1275
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1276 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1277 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1278 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1279
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1280 item = exif_get_item(exif, key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1281 return exif_item_get_integer(item, value);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1282 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1283
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1284 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1285 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1286 if (!item) return NULL;
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 if (item->format == EXIF_FORMAT_RATIONAL ||
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1289 item->format == EXIF_FORMAT_RATIONAL_UNSIGNED)
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 if (sign) *sign = (item->format == EXIF_FORMAT_RATIONAL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1292 return &((ExifRational *)(item->data))[0];
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1293 }
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 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1296 }
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 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1299 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1300 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1301
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1302 item = exif_get_item(exif, key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1303 return exif_item_get_rational(item, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1304 }
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 double exif_rational_to_double(ExifRational *r, gint sign)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1307 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1308 if (!r || r->den == 0.0) return 0.0;
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 if (sign) return (double)((int)r->num) / (double)((int)r->den);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1311 return (double)r->num / r->den;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1314 static double exif_get_rational_as_double(ExifData *exif, const gchar *key)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1315 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1316 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1317 gint sign;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1318
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1319 r = exif_get_rational(exif, key, &sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1320 return exif_rational_to_double(r, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1321 }
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 static GString *append_comma_text(GString *string, const gchar *text)
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 string = g_string_append(string, ", ");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1326 string = g_string_append(string, text);
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 return string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1329 }
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 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
1332 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1333 /* must begin with f, else not formatted */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1334 if (key[0] != 'f')
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1335 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1336 if (key_valid) *key_valid = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1337 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1338 }
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 if (key_valid) *key_valid = TRUE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1341
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1342 if (strcmp(key, "fCamera") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1343 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1344 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1345 gchar *make = exif_get_data_as_text(exif, "Make");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1346 gchar *model = exif_get_data_as_text(exif, "Model");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1347 gchar *software = exif_get_data_as_text(exif, "Software");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1348
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1349 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
1350 (model) ? model : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1351 (software) ? " (" : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1352 (software) ? software : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1353 (software) ? ")" : "");
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 g_free(make);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1356 g_free(model);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1357 g_free(software);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1358 return text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1359 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1360 if (strcmp(key, "fDateTime") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1361 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1362 gchar *text = exif_get_data_as_text(exif, "DateTimeOriginal");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1363 gchar *subsec = NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1364 if (text) subsec = exif_get_data_as_text(exif, "SubsecTimeOriginal");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1365 if (!text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1366 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1367 text = exif_get_data_as_text(exif, "DateTime");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1368 if (text) subsec = exif_get_data_as_text(exif, "SubsecTime");
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 if (subsec)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1371 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1372 gchar *tmp = text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1373 text = g_strconcat(tmp, ".", subsec, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1374 g_free(tmp);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1375 g_free(subsec);
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 return text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1378 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1379 if (strcmp(key, "fShutterSpeed") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1380 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1381 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1382
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1383 r = exif_get_rational(exif, "ExposureTime", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1384 if (r && r->num && r->den)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1385 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1386 double n = (double)r->den / (double)r->num;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1387 return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1388 n > 1.0 ? n : 1.0 / n);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1389 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1390 r = exif_get_rational(exif, "ShutterSpeedValue", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1391 if (r && r->num && r->den)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1392 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1393 double n = pow(2.0, exif_rational_to_double(r, TRUE));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1394
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1395 /* 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
1396 if (n > 1.0 && (int)n - ((int)(n/10))*10 == 1) n--;
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 return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1399 n > 1.0 ? floor(n) : 1.0 / n);
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 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1402 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1403 if (strcmp(key, "fAperture") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1404 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1405 double n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1406
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1407 n = exif_get_rational_as_double(exif, "FNumber");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1408 if (n == 0.0) n = exif_get_rational_as_double(exif, "ApertureValue");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1409 if (n == 0.0) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1410
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1411 return g_strdup_printf("f/%.1f", 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 if (strcmp(key, "fExposureBias") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1414 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1415 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1416 gint sign;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1417 double n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1418
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1419 r = exif_get_rational(exif, "ExposureBiasValue", &sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1420 if (!r) return NULL;
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_rational_to_double(r, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1423 return g_strdup_printf("%+.1f", n);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1424 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1425 if (strcmp(key, "fFocalLength") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1426 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1427 double n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1428
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1429 n = exif_get_rational_as_double(exif, "FocalLength");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1430 if (n == 0.0) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1431 return g_strdup_printf("%.2f mm", n);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1432 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1433 if (strcmp(key, "fISOSpeedRating") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1434 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1435 gchar *text;
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 text = exif_get_data_as_text(exif, "ISOSpeedRatings");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1438 /* kodak may set this instead */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1439 if (!text) text = exif_get_data_as_text(exif, "ExposureIndex");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1440 return text;
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 if (strcmp(key, "fSubjectDistance") == 0)
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 ExifRational *r;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1445 gint sign;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1446 double 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 r = exif_get_rational(exif, "SubjectDistance", &sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1449 if (!r) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1450
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1451 if ((long)r->num == 0xffffffff) return g_strdup(_("infinity"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1452 if ((long)r->num == 0) return g_strdup(_("unknown"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1453
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1454 n = exif_rational_to_double(r, sign);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1455 if (n == 0.0) return _("unknown");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1456 return g_strdup_printf("%.3f m", n);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1457 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1458 if (strcmp(key, "fFlash") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1459 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1460 /* grr, flash is a bitmask... */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1461 GString *string;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1462 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1463 gint n;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1464 gint v;
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 (!exif_get_integer(exif, "Flash", &n)) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1467
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1468 /* Exif 2.1 only defines first 3 bits */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1469 if (n <= 0x07) return g_strdup(text_list_find_value(ExifFlashList, n));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1470
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1471 /* must be Exif 2.2 */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1472 string = g_string_new("");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1473
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1474 /* flash fired (bit 0) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1475 string = g_string_append(string, (n & 0x01) ? _("yes") : _("no"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1476
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1477 /* flash mode (bits 3, 4) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1478 v = (n >> 3) & 0x03;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1479 if (v) string = append_comma_text(string, _("mode:"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1480 switch (v)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1481 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1482 case 1:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1483 string = g_string_append(string, _("on"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1484 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1485 case 2:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1486 string = g_string_append(string, _("off"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1487 break;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1488 case 3:
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1489 string = g_string_append(string, _("auto"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1490 break;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1493 /* return light (bits 1, 2) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1494 v = (n >> 1) & 0x03;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1495 if (v == 2) string = append_comma_text(string, _("not detected by strobe"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1496 if (v == 3) string = append_comma_text(string, _("detected by strobe"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1497
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1498 /* we ignore flash function (bit 5) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1499
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1500 /* red-eye (bit 6) */
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1501 if ((n >> 5) & 0x01) string = append_comma_text(string, _("red-eye reduction"));
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1502
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1503 text = string->str;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1504 g_string_free(string, FALSE);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1505 return text;
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 if (strcmp(key, "fResolution") == 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1508 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1509 ExifRational *rx, *ry;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1510 gchar *units;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1511 gchar *text;
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 rx = exif_get_rational(exif, "XResolution", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1514 ry = exif_get_rational(exif, "YResolution", NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1515 if (!rx || !ry) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1516
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1517 units = exif_get_data_as_text(exif, "ResolutionUnit");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1518 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
1519 ry->den ? (double)ry->num / ry->den : 1.0,
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1520 _("dot"), (units) ? units : _("unknown"));
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 g_free(units);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1523 return text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1524 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1525
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1526 if (key_valid) *key_valid = FALSE;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1527 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1528 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1529
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1530 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key)
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 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1533 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1534 gint key_valid;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1535
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1536 if (!key) return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1537
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1538 text = exif_get_formatted_by_key(exif, key, &key_valid);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1539 if (key_valid) return text;
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 item = exif_get_item(exif, key);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1542 if (item) return exif_item_get_data_as_text(item);
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 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1545 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1546
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1547 const gchar *exif_get_description_by_key(const gchar *key)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1548 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1549 gint i;
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 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1554 while (ExifFormattedList[i].key != NULL)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1555 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1556 if (strcmp(key, ExifFormattedList[i].key) == 0) return _(ExifFormattedList[i].description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1557 i++;
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1560 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1561 while (ExifKnownMarkersList[i].tag > 0)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1562 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1563 if (strcmp(key, ExifKnownMarkersList[i].key) == 0) return _(ExifKnownMarkersList[i].description);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1564 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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1567 return NULL;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1568 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1569
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1570 static void exif_write_item(FILE *f, ExifItem *item)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1571 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1572 gchar *text;
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 text = exif_item_get_data_as_text(item);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1575 if (text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1576 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1577 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
1578 exif_item_get_tag_name(item), text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1579 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1580 g_free(text);
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
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1583 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
1584 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1585 if (!f || !exif) return;
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 fprintf(f, " tag format key value\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1588 fprintf(f, "----------------------------------------------------\n");
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1589
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1590 if (human_readable_list)
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 gint i;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1593
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1594 i = 0;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1595 while (ExifFormattedList[i].key)
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 gchar *text;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1598
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1599 text = exif_get_formatted_by_key(exif, ExifFormattedList[i].key, NULL);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1600 if (text)
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1601 {
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1602 fprintf(f, " %9s %30s %s\n", "string", ExifFormattedList[i].key, text);
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1603 }
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1604 i++;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1605 }
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 else
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 GList *work;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1610
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1611 work = exif->items;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1612 while (work)
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 ExifItem *item;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1615
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1616 item = work->data;
d907d608745f Sync to GQview 1.5.9 release.
gqview
parents:
diff changeset
1617 work = work->next;
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 exif_write_item(f, item);
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 fprintf(f, "----------------------------------------------------\n");
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