Documentation
¶
Overview ¶
Package canvas defines the rendering backend abstraction. All drawing operations go through the Canvas interface, which decouples geometry rendering from the specific graphics library (gogpu/gg, SVG, etc.).
Index ¶
- Constants
- Variables
- func DrawShapePath(c Canvas, shape string, cx, cy, r float64)
- func ExportPDF(r *recording.Recording, w io.Writer) (int64, error)
- func ExportSVG(r *recording.Recording, w io.Writer) (int64, error)
- func IsStrokeShape(shape string) bool
- func Shapes() []string
- type Canvas
- type FontWeight
- type GGCanvas
- func (c *GGCanvas) Clear(col color.Color)
- func (c *GGCanvas) ClearPath()
- func (c *GGCanvas) Clip()
- func (c *GGCanvas) Close() error
- func (c *GGCanvas) ClosePath()
- func (c *GGCanvas) Context() *gg.Context
- func (c *GGCanvas) CubicTo(cx1, cy1, cx2, cy2, x, y float64)
- func (c *GGCanvas) DrawCircle(cx, cy, r float64)
- func (c *GGCanvas) DrawImage(img image.Image, x, y float64)
- func (c *GGCanvas) DrawLine(x1, y1, x2, y2 float64)
- func (c *GGCanvas) DrawRectangle(x, y, w, h float64)
- func (c *GGCanvas) DrawShape(shape string, cx, cy, r float64)
- func (c *GGCanvas) DrawStringAnchored(s string, x, y, ax, ay float64)
- func (c *GGCanvas) EncodePNG(w io.Writer) error
- func (c *GGCanvas) Fill()
- func (c *GGCanvas) FillPreserve()
- func (c *GGCanvas) Height() int
- func (c *GGCanvas) Image() image.Image
- func (c *GGCanvas) LineTo(x, y float64)
- func (c *GGCanvas) MeasureString(s string) (float64, float64)
- func (c *GGCanvas) MoveTo(x, y float64)
- func (c *GGCanvas) QuadraticTo(cx, cy, x, y float64)
- func (c *GGCanvas) Restore()
- func (c *GGCanvas) Rotate(angle float64)
- func (c *GGCanvas) Save()
- func (c *GGCanvas) SavePNG(path string) error
- func (c *GGCanvas) ScaleXY(sx, sy float64)
- func (c *GGCanvas) SetColor(col color.Color)
- func (c *GGCanvas) SetFontSize(size float64)
- func (c *GGCanvas) SetLineDash(pattern ...float64)
- func (c *GGCanvas) SetLineWidth(w float64)
- func (c *GGCanvas) SetRGBA(r, g, b, a float64)
- func (c *GGCanvas) SetTabularNums(enabled bool)
- func (c *GGCanvas) Stroke()
- func (c *GGCanvas) Translate(dx, dy float64)
- func (c *GGCanvas) Width() int
- type RecordingCanvas
- func (c *RecordingCanvas) Clear(col color.Color)
- func (c *RecordingCanvas) ClearPath()
- func (c *RecordingCanvas) Clip()
- func (c *RecordingCanvas) Close() error
- func (c *RecordingCanvas) ClosePath()
- func (c *RecordingCanvas) CubicTo(cx1, cy1, cx2, cy2, x, y float64)
- func (c *RecordingCanvas) DrawCircle(cx, cy, r float64)
- func (c *RecordingCanvas) DrawImage(_ image.Image, _, _ float64)
- func (c *RecordingCanvas) DrawLine(x1, y1, x2, y2 float64)
- func (c *RecordingCanvas) DrawRectangle(x, y, w, h float64)
- func (c *RecordingCanvas) DrawShape(shape string, cx, cy, r float64)
- func (c *RecordingCanvas) DrawStringAnchored(s string, x, y, ax, ay float64)
- func (c *RecordingCanvas) Fill()
- func (c *RecordingCanvas) FillPreserve()
- func (c *RecordingCanvas) FinishRecording() *recording.Recording
- func (c *RecordingCanvas) Height() int
- func (c *RecordingCanvas) LineTo(x, y float64)
- func (c *RecordingCanvas) MeasureString(s string) (float64, float64)
- func (c *RecordingCanvas) MoveTo(x, y float64)
- func (c *RecordingCanvas) QuadraticTo(cx, cy, x, y float64)
- func (c *RecordingCanvas) Restore()
- func (c *RecordingCanvas) Rotate(angle float64)
- func (c *RecordingCanvas) Save()
- func (c *RecordingCanvas) ScaleXY(sx, sy float64)
- func (c *RecordingCanvas) SetColor(col color.Color)
- func (c *RecordingCanvas) SetFontSize(size float64)
- func (c *RecordingCanvas) SetLineDash(pattern ...float64)
- func (c *RecordingCanvas) SetLineWidth(w float64)
- func (c *RecordingCanvas) SetRGBA(r, g, b, a float64)
- func (c *RecordingCanvas) SetTabularNums(enabled bool)
- func (c *RecordingCanvas) Stroke()
- func (c *RecordingCanvas) Translate(dx, dy float64)
- func (c *RecordingCanvas) Width() int
- type TextAnchor
Constants ¶
const ( ShapeCircle = "circle" ShapeSquare = "square" ShapeTriangle = "triangle" ShapeTriangleDown = "triangleDown" ShapeDiamond = "diamond" ShapePlus = "plus" ShapeCross = "cross" ShapeStar = "star" ShapePentagon = "pentagon" ShapeHexagon = "hexagon" )
Shape name constants — single source of truth for all shape identifiers used throughout the library (scales, drawers, legends, canvas backends).
Variables ¶
var ( AnchorTopLeft = TextAnchor{0, 0} AnchorTopCenter = TextAnchor{0.5, 0} AnchorTopRight = TextAnchor{1, 0} AnchorMiddleLeft = TextAnchor{0, 0.5} AnchorCenter = TextAnchor{0.5, 0.5} AnchorMiddleRight = TextAnchor{1, 0.5} AnchorBottomLeft = TextAnchor{0, 1} AnchorBottomCenter = TextAnchor{0.5, 1} AnchorBottomRight = TextAnchor{1, 1} )
Common text anchors.
Functions ¶
func DrawShapePath ¶ added in v0.0.8
DrawShapePath constructs a shape path using the Canvas path API. This is the fallback implementation used by RecordingCanvas and other backends that do not have native polygon primitives. GGCanvas uses gg.Context.DrawRegularPolygon directly instead — see GGCanvas.DrawShape.
func IsStrokeShape ¶ added in v0.0.8
IsStrokeShape reports whether the shape should be rendered with stroke rather than fill (i.e., line-based shapes).
Types ¶
type Canvas ¶
type Canvas interface {
// Save pushes the current graphics state (color, transform, clip) onto a stack.
Save()
// Restore pops the graphics state stack.
Restore()
// Translate shifts the origin by (dx, dy).
Translate(dx, dy float64)
// Rotate applies a rotation of angle radians around the current origin.
Rotate(angle float64)
// ScaleXY applies a non-uniform scale.
ScaleXY(sx, sy float64)
// MoveTo starts a new sub-path at (x, y).
MoveTo(x, y float64)
// LineTo adds a line segment from the current point to (x, y).
LineTo(x, y float64)
// QuadraticTo adds a quadratic Bézier curve to (x, y) via control point (cx, cy).
QuadraticTo(cx, cy, x, y float64)
// CubicTo adds a cubic Bézier curve to (x, y) via control points (cx1, cy1) and (cx2, cy2).
CubicTo(cx1, cy1, cx2, cy2, x, y float64)
// ClosePath closes the current sub-path with a line to the start point.
ClosePath()
// ClearPath discards the current path without drawing.
ClearPath()
// SetColor sets the current drawing color for both fill and stroke.
SetColor(c color.Color)
// SetRGBA sets the current drawing color from normalized components.
SetRGBA(r, g, b, a float64)
// SetLineWidth sets the stroke width in pixels.
SetLineWidth(w float64)
// SetLineDash sets the dash pattern. Pass nil or empty for solid lines.
SetLineDash(pattern ...float64)
// Fill fills the current path with the current color, then clears the path.
Fill()
// Stroke draws the current path outline, then clears the path.
Stroke()
// FillPreserve fills without clearing the path (allows subsequent stroke).
FillPreserve()
// Clip clips rendering to the current path. Call after constructing a path
// (e.g. DrawRectangle). Use Save/Restore to undo the clip.
Clip()
// DrawCircle adds a circle path centered at (cx, cy) with radius r.
DrawCircle(cx, cy, r float64)
// DrawRectangle adds a rectangle path at (x, y) with dimensions (w, h).
DrawRectangle(x, y, w, h float64)
// DrawLine adds a line path from (x1, y1) to (x2, y2).
DrawLine(x1, y1, x2, y2 float64)
// DrawShape adds a path for the specified shape centered at (cx, cy) with size/radius r.
// Supported shapes: "circle", "square", "triangle", "diamond", "triangleDown",
// "plus", "cross", "star", "pentagon", "hexagon".
DrawShape(shape string, cx, cy, r float64)
// SetFontSize sets the font size in points.
SetFontSize(size float64)
// SetTabularNums enables or disables tabular (monospaced) digit widths
// for subsequent text rendering. When enabled, digits occupy uniform
// horizontal space for aligned numeric columns (e.g., axis tick labels).
// Backends that don't support OpenType features may ignore this.
SetTabularNums(enabled bool)
// DrawStringAnchored draws text at (x, y) with anchor (ax, ay) ∈ [0,1].
// (0,0) = top-left, (0.5,0.5) = center, (1,1) = bottom-right.
DrawStringAnchored(text string, x, y, ax, ay float64)
// MeasureString returns the width and height of the rendered text.
MeasureString(text string) (w, h float64)
// Clear fills the entire canvas with the given color.
Clear(c color.Color)
// Width returns the canvas width in pixels.
Width() int
// Height returns the canvas height in pixels.
Height() int
// DrawImage composites the given image onto the canvas at position (x, y).
// Used for compositing panel sub-canvases during parallel rendering.
DrawImage(img image.Image, x, y float64)
// Close releases backend resources (GPU buffers, etc.).
// Implementations that hold no resources may return nil.
Close() error
}
Canvas is the core rendering abstraction. Implementations provide the actual drawing primitives targeting specific backends (CPU rasterizer, GPU pipeline, SVG writer, etc.).
The API is modeled after gogpu/gg's Context for natural integration, but abstracted so alternative backends can be swapped without changing any rendering logic.
type FontWeight ¶
type FontWeight int
FontWeight describes font weight for text rendering.
const ( WeightNormal FontWeight = 400 WeightBold FontWeight = 700 )
FontWeight constants for common weights.
type GGCanvas ¶
type GGCanvas struct {
// contains filtered or unexported fields
}
GGCanvas wraps a gogpu/gg.Context to implement the Canvas interface. This is the primary CPU-based rendering backend.
func FromGGContext ¶
FromGGContext wraps an existing gg.Context.
func NewGGCanvas ¶
NewGGCanvas creates a Canvas backed by a gogpu/gg rasterizer.
func NewGGCanvasCPU ¶ added in v0.0.5
NewGGCanvasCPU creates a Canvas that uses pure-CPU analytic rasterization, bypassing the GPU accelerator. This produces deterministic output even when multiple canvases are created in a single process (useful for tests).
func (*GGCanvas) ClearPath ¶
func (c *GGCanvas) ClearPath()
ClearPath discards the current path without drawing.
func (*GGCanvas) Close ¶ added in v0.0.5
Close releases the underlying gg.Context's GPU resources. Always call Close (or use defer) when the canvas is no longer needed to avoid GPU resource leaks (wgpu BindGroup/Buffer finalizer warnings).
func (*GGCanvas) Context ¶
Context returns the underlying gg.Context for direct access when needed (e.g., font loading, image export).
func (*GGCanvas) CubicTo ¶
CubicTo adds a cubic Bézier curve via (cx1, cy1) and (cx2, cy2) to (x, y).
func (*GGCanvas) DrawCircle ¶
DrawCircle adds a circle path centered at (cx, cy) with radius r.
func (*GGCanvas) DrawImage ¶ added in v0.0.6
DrawImage composites img onto the canvas at pixel position (x, y).
func (*GGCanvas) DrawRectangle ¶
DrawRectangle adds a rectangle path at (x, y) with dimensions (w, h).
func (*GGCanvas) DrawShape ¶ added in v0.0.8
DrawShape adds a path for the specified shape centered at (cx, cy) with size/radius r. Uses gg.Context.DrawRegularPolygon for polygon shapes for optimal rendering.
func (*GGCanvas) DrawStringAnchored ¶
DrawStringAnchored draws text at (x, y) with anchor (ax, ay).
func (*GGCanvas) Fill ¶
func (c *GGCanvas) Fill()
Fill fills the current path with the current color, then clears the path.
func (*GGCanvas) FillPreserve ¶
func (c *GGCanvas) FillPreserve()
FillPreserve fills without clearing the path (allows subsequent stroke).
func (*GGCanvas) MeasureString ¶
MeasureString returns the width and height of the rendered text.
func (*GGCanvas) QuadraticTo ¶
QuadraticTo adds a quadratic Bézier curve via control point (cx, cy) to (x, y).
func (*GGCanvas) Restore ¶
func (c *GGCanvas) Restore()
Restore pops the graphics state from the stack.
func (*GGCanvas) Save ¶
func (c *GGCanvas) Save()
Save pushes the current graphics state onto the stack.
func (*GGCanvas) SetFontSize ¶
SetFontSize resolves the best available font at the given size. Resolution order: system font via fonts resolver -> embedded Go Regular fallback.
func (*GGCanvas) SetLineDash ¶
SetLineDash sets the dash pattern. Pass nil or empty for solid lines.
func (*GGCanvas) SetLineWidth ¶
SetLineWidth sets the stroke width in pixels.
func (*GGCanvas) SetTabularNums ¶ added in v0.0.5
SetTabularNums enables or disables tabular (monospaced) digit widths.
func (*GGCanvas) Stroke ¶
func (c *GGCanvas) Stroke()
Stroke draws the current path outline, then clears the path.
type RecordingCanvas ¶
type RecordingCanvas struct {
// contains filtered or unexported fields
}
RecordingCanvas wraps a recording.Recorder to implement the Canvas interface. All drawing operations are captured as a recording that can later be replayed into any backend (SVG, PDF, raster, etc.) via [Recording.Playback].
func NewRecordingCanvas ¶
func NewRecordingCanvas(width, height int) *RecordingCanvas
NewRecordingCanvas creates a Canvas that records all drawing operations. After rendering, call RecordingCanvas.FinishRecording and replay into the desired backend (e.g., SVG, PDF).
func (*RecordingCanvas) Clear ¶
func (c *RecordingCanvas) Clear(col color.Color)
Clear fills the entire canvas with the given color.
func (*RecordingCanvas) ClearPath ¶
func (c *RecordingCanvas) ClearPath()
ClearPath discards the current path without drawing.
func (*RecordingCanvas) Clip ¶
func (c *RecordingCanvas) Clip()
Clip clips rendering to the current path.
func (*RecordingCanvas) Close ¶ added in v0.0.5
func (c *RecordingCanvas) Close() error
Close is a no-op for RecordingCanvas (no GPU resources to release).
func (*RecordingCanvas) ClosePath ¶
func (c *RecordingCanvas) ClosePath()
ClosePath closes the current sub-path.
func (*RecordingCanvas) CubicTo ¶
func (c *RecordingCanvas) CubicTo(cx1, cy1, cx2, cy2, x, y float64)
CubicTo adds a cubic Bézier curve via (cx1, cy1) and (cx2, cy2) to (x, y).
func (*RecordingCanvas) DrawCircle ¶
func (c *RecordingCanvas) DrawCircle(cx, cy, r float64)
DrawCircle adds a circle path centered at (cx, cy) with radius r.
func (*RecordingCanvas) DrawImage ¶ added in v0.0.6
func (c *RecordingCanvas) DrawImage(_ image.Image, _, _ float64)
DrawImage is a no-op for RecordingCanvas. SVG/PDF recording does not support raster compositing; parallel panel rendering is only used by raster backends (GGCanvas).
func (*RecordingCanvas) DrawLine ¶
func (c *RecordingCanvas) DrawLine(x1, y1, x2, y2 float64)
DrawLine adds a line path from (x1, y1) to (x2, y2).
func (*RecordingCanvas) DrawRectangle ¶
func (c *RecordingCanvas) DrawRectangle(x, y, w, h float64)
DrawRectangle adds a rectangle path at (x, y) with dimensions (w, h).
func (*RecordingCanvas) DrawShape ¶ added in v0.0.8
func (c *RecordingCanvas) DrawShape(shape string, cx, cy, r float64)
DrawShape adds a path for the specified shape centered at (cx, cy) with size/radius r.
func (*RecordingCanvas) DrawStringAnchored ¶
func (c *RecordingCanvas) DrawStringAnchored(s string, x, y, ax, ay float64)
DrawStringAnchored draws text at (x, y) with anchor (ax, ay).
func (*RecordingCanvas) Fill ¶
func (c *RecordingCanvas) Fill()
Fill fills the current path with the current color, then clears the path.
func (*RecordingCanvas) FillPreserve ¶
func (c *RecordingCanvas) FillPreserve()
FillPreserve fills without clearing the path (allows subsequent stroke).
func (*RecordingCanvas) FinishRecording ¶
func (c *RecordingCanvas) FinishRecording() *recording.Recording
FinishRecording completes the recording and returns the captured operations.
func (*RecordingCanvas) Height ¶
func (c *RecordingCanvas) Height() int
Height returns the canvas height in pixels.
func (*RecordingCanvas) LineTo ¶
func (c *RecordingCanvas) LineTo(x, y float64)
LineTo adds a line segment from the current point to (x, y).
func (*RecordingCanvas) MeasureString ¶
func (c *RecordingCanvas) MeasureString(s string) (float64, float64)
MeasureString returns the width and height of the rendered text.
func (*RecordingCanvas) MoveTo ¶
func (c *RecordingCanvas) MoveTo(x, y float64)
MoveTo starts a new sub-path at (x, y).
func (*RecordingCanvas) QuadraticTo ¶
func (c *RecordingCanvas) QuadraticTo(cx, cy, x, y float64)
QuadraticTo adds a quadratic Bézier curve via control point (cx, cy) to (x, y).
func (*RecordingCanvas) Restore ¶
func (c *RecordingCanvas) Restore()
Restore pops the graphics state from the stack.
func (*RecordingCanvas) Rotate ¶
func (c *RecordingCanvas) Rotate(angle float64)
Rotate applies a rotation of angle radians.
func (*RecordingCanvas) Save ¶
func (c *RecordingCanvas) Save()
Save pushes the current graphics state onto the stack.
func (*RecordingCanvas) ScaleXY ¶
func (c *RecordingCanvas) ScaleXY(sx, sy float64)
ScaleXY applies a non-uniform scale.
func (*RecordingCanvas) SetColor ¶
func (c *RecordingCanvas) SetColor(col color.Color)
SetColor sets the current drawing color for both fill and stroke.
func (*RecordingCanvas) SetFontSize ¶
func (c *RecordingCanvas) SetFontSize(size float64)
SetFontSize resolves the best available font at the given size.
func (*RecordingCanvas) SetLineDash ¶
func (c *RecordingCanvas) SetLineDash(pattern ...float64)
SetLineDash sets the dash pattern. Pass nil or empty for solid lines.
func (*RecordingCanvas) SetLineWidth ¶
func (c *RecordingCanvas) SetLineWidth(w float64)
SetLineWidth sets the stroke width in pixels.
func (*RecordingCanvas) SetRGBA ¶
func (c *RecordingCanvas) SetRGBA(r, g, b, a float64)
SetRGBA sets the current drawing color from normalized components.
func (*RecordingCanvas) SetTabularNums ¶ added in v0.0.5
func (c *RecordingCanvas) SetTabularNums(enabled bool)
SetTabularNums enables or disables tabular (monospaced) digit widths.
func (*RecordingCanvas) Stroke ¶
func (c *RecordingCanvas) Stroke()
Stroke draws the current path outline, then clears the path.
func (*RecordingCanvas) Translate ¶
func (c *RecordingCanvas) Translate(dx, dy float64)
Translate shifts the origin by (dx, dy).
func (*RecordingCanvas) Width ¶
func (c *RecordingCanvas) Width() int
Width returns the canvas width in pixels.
type TextAnchor ¶
type TextAnchor struct {
X, Y float64 // [0,1] where (0,0) = top-left, (1,1) = bottom-right
}
TextAnchor defines text alignment as normalized coordinates.