diff options
Diffstat (limited to 'tests/src/com/android/gallery3d/exif/ExifReaderTest.java')
-rw-r--r-- | tests/src/com/android/gallery3d/exif/ExifReaderTest.java | 121 |
1 files changed, 65 insertions, 56 deletions
diff --git a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java index 9964997f2..e4ed8ebf9 100644 --- a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java +++ b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java @@ -17,6 +17,7 @@ package com.android.gallery3d.exif; import android.content.res.XmlResourceParser; +import android.graphics.BitmapFactory; import android.test.InstrumentationTestCase; import java.io.IOException; @@ -56,73 +57,81 @@ public class ExifReaderTest extends InstrumentationTestCase { public void testRead() throws ExifInvalidFormatException, IOException { ExifReader reader = new ExifReader(); - ExifData exifData = reader.getExifData(mImageInputStream); - checkIfd(exifData, ExifData.TYPE_IFD_0, mIfd0Value); - checkIfd(exifData, ExifData.TYPE_IFD_1, mIfd1Value); - checkIfd(exifData, ExifData.TYPE_IFD_EXIF, mExifIfdValue); - checkIfd(exifData, ExifData.TYPE_IFD_INTEROPERABILITY, mInteroperabilityIfdValue); + ExifData exifData = reader.read(mImageInputStream); + checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_0), mIfd0Value); + checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_1), mIfd1Value); + checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_EXIF), mExifIfdValue); + checkIfd(exifData.getIfdData(IfdId.TYPE_IFD_INTEROPERABILITY), + mInteroperabilityIfdValue); + checkThumbnail(exifData); } - private void checkIfd(ExifData exifData, int ifdType, HashMap<Short, String> ifdValue) - throws IOException { - IfdData ifd = exifData.getIfdData(ifdType); + private void checkThumbnail(ExifData exifData) { + IfdData ifd1 = exifData.getIfdData(IfdId.TYPE_IFD_1); + if (ifd1 != null) { + if (ifd1.getTag(ExifTag.TIFF_TAG.TAG_COMPRESSION).getUnsignedShort(0) == + ExifTag.TIFF_TAG.COMPRESSION_JPEG) { + assertTrue(exifData.hasCompressedThumbnail()); + byte[] thumbnail = exifData.getCompressedThumbnail(); + assertTrue(BitmapFactory.decodeByteArray(thumbnail, 0, thumbnail.length) != null); + } else { + // Try to check the strip count with the formula provided by EXIF spec. + int planarType = ExifTag.TIFF_TAG.PLANAR_CONFIGURATION_CHUNKY; + ExifTag planarTag = ifd1.getTag(ExifTag.TIFF_TAG.TAG_PLANAR_CONFIGURATION); + if (planarTag != null) { + planarType = planarTag.getUnsignedShort(0); + } + + ExifTag heightTag = ifd1.getTag(ExifTag.TIFF_TAG.TAG_IMAGE_HEIGHT); + ExifTag rowPerStripTag = ifd1.getTag(ExifTag.TIFF_TAG.TAG_ROWS_PER_STRIP); + + int imageLength = getUnsignedIntOrShort(heightTag); + int rowsPerStrip = getUnsignedIntOrShort(rowPerStripTag); + int stripCount = ifd1.getTag( + ExifTag.TIFF_TAG.TAG_STRIP_OFFSETS).getComponentCount(); + + if (planarType == ExifTag.TIFF_TAG.PLANAR_CONFIGURATION_CHUNKY) { + assertTrue(stripCount == (imageLength + rowsPerStrip - 1) / rowsPerStrip); + } else { + ExifTag samplePerPixelTag = ifd1.getTag(ExifTag.TIFF_TAG.TAG_SAMPLES_PER_PIXEL); + int samplePerPixel = samplePerPixelTag.getUnsignedShort(0); + assertTrue(stripCount == + (imageLength + rowsPerStrip - 1) / rowsPerStrip * samplePerPixel); + } + + for (int i = 0; i < stripCount; i++) { + ExifTag byteCountTag = ifd1.getTag(ExifTag.TIFF_TAG.TAG_STRIP_BYTE_COUNTS); + if (byteCountTag.getDataType() == ExifTag.TYPE_UNSIGNED_SHORT) { + assertEquals(byteCountTag.getUnsignedShort(i), exifData.getStrip(i).length); + } else { + assertEquals( + byteCountTag.getUnsignedInt(i), exifData.getStrip(i).length); + } + } + } + } + } + + private int getUnsignedIntOrShort(ExifTag tag) { + if (tag.getDataType() == ExifTag.TYPE_UNSIGNED_SHORT) { + return tag.getUnsignedShort(0); + } else { + return (int) tag.getUnsignedInt(0); + } + } + + private void checkIfd(IfdData ifd, HashMap<Short, String> ifdValue) { if (ifd == null) { assertEquals(0 ,ifdValue.size()); return; } - ExifTag[] tags = ifd.getAllTags(new ExifTag[0]); + ExifTag[] tags = ifd.getAllTags(); for (ExifTag tag : tags) { - assertEquals(ifdValue.get(tag.getTagId()), readValueToString(tag, ifd)); + assertEquals(ifdValue.get(tag.getTagId()), tag.valueToString()); } assertEquals(ifdValue.size(), tags.length); } - private String readValueToString(ExifTag tag, IfdData ifdData) throws IOException { - StringBuilder sbuilder = new StringBuilder(); - switch(tag.getDataType()) { - case ExifTag.TYPE_UNDEFINED: - case ExifTag.TYPE_BYTE: - byte buf[] = new byte[tag.getComponentCount()]; - ifdData.getBytes(tag.getTagId(), buf); - for(int i = 0; i < tag.getComponentCount(); i++) { - if(i != 0) sbuilder.append(" "); - sbuilder.append(String.format("%02x", buf[i])); - } - break; - case ExifTag.TYPE_ASCII: - // trim the string for comparison between xml - sbuilder.append(ifdData.getString(tag.getTagId()).trim()); - break; - case ExifTag.TYPE_INT: - for(int i = 0; i < tag.getComponentCount(); i++) { - if(i != 0) sbuilder.append(" "); - sbuilder.append(ifdData.getUnsignedInt(tag.getTagId(), i)); - } - break; - case ExifTag.TYPE_SRATIONAL: - case ExifTag.TYPE_RATIONAL: - for(int i = 0; i < tag.getComponentCount(); i++) { - Rational r = ifdData.getRational(tag.getTagId(), i); - if(i != 0) sbuilder.append(" "); - sbuilder.append(r.getNominator()).append("/").append(r.getDenominator()); - } - break; - case ExifTag.TYPE_SHORT: - for(int i = 0; i < tag.getComponentCount(); i++) { - if(i != 0) sbuilder.append(" "); - sbuilder.append(ifdData.getUnsignedShort(tag.getTagId(), i)); - } - break; - case ExifTag.TYPE_SINT: - for(int i = 0; i < tag.getComponentCount(); i++) { - if(i != 0) sbuilder.append(" "); - sbuilder.append(ifdData.getInt(tag.getTagId(), i)); - } - break; - } - return sbuilder.toString(); - } - @Override public void tearDown() throws Exception { mImageInputStream.close(); |