Author: vhennebert
Date: Thu Jul 10 17:06:13 2014
New Revision: 1609508

URL: http://svn.apache.org/r1609508
Log:
Fixed gradients in PostScript output
Linear gradients were not rendered properly in non-square shapes
Gradial gradients don't need to be rasterized in ellipses

Modified:
    
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/PSImageHandlerSVG.java
    
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSPattern.java
    
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSSVGGraphics2D.java
    
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/PSGradientFactory.java

Modified: 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/PSImageHandlerSVG.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/PSImageHandlerSVG.java?rev=1609508&r1=1609507&r2=1609508&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/PSImageHandlerSVG.java
 (original)
+++ 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/PSImageHandlerSVG.java
 Thu Jul 10 17:06:13 2014
@@ -33,8 +33,6 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import javax.imageio.ImageIO;
 
@@ -314,19 +312,6 @@ public class PSImageHandlerSVG implement
                 }
             }
             String nodeName = curNode.getLocalName();
-            //Special case where rasterization needed for radial gradients
-            if (nodeName != null && nodeName.equals("ellipse")) {
-                String found = "";
-                String ellipseFill = 
curNode.getAttributes().getNamedItem("fill").getNodeValue();
-                Pattern pattern = Pattern.compile("#(.*?)\\)");
-                Matcher matcher = pattern.matcher(ellipseFill);
-                if (matcher.find()) {
-                    found = matcher.group(1);
-                }
-                if (gradientsFound.get(found) != null) {
-                    return true;
-                }
-            }
             boolean inMatch = false;
             if (!isMatched) {
                 inMatch = nodeName != null && gradMatches.contains(nodeName);

Modified: 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSPattern.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSPattern.java?rev=1609508&r1=1609507&r2=1609508&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSPattern.java
 (original)
+++ 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSPattern.java
 Thu Jul 10 17:06:13 2014
@@ -48,6 +48,8 @@ public class PSPattern implements Patter
      */
     protected StringBuffer extGState = null;
 
+    private final List<Double> matrix;
+
     /**
      * Creates a radial or axial shading pattern
      * @param thePatternType The pattern type which will be 3 for radial and 2 
for axial
@@ -57,12 +59,13 @@ public class PSPattern implements Patter
      * @param theExtGState The exit state
      */
     public PSPattern(int thePatternType, Shading theShading, List theXUID,
-                     StringBuffer theExtGState) {
+                     StringBuffer theExtGState, List<Double> matrix) {
         this.patternType = 2;             // thePatternType;
         assert theShading instanceof PSShading;
         this.shading = (PSShading)theShading;
         this.xUID = theXUID;
         this.extGState = theExtGState;    // always null
+        this.matrix = matrix;
     }
 
     /**
@@ -96,7 +99,13 @@ public class PSPattern implements Patter
         }
 
         p.append(">> \n");
-        p.append("matrix makepattern setcolor\n");
+        p.append("[ ");
+        for (double m : matrix) {
+            p.append(Double.toString(m)); // TODO refactor so that 
PSGenerator.formatDouble can be used
+            p.append(" ");
+        }
+        p.append("] ");
+        p.append("makepattern setcolor\n");
 
         return p.toString();
     }

Modified: 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSSVGGraphics2D.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSSVGGraphics2D.java?rev=1609508&r1=1609507&r2=1609508&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSSVGGraphics2D.java
 (original)
+++ 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSSVGGraphics2D.java
 Thu Jul 10 17:06:13 2014
@@ -23,6 +23,7 @@ import java.awt.Color;
 import java.awt.Graphics;
 import java.awt.Paint;
 import java.awt.geom.AffineTransform;
+import java.awt.geom.Point2D;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -117,20 +118,10 @@ public class PSSVGGraphics2D extends PSG
 
 
         List<Double> theCoords = new java.util.ArrayList<Double>();
-
-
-        AffineTransform start = applyTransform(lgp.getTransform(),
-                lgp.getStartPoint().getX(), lgp.getStartPoint().getY());
-        AffineTransform end = applyTransform(lgp.getTransform(), 
lgp.getEndPoint().getX(), lgp.getEndPoint().getY());
-        double startX = start.getTranslateX();
-        double startY = start.getTranslateY();
-        double endX = end.getTranslateX();
-        double endY = end.getTranslateY();
-
-        theCoords.add(startX);
-        theCoords.add(startY);
-        theCoords.add(endX);
-        theCoords.add(endY);
+        theCoords.add(lgp.getStartPoint().getX());
+        theCoords.add(lgp.getStartPoint().getX());
+        theCoords.add(lgp.getEndPoint().getX());
+        theCoords.add(lgp.getEndPoint().getY());
 
 
         List<Color> someColors = new java.util.ArrayList<Color>();
@@ -182,12 +173,6 @@ public class PSSVGGraphics2D extends PSG
                 rgp.getCenterPoint().getX(), rgp.getCenterPoint().getY());
         AffineTransform resultFocus = applyTransform(rgp.getTransform(),
                 rgp.getFocusPoint().getX(), rgp.getFocusPoint().getY());
-        double scale = Math.sqrt(rgp.getTransform().getDeterminant());
-        double radius = rgp.getRadius() * scale;
-        double centreX = resultCentre.getTranslateX();
-        double centreY = resultCentre.getTranslateY();
-        double focusX = resultFocus.getTranslateX();
-        double focusY = resultFocus.getTranslateY();
 
         List<Double> theMatrix = new java.util.ArrayList<Double>();
         double [] mat = new double[6];
@@ -196,15 +181,29 @@ public class PSSVGGraphics2D extends PSG
             theMatrix.add(Double.valueOf(mat[idx]));
         }
 
-        List<Double> theCoords = new java.util.ArrayList<Double>();
         float[] fractions = rgp.getFractions();
 
-        theCoords.add(centreX);
-        theCoords.add(centreY);
-        theCoords.add(0d);
-        theCoords.add(focusX);
-        theCoords.add(focusY);
-        theCoords.add(radius);
+        double ar = rgp.getRadius();
+        Point2D ac = rgp.getCenterPoint();
+        Point2D af = rgp.getFocusPoint();
+        List<Double> theCoords = new java.util.ArrayList<Double>();
+        double dx = af.getX() - ac.getX();
+        double dy = af.getY() - ac.getY();
+        double d = Math.sqrt(dx * dx + dy * dy);
+        if (d > ar) {
+            // the center point af must be within the circle with
+            // radius ar centered at ac so limit it to that.
+            double scale = (ar * .9999) / d;
+            dx = dx * scale;
+            dy = dy * scale;
+        }
+
+        theCoords.add(new Double(ac.getX() + dx)); // Fx
+        theCoords.add(new Double(ac.getY() + dy)); // Fy
+        theCoords.add(new Double(0));
+        theCoords.add(new Double(ac.getX()));
+        theCoords.add(new Double(ac.getY()));
+        theCoords.add(new Double(ar));
 
         Color[] cols = rgp.getColors();
         List<Color> someColors = new java.util.ArrayList<Color>();

Modified: 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/PSGradientFactory.java
URL: 
http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/PSGradientFactory.java?rev=1609508&r1=1609507&r2=1609508&view=diff
==============================================================================
--- 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/PSGradientFactory.java
 (original)
+++ 
xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/PSGradientFactory.java
 Thu Jul 10 17:06:13 2014
@@ -65,6 +65,6 @@ public class PSGradientFactory extends G
     @Override
     public Pattern makePattern(int thePatternType, Shading theShading, List 
theXUID,
             StringBuffer theExtGState, List<Double> theMatrix) {
-        return new PSPattern(thePatternType, theShading, theXUID, 
theExtGState);
+        return new PSPattern(thePatternType, theShading, theXUID, 
theExtGState, theMatrix);
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to