You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by vh...@apache.org on 2014/07/14 23:21:35 UTC

svn commit: r1610532 - in /xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop: pdf/ render/pdf/svg/ render/ps/svg/ render/shading/ svg/

Author: vhennebert
Date: Mon Jul 14 21:21:35 2014
New Revision: 1610532

URL: http://svn.apache.org/r1610532
Log:
Moved stuff that is common to PDF and PS to Pattern
Removed PSPattern class and no longer necessary PDF and PS sub-classes of GradientMaker

Removed:
    xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/pdf/svg/
    xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSGradientMaker.java
    xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/ps/svg/PSPattern.java
Modified:
    xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/pdf/PDFPattern.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/GradientMaker.java
    xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/Pattern.java
    xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/svg/PDFGraphics2D.java

Modified: xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/pdf/PDFPattern.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/pdf/PDFPattern.java?rev=1610532&r1=1610531&r2=1610532&view=diff
==============================================================================
--- xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/pdf/PDFPattern.java (original)
+++ xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/pdf/PDFPattern.java Mon Jul 14 21:21:35 2014
@@ -23,8 +23,6 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.util.List;
 
-import org.apache.fop.render.shading.Pattern;
-
 /**
  * class representing a PDF Function.
  *
@@ -35,7 +33,7 @@ import org.apache.fop.render.shading.Pat
  *
  * All PDF Functions have a FunctionType (0,2,3, or 4), a Domain, and a Range.
  */
-public class PDFPattern extends PDFPathPaint implements Pattern {
+public class PDFPattern extends PDFPathPaint {
 
     /**
      * The resources associated with this pattern

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=1610532&r1=1610531&r2=1610532&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 Mon Jul 14 21:21:35 2014
@@ -23,6 +23,8 @@ import java.awt.Graphics;
 import java.awt.Paint;
 import java.awt.geom.AffineTransform;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -33,7 +35,10 @@ import org.apache.batik.ext.awt.RadialGr
 import org.apache.xmlgraphics.java2d.ps.PSGraphics2D;
 import org.apache.xmlgraphics.ps.PSGenerator;
 
+import org.apache.fop.render.shading.Function;
+import org.apache.fop.render.shading.GradientMaker;
 import org.apache.fop.render.shading.Pattern;
+import org.apache.fop.render.shading.Shading;
 
 
 public class PSSVGGraphics2D extends PSGraphics2D {
@@ -70,24 +75,76 @@ public class PSSVGGraphics2D extends PSG
     protected void applyPaint(Paint paint, boolean fill) {
         super.applyPaint(paint, fill);
         if (paint instanceof LinearGradientPaint) {
-            Pattern pattern = new PSGradientMaker()
-                    .makeLinearGradient((LinearGradientPaint) paint, getBaseTransform(), getTransform());
+            Pattern pattern = GradientMaker.makeLinearGradient((LinearGradientPaint) paint,
+                    getBaseTransform(), getTransform());
             try {
-                gen.write(pattern.toString());
+                gen.write(toString(pattern));
             } catch (IOException ioe) {
                 handleIOException(ioe);
             }
         } else if (paint instanceof RadialGradientPaint) {
-            Pattern pattern = new PSGradientMaker()
-                    .makeRadialGradient((RadialGradientPaint) paint, getBaseTransform(), getTransform());
+            Pattern pattern = GradientMaker.makeRadialGradient((RadialGradientPaint) paint,
+                    getBaseTransform(), getTransform());
             try {
-                gen.write(pattern.toString());
+                gen.write(toString(pattern));
             } catch (IOException ioe) {
                 handleIOException(ioe);
             }
         }
     }
 
+    /**
+     * Outputs the radial or axial pattern as a string dictionary to insert
+     * into a postscript document.
+     * @param pattern
+     */
+    private String toString(Pattern pattern) {
+        StringBuilder p = new StringBuilder(64);
+        p.append("/Pattern setcolorspace\n");
+        p.append("<< \n/Type /Pattern \n");
+
+        p.append("/PatternType " + pattern.getPatternType() + " \n");
+
+        if (pattern.getShading() != null) {
+            p.append("/Shading ");
+            outputShading(p, pattern.getShading());
+            p.append(" \n");
+        }
+        p.append(">> \n");
+        p.append("[ ");
+        for (double m : pattern.getMatrix()) {
+            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();
+    }
+
+    private void outputShading(StringBuilder p, Shading shading) {
+        final Function function = shading.getFunction();
+        Shading.FunctionRenderer functionRenderer = new Shading.FunctionRenderer() {
+
+            public void outputFunction(StringBuilder out) {
+                List<String> functionsStrings = new ArrayList<String>(function.getFunctions().size());
+                for (Function f : function.getFunctions()) {
+                    functionsStrings.add(functionToString(f));
+                }
+                out.append(function.toWriteableString(functionsStrings));
+            }
+        };
+        shading.output(p, functionRenderer);
+    }
+
+    private String functionToString(Function function) {
+        List<String> functionsStrings = new ArrayList<String>(function.getFunctions().size());
+        for (Function f : function.getFunctions()) {
+            functionsStrings.add(functionToString(f));
+        }
+        return function.toWriteableString(functionsStrings);
+    }
+
     protected AffineTransform getBaseTransform() {
         AffineTransform at = new AffineTransform(this.getTransform());
         return at;

Modified: xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/GradientMaker.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/GradientMaker.java?rev=1610532&r1=1610531&r2=1610532&view=diff
==============================================================================
--- xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/GradientMaker.java (original)
+++ xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/GradientMaker.java Mon Jul 14 21:21:35 2014
@@ -33,9 +33,11 @@ import org.apache.xmlgraphics.java2d.col
 
 import org.apache.fop.pdf.PDFDeviceColorSpace;
 
-public abstract class GradientMaker<P extends Pattern> {
+public final class GradientMaker {
 
-    public P makeLinearGradient(LinearGradientPaint gp,
+    private GradientMaker() { }
+
+    public static Pattern makeLinearGradient(LinearGradientPaint gp,
             AffineTransform baseTransform, AffineTransform transform) {
         Point2D startPoint = gp.getStartPoint();
         Point2D endPoint = gp.getEndPoint();
@@ -47,7 +49,7 @@ public abstract class GradientMaker<P ex
         return makeGradient(gp, coords, baseTransform, transform);
     }
 
-    public P makeRadialGradient(RadialGradientPaint gradient,
+    public static Pattern makeRadialGradient(RadialGradientPaint gradient,
             AffineTransform baseTransform, AffineTransform transform) {
         double radius = gradient.getRadius();
         Point2D center = gradient.getCenterPoint();
@@ -72,7 +74,7 @@ public abstract class GradientMaker<P ex
         return makeGradient(gradient, coords, baseTransform, transform);
     }
 
-    private P makeGradient(MultipleGradientPaint gradient, List<Double> coords,
+    private static Pattern makeGradient(MultipleGradientPaint gradient, List<Double> coords,
             AffineTransform baseTransform, AffineTransform transform) {
         List<Double> matrix = makeTransform(gradient, baseTransform, transform);
         List<Double> bounds = makeBounds(gradient);
@@ -82,10 +84,10 @@ public abstract class GradientMaker<P ex
         Function function = new Function(3, null, null, functions, bounds, null);
         int shadingType = gradient instanceof LinearGradientPaint ? 2 : 3;
         Shading shading = new Shading(shadingType, colorSpace, coords, function);
-        return makePattern(2, shading, matrix);
+        return new Pattern(2, shading, matrix);
     }
 
-    private List<Double> makeTransform(MultipleGradientPaint gradient,
+    private static List<Double> makeTransform(MultipleGradientPaint gradient,
             AffineTransform baseTransform, AffineTransform transform) {
         AffineTransform gradientTransform = new AffineTransform(baseTransform);
         gradientTransform.concatenate(transform);
@@ -99,13 +101,13 @@ public abstract class GradientMaker<P ex
         return matrix;
     }
 
-    private Color getsRGBColor(Color c) {
+    private static Color getsRGBColor(Color c) {
         // Color space must be consistent, so convert to sRGB if necessary
         // TODO really?
         return c.getColorSpace().isCS_sRGB() ? c : ColorUtil.toSRGBColor(c);
     }
 
-    private List<Double> makeBounds(MultipleGradientPaint gradient) {
+    private static List<Double> makeBounds(MultipleGradientPaint gradient) {
         // TODO is the conversion to double necessary?
         float[] fractions = gradient.getFractions();
         List<Double> bounds = new java.util.ArrayList<Double>(fractions.length);
@@ -117,7 +119,7 @@ public abstract class GradientMaker<P ex
         return bounds;
     }
 
-    private List<Function> makeFunctions(MultipleGradientPaint gradient) {
+    private static List<Function> makeFunctions(MultipleGradientPaint gradient) {
         List<Color> colors = makeColors(gradient);
         List<Function> functions = new ArrayList<Function>();
         for (int currentPosition = 0, lastPosition = colors.size() - 1;
@@ -133,7 +135,7 @@ public abstract class GradientMaker<P ex
         return functions;
     }
 
-    private List<Color> makeColors(MultipleGradientPaint gradient) {
+    private static List<Color> makeColors(MultipleGradientPaint gradient) {
         Color[] svgColors = gradient.getColors();
         List<Color> gradientColors = new ArrayList<Color>(svgColors.length + 2);
         float[] fractions = gradient.getFractions();
@@ -149,6 +151,4 @@ public abstract class GradientMaker<P ex
         return gradientColors;
     }
 
-    protected abstract P makePattern(int patternType, Shading shading, List<Double> matrix);
-
 }

Modified: xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/Pattern.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/Pattern.java?rev=1610532&r1=1610531&r2=1610532&view=diff
==============================================================================
--- xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/Pattern.java (original)
+++ xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/render/shading/Pattern.java Mon Jul 14 21:21:35 2014
@@ -17,6 +17,35 @@
 
 package org.apache.fop.render.shading;
 
-public interface Pattern {
+import java.util.List;
+
+public class Pattern {
+
+    private final int patternType;
+
+    private final Shading shading;
+
+    private final List<Double> matrix;
+
+    Pattern(int patternType, Shading shading, List<Double> matrix) {
+        this.patternType = patternType;
+        this.shading = shading;
+        this.matrix = matrix;
+    }
+
+    /**
+     * Either one (1) for tiling, or two (2) for shading.
+     */
+    public int getPatternType() {
+        return patternType;
+    }
+
+    public Shading getShading() {
+        return shading;
+    }
+
+    public List<Double> getMatrix() {
+        return matrix;
+    }
 
 }

Modified: xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/svg/PDFGraphics2D.java
URL: http://svn.apache.org/viewvc/xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/svg/PDFGraphics2D.java?rev=1610532&r1=1610531&r2=1610532&view=diff
==============================================================================
--- xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/svg/PDFGraphics2D.java (original)
+++ xmlgraphics/fop/branches/FOP-2393_gradient-rendering/src/java/org/apache/fop/svg/PDFGraphics2D.java Mon Jul 14 21:21:35 2014
@@ -49,6 +49,7 @@ import java.awt.image.renderable.Rendera
 import java.io.IOException;
 import java.io.OutputStream;
 import java.io.StringWriter;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
@@ -95,7 +96,10 @@ import org.apache.fop.pdf.PDFXObject;
 import org.apache.fop.render.pdf.ImageRawCCITTFaxAdapter;
 import org.apache.fop.render.pdf.ImageRawJPEGAdapter;
 import org.apache.fop.render.pdf.ImageRenderedAdapter;
-import org.apache.fop.render.pdf.svg.PDFGradientMaker;
+import org.apache.fop.render.shading.Function;
+import org.apache.fop.render.shading.GradientMaker;
+import org.apache.fop.render.shading.Pattern;
+import org.apache.fop.render.shading.Shading;
 
 /**
  * <p>PDF Graphics 2D.
@@ -813,15 +817,17 @@ public class PDFGraphics2D extends Abstr
                     gpaint.isCyclic() ? LinearGradientPaint.REPEAT : LinearGradientPaint.NO_CYCLE);
         }
         if (paint instanceof LinearGradientPaint && gradientSupported((LinearGradientPaint) paint)) {
-            PDFPattern pattern = new PDFGradientMaker(this)
-                    .makeLinearGradient((LinearGradientPaint) paint, getBaseTransform(), getTransform());
-            currentStream.write(pattern.getColorSpaceOut(fill));
+            Pattern pattern = GradientMaker.makeLinearGradient((LinearGradientPaint) paint,
+                    getBaseTransform(), getTransform());
+            PDFPattern pdfPattern = createPDFPattern(pattern);
+            currentStream.write(pdfPattern.getColorSpaceOut(fill));
             return true;
         }
         if (paint instanceof RadialGradientPaint && gradientSupported((RadialGradientPaint) paint)) {
-            PDFPattern pattern = new PDFGradientMaker(this)
-                    .makeRadialGradient((RadialGradientPaint) paint, getBaseTransform(), getTransform());
-            currentStream.write(pattern.getColorSpaceOut(fill));
+            Pattern pattern = GradientMaker.makeRadialGradient((RadialGradientPaint) paint,
+                    getBaseTransform(), getTransform());
+            PDFPattern pdfPattern = createPDFPattern(pattern);
+            currentStream.write(pdfPattern.getColorSpaceOut(fill));
             return true;
         }
         if (paint instanceof PatternPaint) {
@@ -831,6 +837,21 @@ public class PDFGraphics2D extends Abstr
         return false; // unknown paint
     }
 
+    PDFPattern createPDFPattern(Pattern pattern) {
+        Shading shading = pattern.getShading();
+        Function function = shading.getFunction();
+        List<PDFFunction> pdfFunctions = new ArrayList<PDFFunction>(function.getFunctions().size());
+        for (Function f : function.getFunctions()) {
+            pdfFunctions.add(registerFunction(new PDFFunction(f)));
+        }
+        PDFFunction pdfFunction = registerFunction(new PDFFunction(function, pdfFunctions));
+        PDFShading pdfShading = new PDFShading(shading.getShadingType(), shading.getColorSpace(), shading.getCoords(),
+                pdfFunction);
+        pdfShading = registerShading(pdfShading);
+        PDFPattern pdfPattern = new PDFPattern(pattern.getPatternType(), pdfShading, null, null, pattern.getMatrix());
+        return registerPattern(pdfPattern);
+    }
+
     private boolean gradientSupported(MultipleGradientPaint gradient) {
         return !(gradientContainsTransparency(gradient) || gradientIsRepeated(gradient));
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: fop-commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: fop-commits-help@xmlgraphics.apache.org