566 |
566 |
const iterator e = entries_.end();
|
567 |
567 |
iterator i;
|
568 |
568 |
for (i = b; i != e; ++i) {
|
569 |
|
if (i->size() > 4) {
|
570 |
|
totalDataSize += i->size();
|
|
569 |
long sz = i->size();
|
|
570 |
if (sz > 4) {
|
|
571 |
sz += sz & 1; // Align size to word boundary
|
|
572 |
totalDataSize += sz;
|
571 |
573 |
}
|
572 |
574 |
}
|
573 |
575 |
for (i = b; i != e; ++i) {
|
... | ... | |
575 |
577 |
us2Data(buf + o + 2, i->type(), byteOrder);
|
576 |
578 |
ul2Data(buf + o + 4, i->count(), byteOrder);
|
577 |
579 |
if (i->sizeDataArea() > 0) {
|
578 |
|
long dataAreaOffset = offset_+size()+totalDataSize+dataAreaSize;
|
579 |
|
i->setDataAreaOffsets(dataAreaOffset, byteOrder);
|
580 |
|
dataAreaSize += i->sizeDataArea();
|
|
580 |
long dao = offset_ + size() + totalDataSize + dataAreaSize;
|
|
581 |
dao += dao & 1; // Align data area offset to word boundary
|
|
582 |
i->setDataAreaOffsets(dao, byteOrder);
|
|
583 |
long das = i->sizeDataArea();
|
|
584 |
das += das & 1; // Align data area size to word boundary
|
|
585 |
dataAreaSize += das;
|
581 |
586 |
}
|
582 |
587 |
if (i->size() > 4) {
|
583 |
588 |
// Set the offset of the entry, data immediately follows the IFD
|
584 |
|
i->setOffset(size() + dataSize);
|
|
589 |
long of = size() + dataSize;
|
|
590 |
of += of & 1; // Align offset to word boundary
|
|
591 |
i->setOffset(of);
|
585 |
592 |
l2Data(buf + o + 8, offset_ + i->offset(), byteOrder);
|
586 |
|
dataSize += i->size();
|
|
593 |
long ds = i->size();
|
|
594 |
ds += ds & 1; // Align data size to word boundary
|
|
595 |
dataSize += ds;
|
587 |
596 |
}
|
588 |
597 |
else {
|
589 |
598 |
// Copy data into the offset field
|
... | ... | |
606 |
615 |
|
607 |
616 |
// Add the data of all IFD entries to the data buffer
|
608 |
617 |
for (i = b; i != e; ++i) {
|
609 |
|
if (i->size() > 4) {
|
610 |
|
std::memcpy(buf + o, i->data(), i->size());
|
611 |
|
o += i->size();
|
|
618 |
long sz = i->size();
|
|
619 |
if (sz > 4) {
|
|
620 |
std::memcpy(buf + o, i->data(), sz);
|
|
621 |
if ((sz & 1) == 1) {
|
|
622 |
// Align data to word boundary
|
|
623 |
std::memset(buf + o + sz, 0x0, 1);
|
|
624 |
sz += 1;
|
|
625 |
}
|
|
626 |
o += sz;
|
612 |
627 |
}
|
613 |
628 |
}
|
614 |
629 |
|
615 |
630 |
// Add all data areas to the data buffer
|
616 |
631 |
for (i = b; i != e; ++i) {
|
617 |
|
if (i->sizeDataArea() > 0) {
|
618 |
|
std::memcpy(buf + o, i->dataArea(), i->sizeDataArea());
|
619 |
|
o += i->sizeDataArea();
|
|
632 |
long sz = i->sizeDataArea();
|
|
633 |
if (sz > 0) {
|
|
634 |
std::memcpy(buf + o, i->dataArea(), sz);
|
|
635 |
if ((sz & 1) == 1) {
|
|
636 |
// Align data area to word boundary
|
|
637 |
std::memset(buf + o + sz, 0x0, 1);
|
|
638 |
sz += 1;
|
|
639 |
}
|
|
640 |
o += sz;
|
620 |
641 |
}
|
621 |
642 |
}
|
622 |
643 |
|
... | ... | |
701 |
722 |
long dataSize = 0;
|
702 |
723 |
const_iterator end = this->end();
|
703 |
724 |
for (const_iterator i = begin(); i != end; ++i) {
|
704 |
|
if (i->size() > 4) dataSize += i->size();
|
705 |
|
dataSize += i->sizeDataArea();
|
|
725 |
long sz = i->size();
|
|
726 |
if (sz > 4) {
|
|
727 |
sz += sz & 1; // Align data size to word boundary
|
|
728 |
dataSize += sz;
|
|
729 |
}
|
|
730 |
sz = i->sizeDataArea();
|
|
731 |
sz += sz & 1; // Align data area size to word boundary
|
|
732 |
dataSize += sz;
|
706 |
733 |
}
|
707 |
734 |
return dataSize;
|
708 |
735 |
}
|