You are viewing a plain text version of this content. The canonical link for it is here.
Posted to sanselan-commits@incubator.apache.org by cm...@apache.org on 2008/01/23 04:45:09 UTC

svn commit: r614420 [2/3] - in /incubator/sanselan/trunk/src: main/java/org/apache/sanselan/ main/java/org/apache/sanselan/common/ main/java/org/apache/sanselan/common/byteSources/ main/java/org/apache/sanselan/formats/bmp/ main/java/org/apache/sansela...

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageMetadata.java Tue Jan 22 20:44:55 2008
@@ -24,13 +24,18 @@
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.common.ImageMetadata;
+import org.apache.sanselan.common.RationalNumber;
 import org.apache.sanselan.formats.tiff.constants.TagInfo;
+import org.apache.sanselan.formats.tiff.constants.TiffConstants;
+import org.apache.sanselan.formats.tiff.constants.TiffDirectoryConstants;
 import org.apache.sanselan.formats.tiff.fieldtypes.FieldType;
 import org.apache.sanselan.formats.tiff.write.TiffOutputDirectory;
 import org.apache.sanselan.formats.tiff.write.TiffOutputField;
 import org.apache.sanselan.formats.tiff.write.TiffOutputSet;
 
 public class TiffImageMetadata extends ImageMetadata
+		implements
+			TiffDirectoryConstants
 {
 	public final TiffContents contents;
 
@@ -71,6 +76,16 @@
 			return directory.getTiffImageData();
 		}
 
+		public TiffField findField(TagInfo tagInfo) throws ImageReadException
+		{
+			return directory.findField(tagInfo);
+		}
+
+		public List getAllFields() throws ImageReadException
+		{
+			return directory.getDirectoryEntrys();
+		}
+
 		public JpegImageData getJpegImageData()
 		{
 			return directory.getJpegImageData();
@@ -88,49 +103,65 @@
 		public TiffOutputDirectory getOutputDirectory(int byteOrder)
 				throws ImageWriteException
 		{
-			TiffOutputDirectory dstDir = new TiffOutputDirectory(type);
-
-			ArrayList entries = getItems();
-			for (int i = 0; i < entries.size(); i++)
+			try
 			{
-				TiffImageMetadata.Item item = (TiffImageMetadata.Item) entries
-						.get(i);
-				TiffField srcField = item.getTiffField();
+				TiffOutputDirectory dstDir = new TiffOutputDirectory(type);
 
-				if (null != dstDir.findField(srcField.tag))
+				ArrayList entries = getItems();
+				for (int i = 0; i < entries.size(); i++)
 				{
-					// ignore duplicate tags in a directory.
-					continue;
+					TiffImageMetadata.Item item = (TiffImageMetadata.Item) entries
+							.get(i);
+					TiffField srcField = item.getTiffField();
+
+					if (null != dstDir.findField(srcField.tag))
+					{
+						// ignore duplicate tags in a directory.
+						continue;
+					}
+					else if (srcField.tagInfo instanceof TagInfo.Offset)
+					{
+						// ignore offset fields.
+						continue;
+					}
+
+					TagInfo tagInfo = srcField.tagInfo;
+					FieldType fieldType = srcField.fieldType;
+					int count = srcField.length;
+					//			byte bytes[] = srcField.fieldType.getRawBytes(srcField);
+
+					//					Debug.debug("tagInfo", tagInfo);
+
+					Object value = srcField.getValue();
+
+					//					Debug.debug("value", Debug.getType(value));
+
+					byte bytes[] = tagInfo.encodeValue(fieldType, value,
+							byteOrder);
+
+					//					if (tagInfo.isUnknown())
+					//						Debug.debug(
+					//								"\t" + "unknown tag(0x"
+					//										+ Integer.toHexString(srcField.tag)
+					//										+ ") bytes", bytes);
+
+					TiffOutputField dstField = new TiffOutputField(
+							srcField.tag, tagInfo, fieldType, count, bytes);
+					dstField.setSortHint(srcField.getSortHint());
+					dstDir.add(dstField);
 				}
-				else if (srcField.tagInfo instanceof TagInfo.Offset)
-				{
-					// ignore offset fields.
-					continue;
-				}
-
-				TagInfo tagInfo = srcField.tagInfo;
-				FieldType fieldType = srcField.fieldType;
-				int count = srcField.length;
-				//			byte bytes[] = srcField.fieldType.getRawBytes(srcField);
-
-				Object value = srcField.getValue();
-				byte bytes2[];
-				if (tagInfo.isDate())
-					bytes2 = fieldType.getRawBytes(srcField);
-				else
-					bytes2 = fieldType.writeData(value, byteOrder);
-				//			Debug.debug("\t" + "bytes2", bytes2);
-
-				TiffOutputField dstField = new TiffOutputField(srcField.tag,
-						tagInfo, fieldType, count, bytes2);
-				dstDir.add(dstField);
-			}
 
-			dstDir.setTiffImageData(getTiffImageData());
-			dstDir.setJpegImageData(getJpegImageData());
+				dstDir.setTiffImageData(getTiffImageData());
+				dstDir.setJpegImageData(getJpegImageData());
 
-			return dstDir;
+				return dstDir;
+			}
+			catch (ImageReadException e)
+			{
+				throw new ImageWriteException(e.getMessage(), e);
+			}
 		}
+
 	}
 
 	public ArrayList getDirectories()
@@ -195,6 +226,140 @@
 		}
 
 		return result;
+	}
+
+	public TiffField findField(TagInfo tagInfo) throws ImageReadException
+	{
+		ArrayList directories = getDirectories();
+		for (int i = 0; i < directories.size(); i++)
+		{
+			Directory directory = (Directory) directories.get(i);
+			TiffField field = directory.findField(tagInfo);
+			if (null != field)
+				return field;
+		}
+		return null;
+	}
+
+	public TiffDirectory findDirectory(int directoryType)
+	{
+		ArrayList directories = getDirectories();
+		for (int i = 0; i < directories.size(); i++)
+		{
+			Directory directory = (Directory) directories.get(i);
+			if (directory.type == directoryType)
+				return directory.directory;
+		}
+		return null;
+	}
+
+	public List getAllFields() throws ImageReadException
+	{
+		List result = new ArrayList();
+		ArrayList directories = getDirectories();
+		for (int i = 0; i < directories.size(); i++)
+		{
+			Directory directory = (Directory) directories.get(i);
+			result.addAll(directory.getAllFields());
+		}
+		return result;
+	}
+
+	public GPSInfo getGPS() throws ImageReadException
+	{
+		TiffDirectory gpsDirectory = findDirectory(DIRECTORY_TYPE_GPS);
+		if (null == gpsDirectory)
+			return null;
+
+		// more specific example of how to access GPS values.
+		TiffField latitudeRefField = gpsDirectory
+				.findField(TiffConstants.GPS_TAG_GPS_LATITUDE_REF);
+		TiffField latitudeField = gpsDirectory
+				.findField(TiffConstants.GPS_TAG_GPS_LATITUDE);
+		TiffField longitudeRefField = gpsDirectory
+				.findField(TiffConstants.GPS_TAG_GPS_LONGITUDE_REF);
+		TiffField longitudeField = gpsDirectory
+				.findField(TiffConstants.GPS_TAG_GPS_LONGITUDE);
+
+		if (latitudeRefField == null || latitudeField == null
+				|| longitudeRefField == null || longitudeField == null)
+			return null;
+
+		// all of these values are strings.
+		String latitudeRef = latitudeRefField.getStringValue();
+		RationalNumber latitude[] = (RationalNumber[]) latitudeField.getValue();
+		String longitudeRef = longitudeRefField.getStringValue();
+		RationalNumber longitude[] = (RationalNumber[]) longitudeField
+				.getValue();
+
+		if (latitude.length != 3 || longitude.length != 3)
+			throw new ImageReadException(
+					"Expected three values for latitude and longitude.");
+
+		RationalNumber latitudeDegrees = latitude[0];
+		RationalNumber latitudeMinutes = latitude[1];
+		RationalNumber latitudeSeconds = latitude[2];
+
+		RationalNumber longitudeDegrees = longitude[0];
+		RationalNumber longitudeMinutes = longitude[1];
+		RationalNumber longitudeSeconds = longitude[2];
+
+		return new GPSInfo(latitudeRef, longitudeRef, latitudeDegrees,
+				latitudeMinutes, latitudeSeconds, longitudeDegrees,
+				longitudeMinutes, longitudeSeconds);
+	}
+
+	public static class GPSInfo
+	{
+		public final String latitudeRef;
+		public final String longitudeRef;
+
+		public final RationalNumber latitudeDegrees;
+		public final RationalNumber latitudeMinutes;
+		public final RationalNumber latitudeSeconds;
+		public final RationalNumber longitudeDegrees;
+		public final RationalNumber longitudeMinutes;
+		public final RationalNumber longitudeSeconds;
+
+		public GPSInfo(final String latitudeRef, final String longitudeRef,
+				final RationalNumber latitudeDegrees,
+				final RationalNumber latitudeMinutes,
+				final RationalNumber latitudeSeconds,
+				final RationalNumber longitudeDegrees,
+				final RationalNumber longitudeMinutes,
+				final RationalNumber longitudeSeconds)
+		{
+			this.latitudeRef = latitudeRef;
+			this.longitudeRef = longitudeRef;
+			this.latitudeDegrees = latitudeDegrees;
+			this.latitudeMinutes = latitudeMinutes;
+			this.latitudeSeconds = latitudeSeconds;
+			this.longitudeDegrees = longitudeDegrees;
+			this.longitudeMinutes = longitudeMinutes;
+			this.longitudeSeconds = longitudeSeconds;
+		}
+
+		public String toString()
+		{
+			// This will format the gps info like so:
+			//
+			// latitude: 8 degrees, 40 minutes, 42.2 seconds S
+			// longitude: 115 degrees, 26 minutes, 21.8 seconds E
+
+			StringBuffer result = new StringBuffer();
+			result.append("[GPS. ");
+			result.append("Latitude: " + latitudeDegrees.toDisplayString()
+					+ " degrees, " + latitudeMinutes.toDisplayString()
+					+ " minutes, " + latitudeSeconds.toDisplayString()
+					+ " seconds " + latitudeRef);
+			result.append(", Longitude: " + longitudeDegrees.toDisplayString()
+					+ " degrees, " + longitudeMinutes.toDisplayString()
+					+ " minutes, " + longitudeSeconds.toDisplayString()
+					+ " seconds " + longitudeRef);
+			result.append("]");
+
+			return result.toString();
+		}
 	}
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageParser.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffImageParser.java Tue Jan 22 20:44:55 2008
@@ -152,13 +152,12 @@
 		return result;
 	}
 
-	public ImageInfo getImageInfo(ByteSource byteSource)
+	public ImageInfo getImageInfo(ByteSource byteSource, Map params)
 			throws ImageReadException, IOException
 	{
 		FormatCompliance formatCompliance = FormatCompliance.getDefault();
-		Map params = null;
-		TiffContents contents = new TiffReader().readFirstDirectory(byteSource,
-				params, false, formatCompliance);
+		TiffContents contents = new TiffReader().readDirectories(byteSource,
+				false, formatCompliance);
 		TiffDirectory directory = (TiffDirectory) contents.directories.get(0);
 
 		TiffField widthField = directory.findField(TIFF_TAG_IMAGE_WIDTH, true);
@@ -250,8 +249,7 @@
 		ImageFormat format = ImageFormat.IMAGE_FORMAT_TIFF;
 		String formatName = "TIFF Tag-based Image File Format";
 		String mimeType = "image/tiff";
-		// we ought to count images, but don't yet.
-		int numberOfImages = -1;
+		int numberOfImages = contents.directories.size();
 		// not accurate ... only reflects first
 		boolean isProgressive = false;
 		// is TIFF ever interlaced/progressive?
@@ -329,7 +327,8 @@
 
 			//		try
 			{
-				FormatCompliance formatCompliance = FormatCompliance.getDefault();
+				FormatCompliance formatCompliance = FormatCompliance
+						.getDefault();
 				Map params = null;
 				TiffContents contents = new TiffReader().readContents(
 						byteSource, params, formatCompliance);

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffReader.java Tue Jan 22 20:44:55 2008
@@ -128,14 +128,19 @@
 
 			ArrayList fields = new ArrayList();
 
-//						Debug.debug("dirType", dirType);
-//						Debug.debug("offset", offset);
-
+			//			Debug.debug();
+			//			Debug.debug("dirType", dirType);
+			//			Debug.debug("offset", offset);
+			//
+			//			if(offset>=byteSource.getLength())
+			//			{
+			//				Debug.debug("skipping invalid directory!");
+			//				return true;
+			//			}
 			int entryCount = read2Bytes("DirectoryEntryCount", is,
 					"Not a Valid TIFF File");
 
-//						Debug.debug("entryCount", entryCount);
-//						Debug.debug();
+			//			Debug.debug("entryCount", entryCount);
 
 			for (int i = 0; i < entryCount; i++)
 			{
@@ -154,6 +159,7 @@
 				//				{
 				TiffField field = new TiffField(tag, dirType, type, length,
 						valueOffset, valueOffsetBytes, getByteOrder());
+				field.setSortHint(i);
 
 				field.fillInValue(byteSource);
 
@@ -220,7 +226,7 @@
 					boolean subDirectoryRead = readDirectory(byteSource,
 							subDirectoryOffset, subDirectoryType,
 							formatCompliance, listener, true, visited);
-					
+
 					if (!subDirectoryRead)
 					{
 						// Offset field pointed to invalid location.  
@@ -238,7 +244,7 @@
 				readDirectory(byteSource, directory.nextDirectoryOffset,
 						dirType + 1, formatCompliance, listener, visited);
 			}
-			
+
 			return true;
 		}
 		finally
@@ -273,6 +279,21 @@
 		private TiffHeader tiffHeader = null;
 		private ArrayList directories = new ArrayList();
 		private ArrayList fields = new ArrayList();
+		private final boolean readThumbnails;
+
+		public Collector()
+		{
+			this(null);
+		}
+
+		public Collector(Map params)
+		{
+			boolean readThumbnails = true;
+			if (params != null && params.containsKey(PARAM_KEY_READ_THUMBNAILS))
+				readThumbnails = Boolean.TRUE.equals(params
+						.get(PARAM_KEY_READ_THUMBNAILS));
+			this.readThumbnails = readThumbnails;
+		}
 
 		public boolean setTiffHeader(TiffHeader tiffHeader)
 		{
@@ -294,7 +315,7 @@
 
 		public boolean readImageData()
 		{
-			return true;
+			return readThumbnails;
 		}
 
 		public boolean readOffsetDirectories()
@@ -329,6 +350,27 @@
 		}
 	}
 
+	private static class DirectoryCollector extends Collector
+	{
+		private final boolean readImageData;
+
+		public DirectoryCollector(final boolean readImageData)
+		{
+			this.readImageData = readImageData;
+		}
+
+		public boolean addDirectory(TiffDirectory directory)
+		{
+			super.addDirectory(directory);
+			return false;
+		}
+
+		public boolean readImageData()
+		{
+			return readImageData;
+		}
+	}
+
 	public TiffContents readFirstDirectory(ByteSource byteSource, Map params,
 			boolean readImageData, FormatCompliance formatCompliance)
 			throws ImageReadException, IOException
@@ -342,11 +384,25 @@
 		return contents;
 	}
 
+	public TiffContents readDirectories(ByteSource byteSource,
+			boolean readImageData, FormatCompliance formatCompliance)
+			throws ImageReadException, IOException
+	{
+		Collector collector = new FirstDirectoryCollector(readImageData);
+		readDirectories(byteSource, formatCompliance, collector);
+		TiffContents contents = collector.getContents();
+		if (contents.directories.size() < 1)
+			throw new ImageReadException(
+					"Image did not contain any directories.");
+		return contents;
+	}
+
 	public TiffContents readContents(ByteSource byteSource, Map params,
 			FormatCompliance formatCompliance) throws ImageReadException,
 			IOException
 	{
-		Collector collector = new Collector();
+
+		Collector collector = new Collector(params);
 		read(byteSource, params, formatCompliance, collector);
 		TiffContents contents = collector.getContents();
 		return contents;
@@ -405,8 +461,13 @@
 			TiffDirectory directory) throws ImageReadException, IOException
 	{
 		ImageDataElement element = directory.getJpegRawImageDataElement();
-		byte data[] = byteSource.getBlock(element.offset, element.length);
-		return new JpegImageData(element.offset, element.length, data);
+		int offset = element.offset;
+		int length = element.length;
+		// Sony DCR-PC110 has an off-by-one error.
+		if (offset + length == byteSource.getLength() + 1)
+			length--;
+		byte data[] = byteSource.getBlock(offset, length);
+		return new JpegImageData(offset, length, data);
 	}
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/ExifTagConstants.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/ExifTagConstants.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/ExifTagConstants.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/ExifTagConstants.java Tue Jan 22 20:44:55 2008
@@ -125,13 +125,13 @@
 	public static final TagInfo EXIF_TAG_MODEL = new TagInfo("Model", 0x0110,
 			FIELD_TYPE_ASCII, 1, EXIF_DIRECTORY_IFD0);
 	// poly tag public static final TagInfo2 EXIF_TAG_STRIP_OFFSETS = new TagInfo2( "StripOffsets", 0x0111, FIELD_TYPE_DESCRIPTION_UNKNOWN, 1, EXIF_DIRECTORY_UNKNOWN);
-	public static final TagInfo EXIF_TAG_PREVIEW_IMAGE_START_IFD0 = new TagInfo(
+	public static final TagInfo EXIF_TAG_PREVIEW_IMAGE_START_IFD0 = new TagInfo.Offset(
 			"Preview Image Start", 0x0111, FIELD_TYPE_LONG, 1,
 			EXIF_DIRECTORY_IFD0);
-	public static final TagInfo EXIF_TAG_PREVIEW_IMAGE_START_SUB_IFD1 = new TagInfo(
+	public static final TagInfo EXIF_TAG_PREVIEW_IMAGE_START_SUB_IFD1 = new TagInfo.Offset(
 			"Preview Image Start", 0x0111, FIELD_TYPE_LONG, 1,
 			EXIF_DIRECTORY_SUB_IFD1);
-	public static final TagInfo EXIF_TAG_JPG_FROM_RAW_START_SUB_IFD2 = new TagInfo(
+	public static final TagInfo EXIF_TAG_JPG_FROM_RAW_START_SUB_IFD2 = new TagInfo.Offset(
 			"Jpg From Raw Start", 0x0111, FIELD_TYPE_LONG, 1,
 			EXIF_DIRECTORY_SUB_IFD2);
 	public static final TagInfo EXIF_TAG_ORIENTATION = new TagInfo(
@@ -352,13 +352,13 @@
 	public static final TagInfo EXIF_TAG_PREVIEW_IMAGE_START_MAKER_NOTES = new TagInfo(
 			"Preview Image Start", 0x0201, FIELD_TYPE_LONG, 1,
 			EXIF_DIRECTORY_MAKER_NOTES);
-	public static final TagInfo EXIF_TAG_JPG_FROM_RAW_START_SUB_IFD = new TagInfo(
+	public static final TagInfo EXIF_TAG_JPG_FROM_RAW_START_SUB_IFD = new TagInfo.Offset(
 			"Jpg From Raw Start", 0x0201, FIELD_TYPE_LONG, 1,
 			EXIF_DIRECTORY_SUB_IFD);
-	public static final TagInfo EXIF_TAG_JPG_FROM_RAW_START_IFD2 = new TagInfo(
+	public static final TagInfo EXIF_TAG_JPG_FROM_RAW_START_IFD2 = new TagInfo.Offset(
 			"Jpg From Raw Start", 0x0201, FIELD_TYPE_LONG, 1,
 			EXIF_DIRECTORY_IFD2);
-	public static final TagInfo EXIF_TAG_OTHER_IMAGE_START = new TagInfo(
+	public static final TagInfo EXIF_TAG_OTHER_IMAGE_START = new TagInfo.Offset(
 			"Other Image Start", 0x0201, FIELD_TYPE_DESCRIPTION_UNKNOWN, 1,
 			EXIF_DIRECTORY_UNKNOWN);
 	// poly tag public static final TagInfo2 EXIF_TAG_THUMBNAIL_LENGTH = new TagInfo2( "ThumbnailLength", 0x0202, FIELD_TYPE_LONG, 1, EXIF_DIRECTORY_IFD1);
@@ -759,7 +759,12 @@
 	public static final int SENSING_METHOD_VALUE_COLOR_SEQUENTIAL_LINEAR = 8;
 	public static final TagInfo EXIF_TAG_STO_NITS = new TagInfo("Sto Nits",
 			0x923f, FIELD_TYPE_DESCRIPTION_UNKNOWN, 1, EXIF_DIRECTORY_UNKNOWN);
-	// skipping Maker Note! public static final TagInfo2 EXIF_TAG_USER_COMMENT = new TagInfo2( "UserComment", 0x9286, FIELD_TYPE_UNDEFINED, 1, EXIF_DIRECTORY_EXIF_IFD);
+	//	 skipping Maker Note! 
+	public static final TagInfo EXIF_TAG_MAKER_NOTE = new TagInfo("Maker Note",
+			0x927c, FIELD_TYPE_UNDEFINED, 1, EXIF_DIRECTORY_EXIF_IFD);
+	public static final TagInfo EXIF_TAG_USER_COMMENT = new TagInfo.Text(
+			"UserComment", 0x9286, FIELD_TYPE_UNDEFINED, 1,
+			EXIF_DIRECTORY_EXIF_IFD);
 	public static final TagInfo EXIF_TAG_SUB_SEC_TIME = new TagInfo(
 			"Sub Sec Time", 0x9290, FIELD_TYPE_ASCII, 1,
 			EXIF_DIRECTORY_EXIF_IFD);
@@ -1464,5 +1469,9 @@
 			EXIF_TAG_SHADOWS, EXIF_TAG_BRIGHTNESS, EXIF_TAG_CONTRAST_2,
 			EXIF_TAG_SATURATION_2, EXIF_TAG_SHARPNESS_2, EXIF_TAG_SMOOTHNESS,
 			EXIF_TAG_MOIRE_FILTER,
+
+			EXIF_TAG_USER_COMMENT, //
+
+			EXIF_TAG_MAKER_NOTE, //
 	};
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/GPSTagConstants.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/GPSTagConstants.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/GPSTagConstants.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/GPSTagConstants.java Tue Jan 22 20:44:55 2008
@@ -178,12 +178,12 @@
 			EXIF_DIRECTORY_GPS);
 
 	// ************************************************************
-	public static final TagInfo GPS_TAG_GPS_PROCESSING_METHOD = new TagInfo(
+	public static final TagInfo GPS_TAG_GPS_PROCESSING_METHOD = new TagInfo.Text(
 			"GPS Processing Method", 0x001b, FIELD_TYPE_DESCRIPTION_UNKNOWN,
 			-1, EXIF_DIRECTORY_GPS);
 
 	// ************************************************************
-	public static final TagInfo GPS_TAG_GPS_AREA_INFORMATION = new TagInfo(
+	public static final TagInfo GPS_TAG_GPS_AREA_INFORMATION = new TagInfo.Text(
 			"GPS Area Information", 0x001c, FIELD_TYPE_DESCRIPTION_UNKNOWN, -1,
 			EXIF_DIRECTORY_GPS);
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagConstantsUtils.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagConstantsUtils.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagConstantsUtils.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagConstantsUtils.java Tue Jan 22 20:44:55 2008
@@ -16,7 +16,6 @@
  */
 package org.apache.sanselan.formats.tiff.constants;
 
-
 public class TagConstantsUtils implements TiffDirectoryConstants
 {
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TagInfo.java Tue Jan 22 20:44:55 2008
@@ -3,14 +3,18 @@
  */
 package org.apache.sanselan.formats.tiff.constants;
 
+import java.io.UnsupportedEncodingException;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
 
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.ImageWriteException;
+import org.apache.sanselan.common.BinaryFileFunctions;
 import org.apache.sanselan.formats.tiff.TiffField;
 import org.apache.sanselan.formats.tiff.fieldtypes.FieldType;
 import org.apache.sanselan.util.Debug;
 
-public class TagInfo implements TiffDirectoryConstants
+public class TagInfo implements TiffDirectoryConstants, TiffFieldTypeConstants
 {
 	protected static final int LENGTH_UNKNOWN = -1;
 
@@ -53,11 +57,12 @@
 	{
 		this(name, tag, dataTypes, length, EXIF_DIRECTORY_UNKNOWN);
 	}
+
 	public final String name;
 	public final int tag;
 	public final FieldType dataTypes[];
 	public final int length;
-	public final ExifDirectoryType exifDirectory;
+	public final ExifDirectoryType directoryType;
 
 	//	public final String lengthDescription;
 
@@ -71,15 +76,21 @@
 		this.dataTypes = dataTypes;
 		this.length = length;
 		//		this.lengthDescription = lengthDescription;
-		this.exifDirectory = exifDirectory;
+		this.directoryType = exifDirectory;
 	}
 
-	public Object getValue(TiffField entry)
+	public Object getValue(TiffField entry) throws ImageReadException
 	{
 		Object o = entry.fieldType.getSimpleValue(entry);
 		return o;
 	}
 
+	public byte[] encodeValue(FieldType fieldType, Object value, int byteOrder)
+			throws ImageWriteException
+	{
+		return fieldType.writeData(value, byteOrder);
+	}
+
 	public String getDescription()
 	{
 		return tag + " (0x" + Integer.toHexString(tag) + ": " + name + "): ";
@@ -101,6 +112,16 @@
 		return false;
 	}
 
+	public boolean isText()
+	{
+		return false;
+	}
+
+	public boolean isUnknown()
+	{
+		return false;
+	}
+
 	public static class Offset extends TagInfo
 	{
 		public Offset(String name, int tag, FieldType dataTypes[], int length,
@@ -108,6 +129,11 @@
 		{
 			super(name, tag, dataTypes, length, exifDirectory);
 		}
+		public Offset(String name, int tag, FieldType dataType, int length,
+				ExifDirectoryType exifDirectory)
+		{
+			super(name, tag, dataType, length, exifDirectory);
+		}
 
 		public Offset(String name, int tag, FieldType dataType, int length)
 		{
@@ -134,7 +160,7 @@
 		private static final DateFormat DATE_FORMAT_2 = new SimpleDateFormat(
 				"yyyy:MM:dd:HH:mm:ss");
 
-		public Object getValue(TiffField entry)
+		public Object getValue(TiffField entry) throws ImageReadException
 		{
 			Object o = entry.fieldType.getSimpleValue(entry);
 
@@ -161,6 +187,21 @@
 			return o;
 		}
 
+		public byte[] encodeValue(FieldType fieldType, Object value,
+				int byteOrder) throws ImageWriteException
+		{
+			throw new ImageWriteException("date encode value: " + value + " ("
+					+ Debug.getType(value) + ")");
+			//			return fieldType.writeData(value, byteOrder);
+			//			Object o = entry.fieldType.getSimpleValue(entry);
+			//			byte bytes2[];
+			//			if (tagInfo.isDate())
+			//				bytes2 = fieldType.getRawBytes(srcField);
+			//			else
+			//				bytes2 = fieldType.writeData(value, byteOrder);
+			//			return o;
+		}
+
 		public String toString()
 		{
 			return "[TagInfo. tag: " + tag + ", name: " + name + " (data)"
@@ -174,4 +215,218 @@
 		}
 
 	}
+
+	public static final class Text extends TagInfo
+	{
+		public Text(String name, int tag, FieldType dataType, int length,
+				ExifDirectoryType exifDirectory)
+		{
+			super(name, tag, dataType, length, exifDirectory);
+		}
+
+		public Text(String name, int tag, FieldType dataTypes[], int length,
+				ExifDirectoryType exifDirectory)
+		{
+			super(name, tag, dataTypes, length, exifDirectory);
+		}
+
+		public boolean isText()
+		{
+			return true;
+		}
+
+		private static final class TextEncoding
+		{
+			public final byte prefix[];
+			public final String encodingName;
+
+			public TextEncoding(final byte[] prefix, final String encodingName)
+			{
+				this.prefix = prefix;
+				this.encodingName = encodingName;
+			}
+		}
+
+		private static final TextEncoding TEXT_ENCODING_ASCII = new TextEncoding(
+				new byte[]{
+						0x41, 0x53, 0x43, 0x49, 0x49, 0x00, 0x00, 0x00,
+				}, "US-ASCII"); // ITU-T T.50 IA5
+		private static final TextEncoding TEXT_ENCODING_JIS = new TextEncoding(
+				new byte[]{
+						0x4A, 0x49, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00,
+				}, "JIS"); // JIS X208-1990
+		private static final TextEncoding TEXT_ENCODING_UNICODE = new TextEncoding(
+				new byte[]{
+						0x55, 0x4E, 0x49, 0x43, 0x4F, 0x44, 0x45, 0x00,
+				// Which Unicode encoding to use, UTF-8?  
+				}, "UTF-8"); // Unicode Standard
+		private static final TextEncoding TEXT_ENCODING_UNDEFINED = new TextEncoding(
+				new byte[]{
+						0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+				// Try to interpret an undefined text as ISO-8859-1 (Latin)
+				}, "ISO-8859-1"); // Undefined
+		private static final TextEncoding TEXT_ENCODINGS[] = {
+				TEXT_ENCODING_ASCII, //
+				TEXT_ENCODING_JIS, //
+				TEXT_ENCODING_UNICODE, //
+				TEXT_ENCODING_UNDEFINED, //
+		};
+
+		public byte[] encodeValue(FieldType fieldType, Object value,
+				int byteOrder) throws ImageWriteException
+		{
+			if (!(value instanceof String))
+				throw new ImageWriteException("Text value not String: " + value
+						+ " (" + Debug.getType(value) + ")");
+			String s = (String) value;
+
+			try
+			{
+				// try ASCII, with NO prefix.
+				byte asciiBytes[] = s
+						.getBytes(TEXT_ENCODING_ASCII.encodingName);
+				String decodedAscii = new String(asciiBytes,
+						TEXT_ENCODING_ASCII.encodingName);
+				if (decodedAscii.equals(s))
+				{
+					// no unicode/non-ascii values.
+					byte result[] = new byte[asciiBytes.length
+							+ TEXT_ENCODING_ASCII.prefix.length];
+					System.arraycopy(TEXT_ENCODING_ASCII.prefix, 0, result, 0,
+							TEXT_ENCODING_ASCII.prefix.length);
+					System.arraycopy(asciiBytes, 0, result,
+							TEXT_ENCODING_ASCII.prefix.length,
+							asciiBytes.length);
+					return result;
+				}
+				else
+				{
+					// use unicode
+					byte unicodeBytes[] = s
+							.getBytes(TEXT_ENCODING_UNICODE.encodingName);
+					byte result[] = new byte[unicodeBytes.length
+							+ TEXT_ENCODING_UNICODE.prefix.length];
+					System.arraycopy(TEXT_ENCODING_UNICODE.prefix, 0, result,
+							0, TEXT_ENCODING_UNICODE.prefix.length);
+					System.arraycopy(unicodeBytes, 0, result,
+							TEXT_ENCODING_UNICODE.prefix.length,
+							unicodeBytes.length);
+					return result;
+				}
+			}
+			catch (UnsupportedEncodingException e)
+			{
+				throw new ImageWriteException(e.getMessage(), e);
+			}
+		}
+
+		public Object getValue(TiffField entry) throws ImageReadException
+		{
+			//			Debug.debug("entry.type", entry.type);
+			//			Debug.debug("entry.type", entry.getDescriptionWithoutValue());
+			//			Debug.debug("entry.type", entry.fieldType);
+
+			if (entry.type == FIELD_TYPE_ASCII.type)
+				return FIELD_TYPE_ASCII.getSimpleValue(entry);
+			else if (entry.type == FIELD_TYPE_UNDEFINED.type)
+				;
+			else if (entry.type == FIELD_TYPE_BYTE.type)
+				;
+			else
+			{
+				Debug.debug("entry.type", entry.type);
+				Debug.debug("entry.directoryType", entry.directoryType);
+				Debug.debug("entry.type", entry.getDescriptionWithoutValue());
+				Debug.debug("entry.type", entry.fieldType);
+				throw new ImageReadException("Text field not encoded as bytes.");
+			}
+
+			byte bytes[] = entry.fieldType.getRawBytes(entry);
+			if (bytes.length < 8)
+			{
+				try
+				{
+					// try ASCII, with NO prefix.
+					return new String(bytes, "US-ASCII");
+				}
+				catch (UnsupportedEncodingException e)
+				{
+					throw new ImageReadException(
+							"Text field missing encoding prefix.");
+				}
+			}
+
+			for (int i = 0; i < TEXT_ENCODINGS.length; i++)
+			{
+				TextEncoding encoding = TEXT_ENCODINGS[i];
+				if (BinaryFileFunctions.compareBytes(bytes, 0, encoding.prefix,
+						0, encoding.prefix.length))
+				{
+					try
+					{
+						//						Debug.debug("encodingName", encoding.encodingName);
+						return new String(bytes, encoding.prefix.length,
+								bytes.length - encoding.prefix.length,
+								encoding.encodingName);
+					}
+					catch (UnsupportedEncodingException e)
+					{
+						throw new ImageReadException(e.getMessage(), e);
+					}
+				}
+			}
+
+			//						Debug.debug("entry.tag", entry.tag + " (0x" + Integer.toHexString(entry.tag ) +")");
+			//						Debug.debug("entry.type", entry.type);
+			//						Debug.debug("bytes", bytes, 10);
+			//			throw new ImageReadException(
+			//					"Unknown Text encoding prefix.");
+
+			try
+			{
+				// try ASCII, with NO prefix.
+				return new String(bytes, "US-ASCII");
+			}
+			catch (UnsupportedEncodingException e)
+			{
+				throw new ImageReadException("Unknown text encoding prefix.");
+			}
+
+		}
+	}
+
+	public static final class Unknown extends TagInfo
+	{
+
+		public Unknown(String name, int tag, FieldType dataTypes[], int length,
+				ExifDirectoryType exifDirectory)
+		{
+			super(name, tag, dataTypes, length, exifDirectory);
+		}
+
+		public boolean isUnknown()
+		{
+			return true;
+		}
+
+		public byte[] encodeValue(FieldType fieldType, Object value,
+				int byteOrder) throws ImageWriteException
+		{
+//			Debug.debug();
+//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag) + ") ",
+//					this);
+//			Debug.debug("unknown tag fieldType", fieldType);
+//			Debug.debug("unknown tag value", value);
+//			Debug.debug("unknown tag value", Debug.getType(value));
+			byte result[] = super.encodeValue(fieldType, value, byteOrder);
+//			Debug.debug("unknown tag result", result);
+			return result;
+		}
+
+		public Object getValue(TiffField entry) throws ImageReadException
+		{
+			return super.getValue(entry);
+		}
+	}
+
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffDirectoryConstants.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffDirectoryConstants.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffDirectoryConstants.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffDirectoryConstants.java Tue Jan 22 20:44:55 2008
@@ -37,7 +37,7 @@
 	public static final int DIRECTORY_TYPE_DIR_3 = 3;
 	public static final int DIRECTORY_TYPE_DIR_4 = 4;
 
-	public static class ExifDirectoryType
+	public abstract static class ExifDirectoryType
 	{
 		public final int directoryType;
 		public final String name;
@@ -47,38 +47,69 @@
 			this.directoryType = directoryType;
 			this.name = name;
 		}
+
+		public abstract boolean isImageDirectory();
+
+		public static class Image extends ExifDirectoryType
+		{
+			public Image(final int directoryType, final String name)
+			{
+				super(directoryType, name);
+			}
+
+			public boolean isImageDirectory()
+			{
+				return true;
+			}
+		}
+
+		public static class Special extends ExifDirectoryType
+		{
+			public Special(final int directoryType, final String name)
+			{
+				super(directoryType, name);
+			}
+
+			public boolean isImageDirectory()
+			{
+				return false;
+			}
+		}
+
 	}
 
-	public static final ExifDirectoryType TIFF_DIRECTORY_ROOT = new ExifDirectoryType(
-			DIRECTORY_TYPE_ROOT, "Root");
-	public static final ExifDirectoryType EXIF_DIRECTORY_EXIF_IFD = new ExifDirectoryType(
-			DIRECTORY_TYPE_EXIF, "Exif IFD");
-	public static final ExifDirectoryType TIFF_DIRECTORY_IFD0 = new ExifDirectoryType(
-			DIRECTORY_TYPE_DIR_0, "IFD0");
-	public static final ExifDirectoryType EXIF_DIRECTORY_IFD0 = new ExifDirectoryType(
+	public static final ExifDirectoryType TIFF_DIRECTORY_IFD0 = new ExifDirectoryType.Image(
 			DIRECTORY_TYPE_DIR_0, "IFD0");
-	public static final ExifDirectoryType TIFF_DIRECTORY_IFD1 = new ExifDirectoryType(
-			DIRECTORY_TYPE_DIR_1, "IFD1");
-	public static final ExifDirectoryType EXIF_DIRECTORY_IFD1 = new ExifDirectoryType(
+	public static final ExifDirectoryType EXIF_DIRECTORY_IFD0 = TIFF_DIRECTORY_IFD0;
+	public static final ExifDirectoryType TIFF_DIRECTORY_ROOT = TIFF_DIRECTORY_IFD0;
+
+	public static final ExifDirectoryType TIFF_DIRECTORY_IFD1 = new ExifDirectoryType.Image(
 			DIRECTORY_TYPE_DIR_1, "IFD1");
-	public static final ExifDirectoryType TIFF_DIRECTORY_IFD2 = new ExifDirectoryType(
-			DIRECTORY_TYPE_DIR_2, "IFD2");
-	public static final ExifDirectoryType EXIF_DIRECTORY_IFD2 = new ExifDirectoryType(
+	public static final ExifDirectoryType EXIF_DIRECTORY_IFD1 = TIFF_DIRECTORY_IFD1;
+
+	public static final ExifDirectoryType TIFF_DIRECTORY_IFD2 = new ExifDirectoryType.Image(
 			DIRECTORY_TYPE_DIR_2, "IFD2");
-	public static final ExifDirectoryType EXIF_DIRECTORY_INTEROP_IFD = new ExifDirectoryType(
+	public static final ExifDirectoryType EXIF_DIRECTORY_IFD2 = TIFF_DIRECTORY_IFD2;
+
+	public static final ExifDirectoryType TIFF_DIRECTORY_IFD3 = new ExifDirectoryType.Image(
+			DIRECTORY_TYPE_DIR_3, "IFD3");
+	public static final ExifDirectoryType EXIF_DIRECTORY_IFD3 = TIFF_DIRECTORY_IFD3;
+
+	public static final ExifDirectoryType EXIF_DIRECTORY_SUB_IFD = TIFF_DIRECTORY_IFD1;
+	public static final ExifDirectoryType EXIF_DIRECTORY_SUB_IFD1 = TIFF_DIRECTORY_IFD2;
+	public static final ExifDirectoryType EXIF_DIRECTORY_SUB_IFD2 = TIFF_DIRECTORY_IFD3;
+
+	public static final ExifDirectoryType EXIF_DIRECTORY_INTEROP_IFD = new ExifDirectoryType.Special(
 			DIRECTORY_TYPE_INTEROPERABILITY, "Interop IFD");
-	public static final ExifDirectoryType EXIF_DIRECTORY_MAKER_NOTES = new ExifDirectoryType(
+	public static final ExifDirectoryType EXIF_DIRECTORY_MAKER_NOTES = new ExifDirectoryType.Special(
 			DIRECTORY_TYPE_MAKER_NOTES, "Maker Notes");
-	public static final ExifDirectoryType EXIF_DIRECTORY_SUB_IFD = new ExifDirectoryType(
-			DIRECTORY_TYPE_SUB, "Sub IFD");
-	public static final ExifDirectoryType EXIF_DIRECTORY_SUB_IFD1 = new ExifDirectoryType(
-			DIRECTORY_TYPE_SUB1, "Sub IFD1");
-	public static final ExifDirectoryType EXIF_DIRECTORY_SUB_IFD2 = new ExifDirectoryType(
-			DIRECTORY_TYPE_SUB2, "Sub IFD2");
-	public static final ExifDirectoryType EXIF_DIRECTORY_UNKNOWN = null;
-	public static final ExifDirectoryType EXIF_DIRECTORY_GPS = new ExifDirectoryType(
+	public static final ExifDirectoryType EXIF_DIRECTORY_EXIF_IFD = new ExifDirectoryType.Special(
+			DIRECTORY_TYPE_EXIF, "Exif IFD");
+	public static final ExifDirectoryType EXIF_DIRECTORY_GPS = new ExifDirectoryType.Special(
 			DIRECTORY_TYPE_GPS, "GPS IFD");
 
+	public static final ExifDirectoryType EXIF_DIRECTORY_UNKNOWN = null;
+
 	public static final ExifDirectoryType EXIF_DIRECTORIES[] = {
 			TIFF_DIRECTORY_ROOT, EXIF_DIRECTORY_EXIF_IFD, TIFF_DIRECTORY_IFD0,
 			EXIF_DIRECTORY_IFD0, TIFF_DIRECTORY_IFD1, EXIF_DIRECTORY_IFD1,
@@ -86,8 +117,8 @@
 			EXIF_DIRECTORY_INTEROP_IFD, EXIF_DIRECTORY_MAKER_NOTES,
 			EXIF_DIRECTORY_SUB_IFD, EXIF_DIRECTORY_SUB_IFD1,
 			EXIF_DIRECTORY_SUB_IFD2,
-//EXIF_DIRECTORY_UNKNOWN,
+			//EXIF_DIRECTORY_UNKNOWN,
 			EXIF_DIRECTORY_GPS,
 	};
-	
+
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffTagConstants.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffTagConstants.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffTagConstants.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/constants/TiffTagConstants.java Tue Jan 22 20:44:55 2008
@@ -301,9 +301,9 @@
 
 	// TODO:
 	//	public static final TagInfo2 TIFF_TAG_UNKNOWN = null;
-	public static final TagInfo TIFF_TAG_UNKNOWN = new TagInfo("Unknown Tag",
-			-1, FIELD_TYPE_DESCRIPTION_UNKNOWN, TagInfo.LENGTH_UNKNOWN,
-			EXIF_DIRECTORY_UNKNOWN);
+	public static final TagInfo TIFF_TAG_UNKNOWN = new TagInfo.Unknown(
+			"Unknown Tag", -1, FIELD_TYPE_DESCRIPTION_UNKNOWN,
+			TagInfo.LENGTH_UNKNOWN, EXIF_DIRECTORY_UNKNOWN);
 
 	public static final TagInfo ALL_TIFF_TAGS[] = {
 			TIFF_TAG_NEW_SUBFILE_TYPE, TIFF_TAG_SUBFILE_TYPE,

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReader.java Tue Jan 22 20:44:55 2008
@@ -48,7 +48,7 @@
 		last = new int[samplesPerPixel];
 	}
 
-//	public abstract void readImageData(BufferedImage bi, ByteSource byteSource)
+	//	public abstract void readImageData(BufferedImage bi, ByteSource byteSource)
 	public abstract void readImageData(BufferedImage bi)
 			throws ImageReadException, IOException;
 
@@ -117,8 +117,7 @@
 
 				myLzwDecompressor.setTiffLZWMode();
 
-				byte[] result = myLzwDecompressor
-						.decompress(is, expected_size);
+				byte[] result = myLzwDecompressor.decompress(is, expected_size);
 
 				return result;
 			}

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/datareaders/DataReaderTiled.java Tue Jan 22 20:44:55 2008
@@ -41,12 +41,10 @@
 
 	public DataReaderTiled(PhotometricInterpreter photometricInterpreter,
 			int tileWidth, int tileLength, int bitsPerPixel,
-			int bitsPerSample[], int predictor, int samplesPerPixel,
-			int width, int height, int compression,
-			TiffImageData.Tiles imageData)
+			int bitsPerSample[], int predictor, int samplesPerPixel, int width,
+			int height, int compression, TiffImageData.Tiles imageData)
 	{
-		super(photometricInterpreter, bitsPerSample, predictor,
-				samplesPerPixel);
+		super(photometricInterpreter, bitsPerSample, predictor, samplesPerPixel);
 
 		this.tileWidth = tileWidth;
 		this.tileLength = tileLength;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldType.java Tue Jan 22 20:44:55 2008
@@ -16,6 +16,7 @@
  */
 package org.apache.sanselan.formats.tiff.fieldtypes;
 
+import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.common.BinaryFileFunctions;
 import org.apache.sanselan.formats.tiff.TiffField;
@@ -40,6 +41,14 @@
 		return ((length > 0) && ((length * entry.length) <= TIFF_ENTRY_MAX_VALUE_LENGTH));
 	}
 
+	public int getBytesLength(TiffField entry) throws ImageReadException
+	{
+		if (length < 1)
+			throw new ImageReadException("Unknown field type");
+
+		return length * entry.length;
+	}
+
 	//	public static final byte[] STUB_LOCAL_VALUE  = new byte[TIFF_ENTRY_MAX_VALUE_LENGTH];
 
 	public static final byte[] getStubLocalValue()
@@ -52,7 +61,7 @@
 		return new byte[count * length];
 	}
 
-	public String getDisplayValue(TiffField entry)
+	public String getDisplayValue(TiffField entry) throws ImageReadException
 	{
 		Object o = getSimpleValue(entry);
 		if (o == null)
@@ -73,7 +82,8 @@
 		return entry.oversizeValue;
 	}
 
-	public abstract Object getSimpleValue(TiffField entry);
+	public abstract Object getSimpleValue(TiffField entry)
+			throws ImageReadException;
 
 	//	public final Object getSimpleValue(TiffField entry)
 	//	{

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeByte.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeByte.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeByte.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeByte.java Tue Jan 22 20:44:55 2008
@@ -16,7 +16,9 @@
  */
 package org.apache.sanselan.formats.tiff.fieldtypes;
 
+import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.util.Debug;
 
 public class FieldTypeByte extends FieldType
 {
@@ -33,13 +35,17 @@
 		return getRawBytes(entry);
 	}
 
-	public byte[] writeData(Object o, int byteOrder)
+	public byte[] writeData(Object o, int byteOrder) throws ImageWriteException
 	{
 		if (o instanceof Byte)
 			return new byte[]{
 				((Byte) o).byteValue(),
 			};
-
-		return (byte[]) o;
+		else if (o instanceof byte[])
+			return (byte[]) o;
+		else
+			throw new ImageWriteException("Invalid data: " + o + " ("
+					+ Debug.getType(o) + ")");
 	}
+
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeDouble.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeDouble.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeDouble.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeDouble.java Tue Jan 22 20:44:55 2008
@@ -18,6 +18,7 @@
 
 import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.util.Debug;
 
 public class FieldTypeDouble extends FieldType
 {
@@ -36,7 +37,22 @@
 		if (o instanceof Double)
 			return convertDoubleToByteArray(((Double) o).doubleValue(),
 					byteOrder);
-
-		return convertDoubleArrayToByteArray((double[]) o, byteOrder);
+		else if (o instanceof double[])
+		{
+			double numbers[] = (double[]) o;
+			return convertDoubleArrayToByteArray(numbers, byteOrder);
+		}
+		else if (o instanceof Double[])
+		{
+			Double numbers[] = (Double[]) o;
+			double values[] = new double[numbers.length];
+			for (int i = 0; i < values.length; i++)
+				values[i] = numbers[i].doubleValue();
+			return convertDoubleArrayToByteArray(values, byteOrder);
+		}
+		else
+			throw new ImageWriteException("Invalid data: " + o + " ("
+					+ Debug.getType(o) + ")");
 	}
+
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeFloat.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeFloat.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeFloat.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeFloat.java Tue Jan 22 20:44:55 2008
@@ -18,6 +18,7 @@
 
 import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.util.Debug;
 
 public class FieldTypeFloat extends FieldType
 {
@@ -43,25 +44,22 @@
 	{
 		if (o instanceof Float)
 			return convertFloatToByteArray(((Float) o).floatValue(), byteOrder);
-
-		return convertFloatArrayToByteArray((float[]) o, byteOrder);
+		else if (o instanceof float[])
+		{
+			float numbers[] = (float[]) o;
+			return convertFloatArrayToByteArray(numbers, byteOrder);
+		}
+		else if (o instanceof Float[])
+		{
+			Float numbers[] = (Float[]) o;
+			float values[] = new float[numbers.length];
+			for (int i = 0; i < values.length; i++)
+				values[i] = numbers[i].floatValue();
+			return convertFloatArrayToByteArray(values, byteOrder);
+		}
+		else
+			throw new ImageWriteException("Invalid data: " + o + " ("
+					+ Debug.getType(o) + ")");
 	}
-
-	//	public byte[] writeData(Object o, float byteOrder)
-	//	{
-	//		if (o instanceof Float)
-	//			return writeData(new float[]{
-	//				((Float) o).floatValue(),
-	//			}, byteOrder);
-	//
-	//		return writeData((float[]) o, byteOrder);
-	//	}
-	//	
-	//	
-	//	
-	//	public byte[] writeData(float values[], int byteOrder)
-	//	{
-	//		return convertIntArrayToByteArray(values, byteOrder);
-	//	}
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeLong.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeLong.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeLong.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeLong.java Tue Jan 22 20:44:55 2008
@@ -16,7 +16,9 @@
  */
 package org.apache.sanselan.formats.tiff.fieldtypes;
 
+import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.util.Debug;
 
 public class FieldTypeLong extends FieldType
 {
@@ -36,18 +38,28 @@
 				+ ")", getRawBytes(entry), 0, entry.length, entry.byteOrder);
 	}
 
-	public byte[] writeData(Object o, int byteOrder)
+	public byte[] writeData(Object o, int byteOrder) throws ImageWriteException
 	{
 		if (o instanceof Integer)
-			return writeData(new int[]{
+			return convertIntArrayToByteArray(new int[]{
 				((Integer) o).intValue(),
 			}, byteOrder);
-
-		return writeData((int[]) o, byteOrder);
+		else if (o instanceof int[])
+		{
+			int numbers[] = (int[]) o;
+			return convertIntArrayToByteArray(numbers, byteOrder);
+		}
+		else if (o instanceof Integer[])
+		{
+			Integer numbers[] = (Integer[]) o;
+			int values[] = new int[numbers.length];
+			for (int i = 0; i < values.length; i++)
+				values[i] = numbers[i].intValue();
+			return convertIntArrayToByteArray(values, byteOrder);
+		}
+		else
+			throw new ImageWriteException("Invalid data: " + o + " ("
+					+ Debug.getType(o) + ")");
 	}
 
-	public byte[] writeData(int values[], int byteOrder)
-	{
-		return convertIntArrayToByteArray(values, byteOrder);
-	}
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeRational.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeRational.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeRational.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeRational.java Tue Jan 22 20:44:55 2008
@@ -20,6 +20,7 @@
 import org.apache.sanselan.common.RationalNumber;
 import org.apache.sanselan.common.RationalNumberUtilities;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.util.Debug;
 
 public class FieldTypeRational extends FieldType
 {
@@ -42,13 +43,45 @@
 	{
 		if (o instanceof RationalNumber)
 			return convertRationalToByteArray((RationalNumber) o, byteOrder);
+		else if (o instanceof RationalNumber[])
+		{
+			return convertRationalArrayToByteArray((RationalNumber[]) o,
+					byteOrder);
+		}
 		else if (o instanceof Number)
 		{
 			Number number = (Number) o;
-			RationalNumber rationalNumber = RationalNumberUtilities.getRationalNumber(number.doubleValue());
+			RationalNumber rationalNumber = RationalNumberUtilities
+					.getRationalNumber(number.doubleValue());
 			return convertRationalToByteArray(rationalNumber, byteOrder);
 		}
-		return convertRationalArrayToByteArray((RationalNumber[]) o, byteOrder);
+		else if (o instanceof Number[])
+		{
+			Number numbers[] = (Number[]) o;
+			RationalNumber rationalNumbers[] = new RationalNumber[numbers.length];
+			for (int i = 0; i < numbers.length; i++)
+			{
+				Number number = numbers[i];
+				rationalNumbers[i] = RationalNumberUtilities
+						.getRationalNumber(number.doubleValue());
+			}
+			return convertRationalArrayToByteArray(rationalNumbers, byteOrder);
+		}
+		else if (o instanceof double[])
+		{
+			double numbers[] = (double[]) o;
+			RationalNumber rationalNumbers[] = new RationalNumber[numbers.length];
+			for (int i = 0; i < numbers.length; i++)
+			{
+				double number = numbers[i];
+				rationalNumbers[i] = RationalNumberUtilities
+						.getRationalNumber(number);
+			}
+			return convertRationalArrayToByteArray(rationalNumbers, byteOrder);
+		}
+		else
+			throw new ImageWriteException("Invalid data: " + o + " ("
+					+ Debug.getType(o) + ")");
 	}
 
 	public byte[] writeData(int numerator, int denominator, int byteOrder)

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeShort.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeShort.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeShort.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeShort.java Tue Jan 22 20:44:55 2008
@@ -16,7 +16,10 @@
  */
 package org.apache.sanselan.formats.tiff.fieldtypes;
 
+import org.apache.sanselan.ImageReadException;
+import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.util.Debug;
 
 public class FieldTypeShort extends FieldType
 {
@@ -39,7 +42,7 @@
 	//				+ ")", getRawBytes(entry), 0, entry.length, entry.byteOrder);
 	//	}
 
-	public Object getSimpleValue(TiffField entry)
+	public Object getSimpleValue(TiffField entry) throws ImageReadException
 	{
 		if (entry.length == 1)
 			return new Integer(convertByteArrayToShort(name + " ("
@@ -50,19 +53,28 @@
 				+ ")", getRawBytes(entry), 0, entry.length, entry.byteOrder);
 	}
 
-	public byte[] writeData(Object o, int byteOrder)
+	public byte[] writeData(Object o, int byteOrder) throws ImageWriteException
 	{
 		if (o instanceof Integer)
-			return writeData(new int[]{
+			return convertShortArrayToByteArray(new int[]{
 				((Integer) o).intValue(),
 			}, byteOrder);
-
-		return writeData((int[]) o, byteOrder);
-	}
-
-	public byte[] writeData(int values[], int byteOrder)
-	{
-		return convertShortArrayToByteArray(values, byteOrder);
+		else if (o instanceof int[])
+		{
+			int numbers[] = (int[]) o;
+			return convertShortArrayToByteArray(numbers, byteOrder);
+		}
+		else if (o instanceof Integer[])
+		{
+			Integer numbers[] = (Integer[]) o;
+			int values[] = new int[numbers.length];
+			for (int i = 0; i < values.length; i++)
+				values[i] = numbers[i].intValue();
+			return convertShortArrayToByteArray(values, byteOrder);
+		}
+		else
+			throw new ImageWriteException("Invalid data: " + o + " ("
+					+ Debug.getType(o) + ")");
 	}
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeUnknown.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeUnknown.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeUnknown.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/fieldtypes/FieldTypeUnknown.java Tue Jan 22 20:44:55 2008
@@ -16,7 +16,9 @@
  */
 package org.apache.sanselan.formats.tiff.fieldtypes;
 
+import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.formats.tiff.TiffField;
+import org.apache.sanselan.util.Debug;
 
 public class FieldTypeUnknown extends FieldType
 {
@@ -27,20 +29,30 @@
 
 	public Object getSimpleValue(TiffField entry)
 	{
+		//		Debug.debug("unknown field type. entry", entry.tagInfo.name);
+		//		Debug.debug("unknown field type. entry.type", entry.type);
+		//		Debug.debug("unknown field type. entry.length", entry.length);
+		//		Debug.debug("unknown field type. entry.oversizeValue", entry.oversizeValue);
+		//		Debug.debug("unknown field type. entry.isLocalValue()", entry.isLocalValue());
+		//		Debug.debug("unknown field type. entry.oversizeValue", entry.oversizeValue);
+
 		if (entry.length == 1)
 			return new Byte(entry.valueOffsetBytes[0]);
 
 		return getRawBytes(entry);
 	}
 
-	public byte[] writeData(Object o, int byteOrder)
+	public byte[] writeData(Object o, int byteOrder) throws ImageWriteException
 	{
 		if (o instanceof Byte)
 			return new byte[]{
 				((Byte) o).byteValue(),
 			};
-
-		return (byte[]) o;
+		else if (o instanceof byte[])
+			return (byte[]) o;
+		else
+			throw new ImageWriteException("Invalid data: " + o + " ("
+					+ Debug.getType(o) + ")");
 	}
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterBiLevel.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterBiLevel.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterBiLevel.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterBiLevel.java Tue Jan 22 20:44:55 2008
@@ -24,7 +24,8 @@
 public class PhotometricInterpreterBiLevel extends PhotometricInterpreter
 {
 	private final boolean invert;
-//	private final int bitsPerPixel;
+
+	//	private final int bitsPerPixel;
 
 	public PhotometricInterpreterBiLevel(int fBitsPerPixel,
 			int fSamplesPerPixel, int fBitsPerSample[], int Predictor,
@@ -33,7 +34,7 @@
 		super(fSamplesPerPixel, fBitsPerSample, Predictor, width, height);
 
 		this.invert = invert;
-//		this.bitsPerPixel = fBitsPerPixel;
+		//		this.bitsPerPixel = fBitsPerPixel;
 	}
 
 	public void interpretPixel(BufferedImage bi, int samples[], int x, int y)

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterLogLUV.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterLogLUV.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterLogLUV.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/photometricinterpreters/PhotometricInterpreterLogLUV.java Tue Jan 22 20:44:55 2008
@@ -23,7 +23,7 @@
 
 public class PhotometricInterpreterLogLUV extends PhotometricInterpreter
 {
-//	private final boolean yOnly;
+	//	private final boolean yOnly;
 
 	public PhotometricInterpreterLogLUV(int fSamplesPerPixel,
 			int fBitsPerSample[], int Predictor, int width, int height,
@@ -31,7 +31,7 @@
 	{
 		super(fSamplesPerPixel, fBitsPerSample, Predictor, width, height);
 
-//		this.yOnly = yonly;
+		//		this.yOnly = yonly;
 	}
 
 	public void dumpstats() throws ImageReadException, IOException

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterBase.java Tue Jan 22 20:44:55 2008
@@ -63,9 +63,11 @@
 	public abstract void write(OutputStream os, TiffOutputSet outputSet)
 			throws IOException, ImageWriteException;
 
-	protected TiffOutputSummary validateDirectories(List directories)
+	protected TiffOutputSummary validateDirectories(TiffOutputSet outputSet)
 			throws ImageWriteException
 	{
+		List directories = outputSet.getDirectories();
+
 		if (1 > directories.size())
 			throw new ImageWriteException("No directories.");
 
@@ -193,6 +195,31 @@
 		TiffOutputSummary result = new TiffOutputSummary(byteOrder,
 				rootDirectory, directoryTypeMap);
 
+		if (interoperabilityDirectory == null
+				&& interoperabilityDirectoryOffsetField != null)
+		{
+			// perhaps we should just discard field?
+			throw new ImageWriteException(
+					"Output set has Interoperability Directory Offset field, but no Interoperability Directory");
+		}
+		else if (interoperabilityDirectory != null)
+		{
+			if (exifDirectory == null)
+			{
+				exifDirectory = outputSet.addExifDirectory();
+			}
+
+			if (interoperabilityDirectoryOffsetField == null)
+			{
+				interoperabilityDirectoryOffsetField = TiffOutputField
+						.createOffsetField(EXIF_TAG_INTEROP_OFFSET, byteOrder);
+				exifDirectory.add(interoperabilityDirectoryOffsetField);
+			}
+
+			result.add(interoperabilityDirectory,
+					interoperabilityDirectoryOffsetField);
+		}
+
 		// make sure offset fields and offset'd directories correspond.
 		if (exifDirectory == null && exifDirectoryOffsetField != null)
 		{
@@ -228,26 +255,6 @@
 			}
 
 			result.add(gpsDirectory, gpsDirectoryOffsetField);
-		}
-
-		if (interoperabilityDirectory == null
-				&& interoperabilityDirectoryOffsetField != null)
-		{
-			// perhaps we should just discard field?
-			throw new ImageWriteException(
-					"Output set has Interoperability Directory Offset field, but no Interoperability Directory");
-		}
-		else if (interoperabilityDirectory != null)
-		{
-			if (interoperabilityDirectoryOffsetField == null)
-			{
-				interoperabilityDirectoryOffsetField = TiffOutputField
-						.createOffsetField(EXIF_TAG_INTEROP_OFFSET, byteOrder);
-				rootDirectory.add(interoperabilityDirectoryOffsetField);
-			}
-
-			result.add(interoperabilityDirectory,
-					interoperabilityDirectoryOffsetField);
 		}
 
 		return result;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossless.java Tue Jan 22 20:44:55 2008
@@ -218,7 +218,7 @@
 		else if (analysis.size() == 1)
 		{
 			TiffElement onlyElement = (TiffElement) analysis.get(0);
-//			Debug.debug("onlyElement", onlyElement.getElementDescription());
+			//			Debug.debug("onlyElement", onlyElement.getElementDescription());
 			if (onlyElement.offset == TIFF_HEADER_SIZE
 					&& onlyElement.offset + onlyElement.length
 							+ TIFF_HEADER_SIZE == oldLength)
@@ -232,14 +232,14 @@
 		//		if (true)
 		//			throw new ImageWriteException("hahah");
 
-		List directories = outputSet.getDirectories();
+		//		List directories = outputSet.getDirectories();
 
-		TiffOutputSummary outputSummary = validateDirectories(directories);
+		TiffOutputSummary outputSummary = validateDirectories(outputSet);
 
 		List outputItems = outputSet.getOutputItems(outputSummary);
 
 		int outputLength = updateOffsetsStep(analysis, outputItems);
-//		Debug.debug("outputLength", outputLength);
+		//		Debug.debug("outputLength", outputLength);
 
 		outputSummary.updateOffsets(byteOrder);
 
@@ -311,9 +311,9 @@
 			TiffOutputItem outputItem = (TiffOutputItem) unplacedItems
 					.remove(0);
 			int outputItemLength = outputItem.getItemLength();
-//			Debug.debug("largest unplaced item: "
-//					+ outputItem.getItemDescription() + " (" + outputItemLength
-//					+ ")");
+			//			Debug.debug("largest unplaced item: "
+			//					+ outputItem.getItemDescription() + " (" + outputItemLength
+			//					+ ")");
 
 			// search for the smallest possible element large enough to hold the item.
 			TiffElement bestFit = null;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffImageWriterLossy.java Tue Jan 22 20:44:55 2008
@@ -38,9 +38,9 @@
 	public void write(OutputStream os, TiffOutputSet outputSet)
 			throws IOException, ImageWriteException
 	{
-		List directories = outputSet.getDirectories();
+		//		List directories = outputSet.getDirectories();
 
-		TiffOutputSummary outputSummary = validateDirectories(directories);
+		TiffOutputSummary outputSummary = validateDirectories(outputSet);
 
 		List outputItems = outputSet.getOutputItems(outputSummary);
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputDirectory.java Tue Jan 22 20:44:55 2008
@@ -25,9 +25,9 @@
 import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.common.BinaryOutputStream;
 import org.apache.sanselan.formats.tiff.JpegImageData;
+import org.apache.sanselan.formats.tiff.TiffDirectory;
 import org.apache.sanselan.formats.tiff.TiffElement;
 import org.apache.sanselan.formats.tiff.TiffImageData;
-import org.apache.sanselan.formats.tiff.TiffDirectory;
 import org.apache.sanselan.formats.tiff.constants.TagConstantsUtils;
 import org.apache.sanselan.formats.tiff.constants.TagInfo;
 import org.apache.sanselan.formats.tiff.constants.TiffConstants;
@@ -104,7 +104,9 @@
 				TiffOutputField e1 = (TiffOutputField) o1;
 				TiffOutputField e2 = (TiffOutputField) o2;
 
-				return e1.tag - e2.tag;
+				if (e1.tag != e2.tag)
+					return e1.tag - e2.tag;
+				return e1.getSortHint() - e2.getSortHint();
 			}
 		};
 		Collections.sort(fields, comparator);
@@ -188,6 +190,7 @@
 	}
 
 	protected List getOutputItems(TiffOutputSummary outputSummary)
+			throws ImageWriteException
 	{
 		// first validate directory fields.
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputField.java Tue Jan 22 20:44:55 2008
@@ -31,7 +31,7 @@
 	public final FieldType fieldType;
 	public final int count;
 
-	public byte bytes[];
+	private byte bytes[];
 
 	private final TiffOutputItem separateValueItem;
 
@@ -59,6 +59,9 @@
 			separateValueItem = new TiffOutputItem.Value(name, bytes);
 		}
 	}
+	
+	private int sortHint = -1;
+	
 
 	public static TiffOutputField create(TagInfo tagInfo, int byteOrder,
 			Number number) throws ImageWriteException
@@ -76,7 +79,7 @@
 	}
 
 	protected static final TiffOutputField createOffsetField(TagInfo tagInfo,
-			int byteOrder)
+			int byteOrder) throws ImageWriteException
 	{
 		return new TiffOutputField(tagInfo, FIELD_TYPE_LONG, 1, FIELD_TYPE_LONG
 				.writeData(new int[]{
@@ -87,6 +90,19 @@
 	protected void writeField(BinaryOutputStream bos) throws IOException,
 			ImageWriteException
 	{
+//		CachingOutputStream cos = null;
+//		if (tagInfo.isUnknown())
+//		{
+//			cos = new CachingOutputStream(bos);
+//			int byteOrder = bos.getByteOrder();
+//			bos = new BinaryOutputStream(cos, byteOrder);
+//			
+//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+//					+ ") isLocalValue()", isLocalValue());
+//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+//					+ ") bytes", bytes);
+//		}
+		
 		bos.write2Bytes(tag);
 		bos.write2Bytes(fieldType.type);
 		bos.write4Bytes(count);
@@ -112,6 +128,11 @@
 			if ((written % 2) != 0)
 				written++;
 		}
+//		if (null != cos)
+//		{
+//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+//					+ ") written field", cos.getCache());
+//		}
 	}
 
 	protected TiffOutputItem getSeperateValue()
@@ -126,6 +147,10 @@
 
 	protected void setData(byte bytes[]) throws ImageWriteException
 	{
+//		if(tagInfo.isUnknown())
+//			Debug.debug("unknown tag(0x" + Integer.toHexString(tag)
+//					+ ") setData", bytes);
+			
 		if (this.bytes.length != bytes.length)
 			throw new ImageWriteException("Cannot change size of value.");
 
@@ -162,5 +187,15 @@
 		result.append(newline);
 
 		return result.toString();
+	}
+
+	public int getSortHint()
+	{
+		return sortHint;
+	}
+
+	public void setSortHint(int sortHint)
+	{
+		this.sortHint = sortHint;
 	}
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputItem.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputItem.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputItem.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputItem.java Tue Jan 22 20:44:55 2008
@@ -22,7 +22,7 @@
 import org.apache.sanselan.common.BinaryOutputStream;
 import org.apache.sanselan.formats.tiff.constants.AllTagConstants;
 
- abstract class TiffOutputItem implements AllTagConstants
+abstract class TiffOutputItem implements AllTagConstants
 {
 	public static final int UNDEFINED_VALUE = -1;
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSet.java Tue Jan 22 20:44:55 2008
@@ -36,6 +36,7 @@
 	}
 
 	protected List getOutputItems(TiffOutputSummary outputSummary)
+			throws ImageWriteException
 	{
 		List result = new ArrayList();
 
@@ -164,6 +165,8 @@
 	public TiffOutputDirectory addInteroperabilityDirectory()
 			throws ImageWriteException
 	{
+		getOrCreateExifDirectory();
+
 		TiffOutputDirectory result = new TiffOutputDirectory(
 				DIRECTORY_TYPE_INTEROPERABILITY);
 		addDirectory(result);

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/write/TiffOutputSummary.java Tue Jan 22 20:44:55 2008
@@ -73,7 +73,8 @@
 
 		for (int i = 0; i < imageDataItems.size(); i++)
 		{
-			ImageDataOffsets imageDataInfo = (ImageDataOffsets) imageDataItems.get(i);
+			ImageDataOffsets imageDataInfo = (ImageDataOffsets) imageDataItems
+					.get(i);
 
 			for (int j = 0; j < imageDataInfo.outputItems.length; j++)
 			{

Added: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/CachingOutputStream.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/CachingOutputStream.java?rev=614420&view=auto
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/CachingOutputStream.java (added)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/CachingOutputStream.java Tue Jan 22 20:44:55 2008
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 org.apache.sanselan.util;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class CachingOutputStream extends OutputStream
+{
+	private final OutputStream os;
+	private final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+	public CachingOutputStream(OutputStream os)
+	{
+		this.os = os;
+	}
+
+	public void write(int b) throws IOException
+	{
+		os.write(b);
+		baos.write(b);
+	}
+
+	public byte[] getCache()
+	{
+		return baos.toByteArray();
+	}
+
+	public void close() throws IOException
+	{
+		os.close();
+	}
+
+	public void flush() throws IOException
+	{
+		os.flush();
+	}
+
+}

Propchange: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/CachingOutputStream.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/util/Debug.java Tue Jan 22 20:44:55 2008
@@ -889,4 +889,21 @@
 		}
 	}
 
+
+	public static final void purgeMemory()
+	{
+		try
+		{
+			//			Thread.sleep(50);
+			System.runFinalization();
+			Thread.sleep(50);
+			System.gc();
+			Thread.sleep(50);
+		}
+		catch (Throwable e)
+		{
+			Debug.debug(e);
+		}
+	}
+
 }

Propchange: incubator/sanselan/trunk/src/test/data/images/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Tue Jan 22 20:44:55 2008
@@ -0,0 +1,2 @@
+exif
+ignore

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java Tue Jan 22 20:44:55 2008
@@ -28,11 +28,13 @@
 import org.apache.sanselan.util.Debug;
 
 public abstract class SanselanTest extends TestCase
+		implements
+			SanselanConstants
 {
-	public SanselanTest(String name)
-	{
-		super(name);
-	}
+	//	public SanselanTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	public void compareByteArrays(byte a[], byte b[])
 	{
@@ -56,13 +58,29 @@
 		}
 	}
 
+	private static final File PHIL_HARVEY_TEST_IMAGE_FOLDER = new File(
+			"src\\test\\data\\images\\exif\\philHarvey\\");
+
+	protected boolean isPhilHarveyTestImage(File file)
+	{
+		//		Debug.debug("isPhilHarveyTestImage file",  file.getAbsolutePath());
+		//		Debug.debug("isPhilHarveyTestImage folder", PHIL_HARVEY_TEST_IMAGE_FOLDER.getAbsolutePath());
+		return file.getAbsolutePath().startsWith(
+				PHIL_HARVEY_TEST_IMAGE_FOLDER.getAbsolutePath());
+	}
+
 	protected List getAllTestImages()
 	{
-		File srcFolder = new File(".", "src");
+		File srcFolder = new File("src");
 		File testFolder = new File(srcFolder, "test");
 		File dataFolder = new File(testFolder, "data");
 		File imagesFolder = new File(dataFolder, "images");
 
+//				imagesFolder = new File(
+		//		"src\\test\\data\\images\\exif\\drewNoakes\\");
+		//	"src\\test\\data\\images\\exif\\drewNoakes\\007_Canon EOS 20D (1).jpg");
+//"src\\test\\data\\images\\tiff\\");
+
 		assertTrue(imagesFolder.exists());
 
 		final List result = new ArrayList();
@@ -94,16 +112,27 @@
 	protected File getTestImage(ImageFilter filter) throws IOException,
 			ImageReadException
 	{
-		List images = getTestImages(filter);
+		List images = getTestImages(filter, 1);
 
 		assertTrue(images.size() > 0);
 
 		return (File) images.get(0);
 	}
 
+	protected List getTestImages() throws IOException, ImageReadException
+	{
+		return getTestImages(null, -1);
+	}
+
 	protected List getTestImages(ImageFilter filter) throws IOException,
 			ImageReadException
 	{
+		return getTestImages(filter, -1);
+	}
+
+	protected List getTestImages(ImageFilter filter, int max)
+			throws IOException, ImageReadException
+	{
 		List images = getAllTestImages();
 
 		if (filter != null)
@@ -111,9 +140,20 @@
 			List filtered = new ArrayList();
 			for (int i = 0; i < images.size(); i++)
 			{
+						Debug.purgeMemory();
+			
 				File file = (File) images.get(i);
+
+				if (file.getParentFile().getName().toLowerCase().equals(
+						"@broken"))
+					continue;
+
 				if (filter.accept(file))
+				{
 					filtered.add(file);
+					if (max > 0 && filtered.size() >= max)
+						return filtered;
+				}
 			}
 			images = filtered;
 		}

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/RationalNumberTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/RationalNumberTest.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/RationalNumberTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/RationalNumberTest.java Tue Jan 22 20:44:55 2008
@@ -25,10 +25,10 @@
 
 public class RationalNumberTest extends SanselanTest
 {
-	public RationalNumberTest()
-	{
-		super("Rational Number Test");
-	}
+	//	public RationalNumberTest()
+	//	{
+	//		super("Rational Number Test");
+	//	}
 
 	public void test()
 	{

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceDataTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceDataTest.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceDataTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceDataTest.java Tue Jan 22 20:44:55 2008
@@ -30,10 +30,10 @@
 
 public class ByteSourceDataTest extends ByteSourceTest
 {
-	public ByteSourceDataTest()
-	{
-		super(ByteSourceDataTest.class.getName());
-	}
+	//	public ByteSourceDataTest()
+	//	{
+	//		super(ByteSourceDataTest.class.getName());
+	//	}
 
 	/**
 	 * @return the suite of tests being tested

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceImageTest.java Tue Jan 22 20:44:55 2008
@@ -24,6 +24,9 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -37,10 +40,10 @@
 
 public class ByteSourceImageTest extends ByteSourceTest
 {
-	public ByteSourceImageTest()
-	{
-		super(ByteSourceImageTest.class.getName());
-	}
+	//	public ByteSourceImageTest()
+	//	{
+	//		super(ByteSourceImageTest.class.getName());
+	//	}
 
 	/**
 	 * @return the suite of tests being tested
@@ -54,23 +57,42 @@
 			IllegalAccessException, IllegalArgumentException,
 			InvocationTargetException
 	{
-		File imageFile = getTestImage();
-		Debug.debug("imageFile", imageFile);
-		assertTrue(imageFile != null);
-
-		byte imageFileBytes[] = IOUtils.getFileBytes(imageFile);
-		assertTrue(imageFileBytes != null);
-		assertTrue(imageFileBytes.length == imageFile.length());
-
-		checkGuessFormat(imageFile, imageFileBytes);
-
-		checkGetICCProfileBytes(imageFile, imageFileBytes);
-
-		checkGetImageInfo(imageFile, imageFileBytes);
-
-		checkGetImageSize(imageFile, imageFileBytes);
-
-		checkGetBufferedImage(imageFile, imageFileBytes);
+		List imageFiles = getTestImages();
+		for (int i = 0; i < imageFiles.size(); i++)
+		{
+			Debug.purgeMemory();
+			
+			File imageFile = (File) imageFiles.get(i);
+			Debug.debug("imageFile", imageFile);
+			assertTrue(imageFile != null);
+
+			byte imageFileBytes[] = IOUtils.getFileBytes(imageFile);
+			assertTrue(imageFileBytes != null);
+			assertTrue(imageFileBytes.length == imageFile.length());
+
+			checkGuessFormat(imageFile, imageFileBytes);
+
+			if (imageFile.getName().toLowerCase().endsWith(".png")
+					&& imageFile.getParentFile().getName().equalsIgnoreCase(
+							"pngsuite")
+					&& imageFile.getName().toLowerCase().startsWith("x"))
+				continue;
+
+			checkGetICCProfileBytes(imageFile, imageFileBytes);
+
+			if (!imageFile.getParentFile().getName().toLowerCase().equals(
+					"@broken"))
+				checkGetImageInfo(imageFile, imageFileBytes);
+
+			checkGetImageSize(imageFile, imageFileBytes);
+
+			ImageFormat imageFormat = Sanselan.guessFormat(imageFile);
+			if (ImageFormat.IMAGE_FORMAT_JPEG == imageFormat
+					|| ImageFormat.IMAGE_FORMAT_UNKNOWN == imageFormat)
+				;
+			else
+				checkGetBufferedImage(imageFile, imageFileBytes);
+		}
 	}
 
 	public void checkGetBufferedImage(File file, byte[] bytes)
@@ -139,9 +161,15 @@
 			IllegalArgumentException, InvocationTargetException
 	{
 		// check guessFormat()
-		ImageInfo imageInfoFile = Sanselan.getImageInfo(imageFile);
 
-		ImageInfo imageInfoBytes = Sanselan.getImageInfo(imageFileBytes);
+		Map params = new HashMap();
+		boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
+		params.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(!ignoreImageData));
+
+		ImageInfo imageInfoFile = Sanselan.getImageInfo(imageFile, params);
+
+		ImageInfo imageInfoBytes = Sanselan
+				.getImageInfo(imageFileBytes, params);
 
 		assertTrue(imageInfoFile != null);
 		assertTrue(imageInfoBytes != null);

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceTest.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/common/byteSources/ByteSourceTest.java Tue Jan 22 20:44:55 2008
@@ -28,10 +28,10 @@
 
 public abstract class ByteSourceTest extends SanselanTest
 {
-	public ByteSourceTest(String name)
-	{
-		super(name);
-	}
+	//	public ByteSourceTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	protected File createTempFile(byte src[]) throws IOException
 	{

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegBaseTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegBaseTest.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegBaseTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegBaseTest.java Tue Jan 22 20:44:55 2008
@@ -28,10 +28,10 @@
 
 public abstract class JpegBaseTest extends SanselanTest
 {
-	public JpegBaseTest(String name)
-	{
-		super(name);
-	}
+	//	public JpegBaseTest(String name)
+	//	{
+	//		super(name);
+	//	}
 
 	protected static boolean isJpeg(File file) throws IOException,
 			ImageReadException
@@ -48,10 +48,10 @@
 		}
 	};
 
-	protected File getJpegImage() throws IOException, ImageReadException
-	{
-		return getTestImage(imageFilter);
-	}
+	//	protected File getJpegImage() throws IOException, ImageReadException
+	//	{
+	//		return getTestImage(imageFilter);
+	//	}
 
 	protected List getJpegImages() throws IOException, ImageReadException
 	{

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java?rev=614420&r1=614419&r2=614420&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/JpegReadTest.java Tue Jan 22 20:44:55 2008
@@ -19,7 +19,9 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.sanselan.ImageInfo;
 import org.apache.sanselan.ImageReadException;
@@ -30,10 +32,6 @@
 
 public class JpegReadTest extends JpegBaseTest
 {
-	public JpegReadTest(String name)
-	{
-		super(name);
-	}
 
 	public void test() throws IOException, ImageReadException,
 			ImageWriteException
@@ -41,13 +39,24 @@
 		List images = getJpegImages();
 		for (int i = 0; i < images.size(); i++)
 		{
+			Debug.purgeMemory();
+
 			File imageFile = (File) images.get(i);
 			Debug.debug("imageFile", imageFile.getAbsoluteFile());
 
-			IImageMetadata metadata = Sanselan.getMetadata(imageFile);
-			assertNotNull(metadata);
+			//			ByteSource byteSource = new ByteSourceFile(imageFile);
+			//			new JpegUtils().dumpJFIF(byteSource);
+
+			Map params = new HashMap();
+			boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
+			params
+					.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
+							!ignoreImageData));
+
+			IImageMetadata metadata = Sanselan.getMetadata(imageFile, params);
+			//			assertNotNull(metadata);
 
-			ImageInfo imageInfo = Sanselan.getImageInfo(imageFile);
+			ImageInfo imageInfo = Sanselan.getImageInfo(imageFile, params);
 			assertNotNull(imageInfo);
 		}
 	}