summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEarl Ou <shunhsingou@google.com>2012-08-03 13:26:35 +0800
committerEarl Ou <shunhsingou@google.com>2012-08-06 17:16:23 +0800
commitbdcdb15ad345633bbab6505207008f018059f107 (patch)
treeb59cebd0559750ec57dc3dc86b0253dbbb02e014 /src
parent9fae341c1a958285d93d86698ea7ff28dc4bde89 (diff)
downloadandroid_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.java17
-rw-r--r--src/com/android/gallery3d/exif/IfdParser.java58
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