Author: tilman
Date: Fri Jun 20 21:36:28 2014
New Revision: 1604282

URL: http://svn.apache.org/r1604282
Log:
PDFBOX-2141: set glyph transform rather than graphics2d transform, as suggested 
by Petr Slaby

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1604282&r1=1604281&r2=1604282&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java 
Fri Jun 20 21:36:28 2014
@@ -448,20 +448,20 @@ public class PageDrawer extends PDFStrea
 
     private void writeFont(final AffineTransform at, final GlyphVector glyphs)
     {
-        try
-        {
-            // Convert from PDF, where glyphs are upright when direction is 
from
-            // bottom to top, to AWT, where this is the other way around
-            at.scale(1, -1);
-            AffineTransform atInverse = at.createInverse();
-            graphics.transform(at);
-            graphics.drawGlyphVector(glyphs, 0, 0);
-            graphics.transform(atInverse);
-        }
-        catch (NoninvertibleTransformException exception)
+        // Convert from PDF, where glyphs are upright when direction is from
+        // bottom to top, to AWT, where this is the other way around
+        
+        // PDFBOX-2141: do not use graphics.transform(), because this prevents
+        // the correct rendering of shading patterns
+        // don't apply the translation to each glyph, only scale and shear
+        AffineTransform atRS = new AffineTransform(at.getScaleX(), 
at.getShearY(), 
+                -at.getShearX(), -at.getScaleY(), 0, 0);
+
+        for (int i = 0; i < glyphs.getNumGlyphs(); i++)
         {
-            LOG.error("Can't invert the given affine transformation", 
exception);
+            glyphs.setGlyphTransform(i, atRS);
         }
+        graphics.drawGlyphVector(glyphs, (float) at.getTranslateX(), (float) 
at.getTranslateY());
     }
 
     /**


Reply via email to