refactor
This commit is contained in:
8
pkg/clock/README.md
Normal file
8
pkg/clock/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
залил как есть.
|
||||
любая кринжовая хуйня которая здесь найдется... просто зайбейте на это хуй, не обращайте внимания
|
||||
|
||||
запускается значится так:
|
||||
заходите в cmd и...
|
||||
> go run .
|
||||
|
||||
заходите в бровз и пишите адрес с портом
|
||||
82
pkg/clock/clock.go
Normal file
82
pkg/clock/clock.go
Normal file
@@ -0,0 +1,82 @@
|
||||
//go:build draft
|
||||
package clock
|
||||
|
||||
import (
|
||||
"image"
|
||||
"image/color"
|
||||
"image/png"
|
||||
"io"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"git.niplace.ru/XoxJlopeZi4BB/clock/letter"
|
||||
"git.niplace.ru/XoxJlopeZi4BB/imageutils"
|
||||
)
|
||||
|
||||
|
||||
|
||||
var img1, img2 = letter.Render(letter.Nums[6]), letter.Render(letter.Nums[9])
|
||||
|
||||
func DownRightBlank(img image.Image) image.Image {
|
||||
clr := color.White
|
||||
img = letter.Blank(img, clr, imageutils.Down)
|
||||
return letter.Blank(img, clr, imageutils.Right)
|
||||
}
|
||||
|
||||
func LeftUpBlank(img image.Image) image.Image {
|
||||
clr := color.White
|
||||
img = letter.Blank(img, clr, imageutils.Left)
|
||||
return letter.Blank(img, clr, imageutils.Up)
|
||||
}
|
||||
|
||||
func RenderNum(n int) image.Image {
|
||||
var img image.Image = image.NewRGBA(image.Rect(0, 0, 0, 0))
|
||||
s := strconv.Itoa(n)
|
||||
for i := range s {
|
||||
n, err := strconv.Atoi(string(s[i]))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
num := letter.Render(letter.Nums[n])
|
||||
num = DownRightBlank(num)
|
||||
img = imageutils.Concat(img, num, imageutils.Right)
|
||||
}
|
||||
img = LeftUpBlank(img)
|
||||
return img
|
||||
}
|
||||
|
||||
func RenderTime(t time.Time) image.Image {
|
||||
hour := RenderNum(t.Hour())
|
||||
if t.Hour() < 10 {
|
||||
hour = imageutils.Concat(
|
||||
DownRightBlank(letter.Empty), hour, imageutils.Right)
|
||||
}
|
||||
minute := RenderNum(t.Minute())
|
||||
if t.Minute() < 10 {
|
||||
minute = imageutils.Concat(
|
||||
DownRightBlank(letter.Empty), minute, imageutils.Right)
|
||||
}
|
||||
|
||||
img := imageutils.Concat(hour, minute, imageutils.Down)
|
||||
return img
|
||||
}
|
||||
|
||||
func Margin(img image.Image, length int) image.Image {
|
||||
for i := 0; i < length; i++ {
|
||||
img = LeftUpBlank(DownRightBlank(img))
|
||||
}
|
||||
return img
|
||||
}
|
||||
|
||||
func Time(w io.Writer) {
|
||||
t := time.Now()
|
||||
img := RenderTime(t)
|
||||
img = Margin(img, 3)
|
||||
img = imageutils.Scale(img, 1<<6)
|
||||
|
||||
err := png.Encode(w, img)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
13
pkg/clock/clock_test.go
Normal file
13
pkg/clock/clock_test.go
Normal file
@@ -0,0 +1,13 @@
|
||||
//go:build ignore
|
||||
package clock
|
||||
|
||||
import (
|
||||
"io"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func BenchmarkNumber(b *testing.B) {
|
||||
for i := 0; i < b.N; i++ {
|
||||
Numbers(io.Discard)
|
||||
}
|
||||
}
|
||||
22
pkg/clock/cmd/main.go
Normal file
22
pkg/clock/cmd/main.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"git.niplace.ru/XoxJlopeZi4BB/clock"
|
||||
)
|
||||
|
||||
func main() {
|
||||
addrwithport := ":8080"
|
||||
http.HandleFunc("/",
|
||||
func(w http.ResponseWriter, req *http.Request) {
|
||||
clock.Time(w)
|
||||
},
|
||||
)
|
||||
|
||||
println("this thingy running on", addrwithport)
|
||||
err := http.ListenAndServe(addrwithport, nil)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
}
|
||||
22
pkg/clock/digit/digit.go
Normal file
22
pkg/clock/digit/digit.go
Normal file
@@ -0,0 +1,22 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
func main() {
|
||||
d, err := time.ParseDuration("1s")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
t := time.Tick(d)
|
||||
go func() {
|
||||
fmt.Printf("\033[2J\033[H")
|
||||
for {
|
||||
<-t
|
||||
fmt.Printf("\r%s", time.Now().Format(time.TimeOnly))
|
||||
}
|
||||
}()
|
||||
select {}
|
||||
}
|
||||
5
pkg/clock/go.mod
Normal file
5
pkg/clock/go.mod
Normal file
@@ -0,0 +1,5 @@
|
||||
module git.niplace.ru/XoxJlopeZi4BB/clock
|
||||
|
||||
go 1.25.3
|
||||
|
||||
require git.niplace.ru/XoxJlopeZi4BB/imageutils v0.0.0-20241224134015-2709034fc322
|
||||
4
pkg/clock/go.sum
Normal file
4
pkg/clock/go.sum
Normal file
@@ -0,0 +1,4 @@
|
||||
git.niplace.ru/XoxJlopeZi4BB/imageutils v0.0.0-20241224134015-2709034fc322 h1:jefEdqKZ/JKnmky9LipaS/UH0phAhz/56ORHIjmHREk=
|
||||
git.niplace.ru/XoxJlopeZi4BB/imageutils v0.0.0-20241224134015-2709034fc322/go.mod h1:QieEgSGk9ZYISDv5XyMMktQXi/2qlTmdHuxTlt1Xfq8=
|
||||
github.com/potassium5703/texture v0.0.0-20240820054037-fce43fc4b0f0 h1:sowjIIVme5ovcdB0kjP3w+4xbVNrlOPdx7Up4LIGJz8=
|
||||
github.com/potassium5703/texture v0.0.0-20240820054037-fce43fc4b0f0/go.mod h1:KwM7hMpZhr3XySWuK/SZ7s1BXVQe8p1IyZftYg9KtWY=
|
||||
106
pkg/clock/letter/image.go
Normal file
106
pkg/clock/letter/image.go
Normal file
@@ -0,0 +1,106 @@
|
||||
package letter
|
||||
|
||||
import (
|
||||
"embed"
|
||||
"encoding/csv"
|
||||
"image"
|
||||
"image/color"
|
||||
"image/draw"
|
||||
"io"
|
||||
|
||||
"git.niplace.ru/XoxJlopeZi4BB/imageutils"
|
||||
)
|
||||
|
||||
type Letter string
|
||||
|
||||
//go:embed map.csv
|
||||
var fs embed.FS
|
||||
var mapFile = func() io.Reader {
|
||||
f, err := fs.Open("map.csv")
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
return f
|
||||
}()
|
||||
|
||||
var Letters = func(r io.Reader) (m map[string]string) {
|
||||
records, err := csv.NewReader(r).ReadAll()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
for _, v := range records {
|
||||
if len(v) < 2 {
|
||||
panic("csv file isn's key-value pair")
|
||||
}
|
||||
m[v[0]] = v[1]
|
||||
}
|
||||
return m
|
||||
}(mapFile)
|
||||
|
||||
// implements image.Image interface.
|
||||
func (l Letter) ColorModel() color.Model {
|
||||
return color.Alpha16Model
|
||||
}
|
||||
|
||||
// implements image.Image interface.
|
||||
func (l Letter) Bounds() image.Rectangle {
|
||||
return image.Rect(0, 0, 3, 3)
|
||||
}
|
||||
|
||||
// implements image.Image interface.
|
||||
func (l Letter) At(x, y int) color.Color {
|
||||
if len(l) != 9 {
|
||||
panic("len(Letter) != 9")
|
||||
}
|
||||
target := l[x+y*3]
|
||||
if target != '1' {
|
||||
return color.Opaque
|
||||
}
|
||||
return color.Transparent
|
||||
}
|
||||
|
||||
func Render(l Letter) image.Image {
|
||||
img := image.NewRGBA(l.Bounds())
|
||||
draw.Draw(img, l.Bounds(), image.White, image.ZP, draw.Src)
|
||||
draw.Draw(img, l.Bounds(), l, image.ZP, draw.Over)
|
||||
return img
|
||||
}
|
||||
|
||||
type blank struct {
|
||||
image.Image
|
||||
color.Color
|
||||
imageutils.Side
|
||||
}
|
||||
|
||||
func (b blank) ColorModel() color.Model { return b.Image.ColorModel() }
|
||||
|
||||
func (b blank) Bounds() image.Rectangle {
|
||||
rect := image.Rectangle{}
|
||||
switch b.Side {
|
||||
case imageutils.Left:
|
||||
fallthrough
|
||||
case imageutils.Right:
|
||||
rect = image.Rectangle{
|
||||
image.ZP,
|
||||
image.Point{
|
||||
1, b.Image.Bounds().Dy(),
|
||||
},
|
||||
}
|
||||
case imageutils.Up:
|
||||
fallthrough
|
||||
case imageutils.Down:
|
||||
rect = image.Rectangle{
|
||||
image.ZP,
|
||||
image.Point{
|
||||
b.Image.Bounds().Dx(), 1,
|
||||
},
|
||||
}
|
||||
}
|
||||
return rect
|
||||
}
|
||||
|
||||
func (b blank) At(x, y int) color.Color { return b.Color }
|
||||
|
||||
func Blank(img image.Image, clr color.Color, side imageutils.Side) image.Image {
|
||||
return imageutils.Concat(img, blank{img, clr, side}, side)
|
||||
}
|
||||
11
pkg/clock/letter/map.csv
Normal file
11
pkg/clock/letter/map.csv
Normal file
@@ -0,0 +1,11 @@
|
||||
0, 111101111
|
||||
1, 010010010
|
||||
2, 110010011
|
||||
3, 111011111
|
||||
4, 101111001
|
||||
5, 011010110
|
||||
6, 001111111
|
||||
7, 111001001
|
||||
8, 011111111
|
||||
9, 111111001
|
||||
:, 010000010
|
||||
|
35
pkg/clock/string.go
Normal file
35
pkg/clock/string.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package clock
|
||||
|
||||
import (
|
||||
"git.nkpl.cc/twocookedfaggots/imageutils/clock/letter"
|
||||
)
|
||||
|
||||
var blank = Letter("000000000")
|
||||
|
||||
type String struct {
|
||||
S string
|
||||
}
|
||||
|
||||
func (s String) Bounds() image.Rectangle {
|
||||
splitted := strings.Split(s.S, '\n')
|
||||
max := 0
|
||||
for _, v := range splitted {
|
||||
max = max(len(v), max)
|
||||
}
|
||||
x, y := max*4+1, len(splitted)*4+1
|
||||
return image.Rect(0,0,x,y)
|
||||
}
|
||||
|
||||
func (s String) ColorModel() color.Model { return color.Alpha16Model }
|
||||
func (s String) At(x, y int) color.Color {
|
||||
splitted := string.Split(s.S, '\n')
|
||||
if y/4 > len(splitted) {
|
||||
return blank.At(0, 0)
|
||||
}
|
||||
if x/4 > len(splitted[y/4]) {
|
||||
return blank.At(0, 0)
|
||||
}
|
||||
c := splitted[y/4][x/4]
|
||||
return Letter(c).At(x%4, y%4)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user