Author: ssteiner
Date: Thu Sep  1 09:36:44 2022
New Revision: 1903803

URL: http://svn.apache.org/viewvc?rev=1903803&view=rev
Log:
FOP-3091: Add transparency color support for PDF

Modified:
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/expr/PropertyTokenizer.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFColorHandler.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pdf/PDFContentGenerator.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2D.java
    
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFGraphics2D.java
    
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pdf/PDFPainterTestCase.java
    xmlgraphics/fop/trunk/fop/lib/xmlgraphics-commons-svn-trunk.jar

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/expr/PropertyTokenizer.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/expr/PropertyTokenizer.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/expr/PropertyTokenizer.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/fo/expr/PropertyTokenizer.java
 Thu Sep  1 09:36:44 2022
@@ -229,7 +229,7 @@ class PropertyTokenizer {
             ++exprIndex;
             scanHexDigits();
             int len = exprIndex - currentTokenStartIndex - 1;
-            if (len % 3 == 0) {
+            if (len % 3 == 0 || len == 8) {
                 currentToken = TOK_COLORSPEC;
             } else {
                 //Actually not a color at all, but an NCNAME starting with "#"

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFColorHandler.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFColorHandler.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFColorHandler.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFColorHandler.java
 Thu Sep  1 09:36:44 2022
@@ -23,6 +23,7 @@ import java.awt.Color;
 import java.awt.color.ColorSpace;
 import java.awt.color.ICC_ColorSpace;
 import java.awt.color.ICC_Profile;
+import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
@@ -45,6 +46,7 @@ public class PDFColorHandler {
     private Log log = LogFactory.getLog(PDFColorHandler.class);
 
     private PDFResources resources;
+    private PDFResourceContext resourceContext;
 
     private Map<String, PDFCIELabColorSpace> cieLabColorSpaces;
 
@@ -52,8 +54,9 @@ public class PDFColorHandler {
      * Create a new instance for the given {@link PDFResources}
      * @param resources the PDF resources
      */
-    public PDFColorHandler(PDFResources resources) {
+    public PDFColorHandler(PDFResources resources, PDFResourceContext 
resourceContext) {
         this.resources = resources;
+        this.resourceContext = resourceContext;
     }
 
     private PDFDocument getDocument() {
@@ -67,7 +70,7 @@ public class PDFColorHandler {
      * @param color the color
      * @param fill true for fill color, false for stroke color
      */
-    public void establishColor(StringBuffer codeBuffer, Color color, boolean 
fill) {
+    public void establishColor(StringBuffer codeBuffer, Color color, boolean 
fill, boolean alpha) {
         if (color instanceof ColorWithAlternatives) {
             ColorWithAlternatives colExt = (ColorWithAlternatives)color;
             //Alternate colors have priority
@@ -87,7 +90,7 @@ public class PDFColorHandler {
         //Fallback
         boolean established = establishColorFromColor(codeBuffer, color, fill);
         if (!established) {
-            establishDeviceRGB(codeBuffer, color, fill);
+            establishDeviceRGB(codeBuffer, color, fill, alpha);
         }
     }
 
@@ -188,7 +191,7 @@ public class PDFColorHandler {
         }
     }
 
-    private void establishDeviceRGB(StringBuffer codeBuffer, Color color, 
boolean fill) {
+    private void establishDeviceRGB(StringBuffer codeBuffer, Color color, 
boolean fill, boolean alpha) {
         float[] comps;
         if (color.getColorSpace().isCS_sRGB()) {
             comps = color.getColorComponents(null);
@@ -199,6 +202,9 @@ public class PDFColorHandler {
             ColorSpace sRGB = ColorSpace.getInstance(ColorSpace.CS_sRGB);
             comps = color.getColorComponents(sRGB, null);
         }
+        if (alpha) {
+            writeAlpha(color, codeBuffer);
+        }
         if (ColorUtil.isGray(color)) {
             comps = new float[] {comps[0]}; //assuming that all components are 
the same
             writeColor(codeBuffer, comps, 1, (fill ? "g" : "G"));
@@ -207,7 +213,20 @@ public class PDFColorHandler {
         }
     }
 
+    private void writeAlpha(Color color, StringBuffer codeBuffer) {
+        int alpha = color.getAlpha();
+        if (alpha != 255 && alpha != 0 && resourceContext != null) {
+            Map<String, Float> vals = new HashMap<>();
+            vals.put(PDFGState.GSTATE_ALPHA_NONSTROKE, alpha / 255f);
+            vals.put(PDFGState.GSTATE_ALPHA_STROKE, 1.0f);
+            PDFGState gState = getDocument().getFactory().makeGState(vals, 
PDFGState.DEFAULT);
+            resourceContext.addGState(gState);
+            codeBuffer.append("/").append(gState.getName()).append(" gs\n");
+        }
+    }
+
     private void establishDeviceCMYK(StringBuffer codeBuffer, Color color, 
boolean fill) {
+        writeAlpha(color, codeBuffer);
         writeColor(codeBuffer, color, 4, (fill ? "k" : "K"));
     }
 

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/pdf/PDFDocument.java
 Thu Sep  1 09:36:44 2022
@@ -751,7 +751,7 @@ public class PDFDocument {
             poss = new PDFGState();
             poss.addValues(current);
             poss.addValues(avail);
-            if (poss.equals(wanted)) {
+            if (poss.contentEquals(wanted)) {
                 return avail;
             }
         }

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pdf/PDFContentGenerator.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pdf/PDFContentGenerator.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pdf/PDFContentGenerator.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/pdf/PDFContentGenerator.java
 Thu Sep  1 09:36:44 2022
@@ -96,7 +96,7 @@ public class PDFContentGenerator {
         };
 
         this.currentState = new PDFPaintingState();
-        this.colorHandler = new PDFColorHandler(document.getResources());
+        this.colorHandler = new PDFColorHandler(document.getResources(), 
resourceContext);
         this.context = context;
     }
 
@@ -455,7 +455,7 @@ public class PDFContentGenerator {
      */
     protected void setColor(Color col, boolean fill, StringBuffer pdf) {
         if (pdf != null) {
-            colorHandler.establishColor(pdf, col, fill);
+            colorHandler.establishColor(pdf, col, fill, true);
         } else {
             setColor(col, fill, getStream());
         }

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/render/ps/PSImageHandlerRenderedImage.java
 Thu Sep  1 09:36:44 2022
@@ -83,7 +83,7 @@ public class PSImageHandlerRenderedImage
         ImageEncodingHelper helper = new ImageEncodingHelper(ri);
         ColorModel cm = helper.getEncodedColorModel();
 
-        PSImageUtils.writeImage(encoder, imgDim, imgDescription, targetRect, 
cm, gen, ri);
+        PSImageUtils.writeImage(encoder, imgDim, imgDescription, targetRect, 
cm, gen, ri, null);
     }
 
     /** {@inheritDoc} */

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2D.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2D.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2D.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFDocumentGraphics2D.java
 Thu Sep  1 09:36:44 2022
@@ -102,7 +102,7 @@ public class PDFDocumentGraphics2D exten
         this.pdfDoc = new PDFDocument("Apache FOP Version " + 
Version.getVersion()
                 + ": PDFDocumentGraphics2D");
         this.pdfContext = new PDFContext();
-        this.colorHandler = new PDFColorHandler(this.pdfDoc.getResources());
+        this.colorHandler = new PDFColorHandler(this.pdfDoc.getResources(), 
resourceContext);
     }
 
     /**
@@ -237,7 +237,7 @@ public class PDFDocumentGraphics2D exten
     public void setBackgroundColor(Color col) {
         StringBuffer sb = new StringBuffer();
         sb.append("q\n");
-        this.colorHandler.establishColor(sb, col, true);
+        this.colorHandler.establishColor(sb, col, true, true);
 
         sb.append("0 0 ").append(width).append(" ").append(height).append(" 
re\n");
 

Modified: 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFGraphics2D.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFGraphics2D.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFGraphics2D.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/main/java/org/apache/fop/svg/PDFGraphics2D.java
 Thu Sep  1 09:36:44 2022
@@ -217,7 +217,7 @@ public class PDFGraphics2D extends Abstr
                          TransparencyIgnoredEventListener listener) {
         this(textAsShapes);
         pdfDoc = doc;
-        this.colorHandler = new PDFColorHandler(doc.getResources());
+        this.colorHandler = new PDFColorHandler(doc.getResources(), page);
         resourceContext = page;
         currentFontName = font;
         currentFontSize = size;
@@ -790,7 +790,7 @@ public class PDFGraphics2D extends Abstr
         }
         if (doWrite) {
             StringBuffer sb = new StringBuffer();
-            colorHandler.establishColor(sb, col, fill);
+            colorHandler.establishColor(sb, col, fill, false);
             currentStream.write(sb.toString());
         }
     }

Modified: 
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pdf/PDFPainterTestCase.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pdf/PDFPainterTestCase.java?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
--- 
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pdf/PDFPainterTestCase.java
 (original)
+++ 
xmlgraphics/fop/trunk/fop-core/src/test/java/org/apache/fop/render/pdf/PDFPainterTestCase.java
 Thu Sep  1 09:36:44 2022
@@ -471,4 +471,36 @@ public class PDFPainterTestCase {
         pdfPainter.drawImageUsingImageHandler(info, new Rectangle());
         Assert.assertEquals(event[0].getEventKey(), "imageWritingError");
     }
+
+    @Test
+    public void testAlphaColor() throws Exception {
+        FopFactory fopFactory = FopFactory.newInstance(new File(".").toURI());
+        foUserAgent = fopFactory.newFOUserAgent();
+        PDFDocumentHandler pdfDocumentHandler = new PDFDocumentHandler(new 
IFContext(foUserAgent));
+        pdfDocumentHandler.setResult(new StreamResult(new 
ByteArrayOutputStream()));
+        pdfDocumentHandler.startDocument();
+        pdfDocumentHandler.startPage(0, "", "", new Dimension());
+        PDFPainter pdfPainter = new PDFPainter(pdfDocumentHandler, null);
+        pdfPainter.fillRect(new Rectangle(10, 10), new Color(0, 0, 0, 128));
+        PDFFilterList filters = 
pdfPainter.generator.getStream().getFilterList();
+        filters.setDisableAllFilters(true);
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+        pdfPainter.generator.getStream().output(bos);
+        Assert.assertEquals("<< /Length 1 0 R >>\n"
+                + "stream\n"
+                + "q\n"
+                + "1 0 0 -1 0 0 cm\n"
+                + "/GS1 gs\n"
+                + "0 g\n"
+                + "0 0 0.01 0.01 re f\n"
+                + "\n"
+                + "endstream", bos.toString());
+        bos.reset();
+        
pdfDocumentHandler.getCurrentPage().getGStates().iterator().next().output(bos);
+        Assert.assertEquals(bos.toString(), "<<\n"
+                + "/Type /ExtGState\n"
+                + "/ca 0.5019608\n"
+                + "/CA 1.0\n"
+                + ">>");
+    }
 }

Modified: xmlgraphics/fop/trunk/fop/lib/xmlgraphics-commons-svn-trunk.jar
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/fop/lib/xmlgraphics-commons-svn-trunk.jar?rev=1903803&r1=1903802&r2=1903803&view=diff
==============================================================================
Binary files - no diff available.



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscr...@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-h...@xmlgraphics.apache.org

Reply via email to