21#include "kis_exif_value.h"
27void set16Bit (
unsigned char *data, ExifValue::ByteOrder order,
const TQ_UINT16* value)
30 case ExifValue::BYTE_ORDER_MOTOROLA:
31 data[0] = (
unsigned char) (*value >> 8);
32 data[1] = (
unsigned char) *value;
34 case ExifValue::BYTE_ORDER_INTEL:
35 data[0] = (
unsigned char) *value;
36 data[1] = (
unsigned char) (*value >> 8);
41void get16Bit (
const unsigned char *data, ExifValue::ByteOrder order, TQ_UINT16* value)
44 case ExifValue::BYTE_ORDER_MOTOROLA:
45 *value = ((data[0] << 8) | data[1]);
47 case ExifValue::BYTE_ORDER_INTEL:
48 *value = ((data[1] << 8) | data[0]);
53void get32Bit (
const unsigned char *data, ExifValue::ByteOrder order, TQ_UINT32* value)
56 case ExifValue::BYTE_ORDER_MOTOROLA:
57 *value = ((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]);
59 case ExifValue::BYTE_ORDER_INTEL:
60 *value = ((data[3] << 24) | (data[2] << 16) | (data[1] << 8) | data[0]);
64void set32Bit(
unsigned char *data, ExifValue::ByteOrder order,
const TQ_UINT32* value)
67 case ExifValue::BYTE_ORDER_MOTOROLA:
68 data[0] = (
unsigned char) (*value >> 24);
69 data[1] = (
unsigned char) (*value >> 16);
70 data[2] = (
unsigned char) (*value >> 8);
71 data[3] = (
unsigned char) *value;
73 case ExifValue::BYTE_ORDER_INTEL:
74 data[3] = (
unsigned char) (*value >> 24);
75 data[2] = (
unsigned char) (*value >> 16);
76 data[1] = (
unsigned char) (*value >> 8);
77 data[0] = (
unsigned char) *value;
82void get64Bit (
const unsigned char *data, ExifValue::ByteOrder order, TQ_UINT64* value)
85 case ExifValue::BYTE_ORDER_MOTOROLA:
86 *value = (((TQ_UINT64)data[0] << 56) | ((TQ_UINT64)data[1] << 48) | ((TQ_UINT64)data[2] << 40) | ((TQ_UINT64)data[3] << 32) | ((TQ_UINT64)data[4] << 24) | ((TQ_UINT64)data[5] << 16) | ((TQ_UINT64)data[6] << 8) | (TQ_UINT64)data[7]);
88 case ExifValue::BYTE_ORDER_INTEL:
89 *value = (((TQ_UINT64)data[7] << 56) | ((TQ_UINT64)data[6] << 48) | ((TQ_UINT64)data[5] << 40) | ((TQ_UINT64)data[4] << 32) | ((TQ_UINT64)data[3] << 24) | ((TQ_UINT64)data[2] << 16) | ((TQ_UINT64)data[1] << 8) | (TQ_UINT64)data[0]);
93void set64Bit(
unsigned char *data, ExifValue::ByteOrder order,
const TQ_UINT64* value)
96 case ExifValue::BYTE_ORDER_MOTOROLA:
97 data[0] = (
unsigned char) (*value >> 56);
98 data[1] = (
unsigned char) (*value >> 48);
99 data[2] = (
unsigned char) (*value >> 40);
100 data[3] = (
unsigned char) (*value >> 32);
101 data[4] = (
unsigned char) (*value >> 24);
102 data[5] = (
unsigned char) (*value >> 16);
103 data[6] = (
unsigned char) (*value >> 8);
104 data[7] = (
unsigned char) *value;
106 case ExifValue::BYTE_ORDER_INTEL:
107 data[7] = (
unsigned char) (*value >> 56);
108 data[6] = (
unsigned char) (*value >> 48);
109 data[5] = (
unsigned char) (*value >> 40);
110 data[4] = (
unsigned char) (*value >> 32);
111 data[3] = (
unsigned char) (*value >> 24);
112 data[2] = (
unsigned char) (*value >> 16);
113 data[1] = (
unsigned char) (*value >> 8);
114 data[0] = (
unsigned char) *value;
122ExifValue::ExifValue(ExifType ntype,
unsigned char *data,
unsigned int size,
int ifd, uint ncomponents, ExifValue::ByteOrder order ) : m_ifd(ifd), m_type(ntype), m_components(ncomponents), m_value(0)
125 setValue(data, size, order);
128void ExifValue::allocData()
130 if( type() != EXIF_TYPE_ASCII && type() != EXIF_TYPE_UNDEFINED)
132 m_value =
new ExifNumber[components()];
133 }
else if ( type() == EXIF_TYPE_ASCII )
135 m_value =
new TQString();
136 }
else if ( type() == EXIF_TYPE_UNDEFINED)
138 m_value =
new UByteArray();
142bool ExifValue::load(
const TQDomElement& elmt)
145 if( (attr = elmt.attribute(
"ifd")).isNull() )
147 m_ifd = attr.toInt();
148 if( (attr = elmt.attribute(
"components")).isNull() )
150 m_components = attr.toInt();
151 if( (attr = elmt.attribute(
"type")).isNull() )
153 m_type = (ExifValue::ExifType)attr.toInt();
158 for(uint i = 0; i < components(); i++)
160 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
162 setValue(i, (TQ_UINT8)0);
164 setValue(i, (TQ_UINT8) attr.toUInt());
168 case EXIF_TYPE_ASCII:
169 setAsAscii( elmt.attribute(
"value" ) );
171 case EXIF_TYPE_SHORT:
172 for(uint i = 0; i < components(); i++)
174 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
176 setValue(i, (TQ_UINT16)0);
178 setValue(i, (TQ_UINT16) attr.toUInt());
183 for(uint i = 0; i < components(); i++)
185 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
187 setValue(i, (TQ_UINT32)0);
189 setValue(i, (TQ_UINT32) attr.toUInt());
193 case EXIF_TYPE_RATIONAL:
194 for(uint i = 0; i < components(); i++)
197 if( (attr = elmt.attribute(TQString(
"numerator%1").arg(i) ) ).isNull() )
199 r.numerator = (TQ_UINT32)0;
201 r.numerator = (TQ_UINT32) attr.toUInt();
203 if( (attr = elmt.attribute(TQString(
"denominator%1").arg(i) ) ).isNull() )
205 r.denominator = (TQ_UINT32)0;
207 r.denominator = (TQ_UINT32) attr.toUInt();
212 case EXIF_TYPE_SBYTE:
213 for(uint i = 0; i < components(); i++)
215 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
217 setValue(i, (TQ_INT8)0);
219 setValue(i, (TQ_INT8) attr.toInt());
223 case EXIF_TYPE_UNDEFINED:
225 TQString instr = elmt.attribute(
"value");
227 TQByteArray in = instr.utf8();
228 KCodecs::base64Decode( in, out);
229 out.resize(out.size() - 2 );
230 setAsUndefined((uchar*)out.data(), out.size() );
233 case EXIF_TYPE_SSHORT:
234 for(uint i = 0; i < components(); i++)
236 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
238 setValue(i, (TQ_INT16)0);
240 setValue(i, (TQ_INT16) attr.toInt());
244 case EXIF_TYPE_SLONG:
245 for(uint i = 0; i < components(); i++)
247 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
249 setValue(i, (TQ_INT32)0);
251 setValue(i, (TQ_INT32) attr.toInt());
255 case EXIF_TYPE_SRATIONAL:
256 for(uint i = 0; i < components(); i++)
259 if( (attr = elmt.attribute(TQString(
"numerator%1").arg(i) ) ).isNull() )
261 r.numerator = (TQ_INT32)0;
263 r.numerator = (TQ_INT32) attr.toInt();
265 if( (attr = elmt.attribute(TQString(
"denominator%1").arg(i) ) ).isNull() )
267 r.denominator = (TQ_UINT32)0;
269 r.denominator = (TQ_UINT32) attr.toInt();
274 case EXIF_TYPE_FLOAT:
275 for(uint i = 0; i < components(); i++)
277 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
279 setValue(i, (
float)0);
281 setValue(i, (
float) attr.toFloat());
285 case EXIF_TYPE_DOUBLE:
286 for(uint i = 0; i < components(); i++)
288 if( (attr = elmt.attribute(TQString(
"value%1").arg(i) ) ).isNull() )
290 setValue(i, (
double)0);
292 setValue(i, (
double) attr.toDouble());
296 case EXIF_TYPE_UNKNOW:
303TQDomElement ExifValue::save(TQDomDocument& doc)
305 TQDomElement elmt = doc.createElement(
"ExifValue");
306 elmt.setAttribute(
"ifd", ifd());
307 elmt.setAttribute(
"components", components() );
308 elmt.setAttribute(
"type", type() );
312 for(uint i = 0; i < components(); i++)
313 elmt.setAttribute(TQString(
"value%1").arg(i), asByte( i ) );
315 case EXIF_TYPE_ASCII:
316 elmt.setAttribute(
"value", asAscii() );
318 case EXIF_TYPE_SHORT:
319 for(uint i = 0; i < components(); i++)
320 elmt.setAttribute(TQString(
"value%1").arg(i), asShort( i ) );
323 for(uint i = 0; i < components(); i++)
324 elmt.setAttribute(TQString(
"value%1").arg(i), asLong( i ) );
326 case EXIF_TYPE_RATIONAL:
327 for(uint i = 0; i < components(); i++)
329 KisExifRational r = asRational(i);
330 elmt.setAttribute(TQString(
"numerator%1").arg(i), r.numerator );
331 elmt.setAttribute(TQString(
"denominator%1").arg(i), r.denominator );
334 case EXIF_TYPE_SBYTE:
335 for(uint i = 0; i < components(); i++)
336 elmt.setAttribute(TQString(
"value%1").arg(i), asSByte( i ) );
338 case EXIF_TYPE_UNDEFINED:
340 UByteArray value = asUndefined();
342 data.setRawData((
char*)value.data(), value.size());
343 TQByteArray encodedData;
344 KCodecs::base64Encode( data, encodedData );
345 data.resetRawData( (
char*)value.data(), value.size());
346 elmt.setAttribute(
"value", TQString(encodedData));
349 case EXIF_TYPE_SSHORT:
350 for(uint i = 0; i < components(); i++)
351 elmt.setAttribute(TQString(
"value%1").arg(i), asSShort( i ) );
353 case EXIF_TYPE_SLONG:
354 for(uint i = 0; i < components(); i++)
355 elmt.setAttribute(TQString(
"value%1").arg(i), asSLong( i ) );
357 case EXIF_TYPE_SRATIONAL:
358 for(uint i = 0; i < components(); i++)
360 KisExifSRational r = asSRational(i);
361 elmt.setAttribute(TQString(
"numerator%1").arg(i), r.numerator );
362 elmt.setAttribute(TQString(
"denominator%1").arg(i), r.denominator );
365 case EXIF_TYPE_FLOAT:
366 for(uint i = 0; i < components(); i++)
367 elmt.setAttribute(TQString(
"value%1").arg(i), asFloat( i ) );
369 case EXIF_TYPE_DOUBLE:
370 for(uint i = 0; i < components(); i++)
371 elmt.setAttribute(TQString(
"value%1").arg(i), asDouble( i ) );
373 case EXIF_TYPE_UNKNOW:
380void ExifValue::setValue(
const unsigned char *data,
unsigned int size, ExifValue::ByteOrder order)
385 if( size == components() )
388 for(uint i = 0; i < components(); i++)
391 setAsExifNumber( i, n);
395 case EXIF_TYPE_ASCII:
396 setAsAscii((
char*) data);
398 case EXIF_TYPE_SHORT:
399 if( size == 2*components() )
402 for(uint i = 0; i < components(); i++)
404 get16Bit( data + 2 * i, order, &n.m_short);
405 setAsExifNumber( i, n);
410 if( size == 4*components() )
413 for(uint i = 0; i < components(); i++)
415 get32Bit( data + 4 * i, order, &n.m_long);
416 setAsExifNumber( i, n);
420 case EXIF_TYPE_RATIONAL:
421 if( size == 8*components() )
424 for(uint i = 0; i < components(); i++)
426 get32Bit( data + 8 * i, order, &n.m_rational.numerator);
427 get32Bit( data + 8 * i + 4, order, &n.m_rational.denominator);
428 setAsExifNumber( i, n);
432 case EXIF_TYPE_SBYTE:
433 if( size == components() )
436 for(uint i = 0; i < components(); i++)
438 n.m_sbyte = ((TQ_INT8*)data)[i];
439 setAsExifNumber( i, n);
443 case EXIF_TYPE_UNDEFINED:
444 setAsUndefined(data, size);
446 case EXIF_TYPE_SSHORT:
447 if( size == 2*components() )
450 for(uint i = 0; i < components(); i++)
452 get16Bit( data + 2 * i, order, (TQ_UINT16*)&n.m_sshort);
453 setAsExifNumber( i, n);
457 case EXIF_TYPE_SLONG:
458 if( size == 4*components() )
461 for(uint i = 0; i < components(); i++)
463 get32Bit( data + 4 * i, order, (TQ_UINT32*)&n.m_slong);
464 setAsExifNumber( i, n);
468 case EXIF_TYPE_SRATIONAL:
469 if( size == 8*components() )
472 for(uint i = 0; i < components(); i++)
474 get32Bit( data + 8 * i, order, (TQ_UINT32*)&n.m_srational.numerator);
475 get32Bit( data + 8 * i + 4, order, (TQ_UINT32*)&n.m_srational.denominator);
476 setAsExifNumber( i, n);
480 case EXIF_TYPE_FLOAT:
481 if( size == 4*components() )
484 for(uint i = 0; i < components(); i++)
486 get32Bit( data + 4 * i, order, (TQ_UINT32*)&n.m_float);
487 setAsExifNumber( i, n);
491 case EXIF_TYPE_DOUBLE:
492 if( size == 8*components() )
495 for(uint i = 0; i < components(); i++)
497 get64Bit( data + 8 * i, order, (TQ_UINT64*)&n.m_double);
498 setAsExifNumber( i, n);
502 case EXIF_TYPE_UNKNOW:
507void ExifValue::convertToData(
unsigned char ** data,
unsigned int* size, ExifValue::ByteOrder order)
512 *size = components();
513 *data =
new uchar[*size];
514 for(uint i = 0; i < components(); i++)
516 (*data)[i] = asExifNumber(i).m_byte;
519 case EXIF_TYPE_ASCII:
521 TQString str = asAscii();
522 *size = str.length();
523 *data =
new uchar[ *size ];
525 memcpy(ptr, str.ascii(), (*size)*
sizeof(uchar));
529 case EXIF_TYPE_SHORT:
531 *size = 2*components();
532 *data =
new uchar[*size];
533 for(uint i = 0; i < components(); i++)
535 TQ_UINT16 aenms = asExifNumber(i).m_short;
536 set16Bit( (*data) + 2 * i, order, &aenms);
542 *size = 4*components();
543 *data =
new uchar[*size];
544 for(uint i = 0; i < components(); i++)
546 TQ_UINT32 aenml = asExifNumber(i).m_long;
547 set32Bit( (*data) + 4 * i, order, &aenml);
551 case EXIF_TYPE_RATIONAL:
552 *size = 8*components();
553 *data =
new uchar[*size];
554 for(uint i = 0; i < components(); i++)
556 ExifNumber n = asExifNumber(i);
557 set32Bit( (*data) + 8 * i, order, &n.m_rational.numerator);
558 set32Bit( (*data) + 8 * i + 4, order, &n.m_rational.denominator);
561 case EXIF_TYPE_SBYTE:
562 *size = components();
563 *data =
new uchar[*size];
564 for(uint i = 0; i < components(); i++)
566 *(((TQ_INT8*)*data) + i) = asExifNumber(i).m_sbyte;
569 case EXIF_TYPE_UNDEFINED:
571 UByteArray array = asUndefined();
572 *size = array.size();
573 *data =
new uchar[*size];
574 memcpy( *data, array.data(), (*size)*
sizeof(
unsigned char));
577 case EXIF_TYPE_SSHORT:
578 *size = 2*components();
579 *data =
new uchar[*size];
580 for(uint i = 0; i < components(); i++)
582 TQ_INT16 aenmss = asExifNumber(i).m_sshort;
583 set16Bit( (*data) + 2 * i, order, (TQ_UINT16*)&aenmss);
586 case EXIF_TYPE_SLONG:
587 *size = 4*components();
588 *data =
new uchar[*size];
589 for(uint i = 0; i < components(); i++)
591 TQ_INT32 aenmsl = asExifNumber(i).m_slong;
592 set32Bit( (*data) + 4 * i, order, (TQ_UINT32*)&aenmsl);
595 case EXIF_TYPE_SRATIONAL:
596 *size = 8*components();
597 *data =
new uchar[*size];
598 for(uint i = 0; i < components(); i++)
600 ExifNumber n = asExifNumber(i);
601 TQ_INT32 aenmsr_numerator = asExifNumber(i).m_srational.numerator;
602 TQ_INT32 aenmsr_denominator = asExifNumber(i).m_srational.denominator;
603 set32Bit( (*data) + 4 * i, order, (TQ_UINT32*)&aenmsr_numerator);
604 set32Bit( (*data) + 4 * i + 4, order, (TQ_UINT32*)&aenmsr_denominator);
607 case EXIF_TYPE_FLOAT:
608 *size = 4*components();
609 *data =
new uchar[*size];
610 for(uint i = 0; i < components(); i++)
612 float aenmf = asExifNumber(i).m_float;
613 set32Bit( (*data) + 4 * i, order, (TQ_UINT32*)&aenmf);
616 case EXIF_TYPE_DOUBLE:
617 *size = 8*components();
618 *data =
new uchar[*size];
619 for(uint i = 0; i < components(); i++)
621 double aenmd = asExifNumber(i).m_double;
622 set64Bit( (*data) + 4 * i, order, (TQ_UINT64*)&aenmd);
625 case EXIF_TYPE_UNKNOW:
630TQString ExifValue::toString()
634 case EXIF_TYPE_ASCII:
636 case EXIF_TYPE_UNDEFINED:
638 TQString undefined =
"undefined";
639 UByteArray array = asUndefined();
640 for(uint i = 0; i < components(); i++)
642 undefined +=
"\\" + TQString().setNum( array[i] );
649 for(uint i = 0; i < components(); i++)
658TQString ExifValue::toString(uint i)
663 return TQString(
"%1 ").arg( asExifNumber( i ).m_byte );
664 case EXIF_TYPE_SHORT:
665 return TQString(
"%1 ").arg( asExifNumber( i ).m_short );
667 return TQString(
"%1 ").arg( asExifNumber( i ).m_long );
668 case EXIF_TYPE_RATIONAL:
669 return TQString(
"%1 / %2 ").arg( asExifNumber( i ).m_rational.numerator ).arg( asExifNumber( i ).m_rational.denominator );
670 case EXIF_TYPE_SBYTE: {
672 TQ_INT8 o_sbyte = asExifNumber( i ).m_sbyte;
673 return TQString(
"%1 ").arg( o_sbyte );
675 case EXIF_TYPE_SSHORT:
676 return TQString(
"%1 ").arg( asExifNumber( i ).m_sshort );
677 case EXIF_TYPE_SLONG:
678 return TQString(
"%1 ").arg( asExifNumber( i ).m_slong );
679 case EXIF_TYPE_SRATIONAL:
680 return TQString(
"%1 / %2 ").arg( asExifNumber( i ).m_srational.numerator ).arg( asExifNumber( i ).m_srational.denominator );
681 case EXIF_TYPE_FLOAT:
682 return TQString(
"%1 ").arg( asExifNumber( i ).m_float );
683 case EXIF_TYPE_DOUBLE:
684 return TQString(
"%1 ").arg( asExifNumber( i ).m_double );