You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by je...@apache.org on 2010/10/28 19:02:39 UTC

svn commit: r1028385 [2/2] - in /xmlgraphics/commons/trunk: ./ src/java/org/apache/xmlgraphics/image/codec/tiff/ src/java/org/apache/xmlgraphics/image/codec/util/ src/java/org/apache/xmlgraphics/image/loader/impl/ src/java/org/apache/xmlgraphics/image/...

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/tiff/TIFFImageEncoder.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/tiff/TIFFImageEncoder.java?rev=1028385&r1=1028384&r2=1028385&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/tiff/TIFFImageEncoder.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/tiff/TIFFImageEncoder.java Thu Oct 28 17:02:39 2010
@@ -21,7 +21,6 @@ package org.apache.xmlgraphics.image.cod
 
 import java.awt.Rectangle;
 import java.awt.color.ColorSpace;
-import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.ComponentSampleModel;
 import java.awt.image.DataBuffer;
@@ -31,7 +30,6 @@ import java.awt.image.MultiPixelPackedSa
 import java.awt.image.Raster;
 import java.awt.image.RenderedImage;
 import java.awt.image.SampleModel;
-import java.awt.image.WritableRaster;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
@@ -49,9 +47,6 @@ import org.apache.xmlgraphics.image.code
 import org.apache.xmlgraphics.image.codec.util.ImageEncoderImpl;
 import org.apache.xmlgraphics.image.codec.util.SeekableOutputStream;
 
-import com.sun.image.codec.jpeg.JPEGEncodeParam;
-import com.sun.image.codec.jpeg.JPEGQTable;
-
 /**
  * A baseline TIFF writer. The writer outputs TIFF images in either Bilevel,
  * Greyscale, Palette color or Full Color modes.
@@ -118,12 +113,12 @@ public class TIFFImageEncoder extends Im
             do {
                 hasNext = iter.hasNext();
                 ifdOffset = encode(nextImage, nextParam, ifdOffset, !hasNext);
-                if(hasNext) {
+                if (hasNext) {
                     Object obj = iter.next();
-                    if(obj instanceof RenderedImage) {
+                    if (obj instanceof RenderedImage) {
                         nextImage = (RenderedImage)obj;
                         nextParam = encodeParam;
-                    } else if(obj instanceof Object[]) {
+                    } else if (obj instanceof Object[]) {
                         Object[] o = (Object[])obj;
                         nextImage = (RenderedImage)o[0];
                         nextParam = (TIFFEncodeParam)o[1];
@@ -198,6 +193,10 @@ public class TIFFImageEncoder extends Im
         // Currently all images are stored uncompressed.
         int compression = encodeParam.getCompression();
 
+        if (compression == COMP_JPEG_TTN2) {
+            throw new IllegalArgumentException("JPEG compression is not supported");
+        }
+
         // Get tiled output preference.
         boolean isTiled = encodeParam.getWriteTiled();
 
@@ -212,15 +211,15 @@ public class TIFFImageEncoder extends Im
 
         // Retrieve and verify sample size.
         int[] sampleSize = sampleModel.getSampleSize();
-        for(int i = 1; i < sampleSize.length; i++) {
-            if(sampleSize[i] != sampleSize[0]) {
+        for (int i = 1; i < sampleSize.length; i++) {
+            if (sampleSize[i] != sampleSize[0]) {
                 throw new Error("TIFFImageEncoder0");
             }
         }
 
         // Check low bit limits.
         int numBands = sampleModel.getNumBands();
-        if((sampleSize[0] == 1 || sampleSize[0] == 4) && numBands != 1) {
+        if ((sampleSize[0] == 1 || sampleSize[0] == 4) && numBands != 1) {
             throw new Error("TIFFImageEncoder1");
         }
 
@@ -228,20 +227,20 @@ public class TIFFImageEncoder extends Im
         int dataType = sampleModel.getDataType();
         switch(dataType) {
         case DataBuffer.TYPE_BYTE:
-            if(sampleSize[0] != 1 && sampleSize[0] == 4 &&    // todo does this make sense??
+            if (sampleSize[0] != 1 && sampleSize[0] == 4 &&    // todo does this make sense??
                sampleSize[0] != 8) {                          // we get error only for 4
                 throw new Error("TIFFImageEncoder2");
             }
             break;
         case DataBuffer.TYPE_SHORT:
         case DataBuffer.TYPE_USHORT:
-            if(sampleSize[0] != 16) {
+            if (sampleSize[0] != 16) {
                 throw new Error("TIFFImageEncoder3");
             }
             break;
         case DataBuffer.TYPE_INT:
         case DataBuffer.TYPE_FLOAT:
-            if(sampleSize[0] != 32) {
+            if (sampleSize[0] != 32) {
                 throw new Error("TIFFImageEncoder4");
             }
             break;
@@ -268,11 +267,11 @@ public class TIFFImageEncoder extends Im
         int imageType = TIFF_UNSUPPORTED;
         int numExtraSamples = 0;
         int extraSampleType = EXTRA_SAMPLE_UNSPECIFIED;
-        if(colorModel instanceof IndexColorModel) { // Bilevel or palette
+        if (colorModel instanceof IndexColorModel) { // Bilevel or palette
             icm = (IndexColorModel)colorModel;
             int mapSize = icm.getMapSize();
 
-            if(sampleSize[0] == 1 && numBands == 1) { // Bilevel image
+            if (sampleSize[0] == 1 && numBands == 1) { // Bilevel image
 
                 if (mapSize != 2) {
                     throw new IllegalArgumentException(
@@ -308,17 +307,17 @@ public class TIFFImageEncoder extends Im
                     imageType = TIFF_PALETTE;
                 }
 
-            } else if(numBands == 1) { // Non-bilevel image.
+            } else if (numBands == 1) { // Non-bilevel image.
                 // Palette color image.
                 imageType = TIFF_PALETTE;
             }
-        } else if(colorModel == null) {
+        } else if (colorModel == null) {
 
-            if(sampleSize[0] == 1 && numBands == 1) { // bilevel
+            if (sampleSize[0] == 1 && numBands == 1) { // bilevel
                 imageType = TIFF_BILEVEL_BLACK_IS_ZERO;
             } else { // generic image
                 imageType = TIFF_GENERIC;
-                if(numBands > 1) {
+                if (numBands > 1) {
                     numExtraSamples = numBands - 1;
                 }
             }
@@ -337,8 +336,8 @@ public class TIFFImageEncoder extends Im
                 imageType = TIFF_CIELAB;
                 break;
             case ColorSpace.TYPE_RGB:
-                if(compression == COMP_JPEG_TTN2 &&
-                   encodeParam.getJPEGCompressRGBToYCbCr()) {
+                if (compression == COMP_JPEG_TTN2
+                        && encodeParam.getJPEGCompressRGBToYCbCr()) {
                     imageType = TIFF_YCBCR;
                 } else {
                     imageType = TIFF_RGB;
@@ -352,35 +351,23 @@ public class TIFFImageEncoder extends Im
                 break;
             }
 
-            if(imageType == TIFF_GENERIC) {
+            if (imageType == TIFF_GENERIC) {
                 numExtraSamples = numBands - 1;
-            } else if(numBands > 1) {
+            } else if (numBands > 1) {
                 numExtraSamples = numBands - colorSpace.getNumComponents();
             }
 
-            if(numExtraSamples == 1 && colorModel.hasAlpha()) {
+            if (numExtraSamples == 1 && colorModel.hasAlpha()) {
                 extraSampleType = colorModel.isAlphaPremultiplied() ?
                     EXTRA_SAMPLE_ASSOCIATED_ALPHA :
                     EXTRA_SAMPLE_UNASSOCIATED_ALPHA;
             }
         }
 
-        if(imageType == TIFF_UNSUPPORTED) {
+        if (imageType == TIFF_UNSUPPORTED) {
             throw new Error("TIFFImageEncoder8");
         }
 
-        // Check JPEG compatibility.
-        if(compression == COMP_JPEG_TTN2) {
-            if(imageType == TIFF_PALETTE) {
-                throw new Error("TIFFImageEncoder11");
-            } else if(!(sampleSize[0] == 8 &&
-                        (imageType == TIFF_GRAY ||
-                         imageType == TIFF_RGB ||
-                         imageType == TIFF_YCBCR))) {
-                throw new Error("TIFFImageEncoder9");
-            }
-        }
-
         int photometricInterpretation = -1;
         switch (imageType) {
 
@@ -414,7 +401,7 @@ public class TIFFImageEncoder extends Im
             int redIndex = 0, greenIndex = sizeOfColormap;
             int blueIndex = 2 * sizeOfColormap;
             colormap = new char[sizeOfColormap * 3];
-            for (int i=0; i<sizeOfColormap; i++) {
+            for (int i = 0; i < sizeOfColormap; i++) {
                 int tmp = 0xff & r[i];   // beware of sign extended bytes
                 colormap[redIndex++]   = (char)((tmp << 8) | tmp);
                 tmp = 0xff & g[i];
@@ -450,7 +437,7 @@ public class TIFFImageEncoder extends Im
         // Initialize tile dimensions.
         int tileWidth;
         int tileHeight;
-        if(isTiled) {
+        if (isTiled) {
             tileWidth = encodeParam.getTileWidth() > 0 ?
                 encodeParam.getTileWidth() : im.getTileWidth();
             tileHeight = encodeParam.getTileHeight() > 0 ?
@@ -462,51 +449,14 @@ public class TIFFImageEncoder extends Im
                 encodeParam.getTileHeight() : DEFAULT_ROWS_PER_STRIP;
         }
 
-        // Re-tile for JPEG conformance if needed.
-        JPEGEncodeParam jep = null;
-        if(compression == COMP_JPEG_TTN2) {
-            // Get JPEGEncodeParam from encodeParam.
-            jep = encodeParam.getJPEGEncodeParam();
-
-            // Determine maximum subsampling.
-            int maxSubH = jep.getHorizontalSubsampling(0);
-            int maxSubV = jep.getVerticalSubsampling(0);
-            for(int i = 1; i < numBands; i++) {
-                int subH = jep.getHorizontalSubsampling(i);
-                if(subH > maxSubH) {
-                    maxSubH = subH;
-                }
-                int subV = jep.getVerticalSubsampling(i);
-                if(subV > maxSubV) {
-                    maxSubV = subV;
-                }
-            }
-
-            int factorV = 8*maxSubV;
-            tileHeight =
-                (int)((float)tileHeight/(float)factorV + 0.5F)*factorV;
-            if(tileHeight < factorV) {
-                tileHeight = factorV;
-            }
-
-            if(isTiled) {
-                int factorH = 8*maxSubH;
-                tileWidth =
-                    (int)((float)tileWidth/(float)factorH + 0.5F)*factorH;
-                if(tileWidth < factorH) {
-                    tileWidth = factorH;
-                }
-            }
-        }
-
         int numTiles;
-        if(isTiled) {
+        if (isTiled) {
             // NB: Parentheses are used in this statement for correct rounding.
             numTiles =
-                ((width + tileWidth - 1)/tileWidth) *
-                ((height + tileHeight - 1)/tileHeight);
+                ((width + tileWidth - 1) / tileWidth) *
+                ((height + tileHeight - 1) / tileHeight);
         } else {
-            numTiles = (int)Math.ceil((double)height/(double)tileHeight);
+            numTiles = (int)Math.ceil((double)height / (double)tileHeight);
         }
 
         long[] tileByteCounts = new long[numTiles];
@@ -516,18 +466,18 @@ public class TIFFImageEncoder extends Im
 
         long bytesPerTile = bytesPerRow * tileHeight;
 
-        for (int i=0; i<numTiles; i++) {
+        for (int i = 0; i < numTiles; i++) {
             tileByteCounts[i] = bytesPerTile;
         }
 
-        if(!isTiled) {
+        if (!isTiled) {
             // Last strip may have lesser rows
-            long lastStripRows = height - (tileHeight * (numTiles-1));
-            tileByteCounts[numTiles-1] = lastStripRows * bytesPerRow;
+            long lastStripRows = height - (tileHeight * (numTiles - 1));
+            tileByteCounts[numTiles - 1] = lastStripRows * bytesPerRow;
         }
 
         long totalBytesOfData = bytesPerTile * (numTiles - 1) +
-            tileByteCounts[numTiles-1];
+            tileByteCounts[numTiles - 1];
 
         // The data will be written after the IFD: create the array here
         // but fill it in later.
@@ -560,8 +510,9 @@ public class TIFFImageEncoder extends Im
                                  new long[] {height}));
 
         char [] shortSampleSize = new char[numBands];
-        for (int i=0; i<numBands; i++)
+        for (int i = 0; i < numBands; i++) {
             shortSampleSize[i] = (char)sampleSize[i];
+        }
         fields.add(new TIFFField(TIFFImageDecoder.TIFF_BITS_PER_SAMPLE,
                                  TIFFField.TIFF_SHORT, numBands,
                                  shortSampleSize));
@@ -575,7 +526,7 @@ public class TIFFImageEncoder extends Im
                           TIFFField.TIFF_SHORT, 1,
                                  new char[] {(char)photometricInterpretation}));
 
-        if(!isTiled) {
+        if (!isTiled) {
             fields.add(new TIFFField(TIFFImageDecoder.TIFF_STRIP_OFFSETS,
                                      TIFFField.TIFF_LONG, numTiles,
                                      tileOffsets));
@@ -585,7 +536,7 @@ public class TIFFImageEncoder extends Im
                                  TIFFField.TIFF_SHORT, 1,
                                  new char[] {(char)numBands}));
 
-        if(!isTiled) {
+        if (!isTiled) {
             fields.add(new TIFFField(TIFFImageDecoder.TIFF_ROWS_PER_STRIP,
                                      TIFFField.TIFF_LONG, 1,
                                      new long[] {tileHeight}));
@@ -601,7 +552,7 @@ public class TIFFImageEncoder extends Im
                                      colormap));
         }
 
-        if(isTiled) {
+        if (isTiled) {
             fields.add(new TIFFField(TIFFImageDecoder.TIFF_TILE_WIDTH,
                                      TIFFField.TIFF_LONG, 1,
                                      new long[] {tileWidth}));
@@ -619,9 +570,9 @@ public class TIFFImageEncoder extends Im
                                      tileByteCounts));
         }
 
-        if(numExtraSamples > 0) {
+        if (numExtraSamples > 0) {
             char[] extraSamples = new char[numExtraSamples];
-            for(int i = 0; i < numExtraSamples; i++) {
+            for (int i = 0; i < numExtraSamples; i++) {
                 extraSamples[i] = (char)extraSampleType;
             }
             fields.add(new TIFFField(TIFFImageDecoder.TIFF_EXTRA_SAMPLES,
@@ -630,17 +581,17 @@ public class TIFFImageEncoder extends Im
         }
 
         // Data Sample Format Extension fields.
-        if(dataType != DataBuffer.TYPE_BYTE) {
+        if (dataType != DataBuffer.TYPE_BYTE) {
             // SampleFormat
             char[] sampleFormat = new char[numBands];
-            if(dataType == DataBuffer.TYPE_FLOAT) {
+            if (dataType == DataBuffer.TYPE_FLOAT) {
                 sampleFormat[0] = 3;
-            } else if(dataType == DataBuffer.TYPE_USHORT) {
+            } else if (dataType == DataBuffer.TYPE_USHORT) {
                 sampleFormat[0] = 1;
             } else {
                 sampleFormat[0] = 2;
             }
-            for(int b = 1; b < numBands; b++) {
+            for (int b = 1; b < numBands; b++) {
                 sampleFormat[b] = sampleFormat[0];
             }
             fields.add(new TIFFField(TIFFImageDecoder.TIFF_SAMPLE_FORMAT,
@@ -654,89 +605,12 @@ public class TIFFImageEncoder extends Im
             // use it if available.
         }
 
-        // Initialize some JPEG variables.
-        com.sun.image.codec.jpeg.JPEGEncodeParam jpegEncodeParam = null;
-        com.sun.image.codec.jpeg.JPEGImageEncoder jpegEncoder = null;
-        int jpegColorID = 0;
-
-        if(compression == COMP_JPEG_TTN2) {
-
-            // Initialize JPEG color ID.
-            jpegColorID =
-                com.sun.image.codec.jpeg.JPEGDecodeParam.COLOR_ID_UNKNOWN;
-            switch(imageType) {
-            case TIFF_GRAY:
-            case TIFF_PALETTE:
-                jpegColorID =
-                    com.sun.image.codec.jpeg.JPEGDecodeParam.COLOR_ID_GRAY;
-                break;
-            case TIFF_RGB:
-                if (colorModel.hasAlpha()) {
-                    jpegColorID = com.sun.image.codec.jpeg.JPEGDecodeParam.COLOR_ID_RGBA;
-                } else {
-                    jpegColorID = com.sun.image.codec.jpeg.JPEGDecodeParam.COLOR_ID_RGB;
-                }
-                break;
-            case TIFF_YCBCR:
-                if (colorModel.hasAlpha()) {
-                    jpegColorID = com.sun.image.codec.jpeg.JPEGDecodeParam.COLOR_ID_YCbCrA;
-                } else {
-                    jpegColorID = com.sun.image.codec.jpeg.JPEGDecodeParam.COLOR_ID_YCbCr;
-                }
-                break;
-            }
-
-            // Get the JDK encoding parameters.
-            Raster tile00 = im.getTile(0, 0);
-            jpegEncodeParam =
-                com.sun.image.codec.jpeg.JPEGCodec.getDefaultJPEGEncodeParam(
-                    tile00, jpegColorID);
-
-            modifyEncodeParam(jep, jpegEncodeParam, numBands);
-
-            // Write an abbreviated tables-only stream to JPEGTables field.
-            jpegEncodeParam.setImageInfoValid(false);
-            jpegEncodeParam.setTableInfoValid(true);
-            ByteArrayOutputStream tableStream =
-              new ByteArrayOutputStream();
-            jpegEncoder =
-              com.sun.image.codec.jpeg.JPEGCodec.createJPEGEncoder(
-                tableStream,
-                jpegEncodeParam);
-            jpegEncoder.encode(tile00);
-            byte[] tableData = tableStream.toByteArray();
-            fields.add(new TIFFField(TIFF_JPEG_TABLES,
-                                     TIFFField.TIFF_UNDEFINED,
-                                     tableData.length,
-                                     tableData));
-
-            // Reset encoder so it's recreated below.
-            jpegEncoder = null;
-        }
-
-        if(imageType == TIFF_YCBCR) {
+        if (imageType == TIFF_YCBCR) {
             // YCbCrSubSampling: 2 is the default so we must write 1 as
             // we do not (yet) do any subsampling.
             char subsampleH = 1;
             char subsampleV = 1;
 
-            // If JPEG, update values.
-            if(compression == COMP_JPEG_TTN2) {
-                // Determine maximum subsampling.
-                subsampleH = (char)jep.getHorizontalSubsampling(0);
-                subsampleV = (char)jep.getVerticalSubsampling(0);
-                for(int i = 1; i < numBands; i++) {
-                    char subH = (char)jep.getHorizontalSubsampling(i);
-                    if(subH > subsampleH) {
-                        subsampleH = subH;
-                    }
-                    char subV = (char)jep.getVerticalSubsampling(i);
-                    if(subV > subsampleV) {
-                        subsampleV = subV;
-                    }
-                }
-            }
-
             fields.add(new TIFFField(TIFF_YCBCR_SUBSAMPLING,
                                      TIFFField.TIFF_SHORT, 2,
                                      new char[] {subsampleH, subsampleV}));
@@ -746,21 +620,13 @@ public class TIFFImageEncoder extends Im
             fields.add(new TIFFField(TIFF_YCBCR_POSITIONING,
                                      TIFFField.TIFF_SHORT, 1,
                                      new char[]
-                {(char)((compression == COMP_JPEG_TTN2)? 1 : 2)}));
+                {(char)((compression == COMP_JPEG_TTN2) ? 1 : 2)}));
 
             // Reference black/white.
             long[][] refbw;
-            if(compression == COMP_JPEG_TTN2) {
-                refbw =
-                    new long[][] { // no headroon/footroom
-                        {0, 1}, {255, 1}, {128, 1}, {255, 1}, {128, 1}, {255, 1}
-                    };
-            } else {
-                refbw =
-                    new long[][] { // CCIR 601.1 headroom/footroom (presumptive)
-                        {15, 1}, {235, 1}, {128, 1}, {240, 1}, {128, 1}, {240, 1}
-                    };
-            }
+            refbw = new long[][] // CCIR 601.1 headroom/footroom (presumptive)
+                    {{15, 1}, {235, 1}, {128, 1}, {240, 1}, {128, 1}, {240, 1}};
+
             fields.add(new TIFFField(TIFF_REF_BLACK_WHITE,
                                      TIFFField.TIFF_RATIONAL, 6,
                                      refbw));
@@ -771,19 +637,19 @@ public class TIFFImageEncoder extends Im
 
         // Add extra fields specified via the encoding parameters.
         TIFFField[] extraFields = encodeParam.getExtraFields();
-        if(extraFields != null) {
+        if (extraFields != null) {
             List extantTags = new ArrayList(fields.size());
             Iterator fieldIter = fields.iterator();
-            while(fieldIter.hasNext()) {
+            while (fieldIter.hasNext()) {
                 TIFFField fld = (TIFFField)fieldIter.next();
                 extantTags.add(new Integer(fld.getTag()));
             }
 
             int numExtraFields = extraFields.length;
-            for(int i = 0; i < numExtraFields; i++) {
+            for (int i = 0; i < numExtraFields; i++) {
                 TIFFField fld = extraFields[i];
                 Integer tagValue = new Integer(fld.getTag());
-                if(!extantTags.contains(tagValue)) {
+                if (!extantTags.contains(tagValue)) {
                     fields.add(fld);
                     extantTags.add(tagValue);
                 }
@@ -801,7 +667,7 @@ public class TIFFImageEncoder extends Im
         // following the IFD so initialize the first offset accordingly.
         tileOffsets[0] = ifdOffset + dirSize;
 
-        // Branch here depending on whether data are being comrpressed.
+        // Branch here depending on whether data are being compressed.
         // If not, then the IFD is written immediately.
         // If so then there are three possibilities:
         // A) the OutputStream is a SeekableOutputStream (outCache null);
@@ -820,31 +686,31 @@ public class TIFFImageEncoder extends Im
         Deflater deflater = null;
         boolean jpegRGBToYCbCr = false;
 
-        if(compression == COMP_NONE) {
+        if (compression == COMP_NONE) {
             // Determine the number of bytes of padding necessary between
             // the end of the IFD and the first data segment such that the
             // alignment of the data conforms to the specification (required
             // for uncompressed data only).
             int numBytesPadding = 0;
-            if(sampleSize[0] == 16 && tileOffsets[0] % 2 != 0) {
+            if (sampleSize[0] == 16 && tileOffsets[0] % 2 != 0) {
                 numBytesPadding = 1;
                 tileOffsets[0]++;
-            } else if(sampleSize[0] == 32 && tileOffsets[0] % 4 != 0) {
+            } else if (sampleSize[0] == 32 && tileOffsets[0] % 4 != 0) {
                 numBytesPadding = (int)(4 - tileOffsets[0] % 4);
                 tileOffsets[0] += numBytesPadding;
             }
 
             // Update the data offsets (which TIFFField stores by reference).
             for (int i = 1; i < numTiles; i++) {
-                tileOffsets[i] = tileOffsets[i-1] + tileByteCounts[i-1];
+                tileOffsets[i] = tileOffsets[i - 1] + tileByteCounts[i - 1];
             }
 
-            if(!isLast) {
+            if (!isLast) {
                 // Determine the offset of the next IFD.
                 nextIFDOffset = (int)(tileOffsets[0] + totalBytesOfData);
 
                 // IFD offsets must be on a word boundary.
-                if ((nextIFDOffset&0x01) != 0) {
+                if ((nextIFDOffset & 0x01) != 0) {
                     nextIFDOffset++;
                     skipByte = true;
                 }
@@ -855,8 +721,8 @@ public class TIFFImageEncoder extends Im
 
             // Write any padding bytes needed between the end of the IFD
             // and the start of the actual image data.
-            if(numBytesPadding != 0) {
-                for(int padding = 0; padding < numBytesPadding; padding++) {
+            if (numBytesPadding != 0) {
+                for (int padding = 0; padding < numBytesPadding; padding++) {
                     output.write((byte)0);
                 }
             }
@@ -875,12 +741,11 @@ public class TIFFImageEncoder extends Im
                     // Attempt to create a temporary file.
                     tempFile = File.createTempFile("jai-SOS-", ".tmp");
                     tempFile.deleteOnExit();
-                    RandomAccessFile raFile =
-                        new RandomAccessFile(tempFile, "rw");
+                    RandomAccessFile raFile = new RandomAccessFile(tempFile, "rw");
                     output = new SeekableOutputStream(raFile);
 
                     // this method is exited!
-                } catch(Exception e) {
+                } catch (Exception e) {
                     // Allocate memory for the entire image data (!).
                     output = new ByteArrayOutputStream((int)totalBytesOfData);
                 }
@@ -889,19 +754,7 @@ public class TIFFImageEncoder extends Im
             int bufSize = 0;
             switch(compression) {
             case COMP_PACKBITS:
-                bufSize = (int)(bytesPerTile +
-                                ((bytesPerRow+127)/128)*tileHeight);
-                break;
-            case COMP_JPEG_TTN2:
-                bufSize = 0;
-
-                // Set color conversion flag.
-                if(imageType == TIFF_YCBCR &&
-                   colorModel != null &&
-                   colorModel.getColorSpace().getType() ==
-                   ColorSpace.TYPE_RGB) {
-                    jpegRGBToYCbCr = true;
-                }
+                bufSize = (int)(bytesPerTile + ((bytesPerRow + 127) / 128) * tileHeight);
                 break;
             case COMP_DEFLATE:
                 bufSize = (int)bytesPerTile;
@@ -910,7 +763,7 @@ public class TIFFImageEncoder extends Im
             default:
                 bufSize = 0;
             }
-            if(bufSize != 0) {
+            if (bufSize != 0) {
                 compressBuf = new byte[bufSize];
             }
         }
@@ -932,12 +785,12 @@ public class TIFFImageEncoder extends Im
         // Also create a buffer to hold tileHeight lines of the
         // data to be written to the file, so we can use array writes.
         byte[] bpixels = null;
-        if(compression != COMP_JPEG_TTN2) {
-            if(dataType == DataBuffer.TYPE_BYTE) {
+        if (compression != COMP_JPEG_TTN2) {
+            if (dataType == DataBuffer.TYPE_BYTE) {
                 bpixels = new byte[tileHeight * tileWidth * numBands];
-            } else if(dataTypeIsShort) {
+            } else if (dataTypeIsShort) {
                 bpixels = new byte[2 * tileHeight * tileWidth * numBands];
-            } else if(dataType == DataBuffer.TYPE_INT ||
+            } else if (dataType == DataBuffer.TYPE_INT ||
                       dataType == DataBuffer.TYPE_FLOAT) {
                 bpixels = new byte[4 * tileHeight * tileWidth * numBands];
             }
@@ -952,15 +805,15 @@ public class TIFFImageEncoder extends Im
                 tileHeight : Math.min(tileHeight, lastRow - row);
             int size = rows * tileWidth * numBands;
 
-            for(int col = minX; col < lastCol; col += tileWidth) {
+            for (int col = minX; col < lastCol; col += tileWidth) {
                 // Grab the pixels
                 Raster src =
                     im.getData(new Rectangle(col, row, tileWidth, rows));
 
                 boolean useDataBuffer = false;
-                if(compression != COMP_JPEG_TTN2) { // JPEG access Raster
-                    if(checkContiguous) {
-                        if(sampleSize[0] == 8) { // 8-bit
+                if (compression != COMP_JPEG_TTN2) { // JPEG access Raster
+                    if (checkContiguous) {
+                        if (sampleSize[0] == 8) { // 8-bit
                             ComponentSampleModel csm =
                                 (ComponentSampleModel)src.getSampleModel();
                             int[] bankIndices = csm.getBankIndices();
@@ -968,15 +821,15 @@ public class TIFFImageEncoder extends Im
                             int pixelStride = csm.getPixelStride();
                             int lineStride = csm.getScanlineStride();
 
-                            if(pixelStride != numBands ||
+                            if (pixelStride != numBands ||
                                lineStride != bytesPerRow) {
                                 useDataBuffer = false;
                             } else {
                                 useDataBuffer = true;
-                                for(int i = 0;
+                                for (int i = 0;
                                     useDataBuffer && i < numBands;
                                     i++) {
-                                    if(bankIndices[i] != 0 ||
+                                    if (bankIndices[i] != 0 ||
                                        bandOffsets[i] != i) {
                                         useDataBuffer = false;
                                     }
@@ -985,7 +838,7 @@ public class TIFFImageEncoder extends Im
                         } else { // 1-bit
                             MultiPixelPackedSampleModel mpp =
                                 (MultiPixelPackedSampleModel)src.getSampleModel();
-                            if(mpp.getNumBands() == 1 &&
+                            if (mpp.getNumBands() == 1 &&
                                mpp.getDataBitOffset() == 0 &&
                                mpp.getPixelBitStride() == 1) {
                                 useDataBuffer = true;
@@ -993,8 +846,8 @@ public class TIFFImageEncoder extends Im
                         }
                     }
 
-                    if(!useDataBuffer) {
-                        if(dataType == DataBuffer.TYPE_FLOAT) {
+                    if (!useDataBuffer) {
+                        if (dataType == DataBuffer.TYPE_FLOAT) {
                             fpixels = src.getPixels(col, row, tileWidth, rows,
                                                     fpixels);
                         } else {
@@ -1008,11 +861,11 @@ public class TIFFImageEncoder extends Im
 
                 int pixel = 0;
                 int k = 0;
-                switch(sampleSize[0]) {
+                switch (sampleSize[0]) {
 
                 case 1:
 
-                    if(useDataBuffer) {
+                    if (useDataBuffer) {
                         byte[] btmp =
                             ((DataBufferByte)src.getDataBuffer()).getData();
                         MultiPixelPackedSampleModel mpp =
@@ -1023,13 +876,13 @@ public class TIFFImageEncoder extends Im
                                           src.getSampleModelTranslateX(),
                                           row -
                                           src.getSampleModelTranslateY());
-                        if(lineStride == (int)bytesPerRow) {
+                        if (lineStride == (int)bytesPerRow) {
                             System.arraycopy(btmp, inOffset,
                                              bpixels, 0,
-                                             (int)bytesPerRow*rows);
+                                             (int)bytesPerRow * rows);
                         } else {
                             int outOffset = 0;
-                            for(int j = 0; j < rows; j++) {
+                            for (int j = 0; j < rows; j++) {
                                 System.arraycopy(btmp, inOffset,
                                                  bpixels, outOffset,
                                                  (int)bytesPerRow);
@@ -1041,10 +894,10 @@ public class TIFFImageEncoder extends Im
                         index = 0;
 
                         // For each of the rows in a strip
-                        for (int i=0; i<rows; i++) {
+                        for (int i = 0; i < rows; i++) {
 
                             // Write number of pixels exactly divisible by 8
-                            for (int j=0; j<tileWidth/8; j++) {
+                            for (int j = 0; j < tileWidth / 8; j++) {
 
                                 pixel =
                                     (pixels[index++] << 7) |
@@ -1059,9 +912,9 @@ public class TIFFImageEncoder extends Im
                             }
 
                             // Write the pixels remaining after division by 8
-                            if (tileWidth%8 > 0) {
+                            if (tileWidth % 8 > 0) {
                                 pixel = 0;
-                                for (int j=0; j<tileWidth%8; j++) {
+                                for (int j = 0; j < tileWidth % 8; j++) {
                                     pixel |= (pixels[index++] << (7 - j));
                                 }
                                 bpixels[k++] = (byte)pixel;
@@ -1069,16 +922,16 @@ public class TIFFImageEncoder extends Im
                         }
                     }
 
-                    if(compression == COMP_NONE) {
-                        output.write(bpixels, 0, rows * ((tileWidth+7)/8));
-                    } else if(compression == COMP_PACKBITS) {
+                    if (compression == COMP_NONE) {
+                        output.write(bpixels, 0, rows * ((tileWidth + 7) / 8));
+                    } else if (compression == COMP_PACKBITS) {
                         int numCompressedBytes =
                             compressPackBits(bpixels, rows,
                                              (int)bytesPerRow,
                                              compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
                         output.write(compressBuf, 0, numCompressedBytes);
-                    } else if(compression == COMP_DEFLATE) {
+                    } else if (compression == COMP_DEFLATE) {
                         int numCompressedBytes =
                             deflate(deflater, bpixels, compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
@@ -1092,11 +945,11 @@ public class TIFFImageEncoder extends Im
                     index = 0;
 
                     // For each of the rows in a strip
-                    for (int i=0; i<rows; i++) {
+                    for (int i = 0; i < rows; i++) {
 
                         // Write  the number of pixels that will fit into an
                         // even number of nibbles.
-                        for (int j=0; j < tileWidth/2; j++) {
+                        for (int j = 0; j < tileWidth / 2; j++) {
                             pixel = (pixels[index++] << 4) | pixels[index++];
                             bpixels[k++] = (byte)pixel;
                         }
@@ -1108,16 +961,16 @@ public class TIFFImageEncoder extends Im
                         }
                     }
 
-                    if(compression == COMP_NONE) {
-                        output.write(bpixels, 0, rows * ((tileWidth+1)/2));
-                    } else if(compression == COMP_PACKBITS) {
+                    if (compression == COMP_NONE) {
+                        output.write(bpixels, 0, rows * ((tileWidth + 1) / 2));
+                    } else if (compression == COMP_PACKBITS) {
                         int numCompressedBytes =
                             compressPackBits(bpixels, rows,
                                              (int)bytesPerRow,
                                              compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
                         output.write(compressBuf, 0, numCompressedBytes);
-                    } else if(compression == COMP_DEFLATE) {
+                    } else if (compression == COMP_DEFLATE) {
                         int numCompressedBytes =
                             deflate(deflater, bpixels, compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
@@ -1127,8 +980,8 @@ public class TIFFImageEncoder extends Im
 
                 case 8:
 
-                    if(compression != COMP_JPEG_TTN2) {
-                        if(useDataBuffer) {
+                    if (compression != COMP_JPEG_TTN2) {
+                        if (useDataBuffer) {
                             byte[] btmp =
                                 ((DataBufferByte)src.getDataBuffer()).getData();
                             ComponentSampleModel csm =
@@ -1139,14 +992,14 @@ public class TIFFImageEncoder extends Im
                                               row -
                                               src.getSampleModelTranslateY());
                             int lineStride = csm.getScanlineStride();
-                            if(lineStride == (int)bytesPerRow) {
+                            if (lineStride == (int)bytesPerRow) {
                                 System.arraycopy(btmp,
                                                  inOffset,
                                                  bpixels, 0,
-                                                 (int)bytesPerRow*rows);
+                                                 (int)bytesPerRow * rows);
                             } else {
                                 int outOffset = 0;
-                                for(int j = 0; j < rows; j++) {
+                                for (int j = 0; j < rows; j++) {
                                     System.arraycopy(btmp, inOffset,
                                                      bpixels, outOffset,
                                                      (int)bytesPerRow);
@@ -1161,62 +1014,16 @@ public class TIFFImageEncoder extends Im
                         }
                     }
 
-                    if(compression == COMP_NONE) {
+                    if (compression == COMP_NONE) {
                         output.write(bpixels, 0, size);
-                    } else if(compression == COMP_PACKBITS) {
+                    } else if (compression == COMP_PACKBITS) {
                         int numCompressedBytes =
                             compressPackBits(bpixels, rows,
                                              (int)bytesPerRow,
                                              compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
                         output.write(compressBuf, 0, numCompressedBytes);
-                    } else if(compression == COMP_JPEG_TTN2) {
-                        long startPos = getOffset(output);
-
-                        // Recreate encoder and parameters if the encoder
-                        // is null (first data segment) or if its size
-                        // doesn't match the current data segment.
-                        if(jpegEncoder == null ||
-                           jpegEncodeParam.getWidth() != src.getWidth() ||
-                           jpegEncodeParam.getHeight() != src.getHeight()) {
-
-                          jpegEncodeParam =
-                            com.sun.image.codec.jpeg.JPEGCodec.
-                                getDefaultJPEGEncodeParam(src, jpegColorID);
-
-                            modifyEncodeParam(jep, jpegEncodeParam,
-                                              numBands);
-
-                            jpegEncoder =
-                              com.sun.image.codec.jpeg.JPEGCodec.
-                              createJPEGEncoder(output, jpegEncodeParam);
-                        }
-
-                        if(jpegRGBToYCbCr) {
-                            WritableRaster wRas = null;
-                            if(src instanceof WritableRaster) {
-                                wRas = (WritableRaster)src;
-                            } else {
-                                wRas = src.createCompatibleWritableRaster();
-                                wRas.setRect(src);
-                            }
-
-                            if (wRas.getMinX() != 0 || wRas.getMinY() != 0) {
-                                wRas =
-                                    wRas.createWritableTranslatedChild(0, 0);
-                            }
-                            BufferedImage bi =
-                                new BufferedImage(colorModel, wRas,
-                                                  false, null);
-                            jpegEncoder.encode(bi);
-                        } else {
-                            jpegEncoder.encode(src.createTranslatedChild(0,
-                                                                         0));
-                        }
-
-                        long endPos = getOffset(output);
-                        tileByteCounts[tileNum++] = (int)(endPos - startPos);
-                    } else if(compression == COMP_DEFLATE) {
+                    } else if (compression == COMP_DEFLATE) {
                         int numCompressedBytes =
                             deflate(deflater, bpixels, compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
@@ -1233,16 +1040,16 @@ public class TIFFImageEncoder extends Im
                         bpixels[ls++] = (byte) (value & 0x00ff);
                     }
 
-                    if(compression == COMP_NONE) {
+                    if (compression == COMP_NONE) {
                         output.write(bpixels, 0, size*2);
-                    } else if(compression == COMP_PACKBITS) {
+                    } else if (compression == COMP_PACKBITS) {
                         int numCompressedBytes =
                             compressPackBits(bpixels, rows,
                                              (int)bytesPerRow,
                                              compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
                         output.write(compressBuf, 0, numCompressedBytes);
-                    } else if(compression == COMP_DEFLATE) {
+                    } else if (compression == COMP_DEFLATE) {
                         int numCompressedBytes =
                             deflate(deflater, bpixels, compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
@@ -1251,7 +1058,7 @@ public class TIFFImageEncoder extends Im
                     break;
 
                 case 32:
-                    if(dataType == DataBuffer.TYPE_INT) {
+                    if (dataType == DataBuffer.TYPE_INT) {
                         int li = 0;
                         for (int i = 0; i < size; i++) {
                             int value = pixels[i];
@@ -1270,16 +1077,16 @@ public class TIFFImageEncoder extends Im
                             bpixels[lf++] = (byte)( value & 0x000000ff);
                         }
                     }
-                    if(compression == COMP_NONE) {
+                    if (compression == COMP_NONE) {
                         output.write(bpixels, 0, size*4);
-                    } else if(compression == COMP_PACKBITS) {
+                    } else if (compression == COMP_PACKBITS) {
                         int numCompressedBytes =
                             compressPackBits(bpixels, rows,
                                              (int)bytesPerRow,
                                              compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
                         output.write(compressBuf, 0, numCompressedBytes);
-                    } else if(compression == COMP_DEFLATE) {
+                    } else if (compression == COMP_DEFLATE) {
                         int numCompressedBytes =
                             deflate(deflater, bpixels, compressBuf);
                         tileByteCounts[tileNum++] = numCompressedBytes;
@@ -1291,20 +1098,20 @@ public class TIFFImageEncoder extends Im
             }
         }
 
-        if(compression == COMP_NONE) {
+        if (compression == COMP_NONE) {
             // Write an extra byte for IFD word alignment if needed.
-            if(skipByte) {
+            if (skipByte) {
                 output.write((byte)0);
             }
         } else {
             // Recompute the tile offsets the size of the compressed tiles.
             int totalBytes = 0;
-            for (int i=1; i<numTiles; i++) {
-                int numBytes = (int)tileByteCounts[i-1];
+            for (int i = 1; i < numTiles; i++) {
+                int numBytes = (int)tileByteCounts[i - 1];
                 totalBytes += numBytes;
-                tileOffsets[i] = tileOffsets[i-1] + numBytes;
+                tileOffsets[i] = tileOffsets[i - 1] + numBytes;
             }
-            totalBytes += (int)tileByteCounts[numTiles-1];
+            totalBytes += (int)tileByteCounts[numTiles - 1];
 
             nextIFDOffset = isLast ?
                 0 : ifdOffset + dirSize + totalBytes;
@@ -1313,11 +1120,11 @@ public class TIFFImageEncoder extends Im
                 skipByte = true;
             }
 
-            if(outCache == null) {
+            if (outCache == null) {
                 // Original OutputStream must be a SeekableOutputStream.
 
                 // Write an extra byte for IFD word alignment if needed.
-                if(skipByte) {
+                if (skipByte) {
                     output.write((byte)0);
                 }
 
@@ -1332,7 +1139,7 @@ public class TIFFImageEncoder extends Im
 
                 // Seek forward to position after data.
                 sos.seek(savePos);
-            } else if(tempFile != null) {
+            } else if (tempFile != null) {
 
                 // Using a file cache for the image data.
 
@@ -1351,9 +1158,9 @@ public class TIFFImageEncoder extends Im
                 // Write the image data.
                 byte[] copyBuffer = new byte[8192];
                 int bytesCopied = 0;
-                while(bytesCopied < totalBytes) {
+                while (bytesCopied < totalBytes) {
                     int bytesRead = fileStream.read(copyBuffer);
-                    if(bytesRead == -1) {
+                    if (bytesRead == -1) {
                         break;
                     }
                     output.write(copyBuffer, 0, bytesRead);
@@ -1365,15 +1172,14 @@ public class TIFFImageEncoder extends Im
                 tempFile.delete();
 
                 // Write an extra byte for IFD word alignment if needed.
-                if(skipByte) {
+                if (skipByte) {
                     output.write((byte)0);
                 }
-            } else if(output instanceof ByteArrayOutputStream) {
+            } else if (output instanceof ByteArrayOutputStream) {
 
                 // Using a memory cache for the image data.
 
-                ByteArrayOutputStream memoryStream =
-                    (ByteArrayOutputStream)output;
+                ByteArrayOutputStream memoryStream = (ByteArrayOutputStream)output;
 
                 // Reset variable to the original OutputStream.
                 output = outCache;
@@ -1385,7 +1191,7 @@ public class TIFFImageEncoder extends Im
                 memoryStream.writeTo(output);
 
                 // Write an extra byte for IFD word alignment if needed.
-                if(skipByte) {
+                if (skipByte) {
                     output.write((byte)0);
                 }
             } else {
@@ -1406,19 +1212,19 @@ public class TIFFImageEncoder extends Im
         int numEntries = fields.size();
 
         // Initialize the size excluding that of any values > 4 bytes.
-        int dirSize = 2 + numEntries*12 + 4;
+        int dirSize = 2 + numEntries * 12 + 4;
 
         // Loop over fields adding the size of all values > 4 bytes.
         Iterator iter = fields.iterator();
-        while(iter.hasNext()) {
+        while (iter.hasNext()) {
             // Get the field.
             TIFFField field = (TIFFField)iter.next();
 
             // Determine the size of the field value.
-            int valueSize = field.getCount()*sizeOfType[field.getType()];
+            int valueSize = field.getCount() * sizeOfType[field.getType()];
 
             // Add any excess size.
-            if(valueSize > 4) {
+            if (valueSize > 4) {
                 dirSize += valueSize;
             }
         }
@@ -1455,7 +1261,7 @@ public class TIFFImageEncoder extends Im
         writeUnsignedShort(numEntries);
 
         Iterator iter = fields.iterator();
-        while(iter.hasNext()) {
+        while (iter.hasNext()) {
 
             // 12 byte field entry TIFFField
             TIFFField field = (TIFFField)iter.next();
@@ -1504,8 +1310,8 @@ public class TIFFImageEncoder extends Im
         int type = field.getType();
         int count = field.getCount();
         int valueSize = 0;
-        if(type == TIFFField.TIFF_ASCII) {
-            for(int i = 0; i < count; i++) {
+        if (type == TIFFField.TIFF_ASCII) {
+            for (int i = 0; i < count; i++) {
                 byte[] stringBytes = field.getAsString(i).getBytes();   // note: default encoding @work here!
                 valueSize += stringBytes.length;
                 if (stringBytes[stringBytes.length - 1] != 0) {
@@ -1544,22 +1350,30 @@ public class TIFFImageEncoder extends Im
             // unsigned 8 bits
         case TIFFField.TIFF_BYTE:
             byte[] bytes = field.getAsBytes();
-            if (count > 4) count =4;
-            for (int i=0; i<count; i++)
+            if (count > 4) {
+                count = 4;
+            }
+            for (int i = 0; i < count; i++) {
                 output.write(bytes[i]);
+            }
 
-            for (int i = 0; i < (4 - count); i++)
+            for (int i = 0; i < (4 - count); i++) {
                 output.write(0);
+            }
             break;
 
             // unsigned 16 bits
         case TIFFField.TIFF_SHORT:
             char[] chars = field.getAsChars();
-            if (count > 2) count=2;
-            for (int i=0; i<count; i++)
+            if (count > 2) {
+                count = 2;
+            }
+            for (int i = 0; i < count; i++) {
                 writeUnsignedShort(chars[i]);
-            for (int i = 0; i < (2 - count); i++)
+            }
+            for (int i = 0; i < (2 - count); i++) {
                 writeUnsignedShort(0);
+            }
 
             break;
 
@@ -1567,7 +1381,7 @@ public class TIFFImageEncoder extends Im
         case TIFFField.TIFF_LONG:
             long[] longs = field.getAsLongs();
 
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 writeLong(longs[i]);
             }
             break;
@@ -1587,7 +1401,7 @@ public class TIFFImageEncoder extends Im
         case TIFFField.TIFF_SBYTE:
         case TIFFField.TIFF_UNDEFINED:
             byte[] bytes = field.getAsBytes();
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 output.write(bytes[i]);
             }
             break;
@@ -1595,13 +1409,13 @@ public class TIFFImageEncoder extends Im
             // unsigned 16 bits
         case TIFFField.TIFF_SHORT:
             char[] chars = field.getAsChars();
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 writeUnsignedShort(chars[i]);
             }
             break;
         case TIFFField.TIFF_SSHORT:
             short[] shorts = field.getAsShorts();
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 writeUnsignedShort(shorts[i]);
             }
             break;
@@ -1610,14 +1424,14 @@ public class TIFFImageEncoder extends Im
         case TIFFField.TIFF_LONG:
         case TIFFField.TIFF_SLONG:
             long[] longs = field.getAsLongs();
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 writeLong(longs[i]);
             }
             break;
 
         case TIFFField.TIFF_FLOAT:
             float[] floats = field.getAsFloats();
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 int intBits = Float.floatToIntBits(floats[i]);
                 writeLong(intBits);
             }
@@ -1625,7 +1439,7 @@ public class TIFFImageEncoder extends Im
 
         case TIFFField.TIFF_DOUBLE:
             double[] doubles = field.getAsDoubles();
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 long longBits = Double.doubleToLongBits(doubles[i]);
                 writeLong(longBits >>> 32);           // write upper 32 bits
                 writeLong(longBits & 0xffffffffL);    // write lower 32 bits
@@ -1635,17 +1449,17 @@ public class TIFFImageEncoder extends Im
         case TIFFField.TIFF_RATIONAL:
         case TIFFField.TIFF_SRATIONAL:
             long[][] rationals = field.getAsRationals();
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 writeLong(rationals[i][0]);
                 writeLong(rationals[i][1]);
             }
             break;
 
         case TIFFField.TIFF_ASCII:
-            for (int i=0; i<count; i++) {
+            for (int i = 0; i < count; i++) {
                 byte[] stringBytes = field.getAsString(i).getBytes();
                 output.write(stringBytes);
-                if(stringBytes[stringBytes.length-1] != (byte)0) {
+                if (stringBytes[stringBytes.length - 1] != (byte)0) {
                     output.write((byte)0);
                 }
             }
@@ -1682,9 +1496,9 @@ public class TIFFImageEncoder extends Im
      * This method should only be used if compressing data.
      */
     private long getOffset(OutputStream out) throws IOException {
-        if(out instanceof ByteArrayOutputStream) {
+        if (out instanceof ByteArrayOutputStream) {
             return ((ByteArrayOutputStream)out).size();
-        } else if(out instanceof SeekableOutputStream) {
+        } else if (out instanceof SeekableOutputStream) {
             return ((SeekableOutputStream)out).getFilePointer();
         } else {
             // Shouldn't happen.
@@ -1700,7 +1514,7 @@ public class TIFFImageEncoder extends Im
         int inOffset = 0;
         int outOffset = 0;
 
-        for(int i = 0; i < numRows; i++) {
+        for (int i = 0; i < numRows; i++) {
             outOffset = packBits(data, inOffset, bytesPerRow,
                                  compData, outOffset);
             inOffset += bytesPerRow;
@@ -1719,15 +1533,15 @@ public class TIFFImageEncoder extends Im
         int inMax = inOffset + inCount - 1;
         int inMaxMinus1 = inMax - 1;
 
-        while(inOffset <= inMax) {
+        while (inOffset <= inMax) {
             int run = 1;
             byte replicate = input[inOffset];
-            while(run < 127 && inOffset < inMax &&
-                  input[inOffset] == input[inOffset+1]) {
+            while (run < 127 && inOffset < inMax &&
+                  input[inOffset] == input[inOffset + 1]) {
                 run++;
                 inOffset++;
             }
-            if(run > 1) {
+            if (run > 1) {
                 inOffset++;
                 output[outOffset++] = (byte)(-(run - 1));
                 output[outOffset++] = replicate;
@@ -1735,21 +1549,21 @@ public class TIFFImageEncoder extends Im
 
             run = 0;
             int saveOffset = outOffset;
-            while(run < 128 &&
+            while (run < 128 &&
                   ((inOffset < inMax &&
-                    input[inOffset] != input[inOffset+1]) ||
+                    input[inOffset] != input[inOffset + 1]) ||
                    (inOffset < inMaxMinus1 &&
-                    input[inOffset] != input[inOffset+2]))) {
+                    input[inOffset] != input[inOffset + 2]))) {
                 run++;
                 output[++outOffset] = input[inOffset++];
             }
-            if(run > 0) {
+            if (run > 0) {
                 output[saveOffset] = (byte)(run - 1);
                 outOffset++;
             }
 
-            if(inOffset == inMax) {
-                if(run > 0 && run < 128) {
+            if (inOffset == inMax) {
+                if (run > 0 && run < 128) {
                     output[saveOffset]++;
                     output[outOffset++] = input[inOffset++];
                 } else {
@@ -1771,17 +1585,4 @@ public class TIFFImageEncoder extends Im
         return numCompressedBytes;
     }
 
-    private static void modifyEncodeParam(JPEGEncodeParam src,
-                                          JPEGEncodeParam dst,
-                                          int nbands) {
-      dst.setDensityUnit    (src.getDensityUnit());
-      dst.setXDensity       (src.getXDensity());
-      dst.setYDensity       (src.getYDensity());
-      dst.setRestartInterval(src.getRestartInterval());
-      for (int i=0; i<4; i++) {
-        JPEGQTable tbl = src.getQTable(i);
-        if (tbl != null)
-          dst.setQTable(i, tbl);
-      }
-    }
 }

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/util/SeekableStream.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/util/SeekableStream.java?rev=1028385&r1=1028384&r2=1028385&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/util/SeekableStream.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/codec/util/SeekableStream.java Thu Oct 28 17:02:39 2010
@@ -46,9 +46,6 @@ import java.io.InputStream;
  * the <code>skipBytes()</code> and <code>readFully()</code> methods and a
  * variety of <code>read</code> methods for various data types.
  *
- * <p> A number of concrete subclasses of <code>SeekableStream</code> are
- * supplied in the <code>com.sun.media.jai.codec</code> package.
- *
  * <p> Three classes are provided for the purpose of adapting a standard
  * <code>InputStream</code> to the <code>SeekableStream</code> interface.
  * <code>ForwardSeekableStream</code> does not allows seeking backwards, but is
@@ -300,8 +297,9 @@ public abstract class SeekableStream ext
         int n = 0;
         do {
             int count = this.read(b, off + n, len - n);
-            if (count < 0)
+            if (count < 0) {
                 throw new EOFException();
+            }
             n += count;
         } while (n < len);
     }
@@ -345,8 +343,9 @@ public abstract class SeekableStream ext
      */
     public final boolean readBoolean() throws IOException {
         int ch = this.read();
-        if (ch < 0)
+        if (ch < 0) {
             throw new EOFException();
+        }
         return (ch != 0);
     }
 
@@ -370,8 +369,9 @@ public abstract class SeekableStream ext
      */
     public final byte readByte() throws IOException {
         int ch = this.read();
-        if (ch < 0)
+        if (ch < 0) {
             throw new EOFException();
+        }
         return (byte)(ch);
     }
 
@@ -390,8 +390,9 @@ public abstract class SeekableStream ext
      */
     public final int readUnsignedByte() throws IOException {
         int ch = this.read();
-        if (ch < 0)
+        if (ch < 0) {
             throw new EOFException();
+        }
         return ch;
     }
 
@@ -419,8 +420,9 @@ public abstract class SeekableStream ext
     public final short readShort() throws IOException {
         int ch1 = this.read();
         int ch2 = this.read();
-        if ((ch1 | ch2) < 0)
+        if ((ch1 | ch2) < 0) {
             throw new EOFException();
+        }
         return (short)((ch1 << 8) + (ch2 << 0));
     }
 
@@ -448,8 +450,9 @@ public abstract class SeekableStream ext
     public final short readShortLE() throws IOException {
         int ch1 = this.read();
         int ch2 = this.read();
-        if ((ch1 | ch2) < 0)
+        if ((ch1 | ch2) < 0) {
             throw new EOFException();
+        }
         return (short)((ch2 << 8) + (ch1 << 0));
     }
 
@@ -476,8 +479,9 @@ public abstract class SeekableStream ext
     public final int readUnsignedShort() throws IOException {
         int ch1 = this.read();
         int ch2 = this.read();
-        if ((ch1 | ch2) < 0)
+        if ((ch1 | ch2) < 0) {
             throw new EOFException();
+        }
         return (ch1 << 8) + (ch2 << 0);
     }
 
@@ -505,8 +509,9 @@ public abstract class SeekableStream ext
     public final int readUnsignedShortLE() throws IOException {
         int ch1 = this.read();
         int ch2 = this.read();
-        if ((ch1 | ch2) < 0)
+        if ((ch1 | ch2) < 0) {
             throw new EOFException();
+        }
         return (ch2 << 8) + (ch1 << 0);
     }
 
@@ -532,8 +537,9 @@ public abstract class SeekableStream ext
     public final char readChar() throws IOException {
         int ch1 = this.read();
         int ch2 = this.read();
-        if ((ch1 | ch2) < 0)
+        if ((ch1 | ch2) < 0) {
             throw new EOFException();
+        }
         return (char)((ch1 << 8) + (ch2 << 0));
     }
 
@@ -560,8 +566,9 @@ public abstract class SeekableStream ext
     public final char readCharLE() throws IOException {
         int ch1 = this.read();
         int ch2 = this.read();
-        if ((ch1 | ch2) < 0)
+        if ((ch1 | ch2) < 0) {
             throw new EOFException();
+        }
         return (char)((ch2 << 8) + (ch1 << 0));
     }
 
@@ -590,8 +597,9 @@ public abstract class SeekableStream ext
         int ch2 = this.read();
         int ch3 = this.read();
         int ch4 = this.read();
-        if ((ch1 | ch2 | ch3 | ch4) < 0)
+        if ((ch1 | ch2 | ch3 | ch4) < 0) {
             throw new EOFException();
+        }
         return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
     }
 
@@ -621,8 +629,9 @@ public abstract class SeekableStream ext
         int ch2 = this.read();
         int ch3 = this.read();
         int ch4 = this.read();
-        if ((ch1 | ch2 | ch3 | ch4) < 0)
+        if ((ch1 | ch2 | ch3 | ch4) < 0) {
             throw new EOFException();
+        }
         return ((ch4 << 24) + (ch3 << 16) + (ch2 << 8) + (ch1 << 0));
     }
 
@@ -651,8 +660,9 @@ public abstract class SeekableStream ext
         long ch2 = this.read();
         long ch3 = this.read();
         long ch4 = this.read();
-        if ((ch1 | ch2 | ch3 | ch4) < 0)
+        if ((ch1 | ch2 | ch3 | ch4) < 0) {
             throw new EOFException();
+        }
         return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
     }
 

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderInternalTIFF.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderInternalTIFF.java?rev=1028385&r1=1028384&r2=1028385&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderInternalTIFF.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/loader/impl/ImageLoaderInternalTIFF.java Thu Oct 28 17:02:39 2010
@@ -65,11 +65,15 @@ public class ImageLoaderInternalTIFF ext
         ImageInputStream imgStream = ImageUtil.needImageInputStream(src);
 
         SeekableStream seekStream = new ImageInputStreamSeekableStreamAdapter(imgStream);
-        org.apache.xmlgraphics.image.codec.tiff.TIFFImage img
-            = new org.apache.xmlgraphics.image.codec.tiff.TIFFImage
-                (seekStream, null, 0);
-        // TODO: This may ignore ICC Profiles stored in TIFF images.
-        return new ImageRendered(info, img, null);
+        try {
+            org.apache.xmlgraphics.image.codec.tiff.TIFFImage img
+                = new org.apache.xmlgraphics.image.codec.tiff.TIFFImage
+                    (seekStream, null, 0);
+            // TODO: This may ignore ICC Profiles stored in TIFF images.
+            return new ImageRendered(info, img, null);
+        } catch (RuntimeException e) {
+            throw new ImageException("Could not load image with internal TIFF codec", e);
+        }
     }
 
     /** {@inheritDoc} */

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/writer/internal/TIFFImageWriter.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/writer/internal/TIFFImageWriter.java?rev=1028385&r1=1028384&r2=1028385&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/writer/internal/TIFFImageWriter.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/image/writer/internal/TIFFImageWriter.java Thu Oct 28 17:02:39 2010
@@ -19,8 +19,6 @@
 
 package org.apache.xmlgraphics.image.writer.internal;
 
-import java.awt.color.ColorSpace;
-import java.awt.image.ColorModel;
 import java.awt.image.RenderedImage;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -30,13 +28,9 @@ import org.apache.xmlgraphics.image.code
 import org.apache.xmlgraphics.image.codec.tiff.TIFFImageDecoder;
 import org.apache.xmlgraphics.image.codec.tiff.TIFFImageEncoder;
 import org.apache.xmlgraphics.image.writer.AbstractImageWriter;
-import org.apache.xmlgraphics.image.writer.ImageWriter;
 import org.apache.xmlgraphics.image.writer.ImageWriterParams;
 import org.apache.xmlgraphics.image.writer.MultiImageWriter;
 
-import com.sun.image.codec.jpeg.JPEGCodec;
-import com.sun.image.codec.jpeg.JPEGEncodeParam;
-
 /**
  * ImageWriter implementation that uses the internal TIFF codec to
  * write TIFF files.
@@ -45,77 +39,20 @@ import com.sun.image.codec.jpeg.JPEGEnco
  */
 public class TIFFImageWriter extends AbstractImageWriter {
 
-    /**
-     * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream)
-     */
+    /** {@inheritDoc} */
     public void writeImage(RenderedImage image, OutputStream out)
             throws IOException {
         writeImage(image, out, null);
     }
 
-    /**
-     * @see ImageWriter#writeImage(java.awt.image.RenderedImage, java.io.OutputStream, ImageWriterParams)
-     */
+    /** {@inheritDoc} */
     public void writeImage(RenderedImage image, OutputStream out,
             ImageWriterParams params) throws IOException {
         TIFFEncodeParam encodeParams = createTIFFEncodeParams(params);
-        updateParams(encodeParams, params, image);
         TIFFImageEncoder encoder = new TIFFImageEncoder(out, encodeParams);
         encoder.encode(image);
     }
 
-    /**
-     * This method updates the encode parameters based on the image to be encoded. One thing done
-     * here is to initialize the JPEG encoding parameters if JPEG compression is selected.
-     * @param encodeParams the TIFF encoding parameters
-     * @param image the image to be encoded
-     */
-    private void updateParams(TIFFEncodeParam encodeParams, ImageWriterParams params,
-            RenderedImage image) {
-        if (encodeParams.getCompression() == TIFFEncodeParam.COMPRESSION_JPEG_TTN2) {
-            ColorModel cm = image.getColorModel();
-            int imageType = cm.getColorSpace().getType();
-            int colorID;
-            //The following translation table is taken from the Javadoc for JPEGEncodeParam.
-            switch (imageType) {
-            case ColorSpace.TYPE_GRAY:
-                colorID = JPEGEncodeParam.COLOR_ID_GRAY;
-                break;
-            case ColorSpace.TYPE_RGB:
-                if (cm.hasAlpha()) {
-                    colorID = JPEGEncodeParam.COLOR_ID_YCbCrA;
-                } else {
-                    colorID = JPEGEncodeParam.COLOR_ID_YCbCr;
-                }
-                break;
-            case ColorSpace.TYPE_YCbCr:
-                if (cm.hasAlpha()) {
-                    colorID = JPEGEncodeParam.COLOR_ID_YCbCrA;
-                } else {
-                    colorID = JPEGEncodeParam.COLOR_ID_YCbCr;
-                }
-                break;
-            case ColorSpace.TYPE_CMYK:
-                colorID = JPEGEncodeParam.COLOR_ID_CMYK;
-                break;
-            default:
-                //TODO Don't know how to determine whether image is PYCC or not
-                //(see JPEGEncodeParam)
-                colorID = JPEGEncodeParam.COLOR_ID_UNKNOWN;
-            }
-            JPEGEncodeParam jpegParam = JPEGCodec.getDefaultJPEGEncodeParam(
-                    image.getData(), colorID);
-            if (params.getJPEGQuality() != null || params.getJPEGForceBaseline() != null) {
-                float qual = (params.getJPEGQuality() != null
-                        ? params.getJPEGQuality().floatValue() : 0.75f);
-                boolean force = (params.getJPEGForceBaseline() != null
-                        ? params.getJPEGForceBaseline().booleanValue() : false);
-                jpegParam.setQuality(qual, force);
-            }
-            encodeParams.setJPEGEncodeParam(jpegParam);
-        }
-    }
-
     private TIFFEncodeParam createTIFFEncodeParams(ImageWriterParams params) {
         TIFFEncodeParam encodeParams = new TIFFEncodeParam();
         if (params == null) {
@@ -128,8 +65,6 @@ public class TIFFImageWriter extends Abs
                 encodeParams.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);
             } else if ("NONE".equalsIgnoreCase(params.getCompressionMethod())) {
                 encodeParams.setCompression(TIFFEncodeParam.COMPRESSION_NONE);
-            } else if ("JPEG".equalsIgnoreCase(params.getCompressionMethod())) {
-                encodeParams.setCompression(TIFFEncodeParam.COMPRESSION_JPEG_TTN2);
             } else if ("Deflate".equalsIgnoreCase(params.getCompressionMethod())) {
                 encodeParams.setCompression(TIFFEncodeParam.COMPRESSION_DEFLATE);
             } else {
@@ -161,22 +96,17 @@ public class TIFFImageWriter extends Abs
         return encodeParams;
     }
 
-    /**
-     * @see ImageWriter#getMIMEType()
-     */
+    /** {@inheritDoc} */
     public String getMIMEType() {
         return "image/tiff";
     }
 
-    /**
-     * @see org.apache.xmlgraphics.image.writer.ImageWriter#createMultiImageWriter(
-     *          java.io.OutputStream)
-     */
+    /** {@inheritDoc} */
     public MultiImageWriter createMultiImageWriter(OutputStream out) throws IOException {
         return new TIFFMultiImageWriter(out);
     }
 
-    /** @see org.apache.xmlgraphics.image.writer.ImageWriter#supportsMultiImageWriter() */
+    /** {@inheritDoc} */
     public boolean supportsMultiImageWriter() {
         return true;
     }
@@ -195,7 +125,6 @@ public class TIFFImageWriter extends Abs
         public void writeImage(RenderedImage image, ImageWriterParams params) throws IOException {
             if (encoder == null) {
                 encodeParams = createTIFFEncodeParams(params);
-                updateParams(encodeParams, params, image);
                 encoder = new TIFFImageEncoder(out, encodeParams);
             }
             context = encoder.encodeMultiple(context, image);

Modified: xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.writer.ImageWriter
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.writer.ImageWriter?rev=1028385&r1=1028384&r2=1028385&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.writer.ImageWriter (original)
+++ xmlgraphics/commons/trunk/src/resources/META-INF/services/org.apache.xmlgraphics.image.writer.ImageWriter Thu Oct 28 17:02:39 2010
@@ -1,6 +1,5 @@
 org.apache.xmlgraphics.image.writer.internal.PNGImageWriter
 org.apache.xmlgraphics.image.writer.internal.TIFFImageWriter
-org.apache.xmlgraphics.image.writer.internal.JPEGImageWriter
 org.apache.xmlgraphics.image.writer.imageio.ImageIOPNGImageWriter
 org.apache.xmlgraphics.image.writer.imageio.ImageIOTIFFImageWriter
 org.apache.xmlgraphics.image.writer.imageio.ImageIOJPEGImageWriter

Modified: xmlgraphics/commons/trunk/status.xml
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/status.xml?rev=1028385&r1=1028384&r2=1028385&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/status.xml (original)
+++ xmlgraphics/commons/trunk/status.xml Thu Oct 28 17:02:39 2010
@@ -41,6 +41,10 @@
   <changes>
     <release version="Trunk" date="n/a">
       <action context="Code" dev="JM" type="remove">
+        Removed dependency on com.sun classes to achieve compatibility with Apache Harmony,
+        OpenJDK and possibly other JVMs. 
+      </action>
+      <action context="Code" dev="JM" type="remove">
         Removal of the deprecated <code>TextHandler.drawString(String, float, float)</code> method.
       </action>
       <action context="Code" dev="JM" type="update" fixes-bug="49703" due-to="Glenn Adams">



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org