diff options
author | Simon Steiner <ssteiner@apache.org> | 2022-09-01 10:24:22 +0000 |
---|---|---|
committer | Simon Steiner <ssteiner@apache.org> | 2022-09-01 10:24:22 +0000 |
commit | 21caac81cb9f9ff9cc08dbaf072abaf94ad7e5c1 (patch) | |
tree | fd976e1e8c4a2e69d108fb6a0edc09925b9bbfc4 | |
parent | f2e542354f9783e30c72b403422beeb33de9d787 (diff) | |
download | xmlgraphics-fop-21caac81cb9f9ff9cc08dbaf072abaf94ad7e5c1.tar.gz xmlgraphics-fop-21caac81cb9f9ff9cc08dbaf072abaf94ad7e5c1.zip |
FOP-3091: Add transparency color support for PS
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1903807 13f79535-47bb-0310-9956-ffa450edef68
4 files changed, 105 insertions, 4 deletions
diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java index eec267c3a..087ccd972 100644 --- a/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java @@ -83,7 +83,7 @@ public class PSImageHandlerRenderedImage implements PSImageHandler { ImageEncodingHelper helper = new ImageEncodingHelper(ri); ColorModel cm = helper.getEncodedColorModel(); - PSImageUtils.writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen, ri, null); + PSImageUtils.writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen, ri, false); } /** {@inheritDoc} */ diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSPainter.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSPainter.java index 2eadfcaec..1d3aaa055 100644 --- a/fop-core/src/main/java/org/apache/fop/render/ps/PSPainter.java +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSPainter.java @@ -24,6 +24,7 @@ import java.awt.Dimension; import java.awt.Paint; import java.awt.Point; import java.awt.Rectangle; +import java.awt.Transparency; import java.awt.geom.AffineTransform; import java.io.IOException; import java.util.Map; @@ -232,9 +233,12 @@ public class PSPainter extends AbstractIFPainter<PSDocumentHandler> { throw new UnsupportedOperationException("Non-Color paints NYI"); } } - generator.defineRect(rect.x / 1000.0, rect.y / 1000.0, - rect.width / 1000.0, rect.height / 1000.0); - generator.writeln(generator.mapCommand("fill")); + if (fill.getTransparency() != Transparency.OPAQUE) { + PSPainterUtil.drawTransparency(generator, rect, fill); + } else { + generator.defineRect(rect.x / 1000.0, rect.y / 1000.0, rect.width / 1000.0, rect.height / 1000.0); + generator.writeln(generator.mapCommand("fill")); + } } catch (IOException ioe) { throw new IFException("I/O error in fillRect()", ioe); } diff --git a/fop-core/src/main/java/org/apache/fop/render/ps/PSPainterUtil.java b/fop-core/src/main/java/org/apache/fop/render/ps/PSPainterUtil.java new file mode 100644 index 000000000..2baa780b1 --- /dev/null +++ b/fop-core/src/main/java/org/apache/fop/render/ps/PSPainterUtil.java @@ -0,0 +1,60 @@ +/* + * 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.ps; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Paint; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; + +import org.apache.xmlgraphics.java2d.GraphicContext; +import org.apache.xmlgraphics.java2d.ps.PSGraphics2D; +import org.apache.xmlgraphics.ps.PSGenerator; + +import org.apache.fop.util.bitmap.BitmapImageUtil; + +public final class PSPainterUtil { + private PSPainterUtil() { + } + + public static void drawTransparency(PSGenerator generator, Rectangle rect, Paint fill) { + PSGraphics2D graphics = new PSGraphics2D(true, generator); + graphics.setGraphicContext(new GraphicContext()); + BufferedImage image = buildImage((Color) fill, rect.width / 1000, rect.height / 1000); + RenderedImage mask = buildMaskImage(image, rect.width / 1000, rect.height / 1000); + graphics.drawImage(image, rect.x / 1000, rect.y / 1000, null, null, mask); + } + + private static BufferedImage buildImage(Color color, int width, int height) { + BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); + Graphics graphics = bufferedImage.getGraphics(); + Color alpha = new Color(color.getAlpha(), color.getAlpha(), color.getAlpha()); + graphics.setColor(alpha); + graphics.fillRect(0, 0, width, height); + graphics.dispose(); + return bufferedImage; + } + + private static RenderedImage buildMaskImage(BufferedImage image, int width, int height) { + return BitmapImageUtil.convertToMonochrome(image, new Dimension(width, height), 1); + } +} diff --git a/fop-core/src/test/java/org/apache/fop/render/ps/PSPainterUtilTestCase.java b/fop-core/src/test/java/org/apache/fop/render/ps/PSPainterUtilTestCase.java new file mode 100644 index 000000000..d34b5693f --- /dev/null +++ b/fop-core/src/test/java/org/apache/fop/render/ps/PSPainterUtilTestCase.java @@ -0,0 +1,37 @@ +/* + * 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. + */ +package org.apache.fop.render.ps; + +import java.awt.Color; +import java.awt.Rectangle; +import java.io.ByteArrayOutputStream; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.xmlgraphics.ps.PSGenerator; + +public class PSPainterUtilTestCase { + @Test + public void testDrawTransparency() { + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + PSGenerator generator = new PSGenerator(bos); + Color color = new Color(0, 0, 0, 128); + PSPainterUtil.drawTransparency(generator, new Rectangle(10000, 10000), color); + Assert.assertTrue(bos.toString().contains("imagemask")); + } +} |