clang=tidy: readability-uppercase-literal-suffix
[geeqie.git] / src / exif-int.h
1 /*
2  * Copyright (C) 2006 John Ellis
3  * Copyright (C) 2008 - 2016 The Geeqie Team
4  *
5  * Authors: Eric Swalens, Quy Tonthat, John Ellis
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #ifndef __EXIF_INT_H
23 #define __EXIF_INT_H
24
25 #include "exif.h"
26
27 /*
28  *-----------------------------------------------------------------------------
29  * Tag formats
30  *-----------------------------------------------------------------------------
31  */
32
33 enum ExifByteOrder {
34         EXIF_BYTE_ORDER_INTEL,
35         EXIF_BYTE_ORDER_MOTOROLA
36 };
37
38 struct ExifFormatAttrib
39 {
40         ExifFormatType type;
41         guint size;
42         const gchar *short_name;
43         const gchar *description;
44 };
45
46 extern ExifFormatAttrib ExifFormatList[]; /**< the list of known tag data formats */
47
48
49 /*
50  *-----------------------------------------------------------------------------
51  * Data storage
52  *-----------------------------------------------------------------------------
53  */
54
55 struct ExifData
56 {
57         gchar *path;
58         GList *items;   /**< list of (ExifItem *) */
59         GList *current; /**< for exif_get_next_item */
60 };
61
62 struct ExifTextList
63 {
64         gint value;
65         const gchar *description;
66 };
67
68 struct ExifMarker
69 {
70         guint           tag;
71         ExifFormatType  format;
72         gint            components;
73         const gchar             *key;
74         const gchar             *description;
75         ExifTextList    *list;
76 };
77
78 struct ExifItem
79 {
80         ExifFormatType format;
81         guint tag;
82         const ExifMarker *marker;
83         guint elements;
84         gpointer data;
85         guint data_len;
86 };
87
88 #define EXIF_MARKER_LIST_END { 0x0000, EXIF_FORMAT_UNKNOWN, 0, NULL, NULL, NULL }
89
90 #define EXIF_TEXT_LIST_END { -1, NULL }
91
92
93
94
95 /*
96  *-----------------------------------------------------------------------------
97  * Data
98  *-----------------------------------------------------------------------------
99  */
100
101
102
103 extern ExifMarker ExifKnownMarkersList[]; /**< the known exif tags list */
104
105 extern ExifMarker ExifUnknownMarkersList[]; /**< the unknown tags utilize this generic list */
106
107 extern ExifFormattedText ExifFormattedList[]; /**< the list of specially formatted keys, for human readable output */
108
109
110 /*
111  *-----------------------------------------------------------------------------
112  * functions
113  *-----------------------------------------------------------------------------
114  */
115
116 /**
117  * @headerfile exif_write_data_list
118  * usually for debugging to stdout
119  */
120 void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list);
121
122
123
124 /* These funcs for use by makernote/tiff parsers only */
125
126 #define EXIF_TIFF_MAX_LEVELS 4
127
128 #define EXIF_TIFD_OFFSET_TAG 0
129 #define EXIF_TIFD_OFFSET_FORMAT 2
130 #define EXIF_TIFD_OFFSET_COUNT 4
131 #define EXIF_TIFD_OFFSET_DATA 8
132 #define EXIF_TIFD_SIZE 12
133
134
135 guint16 exif_byte_get_int16(guchar *f, ExifByteOrder bo);
136 guint32 exif_byte_get_int32(guchar *f, ExifByteOrder bo);
137 void exif_byte_put_int16(guchar *f, guint16 n, ExifByteOrder bo);
138 void exif_byte_put_int32(guchar *f, guint32 n, ExifByteOrder bo);
139
140 ExifItem *exif_item_new(ExifFormatType format, guint tag,
141                         guint elements, const ExifMarker *marker);
142 void exif_item_copy_data(ExifItem *item, gpointer src, guint len,
143                          ExifFormatType src_format, ExifByteOrder bo);
144
145 gint exif_parse_IFD_table(ExifData *exif,
146                           guchar *tiff, guint offset,
147                           guint size, ExifByteOrder bo,
148                           gint level,
149                           const ExifMarker *list);
150
151 gint exif_tiff_directory_offset(guchar *data, guint len,
152                                 guint *offset, ExifByteOrder *bo);
153 gint exif_tiff_parse(ExifData *exif, guchar *tiff, guint size, ExifMarker *list);
154
155 gchar *exif_text_list_find_value(ExifTextList *list, guint value);
156
157 #endif
158 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */