Hi Edi, I'm using CL-GD with both LispWorks 5.0 on OS X and CMUCL 19b on FreeBSD to plot some graphs, and I'm very grateful for your work here. CL-GD is slick to use and more than fast enough for generating sparklines on an interactive web-based dashboard. I'm using WITH-TRANSFORMATION to simplify the graph plotting, and it's not behaving the way I would expect. As I read it in the documentation, this... (with-transformation (:x1 0 :width width :y1 0 :height height) ...) ... should transform the coordinate system from this... 0,0 -----> width - 1 | | | V height - 1 ... to this... height - 1 ^ | | | 0,0 -----> width - 1 Instead, I get this... height ^ | | | 0,1 -----> width - 1 The y-axis transformation isn't consistent with that of the x-axis. What's even more confusing, is that if the x-axis transformation does work then the following should only complain about y1, y2, and height, and not about x1, x2, and width, but that's not the case: (let ((height 100) (width 100)) (with-transformation (:x1 0 :x2 (1- width) :width width :y1 0 :y2 (1- height) :height height) ...)) Indeed, when I checked the macroexpansion, I see... (UNLESS #:X154021 (SETQ #:X154021 (- #:X254022 #:WIDTH54023))) (UNLESS #:X254022 (SETQ #:X254022 (+ #:X154021 #:WIDTH54023))) (UNLESS #:WIDTH54023 (SETQ #:WIDTH54023 (- #:X254022 #:X154021))) (UNLESS #:Y154024 (SETQ #:Y154024 (- #:Y254025 #:HEIGHT54026))) (UNLESS #:Y254025 (SETQ #:Y254025 (+ #:Y154024 #:HEIGHT54026))) (UNLESS #:HEIGHT54026 (SETQ #:HEIGHT54026 (- #:Y254025 #:Y154024))) Again, I would have thought, instead, that... width = (x2 - x1) + 1 height = (y2 - y1) + 1 So, the y-axis transformation isn't what I expected, but the macroexpansion suggests that the x-axis transformation should be off by one as well, yet it isn't. Am I nuts? Below is the snippet I was running to grok WITH-TRANSFORMATION. I can mail you the images I got, if you like. Thanks in advance, Mike (let* ((height 100) (width 100) (origin+1 (list 1 1)) (x-axis+1 (list 10 1 20 1 30 1 40 1 50 1 60 1 70 1 80 1 90 1 width 1)) (y-axis+1 (list 1 10 1 20 1 30 1 40 1 50 1 60 1 70 1 80 1 90 1 height)) (x-axis-end+1 (list (1- width) 1)) (y-axis-end+1 (list 1 (1- height)))) (cl-gd:with-image* (width height) (allocate-color 255 255 255) (let ((black (allocate-color 0 0 0)) (red (allocate-color 255 0 0)) (green (allocate-color 0 255 0)) (blue (allocate-color 0 0 255)) (yellow (allocate-color 255 255 0))) (draw-rectangle* 0 (1- height) ; or 0 and ... (1- width) 0 ; (1- height), doesn't matter :color yellow) (draw-rectangle* 0 height ; or 0 and ... width 0 ; ... height, doesn't matter :color black) (set-pixels origin+1 :color red) (set-pixels x-axis+1 :color green) (set-pixels x-axis-end+1 :color blue) (set-pixels y-axis+1 :color green) (set-pixels y-axis-end+1 :color blue)) (write-image-to-file "/tmp/test1.png" :if-exists :supersede)) (cl-gd:with-image* (width height) (allocate-color 255 255 255) (let ((black (allocate-color 0 0 0)) (red (allocate-color 255 0 0)) (green (allocate-color 0 255 0)) (blue (allocate-color 0 0 255)) (yellow (allocate-color 255 255 0))) (with-transformation (:x1 0 ;;:x2 99 :width width :y1 0 ;;:y2 99 :height height ) (draw-rectangle* 0 (1- height) ; or 0 and ... (1- width) 0 ; (1- height), doesn't matter :color yellow) (draw-rectangle* 0 height ; or 0 and ... width 0 ; ... height, doesn't matter :color black) (set-pixels origin+1 :color red) (set-pixels x-axis+1 :color green) (set-pixels x-axis-end+1 :color blue) (set-pixels y-axis+1 :color green) (set-pixels y-axis-end+1 :color blue)) (write-image-to-file "/tmp/test2.png" :if-exists :supersede)))) -- Michael J. Forster <mike@sharedlogic.ca>