From d8c17c429eef3c352239b1d1350ea7091afe672e Mon Sep 17 00:00:00 2001 From: Travis Shears Date: Sat, 5 Jul 2025 21:03:04 +0200 Subject: [PATCH] write pixels to canvas and preview --- one_line/main.fnl | 83 ++++++++++++++++++++++++++++++++++------------- 1 file changed, 60 insertions(+), 23 deletions(-) diff --git a/one_line/main.fnl b/one_line/main.fnl index b6d5782..cd6a0db 100644 --- a/one_line/main.fnl +++ b/one_line/main.fnl @@ -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))