Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv6535
Modified Files:
gui.lisp score-pane.lisp
Log Message:
More modifications to allow incremental redisplay. There is still a
problem with beam drawing which has to be converted to use the correct
superclass.
Date: Mon Aug 8 01:18:03 2005
Author: rstrandh
Index: gsharp/gui.lisp
diff -u gsharp/gui.lisp:1.22 gsharp/gui.lisp:1.23
--- gsharp/gui.lisp:1.22 Tue Aug 2 02:34:41 2005
+++ gsharp/gui.lisp Mon Aug 8 01:18:02 2005
@@ -26,7 +26,7 @@
(score (let ((win (make-pane 'score-pane:score-pane
:width 400 :height 500
:name "score"
-;; :display-time :no-clear
+ :display-time :no-clear
:display-function 'display-score
:command-table 'total-melody-table)))
(setf (windows *application-frame*) (list win))
Index: gsharp/score-pane.lisp
diff -u gsharp/score-pane.lisp:1.9 gsharp/score-pane.lisp:1.10
--- gsharp/score-pane.lisp:1.9 Tue Aug 2 02:34:41 2005
+++ gsharp/score-pane.lisp Mon Aug 8 01:18:02 2005
@@ -50,12 +50,7 @@
;;;
;;; output recording
-;;; we should not have to inherit from standard-boudning-rectangle,
-;;; but the implementation of incremental redisplay in McCLIM assumes
-;;; that this is the case for all output records participating in
-;;; incremental redisplay.
-
-(defclass score-output-record (displayed-output-record standard-bounding-rectangle)
+(defclass score-output-record (displayed-output-record)
((parent :initarg :parent :initform nil :accessor output-record-parent)
(x :initarg :x1 :initarg :x-position)
(y :initarg :y1 :initarg :y-position)
@@ -108,34 +103,45 @@
(with-bounding-rectangle* (x1 y1 x2 y2) record
(region-intersects-region-p region (make-rectangle* x1 y1 x2 y2))))
-;;;;;;;;;;;;;;;;;; pixmap output record
-
-(defclass pixmap-output-record (score-output-record)
- ((pixmap :initarg :pixmap)))
-
-(defmethod replay-output-record ((record pixmap-output-record) stream
- &optional (region +everywhere+)
- (x-offset 0) (y-offset 0))
- (declare (ignore x-offset y-offset region))
- (multiple-value-bind (x y) (output-record-position record)
- (with-slots (pixmap) record
- (let ((medium (sheet-medium stream)))
- (copy-from-pixmap pixmap 0 0 (pixmap-width pixmap) (pixmap-height pixmap)
- medium x y)))))
+;;;;;;;;;;;;;;;;;; pixmap drawing
-(defun make-pixmap-record (class medium x1 y1 x2 y2 pixmap)
- (multiple-value-bind (x1 y1)
- (transform-position (medium-transformation medium) x1 y1)
- (multiple-value-bind (x2 y2)
- (transform-position (medium-transformation medium) x2 y2)
- (make-instance class :x1 x1 :x2 x2 :y1 y1 :y2 y2 :pixmap pixmap))))
-
-(defun add-new-pixmap-record (class stream pixmap x y)
- (let ((width (pixmap-width pixmap))
- (height (pixmap-height pixmap)))
- (stream-add-output-record
- stream (make-pixmap-record class (sheet-medium stream)
- x y (+ x width) (+ y height) pixmap))))
+(climi::def-grecording draw-pixmap (() pixmap pm-x pm-y) ()
+ (climi::with-transformed-position ((medium-transformation medium) pm-x pm-y)
+ (setf (slot-value climi::graphic 'pm-x) pm-x
+ (slot-value climi::graphic 'pm-y) pm-y)
+ (values pm-x pm-y (+ pm-x (pixmap-width pixmap)) (+ pm-y (pixmap-height pixmap)))))
+
+(climi::def-graphic-op draw-pixmap (pixmap pm-x pm-y))
+
+(defmethod medium-draw-pixmap* ((medium clim:medium) pixmap pm-x pm-y)
+ (copy-from-pixmap pixmap 0 0 (pixmap-width pixmap) (pixmap-height pixmap)
+ medium pm-x pm-y))
+
+(climi::defmethod* (setf output-record-position) :around
+ (nx ny (record draw-pixmap-output-record))
+ (climi::with-standard-rectangle* (:x1 x1 :y1 y1)
+ record
+ (with-slots (pm-x pm-y)
+ record
+ (let ((dx (- nx x1))
+ (dy (- ny y1)))
+ (multiple-value-prog1
+ (call-next-method)
+ (incf pm-x dx)
+ (incf pm-y dy))))))
+
+(climi::defrecord-predicate draw-pixmap-output-record (pm-x pm-y)
+ (and (climi::if-supplied (pm-x coordinate)
+ (climi::coordinate= (slot-value climi::record 'pm-x) pm-x))
+ (climi::if-supplied (pm-y coordinate)
+ (climi::coordinate= (slot-value climi::record 'pm-y) pm-y))))
+
+(defun draw-pixmap* (sheet pixmap x y
+ &rest args
+ &key clipping-region transformation)
+ (declare (ignore clipping-region transformation))
+ (climi::with-medium-options (sheet args)
+ (medium-draw-pixmap* medium pixmap x y)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;
@@ -153,10 +159,7 @@
(multiple-value-bind (dx dy) (glyph-offsets *font* (+ glyph-no extra))
(let ((x1 (+ x dx))
(y1 (+ (staff-step staff-step) dy)))
- (when (stream-recording-p pane)
- (add-new-pixmap-record 'pixmap-output-record pane pixmap x1 y1))
- (when (stream-drawing-p pane)
- (copy-from-pixmap pixmap 0 0 width height pane x1 y1))))))
+ (draw-pixmap* pane pixmap x1 y1)))))
(defun draw-stack (pane glyph-lower glyph-upper glyph-two x staff-step how-many)
(draw-antialiased-glyph pane glyph-lower x staff-step)
@@ -179,36 +182,18 @@
;;;;;;;;;;;;;;;;;; helper macro
-(defmacro define-pixmap-recording ((record-name medium-draw-name draw-name args) &body body)
- `(progn
- (defclass ,record-name (pixmap-output-record) ())
-
- (defgeneric ,medium-draw-name (medium pixmap x y))
-
- (defmethod ,medium-draw-name ((medium medium) pixmap x y)
- (copy-from-pixmap pixmap 0 0 (pixmap-width pixmap) (pixmap-height pixmap)
- medium x y))
-
- (defmethod ,medium-draw-name ((sheet sheet) pixmap x y)
- (,medium-draw-name (sheet-medium sheet) pixmap x y))
-
- (defmethod ,medium-draw-name :around ((pane score-pane) pixmap x y)
- (when (stream-recording-p pane)
- (add-new-pixmap-record ',record-name pane pixmap x y))
- (when (stream-drawing-p pane)
- (,medium-draw-name (sheet-medium pane) pixmap x y)))
-
- (defun ,draw-name (pane ,@args x staff-step)
- (let* ((extra (if *light-glyph* 1 0))
- (glyph-no ,@body)
- (matrix (glyph *font* (+ glyph-no extra)))
- (pixmap (pane-pixmap pane matrix)))
- (multiple-value-bind (dx dy) (glyph-offsets *font* (+ glyph-no extra))
- (,medium-draw-name pane pixmap (+ x dx) (- dy (staff-step staff-step))))))))
+(defmacro define-pixmap-recording ((draw-name args) &body body)
+ `(defun ,draw-name (pane ,@args x staff-step)
+ (let* ((extra (if *light-glyph* 1 0))
+ (glyph-no ,@body)
+ (matrix (glyph *font* (+ glyph-no extra)))
+ (pixmap (pane-pixmap pane matrix)))
+ (multiple-value-bind (dx dy) (glyph-offsets *font* (+ glyph-no extra))
+ (draw-pixmap* pane pixmap (+ x dx) (- dy (staff-step staff-step)))))))
;;;;;;;;;;;;;;;;;; notehead
-(define-pixmap-recording (notehead-output-record medium-draw-notehead draw-notehead (name))
+(define-pixmap-recording (draw-notehead (name))
(ecase name
(:whole +glyph-whole+)
(:half +glyph-half+)
@@ -223,7 +208,7 @@
;;;;;;;;;;;;;;;;;; accidental
-(define-pixmap-recording (accidental-output-record medium-draw-accidental draw-accidental (name))
+(define-pixmap-recording (draw-accidental (name))
(ecase name
(:natural +glyph-natural+)
(:flat +glyph-flat+)
@@ -233,7 +218,7 @@
;;;;;;;;;;;;;;;;;; clef
-(define-pixmap-recording (clef-output-record medium-draw-clef draw-clef (name))
+(define-pixmap-recording (draw-clef (name))
(ecase name
(:treble +glyph-g-clef+)
(:bass +glyph-f-clef+)
@@ -248,7 +233,7 @@
;;;;;;;;;;;;;;;;;; rest
-(define-pixmap-recording (rest-output-record medium-draw-rest draw-rest (duration))
+(define-pixmap-recording (draw-rest (duration))
(ecase duration
(1 +glyph-whole-rest+)
(1/2 +glyph-half-rest+)
@@ -261,7 +246,7 @@
;;;;;;;;;;;;;;;;;; flags down
-(define-pixmap-recording (flags-down-output-record medium-draw-flags-down draw-flags-down (nb))
+(define-pixmap-recording (draw-flags-down (nb))
(ecase nb
(1 +glyph-flags-down-one+)
(2 +glyph-flags-down-two+)
@@ -271,7 +256,7 @@
;;;;;;;;;;;;;;;;;; flags up
-(define-pixmap-recording (flags-up-output-record medium-draw-flags-up draw-flags-up (nb))
+(define-pixmap-recording (draw-flags-up (nb))
(ecase nb
(1 +glyph-flags-up-one+)
(2 +glyph-flags-up-two+)
@@ -281,7 +266,7 @@
;;;;;;;;;;;;;;;;;; dot
-(define-pixmap-recording (dot-output-record medium-draw-dot draw-dot ())
+(define-pixmap-recording (draw-dot ())
+glyph-dot+)
;;;;;;;;;;;;;;;;;; staff line
@@ -505,30 +490,30 @@
(- x2 x1) 1
medium x1 (- y thickness))))
-(defun draw-upward-beam-segment (medium x1 y x2 thickness)
+(defun draw-downward-beam-segment (medium x1 y x2 thickness)
(draw-segment medium x1 (1+ y) x2 thickness
*darker-gray-progressions* *lighter-gray-progressions*))
-(defun draw-downward-beam-segment (medium x1 y x2 thickness)
+(defun draw-upward-beam-segment (medium x1 y x2 thickness)
(draw-segment medium x1 y x2 thickness
*lighter-gray-progressions* *darker-gray-progressions*))
-(defun draw-upward-beam (medium x1 y1 y2 thickness inverse-slope)
+(defun draw-downward-beam (medium x1 y1 y2 thickness inverse-slope)
(loop for y from y1 below y2
for x from x1 by inverse-slope do
- (draw-upward-beam-segment medium (round x) y
+ (draw-downward-beam-segment medium (round x) y
(round (+ x inverse-slope)) thickness)))
-(defun draw-downward-beam (medium x1 y1 y2 thickness inverse-slope)
+(defun draw-upward-beam (medium x1 y1 y2 thickness inverse-slope)
(loop for y from y1 above y2
for x from x1 by inverse-slope do
- (draw-downward-beam-segment medium (round x) y
+ (draw-upward-beam-segment medium (round x) y
(round (+ x inverse-slope)) thickness)))
-(defclass upward-beam-output-record (beam-output-record)
+(defclass downward-beam-output-record (beam-output-record)
())
-(defmethod replay-output-record ((record upward-beam-output-record) (stream score-pane)
+(defmethod replay-output-record ((record downward-beam-output-record) (stream score-pane)
&optional (region +everywhere+)
(x-offset 0) (y-offset 0))
(declare (ignore x-offset y-offset region))
@@ -539,13 +524,13 @@
(with-drawing-options (medium :ink ink)
(let ((*lighter-gray-progressions* (lighter-gray-progressions stream))
(*darker-gray-progressions* (darker-gray-progressions stream)))
- (draw-upward-beam medium x1 y1 y2 thickness
+ (draw-downward-beam medium x1 y1 y2 thickness
(/ (- x2 x1) (- y2 y1))))))))))
-(defclass downward-beam-output-record (beam-output-record)
+(defclass upward-beam-output-record (beam-output-record)
())
-(defmethod replay-output-record ((record downward-beam-output-record) (stream score-pane)
+(defmethod replay-output-record ((record upward-beam-output-record) (stream score-pane)
&optional (region +everywhere+)
(x-offset 0) (y-offset 0))
(declare (ignore x-offset y-offset region))
@@ -556,7 +541,7 @@
(with-drawing-options (medium :ink ink)
(let ((*lighter-gray-progressions* (lighter-gray-progressions stream))
(*darker-gray-progressions* (darker-gray-progressions stream)))
- (draw-downward-beam medium x1 y2 y1 thickness
+ (draw-upward-beam medium x1 y2 y1 thickness
(/ (- x2 x1) (- y2 y1))))))))))
(defun draw-sloped-beam (medium x1 y1 x2 y2 thickness inverse-slope)
@@ -568,11 +553,11 @@
(multiple-value-bind (xx2 yy2)
(transform-position transformation x2 y2)
(stream-add-output-record
- *pane* (make-instance 'upward-beam-output-record
+ *pane* (make-instance 'downward-beam-output-record
:x1 xx1 :y1 yy1 :x2 xx2 :y2 yy2
:thickness thickness :ink (medium-ink medium))))))
(when (stream-drawing-p *pane*)
- (draw-upward-beam medium x1 y1 y2 thickness inverse-slope)))
+ (draw-downward-beam medium x1 y1 y2 thickness inverse-slope)))
(t
(when (stream-recording-p *pane*)
(multiple-value-bind (xx1 yy1)
@@ -580,11 +565,11 @@
(multiple-value-bind (xx2 yy2)
(transform-position transformation x2 y2)
(stream-add-output-record
- *pane* (make-instance 'downward-beam-output-record
+ *pane* (make-instance 'upward-beam-output-record
:x1 xx1 :y1 yy1 :x2 xx2 :y2 yy2
:thickness thickness :ink (medium-ink medium))))))
(when (stream-drawing-p *pane*)
- (draw-downward-beam medium x1 y1 y2 thickness inverse-slope))))))
+ (draw-upward-beam medium x1 y1 y2 thickness inverse-slope))))))
;;; an offset of -1 means hang, 0 means straddle and 1 means sit
(defun draw-beam (pane x1 staff-step-1 offset1 x2 staff-step-2 offset2)
@@ -627,14 +612,12 @@
(*darker-gray-progressions* (darker-gray-progressions pane))
(,pixmap (allocate-pixmap *pane* 800 900))
(,mirror (sheet-direct-mirror *pane*)))
-;; (draw-rectangle* ,pixmap 0 0 800 900 :filled t :ink +white+)
-;; (setf (sheet-direct-mirror *pane*) (climi::pixmap-mirror ,pixmap))
-;; (clear-output-record (stream-output-history *pane*))
-;; (with-translation (pane 0 900)
-;; (with-scaling (pane 1 -1)
- ,@body ;;))
-;; (setf (sheet-direct-mirror *pane*) ,mirror)
-;; (copy-from-pixmap ,pixmap 0 0 800 900 *pane* 0 0)
+ (draw-rectangle* ,pixmap 0 0 800 900 :filled t :ink +white+)
+ (setf (sheet-direct-mirror *pane*) (climi::pixmap-mirror ,pixmap))
+ (clear-output-record (stream-output-history *pane*))
+ ,@body
+ (setf (sheet-direct-mirror *pane*) ,mirror)
+ (copy-from-pixmap ,pixmap 0 0 800 900 *pane* 0 0)
(deallocate-pixmap ,pixmap))))
(defmacro with-vertical-score-position ((pane yref) &body body)