(local scale 6) (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) ] (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) ; prep canvas (set pixel-canvas (love.graphics.newCanvas 88 31)) (update-canvas) ;; start a thread listening on stdin (: (love.thread.newThread "require('love.event') while 1 do love.event.push('stdin', io.read('*line')) end") :start)) (fn love.handlers.stdin [line] ; evaluate lines read from stdin as fennel code (let [(ok val) (pcall fennel.eval line)] (print (if ok (fennel.view val) val)))) (lambda draw-static-bg [] ; 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 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) (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))