1/*! \file exif-utils.h
2 *  \brief EXIF data manipulation functions and types
3 */
4/*
5 * Copyright (c) 2001 Lutz Mueller <lutz@users.sourceforge.net>
6 *
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
11 *
12 * This library 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 GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20 * Boston, MA  02110-1301  USA.
21 */
22
23#ifndef __EXIF_UTILS_H__
24#define __EXIF_UTILS_H__
25
26#ifdef __cplusplus
27extern "C" {
28#endif /* __cplusplus */
29
30#include <libexif/exif-byte-order.h>
31#include <libexif/exif-format.h>
32#include <libexif/_stdint.h>
33
34
35/* If these definitions don't work for you, please let us fix the
36 * macro generating _stdint.h */
37
38/*! EXIF Unsigned Byte data type */
39typedef unsigned char	ExifByte;          /* 1 byte  */
40
41/*! EXIF Signed Byte data type */
42typedef signed char	ExifSByte;         /* 1 byte  */
43
44/*! EXIF Text String data type */
45typedef char *		ExifAscii;
46
47/*! EXIF Unsigned Short data type */
48typedef uint16_t	ExifShort;         /* 2 bytes */
49
50/*! EXIF Signed Short data type */
51typedef int16_t         ExifSShort;        /* 2 bytes */
52
53/*! EXIF Unsigned Long data type */
54typedef uint32_t	ExifLong;          /* 4 bytes */
55
56/*! EXIF Signed Long data type */
57typedef int32_t		ExifSLong;         /* 4 bytes */
58
59/*! EXIF Unsigned Rational data type */
60typedef struct {ExifLong numerator; ExifLong denominator;} ExifRational;
61
62typedef char		ExifUndefined;     /* 1 byte  */
63
64/*! EXIF Signed Rational data type */
65typedef struct {ExifSLong numerator; ExifSLong denominator;} ExifSRational;
66
67
68/*! Retrieve an #ExifShort value from memory.
69 *
70 * \param[in] b pointer to raw EXIF value in memory
71 * \param[in] order byte order of raw value
72 * \return value
73 */
74ExifShort     exif_get_short     (const unsigned char *b, ExifByteOrder order);
75
76/*! Retrieve an #ExifSShort value from memory.
77 *
78 * \param[in] b pointer to raw EXIF value in memory
79 * \param[in] order byte order of raw value
80 * \return value
81 */
82ExifSShort    exif_get_sshort    (const unsigned char *b, ExifByteOrder order);
83
84/*! Retrieve an #ExifLong value from memory.
85 *
86 * \param[in] b pointer to raw EXIF value in memory
87 * \param[in] order byte order of raw value
88 * \return value
89 */
90ExifLong      exif_get_long      (const unsigned char *b, ExifByteOrder order);
91
92/*! Retrieve an #ExifSLong value from memory.
93 *
94 * \param[in] b pointer to raw EXIF value in memory
95 * \param[in] order byte order of raw value
96 * \return value
97 */
98ExifSLong     exif_get_slong     (const unsigned char *b, ExifByteOrder order);
99
100/*! Retrieve an #ExifRational value from memory.
101 *
102 * \param[in] b pointer to raw EXIF value in memory
103 * \param[in] order byte order of raw value
104 * \return value
105 */
106ExifRational  exif_get_rational  (const unsigned char *b, ExifByteOrder order);
107
108/*! Retrieve an #ExifSRational value from memory.
109 *
110 * \param[in] b pointer to raw EXIF value in memory
111 * \param[in] order byte order of raw value
112 * \return value
113 */
114ExifSRational exif_get_srational (const unsigned char *b, ExifByteOrder order);
115
116/*! Store an ExifShort value into memory in EXIF format.
117 *
118 * \param[out] b buffer in which to write raw value
119 * \param[in] order byte order to use
120 * \param[in] value data value to store
121 */
122void exif_set_short     (unsigned char *b, ExifByteOrder order,
123			 ExifShort value);
124
125/*! Store an ExifSShort value into memory in EXIF format.
126 *
127 * \param[out] b buffer in which to write raw value
128 * \param[in] order byte order to use
129 * \param[in] value data value to store
130 */
131void exif_set_sshort    (unsigned char *b, ExifByteOrder order,
132			 ExifSShort value);
133
134/*! Store an ExifLong value into memory in EXIF format.
135 *
136 * \param[out] b buffer in which to write raw value
137 * \param[in] order byte order to use
138 * \param[in] value data value to store
139 */
140void exif_set_long      (unsigned char *b, ExifByteOrder order,
141			 ExifLong value);
142
143/*! Store an ExifSLong value into memory in EXIF format.
144 *
145 * \param[out] b buffer in which to write raw value
146 * \param[in] order byte order to use
147 * \param[in] value data value to store
148 */
149void exif_set_slong     (unsigned char *b, ExifByteOrder order,
150			 ExifSLong value);
151
152/*! Store an ExifRational value into memory in EXIF format.
153 *
154 * \param[out] b buffer in which to write raw value
155 * \param[in] order byte order to use
156 * \param[in] value data value to store
157 */
158void exif_set_rational  (unsigned char *b, ExifByteOrder order,
159			 ExifRational value);
160
161/*! Store an ExifSRational value into memory in EXIF format.
162 *
163 * \param[out] b buffer in which to write raw value
164 * \param[in] order byte order to use
165 * \param[in] value data value to store
166 */
167void exif_set_srational (unsigned char *b, ExifByteOrder order,
168			 ExifSRational value);
169
170/*! \internal */
171void exif_convert_utf16_to_utf8 (char *out, const unsigned short *in, int maxlen);
172
173/* Please do not use this function outside of the library. */
174
175/*! \internal */
176void exif_array_set_byte_order (ExifFormat, unsigned char *, unsigned int,
177		ExifByteOrder o_orig, ExifByteOrder o_new);
178
179#undef  MIN
180#define MIN(a, b)  (((a) < (b)) ? (a) : (b))
181
182#undef  MAX
183#define MAX(a, b)  (((a) > (b)) ? (a) : (b))
184
185/* For compatibility with older versions */
186
187/*! \deprecated Use EXIF_TAG_SUB_SEC_TIME instead. */
188#define EXIF_TAG_SUBSEC_TIME EXIF_TAG_SUB_SEC_TIME
189
190#ifdef __cplusplus
191}
192#endif /* __cplusplus */
193
194#endif /* __EXIF_UTILS_H__ */
195