Noah Petherbridge
27b908e40a
* Add RGBA color blending support in WASM build. * Initial texture caching API for Canvas renderer engine. The WASM build writes the chunk caches as a "data:image/png" base64 URL on the browser's sessionStorage, for access to copy into the Canvas. * Separated the ClickEvent from the MouseEvent (motion) in the WASM event queue system, to allow clicking and dragging. * Added the EscapeKey handler, which will abruptly terminate the WASM application, same as it kills the window in the desktop build. * Optimization fix: I discovered that if the user clicks and holds over a single pixel when drawing a level, repeated Set() operations were firing meaning multiple cache invalidations. Not noticeable on PC but on WebAssembly it crippled the browser. Now if the cursor isn't moving it doesn't do anything.
78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
package canvas
|
|
|
|
import (
|
|
"fmt"
|
|
"syscall/js"
|
|
|
|
"git.kirsle.net/apps/doodle/lib/render"
|
|
)
|
|
|
|
// Methods here implement the drawing functions of the render.Engine
|
|
|
|
// RGBA turns a color into CSS RGBA string.
|
|
func RGBA(c render.Color) string {
|
|
return fmt.Sprintf("rgba(%d,%d,%d,%f)",
|
|
c.Red,
|
|
c.Green,
|
|
c.Blue,
|
|
float64(c.Alpha)/255,
|
|
)
|
|
}
|
|
|
|
// Clear the canvas to a certain color.
|
|
func (e *Engine) Clear(color render.Color) {
|
|
e.canvas.ctx2d.Set("fillStyle", RGBA(color))
|
|
e.canvas.ctx2d.Call("fillRect", 0, 0, e.width, e.height)
|
|
}
|
|
|
|
// SetTitle sets the window title.
|
|
func (e *Engine) SetTitle(title string) {
|
|
js.Global().Get("document").Set("title", title)
|
|
}
|
|
|
|
// DrawPoint draws a pixel.
|
|
func (e *Engine) DrawPoint(color render.Color, point render.Point) {
|
|
e.canvas.ctx2d.Set("fillStyle", RGBA(color))
|
|
e.canvas.ctx2d.Call("fillRect",
|
|
int(point.X),
|
|
int(point.Y),
|
|
1,
|
|
1,
|
|
)
|
|
}
|
|
|
|
// DrawLine draws a line between two points.
|
|
func (e *Engine) DrawLine(color render.Color, a, b render.Point) {
|
|
e.canvas.ctx2d.Set("fillStyle", RGBA(color))
|
|
for pt := range render.IterLine2(a, b) {
|
|
e.canvas.ctx2d.Call("fillRect",
|
|
int(pt.X),
|
|
int(pt.Y),
|
|
1,
|
|
1,
|
|
)
|
|
}
|
|
}
|
|
|
|
// DrawRect draws a rectangle.
|
|
func (e *Engine) DrawRect(color render.Color, rect render.Rect) {
|
|
e.canvas.ctx2d.Set("strokeStyle", RGBA(color))
|
|
e.canvas.ctx2d.Call("strokeRect",
|
|
int(rect.X),
|
|
int(rect.Y),
|
|
int(rect.W),
|
|
int(rect.H),
|
|
)
|
|
}
|
|
|
|
// DrawBox draws a filled rectangle.
|
|
func (e *Engine) DrawBox(color render.Color, rect render.Rect) {
|
|
e.canvas.ctx2d.Set("fillStyle", RGBA(color))
|
|
e.canvas.ctx2d.Call("fillRect",
|
|
int(rect.X),
|
|
int(rect.Y),
|
|
int(rect.W),
|
|
int(rect.H),
|
|
)
|
|
}
|