diff options
author | Earl Ou <shunhsingou@google.com> | 2012-08-03 13:26:35 +0800 |
---|---|---|
committer | Earl Ou <shunhsingou@google.com> | 2012-08-06 17:16:23 +0800 |
commit | bdcdb15ad345633bbab6505207008f018059f107 (patch) | |
tree | b59cebd0559750ec57dc3dc86b0253dbbb02e014 /src | |
parent | 9fae341c1a958285d93d86698ea7ff28dc4bde89 (diff) | |
download | android_packages_apps_Snap-bdcdb15ad345633bbab6505207008f018059f107.tar.gz android_packages_apps_Snap-bdcdb15ad345633bbab6505207008f018059f107.tar.bz2 android_packages_apps_Snap-bdcdb15ad345633bbab6505207008f018059f107.zip |
Remove TYPE_SUB_IFD for next() in IfdParser
We should not read the offset because there are
too many exception. Users should check the id of the tag
and decide how to read the block by themselves.
Change-Id: Ie3f162c5c6dc25f15107e193adc080c7b51112b5
Diffstat (limited to 'src')
-rw-r--r-- | src/com/android/gallery3d/exif/ExifTag.java | 17 | ||||
-rw-r--r-- | src/com/android/gallery3d/exif/IfdParser.java | 58 |
2 files changed, 23 insertions, 52 deletions
diff --git a/src/com/android/gallery3d/exif/ExifTag.java b/src/com/android/gallery3d/exif/ExifTag.java index c9e08cc40..4f1db55cd 100644 --- a/src/com/android/gallery3d/exif/ExifTag.java +++ b/src/com/android/gallery3d/exif/ExifTag.java @@ -160,24 +160,11 @@ public class ExifTag { private final short mTagId; private final short mDataType; private final int mDataCount; - private final int mOffset; ExifTag(short tagId, short type, int dataCount) { mTagId = tagId; mDataType = type; mDataCount = dataCount; - mOffset = -1; - } - - ExifTag(short tagId, short type, int dataCount, int offset) { - mTagId = tagId; - mDataType = type; - mDataCount = dataCount; - mOffset = offset; - } - - public int getOffset() { - return mOffset; } public short getTagId() { @@ -188,6 +175,10 @@ public class ExifTag { return mDataType; } + public int getDataSize() { + return getComponentCount() * getElementSize(getDataType()); + } + public int getComponentCount() { return mDataCount; } diff --git a/src/com/android/gallery3d/exif/IfdParser.java b/src/com/android/gallery3d/exif/IfdParser.java index c15a5b6d7..b0b0bce10 100644 --- a/src/com/android/gallery3d/exif/IfdParser.java +++ b/src/com/android/gallery3d/exif/IfdParser.java @@ -18,16 +18,11 @@ package com.android.gallery3d.exif; import java.io.IOException; import java.nio.charset.Charset; -import java.util.Comparator; -import java.util.TreeSet; +import java.util.Map.Entry; +import java.util.TreeMap; public class IfdParser { - // special sub IDF tags - private static final short EXIF_IDF = (short) 0x8769; - private static final short GPS_IDF = (short) 0x8825; - private static final short INTEROPERABILITY_IDF = (short) 0xA005; - private static final int TAG_SIZE = 12; private final TiffInputStream mTiffStream; @@ -36,20 +31,15 @@ public class IfdParser { private int mNextOffset; private int mOffsetToNextIfd = 0; - private TreeSet<ExifTag> mCorrespondingTag = new TreeSet<ExifTag>( - new Comparator<ExifTag>() { - @Override - public int compare(ExifTag lhs, ExifTag rhs) { - return lhs.getOffset() - rhs.getOffset(); - } - }); + private TreeMap<Integer, ExifTag> mCorrespondingTag = new TreeMap<Integer, ExifTag>(); + private ExifTag mCurrTag; + private int mCurrTagOffset; public static final int TYPE_NEW_TAG = 0; public static final int TYPE_VALUE_OF_PREV_TAG = 1; public static final int TYPE_NEXT_IFD = 2; public static final int TYPE_END = 3; - public static final int TYPE_SUB_IFD = 4; IfdParser(TiffInputStream tiffStream, int offset) throws IOException { mTiffStream = tiffStream; @@ -76,13 +66,11 @@ public class IfdParser { } if (!mCorrespondingTag.isEmpty()) { - mCurrTag = mCorrespondingTag.pollFirst(); - skipTo(mCurrTag.getOffset()); - if (isSubIfdTag(mCurrTag.getTagId())) { - return TYPE_SUB_IFD; - } else { - return TYPE_VALUE_OF_PREV_TAG; - } + Entry<Integer, ExifTag> entry = mCorrespondingTag.pollFirstEntry(); + mCurrTag = entry.getValue(); + mCurrTagOffset = entry.getKey(); + skipTo(entry.getKey()); + return TYPE_VALUE_OF_PREV_TAG; } else { if (offset <= mOffsetToNextIfd) { skipTo(mOffsetToNextIfd); @@ -103,28 +91,24 @@ public class IfdParser { throw new ExifInvalidFormatException( "Number of component is larger then Integer.MAX_VALUE"); } - - if (ExifTag.getElementSize(dataFormat) * numOfComp > 4 - || isSubIfdTag(tagId)) { - int offset = mTiffStream.readInt(); - return new ExifTag(tagId, dataFormat, (int) numOfComp, offset); - } else { - return new ExifTag(tagId, dataFormat, (int) numOfComp); - } + return new ExifTag(tagId, dataFormat, (int) numOfComp); } public ExifTag getCorrespodingExifTag() { - return mCurrTag.getOffset() != mTiffStream.getReadByteCount() ? null : mCurrTag; + return mCurrTagOffset != mTiffStream.getReadByteCount() ? null : mCurrTag; } - public void waitValueOfTag(ExifTag tag) { - mCorrespondingTag.add(tag); + public void waitValueOfTag(ExifTag tag, long offset) { + if (offset > Integer.MAX_VALUE || offset < 0) { + throw new IllegalArgumentException(offset + " must be in 0 ~ " + Integer.MAX_VALUE); + } + mCorrespondingTag.put((int) offset, tag); } public void skipTo(int offset) throws IOException { mTiffStream.skipTo(offset); - while (!mCorrespondingTag.isEmpty() && mCorrespondingTag.first().getOffset() < offset) { - mCorrespondingTag.pollFirst(); + while (!mCorrespondingTag.isEmpty() && mCorrespondingTag.firstKey() < offset) { + mCorrespondingTag.pollFirstEntry(); } } @@ -179,8 +163,4 @@ public class IfdParser { int denomi = readInt(); return new Rational(nomi, denomi); } - - private static boolean isSubIfdTag(short tagId) { - return tagId == EXIF_IDF || tagId == GPS_IDF || tagId == INTEROPERABILITY_IDF; - } }
\ No newline at end of file |