All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.itextpdf.kernel.pdf.canvas.CanvasGraphicsState Maven / Gradle / Ivy

There is a newer version: 9.0.0
Show newest version
/*
    This file is part of the iText (R) project.
    Copyright (c) 1998-2024 Apryse Group NV
    Authors: Apryse Software.

    This program is offered under a commercial and under the AGPL license.
    For commercial licensing, contact us at https://itextpdf.com/sales.  For AGPL licensing, see below.

    AGPL licensing:
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see .
 */
package com.itextpdf.kernel.pdf.canvas;

import com.itextpdf.kernel.colors.Color;
import com.itextpdf.kernel.colors.DeviceGray;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.geom.Matrix;
import com.itextpdf.kernel.pdf.PdfArray;
import com.itextpdf.kernel.pdf.PdfDictionary;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfName;
import com.itextpdf.kernel.pdf.PdfNumber;
import com.itextpdf.kernel.pdf.PdfObject;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;

import java.util.Arrays;

/**
 * This class is designed for internal usage. 
* Use PdfExtGState class and PdfCanvas#setExtGState() method for setting extended graphics properties. */ public class CanvasGraphicsState { /** * The current transformation matrix, which maps positions from user coordinates to device coordinates. *

* We use an identity matrix as a default value, but in spec a default value is: * "a matrix that transforms default user coordinates to device coordinates". */ private Matrix ctm = new Matrix(); // color private Color strokeColor = DeviceGray.BLACK; private Color fillColor = DeviceGray.BLACK; // text state private float charSpacing = 0f; private float wordSpacing = 0f; // horizontal scaling private float scale = 100f; private float leading = 0f; private PdfFont font; private float fontSize; private int textRenderingMode = PdfCanvasConstants.TextRenderingMode.FILL; private float textRise = 0f; private boolean textKnockout = true; private float lineWidth = 1f; private int lineCapStyle = PdfCanvasConstants.LineCapStyle.BUTT; private int lineJoinStyle = PdfCanvasConstants.LineJoinStyle.MITER; private float miterLimit = 10f; /** * A description of the dash pattern to be used when paths are stroked. Default value is solid line. *

* The line dash pattern is expressed as an array of the form [ dashArray dashPhase ], * where dashArray is itself an array and dashPhase is an integer. *

* An empty dash array (first element in the array) and zero phase (second element in the array) * can be used to restore the dash pattern to a solid line. */ private PdfArray dashPattern = new PdfArray(Arrays.asList(new PdfObject[]{new PdfArray(), new PdfNumber(0)})); private PdfName renderingIntent = PdfName.RelativeColorimetric; private boolean automaticStrokeAdjustment = false; private PdfObject blendMode = PdfName.Normal; private PdfObject softMask = PdfName.None; // alpha constant private float strokeAlpha = 1f; private float fillAlpha = 1f; // alpha source private boolean alphaIsShape = false; private boolean strokeOverprint = false; private boolean fillOverprint = false; private int overprintMode = 0; private PdfObject blackGenerationFunction; private PdfObject blackGenerationFunction2; private PdfObject underColorRemovalFunction; private PdfObject underColorRemovalFunction2; private PdfObject transferFunction; private PdfObject transferFunction2; private PdfObject halftone; private float flatnessTolerance = 1f; private Float smoothnessTolerance; private PdfObject htp; /** * Internal empty and default constructor. */ protected CanvasGraphicsState() { } /** * Copy constructor. * * @param source the Graphics State to copy from */ public CanvasGraphicsState(CanvasGraphicsState source) { copyFrom(source); } /** * Updates this object with the values from a dictionary. * * @param extGState the dictionary containing source parameters */ public void updateFromExtGState(PdfDictionary extGState) { updateFromExtGState(new PdfExtGState(extGState), extGState.getIndirectReference() == null ? null : extGState.getIndirectReference().getDocument()); } /** * @return current transformation matrix. */ public Matrix getCtm() { return ctm; } /** * Updates current transformation matrix. * The third column will always be [0 0 1] * * @param a element at (1,1) of the transformation matrix * @param b element at (1,2) of the transformation matrix * @param c element at (2,1) of the transformation matrix * @param d element at (2,2) of the transformation matrix * @param e element at (3,1) of the transformation matrix * @param f element at (3,2) of the transformation matrix */ public void updateCtm(float a, float b, float c, float d, float e, float f) { updateCtm(new Matrix(a, b, c, d, e, f)); } /** * Updates current transformation matrix. * * @param newCtm new current transformation matrix. */ public void updateCtm(Matrix newCtm) { ctm = newCtm.multiply(ctm); } /** * Gets the current fill color. * * @return The canvas graphics state fill {@link Color color} */ public Color getFillColor() { return fillColor; } /** * Sets the current fill {@link Color color}. * * @param fillColor The new fill color. */ public void setFillColor(Color fillColor) { this.fillColor = fillColor; } /** * Gets the current stroke color. * * @return The canvas graphics state stroke {@link Color color} */ public Color getStrokeColor() { return strokeColor; } /** * Sets the current stroke {@link Color color}. * * @param strokeColor The new stroke color. */ public void setStrokeColor(Color strokeColor) { this.strokeColor = strokeColor; } /** * Gets the current line width. * * @return The canvas graphics state line width. */ public float getLineWidth() { return lineWidth; } /** * Sets the current line width. * * @param lineWidth The new line width. */ public void setLineWidth(float lineWidth) { this.lineWidth = lineWidth; } /** * Gets the current line cap style, see ISO-320001, 8.4.3.3 Line Cap Style. * * @return The current cap style. * @see PdfCanvas#setLineCapStyle(int) for more info. */ public int getLineCapStyle() { return lineCapStyle; } /** * Sets the current line cap style, see ISO-320001, 8.4.3.3 Line Cap Style. * * @param lineCapStyle The new cap style value. * @see PdfCanvas#setLineCapStyle(int) for more info. */ public void setLineCapStyle(int lineCapStyle) { this.lineCapStyle = lineCapStyle; } /** * Gets the current line join style, see ISO-320001, 8.4.3.4 Line Join Style. * * @return The current line join style. * @see PdfCanvas#setLineJoinStyle(int) for more info. */ public int getLineJoinStyle() { return lineJoinStyle; } /** * Sets the current line join style, see ISO-320001, 8.4.3.4 Line Join Style. * * @param lineJoinStyle The new line join style value. * @see PdfCanvas#setLineJoinStyle(int) for more info. */ public void setLineJoinStyle(int lineJoinStyle) { this.lineJoinStyle = lineJoinStyle; } /** * Gets the current miter limit, see ISO-320001, 8.4.3.5 Miter Limit. * * @return The current miter limit. * @see PdfCanvas#setMiterLimit(float) for more info. */ public float getMiterLimit() { return miterLimit; } /** * Sets the current miter limit, see ISO-320001, 8.4.3.5 Miter Limit. * * @param miterLimit The new miter limit value. * @see PdfCanvas#setMiterLimit(float) for more info. */ public void setMiterLimit(float miterLimit) { this.miterLimit = miterLimit; } /** * Gets line dash pattern value, {@code D} key, see ISO-320001, 8.4.3.6 Line Dash Pattern, * {@link com.itextpdf.kernel.pdf.extgstate.PdfExtGState#setDashPattern }. * * @return a {@code PdfArray}, that represents line dash pattern. */ public PdfArray getDashPattern() { return dashPattern; } /** * Sets line dash pattern value, {@code D} key, see ISO-320001, 8.4.3.6 Line Dash Pattern, * {@link com.itextpdf.kernel.pdf.extgstate.PdfExtGState#setDashPattern }. * * @param dashPattern a {@code PdfArray}, that represents line dash pattern. */ public void setDashPattern(PdfArray dashPattern) { this.dashPattern = dashPattern; } /** * Gets the rendering intent, see {@link PdfExtGState#getRenderingIntent()}. * * @return the rendering intent name. */ public PdfName getRenderingIntent() { return renderingIntent; } /** * Sets the rendering intent, see {@link PdfExtGState#getRenderingIntent()}. * * @param renderingIntent the rendering intent name. */ public void setRenderingIntent(PdfName renderingIntent) { this.renderingIntent = renderingIntent; } /** * Gets the font size. * * @return The current font size. */ public float getFontSize() { return fontSize; } /** * Sets the font size. * * @param fontSize The new font size. */ public void setFontSize(float fontSize) { this.fontSize = fontSize; } /** * Gets the current {@link PdfFont}. * * @return The current {@link PdfFont}. */ public PdfFont getFont() { return font; } /** * Sets the current {@link PdfFont}. * * @param font The new {@link PdfFont}. */ public void setFont(PdfFont font) { this.font = font; } /** * Gets the current Text Rendering Mode, see ISO-320001, 9.3.6 Text Rendering Mode, * {@link PdfCanvas#setTextRenderingMode}. * * @return The current text rendering mode. */ public int getTextRenderingMode() { return textRenderingMode; } /** * Sets the current Text Rendering Mode, see ISO-320001, 9.3.6 Text Rendering Mode, * {@link PdfCanvas#setTextRenderingMode}. * * @param textRenderingMode The new text rendering mode. */ public void setTextRenderingMode(int textRenderingMode) { this.textRenderingMode = textRenderingMode; } /** * Get the current Text Rise, see ISO-320001, 9.3.7 Text Rise, * {@link PdfCanvas#setTextRise}. * * @return The current text rise. */ public float getTextRise() { return textRise; } /** * Set the current Text Rise, see ISO-320001, 9.3.7 Text Rise * {@link PdfCanvas#setTextRise}. * * @param textRise The new text rise value. */ public void setTextRise(float textRise) { this.textRise = textRise; } /** * Gets the current Flatness Tolerance, see ISO-320001, 10.6.2 Flatness Tolerance, * {@link PdfCanvas#setFlatnessTolerance(float)}. * * @return The current flatness tolerance. */ public float getFlatnessTolerance() { return flatnessTolerance; } /** * Sets the current Flatness Tolerance, see ISO-320001, 10.6.2 Flatness Tolerance, * {@link PdfCanvas#setFlatnessTolerance(float)}. * * @param flatnessTolerance The new flatness tolerance value. */ public void setFlatnessTolerance(float flatnessTolerance) { this.flatnessTolerance = flatnessTolerance; } /** * Sets the Word Spacing, see ISO-320001, 9.3.3 Word Spacing, * {@link PdfCanvas#setWordSpacing(float)}. * * @param wordSpacing The new word spacing value. */ public void setWordSpacing(float wordSpacing) { this.wordSpacing = wordSpacing; } /** * Gets the current Word Spacing, see ISO-320001, 9.3.3 Word Spacing, * {@link PdfCanvas#setWordSpacing(float)} * * @return The current word spacing */ public float getWordSpacing() { return wordSpacing; } /** * Sets the Character Spacing, see ISO-320001, 9.3.2 Character Spacing, * {@link PdfCanvas#setCharacterSpacing(float)} * * @param characterSpacing The new character spacing value. */ public void setCharSpacing(float characterSpacing) { this.charSpacing = characterSpacing; } /** * Gets the current Character Spacing, see ISO-320001, 9.3.2 Character Spacing, * {@link PdfCanvas#setCharacterSpacing(float)}. * * @return The current character spacing value. */ public float getCharSpacing() { return charSpacing; } /** * Gets the current Leading, see ISO-320001, 9.3.5 Leading, * {@link PdfCanvas#setLeading(float)}. * * @return The current leading value. */ public float getLeading() { return leading; } /** * Sets the Leading, see ISO-320001, 9.3.5 Leading, * {@link PdfCanvas#setLeading(float)}. * * @param leading The new leading value. */ public void setLeading(float leading) { this.leading = leading; } /** * Gets the current Horizontal Scaling percentage, see ISO-320001, 9.3.4 Horizontal Scaling. * {@link PdfCanvas#setHorizontalScaling(float)}. * * @return The current horizontal scaling factor. */ public float getHorizontalScaling() { return scale; } /** * Sets the Horizontal Scaling percentage for text, see ISO-320001, 9.3.4 Horizontal Scaling, * {@link PdfCanvas#setHorizontalScaling(float)}. * * @param scale The new horizontal scaling factor. */ public void setHorizontalScaling(float scale) { this.scale = scale; } /** * Get the Stroke Overprint flag, see ISO 32000-1, 8.6.7 Overprint Control * and 11.7.4.5 Summary of Overprinting Behaviour, {@link PdfExtGState#getStrokeOverprintFlag()}. * * @return The current stroke overprint flag. */ public boolean getStrokeOverprint() { return strokeOverprint; } /** * Get the Fill Overprint flag, see ISO 32000-1, 8.6.7 Overprint Control * and 11.7.4.5 Summary of Overprinting Behaviour, {@link PdfExtGState#getFillOverprintFlag()}. * * @return The current stroke overprint flag. */ public boolean getFillOverprint() { return fillOverprint; } /** * Get the Overprint Mode, see ISO 32000-1, 8.6.7 Overprint Control * and 11.7.4.5 Summary of Overprinting Behaviour, {@link PdfExtGState#getOverprintMode()}. * * @return The current overprint mode. */ public int getOverprintMode() { return overprintMode; } /** * Gets the current Black-generation function, see ISO32000-1, 11.7.5.3 Rendering Intent and Colour Conversions and * Table 58 – Entries in a Graphics State Parameter Dictionary, * {@link PdfExtGState#getBlackGenerationFunction()}. * * @return the current black-generation function. */ public PdfObject getBlackGenerationFunction() { return blackGenerationFunction; } /** * Gets the current overruling Black-generation function, * see ISO32000-1, 11.7.5.3 Rendering Intent and Colour Conversions and * Table 58 – Entries in a Graphics State Parameter Dictionary, * {@link PdfExtGState#getBlackGenerationFunction2()}. * * @return the current overruling black-generation function. */ public PdfObject getBlackGenerationFunction2() { return blackGenerationFunction2; } /** * Gets the current Undercolor-removal function, * see ISO32000-1, 11.7.5.3 Rendering Intent and Colour Conversions and * Table 58 – Entries in a Graphics State Parameter Dictionary * {@link PdfExtGState#getUndercolorRemovalFunction()}. * * @return the current black-generation function. */ public PdfObject getUnderColorRemovalFunction() { return underColorRemovalFunction; } /** * Gets the current overruling Undercolor-removal function, * see ISO32000-1, 11.7.5.3 Rendering Intent and Colour Conversions and * Table 58 – Entries in a Graphics State Parameter Dictionary, * {@link PdfExtGState#getUndercolorRemovalFunction2()}. * * @return the current undercolor-removal function. */ public PdfObject getUnderColorRemovalFunction2() { return underColorRemovalFunction2; } /** * Gets the current Transfer function, * see ISO32000-1, 11.7.5.3 Rendering Intent and Colour Conversions and * Table 58 – Entries in a Graphics State Parameter Dictionary, * {@link PdfExtGState#getTransferFunction()}. * * @return the current transfer function. */ public PdfObject getTransferFunction() { return transferFunction; } /** * Gets the current overruling transer function, * see ISO32000-1, 11.7.5.3 Rendering Intent and Colour Conversions and * Table 58 – Entries in a Graphics State Parameter Dictionary, * {@link PdfExtGState#getTransferFunction2()}. * * @return the current overruling transer function. */ public PdfObject getTransferFunction2() { return transferFunction2; } /** * Gets the current halftone , * see ISO32000-1, 10.5 Halftones and Table 58 – Entries in a Graphics State Parameter Dictionary, * {@link PdfExtGState#getHalftone()}. * * @return the current halftone. */ public PdfObject getHalftone() { return halftone; } /** * Gets the current Smoothness Tolerance, * see ISO32000-1, 10.6.3 Smoothness Tolerance and Table 58 – Entries in a Graphics State Parameter Dictionary, * {@link PdfExtGState#getSmothnessTolerance()}. * * @return the current smoothness tolerance function. */ public Float getSmoothnessTolerance() { return smoothnessTolerance; } /** * Gets the current Apply Automatic Stroke Adjustment flag, see ISO 32000-1, 10.6.5 Automatic Stroke Adjustment, * {@link PdfExtGState#getAutomaticStrokeAdjustmentFlag()}. * * @return The current automatic stroke adjustment flag. */ public boolean getAutomaticStrokeAdjustment() { return automaticStrokeAdjustment; } /** * Gets the current Blend Mode, see ISO 32000-1, 11.3.5 Blend Mode and * 11.6.3 Specifying Blending Colour Space and Blend Mode, * {@link PdfExtGState#getBlendMode()}. * * @return The current blend mode. */ public PdfObject getBlendMode() { return blendMode; } /** * Gets the current Soft Mask, see ISO 32000-1, 11.3.7.2 Source Shape and Opacity, * 11.6.4.3 Mask Shape and Opacity and 11.6.5.2 Soft-Mask Dictionaries, * {@link PdfExtGState#getSoftMask()}. * * @return The current soft mask. */ public PdfObject getSoftMask() { return softMask; } /** * Gets the current Stroke Opacity value, see ISO 32000-1, 11.3.7.2 Source Shape and Opacity * and 11.6.4.4 Constant Shape and Opacity, {@link PdfExtGState#getStrokeOpacity()}. * * @return the current stroke opacity value. */ public float getStrokeOpacity() { return strokeAlpha; } /** * Gets the current Fill Opacity value, see ISO 32000-1, 11.3.7.2 Source Shape and Opacity * and 11.6.4.4 Constant Shape and Opacity, {@link PdfExtGState#getFillOpacity()}. * * @return the current fill opacity value. */ public float getFillOpacity() { return fillAlpha; } /** * Gets the current Alpha is shape flag, see ISO 32000-1, 11.3.7.2 Source Shape and Opacity and * 11.6.4.3 Mask Shape and Opacity, {@link PdfExtGState#getAlphaSourceFlag()} . * * @return The current alpha is shape flag. */ public boolean getAlphaIsShape() { return alphaIsShape; } /** * Gets the current Text Knockout flag, see ISO 32000-1, 9.3.8 Text Knockout, * {@link PdfExtGState#getTextKnockoutFlag()}. * * @return The current text knockout flag. */ public boolean getTextKnockout() { return textKnockout; } /** * Gets the current Halftone Phase, see Portable Document Format Reference Manual Version 1.2, * 7.12 Extended graphics states and PostScript Language Reference Manual, Second Edition, * 7.3.3, Halftone Phase. * * @return the current halftone phase. */ public PdfObject getHTP() { return htp; } /** * Updates current graphic state with values from extended graphic state dictionary. * * @param extGState the wrapper around the extended graphic state dictionary */ public void updateFromExtGState(PdfExtGState extGState) { updateFromExtGState(extGState, null); } /** * Updates current graphic state with values from extended graphic state dictionary. * * @param extGState the wrapper around the extended graphic state dictionary * @param pdfDocument the document to retrieve fonts from. Needed when the newly created fonts are used */ void updateFromExtGState(PdfExtGState extGState, PdfDocument pdfDocument) { Float lw = extGState.getLineWidth(); if (lw != null) lineWidth = (float) lw; Integer lc = extGState.getLineCapStyle(); if (lc != null) lineCapStyle = (int) lc; Integer lj = extGState.getLineJoinStyle(); if (lj != null) lineJoinStyle = (int) lj; Float ml = extGState.getMiterLimit(); if (ml != null) miterLimit = (float) ml; PdfArray d = extGState.getDashPattern(); if (d != null) dashPattern = d; PdfName ri = extGState.getRenderingIntent(); if (ri != null) renderingIntent = ri; Boolean op = extGState.getStrokeOverprintFlag(); if (op != null) strokeOverprint = (boolean) op; op = extGState.getFillOverprintFlag(); if (op != null) fillOverprint = (boolean) op; Integer opm = extGState.getOverprintMode(); if (opm != null) overprintMode = (int) opm; PdfArray fnt = extGState.getFont(); if (fnt != null) { PdfDictionary fontDictionary = fnt.getAsDictionary(0); if (this.font == null || this.font.getPdfObject() != fontDictionary) { this.font = pdfDocument.getFont(fontDictionary); } PdfNumber fntSz = fnt.getAsNumber(1); if (fntSz != null) this.fontSize = fntSz.floatValue(); } PdfObject bg = extGState.getBlackGenerationFunction(); if (bg != null) blackGenerationFunction = bg; PdfObject bg2 = extGState.getBlackGenerationFunction2(); if (bg2 != null) blackGenerationFunction2 = bg2; PdfObject ucr = extGState.getUndercolorRemovalFunction(); if (ucr != null) underColorRemovalFunction = ucr; PdfObject ucr2 = extGState.getUndercolorRemovalFunction2(); if (ucr2 != null) underColorRemovalFunction2 = ucr2; PdfObject tr = extGState.getTransferFunction(); if (tr != null) transferFunction = tr; PdfObject tr2 = extGState.getTransferFunction2(); if (tr2 != null) transferFunction2 = tr2; PdfObject ht = extGState.getHalftone(); if (ht != null) halftone = ht; PdfObject local_htp = extGState.getPdfObject().get(PdfName.HTP); if (local_htp != null) this.htp = local_htp; Float fl = extGState.getFlatnessTolerance(); if (fl != null) flatnessTolerance = (float) fl; Float sm = extGState.getSmothnessTolerance(); if (sm != null) smoothnessTolerance = sm; Boolean sa = extGState.getAutomaticStrokeAdjustmentFlag(); if (sa != null) automaticStrokeAdjustment = (boolean) sa; PdfObject bm = extGState.getBlendMode(); if (bm != null) blendMode = bm; PdfObject sMask = extGState.getSoftMask(); if (sMask != null) softMask = sMask; Float ca = extGState.getStrokeOpacity(); if (ca != null) strokeAlpha = (float) ca; ca = extGState.getFillOpacity(); if (ca != null) fillAlpha = (float) ca; Boolean ais = extGState.getAlphaSourceFlag(); if (ais != null) alphaIsShape = (boolean) ais; Boolean tk = extGState.getTextKnockoutFlag(); if (tk != null) textKnockout = (boolean) tk; } private void copyFrom(CanvasGraphicsState source) { this.ctm = source.ctm; this.strokeColor = source.strokeColor; this.fillColor = source.fillColor; this.charSpacing = source.charSpacing; this.wordSpacing = source.wordSpacing; this.scale = source.scale; this.leading = source.leading; this.font = source.font; this.fontSize = source.fontSize; this.textRenderingMode = source.textRenderingMode; this.textRise = source.textRise; this.textKnockout = source.textKnockout; this.lineWidth = source.lineWidth; this.lineCapStyle = source.lineCapStyle; this.lineJoinStyle = source.lineJoinStyle; this.miterLimit = source.miterLimit; this.dashPattern = source.dashPattern; this.renderingIntent = source.renderingIntent; this.automaticStrokeAdjustment = source.automaticStrokeAdjustment; this.blendMode = source.blendMode; this.softMask = source.softMask; this.strokeAlpha = source.strokeAlpha; this.fillAlpha = source.fillAlpha; this.alphaIsShape = source.alphaIsShape; this.strokeOverprint = source.strokeOverprint; this.fillOverprint = source.fillOverprint; this.overprintMode = source.overprintMode; this.blackGenerationFunction = source.blackGenerationFunction; this.blackGenerationFunction2 = source.blackGenerationFunction2; this.underColorRemovalFunction = source.underColorRemovalFunction; this.underColorRemovalFunction2 = source.underColorRemovalFunction2; this.transferFunction = source.transferFunction; this.transferFunction2 = source.transferFunction2; this.halftone = source.halftone; this.flatnessTolerance = source.flatnessTolerance; this.smoothnessTolerance = source.smoothnessTolerance; this.htp = source.htp; } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy