home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
vis-ftp.cs.umass.edu
/
vis-ftp.cs.umass.edu.tar
/
vis-ftp.cs.umass.edu
/
pub
/
Software
/
ASCENDER
/
ascendMar8.tar
/
UMass
/
ISR
/
isr2extents.lisp
< prev
next >
Wrap
Lisp/Scheme
|
1995-04-11
|
16KB
|
387 lines
;;; -*- Mode:Common-Lisp; Package:ISR2; Base:10 -*-
;;;
;;; isr2extents.lisp
;;; author: Bruce Draper
;;; revisions: John Brolio, Bob Collins
;;; re-write for ISR2: Robert Heller - Mon May 23 15:05:59 1988
;;; Copyright 1987, 1988 by University of Massachusetts
;;;
;;;
(in-package "ISR2")
(export '(make-pixelmap pixelmap-extents pixelmap-bitplane pixelmap pixelmap-p
copy-pixelmap make-extents make-bitplane-array))
(eval-when (load compile eval)
(defconstant *scratch-array-size* 384))
(defvar *scratch-bitplane* (make-array `(,*scratch-array-size* ,*scratch-array-size*)
:element-type 'bit :initial-element 0))
(defvar *clean-bitplane* (make-array `(,*scratch-array-size* ,*scratch-array-size*)
:element-type 'bit :initial-element 0))
(defconstant *col-offset* 64)
(defconstant *row-offset* 64)
(defvar *scratch-bitplane-lock* nil)
(defmacro check-bitplane-and-extents (extents1 bitplane1 &optional extents2 bitplane2)
`(unless (and (extents-p ,extents1)
(or (null ,extents2)
(extents-p ,extents2))
(arrayp ,bitplane1)
(or (null ,bitplane2)
(arrayp ,bitplane2)))
(error "attempt to operate on non-existent bitplane or extents")))
(defun make-extents (pixel-count minx miny maxx maxy)
(let* ((byte-bound (* 8 (floor minx 8)))
(vax-byte-width (1+ (floor (- maxx byte-bound) 8)))
#+:EXPLORER (default-cons-area *bitplane-area*)
(extents (make-extents-struct :byte-bound byte-bound
:byte-width (* (ceiling vax-byte-width 4) 4)
:pixel-count pixel-count
:minx minx
:miny miny
:maxx maxx
:maxy maxy)))
#+:EXPLORER (declare (special default-cons-area))
extents))
(defun make-bitplane-array (x y)
(let (#+:EXPLORER (default-cons-area *bitplane-area*))
#+:EXPLORER (declare (special default-cons-area))
(make-array (list y x) :element-type 'bit)))
(defun nullp (extents)
(unless (extents-p extents) (error "Attempt to access unidentified structure as extents"))
(zerop (pixel-count-of extents)))
(defun bitplane-to-scratch-plane (extents bitplane &key (alu #+:EXPLORER 'logand
#-:EXPLORER :and))
(let ((to-x (+ (byte-bound-of extents) *col-offset*))
(to-y (+ (miny-of extents) *row-offset*))
(width (* 8 (byte-width-of extents)))
(height (1+ (- (maxy-of extents)(miny-of extents)))))
(unless (zerop (mod width 32))
(error "bitplane is not a multiple of 4 bytes (32 bits) wide"))
(bitblt alu width height bitplane 0 0 *scratch-bitplane* to-x to-y)))
(defun scratch-plane-emptyp (width height from-x from-y)
(when (or (minusp width) (minusp height)) (error "internal counting error -- call Bruce"))
(block top-level
(do ((x (+ from-x *col-offset*) (1+ x))
(x-stop (+ width from-x *col-offset*)))
((<= x-stop x) nil)
(do ((y (+ *row-offset* from-y) (1+ y))
(y-stop (+ height from-y *row-offset*)))
((<= y-stop y) nil)
(when (/= 0 (aref *scratch-bitplane* y x))
(return-from top-level t))))))
(defun scratch-bitplane-count (width height from-x from-y &aux (sum 0))
(when (or (minusp width) (minusp height)) (error "internal counting error -- call Bruce"))
(do ((x (+ from-x *col-offset*) (1+ x))
(x-stop (+ width from-x *col-offset*)))
((<= x-stop x) sum)
(do ((y (+ *row-offset* from-y) (1+ y))
(y-stop (+ height from-y *row-offset*)))
((<= y-stop y) nil)
(when (/= 0 (aref *scratch-bitplane* y x))
(incf sum)))))
(defun scratch-bitplane-to-bitplane (width height from-x from-y)
(loop (if (or (<= height 0)
(scratch-plane-emptyp width 1 from-x from-y))
(return nil)
(progn (incf from-y)
(decf height))))
(loop (if (or (<= width 0)
(scratch-plane-emptyp 1 height from-x from-y))
(return nil)
(progn (incf from-x)
(decf width))))
(loop (if (or (<= height 0)
(scratch-plane-emptyp width 1 from-x (+ from-y height -1)))
(return nil)
(decf height)))
(loop (if (or (<= width 0)
(scratch-plane-emptyp 1 height (+ from-x width -1) from-y))
(return nil)
(decf width)))
(let ((extents nil)(bitplane nil))
(if (or (<= width 0) (<= height 0))
;;make an empty bitplane
(progn
(setf extents (make-extents 0 from-x from-y from-x from-y))
(setf bitplane (make-bitplane-array 32 1)))
;;else make and a real bitplane and fill it in
(progn
(setf extents (make-extents 0 from-x from-y (+ from-x width -1) (+ from-y height -1)))
(setf bitplane (make-bitplane-array (* 8 (byte-width-of extents)) height))
(bitblt #+:EXPLORER tv::alu-seta #-:EXPLORER :set width height
*scratch-bitplane* (+ from-x *col-offset*) (+ from-y *row-offset*)
bitplane (- from-x (byte-bound-of extents)) 0)))
(values extents bitplane)))
(defun clear-scratch-bitplane ()
(bitblt #+:EXPLORER tv::alu-seta
#-:EXPLORER :set
*scratch-array-size* *scratch-array-size* *clean-bitplane* 0 0
*scratch-bitplane* 0 0))
(defstruct pixelmap
extents
bitplane
)
(defun pixel-count (token-pixelmap-path)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap (if (pixelmap-p token-pixelmap-path)
token-pixelmap-path
(value token-pixelmap-path)))
(extents (pixelmap-extents pixelmap))
(bitplane (pixelmap-bitplane pixelmap)))
(check-bitplane-and-extents extents bitplane)
(let ((min-x (minx-of extents))
(max-x (maxx-of extents))
(min-y (miny-of extents))
(max-y (maxy-of extents)))
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents bitplane :alu #-:EXPLORER :set
#+:EXPLORER tv::alu-seta)
(scratch-bitplane-count (1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)))))
(defun intersectp (token-pixelmap-path1 token-pixelmap-path2)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2)))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (max (minx-of extents1)(minx-of extents2)))
(max-x (min (maxx-of extents1)(maxx-of extents2)))
(min-y (max (miny-of extents1)(miny-of extents2)))
(max-y (min (maxy-of extents1)(maxy-of extents2))))
(if (or (< max-x min-x) (< max-y min-y))
nil
(progn
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :set
#+:EXPLORER tv::alu-seta)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :and
#+:EXPLORER tv::boole-and)
(scratch-plane-emptyp (1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)))))))
(defun intersect-count (token-pixelmap-path1 token-pixelmap-path2)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2)))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (max (minx-of extents1)(minx-of extents2)))
(max-x (min (maxx-of extents1)(maxx-of extents2)))
(min-y (max (miny-of extents1)(miny-of extents2)))
(max-y (min (maxy-of extents1)(maxy-of extents2))))
(if (or (< max-x min-x) (< max-y min-y))
0
(progn
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :set
#+:EXPLORER tv::alu-seta)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :and
#+:EXPLORER tv::boole-and)
(scratch-bitplane-count (1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)))))))
(defun intersectp-with-token (token-pixelmap-path1 token-pixelmap-path2 resulting-token-pixelmap-path)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2))
(bitplane nil) (extents nil))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (max (minx-of extents1)(minx-of extents2)))
(max-x (min (maxx-of extents1)(maxx-of extents2)))
(min-y (max (miny-of extents1)(miny-of extents2)))
(max-y (min (maxy-of extents1)(maxy-of extents2))))
(clear-scratch-bitplane)
(if (or (< max-x min-x) (< max-y min-y))
(progn
(multiple-value-setq (extents bitplane)
(scratch-bitplane-to-bitplane
0 0 min-x min-y))
(setf (extents-pixel-count extents) 0))
(progn
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :set
#+:EXPLORER tv::alu-seta)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :and
#+:EXPLORER tv::boole-and)
(multiple-value-setq (extents bitplane)
(scratch-bitplane-to-bitplane
(1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y))
(setf (extents-pixel-count extents)
(scratch-bitplane-count
(1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y))))
(setf (value resulting-token-pixelmap-path)
(make-pixelmap :extents extents
:bitplane bitplane))
(not (zerop (extents-pixel-count extents)))))))
(defun unionp (token-pixelmap-path1 token-pixelmap-path2)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2)))
(not (and (nullp extents1)(nullp extents2))))))
(defun union-count (token-pixelmap-path1 token-pixelmap-path2)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2)))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (min (minx-of extents1)(minx-of extents2)))
(max-x (max (maxx-of extents1)(maxx-of extents2)))
(min-y (min (miny-of extents1)(miny-of extents2)))
(max-y (max (maxy-of extents1)(maxy-of extents2))))
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :ior
#+:EXPLORER tv::boole-ior)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :ior
#+:EXPLORER tv::boole-ior)
(scratch-bitplane-count (1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)))))
(defun unionp-with-token (token-pixelmap-path1 token-pixelmap-path2 resulting-token-pixelmap-path)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2)))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (min (minx-of extents1)(minx-of extents2)))
(max-x (max (maxx-of extents1)(maxx-of extents2)))
(min-y (min (miny-of extents1)(miny-of extents2)))
(max-y (max (maxy-of extents1)(maxy-of extents2))))
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :ior
#+:EXPLORER tv::boole-ior)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :ior
#+:EXPLORER tv::boole-ior)
(multiple-value-bind (extents bitplane)
(scratch-bitplane-to-bitplane
(1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)
(setf (extents-pixel-count extents)
(scratch-bitplane-count
(1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y))
(setf (value resulting-token-pixelmap-path)
(make-pixelmap :extents extents
:bitplane bitplane))
(not (zerop (extents-pixel-count extents))))))))
(defun differencep (token-pixelmap-path1 token-pixelmap-path2)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2)))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (minx-of extents1))
(max-x (maxx-of extents1))
(min-y (miny-of extents1))
(max-y (maxy-of extents1)))
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :set
#+:EXPLORER tv::alu-seta)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :andc1
#+:EXPLORER tv::boole-andc1)
(scratch-plane-emptyp (1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)))))
(defun difference-count (token-pixelmap-path1 token-pixelmap-path2)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2)))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (minx-of extents1))
(max-x (maxx-of extents1))
(min-y (miny-of extents1))
(max-y (maxy-of extents1)))
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :set
#+:EXPLORER tv::alu-seta)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :andc1
#+:EXPLORER tv::boole-andc1)
(scratch-bitplane-count (1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)))))
(defun differencep-with-token (token-pixelmap-path1 token-pixelmap-path2 resulting-token-pixelmap-path)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap1 (value token-pixelmap-path1))
(extents1 (pixelmap-extents pixelmap1))
(bitplane1 (pixelmap-bitplane pixelmap1))
(pixelmap2 (value token-pixelmap-path2))
(extents2 (pixelmap-extents pixelmap2))
(bitplane2 (pixelmap-bitplane pixelmap2)))
(check-bitplane-and-extents extents1 bitplane1 extents2 bitplane2)
(let ((min-x (minx-of extents1))
(max-x (maxx-of extents1))
(min-y (miny-of extents1))
(max-y (maxy-of extents1)))
(clear-scratch-bitplane)
(bitplane-to-scratch-plane extents1 bitplane1 :alu #-:EXPLORER :set
#+:EXPLORER tv::alu-seta)
(bitplane-to-scratch-plane extents2 bitplane2 :alu #-:EXPLORER :andc1
#+:EXPLORER tv::boole-andc1)
(multiple-value-bind (extents bitplane)
(scratch-bitplane-to-bitplane
(1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y)
(setf (extents-pixel-count extents)
(scratch-bitplane-count (1+ (- max-x min-x)) (1+ (- max-y min-y)) min-x min-y))
(setf (value resulting-token-pixelmap-path)
(make-pixelmap :extents extents
:bitplane bitplane))
(not (zerop (extents-pixel-count extents))))))))
(defun print-bitplane (token-pixelmap-path)
(with-lock (*scratch-bitplane-lock*)
(let* ((pixelmap (value token-pixelmap-path))
(bitplane (pixelmap-bitplane pixelmap))
(extents (pixelmap-extents pixelmap)))
(check-bitplane-and-extents extents bitplane)
(format t "~%BYTE BOUND = ~A; BYTE WIDTH = ~A; MINY = ~A; MINX = ~A; MAXY = ~A; MAXX = ~A~% "
(byte-bound-of extents)(byte-width-of extents)
(miny-of extents)(minx-of extents)
(maxy-of extents)(maxx-of extents))
(dotimes (x (* 8 (byte-width-of extents))) (format t "-"))
(dotimes (y (1+ (- (maxy-of extents)(miny-of extents))))
(format t "~%|")
(dotimes (x (* 8 (byte-width-of extents)))
(if (= 1 (aref bitplane y x))
(format t "*")
(format t " ")))
(format t "|"))
(format t "~% ")
(dotimes (x (* 8 (byte-width-of extents)) t) (format t "-")))))