[bknr-cvs] hans changed trunk/projects/quickhoney/src/
BKNR Commits
bknr at bknr.net
Thu Dec 18 08:04:11 UTC 2008
Revision: 4141
Author: hans
URL: http://bknr.net/trac/changeset/4141
it is slow, but it works!
U trunk/projects/quickhoney/src/pixel-pdf.lisp
U trunk/projects/quickhoney/src/turtle.lisp
Modified: trunk/projects/quickhoney/src/pixel-pdf.lisp
===================================================================
--- trunk/projects/quickhoney/src/pixel-pdf.lisp 2008-12-18 06:39:24 UTC (rev 4140)
+++ trunk/projects/quickhoney/src/pixel-pdf.lisp 2008-12-18 08:04:11 UTC (rev 4141)
@@ -5,12 +5,15 @@
(defclass converter ()
((x :initform 0
- :accessor x)
+ :accessor x
+ :type fixnum)
(y :initform 0
- :accessor y)
+ :accessor y
+ :type fixnum)
(pixels :reader pixels)
- (seen :reader seen)
- (color :accessor color)
+ (seen :reader %seen)
+ (color :accessor color
+ :type fixnum)
(looking-in-direction :initform :east
:accessor looking-in-direction)))
@@ -20,6 +23,12 @@
(defun height (converter)
(array-dimension (pixels converter) 1))
+(defun seen (x y)
+ (aref (%seen *converter*) x y))
+
+(defun (setf seen) (new-value x y)
+ (setf (aref (%seen *converter*) x y) new-value))
+
(defmethod initialize-instance :after ((converter converter) &key image-pathname)
(cl-gd:with-image-from-file* (image-pathname)
(let ((width (cl-gd:image-width))
@@ -27,7 +36,8 @@
(with-slots (seen pixels) converter
(setf seen (make-array (list width height)
:element-type 'boolean :initial-element nil)
- pixels (make-array (list width height)))
+ pixels (make-array (list width height)
+ :element-type 'fixnum))
(cl-gd:do-rows (y)
(cl-gd:do-pixels-in-row (x)
(setf (aref pixels x y) (cl-gd:raw-pixel))))))))
@@ -110,29 +120,41 @@
(turtle:forward))
(defun set-color (color)
- (format t "can't set PDF color ~A yet~%" color))
+ #+(or) (format t "can't set PDF color ~A yet~%" color))
(defun move-to-pixel (x y)
(setf (x *converter*) x
- (y *converter*) y
- (aref (seen *converter*) x y) t))
+ (y *converter*) y))
+(defun flood-fill ()
+ (labels
+ ((maybe-descend (x y)
+ (when (and (same-color x y)
+ (not (seen x y)))
+ (recurse x y)))
+ (recurse (x y)
+ (setf (seen x y) t)
+ (maybe-descend (1- x) y)
+ (maybe-descend (1+ x) y)
+ (maybe-descend x (1- y))
+ (maybe-descend x (1+ y))))
+ (recurse (x *converter*) (y *converter*))))
+
(defun fill-from (from-x from-y)
;; XXX true-color-behandlung fehlt.
- (format t "filling at ~A/~A~%" from-x from-y)
- (setf (aref (seen *converter*) from-x from-y) t
- (looking-in-direction *converter*) :east
+ #+(or) (format t "filling at ~A/~A~%" from-x from-y)
+ (setf (looking-in-direction *converter*) :east
(x *converter*) from-x
(y *converter*) from-y
(color *converter*) (aref (pixels *converter*) from-x from-y))
+ (flood-fill)
(set-color (color *converter*))
(turtle:reset)
(turtle:move-to from-x from-y)
(turtle:pen-down)
(turtle:forward)
- (do ((moved nil t))
- ((and moved
- (eql from-x (turtle:x))
+ (do ()
+ ((and (eql from-x (turtle:x))
(eql from-y (turtle:y))))
(cond
((can-turn-right)
@@ -152,10 +174,10 @@
(x *converter*) (y *converter*)
(looking-in-direction *converter*)
turtle::*turtle*)
- (assert (and (<= (abs (- (x *converter*) (turtle:x))) 1)
- (<= (abs (- (y *converter*) (turtle:y))) 1))))
+ #+(or) (assert (and (<= (abs (- (x *converter*) (turtle:x))) 1)
+ (<= (abs (- (y *converter*) (turtle:y))) 1))))
(turtle:pen-up)
- (print-seen))
+ #+(or) (print-seen))
(defun pixels-pdf (image-pathname)
(let ((*converter* (make-instance 'converter :image-pathname image-pathname)))
@@ -168,14 +190,14 @@
(pdf:scale scale scale)
(dotimes (y (height *converter*))
(dotimes (x (width *converter*))
- (unless (aref (seen *converter*) x y)
+ (unless (seen x y)
(fill-from x y))))))
(pdf:write-document (make-pathname :type "pdf" :defaults image-pathname)))))
(defun print-seen ()
(dotimes (y (height *converter*))
(dotimes (x (width *converter*))
- (write-char (if (aref (seen *converter*) x (- (height *converter*) y 1))
+ (write-char (if (seen x (- (height *converter*) y 1))
#\* #\.)
*error-output*))
(terpri *error-output*)))
\ No newline at end of file
Modified: trunk/projects/quickhoney/src/turtle.lisp
===================================================================
--- trunk/projects/quickhoney/src/turtle.lisp 2008-12-18 06:39:24 UTC (rev 4140)
+++ trunk/projects/quickhoney/src/turtle.lisp 2008-12-18 08:04:11 UTC (rev 4141)
@@ -2,9 +2,11 @@
(defclass turtle ()
((x :initform 0
- :accessor turtle-x)
+ :accessor turtle-x
+ :type fixnum)
(y :initform 0
- :accessor turtle-y)
+ :accessor turtle-y
+ :type fixnum)
(directions :initform '#1=(:east :south :west :north . #1#)
:accessor turtle-directions)
(drawing :accessor turtle-drawing
More information about the Bknr-cvs
mailing list