FOP-2259: 1 bit TIFF error; patch submitted by Simon Steiner
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/commons/trunk@1502693 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java b/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java
index 2207b5d..7fc9fc5 100644
--- a/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java
+++ b/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java
@@ -51,6 +51,8 @@
private boolean firstTileDump;
private boolean enableCMYK;
private boolean isBGR;
+ private boolean outputbw;
+ private boolean bwinvert;
/**
* Main constructor
@@ -58,6 +60,7 @@
*/
public ImageEncodingHelper(RenderedImage image) {
this(image, false);
+ outputbw = true;
}
/**
@@ -118,7 +121,12 @@
if (encoded) {
return;
}
- encodeRenderedImageAsRGB(image, out);
+ encodeRenderedImageAsRGB(image, out, outputbw, bwinvert);
+ }
+
+ public static void encodeRenderedImageAsRGB(RenderedImage image, OutputStream out)
+ throws IOException {
+ encodeRenderedImageAsRGB(image, out, false, false);
}
/**
@@ -127,7 +135,7 @@
* @param out the OutputStream to write the pixels to
* @throws IOException if an I/O error occurs
*/
- public static void encodeRenderedImageAsRGB(RenderedImage image, OutputStream out)
+ public static void encodeRenderedImageAsRGB(RenderedImage image, OutputStream out, boolean outputbw, boolean bwinvert)
throws IOException {
Raster raster = getRaster(image);
Object data;
@@ -138,7 +146,7 @@
data = new byte[nbands];
break;
case DataBuffer.TYPE_USHORT:
- data = new short[nbands];
+ data = null;
break;
case DataBuffer.TYPE_INT:
data = new int[nbands];
@@ -157,13 +165,23 @@
int w = image.getWidth();
int h = image.getHeight();
- byte[] buf = new byte[w * 3];
+ int numDataElements = raster.getNumDataElements();
+ if (numDataElements > 1 || !outputbw) {
+ numDataElements = 3;
+ }
+
+ byte[] buf = new byte[w * numDataElements];
+
for (int y = 0; y < h; y++) {
int idx = -1;
for (int x = 0; x < w; x++) {
int rgb = colorModel.getRGB(raster.getDataElements(x, y, data));
- buf[++idx] = (byte)(rgb >> 16);
- buf[++idx] = (byte)(rgb >> 8);
+ if (numDataElements > 1) {
+ buf[++idx] = (byte)(rgb >> 16);
+ buf[++idx] = (byte)(rgb >> 8);
+ } else if (bwinvert && rgb == -1) {
+ rgb = 1;
+ }
buf[++idx] = (byte)(rgb);
}
out.write(buf);
@@ -438,7 +456,7 @@
*/
public static void encodePackedColorComponents(RenderedImage image, OutputStream out)
throws IOException {
- ImageEncodingHelper helper = new ImageEncodingHelper(image, true);
+ ImageEncodingHelper helper = new ImageEncodingHelper(image);
helper.encode(out);
}
@@ -469,7 +487,9 @@
public String getImplicitFilter() {
return null; //No implicit filters with RenderedImage instances
}
-
}
+ public void setBWInvert(boolean v) {
+ bwinvert = v;
+ }
}
diff --git a/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java b/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java
index 1bd1058..3c02427 100644
--- a/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java
+++ b/src/java/org/apache/xmlgraphics/ps/PSImageUtils.java
@@ -25,6 +25,7 @@
import java.awt.geom.Rectangle2D;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
import java.awt.image.IndexColorModel;
import java.awt.image.Raster;
import java.awt.image.RenderedImage;
@@ -141,6 +142,11 @@
gen.restoreGraphicsState();
}
+ public static void writeImage(ImageEncoder encoder, Dimension imgDim, String imgDescription,
+ Rectangle2D targetRect, ColorModel colorModel, PSGenerator gen) throws IOException {
+ writeImage(encoder, imgDim, imgDescription, targetRect, colorModel, gen, null);
+ }
+
/**
* Writes a bitmap image to the PostScript stream.
* @param encoder the image encoder
@@ -152,7 +158,7 @@
* @throws IOException In case of an I/O exception
*/
public static void writeImage(ImageEncoder encoder, Dimension imgDim, String imgDescription,
- Rectangle2D targetRect, ColorModel colorModel, PSGenerator gen)
+ Rectangle2D targetRect, ColorModel colorModel, PSGenerator gen, RenderedImage ri)
throws IOException {
gen.saveGraphicsState();
@@ -178,6 +184,13 @@
imageDict.put("/DataSource", "Data");
populateImageDictionary(imgDim, colorModel, imageDict);
+
+ if (ri != null) {
+ DataBuffer buffer = ri.getData().getDataBuffer();
+ if (!(buffer instanceof DataBufferByte)) {
+ imageDict.put("/BitsPerComponent", 8);
+ }
+ }
writeImageCommand(imageDict, colorModel, gen);
/*
@@ -351,7 +364,7 @@
ImageEncodingHelper helper = new ImageEncodingHelper(img);
ColorModel cm = helper.getEncodedColorModel();
- writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen);
+ writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen, img);
}
/**
diff --git a/test/java/org/apache/xmlgraphics/ps/ImageEncodingHelperTestCase.java b/test/java/org/apache/xmlgraphics/ps/ImageEncodingHelperTestCase.java
index d95c4fb..0e82fa8 100644
--- a/test/java/org/apache/xmlgraphics/ps/ImageEncodingHelperTestCase.java
+++ b/test/java/org/apache/xmlgraphics/ps/ImageEncodingHelperTestCase.java
@@ -97,8 +97,8 @@
BufferedImage imageRGB = new BufferedImage(100, 75, BufferedImage.TYPE_INT_BGR);
imageRGB = prepareImage(imageRGB);
- ImageEncodingHelper imageEncodingHelperBGR = new ImageEncodingHelper(imageBGR);
- ImageEncodingHelper imageEncodingHelperRGB = new ImageEncodingHelper(imageRGB);
+ ImageEncodingHelper imageEncodingHelperBGR = new ImageEncodingHelper(imageBGR, false);
+ ImageEncodingHelper imageEncodingHelperRGB = new ImageEncodingHelper(imageRGB, false);
ByteArrayOutputStream baosBGR = new ByteArrayOutputStream();
imageEncodingHelperBGR.encode(baosBGR);