diff options
Diffstat (limited to 'src/java/org/apache/fop/render/ps/PSImageUtils.java')
-rw-r--r-- | src/java/org/apache/fop/render/ps/PSImageUtils.java | 241 |
1 files changed, 2 insertions, 239 deletions
diff --git a/src/java/org/apache/fop/render/ps/PSImageUtils.java b/src/java/org/apache/fop/render/ps/PSImageUtils.java index bd3736eb5..9d6314f9d 100644 --- a/src/java/org/apache/fop/render/ps/PSImageUtils.java +++ b/src/java/org/apache/fop/render/ps/PSImageUtils.java @@ -19,29 +19,20 @@ package org.apache.fop.render.ps; import java.awt.Dimension; -import java.awt.color.ColorSpace; import java.awt.geom.Rectangle2D; -import java.awt.image.ColorModel; -import java.awt.image.DataBuffer; -import java.awt.image.Raster; -import java.awt.image.RenderedImage; import java.io.IOException; -import java.io.OutputStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.fop.image.EPSImage; import org.apache.fop.image.FopImage; import org.apache.fop.image.JpegImage; -import org.apache.fop.util.ASCII85OutputStream; -import org.apache.fop.util.Finalizable; -import org.apache.fop.util.FlateEncodeOutputStream; -import org.apache.fop.util.RunLengthEncodeOutputStream; +import org.apache.xmlgraphics.ps.PSGenerator; /** * Utility code for rendering images in PostScript. */ -public class PSImageUtils { +public class PSImageUtils extends org.apache.xmlgraphics.ps.PSImageUtils { /** logging instance */ protected static Log log = LogFactory.getLog(PSImageUtils.class); @@ -85,187 +76,6 @@ public class PSImageUtils { img.getColorSpace(), gen); } - private static void writeImage(byte[] img, - Dimension imgDim, String imgName, - Rectangle2D targetRect, - boolean isJPEG, ColorSpace colorSpace, - PSGenerator gen) throws IOException { - boolean iscolor = colorSpace.getType() != ColorSpace.CS_GRAY; - - gen.saveGraphicsState(); - gen.writeln(gen.formatDouble(targetRect.getX()) + " " - + gen.formatDouble(targetRect.getY()) + " translate"); - gen.writeln(gen.formatDouble(targetRect.getWidth()) + " " - + gen.formatDouble(targetRect.getHeight()) + " scale"); - - gen.commentln("%FOPBeginBitmap: " + imgName); - if (colorSpace.getType() == ColorSpace.TYPE_CMYK) { - gen.writeln("/DeviceCMYK setcolorspace"); - } else if (colorSpace.getType() == ColorSpace.CS_GRAY) { - gen.writeln("/DeviceGray setcolorspace"); - } else { - gen.writeln("/DeviceRGB setcolorspace"); - } - - gen.writeln("{{"); - // Template: (RawData is used for the EOF signal only) - // gen.write("/RawData currentfile <first filter> filter def"); - // gen.write("/Data RawData <second filter> <third filter> [...] def"); - if (isJPEG) { - gen.writeln("/RawData currentfile /ASCII85Decode filter def"); - gen.writeln("/Data RawData << >> /DCTDecode filter def"); - } else { - if (gen.getPSLevel() >= 3) { - gen.writeln("/RawData currentfile /ASCII85Decode filter def"); - gen.writeln("/Data RawData /FlateDecode filter def"); - } else { - gen.writeln("/RawData currentfile /ASCII85Decode filter def"); - gen.writeln("/Data RawData /RunLengthDecode filter def"); - } - } - gen.writeln("<<"); - gen.writeln(" /ImageType 1"); - gen.writeln(" /Width " + imgDim.width); - gen.writeln(" /Height " + imgDim.height); - gen.writeln(" /BitsPerComponent 8"); - if (colorSpace.getType() == ColorSpace.TYPE_CMYK) { - if (false /*TODO img.invertImage()*/) { - gen.writeln(" /Decode [1 0 1 0 1 0 1 0]"); - } else { - gen.writeln(" /Decode [0 1 0 1 0 1 0 1]"); - } - } else if (iscolor) { - gen.writeln(" /Decode [0 1 0 1 0 1]"); - } else { - gen.writeln(" /Decode [0 1]"); - } - // Setup scanning for left-to-right and top-to-bottom - gen.writeln(" /ImageMatrix [" + imgDim.width + " 0 0 " - + imgDim.height + " 0 0]"); - - gen.writeln(" /DataSource Data"); - gen.writeln(">>"); - gen.writeln("image"); - /* the following two lines could be enabled if something still goes wrong - * gen.write("Data closefile"); - * gen.write("RawData flushfile"); - */ - gen.writeln("} stopped {handleerror} if"); - gen.writeln(" RawData flushfile"); - gen.writeln("} exec"); - - OutputStream out = gen.getOutputStream(); - out = new ASCII85OutputStream(out); - if (isJPEG) { - //nop - } else { - if (gen.getPSLevel() >= 3) { - out = new FlateEncodeOutputStream(out); - } else { - out = new RunLengthEncodeOutputStream(out); - } - } - out.write(img); - if (out instanceof Finalizable) { - ((Finalizable)out).finalizeStream(); - } else { - out.flush(); - } - - gen.writeln(""); - gen.commentln("%FOPEndBitmap"); - gen.restoreGraphicsState(); - } - - /** - * Renders a bitmap image to PostScript. - * @param img image to render - * @param x x position - * @param y y position - * @param w width - * @param h height - * @param gen PS generator - * @throws IOException In case of an I/O problem while rendering the image - */ - public static void renderBitmapImage(RenderedImage img, - float x, float y, float w, float h, PSGenerator gen) - throws IOException { - byte[] imgmap = getBitmapBytes(img); - - String imgName = img.getClass().getName(); - Dimension imgDim = new Dimension(img.getWidth(), img.getHeight()); - Rectangle2D targetRect = new Rectangle2D.Double(x, y, w, h); - boolean isJPEG = false; - writeImage(imgmap, imgDim, imgName, targetRect, isJPEG, - img.getColorModel().getColorSpace(), gen); - } - - private static byte[] getBitmapBytes(RenderedImage img) { - int[] tmpMap = getRGB(img, 0, 0, img.getWidth(), img.getHeight(), null, 0, img.getWidth()); - // Should take care of the ColorSpace and bitsPerPixel - byte[] bitmaps = new byte[img.getWidth() * img.getHeight() * 3]; - for (int y = 0, my = img.getHeight(); y < my; y++) { - for (int x = 0, mx = img.getWidth(); x < mx; x++) { - int p = tmpMap[y * mx + x]; - int r = (p >> 16) & 0xFF; - int g = (p >> 8) & 0xFF; - int b = (p) & 0xFF; - bitmaps[3 * (y * mx + x)] = (byte)(r & 0xFF); - bitmaps[3 * (y * mx + x) + 1] = (byte)(g & 0xFF); - bitmaps[3 * (y * mx + x) + 2] = (byte)(b & 0xFF); - } - } - return bitmaps; - } - - public static int[] getRGB(RenderedImage img, - int startX, int startY, int w, int h, - int[] rgbArray, int offset, int scansize) { - Raster raster = img.getData(); - int yoff = offset; - int off; - Object data; - int nbands = raster.getNumBands(); - int dataType = raster.getDataBuffer().getDataType(); - switch (dataType) { - case DataBuffer.TYPE_BYTE: - data = new byte[nbands]; - break; - case DataBuffer.TYPE_USHORT: - data = new short[nbands]; - break; - case DataBuffer.TYPE_INT: - data = new int[nbands]; - break; - case DataBuffer.TYPE_FLOAT: - data = new float[nbands]; - break; - case DataBuffer.TYPE_DOUBLE: - data = new double[nbands]; - break; - default: - throw new IllegalArgumentException("Unknown data buffer type: "+ - dataType); - } - - if (rgbArray == null) { - rgbArray = new int[offset+h*scansize]; - } - - ColorModel colorModel = img.getColorModel(); - for (int y = startY; y < startY+h; y++, yoff+=scansize) { - off = yoff; - for (int x = startX; x < startX+w; x++) { - rgbArray[off++] = colorModel.getRGB(raster.getDataElements(x, - y, - data)); - } - } - - return rgbArray; - - } - public static void renderEPS(EPSImage img, float x, float y, float w, float h, PSGenerator gen) { @@ -291,51 +101,4 @@ public class PSImageUtils { } } - /** - * Places an EPS file in the PostScript stream. - * @param rawEPS byte array containing the raw EPS data - * @param name name for the EPS document - * @param x x-coordinate of viewport in millipoints - * @param y y-coordinate of viewport in millipoints - * @param w width of viewport in millipoints - * @param h height of viewport in millipoints - * @param bboxx x-coordinate of EPS bounding box in points - * @param bboxy y-coordinate of EPS bounding box in points - * @param bboxw width of EPS bounding box in points - * @param bboxh height of EPS bounding box in points - * @param gen the PS generator - * @throws IOException in case an I/O error happens during output - */ - public static void renderEPS(byte[] rawEPS, String name, - float x, float y, float w, float h, - float bboxx, float bboxy, float bboxw, float bboxh, - PSGenerator gen) throws IOException { - gen.notifyResourceUsage(PSProcSets.EPS_PROCSET, false); - gen.writeln("%FOPBeginEPS: " + name); - gen.writeln("BeginEPSF"); - - gen.writeln(gen.formatDouble(x) + " " + gen.formatDouble(y) + " translate"); - gen.writeln("0 " + gen.formatDouble(h) + " translate"); - gen.writeln("1 -1 scale"); - float sx = w / bboxw; - float sy = h / bboxh; - if (sx != 1 || sy != 1) { - gen.writeln(gen.formatDouble(sx) + " " + gen.formatDouble(sy) + " scale"); - } - if (bboxx != 0 || bboxy != 0) { - gen.writeln(gen.formatDouble(-bboxx) + " " + gen.formatDouble(-bboxy) + " translate"); - } - gen.writeln(gen.formatDouble(bboxy) + " " + gen.formatDouble(bboxy) - + " " + gen.formatDouble(bboxw) + " " + gen.formatDouble(bboxh) + " re clip"); - gen.writeln("newpath"); - - PSResource res = new PSResource(PSResource.TYPE_FILE, name); - gen.notifyResourceUsage(res, false); - gen.writeDSCComment(DSCConstants.BEGIN_DOCUMENT, res.getName()); - gen.writeByteArr(rawEPS); - gen.writeDSCComment(DSCConstants.END_DOCUMENT); - gen.writeln("EndEPSF"); - gen.writeln("%FOPEndEPS"); - } - } |