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