/* * Copyright 2006-2017 ICEsoft Technologies Canada Corp. * * Licensed 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. */ package org.icepdf.core.pobjects.graphics; import org.icepdf.core.pobjects.functions.Function; import org.icepdf.core.pobjects.graphics.batik.ext.awt.LinearGradientPaint; import org.icepdf.core.pobjects.graphics.batik.ext.awt.MultipleGradientPaint; import org.icepdf.core.util.Library; import java.awt.*; import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.logging.Logger; /** * In Type 1 (function-based) shadings, the colour at every point in the domain * is defined by a specified mathematical function. The function need not be * smooth or continuous. This type is the most general of the available shading * types and is useful for shadings that cannot be adequately described with any * of the other types. Table 79 shows the shading dictionary entries specific * to this type of shading, in addition to those common to all shading * dictionaries * * @author ICEsoft Technologies Inc. * @since 5.0 */ public class ShadingType1Pattern extends ShadingType2Pattern { private static final Logger logger = Logger.getLogger(ShadingType1Pattern.class.toString()); /** * (Optional) An array of four numbers [xmin xmax ymin ymax] specifying the * rectangular domain of coordinates over which the colour function(s) are * defined. Default value: [0.0 1.0 0.0 1.0]. */ // protected java.util.List<Number> domain; /** * (Required) A 2-in, n-out function or an array of n 2-in, 1-out functions * (where n is the number of colour components in the shading dictionary’s * colour space). Each function’s domain shall be a superset of that of the * shading dictionary. If the value returned by the function for a given * colour component is out of range, it shall be adjusted to the nearest * valid value. */ // protected Function[] function; // linear gradient paint describing the gradient. private LinearGradientPaint linearGradientPaint; public ShadingType1Pattern(Library library, HashMap entries) { super(library, entries); } @SuppressWarnings("unchecked") public synchronized void init(GraphicsState graphicsState) { if (inited) { return; } // shading dictionary if (shadingDictionary == null) { shadingDictionary = library.getDictionary(entries, SHADING_KEY); } colorSpace = PColorSpace.getColorSpace(library, library.getObject(shadingDictionary, COLORSPACE_KEY)); // get type 2 specific data. Object tmp = library.getObject(shadingDictionary, DOMAIN_KEY); if (tmp instanceof java.util.List) { domain = (List<Number>) tmp; } else { domain = new ArrayList<Number>(2); domain.add(0.0f); domain.add(1.0f); domain.add(0.0f); domain.add(1.0f); } // functions tmp = library.getObject(shadingDictionary, FUNCTION_KEY); if (tmp != null) { if (!(tmp instanceof java.util.List)) { function = new Function[]{Function.getFunction(library, tmp)}; } else { java.util.List functionTemp = (java.util.List) tmp; function = new Function[functionTemp.size()]; for (int i = 0; i < functionTemp.size(); i++) { function[i] = Function.getFunction(library, functionTemp.get(i)); } } } // first off, create the two needed start and end points of the line Point2D.Float startPoint = new Point2D.Float( domain.get(0).floatValue(), domain.get(2).floatValue()); Point2D.Float endPoint = new Point2D.Float( domain.get(0).floatValue(), domain.get(3).floatValue()); // calculate the t's float t0 = domain.get(0).floatValue(); float t1 = domain.get(3).floatValue(); // calculate colour based on points that make up the line, 10 is a good // number for speed and gradient quality. try { int numberOfPoints = 10; Color[] colors = calculateColorPoints(numberOfPoints, startPoint, endPoint, t0, t1); float[] dist = calculateDomainEntries(numberOfPoints, t0, t1); linearGradientPaint = new LinearGradientPaint( startPoint, endPoint, dist, colors, MultipleGradientPaint.NO_CYCLE, MultipleGradientPaint.LINEAR_RGB, matrix); inited = true; } catch (Exception e) { logger.finer("Failed ot initialize gradient paint type 1."); } } /** * Not implemented * * @return will always return null; */ public Paint getPaint() { return null; } public String toSting() { return super.toString() + "\n domain: " + domain + "\n matrix: " + matrix + "\n function: " + function; } }