Author: jeremias
Date: Tue Nov 4 07:10:31 2008
New Revision: 711269
URL: http://svn.apache.org/viewvc?rev=711269&view=rev
Log:
Making conversion hints available to ImageHandler implementations, too.
(Re-)implemented Graphics2D support for PCL. It can be disabled by
fox:conversion-mode="bitmap" if necessary.
Fixed a bug with non-uniform image scaling when encoding bitmap images.
Commented some code that did not reliably convert color images to grayscale.
The (probably slower) fallback code is used instead.
Some performance improvements for text painting using bitmaps when
<rendering>speed<rendering> is selected.
Removed the RenderingContext interface from RendererContext since it's not used.
Added:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java
(with props)
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/META-INF/services/org.apache.fop.render.ImageHandler
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/AbstractRenderingContext.java
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RendererContext.java
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RenderingContext.java
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLGenerator.java
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLPainter.java
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLRenderingContext.java
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/META-INF/services/org.apache.fop.render.ImageHandler
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/META-INF/services/org.apache.fop.render.ImageHandler?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/META-INF/services/org.apache.fop.render.ImageHandler
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/META-INF/services/org.apache.fop.render.ImageHandler
Tue Nov 4 07:10:31 2008
@@ -6,3 +6,4 @@
org.apache.fop.render.java2d.Java2DImageHandlerRenderedImage
org.apache.fop.render.java2d.Java2DImageHandlerGraphics2D
org.apache.fop.render.pcl.PCLImageHandlerRenderedImage
+org.apache.fop.render.pcl.PCLImageHandlerGraphics2D
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/AbstractRenderingContext.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/AbstractRenderingContext.java?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/AbstractRenderingContext.java
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/AbstractRenderingContext.java
Tue Nov 4 07:10:31 2008
@@ -19,6 +19,9 @@
package org.apache.fop.render;
+import java.util.Collections;
+import java.util.Map;
+
import org.apache.fop.apps.FOUserAgent;
/**
@@ -27,6 +30,7 @@
public abstract class AbstractRenderingContext implements RenderingContext {
private FOUserAgent userAgent;
+ private Map hints;
/**
* Main constructor.
@@ -45,5 +49,33 @@
return userAgent;
}
+ /** [EMAIL PROTECTED] */
+ public void putHints(Map hints) {
+ if (hints == null) {
+ return;
+ }
+ if (this.hints == null) {
+ this.hints = new java.util.HashMap();
+ }
+ this.hints.putAll(hints);
+ }
+
+ /** [EMAIL PROTECTED] */
+ public Map getHints() {
+ if (this.hints == null) {
+ return Collections.EMPTY_MAP;
+ } else {
+ return Collections.unmodifiableMap(this.hints);
+ }
+ }
+
+ /** [EMAIL PROTECTED] */
+ public Object getHint(Object key) {
+ if (this.hints == null) {
+ return null;
+ } else {
+ return this.hints.get(key);
+ }
+ }
}
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RendererContext.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RendererContext.java?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RendererContext.java
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RendererContext.java
Tue Nov 4 07:10:31 2008
@@ -29,7 +29,7 @@
* so that external handlers can get information to be able to render to the
* render target.
*/
-public class RendererContext implements RenderingContext {
+public class RendererContext {
private String mime;
private AbstractRenderer renderer;
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RenderingContext.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RenderingContext.java?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RenderingContext.java
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/RenderingContext.java
Tue Nov 4 07:10:31 2008
@@ -19,6 +19,8 @@
package org.apache.fop.render;
+import java.util.Map;
+
import org.apache.fop.apps.FOUserAgent;
/**
@@ -40,4 +42,10 @@
*/
FOUserAgent getUserAgent();
+ void putHints(Map hints);
+
+ Map getHints();
+
+ Object getHint(Object key);
+
}
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/intermediate/AbstractIFPainter.java
Tue Nov 4 07:10:31 2008
@@ -127,6 +127,7 @@
//Load and convert the image to a supported format
RenderingContext context = createRenderingContext();
Map hints = createDefaultImageProcessingHints(sessionContext);
+ context.putHints(hints);
org.apache.xmlgraphics.image.loader.Image img = manager.getImage(
info, imageHandlerRegistry.getSupportedFlavors(context),
hints, sessionContext);
@@ -179,6 +180,7 @@
ImageHandlerRegistry imageHandlerRegistry =
getFopFactory().getImageHandlerRegistry();
Image effImage;
+ context.putHints(additionalHints);
if (convert) {
Map hints =
createDefaultImageProcessingHints(getUserAgent().getImageSessionContext());
if (additionalHints != null) {
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLGenerator.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLGenerator.java?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLGenerator.java
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLGenerator.java
Tue Nov 4 07:10:31 2008
@@ -22,12 +22,10 @@
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
-import java.awt.color.ColorSpace;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ByteLookupTable;
-import java.awt.image.ColorConvertOp;
import java.awt.image.ColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
@@ -767,11 +765,20 @@
*/
public void paintBitmap(RenderedImage img, Dimension targetDim, boolean
sourceTransparency)
throws IOException {
- double targetResolution = img.getWidth() /
UnitConv.mpt2in(targetDim.width);
+ double targetHResolution = img.getWidth() /
UnitConv.mpt2in(targetDim.width);
+ double targetVResolution = img.getHeight() /
UnitConv.mpt2in(targetDim.height);
+ double targetResolution = Math.max(targetHResolution,
targetVResolution);
int resolution = (int)Math.round(targetResolution);
int effResolution = calculatePCLResolution(resolution, true);
Dimension orgDim = new Dimension(img.getWidth(), img.getHeight());
- Dimension effDim = getAdjustedDimension(orgDim, targetResolution,
effResolution);
+ Dimension effDim;
+ if (targetResolution == effResolution) {
+ effDim = orgDim; //avoid scaling side-effects
+ } else {
+ effDim = new Dimension(
+ (int)Math.ceil(UnitConv.mpt2px(targetDim.width,
effResolution)),
+ (int)Math.ceil(UnitConv.mpt2px(targetDim.height,
effResolution)));
+ }
boolean scaled = !orgDim.equals(effDim);
//ImageWriterUtil.saveAsPNG(img, new
java.io.File("D:/text-0-org.png"));
@@ -791,6 +798,7 @@
BufferedImage src = null;
if (img instanceof BufferedImage && !scaled) {
if (!isGrayscaleImage(img) || img.getColorModel().hasAlpha()) {
+ /* Disabled as this doesn't work reliably, use the
fallback below
src = new BufferedImage(effDim.width, effDim.height,
BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g2d = src.createGraphics();
@@ -802,6 +810,7 @@
ColorConvertOp op = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
op.filter((BufferedImage)img, src);
+ */
} else {
src = (BufferedImage)img;
}
@@ -1018,7 +1027,7 @@
}
public void endLine() throws IOException {
- if (zeroRow) {
+ if (zeroRow && PCLGenerator.this.currentSourceTransparency) {
writeCommand("*b1Y");
} else if (rlewidth < bytewidth) {
writeCommand("*b1m" + rlewidth + "W");
Added:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java?rev=711269&view=auto
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java
(added)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java
Tue Nov 4 07:10:31 2008
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* $Id$ */
+
+package org.apache.fop.render.pcl;
+
+import java.awt.Dimension;
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.io.IOException;
+
+import org.apache.commons.io.output.ByteArrayOutputStream;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import org.apache.xmlgraphics.image.loader.Image;
+import org.apache.xmlgraphics.image.loader.ImageException;
+import org.apache.xmlgraphics.image.loader.ImageFlavor;
+import org.apache.xmlgraphics.image.loader.ImageManager;
+import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
+import org.apache.xmlgraphics.image.loader.impl.ImageRendered;
+import org.apache.xmlgraphics.java2d.GraphicContext;
+import org.apache.xmlgraphics.util.UnitConv;
+
+import org.apache.fop.apps.FOUserAgent;
+import org.apache.fop.render.ImageHandler;
+import org.apache.fop.render.RenderingContext;
+
+/**
+ * Image handler implementation that paints Graphics2D images in PCL. Since
PCL is limited in its
+ * vector graphics capabilities, there's a fallback built in that switches to
bitmap painting
+ * if an advanced feature is encountered.
+ */
+public class PCLImageHandlerGraphics2D implements ImageHandler {
+
+ /** logging instance */
+ private static Log log =
LogFactory.getLog(PCLImageHandlerGraphics2D.class);
+
+ /** [EMAIL PROTECTED] */
+ public int getPriority() {
+ return 400;
+ }
+
+ /** [EMAIL PROTECTED] */
+ public Class getSupportedImageClass() {
+ return ImageGraphics2D.class;
+ }
+
+ /** [EMAIL PROTECTED] */
+ public ImageFlavor[] getSupportedImageFlavors() {
+ return new ImageFlavor[] {
+ ImageFlavor.GRAPHICS2D
+ };
+ }
+
+ /** [EMAIL PROTECTED] */
+ public void handleImage(RenderingContext context, Image image, Rectangle
pos)
+ throws IOException {
+ PCLRenderingContext pclContext = (PCLRenderingContext)context;
+ ImageGraphics2D imageG2D = (ImageGraphics2D)image;
+ Dimension imageDim = imageG2D.getSize().getDimensionMpt();
+ PCLGenerator gen = pclContext.getPCLGenerator();
+
+ Point2D transPoint = pclContext.transformedPoint(pos.x, pos.y);
+ gen.setCursorPos(transPoint.getX(), transPoint.getY());
+
+ boolean painted = false;
+ ByteArrayOutputStream baout = new ByteArrayOutputStream();
+ PCLGenerator tempGen = new PCLGenerator(baout,
gen.getMaximumBitmapResolution());
+ try {
+ GraphicContext ctx =
(GraphicContext)pclContext.getGraphicContext().clone();
+
+ AffineTransform prepareHPGL2 = new AffineTransform();
+ prepareHPGL2.scale(0.001, 0.001);
+ ctx.setTransform(prepareHPGL2);
+
+ PCLGraphics2D graphics = new PCLGraphics2D(tempGen);
+ graphics.setGraphicContext(ctx);
+ graphics.setClippingDisabled(false
/*pclContext.isClippingDisabled()*/);
+ Rectangle2D area = new Rectangle2D.Double(
+ 0.0, 0.0, imageDim.getWidth(), imageDim.getHeight());
+ imageG2D.getGraphics2DImagePainter().paint(graphics, area);
+
+ //If we arrive here, the graphic is natively paintable, so write
the graphic
+ gen.writeCommand("*c" + gen.formatDouble4(pos.width / 100f) + "x"
+ + gen.formatDouble4(pos.height / 100f) + "Y");
+ gen.writeCommand("*c0T");
+ gen.enterHPGL2Mode(false);
+ gen.writeText("\nIN;");
+ gen.writeText("SP1;");
+ //One Plotter unit is 0.025mm!
+ double scale = imageDim.getWidth() /
UnitConv.mm2pt(imageDim.getWidth() * 0.025);
+ gen.writeText("SC0," + gen.formatDouble4(scale)
+ + ",0,-" + gen.formatDouble4(scale) + ",2;");
+ gen.writeText("IR0,100,0,100;");
+ gen.writeText("PU;PA0,0;\n");
+ baout.writeTo(gen.getOutputStream()); //Buffer is written to
output stream
+ gen.writeText("\n");
+
+ gen.enterPCLMode(false);
+ painted = true;
+ } catch (UnsupportedOperationException uoe) {
+ log.debug(
+ "Cannot paint graphic natively. Falling back to bitmap
painting. Reason: "
+ + uoe.getMessage());
+ }
+
+ if (!painted) {
+ //Fallback solution: Paint to a BufferedImage
+ FOUserAgent ua = context.getUserAgent();
+ ImageManager imageManager = ua.getFactory().getImageManager();
+ ImageRendered imgRend;
+ try {
+ imgRend = (ImageRendered)imageManager.convertImage(
+ imageG2D, new ImageFlavor[]
{ImageFlavor.RENDERED_IMAGE}/*, hints*/);
+ } catch (ImageException e) {
+ throw new IOException(
+ "Image conversion error while converting the image to
a bitmap"
+ + " as a fallback measure: " + e.getMessage());
+ }
+
+ gen.paintBitmap(imgRend.getRenderedImage(), new
Dimension(pos.width, pos.height),
+ pclContext.isSourceTransparencyEnabled());
+ }
+ }
+
+ /** [EMAIL PROTECTED] */
+ public boolean isCompatible(RenderingContext targetContext, Image image) {
+ boolean supported = (image == null || image instanceof ImageGraphics2D)
+ && targetContext instanceof PCLRenderingContext;
+ if (supported) {
+ Object hint = targetContext.getHint(PCLConstants.CONV_MODE);
+ if ("bitmap".equals(hint)) {
+ return false;
+ }
+ }
+ return supported;
+ }
+
+}
Propchange:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLPainter.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLPainter.java?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLPainter.java
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLPainter.java
Tue Nov 4 07:10:31 2008
@@ -110,6 +110,10 @@
}
}
+ private boolean isSpeedOptimized() {
+ return getPCLUtil().getRenderingMode() == PCLRenderingMode.SPEED;
+ }
+
//----------------------------------------------------------------------------------------------
/** [EMAIL PROTECTED] */
@@ -161,6 +165,10 @@
return PCLPainter.this.transformedPoint(x, y);
}
+ public GraphicContext getGraphicContext() {
+ return PCLPainter.this.graphicContext;
+ }
+
};
return pdfContext;
}
@@ -203,7 +211,7 @@
public void drawBorderRect(final Rectangle rect,
final BorderProps before, final BorderProps after,
final BorderProps start, final BorderProps end) throws IFException
{
- if (getPCLUtil().getRenderingMode() == PCLRenderingMode.SPEED) {
+ if (isSpeedOptimized()) {
super.drawBorderRect(rect, before, after, start, end);
return;
}
@@ -239,7 +247,7 @@
public void drawLine(final Point start, final Point end,
final int width, final Color color, final RuleStyle style)
throws IFException {
- if (getPCLUtil().getRenderingMode() == PCLRenderingMode.SPEED) {
+ if (isSpeedOptimized()) {
super.drawLine(start, end, width, color, style);
return;
}
@@ -278,8 +286,16 @@
ImageGraphics2D img = new ImageGraphics2D(info, painter);
Map hints = new java.util.HashMap();
- hints.put(ImageProcessingHints.BITMAP_TYPE_INTENT,
- ImageProcessingHints.BITMAP_TYPE_INTENT_GRAY);
+ if (isSpeedOptimized()) {
+ //Gray text may not be painted in this case! We don't get
dithering in Sun JREs.
+ //But this approach is about twice as fast as the grayscale image.
+ hints.put(ImageProcessingHints.BITMAP_TYPE_INTENT,
+ ImageProcessingHints.BITMAP_TYPE_INTENT_MONO);
+ } else {
+ hints.put(ImageProcessingHints.BITMAP_TYPE_INTENT,
+ ImageProcessingHints.BITMAP_TYPE_INTENT_GRAY);
+ }
+ hints.put(PCLConstants.CONV_MODE, "bitmap");
PCLRenderingContext context =
(PCLRenderingContext)createRenderingContext();
context.setSourceTransparencyEnabled(true);
try {
Modified:
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLRenderingContext.java
URL:
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLRenderingContext.java?rev=711269&r1=711268&r2=711269&view=diff
==============================================================================
---
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLRenderingContext.java
(original)
+++
xmlgraphics/fop/branches/Temp_AreaTreeNewDesign/src/java/org/apache/fop/render/pcl/PCLRenderingContext.java
Tue Nov 4 07:10:31 2008
@@ -21,6 +21,7 @@
import java.awt.geom.Point2D;
+import org.apache.xmlgraphics.java2d.GraphicContext;
import org.apache.xmlgraphics.util.MimeConstants;
import org.apache.fop.apps.FOUserAgent;
@@ -93,4 +94,10 @@
*/
public abstract Point2D transformedPoint(int x, int y);
+ /**
+ * Returns the current [EMAIL PROTECTED] GraphicContext} instance.
+ * @return the graphic context
+ */
+ public abstract GraphicContext getGraphicContext();
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]