diff --git a/examples/texture/main.go b/examples/texture/main.go new file mode 100644 index 0000000..aa5f8c8 --- /dev/null +++ b/examples/texture/main.go @@ -0,0 +1,83 @@ +package main + +import "math" +import "image" +import "math/rand" +import "image/color" +import "git.tebibyte.media/tomo/x" +import "git.tebibyte.media/tomo/tomo" + +func main () { + tomo.Register(0, x.NewBackend) + err := tomo.Run(run) + if err != nil { panic(err) } +} + +func run () { + window, err := tomo.NewWindow(image.Rect(0, 0, 256, 256)) + if err != nil { panic(err) } + + texture := tomo.NewTexture(coolTexture()) + + box := tomo.NewBox() + box.SetColor(color.Black) + box.SetTextureCenter(texture) + box.SetBorder ( + tomo.Border { + Color: [4] color.Color { + color.Black, color.Black, + color.Black, color.Black }, + Width: tomo.I(2), + }, + tomo.Border { + Color: [4] color.Color { + color.White, color.White, + color.White, color.White }, + Width: tomo.I(2), + }) + + window.SetRoot(box) + window.OnClose(tomo.Stop) + window.SetVisible(true) +} + +func coolTexture () image.Image { + // this picture IS COOL because i spent AN HOUR on it when i could have + // been FIXING BUGS! + speedX := 0.015 + speedY := 0.035 + bitmap := image.NewRGBA (image.Rect(0, 0, 200, 200)) + for y := bitmap.Bounds().Min.Y; y < bitmap.Bounds().Max.Y; y++ { + for x := bitmap.Bounds().Min.X; x < bitmap.Bounds().Max.X; x++ { + value := (( + math.Sin(float64(y) * speedY) + + math.Cos(float64(x) * speedX)) + 2) / 4 + value *= 0.7 + + r := value * 0.7 + 0.3 + g := math.Sin(value * 7) * 0.7 + b := (1 - value) * 0.7 + + noise := math.Mod(rand.Float64(), 1) + noise = math.Pow(noise, 2) + noise * 0.5 + noise *= 0.05 + + channel := func (f float64) uint8 { + contrast := 1.4 + f = f * (contrast) - ((contrast - 1) / 2) + + if f < 0 { f = 0 } + if f > 1 { f = 1 } + + return uint8(f * 255) + } + + bitmap.Set(x, y, color.RGBA { + R: channel(r + noise), + G: channel(g + noise), + B: channel(b + noise), + A: 255, + }) + }} + return bitmap +}