20#ifndef KIS_EXIF_VALUE_H
21#define KIS_EXIF_VALUE_H
28typedef TQMemArray<TQ_UINT8> UByteArray;
30struct KisExifRational {
32 TQ_UINT32 denominator;
35struct KisExifSRational {
45 KisExifRational m_rational;
49 KisExifSRational m_srational;
59 EXIF_TYPE_RATIONAL = 5,
61 EXIF_TYPE_UNDEFINED = 7,
64 EXIF_TYPE_SRATIONAL = 10,
66 EXIF_TYPE_DOUBLE = 12,
73 ExifValue() : m_ifd(-1), m_type(EXIF_TYPE_UNKNOW), m_components(0), m_value(0) { }
74 ExifValue(ExifType type,
unsigned char *data,
unsigned int size,
int ifd, uint components, ExifValue::ByteOrder order);
76 virtual bool load(
const TQDomElement& elmt);
77 virtual TQDomElement save(TQDomDocument& doc);
82 inline ExifType type() {
return m_type; }
83 inline const UByteArray asUndefined() {
84 if(m_type == EXIF_TYPE_UNDEFINED)
85 return *(UByteArray*) m_value;
88 inline void setAsUndefined(
const unsigned char *data,
unsigned int size)
90 if(m_type == EXIF_TYPE_UNDEFINED)
92 ((UByteArray*)m_value)->duplicate(data, size);
96 inline const TQString asAscii() {
97 if(m_type == EXIF_TYPE_ASCII)
98 return TQString(*(TQString*) m_value);
101 inline void setAsAscii(
char* data)
103 if(m_type == EXIF_TYPE_ASCII)
105 TQString str = TQString((
char*) data);
106 *(TQString*)m_value = str;
107 m_components = str.length();
110 inline void setAsAscii(TQString str)
112 *(TQString*)m_value = str;
113 m_components = str.length();
115 void convertToData(
unsigned char ** data,
unsigned int* size, ExifValue::ByteOrder order);
119 inline int ifd() {
return m_ifd; }
123 inline uint components() {
return m_components; }
130 inline TQ_UINT8 asByte(uint i)
132 if(m_type == EXIF_TYPE_BYTE)
133 return asExifNumber(i).m_byte;
136 inline void setValue(uint i, TQ_UINT8 v)
138 ((ExifNumber*)m_value)[i].m_byte = v;
140 inline TQ_UINT8 asShort(uint i)
142 if(m_type == EXIF_TYPE_SHORT)
143 return asExifNumber(i).m_short;
146 inline void setValue(uint i, TQ_UINT16 v)
148 ((ExifNumber*)m_value)[i].m_short = v;
150 inline TQ_UINT8 asLong(uint i)
152 if(m_type == EXIF_TYPE_LONG)
153 return asExifNumber(i).m_long;
156 inline void setValue(uint i, TQ_UINT32 v)
158 ((ExifNumber*)m_value)[i].m_long = v;
160 inline KisExifRational asRational(uint i)
162 if(m_type == EXIF_TYPE_RATIONAL)
163 return asExifNumber(i).m_rational;
164 return KisExifRational();
166 inline void setValue(uint i, TQ_UINT32 n, TQ_UINT32 d)
168 ((ExifNumber*)m_value)[i].m_rational.numerator = n;
169 ((ExifNumber*)m_value)[i].m_rational.denominator = d;
171 inline void setValue(uint i, KisExifRational r)
173 ((ExifNumber*)m_value)[i].m_rational = r;
175 inline TQ_INT8 asSByte(uint i)
177 if(m_type == EXIF_TYPE_SBYTE)
178 return asExifNumber(i).m_sbyte;
181 inline void setValue(uint i, TQ_INT8 v)
183 ((ExifNumber*)m_value)[i].m_sbyte = v;
185 inline TQ_INT16 asSShort(uint i)
187 if(m_type == EXIF_TYPE_SSHORT)
188 return asExifNumber(i).m_sshort;
191 inline void setValue(uint i, TQ_INT16 v)
193 ((ExifNumber*)m_value)[i].m_sshort = v;
195 inline TQ_INT32 asSLong(uint i)
197 if(m_type == EXIF_TYPE_SLONG)
198 return asExifNumber(i).m_slong;
201 inline void setValue(uint i, TQ_INT32 v)
203 ((ExifNumber*)m_value)[i].m_slong = v;
205 inline KisExifSRational asSRational(uint i)
207 if(m_type == EXIF_TYPE_SRATIONAL)
208 return asExifNumber(i).m_srational;
209 return KisExifSRational();
211 inline void setValue(uint i, KisExifSRational r)
213 ((ExifNumber*)m_value)[i].m_srational = r;
215 inline void setValue(uint i, TQ_INT32 n, TQ_INT32 d)
217 ((ExifNumber*)m_value)[i].m_srational.numerator = n;
218 ((ExifNumber*)m_value)[i].m_srational.denominator = d;
220 inline float asFloat(uint i)
222 if(m_type == EXIF_TYPE_FLOAT)
223 return asExifNumber(i).m_float;
226 inline void setValue(uint i,
float v)
228 ((ExifNumber*)m_value)[i].m_float = v;
230 inline double asDouble(uint i)
232 if(m_type == EXIF_TYPE_DOUBLE)
233 return asExifNumber(i).m_double;
236 inline void setValue(uint i,
double v)
238 ((ExifNumber*)m_value)[i].m_double = v;
244 TQString toString(uint i);
245 void setValue(
const unsigned char *data,
unsigned int size, ExifValue::ByteOrder order);
249 inline const ExifNumber asExifNumber(uint index)
251 Q_ASSERT(index < m_components);
252 return ((ExifNumber*)m_value)[index];
254 inline void setAsExifNumber(uint index, ExifNumber n)
256 Q_ASSERT(index < m_components);
257 ((ExifNumber*)m_value)[index] = n;