read also iptc and xmp
[geeqie.git] / src / exif.h
1 /*
2  *  GQView
3  *  (C) 2006 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 #define EXIF_FORMAT_COUNT 13
37
38 typedef enum {
39         EXIF_FORMAT_UNKNOWN             = 0,
40         EXIF_FORMAT_BYTE_UNSIGNED       = 1,
41         EXIF_FORMAT_STRING              = 2,
42         EXIF_FORMAT_SHORT_UNSIGNED      = 3,
43         EXIF_FORMAT_LONG_UNSIGNED       = 4,
44         EXIF_FORMAT_RATIONAL_UNSIGNED   = 5,
45         EXIF_FORMAT_BYTE                = 6,
46         EXIF_FORMAT_UNDEFINED           = 7,
47         EXIF_FORMAT_SHORT               = 8,
48         EXIF_FORMAT_LONG                = 9,
49         EXIF_FORMAT_RATIONAL            = 10,
50         EXIF_FORMAT_FLOAT               = 11,
51         EXIF_FORMAT_DOUBLE              = 12
52 } ExifFormatType;
53
54
55 typedef struct _ExifFormattedText ExifFormattedText;
56 struct _ExifFormattedText
57 {
58         const gchar *key;
59         const gchar *description;
60 };
61
62 /*
63  *-----------------------------------------------------------------------------
64  * Data storage
65  *-----------------------------------------------------------------------------
66  */
67
68 typedef struct _ExifItem ExifItem;
69
70 typedef struct _ExifData ExifData;
71
72 typedef struct _ExifRational ExifRational;
73 struct _ExifRational
74 {
75         guint32 num;
76         guint32 den;
77 };
78
79
80 /* enums useful for image manipulation */
81
82 typedef enum {
83         EXIF_ORIENTATION_UNKNOWN        = 0,
84         EXIF_ORIENTATION_TOP_LEFT       = 1,
85         EXIF_ORIENTATION_TOP_RIGHT      = 2,
86         EXIF_ORIENTATION_BOTTOM_RIGHT   = 3,
87         EXIF_ORIENTATION_BOTTOM_LEFT    = 4,
88         EXIF_ORIENTATION_LEFT_TOP       = 5,
89         EXIF_ORIENTATION_RIGHT_TOP      = 6,
90         EXIF_ORIENTATION_RIGHT_BOTTOM   = 7,
91         EXIF_ORIENTATION_LEFT_BOTTOM    = 8
92 } ExifOrientationType;
93
94 typedef enum {
95         EXIF_UNIT_UNKNOWN       = 0,
96         EXIF_UNIT_NOUNIT        = 1,
97         EXIF_UNIT_INCH          = 2,
98         EXIF_UNIT_CENTIMETER    = 3
99 } ExifUnitType;
100
101
102 /*
103  *-----------------------------------------------------------------------------
104  * functions
105  *-----------------------------------------------------------------------------
106  */
107
108 ExifData *exif_read(gchar *path, gint parse_color_profile);
109 void exif_free(ExifData *exif);
110
111 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key);
112 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value);
113 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign);
114 double exif_rational_to_double(ExifRational *r, gint sign);
115 double exif_get_rational_as_double(ExifData *exif, const gchar *key);
116
117 ExifItem *exif_get_item(ExifData *exif, const gchar *key);
118 ExifItem *exif_get_first_item(ExifData *exif);
119 ExifItem *exif_get_next_item(ExifData *exif);
120
121 char *exif_item_get_tag_name(ExifItem *item);
122 guint exif_item_get_tag_id(ExifItem *item);
123 guint exif_item_get_elements(ExifItem *item);
124 char *exif_item_get_data(ExifItem *item, guint *data_len);
125 char *exif_item_get_description(ExifItem *item);
126 guint exif_item_get_format_id(ExifItem *item);
127 const char *exif_item_get_format_name(ExifItem *item, gint brief);
128 gchar *exif_item_get_data_as_text(ExifItem *item);
129 gint exif_item_get_integer(ExifItem *item, gint *value);
130 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign);
131
132 const gchar *exif_get_description_by_key(const gchar *key);
133 const gchar *exif_get_tag_description_by_key(const gchar *key);
134
135 gchar *exif_get_formatted_by_key(ExifData *exif, const gchar *key, gint *key_valid);
136
137 gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
138                                     unsigned char *header_data, const guint header_len,
139                                     guint *image_offset, guint *exif_offset);
140
141
142 #endif
143