]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/output-gnome.scm
* scm/stencil.scm (stack-lines): return empty-stencil if argument
[lilypond.git] / scm / output-gnome.scm
index df3281206585db085e0c3de8050a6e295f73e406..9a03791402941849bf5a1ea031adb66c62caf29a 100644 (file)
@@ -21,9 +21,9 @@
 
 ;;; You need:
 ;;;
-;;;   * Rotty's g-wrap >= 1.9.1 (or TLA)
-;;;   * guile-gnome-platform >= 2.5.992 (or TLA)
-;;;   * pango >= 1.5.2 (or CVS)
+;;;   * Rotty's g-wrap >= 1.9.3 (or TLA)
+;;;   * guile-gnome-platform >= 2.7.95 (or TLA)
+;;;   * pango >= 1.6.0
 ;;;
 ;;; See also: guile-gtk-general@gnu.org
 
@@ -39,7 +39,7 @@
 ;;;   * Build LilyPond with gui support: configure --enable-gui
 ;;;
 ;;;   * Supposing that LilyPond was built in ~/cvs/savannah/lilypond,
-;;;     tell fontconfig about the feta fonts dir:
+;;;     tell fontconfig about the feta fonts dir and run fc-cache
 "
 cat > ~/.fonts.conf << EOF
 <fontconfig>
@@ -47,6 +47,7 @@ cat > ~/.fonts.conf << EOF
 <dir>/usr/share/texmf/fonts/type1/public/ec-fonts-mftraced</dir>
 </fontconfig>
 EOF
+fc-cache
 "
 ;;;     or copy all your .pfa/.pfb's to ~/.fonts if your fontconfig
 ;;;     already looks there for fonts.  Check if it works by doing:
@@ -83,14 +84,8 @@ lilypond -fgnome input/simple-song.ly
  (ice-9 regex)
  (srfi srfi-13)
  (lily)
- (gnome gtk))
-
-
-;; The name of the module will change to `canvas' rsn
-(if (resolve-module '(gnome gw canvas))
-    (use-modules (gnome gw canvas))
-    (use-modules (gnome gw libgnomecanvas)))
-
+ (gnome gtk)
+ (gnome gw canvas))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; Wrappers from guile-gnome TLA
@@ -165,23 +160,13 @@ lilypond -fgnome input/simple-song.ly
                 (+ #x80 (modulo y #x40))))))
    (else FIXME)))
   
-(define (custom-utf8 i)
-  (if (< i 80)
-      (utf8 i)
-      (utf8 (+ #xee00 i))))
-
-(define (string->utf8-string string)
-  (list->string
-   (apply append (map utf8 (map char->integer (string->list string))))))
-
-(define (char->utf8-string char)
-  (list->string (utf8 (char->integer char))))
-
-(define (draw-rectangle x1 y1 x2 y2 color width-units)
-  (make <gnome-canvas-rect>
-    #:parent (canvas-root) #:x1 x1 #:y1 y1 #:x2 x2 #:y2 y2
-    #:fill-color color #:width-units width-units))
-
+(define (char->utf8-string font char)
+  (list->string (utf8 (char->unicode-index font char))))
+  
+(define (string->utf8-string font string)
+  (apply
+   string-append
+   (map (lambda (x) (char->utf8-string font x)) (string->list string))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;; stencil outputters
@@ -195,6 +180,55 @@ lilypond -fgnome input/simple-song.ly
       (ly:all-stencil-expressions)
       (ly:all-output-backend-commands)))
 
+(define (beam width slope thick blot)
+  (define cursor '(0 . 0))
+  (define (rmoveto def x y)
+    (set! cursor (cons (+ x (car cursor)) (+ y (cdr cursor))))
+    (moveto def (car cursor) (cdr cursor)))
+  (define (rlineto def x y)
+    (set! cursor (cons (+ x (car cursor)) (+ y (cdr cursor))))
+    (lineto def (car cursor) (cdr cursor)))
+  (let* ((def (make <gnome-canvas-path-def>))
+        (bezier (make <gnome-canvas-bpath>
+                  #:parent (canvas-root)
+                  #:fill-color "black"
+                  #:outline-color "black"
+                  #:width-units blot
+                  #:join-style 'round))
+        (t (- thick blot))
+        (w (- width blot))
+        (h (* w slope)))
+    
+    (reset def)
+    (rmoveto def (/ blot 2) (/ t 2))
+    (rlineto def w (- h))
+    (rlineto def 0 (- t))
+    (rlineto def (- w) h)
+    (rlineto def 0 t)
+    (closepath def)
+    (set-path-def bezier def)
+    bezier))
+
+(define (square-beam width slope thick blot)
+  (let*
+      ((def (make <gnome-canvas-path-def>))
+       (y (* (- width) slope))
+       (props (make <gnome-canvas-bpath>
+                  #:parent (canvas-root)
+                  #:fill-color "black"
+                  #:outline-color "black"
+                  #:width-units 0.0)))
+    
+    (reset def)
+    (moveto def 0 0)
+    (lineto def width y)
+    (lineto def width (- y thick))
+    (lineto def 0 (- thick))
+    (lineto def 0 0)
+    (closepath def)
+    (set-path-def props def)
+    props))
+    
 ;; two beziers
 (define (bezier-sandwich lst thick)
   (let* ((def (make <gnome-canvas-path-def>))
@@ -202,10 +236,12 @@ lilypond -fgnome input/simple-song.ly
                   #:parent (canvas-root)
                   #:fill-color "black"
                   #:outline-color "black"
-                  #:width-units thick)))
+                  #:width-units thick
+                  #:join-style 'round)))
 
     (reset def)
-    
+
+    ;; FIXME: LST is pre-mangled for direct ps stack usage
     ;; cl cr r l  0 1 2 3 
     ;; cr cl l r  4 5 6 7
     
@@ -225,7 +261,22 @@ lilypond -fgnome input/simple-song.ly
     bezier))
 
 (define (char font i)
-  (text font (utf8 i)))
+  (text font (integer->char i)))
+
+;; FIXME: naming
+(define (filledbox breapth width depth height)
+  (make <gnome-canvas-rect>
+    #:parent (canvas-root)
+    #:x1 (- breapth) #:y1 depth #:x2 width #:y2 (- height)
+    #:fill-color "black"
+    #:join-style 'miter))
+
+(define (grob-cause grob)
+  grob)
+
+;; WTF is this in every backend?
+(define (horizontal-line x1 x2 thickness)
+  (filledbox (- x1) (- x2 x1) (* .5 thickness) (* .5 thickness)))
 
 (define (placebox x y expr)
   (debugf "item: ~S\n" expr)
@@ -241,27 +292,6 @@ lilypond -fgnome input/simple-song.ly
          item)
        #f)))
 
-(define (beam width slope thick blot)
-  (let*
-      ((def (make <gnome-canvas-path-def>))
-       (y (* (- width) slope))
-       (props (make <gnome-canvas-bpath>
-                  #:parent (canvas-root)
-                  #:fill-color "black"
-                  #:outline-color "black"
-                  #:width-units 0.0)))
-    
-    (reset def)
-    (moveto def 0 0)
-    (lineto def width y)
-    (lineto def width (- y thick))
-    (lineto def 0 (- thick))
-    (lineto def 0 0)
-    (closepath def)
-    (set-path-def props def)
-    props))
-    
-
 (define (dashed-line thick on off dx dy)
   (draw-line thick 0 0 dx dy)) 
 
@@ -310,82 +340,55 @@ lilypond -fgnome input/simple-song.ly
     
 
 (define (round-filled-box breapth width depth height blot-diameter)
-  ;; FIXME: no rounded corners on rectangle...
-  ;; FIXME: blot?
-  (draw-rectangle (- breapth) depth width (- height) "black" blot-diameter))
-
-(define (pango-font-name font)
-  (let ((name (ly:font-name font)))
-    (if name
-       (regexp-substitute/global #f "^GNU-(.*)-[.0-9]*$" name 'pre 1 'post)
-       (begin
-         (stderr "font-name: ~S\n" (ly:font-name font))
-         ;; TODO s/filename/file-name/
-         (stderr "font-filename: ~S\n" (ly:font-filename font))
-         (stderr "pango-font-size: ~S\n" (pango-font-size font))
-         "ecrm12"))))
-
-(define (pango-font-size font)
-  (let* ((designsize (ly:font-design-size font))
-        (magnification (* (ly:font-magnification font)))
-        
-        ;; experimental sizing:
-        ;; where does factor come from?
-        ;;
-        ;; 0.435 * (12 / 20) = 0.261
-        ;; 2.8346456692913/ 0.261 = 10.86071137659501915708
-        ;;(ops (* 0.435 (/ 12 20) (* output-scale pixels-per-unit)))
-        ;; for size-points
-        (ops 2.61)
-        
-        (scaling (* ops magnification designsize)))
-    (debugf "OPS:~S\n" ops)
-    (debugf "scaling:~S\n" scaling)
-    (debugf "magnification:~S\n" magnification)
-    (debugf "design:~S\n" designsize)
-    
-    scaling))
-
-;;font-name: "GNU-LilyPond-feta-20"
-;;font-filename: "feta20"
-;;pango-font-name: "lilypond-feta, regular 32"
-;;OPS:2.61
-;;scaling:29.7046771653543
-;;magnification:0.569055118110236
-;;design:20.0
-
-(define (text font string)
-  (make <gnome-canvas-text>
-    #:parent (canvas-root)
-
-    #:anchor 'west
-    #:x 0.0 #:y 0.0
-    
-    #:font (pango-font-name font)
-    
-    #:size-points (pango-font-size font)
-    ;;#:size ...
-    #:size-set #t
-    
-    ;;apparently no effect :-(
-    ;;#:scale 1.0
-    ;;#:scale-set #t
-    
-    #:fill-color "black"
-    #:text (if (string? string)
-              (string->utf8-string string)
-              (char->utf8-string (car string)))))
-
-(define (filledbox a b c d)
-  (round-filled-box a b c d 0.001))
-
-;; WTF is this in every backend?
-(define (horizontal-line x1 x2 thickness)
-  (filledbox (- x1) (- x2 x1) (* .5 thickness) (* .5 thickness)))
-
-;;(define (define-origin file line col)
-;;  (if (procedure? point-and-click)
-;;      (list 'location line col file)))
-
-(define (grob-cause grob)
-  grob)
+  (let ((r (/ blot-diameter 2)))
+    (make <gnome-canvas-rect>
+      #:parent (canvas-root)
+      #:x1 (- r breapth) #:y1 (- depth r) #:x2 (- width r) #:y2 (- r height)
+      #:fill-color "black"
+      #:outline-color "black"
+      #:width-units blot-diameter
+      #:join-style 'round)))
+
+(define (text font s)
+  (define (pango-font-name font)
+    (font-family font))
+  
+  (define (pango-font-size font)
+    (let* ((designsize (ly:font-design-size font))
+          (magnification (* (ly:font-magnification font)))
+          
+          ;;font-name: "GNU-LilyPond-feta-20"
+          ;;font-file-name: "feta20"
+          ;;pango-font-name: "lilypond-feta, regular 32"
+          ;;OPS:2.61
+          ;;scaling:29.7046771653543
+          ;;magnification:0.569055118110236
+          ;;design:20.0
+  
+          ;; ugh, experimental sizing
+          ;; where does factor ops come from?
+          ;; Hmm, design size: 26/20 
+          (ops 2.60)
+          
+          (scaling (* ops magnification designsize)))
+      (debugf "OPS:~S\n" ops)
+      (debugf "scaling:~S\n" scaling)
+      (debugf "magnification:~S\n" magnification)
+      (debugf "design:~S\n" designsize)
+      
+      scaling))
+
+  (let ((encoding (ly:font-encoding font)))
+    (make <gnome-canvas-text>
+      #:parent (canvas-root)
+      ;; ugh, experimental placement corections
+      ;; #:x 0.0 #:y 0.0
+      #:x 0.0 #:y (if (memq encoding '(fetaMusic fetaBraces)) 0.15 0.69)
+
+      #:anchor (if (memq encoding '(fetaMusic fetaBraces)) 'west 'south-west)
+      #:font (pango-font-name font)
+      #:size-points (pango-font-size font)
+      #:size-set #t
+      #:text (if (char? s)
+                (char->utf8-string font s)
+                (string->utf8-string font s)))))