[gsharp-cvs] CVS gsharp

crhodes crhodes at common-lisp.net
Tue Aug 7 11:06:10 UTC 2007


Update of /project/gsharp/cvsroot/gsharp
In directory clnet:/tmp/cvs-serv10489

Modified Files:
	drawing.lisp gui.lisp packages.lisp 
Log Message:
Printing to file.

It's still somewhat hacky, but the worst of it is gone:

* light glyphs ink is taken from the view, so we can construct a dark
  ink for light glyphs;
* code to draw a single page is shared between the printing and 
  screen-drawing routines;
* new-page is called the right number of times;
* the user is prompted for a filename (with a sensible default).

Remaining stuff to do:

* factor out a little bit more shared code between draw-buffer and 
  print-buffer;
* when creating the view, copy the current view;
* be cleverer about the medium transformation.


--- /project/gsharp/cvsroot/gsharp/drawing.lisp	2007/07/27 22:31:04	1.81
+++ /project/gsharp/cvsroot/gsharp/drawing.lisp	2007/08/07 11:06:09	1.82
@@ -541,27 +541,44 @@
 			    (- (line-width method) timesig-offset)
 			    (lines-per-page method)))
 
+(defun draw-page (pane buffer x y staves maxmethod page-measures)
+  (let* ((systems-per-page (max 1 (floor 12 (length staves))))
+         (measure-seqs (layout-page page-measures systems-per-page maxmethod)))
+    (dolist (measures measure-seqs)
+      (let* ((toffset (compute-timesig-offset staves measures))
+             (method (method-for-timesig (buffer-cost-method buffer) toffset)))
+        (compute-and-draw-system pane buffer staves measures method
+                                 x y toffset (right-edge buffer))
+        (incf y (+ 20 (* 70 (length staves))))))))
+
 (defmethod draw-buffer (pane (buffer buffer) *cursor* x y)
   (score-pane:with-staff-size 6
     (let* ((staves (staves buffer))
 	   (max-timesig-offset (* (score-pane:staff-step 2.5) 7))
-	   (method (method-for-timesig (buffer-cost-method buffer) max-timesig-offset))
-	   (right-edge (right-edge buffer))
-	   (systems-per-page (max 1 (floor 12 (length staves)))))
+	   (method (method-for-timesig 
+                    (buffer-cost-method buffer) max-timesig-offset)))
+      (loop for staff in staves
+	    for offset from 0 by 70 do
+	    (setf (staff-yoffset staff) offset))
+      (dopages (page-measures buffer)
+        (when (cursor-in-measures-p *cursor* page-measures)
+          (draw-page pane buffer x y staves method page-measures))))))
+
+(defmethod print-buffer (pane (buffer buffer) *cursor* x y)
+  (score-pane:with-staff-size 6
+    (let* ((staves (staves buffer))
+	   (max-timesig-offset (* (score-pane:staff-step 2.5) 7))
+	   (method (method-for-timesig 
+                    (buffer-cost-method buffer) max-timesig-offset)))
       (loop for staff in staves
 	    for offset from 0 by 70 do
 	    (setf (staff-yoffset staff) offset))
-      (let ((yy y))
-	(dopages (page-measures buffer)
-	  (when (cursor-in-measures-p *cursor* page-measures)
-	    (let ((measure-seqs (layout-page page-measures systems-per-page method)))
-	      (dolist (measures measure-seqs)
-		(let* ((toffset (compute-timesig-offset staves measures))
-		       (method (method-for-timesig 
-				(buffer-cost-method buffer) toffset)))
-		  (compute-and-draw-system pane buffer staves measures
-					   method x yy toffset right-edge)
-		  (incf yy (+ 20 (* 70 (length staves)))))))))))))
+      (let ((first t))
+        (dopages (page-measures buffer)
+          (unless first
+            (new-page pane))
+          (draw-page pane buffer x y staves method page-measures)
+          (setq first nil))))))
 
 (define-stealth-mixin xelement () element
   ((final-absolute-xoffset :accessor final-absolute-element-xoffset)))
--- /project/gsharp/cvsroot/gsharp/gui.lisp	2007/07/06 14:16:20	1.81
+++ /project/gsharp/cvsroot/gsharp/gui.lisp	2007/08/07 11:06:09	1.82
@@ -200,7 +200,8 @@
     (score-pane:with-score-pane pane
       (draw-buffer pane buffer (current-cursor)
                    (left-margin buffer) 100)
-      (gsharp-drawing::draw-the-cursor pane (current-cursor) (cursor-element (current-cursor)) (last-note (input-state *application-frame*)))
+      (draw-the-cursor pane (current-cursor) (cursor-element (current-cursor))
+                       (last-note (input-state *application-frame*)))
       (multiple-value-bind (minx miny maxx maxy)
           (bounding-rectangle* pane)
         (declare (ignore minx maxx))
@@ -1505,3 +1506,36 @@
 
 (defmethod frame-make-new-buffer ((frame gsharp) &key &allow-other-keys)
   (make-instance 'buffer))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;;
+;;; Printing
+
+(defun print-buffer-filename ()
+  (let* ((buffer (current-buffer))
+         (filepath (filepath buffer))
+         (name (name buffer))
+         (defaults (or filepath (merge-pathnames (make-pathname :name name)
+                                                 (user-homedir-pathname)))))
+    (merge-pathnames (make-pathname :type "ps") defaults)))
+
+(define-gsharp-command (com-print-buffer-to-file :name t)
+    ((filepath 'pathname
+               :prompt "Print To: " :prompt-mode :raw
+               :default (print-buffer-filename) :default-type 'pathname
+               :insert-default t))
+  (with-open-file (ps filepath :direction :output :if-exists :supersede)
+    (with-output-to-postscript-stream (s ps)
+      (setf (stream-default-view s)
+            ;; FIXME: should probably get the class of the view from
+            ;; the current buffer or window or something.
+            (make-instance 'orchestra-view :light-glyphs-ink +black+ 
+                           :buffer (current-buffer) :cursor (current-cursor)))
+      (setf (medium-transformation s)
+            ;; FIXME: This scaling works for me (A4 paper, default
+            ;; gsharp buffer sizes.
+            (compose-scaling-with-transformation (medium-transformation s)
+                                                 0.8 0.8))
+      (print-buffer s (current-buffer) (current-cursor) 
+                    (left-margin (current-buffer)) 100))))
+
--- /project/gsharp/cvsroot/gsharp/packages.lisp	2007/07/18 07:51:54	1.61
+++ /project/gsharp/cvsroot/gsharp/packages.lisp	2007/08/07 11:06:09	1.62
@@ -168,7 +168,7 @@
   (:use :clim :clim-lisp :gsharp-buffer :gsharp-measure :gsharp-cursor
 	:gsharp-utilities :sdl :gsharp-beaming :obseq)
   (:shadowing-import-from :gsharp-buffer #:rest)
-  (:export #:draw-buffer #:draw-the-cursor))
+  (:export #:draw-buffer #:draw-the-cursor #:print-buffer))
 
 (defpackage :gsharp-play
   (:use :common-lisp :midi :gsharp-buffer)




More information about the Gsharp-cvs mailing list