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/10/11 20:53:41 UTC

svn commit: r703730 - in /incubator/sanselan/trunk/src: main/java/org/apache/sanselan/ main/java/org/apache/sanselan/common/ main/java/org/apache/sanselan/common/mylzw/ main/java/org/apache/sanselan/formats/bmp/pixelparsers/ main/java/org/apache/sansel...

Author: cmchen
Date: Sat Oct 11 13:53:40 2008
New Revision: 703730

URL: http://svn.apache.org/viewvc?rev=703730&view=rev
Log:
More progress on the JPEG IPTC Photoshop metadata support.

Modified:
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ColorTools.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/RgbBufferedImageFactory.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/SimpleBufferedImageFactory.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/mylzw/MyLZWDecompressor.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GifImageParser.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegConstants.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCBlock.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCConstants.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCParser.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCRecord.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCType.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCTypeLookup.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/JpegIptcRewriter.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/PhotoshopApp13Data.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriter.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/BitParser.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/PngText.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunktEXt.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkzTXt.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/ImageContents.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PSDHeaderInfo.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PsdImageParser.java
    incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/SanselanTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java
    incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ColorTools.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ColorTools.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ColorTools.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/ColorTools.java Sat Oct 11 13:53:40 2008
@@ -30,10 +30,6 @@
 import java.io.File;
 import java.io.IOException;
 
-import org.apache.sanselan.common.byteSources.ByteSource;
-import org.apache.sanselan.common.byteSources.ByteSourceArray;
-import org.apache.sanselan.common.byteSources.ByteSourceFile;
-
 /**
  * This class is a mess and needs to be cleaned up.
  */

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/BinaryFileFunctions.java Sat Oct 11 13:53:40 2008
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.RandomAccessFile;
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/RgbBufferedImageFactory.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/RgbBufferedImageFactory.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/RgbBufferedImageFactory.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/RgbBufferedImageFactory.java Sat Oct 11 13:53:40 2008
@@ -19,8 +19,6 @@
 
 import java.awt.image.BufferedImage;
 
-import org.apache.sanselan.util.Debug;
-
 public class RgbBufferedImageFactory implements IBufferedImageFactory
 {
 	public BufferedImage getColorBufferedImage(int width, int height,

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/SimpleBufferedImageFactory.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/SimpleBufferedImageFactory.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/SimpleBufferedImageFactory.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/SimpleBufferedImageFactory.java Sat Oct 11 13:53:40 2008
@@ -19,8 +19,6 @@
 
 import java.awt.image.BufferedImage;
 
-import org.apache.sanselan.util.Debug;
-
 public class SimpleBufferedImageFactory implements IBufferedImageFactory
 {
 	public BufferedImage getColorBufferedImage(int width, int height,

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/mylzw/MyLZWDecompressor.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/mylzw/MyLZWDecompressor.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/mylzw/MyLZWDecompressor.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/common/mylzw/MyLZWDecompressor.java Sat Oct 11 13:53:40 2008
@@ -21,8 +21,6 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import org.apache.sanselan.util.Debug;
-
 public final class MyLZWDecompressor
 {
 	private static final int MAX_TABLE_SIZE = 1 << 12;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/bmp/pixelparsers/PixelParserSimple.java Sat Oct 11 13:53:40 2008
@@ -17,7 +17,6 @@
 package org.apache.sanselan.formats.bmp.pixelparsers;
 
 import java.awt.image.BufferedImage;
-import java.awt.image.DataBuffer;
 import java.io.IOException;
 
 import org.apache.sanselan.ImageReadException;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GifImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GifImageParser.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GifImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/gif/GifImageParser.java Sat Oct 11 13:53:40 2008
@@ -42,7 +42,6 @@
 import org.apache.sanselan.common.byteSources.ByteSource;
 import org.apache.sanselan.common.mylzw.MyLZWCompressor;
 import org.apache.sanselan.common.mylzw.MyLZWDecompressor;
-import org.apache.sanselan.formats.tiff.write.TiffOutputField;
 import org.apache.sanselan.palette.Palette;
 import org.apache.sanselan.palette.PaletteFactory;
 import org.apache.sanselan.util.Debug;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegConstants.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegConstants.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegConstants.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegConstants.java Sat Oct 11 13:53:40 2008
@@ -16,27 +16,31 @@
  */
 package org.apache.sanselan.formats.jpeg;
 
-import org.apache.sanselan.formats.jpeg.iptc.IPTCType;
-
-
-public interface JpegConstants {
+public interface JpegConstants
+{
 	public static final int MAX_SEGMENT_SIZE = 0xffff;
 
-	public static final byte JFIF0_SIGNATURE[] = new byte[] { 0x4a, // J
+	public static final byte JFIF0_SIGNATURE[] = new byte[] { //
+	0x4a, // J
 			0x46, // F
 			0x49, // I
 			0x46, // F
 			0x0, //  
 	};
-	public static final byte JFIF0_SIGNATURE_ALTERNATIVE[] = new byte[] { 0x4a, // J
+	public static final byte JFIF0_SIGNATURE_ALTERNATIVE[] = new byte[] { //
+	0x4a, // J
 			0x46, // F
 			0x49, // I
 			0x46, // F
 			0x20, //  
 	};
 
-	public static final byte EXIF_IDENTIFIER_CODE[] = { 0xff & 'E', 0xff & 'x',
-			0xff & 'i', 0xff & 'f', };
+	public static final byte EXIF_IDENTIFIER_CODE[] = { //
+	0x45, // E
+			0x78, // x
+			0x69, // i
+			0x66, // f
+	};
 
 	public static final byte XMP_IDENTIFIER[] = { //
 	0x68, // h
@@ -115,15 +119,26 @@
 	public static final byte icc_profile_label[] = { 0x49, 0x43, 0x43, 0x5F,
 			0x50, 0x52, 0x4F, 0x46, 0x49, 0x4C, 0x45, 0x0 };
 
-	// public static final byte PhotoshopIdentificationString[] =
-	// "Photoshop 3.0"
-	// .getBytes();
-	public static final byte PhotoshopIdentificationString[] = { 0xff & 'P',
-			0xff & 'h', 0xff & 'o', 0xff & 't', 0xff & 'o', 0xff & 's',
-			0xff & 'h', 0xff & 'o', 0xff & 'p', 0xff & ' ', 0xff & '3',
-			0xff & '.', 0xff & '0', 0, };
-	public static final byte CONST_8BIM[] = { 0xff & '8', 0xff & 'B',
-			0xff & 'I', 0xff & 'M', };
-
+	public static final byte PHOTOSHOP_IDENTIFICATION_STRING[] = { //
+	0x50, // P
+			0x68, // h
+			0x6F, // o
+			0x74, // t
+			0x6F, // o
+			0x73, // s
+			0x68, // h
+			0x6F, // o
+			0x70, // p
+			0x20, //
+			0x33, // 3
+			0x2E, // .
+			0x30, // 0
+	};
+	public static final byte CONST_8BIM[] = { //
+	0x38, // 8
+			0x42, // B
+			0x49, // I
+			0x4D, // M
+	};
 
 }

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/JpegImageParser.java Sat Oct 11 13:53:40 2008
@@ -34,7 +34,6 @@
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.common.IImageMetadata;
 import org.apache.sanselan.common.byteSources.ByteSource;
-import org.apache.sanselan.formats.jpeg.iptc.IPTCRecord;
 import org.apache.sanselan.formats.jpeg.iptc.IPTCParser;
 import org.apache.sanselan.formats.jpeg.iptc.PhotoshopApp13Data;
 import org.apache.sanselan.formats.jpeg.segments.App13Segment;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCBlock.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCBlock.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCBlock.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCBlock.java Sat Oct 11 13:53:40 2008
@@ -3,6 +3,9 @@
  */
 package org.apache.sanselan.formats.jpeg.iptc;
 
+/*
+ * Represents an IPTC block, a set of key-value pairs of Photoshop IPTC data.
+ */
 public class IPTCBlock
 {
 	public final int blockType;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCConstants.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCConstants.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCConstants.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCConstants.java Sat Oct 11 13:53:40 2008
@@ -16,24 +16,15 @@
  */
 package org.apache.sanselan.formats.jpeg.iptc;
 
-public interface IPTCConstants
-{
+import org.apache.sanselan.formats.jpeg.JpegConstants;
 
-	// public static final byte PhotoshopIdentificationString[] =
-	// "Photoshop 3.0"
-	// .getBytes();
-	public static final byte PHOTOSHOP_IDENTIFICATION_STRING[] = { 0xff & 'P',
-			0xff & 'h', 0xff & 'o', 0xff & 't', 0xff & 'o', 0xff & 's',
-			0xff & 'h', 0xff & 'o', 0xff & 'p', 0xff & ' ', 0xff & '3',
-			0xff & '.', 0xff & '0', 0, };
-	public static final byte CONST_8BIM[] = { 0xff & '8', 0xff & 'B',
-			0xff & 'I', 0xff & 'M', };
+public interface IPTCConstants extends JpegConstants
+{
 
-	public static final byte IPTCPrefix[] = { 0x1C, 0x02, };
+	public static final byte IPTC_PREFIX[] = { 0x1C, 0x02, };
 
-	
 	public static final int IPTC_NON_EXTENDED_RECORD_MAXIMUM_SIZE = 32767;
-	
+
 	public static final int IMAGE_RESOURCE_BLOCK_PHOTOSHOP2_INFO = 0x03e8;
 	public static final int IMAGE_RESOURCE_BLOCK_MACINTOSH_PRINT_INFO = 0x03e9;
 	public static final int IMAGE_RESOURCE_BLOCK_XML_DATA = 0x03ea;
@@ -99,90 +90,90 @@
 	public static final int IMAGE_RESOURCE_BLOCK_CLIPPING_PATH_NAME = 0x0bb7;
 	public static final int IMAGE_RESOURCE_BLOCK_PRINT_FLAGS_INFO = 0x2710;
 
-//	public static final int IPTC_RECORD_PREFIX = 0x1c02;
+	// public static final int IPTC_RECORD_PREFIX = 0x1c02;
 	public static final int IPTC_RECORD_TAG_MARKER = 0x1c;
 	public static final int IPTC_ENVELOPE_RECORD_NUMBER = 0x01;
 	public static final int IPTC_APPLICATION_2_RECORD_NUMBER = 0x02;
 
 	public static final IPTCType IPTC_TYPE_RECORD_VERSION = new IPTCType(0,
-			"RecordVersion");
+			"Record Version");
 	public static final IPTCType IPTC_TYPE_OBJECT_TYPE_REFERENCE = new IPTCType(
-			3, "ObjectTypeReference");
+			3, "Object Type Reference");
 	public static final IPTCType IPTC_TYPE_OBJECT_ATTRIBUTE_REFERENCE = new IPTCType(
-			4, "ObjectAttributeReference");
+			4, "Object Attribute Reference");
 	public static final IPTCType IPTC_TYPE_OBJECT_NAME = new IPTCType(5,
-			"ObjectName");
+			"Object Name");
 	public static final IPTCType IPTC_TYPE_EDIT_STATUS = new IPTCType(7,
-			"EditStatus");
+			"Edit Status");
 	public static final IPTCType IPTC_TYPE_EDITORIAL_UPDATE = new IPTCType(8,
-			"EditorialUpdate");
+			"Editorial Update");
 	public static final IPTCType IPTC_TYPE_URGENCY = new IPTCType(10, "Urgency");
 	public static final IPTCType IPTC_TYPE_SUBJECT_REFERENCE = new IPTCType(12,
-			"SubjectReference");
+			"Subject Reference");
 	public static final IPTCType IPTC_TYPE_CATEGORY = new IPTCType(15,
 			"Category");
 	public static final IPTCType IPTC_TYPE_SUPPLEMENTAL_CATEGORY = new IPTCType(
-			20, "SupplementalCategory");
+			20, "Supplemental Category");
 	public static final IPTCType IPTC_TYPE_FIXTURE_IDENTIFIER = new IPTCType(
-			22, "FixtureIdentifier");
+			22, "Fixture Identifier");
 	public static final IPTCType IPTC_TYPE_KEYWORDS = new IPTCType(25,
 			"Keywords");
 	public static final IPTCType IPTC_TYPE_CONTENT_LOCATION_CODE = new IPTCType(
-			26, "ContentLocationCode");
+			26, "Content Location Code");
 	public static final IPTCType IPTC_TYPE_CONTENT_LOCATION_NAME = new IPTCType(
-			27, "ContentLocationName");
+			27, "Content Location Name");
 	public static final IPTCType IPTC_TYPE_RELEASE_DATE = new IPTCType(30,
-			"ReleaseDate");
+			"Release Date");
 	public static final IPTCType IPTC_TYPE_RELEASE_TIME = new IPTCType(35,
-			"ReleaseTime");
+			"Release Time");
 	public static final IPTCType IPTC_TYPE_EXPIRATION_DATE = new IPTCType(37,
-			"ExpirationDate");
+			"Expiration Date");
 	public static final IPTCType IPTC_TYPE_EXPIRATION_TIME = new IPTCType(38,
-			"ExpirationTime");
+			"Expiration Time");
 	public static final IPTCType IPTC_TYPE_SPECIAL_INSTRUCTIONS = new IPTCType(
-			40, "SpecialInstructions");
+			40, "Special Instructions");
 	public static final IPTCType IPTC_TYPE_ACTION_ADVISED = new IPTCType(42,
-			"ActionAdvised");
+			"Action Advised");
 	public static final IPTCType IPTC_TYPE_REFERENCE_SERVICE = new IPTCType(45,
-			"ReferenceService");
+			"Reference Service");
 	public static final IPTCType IPTC_TYPE_REFERENCE_DATE = new IPTCType(47,
-			"ReferenceDate");
+			"Reference Date");
 	public static final IPTCType IPTC_TYPE_REFERENCE_NUMBER = new IPTCType(50,
-			"ReferenceNumber");
+			"Reference Number");
 	public static final IPTCType IPTC_TYPE_DATE_CREATED = new IPTCType(55,
-			"DateCreated");
+			"Date Created");
 	public static final IPTCType IPTC_TYPE_TIME_CREATED = new IPTCType(60,
-			"TimeCreated");
+			"Time Created");
 	public static final IPTCType IPTC_TYPE_DIGITAL_CREATION_DATE = new IPTCType(
-			62, "DigitalCreationDate");
+			62, "Digital Creation Date");
 	public static final IPTCType IPTC_TYPE_DIGITAL_CREATION_TIME = new IPTCType(
-			63, "DigitalCreationTime");
+			63, "Digital Creation Time");
 	public static final IPTCType IPTC_TYPE_ORIGINATING_PROGRAM = new IPTCType(
-			65, "OriginatingProgram");
+			65, "Originating Program");
 	public static final IPTCType IPTC_TYPE_PROGRAM_VERSION = new IPTCType(70,
-			"ProgramVersion");
+			"Program Version");
 	public static final IPTCType IPTC_TYPE_OBJECT_CYCLE = new IPTCType(75,
-			"ObjectCycle");
+			"Object Cycle");
 	public static final IPTCType IPTC_TYPE_BYLINE = new IPTCType(80, "By-line");
 	public static final IPTCType IPTC_TYPE_BYLINE_TITLE = new IPTCType(85,
-			"By-lineTitle");
+			"By-line Title");
 	public static final IPTCType IPTC_TYPE_CITY = new IPTCType(90, "City");
 	public static final IPTCType IPTC_TYPE_SUBLOCATION = new IPTCType(92,
 			"Sublocation");
 	public static final IPTCType IPTC_TYPE_PROVINCE_STATE = new IPTCType(95,
 			"Province/State");
 	public static final IPTCType IPTC_TYPE_COUNTRY_PRIMARY_LOCATION_CODE = new IPTCType(
-			100, "Country/PrimaryLocationCode");
+			100, "Country/Primary Location Code");
 	public static final IPTCType IPTC_TYPE_COUNTRY_PRIMARY_LOCATION_NAME = new IPTCType(
-			101, "Country/PrimaryLocationName");
+			101, "Country/Primary Location Name");
 	public static final IPTCType IPTC_TYPE_ORIGINAL_TRANSMISSION_REFERENCE = new IPTCType(
-			103, "OriginalTransmission,Reference");
+			103, "Original Transmission, Reference");
 	public static final IPTCType IPTC_TYPE_HEADLINE = new IPTCType(105,
 			"Headline");
 	public static final IPTCType IPTC_TYPE_CREDIT = new IPTCType(110, "Credit");
 	public static final IPTCType IPTC_TYPE_SOURCE = new IPTCType(115, "Source");
 	public static final IPTCType IPTC_TYPE_COPYRIGHT_NOTICE = new IPTCType(116,
-			"CopyrightNotice");
+			"Copyright Notice");
 	public static final IPTCType IPTC_TYPE_CONTACT = new IPTCType(118,
 			"Contact");
 	public static final IPTCType IPTC_TYPE_CAPTION_ABSTRACT = new IPTCType(120,
@@ -190,29 +181,29 @@
 	public static final IPTCType IPTC_TYPE_WRITER_EDITOR = new IPTCType(122,
 			"Writer/Editor");
 	public static final IPTCType IPTC_TYPE_RASTERIZED_CAPTION = new IPTCType(
-			125, "RasterizedCaption");
+			125, "Rasterized Caption");
 	public static final IPTCType IPTC_TYPE_IMAGE_TYPE = new IPTCType(130,
 			"ImageType");
 	public static final IPTCType IPTC_TYPE_IMAGE_ORIENTATION = new IPTCType(
-			131, "ImageOrientation");
+			131, "Image Orientation");
 	public static final IPTCType IPTC_TYPE_LANGUAGE_IDENTIFIER = new IPTCType(
-			135, "LanguageIdentifier");
+			135, "Language Identifier");
 	public static final IPTCType IPTC_TYPE_AUDIO_TYPE = new IPTCType(150,
-			"AudioType");
+			"Audio Type");
 	public static final IPTCType IPTC_TYPE_AUDIO_SAMPLING_RATE = new IPTCType(
-			151, "AudioSamplingRate");
+			151, "Audio Sampling Rate");
 	public static final IPTCType IPTC_TYPE_AUDIO_SAMPLING_RESOLUTION = new IPTCType(
-			152, "AudioSamplingResolution");
+			152, "Audio Sampling Resolution");
 	public static final IPTCType IPTC_TYPE_AUDIO_DURATION = new IPTCType(153,
-			"AudioDuration");
+			"Audio Duration");
 	public static final IPTCType IPTC_TYPE_AUDIO_OUTCUE = new IPTCType(154,
-			"AudioOutcue");
+			"Audio Outcue");
 	public static final IPTCType IPTC_TYPE_OBJECT_DATA_PREVIEW_FILE_FORMAT = new IPTCType(
-			200, "ObjectDataPreview,FileFormat");
+			200, "Object Data Preview, File Format");
 	public static final IPTCType IPTC_TYPE_OBJECT_DATA_PREVIEW_FILE_FORMAT_VERSION = new IPTCType(
-			201, "ObjectDataPreview,FileFormatVersion");
+			201, "Object Data Preview, File Format Version");
 	public static final IPTCType IPTC_TYPE_OBJECT_DATA_PREVIEW_DATA = new IPTCType(
-			202, "ObjectDataPreviewData");
+			202, "Object Data Preview Data");
 	// --
 	// public static final IPTCType IPTC_TYPE_UNKNOWN = new IPTCType(-1,
 	// "Unknown");

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCParser.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCParser.java Sat Oct 11 13:53:40 2008
@@ -45,7 +45,6 @@
 
 	public boolean isPhotoshopJpegSegment(byte segmentData[])
 	{
-
 		if (!compareByteArrays(segmentData, 0, PHOTOSHOP_IDENTIFICATION_STRING,
 				0, PHOTOSHOP_IDENTIFICATION_STRING.length))
 			return false;
@@ -200,10 +199,9 @@
 					recordSize);
 			index += recordSize;
 
+			// Debug.debug("recordSize", recordSize + " (0x"
+			// + Integer.toHexString(recordSize) + ")");
 
-//			Debug.debug("recordSize", recordSize + " (0x"
-//					+ Integer.toHexString(recordSize) + ")");
-			
 			if (recordType == 0)
 			{
 				if (verbose)
@@ -392,7 +390,8 @@
 			// first, right record version record
 			bos.write(IPTC_RECORD_TAG_MARKER);
 			bos.write(IPTC_APPLICATION_2_RECORD_NUMBER);
-			bos.write(IPTC_TYPE_RECORD_VERSION.type); // record version record type.
+			bos.write(IPTC_TYPE_RECORD_VERSION.type); // record version record
+														// type.
 			bos.write2Bytes(2); // record version record size
 			bos.write2Bytes(2); // record version value
 
@@ -415,10 +414,10 @@
 			for (int i = 0; i < elements.size(); i++)
 			{
 				IPTCRecord element = (IPTCRecord) elements.get(i);
-				
-				if(element.iptcType.type == IPTC_TYPE_RECORD_VERSION.type)
+
+				if (element.iptcType.type == IPTC_TYPE_RECORD_VERSION.type)
 					continue; // ignore
-				
+
 				bos.write(IPTC_RECORD_TAG_MARKER);
 				bos.write(IPTC_APPLICATION_2_RECORD_NUMBER);
 				if (element.iptcType.type < 0 || element.iptcType.type > 0xff)
@@ -437,7 +436,7 @@
 
 			blockData = baos.toByteArray();
 		}
-		
+
 		return blockData;
 	}
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCRecord.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCRecord.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCRecord.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCRecord.java Sat Oct 11 13:53:40 2008
@@ -18,6 +18,9 @@
 
 import java.util.Comparator;
 
+/*
+ * Represents an IPTC record, a single key-value pair of Photoshop IPTC data.
+ */
 public class IPTCRecord
 {
 	public final IPTCType iptcType;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCType.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCType.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCType.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCType.java Sat Oct 11 13:53:40 2008
@@ -18,19 +18,22 @@
 
 import org.apache.sanselan.formats.jpeg.JpegConstants;
 
-public class IPTCType implements JpegConstants, IPTCConstants {
+public class IPTCType implements JpegConstants, IPTCConstants
+{
 	public final int type;
 	public final String name;
 
-	public IPTCType(int type, String name) {
+	public IPTCType(int type, String name)
+	{
 		this.type = type;
 		this.name = name;
 	}
 
-	public String toString() {
+	public String toString()
+	{
 		return name + " (" + type + ")";
 	}
-	
+
 	public static IPTCType getUnknown(int type)
 	{
 		return new IPTCType(type, "Unknown");

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCTypeLookup.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCTypeLookup.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCTypeLookup.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/IPTCTypeLookup.java Sat Oct 11 13:53:40 2008
@@ -19,18 +19,22 @@
 import java.util.HashMap;
 import java.util.Map;
 
-public abstract class IPTCTypeLookup implements IPTCConstants {
+public abstract class IPTCTypeLookup implements IPTCConstants
+{
 
 	private static final Map IPTC_TYPE_MAP = new HashMap();
-	static {
-		for (int i = 0; i < IPTC_TYPES.length; i++) {
+	static
+	{
+		for (int i = 0; i < IPTC_TYPES.length; i++)
+		{
 			IPTCType iptcType = IPTC_TYPES[i];
 			Integer key = new Integer(iptcType.type);
 			IPTC_TYPE_MAP.put(key, iptcType);
 		}
 	}
 
-	public static final IPTCType getIptcType(int type) {
+	public static final IPTCType getIptcType(int type)
+	{
 		Integer key = new Integer(type);
 		if (!IPTC_TYPE_MAP.containsKey(key))
 			return IPTCType.getUnknown(type);

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/JpegIptcRewriter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/JpegIptcRewriter.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/JpegIptcRewriter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/JpegIptcRewriter.java Sat Oct 11 13:53:40 2008
@@ -16,7 +16,6 @@
  */
 package org.apache.sanselan.formats.jpeg.iptc;
 
-import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -34,7 +33,6 @@
 import org.apache.sanselan.common.byteSources.ByteSourceFile;
 import org.apache.sanselan.common.byteSources.ByteSourceInputStream;
 import org.apache.sanselan.formats.jpeg.xmp.JpegRewriter;
-import org.apache.sanselan.util.Debug;
 
 /**
  * Interface for Exif write/update/remove functionality for Jpeg/JFIF images.
@@ -235,13 +233,13 @@
 			List newBlocks = newData.getNonIptcBlocks();
 			byte[] newBlockBytes = new IPTCParser().writeIPTCBlock(newData
 					.getRecords());
-			
+
 			int blockType = IMAGE_RESOURCE_BLOCK_IPTC_DATA;
 			byte[] blockNameBytes = new byte[0];
 			IPTCBlock newBlock = new IPTCBlock(blockType, blockNameBytes,
 					newBlockBytes);
 			newBlocks.add(newBlock);
-			
+
 			newData = new PhotoshopApp13Data(newData.getRecords(), newBlocks);
 
 			byte segmentBytes[] = new IPTCParser()

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/PhotoshopApp13Data.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/PhotoshopApp13Data.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/PhotoshopApp13Data.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/iptc/PhotoshopApp13Data.java Sat Oct 11 13:53:40 2008
@@ -17,21 +17,8 @@
 
 package org.apache.sanselan.formats.jpeg.iptc;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
 import java.util.List;
-import java.util.Map;
-
-import org.apache.sanselan.ImageReadException;
-import org.apache.sanselan.ImageWriteException;
-import org.apache.sanselan.SanselanConstants;
-import org.apache.sanselan.common.BinaryFileParser;
-import org.apache.sanselan.common.BinaryOutputStream;
-import org.apache.sanselan.util.Debug;
-import org.apache.sanselan.util.ParamMap;
 
 public class PhotoshopApp13Data implements IPTCConstants
 {

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegRewriter.java Sat Oct 11 13:53:40 2008
@@ -318,8 +318,14 @@
 
 		List result = new ArrayList(segments);
 		if (lastAppIndex == -1)
-			throw new ImageWriteException("JPEG file has no APP segments.");
+		{
+			if(segments.size()<1)
+				throw new ImageWriteException("JPEG file has no APP segments.");
+			result.addAll(1, newSegments);
+		}
+		else
 		result.addAll(lastAppIndex + 1, newSegments);
+		
 		return result;
 	}
 

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriter.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/jpeg/xmp/JpegXmpRewriter.java Sat Oct 11 13:53:40 2008
@@ -30,7 +30,6 @@
 import org.apache.sanselan.common.byteSources.ByteSourceArray;
 import org.apache.sanselan.common.byteSources.ByteSourceFile;
 import org.apache.sanselan.common.byteSources.ByteSourceInputStream;
-import org.apache.sanselan.util.Debug;
 
 /**
  * Interface for Exif write/update/remove functionality for Jpeg/JFIF images.

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/BitParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/BitParser.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/BitParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/BitParser.java Sat Oct 11 13:53:40 2008
@@ -19,7 +19,6 @@
 import java.io.IOException;
 
 import org.apache.sanselan.ImageReadException;
-import org.apache.sanselan.util.Debug;
 
 public class BitParser
 {

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/PngText.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/PngText.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/PngText.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/PngText.java Sat Oct 11 13:53:40 2008
@@ -1,8 +1,5 @@
 package org.apache.sanselan.formats.png;
 
-import org.apache.sanselan.ImageWriteException;
-import org.apache.sanselan.SanselanException;
-import org.apache.sanselan.util.UnicodeUtils;
 
 public abstract class PngText
 {

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediter.java Sat Oct 11 13:53:40 2008
@@ -30,7 +30,6 @@
 import org.apache.sanselan.formats.png.scanlinefilters.ScanlineFilterSub;
 import org.apache.sanselan.formats.png.scanlinefilters.ScanlineFilterUp;
 import org.apache.sanselan.formats.transparencyfilters.TransparencyFilter;
-import org.apache.sanselan.util.Debug;
 
 public abstract class ScanExpediter extends BinaryFileParser
 {

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/ScanExpediterSimple.java Sat Oct 11 13:53:40 2008
@@ -23,7 +23,6 @@
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.formats.png.chunks.PNGChunkPLTE;
 import org.apache.sanselan.formats.transparencyfilters.TransparencyFilter;
-import org.apache.sanselan.util.Debug;
 
 public class ScanExpediterSimple extends ScanExpediter
 {

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkPLTE.java Sat Oct 11 13:53:40 2008
@@ -21,7 +21,6 @@
 
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.formats.png.GammaCorrection;
-import org.apache.sanselan.util.Debug;
 
 public class PNGChunkPLTE extends PNGChunk
 {

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunktEXt.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunktEXt.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunktEXt.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunktEXt.java Sat Oct 11 13:53:40 2008
@@ -19,7 +19,6 @@
 import java.io.IOException;
 
 import org.apache.sanselan.ImageReadException;
-import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.formats.png.PngText;
 
 public class PNGChunktEXt extends PNGTextChunk

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkzTXt.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkzTXt.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkzTXt.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/png/chunks/PNGChunkzTXt.java Sat Oct 11 13:53:40 2008
@@ -22,7 +22,6 @@
 import org.apache.sanselan.common.ZLibUtils;
 import org.apache.sanselan.formats.png.PngConstants;
 import org.apache.sanselan.formats.png.PngText;
-import org.apache.sanselan.util.Debug;
 
 public class PNGChunkzTXt extends PNGTextChunk
 {

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/ImageContents.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/ImageContents.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/ImageContents.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/ImageContents.java Sat Oct 11 13:53:40 2008
@@ -16,7 +16,6 @@
  */
 package org.apache.sanselan.formats.psd;
 
-import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 
 public class ImageContents

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PSDHeaderInfo.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PSDHeaderInfo.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PSDHeaderInfo.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PSDHeaderInfo.java Sat Oct 11 13:53:40 2008
@@ -16,7 +16,6 @@
  */
 package org.apache.sanselan.formats.psd;
 
-import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 
 public class PSDHeaderInfo

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PsdImageParser.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PsdImageParser.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PsdImageParser.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/psd/PsdImageParser.java Sat Oct 11 13:53:40 2008
@@ -34,7 +34,6 @@
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.common.IImageMetadata;
 import org.apache.sanselan.common.byteSources.ByteSource;
-import org.apache.sanselan.formats.png.chunks.PNGChunkiTXt;
 import org.apache.sanselan.formats.psd.dataparsers.DataParser;
 import org.apache.sanselan.formats.psd.dataparsers.DataParserBitmap;
 import org.apache.sanselan.formats.psd.dataparsers.DataParserCMYK;

Modified: incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java (original)
+++ incubator/sanselan/trunk/src/main/java/org/apache/sanselan/formats/tiff/TiffField.java Sat Oct 11 13:53:40 2008
@@ -17,7 +17,6 @@
 package org.apache.sanselan.formats.tiff;
 
 import java.io.IOException;
-import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -32,7 +31,6 @@
 import org.apache.sanselan.formats.tiff.constants.TagInfo;
 import org.apache.sanselan.formats.tiff.constants.TiffConstants;
 import org.apache.sanselan.formats.tiff.fieldtypes.FieldType;
-import org.apache.sanselan.util.Debug;
 
 public class TiffField implements TiffConstants
 {

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=703730&r1=703729&r2=703730&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 Sat Oct 11 13:53:40 2008
@@ -117,30 +117,6 @@
 		File dataFolder = new File(testFolder, "data");
 		File imagesFolder = new File(dataFolder, "images");
 
-		// imagesFolder = new File(imagesFolder,
-		// "ignore\\xml-sdk-examples\\BlueSquare.psd");
-		// imagesFolder = new File(imagesFolder,
-		// "exif\\drewNoakes\\007_Canon EOS D60.jpg");
-		// imagesFolder = new File(imagesFolder,
-		// "ignore\\PngSuite\\BGYN6A16.PNG");
-		// imagesFolder = new File(imagesFolder, "jpg\\3");
-		// imagesFolder = new File(imagesFolder, "");
-		// imagesFolder = new File(imagesFolder,
-		// "exif\\philHarvey\\Nokia\\Nokia5500.jpg");
-		// imagesFolder = new File(imagesFolder, "png\\2\\");
-		// imagesFolder = new File(imagesFolder,
-		// "exif\\drewNoakes\\007_FujiFilm FinePixS1Pro (5).jpg");
-		// imagesFolder = new File(imagesFolder,
-		// "iptc");
-		// src\\test\\data\\images\\exif\\drewNoakes\\007_Nikon D1X.jpg
-		// src\\test\\data\\images\\exif\\drewNoakes\\007_FujiFilm FinePixS1Pro
-		// (5).jpg
-		// imagesFolder = new File(imagesFolder,
-		// "exif\\drewNoakes\\007_Nikon D70.jpg");
-		// imagesFolder = new File(imagesFolder,
-		// "exif\\philHarvey\\Canon\\CanonEOS_D2000.jpg");
-		// imagesFolder = new File(imagesFolder,
-		// "exif\\philHarvey\\Motorola\\MotorolaE365.jpg");
 		// imagesFolder = new File(
 		// "C:\\work\\personal\\apache\\sanselan\\src\\test\\data\\images\\exif\\drewNoakes\\007_Canon EOS D60.jpg"
 		// );
@@ -150,6 +126,7 @@
 		// imagesFolder = new File(
 		// "C:\\work\\personal\\apache\\sanselan\\src\\test\\data\\images\\exif\\philHarvey\\Nikon\\NikonCoolpixS7.jpg"
 		// );
+//		imagesFolder = new File("C:\\work\\personal\\apache\\sanselan\\src\\test\\data\\images\\exif\\philHarvey\\UMAX\\UmaxAstraCam.jpg");
 
 		imagesFolder = imagesFolder.getAbsoluteFile();
 

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcBaseTest.java Sat Oct 11 13:53:40 2008
@@ -29,11 +29,6 @@
 
 public abstract class IptcBaseTest extends SanselanTest
 {
-	//	public IptcBaseTest(String name)
-	//	{
-	//		super(name);
-	//	}
-
 	protected static boolean hasIptcData(File file) throws IOException,
 			ImageReadException
 	{
@@ -45,8 +40,6 @@
 		//if (format != ImageFormat.IMAGE_FORMAT_JPEG)
 		//	return false;
 
-		//		Debug.debug("possible file", file);
-
 		try
 		{
 			ByteSource byteSource = new ByteSourceFile(file);

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcDumpTest.java Sat Oct 11 13:53:40 2008
@@ -26,10 +26,8 @@
 import org.apache.sanselan.ImageReadException;
 import org.apache.sanselan.ImageWriteException;
 import org.apache.sanselan.Sanselan;
-import org.apache.sanselan.common.byteSources.ByteSource;
-import org.apache.sanselan.common.byteSources.ByteSourceFile;
 import org.apache.sanselan.formats.jpeg.JpegImageMetadata;
-import org.apache.sanselan.formats.jpeg.JpegUtils;
+import org.apache.sanselan.formats.jpeg.JpegPhotoshopMetadata;
 import org.apache.sanselan.util.Debug;
 
 public class IptcDumpTest extends IptcBaseTest
@@ -57,7 +55,7 @@
 			params
 					.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
 							!ignoreImageData));
-//			params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
+			// params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
 
 			JpegImageMetadata metadata = (JpegImageMetadata) Sanselan
 					.getMetadata(imageFile, params);
@@ -66,7 +64,22 @@
 
 			metadata.getPhotoshop().dump();
 			// if(metadata.getPhotoshop().getItems().size()>0)
-//			Debug.debug("iptc size", metadata.getPhotoshop().getItems().size());
+			// Debug.debug("iptc size",
+			// metadata.getPhotoshop().getItems().size());
+
+			JpegPhotoshopMetadata psMetadata = metadata.getPhotoshop();
+			List oldRecords = psMetadata.photoshopApp13Data.getRecords();
+
+			System.out.println();
+			for (int j = 0; j < oldRecords.size(); j++)
+			{
+				IPTCRecord record = (IPTCRecord) oldRecords.get(j);
+				if (record.iptcType.type != IPTCConstants.IPTC_TYPE_CITY.type)
+					System.out.println("Key: " + record.iptcType.name + " (0x"
+							+ Integer.toHexString(record.iptcType.type)
+							+ "), value: " + record.value);
+			}
+			System.out.println();
 		}
 	}
 

Modified: incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java
URL: http://svn.apache.org/viewvc/incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java?rev=703730&r1=703729&r2=703730&view=diff
==============================================================================
--- incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java (original)
+++ incubator/sanselan/trunk/src/test/java/org/apache/sanselan/formats/jpeg/iptc/IptcUpdateTest.java Sat Oct 11 13:53:40 2008
@@ -47,65 +47,68 @@
 		imagesWithIptcData = getImagesWithIptcData();
 	}
 
-//	public void testRemove() throws IOException, ImageReadException,
-//			ImageWriteException
-//	{
-//		List images = imagesWithIptcData;
-//		for (int i = 0; i < images.size(); i++)
-//		{
-//			if (i % 10 == 0)
-//				Debug.purgeMemory();
-//
-//			File imageFile = (File) images.get(i);
-//			Debug.debug("imageFile", imageFile);
-//			Debug.debug();
-//
-//			ByteSource byteSource = new ByteSourceFile(imageFile);
-//			// Debug.debug("Segments:");
-//			// new JpegUtils().dumpJFIF(byteSource);
-//
-//			Map params = new HashMap();
-//			boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
-//			params
-//					.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
-//							!ignoreImageData));
-//			// params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
-//			// params.put(PARAM_KEY_VERBOSE, Boolean.TRUE);
-//
-//			JpegPhotoshopMetadata metadata = new JpegImageParser()
-//					.getPhotoshopMetadata(byteSource, params);
-//			assertNotNull(metadata);
-//			metadata.dump();
-//
-//			File noIptcFile = createTempFile(imageFile.getName()
-//					+ ".iptc.remove.", ".jpg");
-//			{
-//				// test remove
-//
-//				OutputStream os = null;
-//				try
-//				{
-//					os = new FileOutputStream(noIptcFile);
-//					os = new BufferedOutputStream(os);
-//					new JpegIptcRewriter().removeIPTC(byteSource, os);
-//				} finally
-//				{
-//					os.close();
-//					os = null;
-//				}
-//
-//				// Debug.debug("Source Segments:");
-//				// new JpegUtils().dumpJFIF(new ByteSourceFile(noIptcFile));
-//
-//				JpegPhotoshopMetadata outMetadata = new JpegImageParser()
-//						.getPhotoshopMetadata(new ByteSourceFile(noIptcFile),
-//								params);
-//				assertTrue(outMetadata == null
-//						|| outMetadata.getItems().size() == 0);
-//			}
-//
-//		}
-//	}
+	public void tearDown() throws Exception
+	{
+		super.tearDown();
+
+		imagesWithIptcData = null;
+	}
+
+	/*
+	 * Remove all Photoshop IPTC data from a JPEG file.
+	 */
+	public void testRemove() throws IOException, ImageReadException,
+			ImageWriteException
+	{
+		List images = imagesWithIptcData;
+		for (int i = 0; i < images.size(); i++)
+		{
+			if (i % 10 == 0)
+				Debug.purgeMemory();
+
+			File imageFile = (File) images.get(i);
+			// Debug.debug("imageFile", imageFile);
+			// Debug.debug();
+
+			ByteSource byteSource = new ByteSourceFile(imageFile);
+
+			Map params = new HashMap();
+			boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
+			params
+					.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
+							!ignoreImageData));
+
+			JpegPhotoshopMetadata metadata = new JpegImageParser()
+					.getPhotoshopMetadata(byteSource, params);
+			assertNotNull(metadata);
+			// metadata.dump();
+
+			File noIptcFile = createTempFile(imageFile.getName()
+					+ ".iptc.remove.", ".jpg");
+			{
+				// test remove
+
+				OutputStream os = null;
+				try
+				{
+					os = new FileOutputStream(noIptcFile);
+					os = new BufferedOutputStream(os);
+					new JpegIptcRewriter().removeIPTC(byteSource, os);
+				} finally
+				{
+					os.close();
+					os = null;
+				}
+
+				JpegPhotoshopMetadata outMetadata = new JpegImageParser()
+						.getPhotoshopMetadata(new ByteSourceFile(noIptcFile),
+								params);
+				assertTrue(outMetadata == null
+						|| outMetadata.getItems().size() == 0);
+			}
+
+		}
+	}
 
 	public void testRemoveInsertUpdate() throws IOException,
 			ImageReadException, ImageWriteException
@@ -280,7 +283,8 @@
 				{
 					os = new FileOutputStream(updated);
 					os = new BufferedOutputStream(os);
-					new JpegIptcRewriter().writeIPTC(new ByteSourceFile(noIptcFile), os, newData);
+					new JpegIptcRewriter().writeIPTC(new ByteSourceFile(
+							noIptcFile), os, newData);
 				} finally
 				{
 					os.close();
@@ -305,4 +309,104 @@
 
 		}
 	}
+
+	/*
+	 * Add a few IPTC values to JPEG images, whether or not they have existing
+	 * IPTC data.
+	 */
+	public void testAddIptcData() throws IOException, ImageReadException,
+			ImageWriteException
+	{
+		List images = getJpegImages();
+		for (int i = 0; i < images.size(); i++)
+		{
+			if (i % 10 == 0)
+				Debug.purgeMemory();
+
+			File imageFile = (File) images.get(i);
+//			 Debug.debug("imageFile", imageFile);
+//			 Debug.debug();
+
+			ByteSource byteSource = new ByteSourceFile(imageFile);
+//			 Debug.debug("Segments:");
+//			 new JpegUtils().dumpJFIF(byteSource);
+
+			Map params = new HashMap();
+			boolean ignoreImageData = isPhilHarveyTestImage(imageFile);
+			params
+					.put(PARAM_KEY_READ_THUMBNAILS, new Boolean(
+							!ignoreImageData));
+
+			JpegPhotoshopMetadata metadata = new JpegImageParser()
+					.getPhotoshopMetadata(byteSource, params);
+			// metadata.dump();
+
+			{
+				List newBlocks = new ArrayList();
+				List newRecords = new ArrayList();
+
+				if (null != metadata)
+				{
+					boolean keepOldIptcNonTextValues = true;
+					if (keepOldIptcNonTextValues)
+						newBlocks.addAll(metadata.photoshopApp13Data
+								.getNonIptcBlocks());
+					boolean keepOldIptcTextValues = true;
+					if (keepOldIptcTextValues)
+					{
+						List oldRecords = metadata.photoshopApp13Data
+								.getRecords();
+
+						newRecords = new ArrayList();
+						for (int j = 0; j < oldRecords.size(); j++)
+						{
+							IPTCRecord record = (IPTCRecord) oldRecords.get(j);
+							if (record.iptcType.type != IPTCConstants.IPTC_TYPE_CITY.type
+									&& record.iptcType.type != IPTCConstants.IPTC_TYPE_CREDIT.type)
+								newRecords.add(record);
+						}
+					}
+				}
+
+				newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CITY,
+						"Albany, NY"));
+				newRecords.add(new IPTCRecord(IPTCConstants.IPTC_TYPE_CREDIT,
+						"William Sorensen"));
+
+				PhotoshopApp13Data newData = new PhotoshopApp13Data(newRecords,
+						newBlocks);
+
+				File updated = createTempFile(imageFile.getName()
+						+ ".iptc.add.", ".jpg");
+				OutputStream os = null;
+				try
+				{
+					os = new FileOutputStream(updated);
+					os = new BufferedOutputStream(os);
+					new JpegIptcRewriter().writeIPTC(byteSource, os, newData);
+				} finally
+				{
+					os.close();
+					os = null;
+				}
+
+				// Debug.debug("Destination Segments:");
+				// new JpegUtils().dumpJFIF(new ByteSourceFile(updated));
+
+				ByteSource updateByteSource = new ByteSourceFile(updated);
+				JpegPhotoshopMetadata outMetadata = new JpegImageParser()
+						.getPhotoshopMetadata(updateByteSource, params);
+
+				// Debug.debug("outMetadata", outMetadata.toString());
+				// Debug.debug("hasIptcSegment", new JpegImageParser()
+				// .hasIptcSegment(updateByteSource));
+
+				assertNotNull(outMetadata);
+				assertTrue(outMetadata.getItems().size() == newRecords.size());
+				// assertEquals(metadata.toString(), outMetadata.toString());
+			}
+
+		}
+	}
+
 }