[gsharp-cvs] CVS update: gsharp/score-pane.lisp gsharp/sdl.lisp

Robert Strandh rstrandh at common-lisp.net
Wed Jan 4 19:08:13 UTC 2006


Update of /project/gsharp/cvsroot/gsharp
In directory common-lisp.net:/tmp/cvs-serv11873

Modified Files:
	score-pane.lisp sdl.lisp 
Log Message:
Fixed the beam-drawing problem reported by Christophe Rhodes.  There
might still be some glitches, but the foundation is now more sound, so
that future glitches should be easier to fix.


Date: Wed Jan  4 20:08:13 2006
Author: rstrandh

Index: gsharp/score-pane.lisp
diff -u gsharp/score-pane.lisp:1.18 gsharp/score-pane.lisp:1.19
--- gsharp/score-pane.lisp:1.18	Wed Dec  7 04:38:27 2005
+++ gsharp/score-pane.lisp	Wed Jan  4 20:08:12 2006
@@ -454,9 +454,11 @@
   ((light-glyph-p :initarg :light-glyph-p)
    (thickness :initarg :thickness)))
 
-(defun draw-horizontal-beam (medium x1 y1 x2 thickness)
-  (let ((y2 (- y1 thickness)))
-    (draw-rectangle* medium x1 y1 x2 y2)))
+;;; draw a horizontal beam around the vertical reference 
+;;; point y.
+(defun draw-horizontal-beam (medium x1 y x2)
+  (multiple-value-bind (down up) (beam-offsets *font*)
+    (draw-rectangle* medium x1 (+ y up) x2 (+ y down))))
 
 (defvar *darker-gray-progressions*)
 (defvar *lighter-gray-progressions*)
@@ -576,34 +578,39 @@
 	      (draw-upward-beam medium x1 y2 y1 thickness
 				  (/ (- x2 x1) (- y2 y1))))))))))
 
-(defun draw-sloped-beam (medium x1 y1 x2 y2 thickness inverse-slope)
-  (let ((transformation (medium-transformation *pane*)))
-    (cond ((< y1 y2)
-	   (when (stream-recording-p *pane*)
-	     (multiple-value-bind (xx1 yy1)
-		 (transform-position transformation x1 y1)
-	       (multiple-value-bind (xx2 yy2)
-		   (transform-position transformation x2 y2)
-		 (stream-add-output-record
-		  *pane* (make-instance 'downward-beam-output-record
-			   :x1 xx1 :y1 yy1 :x2 xx2 :y2 yy2
-                           :light-glyph-p *light-glyph*
-			   :thickness thickness :ink (medium-ink medium))))))
-	   (when (stream-drawing-p *pane*)
-	     (draw-downward-beam medium x1 y1 y2 thickness inverse-slope)))
-	  (t
-	   (when (stream-recording-p *pane*)
-	     (multiple-value-bind (xx1 yy1)
-		 (transform-position transformation x1 y1)
-	       (multiple-value-bind (xx2 yy2)
-		   (transform-position transformation x2 y2)
-		 (stream-add-output-record
-		  *pane* (make-instance 'upward-beam-output-record
-			   :x1 xx1 :y1 yy2 :x2 xx2 :y2 yy1
-                           :light-glyph-p *light-glyph*
-			   :thickness thickness :ink (medium-ink medium))))))
-	   (when (stream-drawing-p *pane*)
-	     (draw-upward-beam medium x1 y1 y2 thickness inverse-slope))))))
+;;; draw a sloped beam.  The vertical reference points 
+;;; of the two end points are indicated by y1 and y2. 
+(defun draw-sloped-beam (medium x1 y1 x2 y2)
+  (multiple-value-bind (down up) (beam-offsets *font*)
+    (let ((transformation (medium-transformation *pane*))
+	  (inverse-slope (abs (/ (- x2 x1) (- y2 y1))))
+	  (thickness (- down up)))
+      (cond ((< y1 y2)
+	     (when (stream-recording-p *pane*)
+	       (multiple-value-bind (xx1 yy1)
+		   (transform-position transformation x1 y1)
+		 (multiple-value-bind (xx2 yy2)
+		     (transform-position transformation x2 y2)
+		   (stream-add-output-record
+		    *pane* (make-instance 'downward-beam-output-record
+					  :x1 xx1 :y1 yy1 :x2 xx2 :y2 yy2
+					  :light-glyph-p *light-glyph*
+					  :thickness thickness :ink (medium-ink medium))))))
+	     (when (stream-drawing-p *pane*)
+	       (draw-downward-beam medium x1 y1 y2 thickness inverse-slope)))
+	    (t
+	     (when (stream-recording-p *pane*)
+	       (multiple-value-bind (xx1 yy1)
+		   (transform-position transformation x1 y1)
+		 (multiple-value-bind (xx2 yy2)
+		     (transform-position transformation x2 y2)
+		   (stream-add-output-record
+		    *pane* (make-instance 'upward-beam-output-record
+					  :x1 xx1 :y1 yy2 :x2 xx2 :y2 yy1
+					  :light-glyph-p *light-glyph*
+					  :thickness thickness :ink (medium-ink medium))))))
+	     (when (stream-drawing-p *pane*)
+	       (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)
@@ -612,16 +619,13 @@
       (multiple-value-bind (left right) (stem-offsets *font*)
 	(let* ((xx1 (+ x1 left))
 	       (xx2 (+ x2 right))
-	       (offset (round (staff-step 1/3)))
+	       (offset (beam-hang-sit-offset *font*))
 	       (y1 (- (+ (staff-step staff-step-1) (* offset1 offset))))
 	       (y2 (- (+ (staff-step staff-step-2) (* offset2 offset))))
-	       (slope (abs (/ (- y2 y1) (- xx2 xx1))))
-	       (thickness (/ (staff-line-distance *font*) 2))
 	       (medium (sheet-medium pane)))
-	  (assert (< slope 1))
 	  (if (= y1 y2)
-	      (draw-horizontal-beam pane xx1 y1 xx2 thickness)
-	      (draw-sloped-beam medium xx1 y1 xx2 y2 thickness (/ slope)))))))
+	      (draw-horizontal-beam pane xx1 y1 xx2)
+	      (draw-sloped-beam medium xx1 y1 xx2 y2))))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;


Index: gsharp/sdl.lisp
diff -u gsharp/sdl.lisp:1.13 gsharp/sdl.lisp:1.14
--- gsharp/sdl.lisp:1.13	Wed Jan  4 18:35:51 2006
+++ gsharp/sdl.lisp	Wed Jan  4 20:08:12 2006
@@ -115,7 +115,8 @@
       (setf beam-offset-up
 	    (- (ceiling (/ staff-line-distance 2) 2)))
       (setf beam-hang-sit-offset
-	    (/ (- (+ beam-offset-down beam-offset-up) staff-line-thickness) 2)))))
+	    (let ((beam-thickness (- beam-offset-down beam-offset-up)))
+	      (/ (- beam-thickness staff-line-thickness) 2))))))
 
 (defgeneric gf-char (glyph))
 (defgeneric pixmap (glyph))




More information about the Gsharp-cvs mailing list