/*
 * 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: PSState.java 1804124 2017-08-04 14:13:54Z ssteiner $ */

package org.apache.xmlgraphics.ps;

import java.awt.Color;
import java.awt.geom.AffineTransform;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;

import org.apache.xmlgraphics.java2d.color.ColorUtil;

This class holds the current state of the PostScript interpreter.
Version:$Id: PSState.java 1804124 2017-08-04 14:13:54Z ssteiner $
/** * This class holds the current state of the PostScript interpreter. * * @version $Id: PSState.java 1804124 2017-08-04 14:13:54Z ssteiner $ */
public class PSState implements Serializable {
Default for setdash
/** Default for setdash */
public static final String DEFAULT_DASH = "[] 0";
Default color in PostScript
/** Default color in PostScript */
public static final Color DEFAULT_RGB_COLOR = Color.black; private static final long serialVersionUID = -3862731539801753248L; private AffineTransform transform = new AffineTransform(); private List transformConcatList = new java.util.ArrayList(); private int linecap; private int linejoin; private float miterLimit; private double linewidth = 1.0f; private String dashpattern = DEFAULT_DASH; private Color color = DEFAULT_RGB_COLOR; //Font state private String fontname; private float fontsize;
Default constructor
/** * Default constructor */
public PSState() { //nop }
Copy constructor
Params:
  • org – the original to copy from
  • copyTransforms – true if the list of matrix concats should be cloned, too
/** * Copy constructor * @param org the original to copy from * @param copyTransforms true if the list of matrix concats should be cloned, too */
public PSState(PSState org, boolean copyTransforms) { this.transform = (AffineTransform)org.transform.clone(); if (copyTransforms) { this.transformConcatList.addAll(org.transformConcatList); } this.linecap = org.linecap; this.linejoin = org.linejoin; this.miterLimit = org.miterLimit; this.linewidth = org.linewidth; this.dashpattern = org.dashpattern; this.color = org.color; this.fontname = org.fontname; this.fontsize = org.fontsize; }
Returns the transform.
Returns:the current transformation matrix
/** * Returns the transform. * @return the current transformation matrix */
public AffineTransform getTransform() { return this.transform; }
Check the current transform. The transform for the current state is the combination of all transforms in the current state. The parameter is compared against this current transform.
Params:
  • tf – the transform the check against
Returns:true if the new transform is different then the current transform
/** * Check the current transform. * The transform for the current state is the combination of all * transforms in the current state. The parameter is compared * against this current transform. * * @param tf the transform the check against * @return true if the new transform is different then the current transform */
public boolean checkTransform(AffineTransform tf) { return !tf.equals(this.transform); }
Concats the given transformation matrix with the current one.
Params:
  • transform – The new transformation matrix
/** * Concats the given transformation matrix with the current one. * @param transform The new transformation matrix */
public void concatMatrix(AffineTransform transform) { this.transformConcatList.add(transform); this.transform.concatenate(transform); }
Establishes the specified line cap.
Params:
  • value – line cap (0, 1 or 2) as defined by the setlinecap command
Returns:true if the line cap changed compared to the previous setting
/** * Establishes the specified line cap. * @param value line cap (0, 1 or 2) as defined by the setlinecap command * @return true if the line cap changed compared to the previous setting */
public boolean useLineCap(int value) { if (linecap != value) { linecap = value; return true; } else { return false; } }
Establishes the specified line join.
Params:
  • value – line join (0, 1 or 2) as defined by the setlinejoin command
Returns:true if the line join changed compared to the previous setting
/** * Establishes the specified line join. * @param value line join (0, 1 or 2) as defined by the setlinejoin command * @return true if the line join changed compared to the previous setting */
public boolean useLineJoin(int value) { if (linejoin != value) { linejoin = value; return true; } else { return false; } }
Establishes the specified miter limit.
Params:
  • value – the miter limit as defined by the setmiterlimit command
Returns:true if the miter limit changed compared to the previous setting
/** * Establishes the specified miter limit. * @param value the miter limit as defined by the setmiterlimit command * @return true if the miter limit changed compared to the previous setting */
public boolean useMiterLimit(float value) { if (miterLimit != value) { miterLimit = value; return true; } else { return false; } }
Establishes the specified line width.
Params:
  • value – line width as defined by the setlinewidth command
Returns:true if the line width changed compared to the previous setting
/** * Establishes the specified line width. * @param value line width as defined by the setlinewidth command * @return true if the line width changed compared to the previous setting */
public boolean useLineWidth(double value) { if (linewidth != value) { linewidth = value; return true; } else { return false; } }
Establishes the specified dash.
Params:
  • pattern – dash pattern as defined by the setdash command
Returns:true if the dash pattern changed compared to the previous setting
/** * Establishes the specified dash. * @param pattern dash pattern as defined by the setdash command * @return true if the dash pattern changed compared to the previous setting */
public boolean useDash(String pattern) { if (!dashpattern.equals(pattern)) { dashpattern = pattern; return true; } else { return false; } }
Establishes the specified color (RGB).
Params:
  • value – color as defined by the setrgbcolor command
Returns:true if the color changed compared to the previous setting
/** * Establishes the specified color (RGB). * @param value color as defined by the setrgbcolor command * @return true if the color changed compared to the previous setting */
public boolean useColor(Color value) { if (!ColorUtil.isSameColor(color, value)) { color = value; return true; } else { return false; } }
Establishes the specified font and size.
Params:
  • name – name of the font for the "F" command (see FOP Std Proc Set)
  • size – size of the font
Returns:true if the font changed compared to the previous setting
/** * Establishes the specified font and size. * @param name name of the font for the "F" command (see FOP Std Proc Set) * @param size size of the font * @return true if the font changed compared to the previous setting */
public boolean useFont(String name, float size) { if (name == null) { throw new NullPointerException("font name must not be null"); } if (fontname == null || !fontname.equals(name) || fontsize != size) { fontname = name; fontsize = size; return true; } else { return false; } }
Reestablishes the graphics state represented by this instance by issueing the necessary commands.
Params:
  • gen – The generator to use for output
Throws:
/** * Reestablishes the graphics state represented by this instance by issueing the * necessary commands. * @param gen The generator to use for output * @exception IOException In case of an I/O problem */
public void reestablish(PSGenerator gen) throws IOException { for (Object aTransformConcatList : transformConcatList) { gen.concatMatrix((AffineTransform) aTransformConcatList); } gen.useLineCap(linecap); gen.useLineWidth(linewidth); gen.useDash(dashpattern); gen.useColor(color); if (fontname != null) { gen.useFont(fontname, fontsize); } } }