aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Steiner <ssteiner@apache.org>2022-09-01 10:24:22 +0000
committerSimon Steiner <ssteiner@apache.org>2022-09-01 10:24:22 +0000
commit21caac81cb9f9ff9cc08dbaf072abaf94ad7e5c1 (patch)
treefd976e1e8c4a2e69d108fb6a0edc09925b9bbfc4
parentf2e542354f9783e30c72b403422beeb33de9d787 (diff)
downloadxmlgraphics-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
-rw-r--r--fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java2
-rw-r--r--fop-core/src/main/java/org/apache/fop/render/ps/PSPainter.java10
-rw-r--r--fop-core/src/main/java/org/apache/fop/render/ps/PSPainterUtil.java60
-rw-r--r--fop-core/src/test/java/org/apache/fop/render/ps/PSPainterUtilTestCase.java37
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"));
+ }
+}