svg

package
v0.0.0-...-565ec50 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 29, 2026 License: Apache-2.0 Imports: 9 Imported by: 0

README

SVG Utilities

1. Introduction

This package provides ways to render paths and shapes as SVG documents.

It makes use of the encoding/xml package within the standard library.

This package is not intended as a full SVG implementation. It simply provides a way to output the paths and shapes created in graphics2d as SVG. The separate xml/svg package provides ways of converting an SVG document into a Renderable.

2. MarshallXML

Path and Shape both implement the xml.Marshaler interface allowing calls to xml.Marshal to be made with either type as an argument. The result will be a snippet of XML.

Path

This produces an SVG path element with the d attribute containing the path steps. Since SVG doesn't handle high order steps, the path is flattened prior to marshaling.

Shape

SVG doesn't have an explicit shape element so the group element is used instead. All the paths in a shape will be marshaled under a single group.

3. Rendering

The rendering functions follow the same pattern as the image rendering ones. Where an image was previously provided, now an XML encoder is used.

The two rendering functions supported are:

Caveats
  • Clipped shapes are not supported in the SVG encoding. An error will be returned if clipping has been used.
  • Only monotone fillers are supported. The color used to fill a shape is taken from the color value at (0, 0) in the filler image.

4. Renderable

The Renderable type is rendered in SVG using RenderRenderable. The same caveats mentioned in section 3 apply.

5. SVG Wrapper

A convenience function, NewEncoder, is supplied that wraps an io.Writer in an xml.Encoder with the standard SVG element already applied.

Another function, Complete, writes the trailing SVG token at the end.

6. Image Conversion

Image provides a way to encode an Image as an SVG image element. The image is first converted to PNG format and then stored base64 encoded in the image xlink:href attribute.

Documentation

Overview

Package svg contains functions for creating SVG documents from shapes and paths.

Index

Examples

Constants

View Source
const (
	SVGHeader = "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">"
	SVGFooter = "</svg>"
)

Variables

This section is empty.

Functions

func Complete

func Complete(w io.Writer)

Complete adds the SVG footer to w.

func DrawShape

func DrawShape(enc *xml.Encoder, shape *g2d.Shape, pen *g2d.Pen) error

DrawShape writes SVG describing the shape as rendered by the pen to the encoder.

Example
package main

import (
	"bytes"
	"fmt"

	g2d "github.com/jphsd/graphics2d"
	"github.com/jphsd/graphics2d/color"
	"github.com/jphsd/graphics2d/svg"
)

func main() {
	s := g2d.NewShape(g2d.Circle([]float64{200, 200}, 100))
	pen := g2d.NewPen(color.Red, 3)

	b := &bytes.Buffer{}
	enc := svg.NewEncoder(b)
	svg.DrawShape(enc, s, pen)
	svg.Complete(b)

	fmt.Println(b.String())
}
Output:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g fill="#ff0000"><path d="M 300.75 200.00 L 300.26 209.96 298.80 219.75 296.40 229.30 293.08 238.56 288.88 247.44 283.82 255.90 277.93 263.85 271.24 271.24 263.85 277.93 255.90 283.82 247.44 288.88 238.56 293.08 229.30 296.40 219.75 298.80 209.96 300.26 200.00 300.75 190.04 300.26 180.25 298.80 170.70 296.40 161.44 293.08 152.56 288.88 144.10 283.82 136.15 277.93 128.76 271.24 122.07 263.85 116.18 255.90 111.12 247.44 106.92 238.56 103.60 229.30 101.20 219.75 99.74 209.96 99.25 200.00 99.74 190.04 101.20 180.25 103.60 170.70 106.92 161.44 111.12 152.56 116.18 144.10 122.07 136.15 128.76 128.76 136.15 122.07 144.10 116.18 152.56 111.12 161.44 106.92 170.70 103.60 180.25 101.20 190.04 99.74 200.00 99.25 209.96 99.74 219.75 101.20 229.30 103.60 238.56 106.92 247.44 111.12 255.90 116.18 263.85 122.07 271.24 128.76 277.93 136.15 283.82 144.10 288.88 152.56 293.08 161.44 296.40 170.70 298.80 180.25 300.26 190.04 300.75 200.00 z"></path><path d="M 299.25 200.00 L 298.76 190.19 297.33 180.55 294.96 171.13 291.70 162.02 287.56 153.26 282.57 144.94 276.77 137.10 270.18 129.82 262.90 123.23 255.06 117.43 246.74 112.44 237.98 108.30 228.87 105.04 219.45 102.67 209.81 101.24 200.00 100.75 190.19 101.24 180.55 102.67 171.13 105.04 162.02 108.30 153.26 112.44 144.94 117.43 137.10 123.23 129.82 129.82 123.23 137.10 117.43 144.94 112.44 153.26 108.30 162.02 105.04 171.13 102.67 180.55 101.24 190.19 100.75 200.00 101.24 209.81 102.67 219.45 105.04 228.87 108.30 237.98 112.44 246.74 117.43 255.06 123.23 262.90 129.82 270.18 137.10 276.77 144.94 282.57 153.26 287.56 162.02 291.70 171.13 294.96 180.55 297.33 190.19 298.76 200.00 299.25 209.81 298.76 219.45 297.33 228.87 294.96 237.98 291.70 246.74 287.56 255.06 282.57 262.90 276.77 270.18 270.18 276.77 262.90 282.57 255.06 287.56 246.74 291.70 237.98 294.96 228.87 297.33 219.45 298.76 209.81 299.25 200.00 z"></path></g></svg>

func Image

func Image(enc *xml.Encoder, img image.Image, id string) error

Image writes img to the encoder as a base64 encoded png using the <image> element.

Example
package main

import (
	"bytes"
	"fmt"

	g2d "github.com/jphsd/graphics2d"
	"github.com/jphsd/graphics2d/color"
	"github.com/jphsd/graphics2d/image"
	"github.com/jphsd/graphics2d/svg"
)

func main() {
	s := g2d.NewShape(g2d.Circle([]float64{200, 200}, 100))
	img := image.NewRGBA(400, 400, color.White)
	pen := g2d.NewPen(color.Red, 3)
	g2d.DrawShape(img, s, pen)

	b := &bytes.Buffer{}
	enc := svg.NewEncoder(b)
	svg.Image(enc, img, "")
	svg.Complete(b)

	fmt.Println(b.String())
}
Output:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><image width="400" height="400" xlink:href="data:image/png;base64,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i9TZs27zmJ+vV19VdbWyszV+vMaN43FVCY9gJZO333bf5AUFOnJEGRkaNcqVa9AgNW7se7LQXLyowkL3T1ixQhUV6tjRRSovT9de63syNBCClXxqarRli/u2X7ZMp0+rVSsNHKjcXFeu7Oy4exhXMKjiYtepoiI39kcfKTNTo0e7Tg0cqJQU3/OhQRGsJBYIaP16d1VVWKiSEtW+AtfAga5cubm67jpv8QoG3dVrUZEbbMsWV1VJPXq4qW6+WbfeqqZN/QwG3wgW/uz48bpAFBVp/37VvlviTTepZ09lZbmPHj301a/G6m//8EPt2+eiWVKivXu1bZtOnXJ/3r17XT1zc9W2baz+dthBsPApx47VlWvHDh04cOl1bDIz6+JV26+OHXXZZUpPV0aG+0hN/aL/Z3W1KircR2WlPv5YR45cKlRJSd0eSnJbp27d1L9/Xad4YDo+iWDhCwWDKi2ty8pfEnPkyGe88GlaWl25ahMm1eWptlOffrZQo0YuebXt+0sHO3WKu5toiCcEC+E7d87tvMrKLvXor9tU+4V0KV5/HbLaL9q3dzupZs18/0tgDMECYAbbbwBmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZhAsAGYQLABmECwAZvx/AAAA//+r4mCQWD/KpgAAAABJRU5ErkJggg=="></image></svg>

func NewEncoder

func NewEncoder(w io.Writer) *xml.Encoder

NewEncoder returns an xml.Encoder wrapped around w that's already had the SVG header written to it.

func RenderColoredShape

func RenderColoredShape(enc *xml.Encoder, shape *g2d.Shape, col color.Color) error

RenderColoredShape writes SVG describing the shape and its color to the encoder.

Example
package main

import (
	"bytes"
	"fmt"

	g2d "github.com/jphsd/graphics2d"
	"github.com/jphsd/graphics2d/color"
	"github.com/jphsd/graphics2d/svg"
)

func main() {
	s := g2d.NewShape(g2d.Circle([]float64{200, 200}, 100))

	b := &bytes.Buffer{}
	enc := svg.NewEncoder(b)
	svg.RenderColoredShape(enc, s, color.Red)
	svg.Complete(b)

	fmt.Println(b.String())
}
Output:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g fill="#ff0000"><path d="M 300.00 200.00 L 299.51 209.88 298.06 219.60 295.68 229.08 292.39 238.27 288.22 247.09 283.20 255.48 277.35 263.38 270.71 270.71 263.38 277.35 255.48 283.20 247.09 288.22 238.27 292.39 229.08 295.68 219.60 298.06 209.88 299.51 200.00 300.00 190.12 299.51 180.40 298.06 170.92 295.68 161.73 292.39 152.91 288.22 144.52 283.20 136.62 277.35 129.29 270.71 122.65 263.38 116.80 255.48 111.78 247.09 107.61 238.27 104.32 229.08 101.94 219.60 100.49 209.88 100.00 200.00 100.49 190.12 101.94 180.40 104.32 170.92 107.61 161.73 111.78 152.91 116.80 144.52 122.65 136.62 129.29 129.29 136.62 122.65 144.52 116.80 152.91 111.78 161.73 107.61 170.92 104.32 180.40 101.94 190.12 100.49 200.00 100.00 209.88 100.49 219.60 101.94 229.08 104.32 238.27 107.61 247.09 111.78 255.48 116.80 263.38 122.65 270.71 129.29 277.35 136.62 283.20 144.52 288.22 152.91 292.39 161.73 295.68 170.92 298.06 180.40 299.51 190.12 300.00 200.00 z"></path></g></svg>

func RenderRenderable

func RenderRenderable(enc *xml.Encoder, r *g2d.Renderable, xfm g2d.Transform) error

RenderRenderable renders the shapes in the renderable with their respective fillers after being transformed.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL