;;;; examples/13-canvas-drawing-language.lisp (defpackage #:ww.examples/12 (:use #:cl) (:export #:start)) (in-package :ww.examples/12) (defclass canvas-lang-demo (ww:application) ()) (ww:defhandler quit (ww::on-keydown (app scancode) (when (eql :scancode-q scancode) (ww::stop)))) (ww:defhandler clear-and-draw (ww::on-perframe (canvas time) (ww::clear-canvas canvas :r 255 :g 255 :b 255) (draw-stuff canvas time) (ww::blit canvas))) (defun triangle-at (x y) (ww::move-to x y) (ww::stroke-rel 150 0) (ww::stroke-rel 0 130) (ww::stroke-rel -150 -130)) (defun filled-triangle-at (x y) (ww::move-to x y) (ww::fill-rel-path '((100 100) (100 -100)))) (defun lower-the-bluer (x y) (list (* 256 (/ x 500)) (* 256 (/ y 500)) 255 255)) (defun plaid1 (x y) (list (mod (* x x) 256) (mod (* y y) 256) (mod (* x y) 256) 255)) (defun draw-stuff (canvas time) (declare (ignorable time)) (ww::with-canvas canvas (triangle-at 100 100) (ww::canvas-pen-color-function #'plaid1) (filled-triangle-at 250 200) (ww::canvas-pen-color-function #'lower-the-bluer) (ww::canvas-pen-width 2) (ww::stroke-bezier '((0 0) (200 120) (50 350) (200 100) (300 400)) 1000))) (defmethod ww:boot ((app canvas-lang-demo )) (let ((canvas (make-instance 'ww:canvas :pixel-width 500 :pixel-height 500))) ;; stretch canvas over the whole app (setf (ww:width canvas) (ww::application-width app) (ww:height canvas) (ww::application-height app)) ;; add it to the display tree (ww:add-unit app canvas) ;; handlers (ww:add-handler canvas #'clear-and-draw) (ww:add-handler app #'quit) (ww:add-handler canvas #'quit))) (defun start (&optional (side 500)) (ww::start (make-instance 'canvas-lang-demo :fps 10 :width side :height side :title "Canvas demo")))