(define create-drawing (lambda (val1 val2 val3) (letrec ((int.write (lambda (int port) (write-char (integer->char (+ int 1)) port))) (rgb.write (lambda (color port) (int.write (rgb.red color) port) (int.write (rgb.green color) port) (int.write (rgb.blue color) port))) (canvas (image.new 200 200)) (draw-parallel-lines! (lambda (image n start-col start-row end-col end-row hoffset voffset) (cond ((> n 1) (image.draw-line! image start-col start-row end-col end-row) (draw-parallel-lines! image (- n 1) (+ hoffset start-col) (+ voffset start-row) (+ hoffset end-col) (+ voffset end-row) hoffset voffset))))) (create-drawing-helper (lambda (image val1 val2 val3) (let* ((face-width 160) (face-height (+ 120 (* val1 5))) (face-color (rgb.new (* 255 (+ 0.8 (* 0.2 (sin val1)))) (* 255 (+ 0.6 (* 0.2 (sin val1)))) 0)) (eye-distance 50) (eye-height 20) (eye-width (- 30 (* 0.8 val1))) (eyecolors (list color.blue color.green color.copper color.grey color.brown color.dim-grey color.steel-blue color.pale-blue color.dark-brown color.very-dark-brown)) (eye-color (list-ref eyecolors val2)) (moustache-color (if (odd? (+ val3 val2)) transparent (rgb.new (* 5 (+ val3 val2)) (* 5 (+ val3 val2)) (* 5 (+ val3 val2))))) (mouth-color (rgb.new (+ 192 (* 60 (sin val2))) 0 0)) (mouth-offset (+ 10.5 (/ (+ val1 val2 val3) 3))) (hair-brushes (list "square (5x5) blur" "square (5x5) blur" "Calligraphic Brush" "Circle Fuzzy (05)" "Circle (01)" "Circle (05)" "Circle Fuzzy (03)" "Felt Pen" "Sparks" "Sand Dunes (AP)")) (set-brush (list-ref hair-brushes val3))) ;face (image.select-ellipse! image selection.replace 20 20 face-width face-height) (envt.set-fgcolor! face-color) (image.fill! image) (envt.set-brush! "Circle Fuzzy (05)") (image.stroke! image) (image.select-nothing! image) ;two eyes (image.select-ellipse! image selection.replace 65 65 eye-width eye-height) (image.select-ellipse! image selection.add (+ 65 eye-distance) 65 eye-width eye-height) (envt.set-fgcolor! eye-color) (image.fill! image) (image.select-nothing! image) ;two pupils (image.select-ellipse! image selection.replace 72 68 12 12) (image.select-ellipse! image selection.add (+ 72 eye-distance) 68 12 12) (envt.set-fgcolor! "cyan") (image.fill! image) (image.select-nothing! image) ;hair (envt.set-brush! set-brush) (envt.set-fgcolor! color.black) (image.select-ellipse! image selection.replace 20 20 face-width face-height) (draw-parallel-lines! image 12 35 45 35 65 4 -2.5) (draw-parallel-lines! image 12 165 45 165 65 -4 -2.5) (draw-parallel-lines! image 12 45 45 45 60 4 -2.5) (draw-parallel-lines! image 12 155 45 155 60 -4 -2.5) (draw-parallel-lines! image 25 60 15 60 35 4 0) (image.select-nothing! image) ;mouth (image.select-ellipse! image selection.replace 70 80 60 60) (image.select-ellipse! image selection.subtract 67.5 (- 85 mouth-offset) 65 65) (envt.set-fgcolor! mouth-color) (image.fill! image) (envt.set-brush! "Circle Fuzzy (05)") (envt.set-fgcolor! color.red) (image.stroke! image) (image.select-nothing! image) ;glasses (image.select-ellipse! image selection.replace 55 55 40 40) (image.select-ellipse! image selection.add (+ 55 eye-distance) 55 40 40) (envt.set-brush! "Circle (03)") (envt.set-fgcolor! color.black) (image.stroke! image) (image.select-ellipse! image selection.replace 20 20 face-width face-height) (image.select-ellipse! image selection.subtract 55 55 40 40) (image.select-ellipse! image selection.subtract (+ 55 eye-distance) 55 40 40) (image.draw-line! image 0 75 (- (image.width image) 1) 75) (image.select-nothing! image) ;moustache (envt.set-fgcolor! moustache-color) (envt.set-brush! "Circle (01)") (draw-parallel-lines! image 15 80 110 80 120 3 0) (envt.update-displays!))))) (create-drawing-helper canvas val1 val2 val3) (image.show canvas))))