Add a pointer to the build function in the formatted exif tags struct
[geeqie.git] / src / exif.h
1 /*
2  * Geeqie
3  * (C) 2006 John Ellis
4  *  Copyright (C) 2008 The Geeqie Team
5  *
6  *  Authors:
7  *    Support for Exif file format, originally written by Eric Swalens.
8  *    Modified by Quy Tonthat
9  *    Reimplemented with generic data storage by John Ellis
10  *
11
12     This program is free software; you can redistribute it and/or modify
13     it under the terms of the GNU General Public License as published by
14     the Free Software Foundation; either version 2 of the License, or
15     (at your option) any later version.
16
17     This program is distributed in the hope that it will be useful,
18     but WITHOUT ANY WARRANTY; without even the implied warranty of
19     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20     GNU General Public License for more details.
21
22     You should have received a copy of the GNU General Public License
23     along with this program; if not, write to the Free Software
24     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 */
26
27 #ifndef __EXIF_H
28 #define __EXIF_H
29
30
31 /*
32  *-----------------------------------------------------------------------------
33  * Tag formats
34  *-----------------------------------------------------------------------------
35  */
36
37 #define EXIF_FORMAT_COUNT 13
38
39 typedef enum {
40         EXIF_FORMAT_UNKNOWN             = 0,
41         EXIF_FORMAT_BYTE_UNSIGNED       = 1,
42         EXIF_FORMAT_STRING              = 2,
43         EXIF_FORMAT_SHORT_UNSIGNED      = 3,
44         EXIF_FORMAT_LONG_UNSIGNED       = 4,
45         EXIF_FORMAT_RATIONAL_UNSIGNED   = 5,
46         EXIF_FORMAT_BYTE                = 6,
47         EXIF_FORMAT_UNDEFINED           = 7,
48         EXIF_FORMAT_SHORT               = 8,
49         EXIF_FORMAT_LONG                = 9,
50         EXIF_FORMAT_RATIONAL            = 10,
51         EXIF_FORMAT_FLOAT               = 11,
52         EXIF_FORMAT_DOUBLE              = 12
53 } ExifFormatType;
54
55
56 /*
57  *-----------------------------------------------------------------------------
58  * Data storage
59  *-----------------------------------------------------------------------------
60  */
61
62 typedef struct _ExifItem ExifItem;
63
64 typedef struct _ExifData ExifData;
65
66 typedef struct _ExifRational ExifRational;
67 struct _ExifRational
68 {
69         guint32 num;
70         guint32 den;
71 };
72
73
74 /* enums useful for image manipulation */
75
76 typedef enum {
77         EXIF_ORIENTATION_UNKNOWN        = 0,
78         EXIF_ORIENTATION_TOP_LEFT       = 1,
79         EXIF_ORIENTATION_TOP_RIGHT      = 2,
80         EXIF_ORIENTATION_BOTTOM_RIGHT   = 3,
81         EXIF_ORIENTATION_BOTTOM_LEFT    = 4,
82         EXIF_ORIENTATION_LEFT_TOP       = 5,
83         EXIF_ORIENTATION_RIGHT_TOP      = 6,
84         EXIF_ORIENTATION_RIGHT_BOTTOM   = 7,
85         EXIF_ORIENTATION_LEFT_BOTTOM    = 8
86 } ExifOrientationType;
87
88 typedef enum {
89         EXIF_UNIT_UNKNOWN       = 0,
90         EXIF_UNIT_NOUNIT        = 1,
91         EXIF_UNIT_INCH          = 2,
92         EXIF_UNIT_CENTIMETER    = 3
93 } ExifUnitType;
94
95
96 typedef struct _ExifFormattedText ExifFormattedText;
97 struct _ExifFormattedText
98 {
99         const gchar *key;
100         const gchar *description;
101         gchar *(*build_func)(ExifData *exif);
102 };
103
104 /*
105  *-----------------------------------------------------------------------------
106  * functions
107  *-----------------------------------------------------------------------------
108  */
109
110 ExifData *exif_read(gchar *path, gchar *sidecar_path);
111
112 ExifData *exif_read_fd(FileData *fd);
113
114
115 int exif_write(ExifData *exif);
116 void exif_free(ExifData *exif);
117
118 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key);
119 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value);
120 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign);
121 double exif_rational_to_double(ExifRational *r, gint sign);
122 double exif_get_rational_as_double(ExifData *exif, const gchar *key);
123
124 ExifItem *exif_get_item(ExifData *exif, const gchar *key);
125 ExifItem *exif_add_item(ExifData *exif, const gchar *key);
126 ExifItem *exif_get_first_item(ExifData *exif);
127 ExifItem *exif_get_next_item(ExifData *exif);
128
129
130 char *exif_item_get_tag_name(ExifItem *item);
131 guint exif_item_get_tag_id(ExifItem *item);
132 guint exif_item_get_elements(ExifItem *item);
133 char *exif_item_get_data(ExifItem *item, guint *data_len);
134 char *exif_item_get_description(ExifItem *item);
135 guint exif_item_get_format_id(ExifItem *item);
136 const char *exif_item_get_format_name(ExifItem *item, gint brief);
137 gchar *exif_item_get_data_as_text(ExifItem *item);
138 gint exif_item_get_integer(ExifItem *item, gint *value);
139 ExifRational *exif_item_get_rational(ExifItem *item, gint *sign);
140
141 gchar *exif_item_get_string(ExifItem *item, int idx);
142
143 const gchar *exif_get_description_by_key(const gchar *key);
144 const gchar *exif_get_tag_description_by_key(const gchar *key);
145
146 gchar *exif_get_formatted_by_key(ExifData *exif, const gchar *key, gint *key_valid);
147
148 int exif_item_delete(ExifData *exif, ExifItem *item);
149 int exif_item_set_string(ExifItem *item, const char *str);
150
151 unsigned char *exif_get_color_profile(ExifData *exif, guint *data_len);
152
153 /* jpeg embedded icc support */
154
155 void exif_add_jpeg_color_profile(ExifData *exif, unsigned char *cp_data, guint cp_length);
156
157
158 gint exif_jpeg_segment_find(unsigned char *data, guint size,
159                                    guchar app_marker, const gchar *magic, guint magic_len,
160                                    guint *seg_offset, guint *seg_length);
161 gint exif_jpeg_parse_color(ExifData *exif, unsigned char *data, guint size);
162
163 /*raw support */
164 gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
165                                     unsigned char *header_data, const guint header_len,
166                                     guint *image_offset, guint *exif_offset);
167
168
169
170 #endif