From 58fba2eb411a57bd075d6fa55e14eb2b622f0dc4 Mon Sep 17 00:00:00 2001 From: Simon Steiner Date: Mon, 11 Jan 2016 14:29:39 +0000 Subject: [PATCH] FOP-2553: Support PDF shading to PS git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1724037 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/fop/render/ps/Gradient.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 src/java/org/apache/fop/render/ps/Gradient.java diff --git a/src/java/org/apache/fop/render/ps/Gradient.java b/src/java/org/apache/fop/render/ps/Gradient.java new file mode 100644 index 000000000..558f3b952 --- /dev/null +++ b/src/java/org/apache/fop/render/ps/Gradient.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* $Id$ */ + +package org.apache.fop.render.ps; + +import java.util.List; + +import org.apache.fop.render.gradient.Function; +import org.apache.fop.render.gradient.Function.SubFunctionRenderer; +import org.apache.fop.render.gradient.GradientMaker.DoubleFormatter; +import org.apache.fop.render.gradient.Pattern; +import org.apache.fop.render.gradient.Shading; + +/** + * Helper class to draw gradients in PostScript. + */ +public final class Gradient { + + private Gradient() { } + + public static String outputPattern(Pattern pattern, DoubleFormatter doubleFormatter) { + 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(), doubleFormatter); + p.append(" \n"); + } + p.append(">> \n"); + List matrix = pattern.getMatrix(); + if (matrix == null) { + p.append("matrix "); + } else { + p.append("[ "); + for (double m : pattern.getMatrix()) { + p.append(doubleFormatter.formatDouble(m)); + p.append(" "); + } + p.append("] "); + } + p.append("makepattern setcolor\n"); + + return p.toString(); + } + + private static void outputShading(StringBuilder out, Shading shading, final DoubleFormatter doubleFormatter) { + final Function function = shading.getFunction(); + Shading.FunctionRenderer functionRenderer = new Shading.FunctionRenderer() { + + public void outputFunction(StringBuilder out) { + SubFunctionRenderer subFunctionRenderer = new Function.SubFunctionRenderer() { + + public void outputFunction(StringBuilder out, int functionIndex) { + Function subFunction = function.getFunctions().get(functionIndex); + assert subFunction.getFunctions().isEmpty(); + subFunction.output(out, doubleFormatter, null); + } + }; + function.output(out, doubleFormatter, subFunctionRenderer); + } + }; + shading.output(out, doubleFormatter, functionRenderer); + } + +} -- 2.39.5