write pixels to canvas and preview

This commit is contained in:
Travis Shears 2025-07-05 21:03:04 +02:00
parent a845fe1582
commit d8c17c429e

View file

@ -1,26 +1,70 @@
(tset _G :img-width 88)
(tset _G :img-height 31)
(local scale 6)
(tset _G :canvas-width (* scale (. _G :img-width)))
(tset _G :canvas-height (* scale (. _G :img-height)))
(local canvas-w (* scale 88))
(local canvas-h (* scale 31))
(local canvas-x (* -1 (/ canvas-w 2)))
(local canvas-y (* -1 (/ canvas-h 2)))
(local theme {
:white (lambda [cb] (cb (love.math.colorFromBytes 247 246 246)))
:black (lambda [cb] (cb (love.math.colorFromBytes 60 54 51)))
})
(lambda set-center-origin []
(let [(w h f) (love.window.getMode)
x (/ w 2)
y (/ h 2)
]
; (print (.. "setting orgin to middle of window: " x "," y))
(love.graphics.push)
(love.graphics.translate x y)))
; setup pixels for image that we are drawing
(var pixel-canvas nil)
(local pixels {})
(tset pixels :ordered-keys [])
(tset pixels :cords {})
(for [y 1 31]
(for [x 1 88]
(let [key (.. x "," y)]
(tset pixels.cords key {: x : y :val false})
(table.insert pixels.ordered-keys key))))
(fn draw-canvases []
"Draw main drawing canvas and preview canvas to screen"
(pixel-canvas:setFilter "nearest" "nearest")
(love.graphics.draw pixel-canvas canvas-x canvas-y 0 scale scale)
(love.graphics.draw pixel-canvas canvas-x (- canvas-y 60)))
(fn update-canvas []
(love.graphics.setCanvas pixel-canvas)
(love.graphics.clear 0 0 0 0)
(each [key {: x : y : val} (pairs pixels.cords)]
(when val (love.graphics.points x y)))
(love.graphics.setCanvas)
)
(fn love.update []
(let [
(w h _) (love.window.getMode)
(mouse-x-raw mouse-y-raw) (love.mouse.getPosition)
mouse-x (- mouse-x-raw (/ w 2))
mouse-y (- mouse-y-raw (/ h 2))
]
(when (and (> mouse-x canvas-x) (> mouse-y canvas-y) (< mouse-x (+ canvas-x canvas-w)) (< mouse-y (+ canvas-y canvas-h)))
(let [
x (+ 1 (math.floor (/ (+ (/ canvas-w 2) mouse-x) scale)))
y (+ 1 (math.floor (/ (+ (/ canvas-h 2) mouse-y) scale)))
key (.. x "," y)
]
(tset (. pixels.cords key) :val true)
(update-canvas)
(print (.. x "," y))))))
(fn love.load []
;; 480p 720×480
(love.window.setMode 720 480)
; (set-center-origin)
; (love.graphics.pop)
; prep canvas
(set pixel-canvas (love.graphics.newCanvas 88 31))
(update-canvas)
;; start a thread listening on stdin
(: (love.thread.newThread "require('love.event')
@ -31,29 +75,22 @@ while 1 do love.event.push('stdin', io.read('*line')) end") :start))
(let [(ok val) (pcall fennel.eval line)]
(print (if ok (fennel.view val) val))))
(lambda draw-static-bg []
(let [
canvas-w (* scale 88)
canvas-h (* scale 31)
canvas-x (* -1 (/ canvas-w 2))
canvas-y (* -1 (/ canvas-h 2))
]
; canvas
; canvas outline and text
(love.graphics.print "Canvas:" canvas-x (- canvas-y 20))
(love.graphics.rectangle "line" canvas-x canvas-y canvas-w canvas-h)
; preview
; preview outline and text
(love.graphics.print "Preview:" canvas-x (- canvas-y 80))
(love.graphics.rectangle "line" canvas-x (- canvas-y 60) 89 32)
)
)
(fn love.draw []
(set-center-origin)
(love.graphics.setBackgroundColor (love.math.colorFromBytes 192 192 192))
(love.graphics.setColor (love.math.colorFromBytes 29 29 29))
(theme.white love.graphics.setBackgroundColor)
(theme.black love.graphics.setColor)
(draw-static-bg)
(draw-canvases)
(love.graphics.pop))
(fn love.keypressed [key]
(love.event.quit))
; (fn love.keypressed [key]
; (love.event.quit))