/* * 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.pdf; import java.util.List; import org.apache.fop.render.gradient.GradientMaker; import org.apache.fop.render.gradient.GradientMaker.DoubleFormatter; import org.apache.fop.render.gradient.Shading; /** * class representing a PDF Smooth Shading object. * * PDF Functions represent parameterized mathematical formulas and sampled representations with * arbitrary resolution. Functions are used in two areas: device-dependent * rasterization information for halftoning and transfer * functions, and color specification for smooth shading (a PDF 1.3 feature). * * All PDF Functions have a shadingType (0,2,3, or 4), a Domain, and a Range. */ public class PDFShading extends PDFObject { // Guts common to all function types /** * The name of the Shading e.g. "Shading1" */ protected String shadingName; private final Shading shading; private final PDFFunction pdfFunction; /** * Constructor for Type 2 and 3 * * @param shadingType 2 or 3 for axial or radial shading * @param colorSpace "DeviceRGB" or similar. * @param coords List of four (type 2) or 6 (type 3) Double * @param pdfFunction the Stitching (PDFfunction type 3) function, * even if it's stitching a single function */ public PDFShading(int shadingType, PDFDeviceColorSpace colorSpace, List coords, PDFFunction pdfFunction) { shading = new Shading(shadingType, colorSpace, coords, pdfFunction.getFunction()); this.pdfFunction = pdfFunction; } /** * Get the name of this shading. * * @return the name of the shading */ public String getName() { return (this.shadingName); } /** * Sets the name of the shading * @param name the name of the shading pattern. Can be anything * without spaces. "Shading1" or "Sh1" are good examples. */ public void setName(String name) { if (name.indexOf(" ") >= 0) { throw new IllegalArgumentException( "Shading name must not contain any spaces"); } this.shadingName = name; } /** * represent as PDF. Whatever the shadingType is, the correct * representation spits out. The sets of required and optional * attributes are different for each type, but if a required * attribute's object was constructed as null, then no error * is raised. Instead, the malformed PDF that was requested * by the construction is dutifully output. * This policy should be reviewed. * * @return the PDF string. */ public String toPDFString() { Shading.FunctionRenderer functionRenderer = new Shading.FunctionRenderer() { public void outputFunction(StringBuilder out) { out.append(pdfFunction.referencePDF()); } }; StringBuilder out = new StringBuilder(); GradientMaker.DoubleFormatter doubleFormatter = new DoubleFormatter() { public String formatDouble(double d) { return PDFNumber.doubleOut(d); } }; shading.output(out, doubleFormatter, functionRenderer); return out.toString(); } /** {@inheritDoc} */ protected boolean contentEquals(PDFObject obj) { if (obj == null) { return false; } if (obj == this) { return true; } if (!(obj instanceof PDFShading)) { return false; } Shading other = ((PDFShading) obj).shading; if (shading.getShadingType() != other.getShadingType()) { return false; } if (shading.isAntiAlias() != other.isAntiAlias()) { return false; } if (shading.getBitsPerCoordinate() != other.getBitsPerCoordinate()) { return false; } if (shading.getBitsPerFlag() != other.getBitsPerFlag()) { return false; } if (shading.getBitsPerComponent() != other.getBitsPerComponent()) { return false; } if (shading.getVerticesPerRow() != other.getVerticesPerRow()) { return false; } if (shading.getColorSpace() != null) { if (!shading.getColorSpace().equals(other.getColorSpace())) { return false; } } else if (other.getColorSpace() != null) { return false; } if (shading.getCoords() != null) { if (!shading.getCoords().equals(other.getCoords())) { return false; } } else if (other.getCoords() != null) { return false; } if (shading.getExtend() != null) { if (!shading.getExtend().equals(other.getExtend())) { return false; } } else if (other.getExtend() != null) { return false; } if (shading.getFunction() != null) { if (!shading.getFunction().equals(other.getFunction())) { return false; } } else if (other.getFunction() != null) { return false; } return true; } }