[imago-cvs] CVS update: imago/src/drawing.lisp imago/src/package.lisp

Matthieu Villeneuve mvilleneuve at common-lisp.net
Mon Jan 3 21:25:33 UTC 2005


Update of /project/imago/cvsroot/imago/src
In directory common-lisp.net:/tmp/cvs-serv7121

Modified Files:
	drawing.lisp package.lisp 
Log Message:
Added a DRAW-POLYGON function
Date: Mon Jan  3 22:25:30 2005
Author: mvilleneuve

Index: imago/src/drawing.lisp
diff -u imago/src/drawing.lisp:1.2 imago/src/drawing.lisp:1.3
--- imago/src/drawing.lisp:1.2	Mon Jan  3 21:56:02 2005
+++ imago/src/drawing.lisp	Mon Jan  3 22:25:29 2005
@@ -20,6 +20,7 @@
 
 (defun draw-line (image x1 y1 x2 y2 color
                   &key (dash-length 1) (dash-interval 0))
+  "Draws a line between two points in an image."
   (let ((drawing t)
         (counter 0))
     (do-line-pixels (image pixel x y x1 y1 x2 y2)
@@ -34,24 +35,31 @@
             (setf drawing t
                   counter 0))))))
 
-(defun draw-rectangle (image x1 y1 width height color)
+(defun draw-rectangle (image x1 y1 width height color
+                       &key (dash-length 1) (dash-interval 0))
   "Draws a rectangle in an image."
-  (let* ((image-width (image-width image))
-         (pixels (image-pixels image))
-         (index (+ (* y1 image-width) x1)))
-    (loop for index2 = index then (1+ index2)
-          repeat width
-          do (setf (row-major-aref pixels index2) color))
-    (loop for index2 = (+ index (* (1- height) image-width)) then (1+ index2)
-          repeat width
-          do (setf (row-major-aref pixels index2) color))
-    (loop for index2 = (+ index image-width) then (+ index2 image-width)
-          repeat (- height 2)
-          do (setf (row-major-aref pixels index2) color))
-    (loop for index2 = (+ index image-width width -1)
-          then (+ index2 image-width)
-          repeat (- height 2)
-          do (setf (row-major-aref pixels index2) color))))
+  (let ((x2 (+ x1 width -1))
+        (y2 (+ y1 height -1)))
+    (draw-line image x1 y1 x2 y1 color
+               :dash-length dash-length :dash-interval dash-interval)
+    (draw-line image x1 y2 x2 y2 color
+               :dash-length dash-length :dash-interval dash-interval)
+    (draw-line image x1 y1 x1 y2 color
+               :dash-length dash-length :dash-interval dash-interval)
+    (draw-line image x2 y1 x2 y2 color
+               :dash-length dash-length :dash-interval dash-interval)))
+
+(defun draw-polygon (image coord-list color
+                     &key (closed t) (dash-length 1) (dash-interval 0))
+  "Draws a polygon in an image."
+  (loop for (x1 y1 x2 y2) on coord-list by #'cddr
+        do (when (and closed (null x2) (null y2))
+             (setf x2 (first coord-list)
+                   y2 (second coord-list)))
+           (unless (or (null x2) (null y2))
+             (draw-line image x1 y1 x2 y2 color
+                        :dash-length dash-length
+                        :dash-interval dash-interval))))
 
 (defun draw-circle (image center-x center-y radius color)
   "Draws a circle in an image."


Index: imago/src/package.lisp
diff -u imago/src/package.lisp:1.3 imago/src/package.lisp:1.4
--- imago/src/package.lisp:1.3	Mon Jan  3 21:56:02 2005
+++ imago/src/package.lisp	Mon Jan  3 22:25:29 2005
@@ -41,7 +41,9 @@
            #:copy
            #:flip #:scale #:resize
 
-           #:draw-pixel #:draw-line #:draw-rectangle #:draw-circle
+           #:draw-pixel #:draw-line
+           #:draw-rectangle #:draw-polygon
+           #:draw-circle
 
            #:convolve
            #:blur #:sharpen #:edge-detect #:emboss




More information about the Imago-cvs mailing list