X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Foutput-gnome.scm;h=db1a496616f9a95294497770be336b42df8f554f;hb=6dc25f04195169860be7f336031ed8baa98cdc40;hp=71dd1eef5b460560fe2380182fecfb3e401f962c;hpb=dcbf0d0691fb530f78c8cdfc9414e007caf81fe0;p=lilypond.git diff --git a/scm/output-gnome.scm b/scm/output-gnome.scm index 71dd1eef5b..db1a496616 100644 --- a/scm/output-gnome.scm +++ b/scm/output-gnome.scm @@ -2,10 +2,16 @@ ;;;; ;;;; source file of the GNU LilyPond music typesetter ;;;; -;;;; (c) 2004 Jan Nieuwenhuizen +;;;; (c) 2004--2005 Jan Nieuwenhuizen -;;; TODO: -;;; +;;;; TODO: +;;;; +;;;; * .cff MUST NOT be in fc's fontpath. +;;;; - workaround: remove mf/out from ~/.fonts.conf, +;;;; instead add ~/.fonts and symlink all /mf/out/*otf there. +;;;; - bug in fontconfig/freetype/pango? + +;;; * check: blot+scaling ;;; * Figure out and fix font scaling and character placement ;;; * EC font package: add missing X font directories and AFMs ;;; * User-interface, keybindings @@ -16,36 +22,37 @@ ;;; - allow GnomeCanvas or `toplevel' GtkWindow to be created ;;; outside of LilyPond ;;; - lilylib. -;;; * Release schedule and packaging of dependencies. This hack -;;; depends on several CVS and TLA development sources. +;;; * Release schedule and packaging of dependencies. +;;; - g-wrap-1.9.3 is already in incoming. +;;; - guile-gnome-platform-2.8.0 will probably be packaged early 2005. ;;; 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 +;;; * guile-gnome-platform >= 2.7.97 +;;; * pango >= 1.6.0 ;;; ;;; See also: guile-gtk-general@gnu.org ;;; Try it ;;; -;;; [* Get cvs and tla] -;;; ;;; * Install gnome/gtk and libffi development stuff ;;; -;;; * Install pango, g-wrap and guile-gnome from CVS or arch: +;;; * Install [pango, g-wrap and] guile-gnome from source, ;;; see buildscripts/guile-gnome.sh ;;; ;;; * 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 ~/cvs/savannah/lilypond/mf/out +/usr/share/texmf/fonts/type1/public/ec-fonts-mftraced 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: @@ -72,46 +79,28 @@ lilypond -fgnome input/simple-song.ly ;;; point-and-click: (mouse-1) click on a graphical object; ;;; grob-property-list: (mouse-3) click on a graphical object. -(debug-enable 'backtrace) - (define-module (scm output-gnome)) (define this-module (current-module)) (use-modules (guile) + (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)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; globals -;; junkme -(define system-origin '(0 . 0)) - ;;; set by framework-gnome.scm (define canvas-root #f) (define output-scale #f) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; helper functions -(define (stderr string . rest) - ;; debugging - (if #f - (begin - (apply format (cons (current-error-port) (cons string rest))) - (force-output (current-error-port))))) - -(define (utf8 i) +(define (utf-8 i) (cond ((< i #x80) (list (integer->char i))) ((< i #x800) (map integer->char @@ -124,25 +113,74 @@ lilypond -fgnome input/simple-song.ly (list (+ #xe0 x) (+ #x80 (quotient y #x40)) (+ #x80 (modulo y #x40)))))) - (else FIXME))) - -(define (custom-utf8 i) - (if (< i 80) - (utf8 i) - (utf8 (+ #xee00 i)))) + (else (begin (stderr "programming-error: utf-8 too big:~x\n" i) + (list (integer->char 32)))))) -(define (string->utf8-string string) - (list->string - (apply append (map utf8 (map char->integer (string->list string)))))) +(define (integer->utf-8-string integer) + (list->string (utf-8 integer))) -(define (char->utf8-string char) - (list->string (utf8 (char->integer char)))) +(define (char->utf-8-string char) + (list->string (utf-8 (char->integer char)))) -(define (draw-rectangle x1 y1 x2 y2 color width-units) - (make - #:parent (canvas-root) #:x1 x1 #:y1 y1 #:x2 x2 #:y2 y2 - #:fill-color color #:width-units width-units)) +(define (string->utf-8-string string) + (apply + string-append + (map (lambda (x) (char->utf-8-string x)) (string->list string)))) +(define (music-font? font) + (let ((family (car (font-name-style font)))) + (string=? (substring family 0 (min (string-length family) 10)) + "Emmentaler"))) + +;;; FONT may be font smob, or pango font string +(define (pango-font-name font) + (if (string? font) + (list font "Regular") + (apply format (append '(#f "~a, ~a") (font-name-style font))))) + +;;; FONT may be font smob, or pango font string +(define (canvas-font-size font) + ;; FIXME: 1.85? + (* 1.85 + (if (string? font) + 12 + (* output-scale (modified-font-metric-font-scaling font))))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; Wrappers from guile-gnome TLA +;;; guile-gnome-devel@gnu.org--2004 +;;; http://arch.gna.org/guile-gnome/archive-2004 +;;; +;;; janneke@gnu.org--2004-gnome +;;; http://lilypond.org/~janneke/{arch}/2004-gnome +;;; +(if (not (defined? ')) + (begin + (define-class () + (closure #:init-value (gnome-canvas-path-def-new) + #:init-keyword #:path-def + #:getter get-def #:setter set-def)) + + (define-method (moveto (this ) x y) + (gnome-canvas-path-def-moveto (get-def this) x y)) + (define-method (curveto (this ) x1 y1 x2 y2 x3 y3) + (gnome-canvas-path-def-curveto (get-def this) x1 y1 x2 y2 x3 y3)) + (define-method (lineto (this ) x y) + (gnome-canvas-path-def-lineto (get-def this) x y)) + (define-method (closepath (this )) + (gnome-canvas-path-def-closepath (get-def this))) + (define-method (reset (this )) + (gnome-canvas-path-def-reset (get-def this))) + + (define -set-path-def set-path-def) + (define -get-path-def get-path-def) + + (define-method (set-path-def (this ) + (def )) + (-set-path-def this (get-def def))) + + (define-method (get-path-def (this )) + (make #:path-def (-get-path-def this))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; stencil outputters @@ -156,108 +194,146 @@ lilypond -fgnome input/simple-song.ly (ly:all-stencil-expressions) (ly:all-output-backend-commands))) +;; two beziers +(define (bezier-sandwich lst thick) + (let* ((def (make )) + (bezier (make + #:parent (canvas-root) + #:fill-color "black" + #:outline-color "black" + #: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 + + (moveto def (car (list-ref lst 3)) (- (cdr (list-ref lst 3)))) + (curveto def (car (list-ref lst 0)) (- (cdr (list-ref lst 0))) + (car (list-ref lst 1)) (- (cdr (list-ref lst 1))) + (car (list-ref lst 2)) (- (cdr (list-ref lst 2)))) + + (lineto def (car (list-ref lst 7)) (- (cdr (list-ref lst 7)))) + (curveto def (car (list-ref lst 4)) (- (cdr (list-ref lst 4))) + (car (list-ref lst 5)) (- (cdr (list-ref lst 5))) + (car (list-ref lst 6)) (- (cdr (list-ref lst 6)))) + (lineto def (car (list-ref lst 3)) (- (cdr (list-ref lst 3)))) + (closepath def) + (set-path-def bezier def) + bezier)) (define (char font i) - (text font (utf8 i))) + (text font (ly:font-index-to-charcode font i))) + +(define (dashed-line thick on off dx dy) + (draw-line thick 0 0 dx dy)) + +(define (draw-line thick x1 y1 x2 y2) + (let* ((def (make )) + (props (make + #:parent (canvas-root) + #:fill-color "black" + #:outline-color "black" + #:width-units thick))) + (reset def) + (moveto def x1 (- y1)) + (lineto def x2 (- y2)) + (set-path-def props def) + props)) + + +;; FIXME: the framework-gnome backend needs to see every item that +;; gets created. All items created here must should be put in a group +;; that gets returned. +(define (glyph-string font postscript-font-name w-x-y-named-glyphs) + (for-each + (lambda (x) + + ;; UGR, glyph names not found + (stderr "GLYPH:~S\n" (caddr x)) + (stderr "ID:~S\n" (ly:font-glyph-name-to-charcode font (caddr x))) + (placebox (cadr x) (caddr x) + (make + #:parent (canvas-root) + ;;#:x 0.0 #:y (if (music-font? font) 0.15 0.69) + #:x 0.0 #:y 0.0 + #:anchor 'west + #:font (pango-font-name font) + #:size-points (canvas-font-size font) + #:size-set #t + #:text + (integer->utf-8-string + (ly:font-glyph-name-to-charcode font (cadddr x)))))) + w-x-y-named-glyphs)) + +(define (grob-cause offset grob) + grob) + + +(define (named-glyph font name) + (text font (ly:font-glyph-name-to-charcode font name))) (define (placebox x y expr) - (stderr "item: ~S\n" expr) (let ((item expr)) ;;(if item ;; FIXME ugly hack to skip #unspecified ... (if (and item (not (eq? item (if #f #f)))) (begin - (move item - (* output-scale (+ (car system-origin) x)) - (* output-scale (- (car system-origin) y))) + (move item (* output-scale x) (* output-scale (- y))) (affine-relative item output-scale 0 0 output-scale 0 0) item) #f))) -(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) - (cond - ((equal? (ly:font-name font) "GNU-LilyPond-feta-20") - "lilypond-feta, regular 32") - (else - ;; FIXME - "ecrm12"))) - ;;(ly:font-name font)))) - ;;(ly:font-filename font)))) - -(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))) - (stderr "OPS:~S\n" ops) - (stderr "scaling:~S\n" scaling) - (stderr "magnification:~S\n" magnification) - (stderr "design:~S\n" designsize) +(define (polygon coords blot-diameter) + (let* ((def (make )) + (props (make + #:parent (canvas-root) + #:fill-color "black" + #:outline-color "black" + #:join-style 'round) + #:width-units blot-diameter) + (points (ly:list->offsets '() coords)) + (last-point (car (last-pair points)))) - 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) - (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-name: ~S\n" (pango-font-name font)) - (stderr "pango-font-size: ~S\n" (pango-font-size font)) - + (reset def) + (moveto def (car last-point) (cdr last-point)) + (for-each (lambda (x) (lineto def (car x) (cdr x))) points) + (closepath def) + (set-path-def props def) + props)) + +(define (round-filled-box breapth width depth height blot-diameter) + (let ((r (/ blot-diameter 2))) + (make + #: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) (make #:parent (canvas-root) - - #:anchor 'west - #:x 0.0 #:y 0.0 - + ;;#:x 0.0 #:y 0.0 + #:x 0.0 #:y (if (music-font? font) 0.15 0.69) + #:anchor (if (music-font? font) 'west 'south-west) #:font (pango-font-name font) - - #:size-points (pango-font-size font) - ;;#:size ... + #:size-points (canvas-font-size font) #: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))) + #:text (if (integer? s) + (integer->utf-8-string s) + (string->utf-8-string s)))) -;;(define (define-origin file line col) -;; (if (procedure? point-and-click) -;; (list 'location line col file))) - -(define (grob-cause grob) - grob) +(define (utf-8-string pango-font-description string) + (make + #:parent (canvas-root) + #:x 0.0 #:y 0.0 + #:anchor 'west + #:font pango-font-description + #:size-points (canvas-font-size pango-font-description) + #:size-set #t + #:text string))