From cd42404ea4453f0a85539890be8e73c38ed7fb69 Mon Sep 17 00:00:00 2001 From: Earl Ou Date: Wed, 24 Oct 2012 10:44:03 +0800 Subject: Handle undefined tags and ignore copyright tag in exif test Change-Id: I531518555257bdaefb79b681282c6aad07542b4b --- .../com/android/gallery3d/exif/ExifParserTest.java | 2 +- .../com/android/gallery3d/exif/ExifReaderTest.java | 2 +- tests/src/com/android/gallery3d/exif/Util.java | 145 +++++++++++++++++++++ 3 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 tests/src/com/android/gallery3d/exif/Util.java (limited to 'tests') diff --git a/tests/src/com/android/gallery3d/exif/ExifParserTest.java b/tests/src/com/android/gallery3d/exif/ExifParserTest.java index ef6871bdc..e86390e87 100644 --- a/tests/src/com/android/gallery3d/exif/ExifParserTest.java +++ b/tests/src/com/android/gallery3d/exif/ExifParserTest.java @@ -84,7 +84,7 @@ public class ExifParserTest extends ExifXmlDataTestCase { // No value from exiftool. if (truth.contains(null)) return; - String dataString = tag.valueToString().trim(); + String dataString = Util.tagValueToString(tag).trim(); assertTrue(String.format("Tag %02x", tag.getTagId()) + ", " + getImageTitle() + ": " + dataString, truth.contains(dataString)); diff --git a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java index 9916cd3ab..45a924239 100644 --- a/tests/src/com/android/gallery3d/exif/ExifReaderTest.java +++ b/tests/src/com/android/gallery3d/exif/ExifReaderTest.java @@ -115,7 +115,7 @@ public class ExifReaderTest extends ExifXmlDataTestCase { assertNotNull(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(), truth); if (truth.contains(null)) continue; assertTrue(String.format("Tag %x, ", tag.getTagId()) + getImageTitle(), - truth.contains(tag.valueToString().trim())); + truth.contains(Util.tagValueToString(tag).trim())); } assertEquals(getImageTitle(), ifdValue.size(), tags.length); } diff --git a/tests/src/com/android/gallery3d/exif/Util.java b/tests/src/com/android/gallery3d/exif/Util.java new file mode 100644 index 000000000..633063078 --- /dev/null +++ b/tests/src/com/android/gallery3d/exif/Util.java @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.gallery3d.exif; + +import java.io.Closeable; + +class Util { + public static boolean equals(Object a, Object b) { + return (a == b) || (a == null ? false : a.equals(b)); + } + + public static void closeSilently(Closeable c) { + if (c == null) return; + try { + c.close(); + } catch (Throwable t) { + // do nothing + } + } + + /** + * Tags that are not defined in the spec. + */ + static final short TAG_XP_TITLE = (short) 0x9c9b; + static final short TAG_XP_COMMENT = (short) 0x9c9c; + static final short TAG_XP_AUTHOR = (short) 0x9c9d; + static final short TAG_XP_KEYWORDS = (short) 0x9c9e; + static final short TAG_XP_SUBJECT = (short) 0x9c9f; + + private static String tagUndefinedTypeValueToString(ExifTag tag) { + StringBuilder sbuilder = new StringBuilder(); + byte[] buf = new byte[tag.getComponentCount()]; + tag.getBytes(buf); + switch (tag.getTagId()) { + case ExifTag.TAG_COMPONENTS_CONFIGURATION: + for(int i = 0, n = tag.getComponentCount(); i < n; i++) { + if(i != 0) sbuilder.append(" "); + sbuilder.append(buf[i]); + } + break; + default: + if (buf.length == 1) { + sbuilder.append(buf[0]); + } else { + for (int i = 0, n = buf.length; i < n; i++) { + byte code = buf[i]; + if (code == 0) continue; + if (code > 31 && code < 127) { + sbuilder.append((char) code); + } else { + sbuilder.append('.'); + } + } + } + } + return sbuilder.toString(); + } + + /** + * Returns a string representation of the value of this tag. + */ + public static String tagValueToString(ExifTag tag) { + StringBuilder sbuilder = new StringBuilder(); + short id = tag.getTagId(); + switch (tag.getDataType()) { + case ExifTag.TYPE_UNDEFINED: + sbuilder.append(tagUndefinedTypeValueToString(tag)); + break; + case ExifTag.TYPE_UNSIGNED_BYTE: + if (id == ExifTag.TAG_MAKER_NOTE || id == TAG_XP_TITLE || + id == TAG_XP_COMMENT || id == TAG_XP_AUTHOR || + id == TAG_XP_KEYWORDS || id == TAG_XP_SUBJECT) { + sbuilder.append(tagUndefinedTypeValueToString(tag)); + } else { + byte[] buf = new byte[tag.getComponentCount()]; + tag.getBytes(buf); + for(int i = 0, n = tag.getComponentCount(); i < n; i++) { + if(i != 0) sbuilder.append(" "); + sbuilder.append(buf[i]); + } + } + break; + case ExifTag.TYPE_ASCII: + byte[] buf = tag.getStringByte(); + for (int i = 0, n = buf.length; i < n; i++) { + byte code = buf[i]; + if (code == 0) { + // Treat some tag as undefined type data. + if (id == ExifTag.TAG_COPYRIGHT || id == ExifTag.TAG_GPS_DATE_STAMP) { + continue; + } else { + break; + } + } + if (code > 31 && code < 127) { + sbuilder.append((char) code); + } else { + sbuilder.append('.'); + } + } + break; + case ExifTag.TYPE_UNSIGNED_LONG: + for(int i = 0, n = tag.getComponentCount(); i < n; i++) { + if(i != 0) sbuilder.append(" "); + sbuilder.append(tag.getUnsignedLong(i)); + } + break; + case ExifTag.TYPE_RATIONAL: + case ExifTag.TYPE_UNSIGNED_RATIONAL: + for(int i = 0, n = tag.getComponentCount(); i < n; i++) { + Rational r = tag.getRational(i); + if(i != 0) sbuilder.append(" "); + sbuilder.append(r.getNominator()).append("/").append(r.getDenominator()); + } + break; + case ExifTag.TYPE_UNSIGNED_SHORT: + for(int i = 0, n = tag.getComponentCount(); i < n; i++) { + if(i != 0) sbuilder.append(" "); + sbuilder.append(tag.getUnsignedShort(i)); + } + break; + case ExifTag.TYPE_LONG: + for(int i = 0, n = tag.getComponentCount(); i < n; i++) { + if(i != 0) sbuilder.append(" "); + sbuilder.append(tag.getLong(i)); + } + break; + } + return sbuilder.toString(); + } +} -- cgit v1.2.3