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
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 eec267c..087ccd9 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 @@
         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 2eadfca..1d3aaa0 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.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 @@
                         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 0000000..2baa780
--- /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 0000000..d34b569
--- /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"));
+    }
+}