From 1c1d089725dd9f98b7ac73276d07dbadb388b748 Mon Sep 17 00:00:00 2001 From: Christine Dodrill Date: Thu, 4 Oct 2018 19:44:06 -0700 Subject: add Dockerfile --- vendor/github.com/fogleman/gg/pattern.go | 123 +++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 vendor/github.com/fogleman/gg/pattern.go (limited to 'vendor/github.com/fogleman/gg/pattern.go') diff --git a/vendor/github.com/fogleman/gg/pattern.go b/vendor/github.com/fogleman/gg/pattern.go new file mode 100644 index 0000000..6b396ec --- /dev/null +++ b/vendor/github.com/fogleman/gg/pattern.go @@ -0,0 +1,123 @@ +package gg + +import ( + "image" + "image/color" + + "github.com/golang/freetype/raster" +) + +type RepeatOp int + +const ( + RepeatBoth RepeatOp = iota + RepeatX + RepeatY + RepeatNone +) + +type Pattern interface { + ColorAt(x, y int) color.Color +} + +// Solid Pattern +type solidPattern struct { + color color.Color +} + +func (p *solidPattern) ColorAt(x, y int) color.Color { + return p.color +} + +func NewSolidPattern(color color.Color) Pattern { + return &solidPattern{color: color} +} + +// Surface Pattern +type surfacePattern struct { + im image.Image + op RepeatOp +} + +func (p *surfacePattern) ColorAt(x, y int) color.Color { + b := p.im.Bounds() + switch p.op { + case RepeatX: + if y >= b.Dy() { + return color.Transparent + } + case RepeatY: + if x >= b.Dx() { + return color.Transparent + } + case RepeatNone: + if x >= b.Dx() || y >= b.Dy() { + return color.Transparent + } + } + x = x%b.Dx() + b.Min.X + y = y%b.Dy() + b.Min.Y + return p.im.At(x, y) +} + +func NewSurfacePattern(im image.Image, op RepeatOp) Pattern { + return &surfacePattern{im: im, op: op} +} + +type patternPainter struct { + im *image.RGBA + mask *image.Alpha + p Pattern +} + +// Paint satisfies the Painter interface. +func (r *patternPainter) Paint(ss []raster.Span, done bool) { + b := r.im.Bounds() + for _, s := range ss { + if s.Y < b.Min.Y { + continue + } + if s.Y >= b.Max.Y { + return + } + if s.X0 < b.Min.X { + s.X0 = b.Min.X + } + if s.X1 > b.Max.X { + s.X1 = b.Max.X + } + if s.X0 >= s.X1 { + continue + } + const m = 1<<16 - 1 + y := s.Y - r.im.Rect.Min.Y + x0 := s.X0 - r.im.Rect.Min.X + // RGBAPainter.Paint() in $GOPATH/src/github.com/golang/freetype/raster/paint.go + i0 := (s.Y-r.im.Rect.Min.Y)*r.im.Stride + (s.X0-r.im.Rect.Min.X)*4 + i1 := i0 + (s.X1-s.X0)*4 + for i, x := i0, x0; i < i1; i, x = i+4, x+1 { + ma := s.Alpha + if r.mask != nil { + ma = ma * uint32(r.mask.AlphaAt(x, y).A) / 255 + if ma == 0 { + continue + } + } + c := r.p.ColorAt(x, y) + cr, cg, cb, ca := c.RGBA() + dr := uint32(r.im.Pix[i+0]) + dg := uint32(r.im.Pix[i+1]) + db := uint32(r.im.Pix[i+2]) + da := uint32(r.im.Pix[i+3]) + a := (m - (ca * ma / m)) * 0x101 + r.im.Pix[i+0] = uint8((dr*a + cr*ma) / m >> 8) + r.im.Pix[i+1] = uint8((dg*a + cg*ma) / m >> 8) + r.im.Pix[i+2] = uint8((db*a + cb*ma) / m >> 8) + r.im.Pix[i+3] = uint8((da*a + ca*ma) / m >> 8) + } + } +} + +func newPatternPainter(im *image.RGBA, mask *image.Alpha, p Pattern) *patternPainter { + return &patternPainter{im, mask, p} +} -- cgit v1.2.3