255 lines
7.7 KiB
Go
255 lines
7.7 KiB
Go
// Copyright 2010 The draw2d Authors. All rights reserved.
|
|
// created: 13/12/2010 by Laurent Le Goff
|
|
|
|
// Package draw2d is a pure go 2D vector graphics library with support
|
|
// for multiple output devices such as images (draw2d), pdf documents
|
|
// (draw2dpdf) and opengl (draw2dgl), which can also be used on the
|
|
// google app engine. It can be used as a pure go Cairo alternative.
|
|
// draw2d is released under the BSD license.
|
|
//
|
|
// Features
|
|
//
|
|
// Operations in draw2d include stroking and filling polygons, arcs,
|
|
// Bézier curves, drawing images and text rendering with truetype fonts.
|
|
// All drawing operations can be transformed by affine transformations
|
|
// (scale, rotation, translation).
|
|
//
|
|
// Package draw2d follows the conventions of http://www.w3.org/TR/2dcontext for coordinate system, angles, etc...
|
|
//
|
|
// Installation
|
|
//
|
|
// To install or update the package draw2d on your system, run:
|
|
// go get -u github.com/llgcode/draw2d
|
|
//
|
|
// Quick Start
|
|
//
|
|
// Package draw2d itself provides a graphic context that can draw vector
|
|
// graphics and text on an image canvas. The following Go code
|
|
// generates a simple drawing and saves it to an image file:
|
|
// package main
|
|
//
|
|
// import (
|
|
// "github.com/llgcode/draw2d/draw2dimg"
|
|
// "image"
|
|
// "image/color"
|
|
// )
|
|
//
|
|
// func main() {
|
|
// // Initialize the graphic context on an RGBA image
|
|
// dest := image.NewRGBA(image.Rect(0, 0, 297, 210.0))
|
|
// gc := draw2dimg.NewGraphicContext(dest)
|
|
//
|
|
// // Set some properties
|
|
// gc.SetFillColor(color.RGBA{0x44, 0xff, 0x44, 0xff})
|
|
// gc.SetStrokeColor(color.RGBA{0x44, 0x44, 0x44, 0xff})
|
|
// gc.SetLineWidth(5)
|
|
//
|
|
// // Draw a closed shape
|
|
// gc.MoveTo(10, 10) // should always be called first for a new path
|
|
// gc.LineTo(100, 50)
|
|
// gc.QuadCurveTo(100, 10, 10, 10)
|
|
// gc.Close()
|
|
// gc.FillStroke()
|
|
//
|
|
// // Save to file
|
|
// draw2dimg.SaveToPngFile("hello.png", dest)
|
|
// }
|
|
//
|
|
//
|
|
// There are more examples here:
|
|
// https://github.com/llgcode/draw2d/tree/master/samples
|
|
//
|
|
// Drawing on pdf documents is provided by the draw2dpdf package.
|
|
// Drawing on opengl is provided by the draw2dgl package.
|
|
// See subdirectories at the bottom of this page.
|
|
//
|
|
// Testing
|
|
//
|
|
// The samples are run as tests from the root package folder `draw2d` by:
|
|
// go test ./...
|
|
//
|
|
// Or if you want to run with test coverage:
|
|
// go test -cover ./... | grep -v "no test"
|
|
//
|
|
// This will generate output by the different backends in the output folder.
|
|
//
|
|
// Acknowledgments
|
|
//
|
|
// Laurent Le Goff wrote this library, inspired by Postscript and
|
|
// HTML5 canvas. He implemented the image and opengl backend with the
|
|
// freetype-go package. Also he created a pure go Postscript
|
|
// interpreter, which can read postscript images and draw to a draw2d
|
|
// graphic context (https://github.com/llgcode/ps). Stani Michiels
|
|
// implemented the pdf backend with the gofpdf package.
|
|
//
|
|
// Packages using draw2d
|
|
//
|
|
// - https://github.com/llgcode/ps: Postscript interpreter written in Go
|
|
//
|
|
// - https://github.com/gonum/plot: drawing plots in Go
|
|
//
|
|
// - https://github.com/muesli/smartcrop: content aware image cropping
|
|
//
|
|
// - https://github.com/peterhellberg/karta: drawing Voronoi diagrams
|
|
//
|
|
// - https://github.com/vdobler/chart: basic charts in Go
|
|
package draw2d
|
|
|
|
import "image/color"
|
|
|
|
// FillRule defines the type for fill rules
|
|
type FillRule int
|
|
|
|
const (
|
|
// FillRuleEvenOdd determines the "insideness" of a point in the shape
|
|
// by drawing a ray from that point to infinity in any direction
|
|
// and counting the number of path segments from the given shape that the ray crosses.
|
|
// If this number is odd, the point is inside; if even, the point is outside.
|
|
FillRuleEvenOdd FillRule = iota
|
|
// FillRuleWinding determines the "insideness" of a point in the shape
|
|
// by drawing a ray from that point to infinity in any direction
|
|
// and then examining the places where a segment of the shape crosses the ray.
|
|
// Starting with a count of zero, add one each time a path segment crosses
|
|
// the ray from left to right and subtract one each time
|
|
// a path segment crosses the ray from right to left. After counting the crossings,
|
|
// if the result is zero then the point is outside the path. Otherwise, it is inside.
|
|
FillRuleWinding
|
|
)
|
|
|
|
// LineCap is the style of line extremities
|
|
type LineCap int
|
|
|
|
const (
|
|
// RoundCap defines a rounded shape at the end of the line
|
|
RoundCap LineCap = iota
|
|
// ButtCap defines a squared shape exactly at the end of the line
|
|
ButtCap
|
|
// SquareCap defines a squared shape at the end of the line
|
|
SquareCap
|
|
)
|
|
|
|
func (cap LineCap) String() string {
|
|
return map[LineCap]string{
|
|
RoundCap: "round",
|
|
ButtCap: "cap",
|
|
SquareCap: "square",
|
|
}[cap]
|
|
}
|
|
|
|
// LineJoin is the style of segments joint
|
|
type LineJoin int
|
|
|
|
const (
|
|
// BevelJoin represents cut segments joint
|
|
BevelJoin LineJoin = iota
|
|
// RoundJoin represents rounded segments joint
|
|
RoundJoin
|
|
// MiterJoin represents peaker segments joint
|
|
MiterJoin
|
|
)
|
|
|
|
func (join LineJoin) String() string {
|
|
return map[LineJoin]string{
|
|
RoundJoin: "round",
|
|
BevelJoin: "bevel",
|
|
MiterJoin: "miter",
|
|
}[join]
|
|
}
|
|
|
|
// StrokeStyle keeps stroke style attributes
|
|
// that is used by the Stroke method of a Drawer
|
|
type StrokeStyle struct {
|
|
// Color defines the color of stroke
|
|
Color color.Color
|
|
// Line width
|
|
Width float64
|
|
// Line cap style rounded, butt or square
|
|
LineCap LineCap
|
|
// Line join style bevel, round or miter
|
|
LineJoin LineJoin
|
|
// offset of the first dash
|
|
DashOffset float64
|
|
// array represented dash length pair values are plain dash and impair are space between dash
|
|
// if empty display plain line
|
|
Dash []float64
|
|
}
|
|
|
|
// SolidFillStyle define style attributes for a solid fill style
|
|
type SolidFillStyle struct {
|
|
// Color defines the line color
|
|
Color color.Color
|
|
// FillRule defines the file rule to used
|
|
FillRule FillRule
|
|
}
|
|
|
|
// Valign Vertical Alignment of the text
|
|
type Valign int
|
|
|
|
const (
|
|
// ValignTop top align text
|
|
ValignTop Valign = iota
|
|
// ValignCenter centered text
|
|
ValignCenter
|
|
// ValignBottom bottom aligned text
|
|
ValignBottom
|
|
// ValignBaseline align text with the baseline of the font
|
|
ValignBaseline
|
|
)
|
|
|
|
// Halign Horizontal Alignment of the text
|
|
type Halign int
|
|
|
|
const (
|
|
// HalignLeft Horizontally align to left
|
|
HalignLeft = iota
|
|
// HalignCenter Horizontally align to center
|
|
HalignCenter
|
|
// HalignRight Horizontally align to right
|
|
HalignRight
|
|
)
|
|
|
|
// TextStyle describe text property
|
|
type TextStyle struct {
|
|
// Color defines the color of text
|
|
Color color.Color
|
|
// Size font size
|
|
Size float64
|
|
// The font to use
|
|
Font FontData
|
|
// Horizontal Alignment of the text
|
|
Halign Halign
|
|
// Vertical Alignment of the text
|
|
Valign Valign
|
|
}
|
|
|
|
// ScalingPolicy is a constant to define how to scale an image
|
|
type ScalingPolicy int
|
|
|
|
const (
|
|
// ScalingNone no scaling applied
|
|
ScalingNone ScalingPolicy = iota
|
|
// ScalingStretch the image is stretched so that its width and height are exactly the given width and height
|
|
ScalingStretch
|
|
// ScalingWidth the image is scaled so that its width is exactly the given width
|
|
ScalingWidth
|
|
// ScalingHeight the image is scaled so that its height is exactly the given height
|
|
ScalingHeight
|
|
// ScalingFit the image is scaled to the largest scale that allow the image to fit within a rectangle width x height
|
|
ScalingFit
|
|
// ScalingSameArea the image is scaled so that its area is exactly the area of the given rectangle width x height
|
|
ScalingSameArea
|
|
// ScalingFill the image is scaled to the smallest scale that allow the image to fully cover a rectangle width x height
|
|
ScalingFill
|
|
)
|
|
|
|
// ImageScaling style attributes used to display the image
|
|
type ImageScaling struct {
|
|
// Horizontal Alignment of the image
|
|
Halign Halign
|
|
// Vertical Alignment of the image
|
|
Valign Valign
|
|
// Width Height used by scaling policy
|
|
Width, Height float64
|
|
// ScalingPolicy defines the scaling policy to applied to the image
|
|
ScalingPolicy ScalingPolicy
|
|
}
|