From 4510de26e5361f3a9f07057ec6f26483c888c1fa Mon Sep 17 00:00:00 2001 From: Ruben Brunk Date: Wed, 28 May 2014 18:42:37 -0700 Subject: DNG: Update TiffWriter to handle thumbnails and SubIfds. - Fix SubIfd handling. - Add StripSources, convenience functions for writing image strips. - Update Input classes to use with JNI. - Add skip method. - Add tag definitions for GPS tags. - Add name string to tag definitions. Bug: 15112503 Change-Id: I9535b21261027f6c06a041c1621de8f865a0ad32 --- media/img_utils/include/img_utils/TiffEntryImpl.h | 56 +++++++++++++++++------ 1 file changed, 42 insertions(+), 14 deletions(-) (limited to 'media/img_utils/include/img_utils/TiffEntryImpl.h') diff --git a/media/img_utils/include/img_utils/TiffEntryImpl.h b/media/img_utils/include/img_utils/TiffEntryImpl.h index cbe0e9a..f5ccb5e 100644 --- a/media/img_utils/include/img_utils/TiffEntryImpl.h +++ b/media/img_utils/include/img_utils/TiffEntryImpl.h @@ -17,6 +17,7 @@ #ifndef IMG_UTILS_TIFF_ENTRY_IMPL #define IMG_UTILS_TIFF_ENTRY_IMPL +#include #include #include #include @@ -24,6 +25,8 @@ #include #include +#include +#include #include namespace android { @@ -32,7 +35,6 @@ namespace img_utils { template class TiffEntryImpl : public TiffEntry { public: - // TODO: Copy constructor/equals here. TiffEntryImpl(uint16_t tag, TagType type, uint32_t count, Endianness end, const T* data); virtual ~TiffEntryImpl(); @@ -54,7 +56,7 @@ class TiffEntryImpl : public TiffEntry { uint16_t mType; uint32_t mCount; Endianness mEnd; - T* mData; + Vector mData; }; @@ -63,18 +65,12 @@ TiffEntryImpl::TiffEntryImpl(uint16_t tag, TagType type, uint32_t count, Endi const T* data) : mTag(tag), mType(static_cast(type)), mCount(count), mEnd(end) { count = (type == RATIONAL || type == SRATIONAL) ? count * 2 : count; - mData = new T[count](); - for (uint32_t i = 0; i < count; ++i) { - mData[i] = data[i]; - } + ssize_t index = mData.appendArray(data, count); + LOG_ALWAYS_FATAL_IF(index < 0, "%s: Could not allocate vector for data.", __FUNCTION__); } template -TiffEntryImpl::~TiffEntryImpl() { - if (mData) { - delete[] mData; - } -} +TiffEntryImpl::~TiffEntryImpl() {} template uint32_t TiffEntryImpl::getCount() const { @@ -93,7 +89,7 @@ TagType TiffEntryImpl::getType() const { template const void* TiffEntryImpl::getDataHelper() const { - return reinterpret_cast(mData); + return reinterpret_cast(mData.array()); } template @@ -144,7 +140,7 @@ status_t TiffEntryImpl::writeTagInfo(uint32_t offset, /*out*/EndianOutput* ou */ count <<= 1; } - BAIL_ON_FAIL(out->write(mData, 0, count), ret); + BAIL_ON_FAIL(out->write(mData.array(), 0, count), ret); ZERO_TILL_WORD(out, dataSize, ret); } return ret; @@ -171,7 +167,7 @@ status_t TiffEntryImpl::writeData(uint32_t offset, EndianOutput* out) const { count <<= 1; } - BAIL_ON_FAIL(out->write(mData, 0, count), ret); + BAIL_ON_FAIL(out->write(mData.array(), 0, count), ret); if (mEnd != UNDEFINED_ENDIAN) { out->setEndianness(tmp); @@ -182,6 +178,38 @@ status_t TiffEntryImpl::writeData(uint32_t offset, EndianOutput* out) const { return ret; } +template<> +inline status_t TiffEntryImpl >::writeTagInfo(uint32_t offset, + /*out*/EndianOutput* out) const { + assert((offset % TIFF_WORD_SIZE) == 0); + status_t ret = OK; + BAIL_ON_FAIL(out->write(&mTag, 0, 1), ret); + BAIL_ON_FAIL(out->write(&mType, 0, 1), ret); + BAIL_ON_FAIL(out->write(&mCount, 0, 1), ret); + + BAIL_ON_FAIL(out->write(&offset, 0, 1), ret); + return ret; +} + +template<> +inline uint32_t TiffEntryImpl >::getActualSize() const { + uint32_t total = 0; + for (size_t i = 0; i < mData.size(); ++i) { + total += mData[i]->getSize(); + } + return total; +} + +template<> +inline status_t TiffEntryImpl >::writeData(uint32_t offset, EndianOutput* out) const { + status_t ret = OK; + for (uint32_t i = 0; i < mCount; ++i) { + BAIL_ON_FAIL(mData[i]->writeData(offset, out), ret); + offset += mData[i]->getSize(); + } + return ret; +} + } /*namespace img_utils*/ } /*namespace android*/ -- cgit v1.1