diff options
author | Jeremias Maerki <jeremias@apache.org> | 2008-01-11 10:45:01 +0000 |
---|---|---|
committer | Jeremias Maerki <jeremias@apache.org> | 2008-01-11 10:45:01 +0000 |
commit | 4bf8dc4e1c42a7f52bb67d6d0b79d76de19f463b (patch) | |
tree | d0ea70a1185f651243994aef0779d5058e7e12ba | |
parent | f8e731bb87e2c1a4660a1275a2eecaba7cac8f6b (diff) | |
download | xmlgraphics-fop-4bf8dc4e1c42a7f52bb67d6d0b79d76de19f463b.tar.gz xmlgraphics-fop-4bf8dc4e1c42a7f52bb67d6d0b79d76de19f463b.zip |
Fixed merge problems.
Fixed a NPE when a mask is null in BitmapImage.java
Add support for properly encoding binary data as a hexadecimal string object (including encryption).
Adjust palette generation for indexed bitmaps to work correctly with encryption.
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_ImagePackageRedesign@611133 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | src/java/org/apache/fop/pdf/BitmapImage.java | 4 | ||||
-rw-r--r-- | src/java/org/apache/fop/pdf/PDFObject.java | 26 | ||||
-rw-r--r-- | src/java/org/apache/fop/pdf/PDFReference.java | 3 | ||||
-rw-r--r-- | src/java/org/apache/fop/pdf/PDFText.java | 26 | ||||
-rw-r--r-- | src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java | 43 | ||||
-rw-r--r-- | src/java/org/apache/fop/render/pdf/PDFRenderer.java | 4 | ||||
-rw-r--r-- | src/java/org/apache/fop/render/ps/PSRenderer.java | 4 |
7 files changed, 58 insertions, 52 deletions
diff --git a/src/java/org/apache/fop/pdf/BitmapImage.java b/src/java/org/apache/fop/pdf/BitmapImage.java index b488d78bd..69b51dac3 100644 --- a/src/java/org/apache/fop/pdf/BitmapImage.java +++ b/src/java/org/apache/fop/pdf/BitmapImage.java @@ -56,7 +56,9 @@ public class BitmapImage implements PDFImage { this.bitsPerComponent = 8; this.colorSpace = new PDFDeviceColorSpace(PDFDeviceColorSpace.DEVICE_RGB); this.bitmaps = data; - maskRef = new PDFReference(mask); + if (mask != null) { + maskRef = new PDFReference(mask); + } } /** diff --git a/src/java/org/apache/fop/pdf/PDFObject.java b/src/java/org/apache/fop/pdf/PDFObject.java index f53183574..4bfd805f4 100644 --- a/src/java/org/apache/fop/pdf/PDFObject.java +++ b/src/java/org/apache/fop/pdf/PDFObject.java @@ -276,14 +276,23 @@ public abstract class PDFObject implements PDFWritable { */ protected byte[] encodeString(String string) { return encodeText(string); - /* - final byte[] buf = encode(PDFText.escapeString(string)); + } + + /** + * Encodes binary data as hexadecimal string object. + * @param data the binary data + * @param out the OutputStream to write the encoded object to + * @throws IOException if an I/O error occurs + */ + protected void encodeBinaryToHexString(byte[] data, OutputStream out) throws IOException { + out.write('<'); if (getDocumentSafely().isEncryptionActive()) { - return PDFText.escapeByteArray( - getDocument().getEncryption().encrypt(buf, this)); - } else { - return buf; - }*/ + data = getDocument().getEncryption().encrypt(data, this); + } + String hex = PDFText.toHex(data, false); + byte[] encoded = hex.getBytes("US-ASCII"); + out.write(encoded); + out.write('>'); } /** @@ -307,6 +316,9 @@ public abstract class PDFObject implements PDFWritable { } } else if (obj instanceof Boolean) { writer.write(obj.toString()); + } else if (obj instanceof byte[]) { + writer.flush(); + encodeBinaryToHexString((byte[])obj, out); } else { writer.flush(); out.write(encodeText(obj.toString())); diff --git a/src/java/org/apache/fop/pdf/PDFReference.java b/src/java/org/apache/fop/pdf/PDFReference.java index 3b615735a..da388d368 100644 --- a/src/java/org/apache/fop/pdf/PDFReference.java +++ b/src/java/org/apache/fop/pdf/PDFReference.java @@ -51,6 +51,9 @@ public class PDFReference implements PDFWritable { * @param ref an object reference */ public PDFReference(String ref) { + if (ref == null) { + throw new NullPointerException("ref must not be null"); + } this.indirectReference = ref; } diff --git a/src/java/org/apache/fop/pdf/PDFText.java b/src/java/org/apache/fop/pdf/PDFText.java index 4c17148c1..d380ac8dd 100644 --- a/src/java/org/apache/fop/pdf/PDFText.java +++ b/src/java/org/apache/fop/pdf/PDFText.java @@ -25,12 +25,12 @@ import org.apache.avalon.framework.CascadingRuntimeException; /** * This class represents a simple number object. It also contains contains some - * utility methods for outputing numbers to PDF. + * utility methods for outputting numbers to PDF. */ public class PDFText extends PDFObject { - private static final char[] DIGITS = - {'0', '1', '2', '3', '4', '5', '6', '7', + private static final char[] DIGITS + = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; private String text; @@ -145,20 +145,34 @@ public class PDFText extends PDFObject { /** * Converts a byte array to a Hexadecimal String (3.2.3 in PDF 1.4 specs) * @param data the data to encode + * @param brackets true if enclosing brackets should be included * @return String the resulting string */ - public static final String toHex(byte[] data) { + public static final String toHex(byte[] data, boolean brackets) { final StringBuffer sb = new StringBuffer(data.length * 2); - sb.append("<"); + if (brackets) { + sb.append("<"); + } for (int i = 0; i < data.length; i++) { sb.append(DIGITS[(data[i] >>> 4) & 0x0F]); sb.append(DIGITS[data[i] & 0x0F]); } - sb.append(">"); + if (brackets) { + sb.append(">"); + } return sb.toString(); } /** + * Converts a byte array to a Hexadecimal String (3.2.3 in PDF 1.4 specs) + * @param data the data to encode + * @return String the resulting string + */ + public static final String toHex(byte[] data) { + return toHex(data, true); + } + + /** * Converts a String to UTF-16 (big endian). * @param text text to convert * @return byte[] UTF-16 stream diff --git a/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java b/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java index ecf05dbba..62e83da81 100644 --- a/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java +++ b/src/java/org/apache/fop/render/pdf/ImageRenderedAdapter.java @@ -25,6 +25,7 @@ import java.awt.image.RenderedImage; import java.io.IOException; import java.io.OutputStream; +import org.apache.commons.io.output.ByteArrayOutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -41,7 +42,6 @@ import org.apache.fop.pdf.PDFFilter; import org.apache.fop.pdf.PDFFilterList; import org.apache.fop.pdf.PDFName; import org.apache.fop.pdf.PDFReference; -import org.apache.fop.pdf.PDFWritable; /** * PDFImage implementation for the PDF renderer which handles RenderedImages. @@ -177,11 +177,6 @@ public class ImageRenderedAdapter extends AbstractImageAdapter { } /** {@inheritDoc} */ - public String getSoftMask() { - return softMask.toInlinePDFString(); - } - - /** {@inheritDoc} */ public PDFReference getSoftMaskReference() { return softMask; } @@ -203,7 +198,7 @@ public class ImageRenderedAdapter extends AbstractImageAdapter { ColorModel cm = getEffectiveColorModel(); if (cm instanceof IndexColorModel) { IndexColorModel icm = (IndexColorModel)cm; - PDFArray indexed = new PDFArray(); + PDFArray indexed = new PDFArray(dict); indexed.add(new PDFName("Indexed")); if (icm.getColorSpace().getType() != ColorSpace.TYPE_RGB) { @@ -219,30 +214,25 @@ public class ImageRenderedAdapter extends AbstractImageAdapter { throw new UnsupportedOperationException("hival must not go beyond " + MAX_HIVAL); } indexed.add(new Integer(hival)); - final StringBuffer sb = new StringBuffer("<"); int[] palette = new int[c]; icm.getRGBs(palette); + ByteArrayOutputStream baout = new ByteArrayOutputStream(); for (int i = 0; i < c; i++) { - if (i > 0) { - sb.append(" "); - } //TODO Probably doesn't work for non RGB based color spaces - rgb2Hex(palette[i], sb); + //See log warning above + int entry = palette[i]; + baout.write((entry & 0xFF0000) >> 16); + baout.write((entry & 0xFF00) >> 8); + baout.write(entry & 0xFF); } - sb.append(">"); - indexed.add(new PDFWritable() { - public String toInlinePDFString() { - //Work-around String escaping. Maybe a little hacky. - return sb.toString(); - } - }); + indexed.add(baout.toByteArray()); dict.put("ColorSpace", indexed); dict.put("BitsPerComponent", icm.getPixelSize()); Integer index = getIndexOfFirstTransparentColorInPalette(getImage().getRenderedImage()); if (index != null) { - PDFArray mask = new PDFArray(); + PDFArray mask = new PDFArray(dict); mask.add(index); mask.add(index); dict.put("Mask", mask); @@ -250,19 +240,6 @@ public class ImageRenderedAdapter extends AbstractImageAdapter { } } - private static final char[] HEX = { - '0', '1', '2', '3', '4', '5', '6', '7', - '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' - }; - - private static void rgb2Hex(int rgb, StringBuffer sb) { - for (int i = 5; i >= 0; i--) { - int shift = i * 4; - int n = (rgb & (15 << shift)) >> shift; - sb.append(HEX[n % 16]); - } - } - /** {@inheritDoc} */ public String getFilterHint() { return PDFFilterList.IMAGE_FILTER; diff --git a/src/java/org/apache/fop/render/pdf/PDFRenderer.java b/src/java/org/apache/fop/render/pdf/PDFRenderer.java index 95bab45f6..3b28cc34c 100644 --- a/src/java/org/apache/fop/render/pdf/PDFRenderer.java +++ b/src/java/org/apache/fop/render/pdf/PDFRenderer.java @@ -39,11 +39,9 @@ import java.util.Map; import javax.xml.transform.Source; import javax.xml.transform.stream.StreamSource; -import org.w3c.dom.Document; - import org.apache.commons.io.IOUtils; -import org.apache.commons.io.output.CountingOutputStream; +import org.apache.xmlgraphics.image.loader.ImageException; import org.apache.xmlgraphics.image.loader.ImageInfo; import org.apache.xmlgraphics.image.loader.ImageManager; import org.apache.xmlgraphics.image.loader.ImageSessionContext; diff --git a/src/java/org/apache/fop/render/ps/PSRenderer.java b/src/java/org/apache/fop/render/ps/PSRenderer.java index 79d68933c..21ae85259 100644 --- a/src/java/org/apache/fop/render/ps/PSRenderer.java +++ b/src/java/org/apache/fop/render/ps/PSRenderer.java @@ -36,8 +36,6 @@ import java.util.Map; import javax.xml.transform.Source; -import org.w3c.dom.Document; - import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -65,6 +63,8 @@ import org.apache.xmlgraphics.ps.PSResource; import org.apache.xmlgraphics.ps.PSState; import org.apache.xmlgraphics.ps.dsc.DSCException; import org.apache.xmlgraphics.ps.dsc.ResourceTracker; +import org.apache.xmlgraphics.ps.dsc.events.DSCCommentBoundingBox; +import org.apache.xmlgraphics.ps.dsc.events.DSCCommentHiResBoundingBox; import org.apache.fop.apps.FOPException; import org.apache.fop.apps.FOUserAgent; |