Sync to GQview 1.5.9 release.
[geeqie.git] / src / exif.h
1 /*
2  *  GQView
3  *  (C) 2004 John Ellis
4  *
5  *  Authors:
6  *    Support for Exif file format, originally written by Eric Swalens.    
7  *    Modified by Quy Tonthat
8  *    Reimplemented with generic data storage by John Ellis
9  *
10
11     This program is free software; you can redistribute it and/or modify
12     it under the terms of the GNU General Public License as published by
13     the Free Software Foundation; either version 2 of the License, or
14     (at your option) any later version.
15
16     This program is distributed in the hope that it will be useful,
17     but WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19     GNU General Public License for more details.
20
21     You should have received a copy of the GNU General Public License
22     along with this program; if not, write to the Free Software
23     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 */
25
26 #ifndef __EXIF_H
27 #define __EXIF_H
28
29
30 /*
31  *-----------------------------------------------------------------------------
32  * Tag formats
33  *-----------------------------------------------------------------------------
34  */
35
36 typedef enum {
37         EXIF_FORMAT_UNKNOWN             = 0,
38         EXIF_FORMAT_BYTE_UNSIGNED       = 1,
39         EXIF_FORMAT_STRING              = 2,
40         EXIF_FORMAT_SHORT_UNSIGNED      = 3,
41         EXIF_FORMAT_LONG_UNSIGNED       = 4,
42         EXIF_FORMAT_RATIONAL_UNSIGNED   = 5,
43         EXIF_FORMAT_BYTE                = 6,
44         EXIF_FORMAT_UNDEFINED           = 7,
45         EXIF_FORMAT_SHORT               = 8,
46         EXIF_FORMAT_LONG                = 9,
47         EXIF_FORMAT_RATIONAL            = 10,
48         EXIF_FORMAT_FLOAT               = 11,
49         EXIF_FORMAT_DOUBLE              = 12
50 } ExifFormatType;
51
52 typedef struct _ExifFormatAttrib ExifFormatAttrib;
53 struct _ExifFormatAttrib
54 {
55         ExifFormatType type;
56         int size;
57         const char *short_name;
58         const char *description;
59 };
60
61 /* the list of known tag data formats */
62 extern ExifFormatAttrib ExifFormatList[];
63
64
65 /*
66  *-----------------------------------------------------------------------------
67  * Data storage
68  *-----------------------------------------------------------------------------
69  */
70
71 typedef struct _ExifData ExifData;
72 struct _ExifData
73 {
74         GList *items;   /* list of (ExifItem *) */
75 };
76
77 typedef struct _ExifRational ExifRational;
78 struct _ExifRational
79 {
80         unsigned long int num;
81         unsigned long int den;
82 };
83
84
85 typedef struct _ExifItem ExifItem;
86 typedef struct _ExifMarker ExifMarker;
87 typedef struct _ExifTextList ExifTextList;
88
89 struct _ExifItem
90 {
91         ExifFormatType format;
92         int tag;
93         ExifMarker *marker;
94         int elements;
95         gpointer data;
96         int data_len;
97 };
98
99 struct _ExifMarker
100 {
101         int             tag;
102         ExifFormatType  format;
103         int             components;
104         char            *key;
105         char            *description;
106         ExifTextList    *list;
107 };
108
109 struct _ExifTextList
110 {
111         int value;
112         const char* description;
113 };
114
115
116 typedef struct _ExifFormattedText ExifFormattedText;
117 struct _ExifFormattedText
118 {
119         const char *key;
120         const char *description;
121 };
122
123
124 /*
125  *-----------------------------------------------------------------------------
126  * Data
127  *-----------------------------------------------------------------------------
128  */
129
130 /* enums useful for image manipulation */
131
132 typedef enum {
133         EXIF_ORIENTATION_UNKNOWN        = 0,
134         EXIF_ORIENTATION_TOP_LEFT       = 1,
135         EXIF_ORIENTATION_TOP_RIGHT      = 2,
136         EXIF_ORIENTATION_BOTTOM_RIGHT   = 3,
137         EXIF_ORIENTATION_BOTTOM_LEFT    = 4,
138         EXIF_ORIENTATION_LEFT_TOP       = 5,
139         EXIF_ORIENTATION_RIGHT_TOP      = 6,
140         EXIF_ORIENTATION_RIGHT_BOTTOM   = 7,
141         EXIF_ORIENTATION_LEFT_BOTTOM    = 8
142 } ExifOrientationType;
143
144 typedef enum {
145         EXIF_UNIT_UNKNOWN       = 0,
146         EXIF_UNIT_NOUNIT        = 1,
147         EXIF_UNIT_INCH          = 2,
148         EXIF_UNIT_CENTIMETER    = 3
149 } ExifUnitType;
150
151
152 /* the known exif tags list */
153 extern ExifMarker ExifKnownMarkersList[];
154
155 /* the unknown tags utilize this generic list */
156 extern ExifMarker ExifUnknownMarkersList[];
157
158 /* the list of specially formatted keys, for human readable output */
159 extern ExifFormattedText ExifFormattedList[];
160
161
162 /*
163  *-----------------------------------------------------------------------------
164  * functions
165  *-----------------------------------------------------------------------------
166  */
167
168 ExifData *exif_read(const gchar *path);
169 void exif_free(ExifData *exif);
170
171 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key);
172 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value);
173 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign);
174 double exif_rational_to_double(ExifRational *r, gint sign);
175
176 ExifItem *exif_get_item(ExifData *exif, const gchar *key);
177
178 const char *exif_item_get_tag_name(ExifItem *item);
179 const char *exif_item_get_description(ExifItem *item);
180 const char *exif_item_get_format_name(ExifItem *item, gint brief);
181 gchar *exif_item_get_data_as_text(ExifItem *item);
182 gint exif_item_get_integer(ExifItem *item, gint *value);
183 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign);
184
185 const gchar *exif_get_description_by_key(const gchar *key);
186
187 /* usually for debugging to stdout */
188 void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list);
189
190
191 #endif