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-ffa450edef68tags/fop-1_1rc1old
@@ -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 |
@@ -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"); |
@@ -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); |