123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /*
- * 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;
- }
-
- }
|