From 860ebd14107d5288d95360b04cb8e3a375922f7b Mon Sep 17 00:00:00 2001 From: Jeremias Maerki Date: Tue, 14 Jun 2011 12:58:55 +0000 Subject: [PATCH] Fixed regression introduced with rev 1095887: Painting state was not properly handled when painting text runs which could lead to missing color setters and therefore wrong font colors. Removed save/restoreGraphicsState from PDFTextUtil as that doesn't update the painting state. Instead the code is now using equivalent methods from PDFGraphics2D. git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1135540 13f79535-47bb-0310-9956-ffa450edef68 --- src/java/org/apache/fop/pdf/PDFTextUtil.java | 17 +---------- .../org/apache/fop/svg/PDFGraphics2D.java | 28 +++++++++++-------- .../org/apache/fop/svg/PDFTextPainter.java | 8 ++++-- 3 files changed, 23 insertions(+), 30 deletions(-) diff --git a/src/java/org/apache/fop/pdf/PDFTextUtil.java b/src/java/org/apache/fop/pdf/PDFTextUtil.java index 6640f9b80..3768bb6ce 100644 --- a/src/java/org/apache/fop/pdf/PDFTextUtil.java +++ b/src/java/org/apache/fop/pdf/PDFTextUtil.java @@ -84,7 +84,7 @@ public abstract class PDFTextUtil { private void writeChar(char ch, StringBuffer sb) { if (!useMultiByte) { if (ch < 32 || ch > 127) { - sb.append("\\").append(Integer.toOctalString((int)ch)); + sb.append("\\").append(Integer.toOctalString(ch)); } else { switch (ch) { case '(': @@ -146,21 +146,6 @@ public abstract class PDFTextUtil { this.textRenderingMode = TR_FILL; } - /** - * Creates a "q" command, pushing a copy of the entire graphics state onto the stack. - */ - public void saveGraphicsState() { - write("q\n"); - } - - /** - * Creates a "Q" command, restoring the entire graphics state to its former value by popping - * it from the stack. - */ - public void restoreGraphicsState() { - write("Q\n"); - } - /** * Creates a "cm" command. * @param at the transformation matrix diff --git a/src/java/org/apache/fop/svg/PDFGraphics2D.java b/src/java/org/apache/fop/svg/PDFGraphics2D.java index 740de84a0..4ae8e72d7 100644 --- a/src/java/org/apache/fop/svg/PDFGraphics2D.java +++ b/src/java/org/apache/fop/svg/PDFGraphics2D.java @@ -624,8 +624,7 @@ public class PDFGraphics2D extends AbstractGraphics2D implements NativeImageHand && !trans.isIdentity(); if (newClip || newTransform) { - currentStream.write("q\n"); - paintingState.save(); + saveGraphicsState(); if (newTransform) { concatMatrix(tranvals); } @@ -650,8 +649,7 @@ public class PDFGraphics2D extends AbstractGraphics2D implements NativeImageHand applyUnknownPaint(paint, ss); if (newClip || newTransform) { - currentStream.write("Q\n"); - paintingState.restore(); + restoreGraphicsState(); } return; } @@ -662,8 +660,7 @@ public class PDFGraphics2D extends AbstractGraphics2D implements NativeImageHand processPathIterator(iter); doDrawing(false, true, false); if (newClip || newTransform) { - currentStream.write("Q\n"); - paintingState.restore(); + restoreGraphicsState(); } } @@ -1613,8 +1610,7 @@ public class PDFGraphics2D extends AbstractGraphics2D implements NativeImageHand && !trans.isIdentity(); if (newClip || newTransform) { - currentStream.write("q\n"); - paintingState.save(); + saveGraphicsState(); if (newTransform) { concatMatrix(tranvals); } @@ -1637,8 +1633,7 @@ public class PDFGraphics2D extends AbstractGraphics2D implements NativeImageHand applyUnknownPaint(paint, s); if (newClip || newTransform) { - currentStream.write("Q\n"); - paintingState.restore(); + restoreGraphicsState(); } return; } @@ -1658,11 +1653,20 @@ public class PDFGraphics2D extends AbstractGraphics2D implements NativeImageHand iter.getWindingRule() == PathIterator.WIND_EVEN_ODD); } if (newClip || newTransform) { - currentStream.write("Q\n"); - paintingState.restore(); + restoreGraphicsState(); } } + void saveGraphicsState() { + currentStream.write("q\n"); + paintingState.save(); + } + + void restoreGraphicsState() { + currentStream.write("Q\n"); + paintingState.restore(); + } + /** Checks whether the use of transparency is allowed. */ protected void checkTransparencyAllowed() { pdfDoc.getProfile().verifyTransparencyAllowed("Java2D graphics"); diff --git a/src/java/org/apache/fop/svg/PDFTextPainter.java b/src/java/org/apache/fop/svg/PDFTextPainter.java index fe8ad1c7e..00160f091 100644 --- a/src/java/org/apache/fop/svg/PDFTextPainter.java +++ b/src/java/org/apache/fop/svg/PDFTextPainter.java @@ -62,11 +62,13 @@ class PDFTextPainter extends NativeTextPainter { } /** {@inheritDoc} */ + @Override protected boolean isSupported(Graphics2D g2d) { return g2d instanceof PDFGraphics2D; } /** {@inheritDoc} */ + @Override protected void paintTextRun(TextRun textRun, Graphics2D g2d) { AttributedCharacterIterator runaci = textRun.getACI(); runaci.first(); @@ -86,7 +88,9 @@ class PDFTextPainter extends NativeTextPainter { runaci.first(); //Reset ACI final PDFGraphics2D pdf = (PDFGraphics2D)g2d; + PDFTextUtil textUtil = new PDFTextUtil(pdf.fontInfo) { + @Override protected void write(String code) { pdf.currentStream.write(code); } @@ -109,7 +113,7 @@ class PDFTextPainter extends NativeTextPainter { return; } - textUtil.saveGraphicsState(); + pdf.saveGraphicsState(); textUtil.concatMatrix(g2d.getTransform()); Shape imclip = g2d.getClip(); pdf.writeClip(imclip); @@ -197,7 +201,7 @@ class PDFTextPainter extends NativeTextPainter { } textUtil.writeTJ(); textUtil.endTextObject(); - textUtil.restoreGraphicsState(); + pdf.restoreGraphicsState(); if (DEBUG) { g2d.setStroke(new BasicStroke(0)); g2d.setColor(Color.LIGHT_GRAY); -- 2.39.5