/*
* 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.
*/
package org.apache.pdfbox.pdmodel.graphics;
import java.awt.*;
import java.awt.geom.GeneralPath;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.color.PDColorState;
import org.apache.pdfbox.pdmodel.text.PDTextState;
import org.apache.pdfbox.util.Matrix;
/**
* This class will hold the current state of the graphics parameters when executing a
* content stream.
*
* @author <a href="ben@benlitchfield.com">Ben Litchfield</a>
* @version $Revision: 1.5 $
*/
public class PDGraphicsState implements Cloneable
{
private Matrix currentTransformationMatrix = new Matrix();
//Here are some attributes of the Graphics state, but have not been created yet.
//
//clippingPath
private PDColorState strokingColor = new PDColorState();
private PDColorState nonStrokingColor = new PDColorState();
private PDTextState textState = new PDTextState();
private double lineWidth = 0;
private int lineCap = 0;
private int lineJoin = 0;
private double miterLimit = 0;
private PDLineDashPattern lineDashPattern;
private String renderingIntent;
private boolean strokeAdjustment = false;
//blend mode
//soft mask
private double alphaConstants = 1.0;
private double nonStrokingAlphaConstants = 1.0;
private boolean alphaSource = false;
//DEVICE DEPENDENT parameters
private boolean overprint = false;
private double overprintMode = 0;
//black generation
//undercolor removal
//transfer
//halftone
private double flatness = 1.0;
private double smoothness = 0;
private GeneralPath currentClippingPath;
/**
* Default constructor.
*/
public PDGraphicsState()
{
}
/**
* Constructor with a given pagesize to initialize the clipping path.
* @param page the size of the page
*/
public PDGraphicsState(PDRectangle page)
{
currentClippingPath = new GeneralPath(new Rectangle(page.createDimension()));
if (page.getLowerLeftX() != 0 || page.getLowerLeftY() != 0)
{
//Compensate for offset
this.currentTransformationMatrix = this.currentTransformationMatrix.multiply(
Matrix.getTranslatingInstance(-page.getLowerLeftX(), -page.getLowerLeftY()));
}
}
/**
* Get the value of the CTM.
*
* @return The current transformation matrix.
*/
public Matrix getCurrentTransformationMatrix()
{
return currentTransformationMatrix;
}
/**
* Set the value of the CTM.
*
* @param value The current transformation matrix.
*/
public void setCurrentTransformationMatrix(Matrix value)
{
currentTransformationMatrix = value;
}
/**
* Get the value of the line width.
*
* @return The current line width.
*/
public double getLineWidth()
{
return lineWidth;
}
/**
* set the value of the line width.
*
* @param value The current line width.
*/
public void setLineWidth(double value)
{
lineWidth = value;
}
/**
* Get the value of the line cap.
*
* @return The current line cap.
*/
public int getLineCap()
{
return lineCap;
}
/**
* set the value of the line cap.
*
* @param value The current line cap.
*/
public void setLineCap(int value)
{
lineCap = value;
}
/**
* Get the value of the line join.
*
* @return The current line join value.
*/
public int getLineJoin()
{
return lineJoin;
}
/**
* Get the value of the line join.
*
* @param value The current line join
*/
public void setLineJoin(int value)
{
lineJoin = value;
}
/**
* Get the value of the miter limit.
*
* @return The current miter limit.
*/
public double getMiterLimit()
{
return miterLimit;
}
/**
* set the value of the miter limit.
*
* @param value The current miter limit.
*/
public void setMiterLimit(double value)
{
miterLimit = value;
}
/**
* Get the value of the stroke adjustment parameter.
*
* @return The current stroke adjustment.
*/
public boolean isStrokeAdjustment()
{
return strokeAdjustment;
}
/**
* set the value of the stroke adjustment.
*
* @param value The value of the stroke adjustment parameter.
*/
public void setStrokeAdjustment(boolean value)
{
strokeAdjustment = value;
}
/**
* Get the value of the stroke alpha constants property.
*
* @return The value of the stroke alpha constants parameter.
*/
public double getAlphaConstants()
{
return alphaConstants;
}
/**
* set the value of the stroke alpha constants property.
*
* @param value The value of the stroke alpha constants parameter.
*/
public void setAlphaConstants(double value)
{
alphaConstants = value;
}
/**
* Get the value of the non-stroke alpha constants property.
*
* @return The value of the non-stroke alpha constants parameter.
*/
public double getNonStrokeAlphaConstants()
{
return nonStrokingAlphaConstants;
}
/**
* set the value of the non-stroke alpha constants property.
*
* @param value The value of the non-stroke alpha constants parameter.
*/
public void setNonStrokeAlphaConstants(double value)
{
nonStrokingAlphaConstants = value;
}
/**
* get the value of the stroke alpha source property.
*
* @return The value of the stroke alpha source parameter.
*/
public boolean isAlphaSource()
{
return alphaSource;
}
/**
* set the value of the alpha source property.
*
* @param value The value of the alpha source parameter.
*/
public void setAlphaSource(boolean value)
{
alphaSource = value;
}
/**
* get the value of the overprint property.
*
* @return The value of the overprint parameter.
*/
public boolean isOverprint()
{
return overprint;
}
/**
* set the value of the overprint property.
*
* @param value The value of the overprint parameter.
*/
public void setOverprint(boolean value)
{
overprint = value;
}
/**
* get the value of the overprint mode property.
*
* @return The value of the overprint mode parameter.
*/
public double getOverprintMode()
{
return overprintMode;
}
/**
* set the value of the overprint mode property.
*
* @param value The value of the overprint mode parameter.
*/
public void setOverprintMode(double value)
{
overprintMode = value;
}
/**
* get the value of the flatness property.
*
* @return The value of the flatness parameter.
*/
public double getFlatness()
{
return flatness;
}
/**
* set the value of the flatness property.
*
* @param value The value of the flatness parameter.
*/
public void setFlatness(double value)
{
flatness = value;
}
/**
* get the value of the smoothness property.
*
* @return The value of the smoothness parameter.
*/
public double getSmoothness()
{
return smoothness;
}
/**
* set the value of the smoothness property.
*
* @param value The value of the smoothness parameter.
*/
public void setSmoothness(double value)
{
smoothness = value;
}
/**
* This will get the graphics text state.
*
* @return The graphics text state.
*/
public PDTextState getTextState()
{
return textState;
}
/**
* This will set the graphics text state.
*
* @param value The graphics text state.
*/
public void setTextState(PDTextState value)
{
textState = value;
}
/**
* This will get the current line dash pattern.
*
* @return The line dash pattern.
*/
public PDLineDashPattern getLineDashPattern()
{
return lineDashPattern;
}
/**
* This will set the current line dash pattern.
*
* @param value The new line dash pattern.
*/
public void setLineDashPattern(PDLineDashPattern value)
{
lineDashPattern = value;
}
/**
* This will get the rendering intent.
*
* @see PDExtendedGraphicsState
*
* @return The rendering intent
*/
public String getRenderingIntent()
{
return renderingIntent;
}
/**
* This will set the rendering intent.
*
* @param value The new rendering intent.
*/
public void setRenderingIntent(String value)
{
renderingIntent = value;
}
/**
* {@inheritDoc}
*/
public Object clone()
{
PDGraphicsState clone = null;
try
{
clone = (PDGraphicsState)super.clone();
clone.setTextState( (PDTextState)textState.clone() );
clone.setCurrentTransformationMatrix( currentTransformationMatrix.copy() );
clone.strokingColor = (PDColorState)strokingColor.clone();
clone.nonStrokingColor = ((PDColorState)nonStrokingColor.clone());
if( lineDashPattern != null )
{
clone.setLineDashPattern( (PDLineDashPattern)lineDashPattern.clone() );
}
if (currentClippingPath != null)
{
clone.setCurrentClippingPath((GeneralPath)currentClippingPath.clone());
}
}
catch( CloneNotSupportedException e )
{
e.printStackTrace();
}
return clone;
}
/**
* Returns the stroking color state.
*
* @return stroking color state
*/
public PDColorState getStrokingColor()
{
return strokingColor;
}
/**
* Returns the non-stroking color state.
*
* @return non-stroking color state
*/
public PDColorState getNonStrokingColor()
{
return nonStrokingColor;
}
/**
* This will set the current clipping path.
*
* @param pCurrentClippingPath The current clipping path.
*
*/
public void setCurrentClippingPath(Shape pCurrentClippingPath)
{
if (pCurrentClippingPath != null)
{
if (pCurrentClippingPath instanceof GeneralPath)
{
currentClippingPath = (GeneralPath)pCurrentClippingPath;
}
else
{
currentClippingPath = new GeneralPath();
currentClippingPath.append(pCurrentClippingPath,false);
}
}
else
{
currentClippingPath = null;
}
}
/**
* This will get the current clipping path.
*
* @return The current clipping path.
*/
public Shape getCurrentClippingPath()
{
return currentClippingPath;
}
public Composite getStrokeJavaComposite() {
return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) alphaConstants);
}
public Composite getNonStrokeJavaComposite() {
return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, (float) nonStrokingAlphaConstants);
}
}