Impl identicons serverside, broken though for some reason
Some checks are pending
/ test (push) Waiting to run

This commit is contained in:
Melody Becker 2025-04-10 16:40:15 +02:00
parent da2a89010c
commit f2616c041b
Signed by: mstar
SSH key fingerprint: SHA256:9VAo09aaVNTWKzPW7Hq2LW+ox9OdwmTSHRoD4mlz1yI
3 changed files with 430 additions and 0 deletions

100
shared/identicon/block.go Normal file
View file

@ -0,0 +1,100 @@
package identicon
import (
"git.mstar.dev/mstar/canvas"
mathutils "git.mstar.dev/mstar/goutils/math"
)
type vec2 struct {
X, Y float64
}
type block struct {
canvas *canvas.Canvas
blockType int
primary string
secondary string
hash int
pos vec2
cellSize int
margin int
scale float64
}
func (b *block) Offset() {
b.canvas.Save()
b.canvas.Translate(0.6*b.scale, -0.6*b.scale)
}
func (b *block) ResetOffset() {
b.canvas.Restore()
}
func (b *block) MakePath(hash int, offset int) {
mod := mathutils.Abs(hash+offset) % 4
switch mod {
case 0:
// Top
b.canvas.BeginPath()
b.canvas.MoveTo(float64(b.pos.X), float64(b.pos.Y))
b.canvas.LineTo(b.pos.X+float64(int(b.cellSize)), float64(b.pos.Y))
b.canvas.LineTo(b.pos.X+float64(int(b.cellSize)), b.pos.Y+float64(int(b.cellSize)))
b.canvas.ClosePath()
case 1:
// Right
b.canvas.BeginPath()
b.canvas.MoveTo(b.pos.X+float64(int(b.cellSize)), float64(b.pos.Y))
b.canvas.LineTo(b.pos.X+float64(int(b.cellSize)), b.pos.Y+float64(int(b.cellSize)))
b.canvas.LineTo(float64(b.pos.X), b.pos.Y+float64(int(b.cellSize)))
b.canvas.ClosePath()
case 2:
// Bottom
b.canvas.BeginPath()
b.canvas.MoveTo(float64(b.pos.X), float64(b.pos.Y))
b.canvas.LineTo(float64(b.pos.X), b.pos.Y+float64(int(b.cellSize)))
b.canvas.LineTo(b.pos.X+float64(int(b.cellSize)), b.pos.Y+float64(int(b.cellSize)))
b.canvas.ClosePath()
case 3:
// Left
b.canvas.BeginPath()
b.canvas.MoveTo(float64(b.pos.X), float64(b.pos.Y))
b.canvas.LineTo(b.pos.X+float64(int(b.cellSize)), float64(b.pos.Y))
b.canvas.LineTo(float64(b.pos.X), b.pos.Y+float64(int(b.cellSize)))
b.canvas.ClosePath()
default:
// Top
b.canvas.BeginPath()
b.canvas.MoveTo(float64(b.pos.X), float64(b.pos.Y))
b.canvas.LineTo(b.pos.X+float64(int(b.cellSize)), float64(b.pos.Y))
b.canvas.LineTo(b.pos.X+float64(int(b.cellSize)), b.pos.Y+float64(int(b.cellSize)))
b.canvas.ClosePath()
}
}
func (b *block) Draw() {
b.Offset()
switch b.blockType {
case 1:
b.MakePath(b.hash, b.hash%3)
b.canvas.SetFillStyle(b.primary)
b.canvas.Fill()
b.MakePath(b.hash, b.hash%5)
b.canvas.SetFillStyle(b.secondary)
b.canvas.Fill()
case 2:
b.MakePath(b.hash, b.hash%4)
b.canvas.SetFillStyle(b.secondary)
b.canvas.Fill()
b.MakePath(b.hash, b.hash%3)
b.canvas.SetFillStyle(b.primary)
b.canvas.Fill()
default:
b.MakePath(b.hash, b.hash%7)
b.canvas.SetFillStyle(b.secondary)
b.canvas.Fill()
b.MakePath(b.hash, b.hash%8)
b.canvas.SetFillStyle(b.primary)
b.canvas.Fill()
}
b.ResetOffset()
}