Source code for kiva.graphics_state

# (C) Copyright 2005-2022 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!
""" GraphicsState Class

The GraphicsState class is used Kiva backends which need to have their state
tracked by Python, rather than by an internal graphics state (eg. Wx, SVG and
PDF backends, but not Agg or QPainter).
"""
import copy

from numpy import array, float64

from .constants import CAP_ROUND, JOIN_MITER, TEXT_FILL
from .fonttools import Font
from .line_state import LineState
import kiva.affine as affine


[docs]class GraphicsState(LineState): """ Holds information used by a graphics context when drawing. I'm not sure if these should be a separate class, a dictionary, or part of the GraphicsContext object. Making them a dictionary or object simplifies save_state and restore_state a little bit. Also, this is a pretty good candidate for using slots. I'm not going to use them right now, but, if we standardize on 2.2, slots might speed things up some. Attributes ---------- ctm context transform matrix fill_color RGBA array(4) of values 0.0 to 1.0 alpha transparency value of drawn objects font either a special device independent font object (what does anygui use?) or a device dependent font object. text_matrix coordinate transformation matrix for text clipping_path defines the path of the clipping region. For now, this can only be a rectangle. current_point location where next object is drawn. should_antialias whether anti-aliasing should be used when drawing lines and fonts miter_limit specifies when and when not to miter line joins. flatness specifies tolerance for bumpiness of curves character_spacing spacing between drawing text characters text_drawing_mode style for drawing text: outline, fill, etc. These are inherited from LineState: line_color RGBA array(4) of values 0.0 to 1.0 line_width width of drawn lines line_join style of how lines are joined. The choices are: JOIN_ROUND, JOIN_BEVEL, JOIN_MITER line_cap style of the end cap on lines. The choices are: CAP_ROUND, CAP_SQUARE, CAP_BUTT line_dash (phase,pattern) dash pattern for lines. phase is a single value specifying how many units into the pattern to start. dash is a 1-D array of floats that alternate between specifying the number of units on and off in the pattern. When the end of the array is reached, the pattern repeats. Not yet supported: rendering_intent deals with colors and color correction in a sophisticated way. """ def __init__(self): # Line state default values. line_color = array((0.0, 0.0, 0.0, 1.0)) line_width = 1 line_cap = CAP_ROUND line_join = JOIN_MITER line_dash = (0, array([0])) # This will draw a solid line # FIXME: This is a very wierd class. The following code is here to # make the basecore2d and the PS, SVG context managers happy super().__init__( line_color, line_width, line_cap, line_join, line_dash ) self.line_state = self # All other default values. self.ctm = affine.affine_identity() self.fill_color = array((0.0, 0.0, 0.0, 1.0)) self.alpha = 1.0 self.font = Font() self.text_matrix = affine.affine_identity() self.clipping_path = None # Not sure what the default should be? # Technically uninitialized in the PDF spec, but 0,0 seems fine to me: self.current_point = array((0, 0), dtype=float64) self.antialias = True self.miter_limit = 1.0 self.flatness = 1.0 self.character_spacing = 0.0 self.text_drawing_mode = TEXT_FILL self.alpha = 1.0
[docs] def copy(self): return copy.deepcopy(self)