2016-02-19 21:03:56 +01:00
|
|
|
# Go Graphics
|
|
|
|
|
|
|
|
`gg` is a library for rendering 2D graphics in pure Go.
|
|
|
|
|
2016-02-20 21:41:59 +01:00
|
|
|
![Separator](http://i.imgur.com/fsUvnPB.png)
|
|
|
|
|
2016-02-19 21:03:56 +01:00
|
|
|
## Installation
|
|
|
|
|
|
|
|
go get github.com/fogleman/gg
|
|
|
|
|
|
|
|
## Hello, Circle!
|
|
|
|
|
2016-02-19 22:49:48 +01:00
|
|
|
Look how easy!
|
|
|
|
|
2016-02-19 21:03:56 +01:00
|
|
|
```go
|
|
|
|
package main
|
|
|
|
|
|
|
|
import "github.com/fogleman/gg"
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
dc := gg.NewContext(1000, 1000)
|
|
|
|
dc.DrawCircle(500, 500, 400)
|
|
|
|
dc.SetRGB(0, 0, 0)
|
2016-02-20 02:46:19 +01:00
|
|
|
dc.Fill()
|
2016-02-19 21:03:56 +01:00
|
|
|
dc.SavePNG("out.png")
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2016-02-19 22:55:58 +01:00
|
|
|
## Creating Contexts
|
|
|
|
|
|
|
|
There are a few ways of creating a context.
|
|
|
|
|
|
|
|
```go
|
|
|
|
NewContext(width, height int) *Context
|
|
|
|
NewContextForImage(im image.Image) *Context
|
|
|
|
NewContextForRGBA(im *image.RGBA) *Context
|
|
|
|
```
|
|
|
|
|
2016-02-19 21:03:56 +01:00
|
|
|
## Drawing Functions
|
|
|
|
|
|
|
|
Ever used a graphics library that didn't have functions for drawing rectangles
|
|
|
|
or circles? What a pain!
|
|
|
|
|
|
|
|
```go
|
|
|
|
DrawLine(x1, y1, x2, y2 float64)
|
|
|
|
DrawRectangle(x, y, w, h float64)
|
2016-02-20 03:15:22 +01:00
|
|
|
DrawRoundedRectangle(x, y, w, h, r float64)
|
2016-02-19 21:03:56 +01:00
|
|
|
DrawCircle(x, y, r float64)
|
2016-02-19 22:53:13 +01:00
|
|
|
DrawArc(x, y, r, angle1, angle2 float64)
|
|
|
|
DrawEllipse(x, y, rx, ry float64)
|
|
|
|
DrawEllipticalArc(x, y, rx, ry, angle1, angle2 float64)
|
2016-02-19 21:03:56 +01:00
|
|
|
DrawImage(im image.Image, x, y int)
|
2016-02-20 03:35:56 +01:00
|
|
|
DrawImageAnchored(im image.Image, x, y int, ax, ay float64)
|
2016-02-19 21:03:56 +01:00
|
|
|
|
|
|
|
MoveTo(x, y float64)
|
|
|
|
LineTo(x, y float64)
|
|
|
|
QuadraticTo(x1, y1, x2, y2 float64)
|
2016-02-21 05:11:34 +01:00
|
|
|
CubicTo(x1, y1, x2, y2, x3, y3 float64)
|
2016-02-19 21:03:56 +01:00
|
|
|
ClosePath()
|
|
|
|
ClearPath()
|
|
|
|
|
|
|
|
Clear()
|
|
|
|
Stroke()
|
|
|
|
Fill()
|
|
|
|
StrokePreserve()
|
|
|
|
FillPreserve()
|
|
|
|
```
|
|
|
|
|
2016-02-20 04:51:46 +01:00
|
|
|
## Text Functions
|
|
|
|
|
|
|
|
```go
|
|
|
|
DrawString(s string, x, y float64)
|
|
|
|
DrawStringAnchored(s string, x, y, ax, ay float64)
|
|
|
|
MeasureString(s string) (w, h float64)
|
|
|
|
SetFontFace(fontFace font.Face)
|
|
|
|
LoadFontFace(path string, points float64)
|
|
|
|
```
|
|
|
|
|
2016-02-19 21:03:56 +01:00
|
|
|
## Color Functions
|
|
|
|
|
|
|
|
Colors can be set in several different ways for your convenience.
|
|
|
|
|
|
|
|
```go
|
2016-02-19 22:53:13 +01:00
|
|
|
SetRGB(r, g, b float64)
|
|
|
|
SetRGBA(r, g, b, a float64)
|
|
|
|
SetRGB255(r, g, b int)
|
|
|
|
SetRGBA255(r, g, b, a int)
|
2016-02-19 21:03:56 +01:00
|
|
|
SetColor(c color.Color)
|
|
|
|
SetHexColor(x string)
|
|
|
|
```
|
|
|
|
|
2016-02-19 23:12:17 +01:00
|
|
|
## Stroke & Fill Options
|
2016-02-19 21:03:56 +01:00
|
|
|
|
2016-02-19 23:12:17 +01:00
|
|
|
```go
|
|
|
|
SetLineWidth(lineWidth float64)
|
|
|
|
SetLineCap(lineCap LineCap)
|
|
|
|
SetLineJoin(lineJoin LineJoin)
|
|
|
|
SetFillRule(fillRule FillRule)
|
|
|
|
```
|
|
|
|
|
|
|
|
## Transformation Functions
|
2016-02-19 22:49:48 +01:00
|
|
|
|
2016-02-19 21:03:56 +01:00
|
|
|
```go
|
|
|
|
Identity()
|
|
|
|
Translate(x, y float64)
|
|
|
|
Scale(x, y float64)
|
|
|
|
Rotate(angle float64)
|
|
|
|
Shear(x, y float64)
|
2016-02-20 20:53:33 +01:00
|
|
|
ScaleAbout(sx, sy, x, y float64)
|
|
|
|
RotateAbout(angle, x, y float64)
|
|
|
|
ShearAbout(sx, sy, x, y float64)
|
2016-02-19 21:03:56 +01:00
|
|
|
TransformPoint(x, y float64) (tx, ty float64)
|
2016-02-20 03:00:56 +01:00
|
|
|
InvertY()
|
2016-02-19 21:03:56 +01:00
|
|
|
Push()
|
|
|
|
Pop()
|
|
|
|
```
|
2016-02-19 22:53:13 +01:00
|
|
|
|
2016-02-19 22:55:58 +01:00
|
|
|
## Helper Functions
|
|
|
|
|
|
|
|
Sometimes you just don't want to write these yourself.
|
|
|
|
|
|
|
|
```go
|
|
|
|
Radians(degrees float64) float64
|
|
|
|
Degrees(radians float64) float64
|
|
|
|
LoadPNG(path string) (image.Image, error)
|
|
|
|
SavePNG(path string, im image.Image) error
|
|
|
|
```
|
|
|
|
|
2016-02-19 22:53:13 +01:00
|
|
|
## What's Missing?
|
|
|
|
|
2016-02-20 20:45:58 +01:00
|
|
|
If you need any of the features below, I recommend using `cairo` instead. Or
|
|
|
|
even better, implement it and submit a pull request!
|
2016-02-19 22:53:13 +01:00
|
|
|
|
|
|
|
- Clipping Regions
|
|
|
|
- Gradients / Patterns
|
|
|
|
- Dashed Lines
|
2016-02-19 23:05:21 +01:00
|
|
|
|
2016-02-19 23:09:51 +01:00
|
|
|
## How Do it Do?
|
|
|
|
|
2016-02-20 20:45:58 +01:00
|
|
|
`gg` is mostly a wrapper around `github.com/golang/freetype/raster`. The goal
|
|
|
|
is to provide some more functionality and a nicer API that will suffice for
|
|
|
|
most use cases.
|
2016-02-19 23:09:51 +01:00
|
|
|
|
2016-02-19 23:05:21 +01:00
|
|
|
## Another Example
|
|
|
|
|
|
|
|
See the output of this example below.
|
|
|
|
|
|
|
|
```go
|
|
|
|
package main
|
|
|
|
|
|
|
|
import "github.com/fogleman/gg"
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
const S = 1024
|
|
|
|
dc := gg.NewContext(S, S)
|
|
|
|
dc.SetRGBA(0, 0, 0, 0.1)
|
|
|
|
for i := 0; i < 360; i += 15 {
|
|
|
|
dc.Push()
|
|
|
|
dc.RotateAbout(gg.Radians(float64(i)), S/2, S/2)
|
|
|
|
dc.DrawEllipse(S/2, S/2, S*7/16, S/8)
|
|
|
|
dc.Fill()
|
|
|
|
dc.Pop()
|
|
|
|
}
|
|
|
|
dc.SavePNG("out.png")
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
![Ellipses](http://i.imgur.com/J9CBZef.png)
|