112 lines
2.9 KiB
Go
112 lines
2.9 KiB
Go
package identicon
|
|
|
|
import (
|
|
"math"
|
|
|
|
"git.mstar.dev/mstar/canvas"
|
|
mathutils "git.mstar.dev/mstar/goutils/math"
|
|
)
|
|
|
|
type shape struct {
|
|
canvas *canvas.Canvas
|
|
hash int
|
|
primary string
|
|
secondary string
|
|
pos vec2
|
|
scale float64
|
|
cellSize int
|
|
strokeColor string
|
|
}
|
|
|
|
func (s *shape) GetColor() string {
|
|
if mathutils.Abs(s.hash) == 0 {
|
|
return s.primary
|
|
} else {
|
|
return s.secondary
|
|
}
|
|
}
|
|
|
|
func (s *shape) MakePath() {
|
|
mod := mathutils.Abs(s.hash+1) % 4
|
|
switch mod {
|
|
case 0:
|
|
// square
|
|
s.canvas.BeginPath()
|
|
s.canvas.MoveTo(float64(s.pos.X), float64(s.pos.Y))
|
|
s.canvas.LineTo(float64(s.pos.X+float64(s.cellSize/2)), float64(s.pos.Y))
|
|
s.canvas.LineTo(
|
|
float64(s.pos.X+float64(s.cellSize/2)),
|
|
float64(s.pos.Y-float64(s.cellSize/2)),
|
|
)
|
|
s.canvas.LineTo(float64(s.pos.X), float64(s.pos.Y-float64(s.cellSize/2)))
|
|
s.canvas.ClosePath()
|
|
case 1:
|
|
// circle
|
|
s.canvas.BeginPath()
|
|
s.canvas.Arc(
|
|
float64(s.pos.X)+float64(s.cellSize)/math.Pi-5,
|
|
float64(s.pos.Y)-float64(s.cellSize)/math.Pi+5,
|
|
float64(s.cellSize)/3,
|
|
0,
|
|
math.Pi*2,
|
|
true,
|
|
)
|
|
case 2:
|
|
// triangle
|
|
s.canvas.BeginPath()
|
|
s.canvas.MoveTo(float64(s.pos.X), float64(s.pos.Y))
|
|
s.canvas.LineTo(float64(s.pos.X)+float64(s.cellSize)*0.65, float64(s.pos.Y))
|
|
s.canvas.LineTo(float64(s.pos.X), float64(s.pos.Y)-float64(s.cellSize)*0.65)
|
|
s.canvas.ClosePath()
|
|
case 3:
|
|
// oval
|
|
s.canvas.BeginPath()
|
|
s.canvas.MoveTo(
|
|
float64(s.pos.X)-float64(s.cellSize)*0.2,
|
|
float64(s.pos.Y)+float64(s.cellSize)*0.2,
|
|
)
|
|
s.canvas.QuadraticCurveTo(
|
|
float64(s.pos.X)+float64(s.cellSize)*0.4,
|
|
float64(s.pos.Y),
|
|
float64(s.pos.X)+float64(s.cellSize)*0.5,
|
|
float64(s.pos.Y)-float64(s.cellSize)*0.5,
|
|
)
|
|
s.canvas.MoveTo(
|
|
float64(s.pos.X)+float64(s.cellSize)*0.5,
|
|
float64(s.pos.Y)-float64(s.cellSize)*0.5,
|
|
)
|
|
s.canvas.QuadraticCurveTo(
|
|
float64(s.pos.X),
|
|
float64(s.pos.Y)-float64(s.cellSize)*0.4,
|
|
float64(s.pos.X)-float64(s.cellSize)*0.2,
|
|
float64(s.pos.Y)+float64(s.cellSize)*0.2,
|
|
)
|
|
default:
|
|
// square
|
|
s.canvas.BeginPath()
|
|
s.canvas.MoveTo(float64(s.pos.X), float64(s.pos.Y))
|
|
s.canvas.LineTo(float64(s.pos.X+float64(s.cellSize/2)), float64(s.pos.Y))
|
|
s.canvas.LineTo(
|
|
float64(s.pos.X+float64(s.cellSize/2)),
|
|
float64(s.pos.Y-float64(s.cellSize/2)),
|
|
)
|
|
s.canvas.LineTo(float64(s.pos.X), float64(s.pos.Y-float64(s.cellSize/2)))
|
|
s.canvas.ClosePath()
|
|
}
|
|
}
|
|
|
|
func (s *shape) Draw(hasStroke bool, strokeWeight int) {
|
|
color := s.GetColor()
|
|
// THIS SHIT ISN'T IMPLEMENTED! I hope it will work regardless
|
|
// s.canvas.SetGlobalCompositeOperation("source-over")
|
|
s.MakePath()
|
|
s.canvas.SetFillStyle(color)
|
|
s.canvas.SetStrokeStyle(s.strokeColor)
|
|
s.canvas.SetLineWidth(s.scale * (4 / 5 * float64(strokeWeight)) / float64(canvasSize))
|
|
s.canvas.SetLineJoin(canvas.Round)
|
|
s.canvas.SetLineCap(canvas.Round)
|
|
s.canvas.Fill()
|
|
if hasStroke {
|
|
s.canvas.Stroke()
|
|
}
|
|
}
|