linstrom/shared/identicon/shape.go
mstar f2616c041b
Some checks are pending
/ test (push) Waiting to run
Impl identicons serverside, broken though for some reason
2025-04-10 16:40:15 +02:00

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()
}
}