public final class SVGGraphics2Dextends Graphics2D
A Graphics2D implementation that creates SVG output. After rendering the graphics via the SVGGraphics2D, you can retrieve an SVG element (see getSVGElement()) or an SVG document (see getSVGDocument()) containing your content. Usage

Using the SVGGraphics2D class is straightforward. First, create an instance specifying the height and width of the SVG element that will be created. Then, use standard Java2D API calls to draw content into the element. Finally, retrieve the SVG element that has been accumulated. For example:

SVGGraphics2D g2 = new SVGGraphics2D(300, 200);
g2.setPaint(Color.RED);
g2.draw(new Rectangle(10, 10, 280, 180));
String svgElement = g2.getSVGElement();

For the content generation step, you can make use of third party libraries, such as JFreeChart, that render output using standard Java2D API calls. Rendering Hints

The SVGGraphics2D supports a couple of custom rendering hints - for details, refer to the SVGHints class documentation. Other Notes
Some additional notes:

  • Images are supported, but for methods with an ImageObserver parameter note that the observer is ignored completely. In any case, using images that are not fully loaded already would not be a good idea in the context of generating SVG data/files;
  • the getFontMetrics(java.awt.Font) and getFontRenderContext() methods return values that come from an internal BufferedImage, this is a short-cut and we don't know if there are any negative consequences (if you know of any, please let us know and we'll add the info here or find a way to fix it);
  • there are settings to control the number of decimal places used to write the coordinates for geometrical elements (default 2dp) and transform matrices (default 6dp). These defaults may change in a future release.
  • when an HTML page contains multiple SVG elements, the items within the DEFS element for each SVG element must have IDs that are unique across all SVG elements in the page. We auto-populate the defsKeyPrefix attribute to help ensure that unique IDs are generated.

For some demos showing how to use this class, look at the JFree-Demos project at GitHub: https://github.com/jfree/jfree-demos.

  • Field Details

    • CLIP_KEY_PREFIX

      private static final String CLIP_KEY_PREFIX
      The prefix for keys used to identify clip paths.
      See Also:
    • width

      private final int width
      The width of the drawing area.
    • height

      private final int height
      The height of the drawing area.
    • units

      private final SVGUnits units
      The units of the drawing area.
    • shapeRendering

      private String shapeRendering
      The shape rendering property to set for the SVG element. Permitted values are "auto", "crispEdges", "geometricPrecision" and "optimizeSpeed".
    • textRendering

      private String textRendering
      The text rendering property for the SVG element. Permitted values are "auto", "optimizeSpeed", "optimizeLegibility" and "geometricPrecision".
    • fontSizeUnits

      private SVGUnits fontSizeUnits
      The font size units.
    • hints

      private final RenderingHints hints
      Rendering hints (see SVGHints).
    • checkStrokeControlHint

      private boolean checkStrokeControlHint
      A flag that controls whether or not the KEY_STROKE_CONTROL hint is checked.
    • transformDP

      private int transformDP
      The number of decimal places to use when writing the matrix values for transformations.
    • geometryDP

      private int geometryDP
      The number of decimal places to use when writing coordinates for geometrical shapes.
    • sb

      private final StringBuilder sb
      The buffer that accumulates the SVG output.
    • defsKeyPrefix

      private String defsKeyPrefix
      A prefix for the keys used in the DEFS element. This can be used to ensure that the keys are unique when creating more than one SVG element for a single HTML page.
    • gradientPaints

      private Map<GradientPaintKey, String> gradientPaints
      A map of all the gradients used, and the corresponding id. When generating the SVG file, all the gradient paints used must be defined in the defs element.
    • linearGradientPaints

      private Map<LinearGradientPaintKey, String> linearGradientPaints
      A map of all the linear gradients used, and the corresponding id. When generating the SVG file, all the linear gradient paints used must be defined in the defs element.
    • radialGradientPaints

      private Map<RadialGradientPaintKey, String> radialGradientPaints
      A map of all the radial gradients used, and the corresponding id. When generating the SVG file, all the radial gradient paints used must be defined in the defs element.
    • clipPaths

      private List<String> clipPaths
      A list of the registered clip regions. These will be written to the DEFS element.
    • filePrefix

      private String filePrefix
      The filename prefix for images that are referenced rather than embedded but don't have an href supplied via the SVGHints.KEY_IMAGE_HREF hint.
    • fileSuffix

      private String fileSuffix
      The filename suffix for images that are referenced rather than embedded but don't have an href supplied via the SVGHints.KEY_IMAGE_HREF hint.
    • imageElements

      private List<ImageElement> imageElements
      A list of images that are referenced but not embedded in the SVG. After the SVG is generated, the caller can make use of this list to write PNG files if they don't already exist.
    • clip

      private Shape clip
      The user clip (can be null).
    • clipRef

      private String clipRef
      The reference for the current clip.
    • transform

      private AffineTransform transform
      The current transform.
    • paint

      private Paint paint
      The paint used for filling.
    • color

      private Color color
      The color used for drawing text.
    • composite

      private Composite composite
      The alpha composite applied to the draws.
    • stroke

      private Stroke stroke
      The current stroke.
    • strokeStyleCache

      private String strokeStyleCache
      Cached strokeStyle() result, invalidated on setStroke/setPaint/setComposite.
    • strokeStyleCacheValid

      private boolean strokeStyleCacheValid
      True while the cached stroke style is current.
    • fillStyleCache

      private String fillStyleCache
      Cached getSVGFillStyle() result, invalidated on setPaint/setComposite.
    • fillStyleCacheValid

      private boolean fillStyleCacheValid
      True while the cached fill style is current.
    • glowEnabled

      private boolean glowEnabled
      When true, the next draw(Path2D) emits a glow-filtered path before the original.
    • smoothingEnabled

      private boolean smoothingEnabled
      When true, plot paths hold curves rather than axis-aligned segments, so the global shape-rendering:crispEdges rule is overridden for them. Curves drawn with crisp edges render aliased, which defeats the point of smoothing them.

      Only paths are affected. In a graph body the grid and axes are emitted as <line> elements and the background as <rect>, so a path in the body is always plot data; paths inside <clipPath> are unaffected because shape rendering does not apply to clipping.

    • zeroStrokeWidth

      private double zeroStrokeWidth
      The width of the SVG stroke to use when the user supplies a BasicStroke with a width of 0.0 (in this case the Java specification says "If width is set to 0.0f, the stroke is rendered as the thinnest possible line for the target device and the antialias hint setting.")
    • font

      private Font font
      The last font that was set.
    • fontRenderContext

      private final FontRenderContext fontRenderContext
      The font render context. The fractional metrics flag solves the glyph positioning issue identified by Christoph Nahr: http://news.kynosarges.org/2014/06/28/glyph-positioning-in-jfreesvg-orsonpdf/
    • fontMapper

      private FontMapper fontMapper
      Maps font family names to alternates (or leaves them unchanged).
    • background

      private Color background
      The background color, used by clearRect().
    • fmImage

      private BufferedImage fmImage
      A hidden image used for font metrics.
    • fmImageG2D

      private Graphics2D fmImageG2D
      Graphics of the cached font metric image.
    • line

      private Line2D line
      An instance that is lazily instantiated in drawLine and then subsequently reused to avoid creating a lot of garbage.
    • rect

      An instance that is lazily instantiated in fillRect and then subsequently reused to avoid creating a lot of garbage.
    • roundRect

      private RoundRectangle2D roundRect
      An instance that is lazily instantiated in draw/fillRoundRect and then subsequently reused to avoid creating a lot of garbage.
    • oval

      private Ellipse2D oval
      An instance that is lazily instantiated in draw/fillOval and then subsequently reused to avoid creating a lot of garbage.
    • arc

      private Arc2D arc
      An instance that is lazily instantiated in draw/fillArc and then subsequently reused to avoid creating a lot of garbage.
    • gradientPaintRef

      private String gradientPaintRef
      If the current paint is an instance of GradientPaint, this field will contain the reference id that is used in the DEFS element for that linear gradient.
    • deviceConfiguration

      private GraphicsConfiguration deviceConfiguration
      The device configuration (this is lazily instantiated in the getDeviceConfiguration() method).
    • elementIDs

      private final Set<String> elementIDs
      A set of element IDs.
    • DEFAULT_STROKE_CAP

      private static final String DEFAULT_STROKE_CAP
      SVG name of the default stroke cap.
      See Also:
    • DEFAULT_STROKE_JOIN

      private static final String DEFAULT_STROKE_JOIN
      SVG name of the default stroke join.
      See Also:
    • FONT_CLASS_PATTERN

      private static final Pattern FONT_CLASS_PATTERN
      Regex pattern for extracting font-family and font-size from inline style attributes and converting them to shorthand CSS classes. Matches any style attribute containing font-family:(monospace|sans-serif) and font-size:(\\d+)px in any order relative to other properties, and captures the font family group (1) and size (2).
    • TEXT_MERGE_PATTERN

      private static final Pattern TEXT_MERGE_PATTERN
      Regex pattern for merging adjacent <text> elements that are split across separate <g> groups by the font class extraction step. Matches the closing </text></g> followed by an opening <g> with an optional CSS class and/or clip-path="url(#clip-2)", then another <text>. The replacement collapses the group boundary into a single <text> continuation.
    • themeName

      private String themeName
      Console theme supplied by the caller, or null to infer it from the SVG.

      The inference reads the area fill colour, which only a filled-area graph emits, so a line-only graph (a combined multi-series plot) has nothing to read and used to be detected as CLASSIC, losing its gradient and themed text. The caller already knows the theme, so it is passed rather than guessed.

    • LINE_ELEMENT_REGEX

      private static final String LINE_ELEMENT_REGEX
      Matches a single self-closing <line> element with its trailing whitespace. The building block of LINE_RUN_PATTERN; splitting a run needs the elements one by one so each one's class can be read.
      See Also:
    • LINE_ELEMENT_PATTERN

      private static final Pattern LINE_ELEMENT_PATTERN
      Matches one self-closing <line> element, used to walk a run element by element.
    • LINE_RUN_PATTERN

      private static final Pattern LINE_RUN_PATTERN
      Matches consecutive runs of self-closing <line> elements. A run is one or more <line .../> elements with no other element types between them.
    • LINE_CLASS_PATTERN

      private static final Pattern LINE_CLASS_PATTERN
      Extracts the CSS class name from a class="..." attribute within a line run.
  • Constructor Details

    • SVGGraphics2D

      public SVGGraphics2D(int width, int height)
      Creates a new instance with the specified width and height.
      Parameters:
      width - the width of the SVG element.
      height - the height of the SVG element.
    • SVGGraphics2D

      public SVGGraphics2D(int width, int height, SVGUnits units)
      Creates a new instance with the specified width and height in the given units.
      Parameters:
      width - the width of the SVG element.
      height - the height of the SVG element.
      units - the units for the width and height.
    • SVGGraphics2D

      public SVGGraphics2D(int width, int height, StringBuilder sb)
      Creates a new instance with the specified width and height that will populate the supplied StringBuilder instance. This constructor is used by the create() method, but won't normally be called directly by user code.
      Parameters:
      width - the width of the SVG element.
      height - the height of the SVG element.
      sb - the string builder (null not permitted).
    • SVGGraphics2D

      public SVGGraphics2D(int width, int height, SVGUnits units, StringBuilder sb)
      Creates a new instance with the specified width and height that will populate the supplied StringBuilder instance. This constructor is used by the create() method, but won't normally be called directly by user code.
      Parameters:
      width - the width of the SVG element.
      height - the height of the SVG element.
      units - the units for the width and height above (null permitted).
      sb - the string builder (null not permitted).
    • SVGGraphics2D

      private SVGGraphics2D(SVGGraphics2D parent)
      Creates a new instance that is a child of the supplied parent.
      Parameters:
      parent - the parent (null not permitted).
  • Method Details

    • setGlowEnabled

      public void setGlowEnabled(boolean enabled)
      Enables or disables the glow effect for subsequent draw(Path2D) calls. When enabled, a filtered copy of the path is emitted before the original, creating a soft glow behind stroked lines.
      Parameters:
      enabled - true to enable glow path emission
    • setSmoothingEnabled

      public void setSmoothingEnabled(boolean enabled)
      Enables or disables smoothing antialiasing for plot paths.
      Parameters:
      enabled - true when the plot paths contain curves
    • getWidth

      public int getWidth()
      Returns the width for the SVG element, specified in the constructor. This value will be written to the SVG element returned by the getSVGElement() method.
      Returns:
      The width for the SVG element.
    • getHeight

      public int getHeight()
      Returns the height for the SVG element, specified in the constructor. This value will be written to the SVG element returned by the getSVGElement() method.
      Returns:
      The height for the SVG element.
    • getUnits

      public SVGUnits getUnits()
      Returns the units for the width and height of the SVG element's viewport, as specified in the constructor. The default value is null).
      Returns:
      The units (possibly null).
    • getShapeRendering

      public String getShapeRendering()
      Returns the value of the 'shape-rendering' property that will be written to the SVG element. The default value is "auto".
      Returns:
      The shape rendering property.
    • setShapeRendering

      public void setShapeRendering(String value)
      Sets the value of the 'shape-rendering' property that will be written to the SVG element. Permitted values are "auto", "crispEdges", "geometricPrecision", "inherit" and "optimizeSpeed".
      Parameters:
      value - the new value.
    • getTextRendering

      public String getTextRendering()
      Returns the value of the 'text-rendering' property that will be written to the SVG element. The default value is "auto".
      Returns:
      The text rendering property.
    • setTextRendering

      public void setTextRendering(String value)
      Sets the value of the 'text-rendering' property that will be written to the SVG element. Permitted values are "auto", "optimizeSpeed", "optimizeLegibility" and "geometricPrecision".
      Parameters:
      value - the new value.
    • getCheckStrokeControlHint

      public boolean getCheckStrokeControlHint()
      Returns the flag that controls whether or not this object will observe the KEY_STROKE_CONTROL rendering hint. The default value is true.
      Returns:
      true if the KEY_STROKE_CONTROL rendering hint is honoured, which it is by default.
      See Also:
    • setCheckStrokeControlHint

      public void setCheckStrokeControlHint(boolean check)
      Sets the flag that controls whether or not this object will observe the KEY_STROKE_CONTROL rendering hint. When enabled (the default), a hint to normalise strokes will write a stroke-style attribute with the value crispEdges.
      Parameters:
      check - the new flag value.
      See Also:
    • getDefsKeyPrefix

      public String getDefsKeyPrefix()
      Returns the prefix used for all keys in the DEFS element. The default value is "_"+ String.valueOf(System.nanoTime()).
      Returns:
      The prefix string (never null).
    • setDefsKeyPrefix

      public void setDefsKeyPrefix(String prefix)
      Sets the prefix that will be used for all keys in the DEFS element. If required, this must be set immediately after construction (before any content generation methods have been called).
      Parameters:
      prefix - the prefix (null not permitted).
    • getTransformDP

      public int getTransformDP()
      Returns the number of decimal places used to write the transformation matrices in the SVG output. The default value is 6.

      Note that there is a separate attribute to control the number of decimal places for geometrical elements in the output (see getGeometryDP()).

      Returns:
      The number of decimal places.
      See Also:
    • setTransformDP

      public void setTransformDP(int dp)
      Sets the number of decimal places used to write the transformation matrices in the SVG output. Values in the range 1 to 10 will be used to configure a formatter to that number of decimal places, for all other values we revert to the normal String conversion of double primitives (approximately 16 decimals places).

      Note that there is a separate attribute to control the number of decimal places for geometrical elements in the output (see setGeometryDP(int)).

      Parameters:
      dp - the number of decimal places (normally 1 to 10).
      See Also:
    • getGeometryDP

      public int getGeometryDP()
      Returns the number of decimal places used to write the coordinates of geometrical shapes. The default value is 2.

      Note that there is a separate attribute to control the number of decimal places for transform matrices in the output (see getTransformDP()).

      Returns:
      The number of decimal places.
    • setGeometryDP

      public void setGeometryDP(int dp)
      Sets the number of decimal places used to write the coordinates of geometrical shapes in the SVG output. Values in the range 1 to 10 will be used to configure a formatter to that number of decimal places, for all other values we revert to the normal String conversion of double primitives (approximately 16 decimals places).

      Note that there is a separate attribute to control the number of decimal places for transform matrices in the output (see setTransformDP(int)).

      Parameters:
      dp - the number of decimal places (normally 1 to 10).
    • getFilePrefix

      public String getFilePrefix()
      Returns the prefix used to generate a filename for an image that is referenced from, rather than embedded in, the SVG element.
      Returns:
      The file prefix (never null).
    • setFilePrefix

      public void setFilePrefix(String prefix)
      Sets the prefix used to generate a filename for any image that is referenced from the SVG element.
      Parameters:
      prefix - the new prefix (null not permitted).
    • getFileSuffix

      public String getFileSuffix()
      Returns the suffix used to generate a filename for an image that is referenced from, rather than embedded in, the SVG element.
      Returns:
      The file suffix (never null).
    • setFileSuffix

      public void setFileSuffix(String suffix)
      Sets the suffix used to generate a filename for any image that is referenced from the SVG element.
      Parameters:
      suffix - the new prefix (null not permitted).
    • getZeroStrokeWidth

      public double getZeroStrokeWidth()
      Returns the width to use for the SVG stroke when the AWT stroke specified has a zero width (the default value is 0.1). In the Java specification for BasicStroke it states "If width is set to 0.0f, the stroke is rendered as the thinnest possible line for the target device and the antialias hint setting." We don't have a means to implement that accurately since we must specify a fixed width.
      Returns:
      the stroke width, in user units, used when the AWT stroke has zero width
    • setZeroStrokeWidth

      public void setZeroStrokeWidth(double width)
      Sets the width to use for the SVG stroke when the current AWT stroke has a width of 0.0.
      Parameters:
      width - the new width (must be 0 or greater).
    • getDeviceConfiguration

      public GraphicsConfiguration getDeviceConfiguration()
      Returns the device configuration associated with this Graphics2D.
      Specified by:
      getDeviceConfiguration in class Graphics2D
      Returns:
      The graphics configuration.
    • create

      public Graphics create()
      Creates a new graphics object that is a copy of this graphics object (except that it has not accumulated the drawing operations). Not sure yet when or why this would be useful when creating SVG output. Note that the fontMapper object (getFontMapper()) is shared between the existing instance and the new one.
      Specified by:
      create in class Graphics
      Returns:
      A new graphics object.
    • getPaint

      public Paint getPaint()
      Returns the paint used to draw or fill shapes (or text). The default value is Color.BLACK.
      Specified by:
      getPaint in class Graphics2D
      Returns:
      The paint (never null).
      See Also:
    • setPaint

      public void setPaint(Paint paint)
      Sets the paint used to draw or fill shapes (or text). If paint is an instance of Color, this method will also update the current color attribute (see getColor()). If you pass null to this method, it does nothing (in accordance with the JDK specification).
      Specified by:
      setPaint in class Graphics2D
      Parameters:
      paint - the paint (null is permitted but ignored).
      See Also:
    • getColor

      public Color getColor()
      Returns the foreground color. This method exists for backwards compatibility in AWT, you should use the getPaint() method.
      Specified by:
      getColor in class Graphics
      Returns:
      The foreground color (never null).
      See Also:
    • setColor

      public void setColor(Color c)
      Sets the foreground color. This method exists for backwards compatibility in AWT, you should use the setPaint(java.awt.Paint) method.
      Specified by:
      setColor in class Graphics
      Parameters:
      c - the color (null permitted but ignored).
      See Also:
    • getBackground

      public Color getBackground()
      Returns the background color. The default value is Color.BLACK. This is used by the clearRect(int, int, int, int) method.
      Specified by:
      getBackground in class Graphics2D
      Returns:
      The background color (possibly null).
      See Also:
    • setBackground

      public void setBackground(Color color)
      Sets the background color. This is used by the clearRect(int, int, int, int) method. The reference implementation allows null for the background color so we allow that too (but for that case, the clearRect method will do nothing).
      Specified by:
      setBackground in class Graphics2D
      Parameters:
      color - the color (null permitted).
      See Also:
    • getComposite

      public Composite getComposite()
      Returns the current composite.
      Specified by:
      getComposite in class Graphics2D
      Returns:
      The current composite (never null).
      See Also:
    • setComposite

      public void setComposite(Composite comp)
      Sets the composite (only AlphaComposite is handled).
      Specified by:
      setComposite in class Graphics2D
      Parameters:
      comp - the composite (null not permitted).
      See Also:
    • getStroke

      public Stroke getStroke()
      Returns the current stroke (used when drawing shapes).
      Specified by:
      getStroke in class Graphics2D
      Returns:
      The current stroke (never null).
      See Also:
    • setStroke

      public void setStroke(Stroke s)
      Sets the stroke that will be used to draw shapes.
      Specified by:
      setStroke in class Graphics2D
      Parameters:
      s - the stroke (null not permitted).
      See Also:
    • getRenderingHint

      public Object getRenderingHint(RenderingHints.Key hintKey)
      Returns the current value for the specified hint. See the SVGHints class for information about the hints that can be used with SVGGraphics2D.
      Specified by:
      getRenderingHint in class Graphics2D
      Parameters:
      hintKey - the hint key (null permitted, but the result will be null also).
      Returns:
      The current value for the specified hint (possibly null).
      See Also:
    • setRenderingHint

      public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue)
      Sets the value for a hint. See the SVGHints class for information about the hints that can be used with this implementation.
      Specified by:
      setRenderingHint in class Graphics2D
      Parameters:
      hintKey - the hint key (null not permitted).
      hintValue - the hint value.
      See Also:
    • getRenderingHints

      public RenderingHints getRenderingHints()
      Returns a copy of the rendering hints. Modifying the returned copy will have no impact on the state of this Graphics2D instance.
      Specified by:
      getRenderingHints in class Graphics2D
      Returns:
      The rendering hints (never null).
      See Also:
    • setRenderingHints

      public void setRenderingHints(Map<?,?> hints)
      Sets the rendering hints to the specified collection.
      Specified by:
      setRenderingHints in class Graphics2D
      Parameters:
      hints - the new set of hints (null not permitted).
      See Also:
    • addRenderingHints

      public void addRenderingHints(Map<?,?> hints)
      Adds all the supplied rendering hints.
      Specified by:
      addRenderingHints in class Graphics2D
      Parameters:
      hints - the hints (null not permitted).
    • appendOptionalElementIDFromHint

      private void appendOptionalElementIDFromHint(StringBuilder sb)
      A utility method that appends an optional element id if one is specified via the rendering hints.
      Parameters:
      sb - the string builder (null not permitted).
    • draw

      public void draw(Shape s)
      Draws the specified shape with the current paint and stroke. There is direct handling for Line2D, Rectangle2D, Ellipse2D and Path2D. All other shapes are mapped to a GeneralPath and then drawn (effectively as Path2D objects).
      Specified by:
      draw in class Graphics2D
      Parameters:
      s - the shape (null not permitted).
      See Also:
    • fill

      public void fill(Shape s)
      Fills the specified shape with the current paint. There is direct handling for Rectangle2D, Ellipse2D and Path2D. All other shapes are mapped to a GeneralPath and then filled.
      Specified by:
      fill in class Graphics2D
      Parameters:
      s - the shape (null not permitted).
      See Also:
    • getSVGPathData

      private String getSVGPathData(Path2D path)
      Creates an SVG path string for the supplied Java2D path.
      Parameters:
      path - the path (null not permitted).
      Returns:
      An SVG path string.
    • getSVGPathDataRaw

      private String getSVGPathDataRaw(Path2D path)
      Convert a Path2D to SVG path data without smoothing (original behavior).
      Parameters:
      path - the path to convert
      Returns:
      the s v g path data raw
    • getAlpha

      private float getAlpha()
      Returns the current alpha (transparency) in the range 0.0 to 1.0. If the current composite is an AlphaComposite we read the alpha value from there, otherwise this method returns 1.0.
      Returns:
      The current alpha (transparency) in the range 0.0 to 1.0.
    • svgColorStr

      private String svgColorStr()
      Returns an SVG color string based on the current paint. To handle GradientPaint we rely on the setPaint() method having set the gradientPaintRef attribute.
      Returns:
      An SVG color string.
    • rgbColorStr

      private String rgbColorStr(Color c)
      Returns the SVG RGB color string for the specified color.
      Parameters:
      c - the color (null not permitted).
      Returns:
      The SVG RGB color string.
    • rgbaColorStr

      private String rgbaColorStr(Color c)
      Returns a string representing the specified color in RGBA format.
      Parameters:
      c - the color (null not permitted).
      Returns:
      The SVG RGBA color string.
    • strokeStyle

      private String strokeStyle()
      Returns a stroke style string based on the current stroke and alpha settings.
      Returns:
      A stroke style string.
    • getColorAlpha

      private float getColorAlpha()
      Returns the alpha value of the current paint, or 1.0f if it is not an instance of Color.
      Returns:
      The alpha value (in the range 0.0 to 1.0.
    • getSVGFillStyle

      private String getSVGFillStyle()
      Returns a fill style string based on the current paint and alpha settings.
      Returns:
      A fill style string.
    • getFont

      public Font getFont()
      Returns the current font used for drawing text.
      Specified by:
      getFont in class Graphics
      Returns:
      The current font (never null).
      See Also:
    • setFont

      public void setFont(Font font)
      Sets the font to be used for drawing text.
      Specified by:
      setFont in class Graphics
      Parameters:
      font - the font (null is permitted but ignored).
      See Also:
    • getFontMapper

      public FontMapper getFontMapper()
      Returns the font mapper (an object that optionally maps font family names to alternates). The default mapper will convert Java logical font names to the equivalent SVG generic font name, and leave all other font names unchanged.
      Returns:
      The font mapper (never null).
      See Also:
    • setFontMapper

      public void setFontMapper(FontMapper mapper)
      Sets the font mapper.
      Parameters:
      mapper - the font mapper (null not permitted).
    • getFontSizeUnits

      public SVGUnits getFontSizeUnits()
      Returns the font size units. The default value is SVGUnits.PX.
      Returns:
      The font size units.
    • setFontSizeUnits

      public void setFontSizeUnits(SVGUnits fontSizeUnits)
      Sets the font size units. In general, if this method is used it should be called immediately after the SVGGraphics2D instance is created and before any content is generated.
      Parameters:
      fontSizeUnits - the font size units (null not permitted).
    • getSVGFontStyle

      private String getSVGFontStyle()
      Returns a string containing font style info.
      Returns:
      A string containing font style info.
    • getFontMetrics

      public FontMetrics getFontMetrics(Font f)
      Returns the font metrics for the specified font.
      Specified by:
      getFontMetrics in class Graphics
      Parameters:
      f - the font to measure; the metrics come from an offscreen 10x10 image.
      Returns:
      The font metrics.
    • getFontRenderContext

      public FontRenderContext getFontRenderContext()
      Returns the font render context.
      Specified by:
      getFontRenderContext in class Graphics2D
      Returns:
      The font render context (never null).
    • drawString

      public void drawString(String str, int x, int y)
      Draws a string at (x, y). The start of the text at the baseline level will be aligned with the (x, y) point.

      Note that you can make use of the SVGHints.KEY_TEXT_RENDERING hint when drawing strings (this is completely optional though).
      Specified by:
      drawString in class Graphics2D
      Parameters:
      str - the string (null not permitted).
      x - the user-space x-coordinate of the text baseline origin.
      y - the user-space y-coordinate of the text baseline origin.
      See Also:
    • drawString

      public void drawString(String str, float x, float y)
      Draws a string at (x, y). The start of the text at the baseline level will be aligned with the (x, y) point.

      Note that you can make use of the SVGHints.KEY_TEXT_RENDERING hint when drawing strings (this is completely optional though).
      Specified by:
      drawString in class Graphics2D
      Parameters:
      str - the string (null not permitted).
      x - the user-space x-coordinate of the text baseline origin.
      y - the user-space y-coordinate of the text baseline origin.
    • drawString

      public void drawString(AttributedCharacterIterator iterator, int x, int y)
      Draws a string of attributed characters at (x, y). The call is delegated to drawString(AttributedCharacterIterator, float, float).
      Specified by:
      drawString in class Graphics2D
      Parameters:
      iterator - an iterator for the characters.
      x - the user-space x-coordinate of the text baseline origin.
      y - the user-space y-coordinate of the text baseline origin.
    • drawString

      public void drawString(AttributedCharacterIterator iterator, float x, float y)
      Draws a string of attributed characters at (x, y).
      Specified by:
      drawString in class Graphics2D
      Parameters:
      iterator - an iterator over the characters (null not permitted).
      x - the user-space x-coordinate of the text baseline origin.
      y - the user-space y-coordinate of the text baseline origin.
    • drawGlyphVector

      public void drawGlyphVector(GlyphVector g, float x, float y)
      Draws the specified glyph vector at the location (x, y).
      Specified by:
      drawGlyphVector in class Graphics2D
      Parameters:
      g - the glyph vector (null not permitted).
      x - the user-space x-coordinate at which to place the glyph outline origin.
      y - the user-space y-coordinate at which to place the glyph outline origin.
    • translate

      public void translate(int tx, int ty)
      Applies the translation (tx, ty). This call is delegated to translate(double, double).
      Specified by:
      translate in class Graphics2D
      Parameters:
      tx - the horizontal translation in user units, applied to later drawing.
      ty - the vertical translation in user units, applied to later drawing.
      See Also:
    • translate

      public void translate(double tx, double ty)
      Applies the translation (tx, ty).
      Specified by:
      translate in class Graphics2D
      Parameters:
      tx - the horizontal translation in user units, applied to later drawing.
      ty - the vertical translation in user units, applied to later drawing.
    • rotate

      public void rotate(double theta)
      Applies a rotation (anti-clockwise) about (0, 0).
      Specified by:
      rotate in class Graphics2D
      Parameters:
      theta - the rotation angle (in radians).
    • rotate

      public void rotate(double theta, double x, double y)
      Applies a rotation (anti-clockwise) about (x, y).
      Specified by:
      rotate in class Graphics2D
      Parameters:
      theta - the rotation angle (in radians).
      x - the user-space x-coordinate of the centre of rotation.
      y - the user-space y-coordinate of the centre of rotation.
    • scale

      public void scale(double sx, double sy)
      Applies a scale transformation.
      Specified by:
      scale in class Graphics2D
      Parameters:
      sx - the x-scaling factor.
      sy - the y-scaling factor.
    • shear

      public void shear(double shx, double shy)
      Applies a shear transformation. This is equivalent to the following call to the transform method:

      • transform(AffineTransform.getShearInstance(shx, shy));
      Specified by:
      shear in class Graphics2D
      Parameters:
      shx - the x-shear factor.
      shy - the y-shear factor.
    • transform

      public void transform(AffineTransform t)
      Applies this transform to the existing transform by concatenating it.
      Specified by:
      transform in class Graphics2D
      Parameters:
      t - the transform (null not permitted).
    • getTransform

      public AffineTransform getTransform()
      Returns a copy of the current transform.
      Specified by:
      getTransform in class Graphics2D
      Returns:
      A copy of the current transform (never null).
      See Also:
    • setTransform

      public void setTransform(AffineTransform t)
      Sets the transform.
      Specified by:
      setTransform in class Graphics2D
      Parameters:
      t - the new transform (null permitted, resets to the identity transform).
      See Also:
    • hit

      public boolean hit(Rectangle rect, Shape s, boolean onStroke)
      Returns true if the rectangle (in device space) intersects with the shape (the interior, if onStroke is false, otherwise the stroked outline of the shape).
      Specified by:
      hit in class Graphics2D
      Parameters:
      rect - a rectangle (in device space).
      s - the shape to test; the current transform is applied to it first.
      onStroke - test the stroked outline only?
      Returns:
      true if the rectangle intersects the transformed shape, testing the stroked outline when onStroke is true and the interior otherwise.
    • setPaintMode

      public void setPaintMode()
      Does nothing in this SVGGraphics2D implementation.
      Specified by:
      setPaintMode in class Graphics
    • setXORMode

      public void setXORMode(Color c)
      Does nothing in this SVGGraphics2D implementation.
      Specified by:
      setXORMode in class Graphics
      Parameters:
      c - the colour to XOR with - ignored, SVG output has no XOR mode
    • getClipBounds

      public Rectangle getClipBounds()
      Returns the bounds of the user clipping region.
      Specified by:
      getClipBounds in class Graphics
      Returns:
      The clip bounds (possibly null).
      See Also:
    • getClip

      public Shape getClip()
      Returns the user clipping region. The initial default value is null.
      Specified by:
      getClip in class Graphics
      Returns:
      The user clipping region (possibly null).
      See Also:
    • setClip

      public void setClip(Shape shape)
      Sets the user clipping region.
      Specified by:
      setClip in class Graphics
      Parameters:
      shape - the new user clipping region (null permitted).
      See Also:
    • registerClip

      private String registerClip(Shape clip)
      Registers the clip so that we can later write out all the clip definitions in the DEFS element.
      Parameters:
      clip - the clip (ignored if null)
      Returns:
      the clip's reference key, or null if there is no clip
    • transformDP

      private String transformDP(double d)
      Formats a number for a transform value.
      Parameters:
      d - the value to format
      Returns:
      the formatted text
    • stopOpacity

      private static String stopOpacity(Color color)
      The stop-opacity for a gradient stop, or null when the stop is opaque.

      Deliberately not transformDP(double): that rounds to transformDP decimal places, which is zero by default because it is a coordinate setting. Alpha needs three places - a theme's fills run from #08 to #c0, i.e. 0.03 to 0.75, and rounding those to whole numbers wrote stop-opacity="0.", which is not a valid number and renders the stop as fully transparent. Every translucent gradient stop therefore vanished while a flat fill of the same colour, which goes through the separate opacity formatter, came out correctly.

      Formatted in Locale.US so a locale with a comma decimal separator cannot produce an unparseable attribute, and trailing zeroes are trimmed so a fully opaque stop written by a caller that did not guard would still read as 1.

      Parameters:
      color - the stop's colour
      Returns:
      the opacity as a decimal string, or null when the colour is fully opaque
    • geomDP

      private String geomDP(double d)
      Formats a number for a geometry value.
      Parameters:
      d - the value to format
      Returns:
      the formatted text
    • getSVGTransform

      private String getSVGTransform(AffineTransform t)
      Converts a transform to its SVG text.
      Parameters:
      t - the transform to convert
      Returns:
      the SVG transform text
    • clip

      public void clip(Shape s)
      Clips to the intersection of the current clipping region and the specified shape.

      The pre-JDK 17 API specification said this method accepts a null argument; JDK-6206189 corrected the spec — a null argument throws NPE.

      Specified by:
      clip in class Graphics2D
      Parameters:
      s - the clip shape (null not permitted).
    • clipRect

      public void clipRect(int x, int y, int width, int height)
      Clips to the intersection of the current clipping region and the specified rectangle.
      Specified by:
      clipRect in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the rectangle.
      y - the user-space y-coordinate of the top edge of the rectangle.
      width - the horizontal extent of the rectangle to intersect with the current clip.
      height - the vertical extent of that rectangle.
    • setClip

      public void setClip(int x, int y, int width, int height)
      Sets the user clipping region to the specified rectangle.
      Specified by:
      setClip in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the new clip region.
      y - the user-space y-coordinate of the top edge of the new clip region.
      width - the horizontal extent of the new user clip.
      height - the vertical extent of that rectangle.
      See Also:
    • drawLine

      public void drawLine(int x1, int y1, int x2, int y2)
      Draws a line from (x1, y1) to (x2, y2) using the current paint and stroke.
      Specified by:
      drawLine in class Graphics
      Parameters:
      x1 - the x-coordinate of the start point.
      y1 - the y-coordinate of the start point.
      x2 - the x-coordinate of the end point.
      y2 - the x-coordinate of the end point.
    • fillRect

      public void fillRect(int x, int y, int width, int height)
      Fills the specified rectangle with the current paint.
      Specified by:
      fillRect in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the rectangle.
      y - the user-space y-coordinate of the top edge of the rectangle.
      width - the rectangle width.
      height - the rectangle height.
    • clearRect

      public void clearRect(int x, int y, int width, int height)
      Clears the specified rectangle by filling it with the current background color. If the background color is null, this method will do nothing.
      Specified by:
      clearRect in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the region.
      y - the user-space y-coordinate of the top edge of the region.
      width - the horizontal extent of the region to clear with the background color.
      height - the vertical extent of that region.
      See Also:
    • drawRoundRect

      public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
      Draws a rectangle with rounded corners using the current paint and stroke.
      Specified by:
      drawRoundRect in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the bounding rectangle.
      y - the user-space y-coordinate of the top edge of the bounding rectangle.
      width - the horizontal extent of the bounding rectangle, the rounded corners included.
      height - the vertical extent of that bounding rectangle.
      arcWidth - the horizontal diameter of each corner arc, not its radius.
      arcHeight - the vertical diameter of each corner arc, not its radius.
      See Also:
    • fillRoundRect

      public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
      Fills a rectangle with rounded corners using the current paint.
      Specified by:
      fillRoundRect in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the bounding rectangle.
      y - the user-space y-coordinate of the top edge of the bounding rectangle.
      width - the horizontal extent of the bounding rectangle, the rounded corners included.
      height - the vertical extent of that bounding rectangle.
      arcWidth - the horizontal diameter of each corner arc, not its radius.
      arcHeight - the vertical diameter of each corner arc, not its radius.
      See Also:
    • drawOval

      public void drawOval(int x, int y, int width, int height)
      Draws an oval framed by the rectangle (x, y, width, height) using the current paint and stroke.
      Specified by:
      drawOval in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the oval's frame.
      y - the user-space y-coordinate of the top edge of the oval's frame.
      width - the horizontal extent of the frame the oval is inscribed in, not a radius.
      height - the vertical extent of that frame.
      See Also:
    • fillOval

      public void fillOval(int x, int y, int width, int height)
      Fills an oval framed by the rectangle (x, y, width, height).
      Specified by:
      fillOval in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the oval's frame.
      y - the user-space y-coordinate of the top edge of the oval's frame.
      width - the horizontal extent of the frame the oval is inscribed in, not a radius.
      height - the vertical extent of that frame.
      See Also:
    • drawArc

      public void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle)
      Draws an arc contained within the rectangle (x, y, width, height), starting at startAngle and continuing through arcAngle degrees using the current paint and stroke.
      Specified by:
      drawArc in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the arc's frame.
      y - the user-space y-coordinate of the top edge of the arc's frame.
      width - the horizontal extent of the frame the arc is inscribed in, not a radius.
      height - the vertical extent of that frame.
      startAngle - the start angle in degrees, 0 = 3 o'clock.
      arcAngle - the angle (anticlockwise) in degrees.
      See Also:
    • fillArc

      public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle)
      Fills an arc contained within the rectangle (x, y, width, height), starting at startAngle and continuing through arcAngle degrees, using the current paint.
      Specified by:
      fillArc in class Graphics
      Parameters:
      x - the user-space x-coordinate of the left edge of the arc's frame.
      y - the user-space y-coordinate of the top edge of the arc's frame.
      width - the horizontal extent of the frame the arc is inscribed in, not a radius.
      height - the vertical extent of that frame.
      startAngle - the start angle in degrees, 0 = 3 o'clock.
      arcAngle - the angle (anticlockwise) in degrees.
      See Also:
    • drawPolyline

      public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints)
      Draws the specified multi-segment line using the current paint and stroke.
      Specified by:
      drawPolyline in class Graphics
      Parameters:
      xPoints - the user-space x-coordinates of the vertices; only the first nPoints entries are read
      yPoints - the user-space y-coordinates of the vertices; only the first nPoints entries are read
      nPoints - the number of points to use for the polyline.
    • drawPolygon

      public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)
      Draws the specified polygon using the current paint and stroke.
      Specified by:
      drawPolygon in class Graphics
      Parameters:
      xPoints - the user-space x-coordinates of the vertices; only the first nPoints entries are read
      yPoints - the user-space y-coordinates of the vertices; only the first nPoints entries are read
      nPoints - the number of points to use for the polygon.
      See Also:
    • fillPolygon

      public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints)
      Fills the specified polygon using the current paint.
      Specified by:
      fillPolygon in class Graphics
      Parameters:
      xPoints - the user-space x-coordinates of the vertices; only the first nPoints entries are read
      yPoints - the user-space y-coordinates of the vertices; only the first nPoints entries are read
      nPoints - the number of points to use for the polygon.
      See Also:
    • getPNGBytes

      private byte[] getPNGBytes(Image img)
      Returns the bytes representing a PNG format image.
      Parameters:
      img - the image to encode (null not permitted).
      Returns:
      The bytes representing a PNG format image.
    • drawImage

      public boolean drawImage(Image img, int x, int y, ImageObserver observer)
      Draws an image at the location (x, y). Note that the observer is ignored.
      Specified by:
      drawImage in class Graphics
      Parameters:
      img - the image (null permitted...method will do nothing).
      x - the user-space x-coordinate of the top left corner of the image.
      y - the user-space y-coordinate of the top left corner of the image.
      observer - an ImageObserver; SVG output is synchronous, so it is never notified.
      Returns:
      true if there is no more drawing to be done.
    • drawImage

      public boolean drawImage(Image img, int x, int y, int w, int h, ImageObserver observer)
      Draws the image into the rectangle defined by (x, y, w, h). Note that the observer is ignored (it is not useful in this context).
      Specified by:
      drawImage in class Graphics
      Parameters:
      img - the image (null permitted...draws nothing).
      x - the user-space x-coordinate of the left edge of the target rectangle.
      y - the user-space y-coordinate of the top edge of the target rectangle.
      w - the width of the target rectangle, which the image is scaled to fit.
      h - the height of the target rectangle, which the image is scaled to fit.
      observer - an ImageObserver; SVG output is synchronous, so it is never notified.
      Returns:
      true if there is no more drawing to be done.
    • drawImage

      public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer)
      Draws an image at the location (x, y). Note that the observer is ignored.
      Specified by:
      drawImage in class Graphics
      Parameters:
      img - the image (null permitted...draws nothing).
      x - the user-space x-coordinate of the top left corner of the image.
      y - the user-space y-coordinate of the top left corner of the image.
      bgcolor - the background color (null permitted).
      observer - an ImageObserver; SVG output is synchronous, so it is never notified.
      Returns:
      true if there is no more drawing to be done.
    • drawImage

      public boolean drawImage(Image img, int x, int y, int w, int h, Color bgcolor, ImageObserver observer)
      Draws an image to the rectangle (x, y, w, h) (scaling it if required), first filling the background with the specified color. Note that the observer is ignored.
      Specified by:
      drawImage in class Graphics
      Parameters:
      img - the image to scale into the target rectangle.
      x - the user-space x-coordinate of the left edge of the target rectangle.
      y - the user-space y-coordinate of the top edge of the target rectangle.
      w - the width of the target rectangle, which the image is scaled to fit.
      h - the height of the target rectangle, which the image is scaled to fit.
      bgcolor - the background color (null permitted).
      observer - an ImageObserver; SVG output is synchronous, so it is never notified.
      Returns:
      true if the image is drawn.
    • drawImage

      public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer)
      Draws part of an image (defined by the source rectangle (sx1, sy1, sx2, sy2)) into the destination rectangle (dx1, dy1, dx2, dy2). Note that the observer is ignored.
      Specified by:
      drawImage in class Graphics
      Parameters:
      img - the image the source rectangle is read from.
      dx1 - the x-coordinate for the top left of the destination.
      dy1 - the y-coordinate for the top left of the destination.
      dx2 - the x-coordinate for the bottom right of the destination.
      dy2 - the y-coordinate for the bottom right of the destination.
      sx1 - the x-coordinate for the top left of the source.
      sy1 - the y-coordinate for the top left of the source.
      sx2 - the x-coordinate for the bottom right of the source.
      sy2 - the y-coordinate for the bottom right of the source.
      Returns:
      true if the image is drawn.
    • drawImage

      public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer)
      Draws part of an image (defined by the source rectangle (sx1, sy1, sx2, sy2)) into the destination rectangle (dx1, dy1, dx2, dy2). The destination rectangle is first cleared by filling it with the specified bgcolor. Note that the observer is ignored.
      Specified by:
      drawImage in class Graphics
      Parameters:
      img - the image the source rectangle is read from.
      dx1 - the x-coordinate for the top left of the destination.
      dy1 - the y-coordinate for the top left of the destination.
      dx2 - the x-coordinate for the bottom right of the destination.
      dy2 - the y-coordinate for the bottom right of the destination.
      sx1 - the x-coordinate for the top left of the source.
      sy1 - the y-coordinate for the top left of the source.
      sx2 - the x-coordinate for the bottom right of the source.
      sy2 - the y-coordinate for the bottom right of the source.
      bgcolor - the background color (null permitted).
      observer - an ImageObserver; SVG output is synchronous, so it is never notified.
      Returns:
      true if the image is drawn.
    • drawRenderedImage

      public void drawRenderedImage(RenderedImage img, AffineTransform xform)
      Draws the rendered image. If img is null this method does nothing.
      Specified by:
      drawRenderedImage in class Graphics2D
      Parameters:
      img - the image (null permitted).
      xform - the transform mapping image space to user space (null permitted).
    • drawRenderableImage

      public void drawRenderableImage(RenderableImage img, AffineTransform xform)
      Draws the renderable image.
      Specified by:
      drawRenderableImage in class Graphics2D
      Parameters:
      img - the renderable image.
      xform - the transform mapping image space to user space (null permitted).
    • drawImage

      public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs)
      Draws an image with the specified transform. Note that the observer is ignored.
      Specified by:
      drawImage in class Graphics2D
      Parameters:
      img - the image to draw (null permitted...draws nothing).
      xform - the transform (null permitted).
      obs - the image observer (ignored).
      Returns:
      true if the image is drawn.
    • drawImage

      public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y)
      Draws the image resulting from applying the BufferedImageOp to the specified image at the location (x, y).
      Specified by:
      drawImage in class Graphics2D
      Parameters:
      img - the image to filter and draw.
      op - the operation (null permitted).
      x - the user-space x-coordinate of the top left corner of the filtered image.
      y - the user-space y-coordinate of the top left corner of the filtered image.
    • copyArea

      public void copyArea(int x, int y, int width, int height, int dx, int dy)
      This method does nothing. The operation assumes that the output is in bitmap form, which is not the case for SVG, so we silently ignore this method call.
      Specified by:
      copyArea in class Graphics
      Parameters:
      x - ignored; SVG output has no raster buffer to copy from.
      y - ignored; SVG output has no raster buffer to copy from.
      width - the width of the area.
      height - the height of the area.
      dx - the delta x.
      dy - the delta y.
    • dispose

      public void dispose()
      This method does nothing, there are no resources to dispose.
      Specified by:
      dispose in class Graphics
    • setThemeName

      public void setThemeName(String name)
      Set the console theme, overriding inference from the SVG content.
      Parameters:
      name - one of DARK, LIGHT, MIDNIGHT or CLASSIC; null restores inference
    • detectTheme

      private SVGGraphics2D.Theme detectTheme(String svg)
      Detects the theme used in the SVG text.
      Parameters:
      svg - the SVG text to inspect
      Returns:
      the theme found
    • appendThemeDefs

      private void appendThemeDefs(SVGGraphics2D.Theme theme, StringBuilder defs)
      Appends theme-specific linear gradient definitions to the SVG defs block. Classic theme has no gradient fill (uses inline RGB colors).
      Parameters:
      theme - the detected theme.
      defs - the defs StringBuilder to append to.
    • appendThemeCSSDefs

      private void appendThemeCSSDefs(SVGGraphics2D.Theme theme, StringBuilder defs)
      Appends theme-specific CSS rule overrides (major/minor grid colors, graph stroke) to the defs block. These are appended inside the <style> element.
      Parameters:
      theme - the detected theme.
      defs - the defs StringBuilder containing the base <style> block.
    • tagAxis

      static String tagAxis(String svg)
      Retag the axis container lines so the theme's .axis rule supplies their stroke.

      Package-visible and static so the rule can be tested against the exact markup the serialiser produces, at every position the stroke width can occupy. Three separate defects lived in this one line: it was written for a <g> when the axis arrives as a bare <line>; it assumed the width led the style attribute; and its terminator consumed the closing quote when the width came last.

      Parameters:
      svg - the generated SVG
      Returns:
      the SVG with the axis lines tagged
    • postProcessSvg

      private String postProcessSvg(String svgRaw)
      Cleans up the generated SVG text.
      Parameters:
      svgRaw - the SVG text as generated
      Returns:
      the text ready to write
    • consolidateSvgGroups

      private String consolidateSvgGroups(String svg)
      Consolidates consecutive SVG <line> elements that share a CSS class into a shared <g> group. For example, 47 consecutive <line class="dash minor"/> elements become a single <g class="dash minor"> wrapper. Text consolidation is handled by the existing font class extraction and text merge steps in postProcessSvg.

      Each run is split wherever the class changes, so a line never inherits a class it was not drawn with. See groupLineRun(String) for why that matters.

      Parameters:
      svg - the post-processed SVG content.
      Returns:
      the SVG with consolidated line groups.
    • groupLineRun

      static String groupLineRun(String run)
      Groups one run of consecutive self-closing <line> elements, breaking the run into sub-runs at every class change and wrapping each classed sub-run in a <g> of that class. Sub-runs carrying no class are emitted unchanged.

      This used to take the first class in the run, strip every line's own class and wrap the whole run in it. The axis container lines are tagged class="axis" by tagAxis(String) and drawn straight after the value-axis gridlines, so a classed gridline landing in front of them with no intervening <text> - which is what the MRTG-style value axis does, since it draws each label and its gridline together - handed the whole run to the gridline's class, and the axis was restyled as a dashed gridline instead of the solid bounding box. Splitting at the class boundary keeps each line's own class, so the outcome no longer depends on the order elements happen to serialise in.

      Parameters:
      run - a run of one or more adjacent <line .../> elements
      Returns:
      the run with same-class groups collapsed; never null
    • wrapLineSubrun

      private static String wrapLineSubrun(String cssClass, CharSequence lines)
      Wraps one same-class sub-run in a group of that class, or emits it untouched when it carries no class - an unclassed sub-run would gain nothing from an empty wrapper.
      Parameters:
      cssClass - the class shared by every line in lines, or null for none
      lines - the sub-run's lines, in document order
      Returns:
      the wrapped or unchanged sub-run; never null
    • getSVGElement

      public String getSVGElement()
      Returns the SVG element that has been generated by calls to this Graphics2D implementation.
      Returns:
      The SVG element.
    • getSVGElement

      public String getSVGElement(String id)
      Returns the SVG element that has been generated by calls to this Graphics2D implementation, giving it the specified id. If id is null, the element will have no id attribute.
      Parameters:
      id - the element id (null permitted).
      Returns:
      A string containing the SVG element.
    • getSVGElement

      public String getSVGElement(String id, boolean includeDimensions, ViewBox viewBox, PreserveAspectRatio preserveAspectRatio, MeetOrSlice meetOrSlice)
      Returns the SVG element that has been generated by calls to this Graphics2D implementation, giving it the specified id. If id is null, the element will have no id attribute. This method also allows for a viewBox to be defined, along with the settings that handle scaling.
      Parameters:
      id - the element id (null permitted).
      includeDimensions - include the width and height attributes?
      viewBox - the view box specification (if null then no viewBox attribute will be defined).
      preserveAspectRatio - the value of the preserveAspectRatio attribute (if null then not attribute will be defined).
      meetOrSlice - the value of the meetOrSlice attribute.
      Returns:
      A string containing the SVG element.
    • getSVGDocument

      public String getSVGDocument()
      Returns an SVG document (this contains the content returned by the getSVGElement() method, prepended with the required document header).
      Returns:
      An SVG document.
    • getSVGImages

      public List<ImageElement> getSVGImages()
      Returns the list of image elements that have been referenced in the SVG output but not embedded. If the image files don't already exist, you can use this list as the basis for creating the image files.
      Returns:
      The list of image elements.
      See Also:
    • getElementIDs

      public Set<String> getElementIDs()
      Returns a new set containing the element IDs that have been used in output so far.
      Returns:
      The element IDs.
    • getLinearGradientElement

      private String getLinearGradientElement(String id, GradientPaint paint)
      Returns an element to represent a linear gradient. All the linear gradients that are used get written to the DEFS element in the SVG.
      Parameters:
      id - the reference id.
      paint - the GradientPaint supplying the two points, stops and fractions.
      Returns:
      The SVG element.
    • getLinearGradientElement

      private String getLinearGradientElement(String id, LinearGradientPaint paint)
      Returns an element to represent a linear gradient. All the linear gradients that are used get written to the DEFS element in the SVG.
      Parameters:
      id - the reference id.
      paint - the LinearGradientPaint supplying the two points, stops and fractions.
      Returns:
      The SVG element.
    • getRadialGradientElement

      private String getRadialGradientElement(String id, RadialGradientPaint rgp)
      Returns an element to represent a radial gradient. All the radial gradients that are used get written to the DEFS element in the SVG.
      Parameters:
      id - the reference id.
      rgp - the radial gradient.
      Returns:
      The SVG element.
    • getClipPathRef

      private String getClipPathRef()
      Returns a clip path reference for the current user clip. This is written out on all SVG elements that draw or fill shapes or text.
      Returns:
      A clip path reference.
    • expandClipPath

      private static String expandClipPath(String pathData, int padding)
      Expand a rectangular clip path by the given padding on all sides. Handles the format: d="M x y l w 0 l 0 h l -w 0 l 0 -h Z"
      Parameters:
      pathData - the full SVG path data attribute (d="...")
      padding - pixels to expand on each side
      Returns:
      expanded path data attribute, or original if format unrecognized
    • setRect

      private void setRect(int x, int y, int width, int height)
      Sets the attributes of the reusable Rectangle2D object that is used by the Graphics.drawRect(int, int, int, int) and fillRect(int, int, int, int) methods.
      Parameters:
      x - the user-space x-coordinate of the left edge of the rectangle.
      y - the user-space y-coordinate of the top edge of the rectangle.
      width - the horizontal extent to store in the reusable rectangle.
      height - the vertical extent to store in the reusable rectangle.
    • setRoundRect

      private void setRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight)
      Sets the attributes of the reusable RoundRectangle2D object that is used by the drawRoundRect(int, int, int, int, int, int) and fillRoundRect(int, int, int, int, int, int) methods.
      Parameters:
      x - the user-space x-coordinate of the left edge of the bounding rectangle.
      y - the user-space y-coordinate of the top edge of the bounding rectangle.
      width - the horizontal extent of the bounding rectangle, the rounded corners included.
      height - the vertical extent of that bounding rectangle.
      arcWidth - the arc width.
      arcHeight - the arc height.
    • setArc

      private void setArc(int x, int y, int width, int height, int startAngle, int arcAngle)
      Sets the attributes of the reusable Arc2D object that is used by drawArc(int, int, int, int, int, int) and fillArc(int, int, int, int, int, int) methods.
      Parameters:
      x - the user-space x-coordinate of the left edge of the arc's frame.
      y - the user-space y-coordinate of the top edge of the arc's frame.
      width - the horizontal extent of the frame the arc is inscribed in, not a radius.
      height - the vertical extent of that frame.
      startAngle - the start angle in degrees, 0 = 3 o'clock.
      arcAngle - the angle (anticlockwise) in degrees.
    • setOval

      private void setOval(int x, int y, int width, int height)
      Sets the attributes of the reusable Ellipse2D object that is used by the drawOval(int, int, int, int) and fillOval(int, int, int, int) methods.
      Parameters:
      x - the user-space x-coordinate of the left edge of the oval's frame.
      y - the user-space y-coordinate of the top edge of the oval's frame.
      width - the horizontal extent of the frame the oval is inscribed in, not a radius.
      height - the vertical extent of that frame.