Browse Source

FOP-2924: Images not scaled or rotated in PCL

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1875643 13f79535-47bb-0310-9956-ffa450edef68
tags/fop-2_5
Simon Steiner 4 years ago
parent
commit
150d1c1995

+ 6
- 2
fop-core/src/main/java/org/apache/fop/render/pcl/PCLGenerator.java View File

boolean scaled = !orgDim.equals(effDim); boolean scaled = !orgDim.equals(effDim);
if (!monochrome) { if (!monochrome) {
if (printerSupportsColor) { if (printerSupportsColor) {
RenderedImage effImg = img;
if (scaled) {
effImg = BitmapImageUtil.convertTosRGB(img, effDim);
}
selectCurrentPattern(0, 0); //Solid black selectCurrentPattern(0, 0); //Solid black
renderImageAsColor(img, effResolution);
renderImageAsColor(effImg, effResolution);
} else { } else {
//Transparency mask disabled. Doesn't work reliably //Transparency mask disabled. Doesn't work reliably
/* /*
RenderedImage effImg = img; RenderedImage effImg = img;
if (scaled) { if (scaled) {
effImg = BitmapImageUtil.convertToMonochrome(img, effDim); effImg = BitmapImageUtil.convertToMonochrome(img, effDim);
}
}
setSourceTransparencyMode(sourceTransparency); setSourceTransparencyMode(sourceTransparency);
selectCurrentPattern(0, 0); //Solid black selectCurrentPattern(0, 0); //Solid black
paintMonochromeBitmap(effImg, effResolution); paintMonochromeBitmap(effImg, effResolution);

+ 26
- 2
fop-core/src/main/java/org/apache/fop/render/pcl/PCLImageHandlerGraphics2D.java View File



AffineTransform prepareHPGL2 = new AffineTransform(); AffineTransform prepareHPGL2 = new AffineTransform();
prepareHPGL2.scale(0.001, 0.001); prepareHPGL2.scale(0.001, 0.001);

int direction = PCLRenderingUtil.determinePrintDirection(ctx.getTransform());
rotate(prepareHPGL2, imageDim, direction);
int height = pos.height;
int width = pos.width;
if (direction == 90 || direction == 270) {
int tmp = height;
height = width;
width = tmp;
}

ctx.setTransform(prepareHPGL2); ctx.setTransform(prepareHPGL2);


PCLGraphics2D graphics = new PCLGraphics2D(tempGen); PCLGraphics2D graphics = new PCLGraphics2D(tempGen);
imageG2D.getGraphics2DImagePainter().paint(graphics, area); imageG2D.getGraphics2DImagePainter().paint(graphics, area);


//If we arrive here, the graphic is natively paintable, so write the graphic //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("*c" + gen.formatDouble4(width / 100f) + "x"
+ gen.formatDouble4(height / 100f) + "Y");
gen.writeCommand("*c0T"); gen.writeCommand("*c0T");
gen.enterHPGL2Mode(false); gen.enterHPGL2Mode(false);
gen.writeText("\nIN;"); gen.writeText("\nIN;");
} }
} }


private void rotate(AffineTransform prepareHPGL2, Dimension imageDim, int direction) {
if (direction != 0) {
double rads = Math.toRadians(-direction);
double sin = Math.abs(Math.sin(rads));
double cos = Math.abs(Math.cos(rads));
double w = Math.floor(imageDim.getWidth() * cos + imageDim.getHeight() * sin);
double h = Math.floor(imageDim.getHeight() * cos + imageDim.getWidth() * sin);
prepareHPGL2.translate(w / 2d, h / 2d);
prepareHPGL2.rotate(rads, 0, 0);
prepareHPGL2.translate(-imageDim.getWidth() / 2d, -imageDim.getHeight() / 2d);
}
}

/** {@inheritDoc} */ /** {@inheritDoc} */
public boolean isCompatible(RenderingContext targetContext, Image image) { public boolean isCompatible(RenderingContext targetContext, Image image) {
boolean supported = (image == null || image instanceof ImageGraphics2D) boolean supported = (image == null || image instanceof ImageGraphics2D)

+ 51
- 0
fop-core/src/test/java/org/apache/fop/render/pcl/PCLPainterTestCase.java View File

import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FontFormatException; import java.awt.FontFormatException;
import java.awt.Graphics2D;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;


import org.apache.xmlgraphics.image.loader.ImageInfo;
import org.apache.xmlgraphics.image.loader.ImageSize;
import org.apache.xmlgraphics.image.loader.impl.ImageGraphics2D;
import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;

import org.apache.fop.apps.FOUserAgent; import org.apache.fop.apps.FOUserAgent;
import org.apache.fop.apps.FopFactory; import org.apache.fop.apps.FopFactory;
import org.apache.fop.fonts.EmbeddingMode; import org.apache.fop.fonts.EmbeddingMode;
Assert.assertTrue(output.toString().contains("*v255a0b0c0I\u001B*v0S\u001B*c0.01h0.01V\u001B*c0P")); Assert.assertTrue(output.toString().contains("*v255a0b0c0I\u001B*v0S\u001B*c0.01h0.01V\u001B*c0P"));
} }


@Test
public void testDrawImage() throws IFException {
Rectangle size = new Rectangle(1, 1);
PCLPageDefinition pclPageDef = new PCLPageDefinition("", 0, new Dimension(), size, true);
PCLDocumentHandler documentHandler = new PCLDocumentHandler(new IFContext(ua));
ByteArrayOutputStream output = new ByteArrayOutputStream();
documentHandler.setResult(new StreamResult(output));
documentHandler.startDocument();
PCLPainter pclPainter = new PCLPainter(documentHandler, pclPageDef);
pclPainter.getPCLUtil().setColorEnabled(true);
pclPainter.drawImage("test/resources/images/fop-logo-color-24bit.png", new Rectangle(100, 100));
Assert.assertTrue(output.toString(), output.toString().contains("*r0f1t1S"));
}

@Test
public void testDrawGraphics() throws IOException, IFException {
Rectangle size = new Rectangle(1, 1);
PCLPageDefinition pclPageDef = new PCLPageDefinition("", 0, new Dimension(), size, true);
PCLDocumentHandler documentHandler = new PCLDocumentHandler(new IFContext(ua));
ByteArrayOutputStream output = new ByteArrayOutputStream();
documentHandler.setResult(new StreamResult(output));
documentHandler.startDocument();
PCLPainter pclPainter = new PCLPainter(documentHandler, pclPageDef);
PCLImageHandlerGraphics2D graphics2D = new PCLImageHandlerGraphics2D();
ImageInfo info = new ImageInfo(null, null);
info.setSize(new ImageSize());
ImageGraphics2D imageGraphics2D = new ImageGraphics2D(info, new MyGraphics2DImagePainter());
graphics2D.handleImage(pclPainter.createRenderingContext(), imageGraphics2D, new Rectangle(50, 100));
Assert.assertTrue(output.toString().contains("*c0.5x1Y"));
output.reset();
pclPainter.startGroup(AffineTransform.getRotateInstance(-Math.PI / 2), null);
graphics2D.handleImage(pclPainter.createRenderingContext(), imageGraphics2D, new Rectangle(50, 100));
Assert.assertTrue(output.toString().contains("*c1x0.5Y"));
}

static class MyGraphics2DImagePainter implements Graphics2DImagePainter {
public void paint(Graphics2D g2d, Rectangle2D area) {
}
public Dimension getImageSize() {
return null;
}
}

@Test @Test
public void testTruetype() throws IFException, IOException, FontFormatException, URISyntaxException { public void testTruetype() throws IFException, IOException, FontFormatException, URISyntaxException {
String optimizeResources = getPCL(true).toString(); String optimizeResources = getPCL(true).toString();

Loading…
Cancel
Save