X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scm%2Foutput-gnome.scm;h=2251f26ca13b5eed29c1789dfea3c52e67c9777b;hb=f817c9010f8016d5e9c19ec3b167e7d485538eb3;hp=acced8dd831e4340f11fcc5f3772851210f2ae39;hpb=03a1272a1af4413013a74301870a13369ec340f7;p=lilypond.git diff --git a/scm/output-gnome.scm b/scm/output-gnome.scm index acced8dd83..2251f26ca1 100644 --- a/scm/output-gnome.scm +++ b/scm/output-gnome.scm @@ -6,6 +6,7 @@ ;;; TODO: ;;; +;;; * 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,30 +17,23 @@ ;;; - 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. In the works. -;;; * Maybe we need to have a unicode mapping somehow, we could -;;; - use OpenType instead of Type1 -;;; http://lists.gnu.org/archive/html/lilypond-devel/2004-05/msg00098.html -;;; - or fix the pangofc-afm-decoder and add it to Pango (no chance?) -;;; or have fontconfig read AFM files -;;; http://lists.gnu.org/archive/html/lilypond-devel/2004-05/msg00103.html +;;; * 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.3 (or TLA) -;;; * guile-gnome-platform >= 2.7.95 (or TLA) +;;; * 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 @@ -93,6 +87,98 @@ lilypond -fgnome input/simple-song.ly (gnome gtk) (gnome gw canvas)) +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;;; globals + +;;; set by framework-gnome.scm +(define canvas-root #f) +(define output-scale #f) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; helper functions + +(define (stderr string . rest) + (apply format (cons (current-error-port) (cons string rest))) + (force-output (current-error-port))) + +(define (debugf string . rest) + (if #f + (apply stderr (cons string rest)))) + +(define (utf8 i) + (cond + ((< i #x80) (list (integer->char i))) + ((< i #x800) (map integer->char + (list (+ #xc0 (quotient i #x40)) + (+ #x80 (modulo i #x40))))) + ((< i #x10000) + (let ((x (quotient i #x1000)) + (y (modulo i #x1000))) + (map integer->char + (list (+ #xe0 x) + (+ #x80 (quotient y #x40)) + (+ #x80 (modulo y #x40)))))) + (else (begin (stderr "programming-error: utf-8 too big:~x\n" i) + (list (integer->char 32)))))) + +(define (integer->utf8-string integer) + (list->string (utf8 integer))) + +(define (char->utf8-string char) + (list->string (utf8 (char->integer char)))) + +(define (string->utf8-string string) + (apply + string-append + (map (lambda (x) (char->utf8-string x)) (string->list string)))) + +(define (music-font? font) + (let ((encoding (ly:font-encoding font)) + (family (font-family font))) + (or (memq encoding '(fetaMusic fetaBraces)) + (string=? (substring family 0 (min (string-length family) 10)) + "emmentaler")))) + +;; FIXME +(define-public (otf-name-mangling font family) + ;; Hmm, family is emmentaler20/26? + (if (string=? (substring family 0 (min (string-length family) 10)) + "emmentaler") + (string-append "LilyPond " (substring family 10)) + (if (string=? family "aybabtu") + "LilyPondBraces" + family))) + +(define (pango-font-name font) + (debugf "FONT-NAME:~S:~S\n" (ly:font-name font) (ly:font-design-size font)) + (debugf "FONT-FAMILY:~S:~S\n" (font-family font) (otf-name-mangling font (font-family font))) + (otf-name-mangling 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)) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Wrappers from guile-gnome TLA ;;; guile-gnome-devel@gnu.org--2004 @@ -129,51 +215,6 @@ lilypond -fgnome input/simple-song.ly (define-method (get-path-def (this )) (make #:path-def (-get-path-def this))))) -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;;; 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) - (apply format (cons (current-error-port) (cons string rest))) - (force-output (current-error-port))) - -(define (debugf string . rest) - (if #t - (apply stderr (cons string rest)))) - -(define (utf8 i) - (cond - ((< i #x80) (list (integer->char i))) - ((< i #x800) (map integer->char - (list (+ #xc0 (quotient i #x40)) - (+ #x80 (modulo i #x40))))) - ((< i #x10000) - (let ((x (quotient i #x1000)) - (y (modulo i #x1000))) - (map integer->char - (list (+ #xe0 x) - (+ #x80 (quotient y #x40)) - (+ #x80 (modulo y #x40)))))) - (else FIXME))) - -(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 ;;; @@ -216,14 +257,13 @@ lilypond -fgnome input/simple-song.ly bezier)) (define (square-beam width slope thick blot) - (let* - ((def (make )) - (y (* (- width) slope)) - (props (make - #:parent (canvas-root) - #:fill-color "black" - #:outline-color "black" - #:width-units 0.0))) + (let* ((def (make )) + (y (* (- width) slope)) + (props (make + #:parent (canvas-root) + #:fill-color "black" + #:outline-color "black" + #:width-units 0.0))) (reset def) (moveto def 0 0) @@ -234,7 +274,7 @@ lilypond -fgnome input/simple-song.ly (closepath def) (set-path-def props def) props)) - + ;; two beziers (define (bezier-sandwich lst thick) (let* ((def (make )) @@ -251,23 +291,39 @@ lilypond -fgnome input/simple-song.ly ;; 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))) + (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))) + (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)))) + (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 (integer->char 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: naming (define (filledbox breapth width depth height) @@ -277,6 +333,30 @@ lilypond -fgnome input/simple-song.ly #:fill-color "black" #:join-style 'miter)) +;; 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 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 (car x) (cadr x) + (make + #:parent (canvas-root) + #:x 0.0 #:y 0.0 + #:anchor 'west + ;;#:font postscript-font-name + #:font (pango-font-name font) + #:size-points 12 + #:size-set #t + #:text + (integer->utf8-string + (ly:font-glyph-name-to-charcode font (caddr x)))))) + x-y-named-glyphs)) + (define (grob-cause grob) grob) @@ -284,69 +364,37 @@ lilypond -fgnome input/simple-song.ly (define (horizontal-line x1 x2 thickness) (filledbox (- x1) (- x2 x1) (* .5 thickness) (* .5 thickness))) +(define (named-glyph font name) + (text font (ly:font-glyph-name-to-charcode font name))) + (define (placebox x y 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 (dashed-line thick on off dx dy) - (draw-line thick 0 0 dx dy)) - -(define (draw-line thick fx fy tx ty) - (let* - ((def (make )) - (props (make - #:parent (canvas-root) - #:fill-color "black" - #:outline-color "black" - #:width-units thick))) +(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)))) - (reset def) - (moveto def fx (- fy)) - (lineto def tx (- ty)) - (set-path-def props def) - props)) - -(define (list->offsets accum coords) - (if (null? coords) - accum - (cons (cons (car coords) (cadr coords)) - (list->offsets accum (cddr coords))))) - -(define (named-glyph font name) - (debugf "glyph:~S\n" name) - (debugf "index:~S\n" (ly:font-glyph-name-to-charcode font name)) - (debugf "font:~S\n" (font-family font)) - (text font (integer->char (ly:font-glyph-name-to-charcode font name)))) - -(define (polygon coords blotdiameter) - (let* - ((def (make )) - (props (make - #:parent (canvas-root) - #:fill-color "black" - #:outline-color "black" - #:width-units blotdiameter)) - (points (list->offsets '() coords)) - (last-point (car (last-pair points)))) - (reset def) (moveto def (car last-point) (cdr last-point)) - (for-each (lambda (x) - (lineto def (car x) (cdr x)) - ) points) + (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))) @@ -359,50 +407,17 @@ lilypond -fgnome input/simple-song.ly #:join-style 'round))) (define (text font s) - (define (pango-font-name font) - (stderr "FONT-NAME:~S\n" (ly:font-name font)) - - (let ((family (font-family font))) - ;; Hmm, family is bigcheese20? - (if (string=? family "bigcheese20") - (format #f "~S, ~S" (ly:font-name font) (ly:font-design-size font)) - family))) - - (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 - #: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))))) + (make + #:parent (canvas-root) + ;; ugh, experimental placement corections + ;; #: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-set #t + #:text (if (integer? s) + (integer->utf8-string s) + (string->utf8-string s)))) +