]> git.donarmstrong.com Git - lilypond.git/commitdiff
Svg with woff fonts: include dynamic css font list.
authorJan Nieuwenhuizen <janneke@gnu.org>
Mon, 31 May 2010 21:23:49 +0000 (23:23 +0200)
committerJan Nieuwenhuizen <janneke@gnu.org>
Thu, 24 Jun 2010 14:04:54 +0000 (16:04 +0200)
Refactor and re-use the font query mechanism from framework-ps.scm.

scm/framework-ps.scm
scm/framework-svg.scm
scm/output-lib.scm
scm/output-svg.scm

index fcd3604d1671337471291e26d8b561e57fe03fd4..11ab75fbd1c1e3d9fcae6bfe8134e2ba4bc0ff44 100644 (file)
        "%" "_" name)))
      "m" (string-encode-integer (inexact->exact (round (* 1000 magnify)))))))
 
-(define (define-fonts paper)
-  (define font-list (ly:paper-fonts paper))
-
-  (define (define-font command fontname scaling)
-    (string-append
-      "/" command
-      " { /" fontname
-      " " (ly:number->string scaling) " output-scale div selectfont }"
-      " bind def\n"))
-
-  (define (font-load-command font)
-    (let* ((specced-font-name (ly:font-name font))
-          (fontname (if specced-font-name
-                        specced-font-name
-                        (ly:font-file-name font)))
-          (command (ps-font-command font))
-
-          ;; FIXME -- see (ps-font-command)
-          (plain (ps-font-command font))
-          (designsize (ly:font-design-size font))
-          (magnification (* (ly:font-magnification font)))
-          (ops (ly:output-def-lookup paper 'output-scale))
-          (scaling (* ops magnification designsize)))
-      (if (equal? fontname "unknown")
-         (display (list font fontname)))
-      (define-font plain fontname scaling)))
-
-  (apply string-append
-        (map (lambda (x) (font-load-command x))
-             (filter (lambda (x) (not (ly:pango-font? x)))
-                     font-list))))
+(define (ps-define-font font font-name scaling)
+  (string-append
+   "/" (ps-font-command font)
+   " { /" font-name
+   " " (ly:number->string scaling) " output-scale div selectfont }"
+   " bind def\n"))
 
 ;; FIXME: duplicated in other output backends
 ;; FIXME: silly interface name
 (define (setup-variables paper)
   (string-append
    "\n"
-   (define-fonts paper)
+   (define-fonts paper ps-define-font)
    (output-variables paper)))
 
 (define (cff-font? font)
index 9bc11ae2a3f8f5a2a533756b0a876567365173ab..ebd4eb6b42fa33b2f0cfc9dfcd069e1e5c384517 100644 (file)
 (define (svg-end)
   (ec 'svg))
 
-(define (woff-header)
+(define (svg-define-font font font-name scaling)
+  (string-append
+   "@font-face {
+font-family: '"
+   font-name
+"';
+font-weight: normal;
+font-style: normal;
+src: url('"
+   (string-downcase font-name)
+   ".woff');
+}
+"))
+
+(define (woff-header paper)
   "TODO:
-      * dynamically add fonts based on usage
       * add (ly:version) to font name
       * copy woff font with version alongside svg output
 "
   (string-append
    (eo 'defs)
    (eo 'style '(text . "style/css"))
-   "      <![CDATA[
-        @font-face {
-          font-family: 'emmentaler-20';
-          font-weight: normal;
-          font-style: normal;
-          src: url('emmentaler-20.woff');
-        }
-      ]]>
-   "
+   "<![CDATA[
+"
+   (define-fonts paper svg-define-font)
+   "]]>
+"
    (ec 'style)
    (ec 'defs)))
-  
+
 (define (dump-page paper filename page page-number page-count)
   (let* ((outputter (ly:make-paper-outputter (open-file filename "wb") 'svg))
         (dump (lambda (str) (display str (ly:outputter-port outputter))))
     (dump (svg-begin page-width page-height
                     0 0 device-width device-height))
     (if (ly:get-option 'svg-woff)
-       (dump (woff-header)))
+       (dump (woff-header paper)))
     (dump (comment (format "Page: ~S/~S" page-number page-count)))
     (ly:outputter-output-scheme outputter
                                `(begin (set! lily-unit-length ,unit-length)
     (dump (svg-begin svg-width svg-height
                     left-x (- top-y) device-width device-height))
     (if (ly:get-option svg-woff)
-       (dump (woff-header)))
+       (dump (woff-header paper)))
     (ly:outputter-output-scheme outputter
                                `(begin (set! lily-unit-length ,unit-length)
                                        ""))
index d29e26498c7f4b7bd4138530e1fed71d61087369..5684e1e1accc05158d5a03343805836ec667732a 100644 (file)
@@ -890,3 +890,24 @@ between the two text elements."
 ;;
 (define-public (laissez-vibrer::print grob)
  (ly:tie::print grob))
+
+(define-public (define-fonts paper define-font)
+  "Return a string of all fonts used in PAPER, invoking the function
+DEFINE-FONT for procuding the actual font definition."
+
+  (define font-list (ly:paper-fonts paper))
+
+  (define (font-load-command font)
+    (let* ((font-name (ly:font-name font))
+          (designsize (ly:font-design-size font))
+          (magnification (* (ly:font-magnification font)))
+          (ops (ly:output-def-lookup paper 'output-scale))
+          (scaling (* ops magnification designsize)))
+      (if (equal? font-name "unknown")
+         (display (list font font-name)))
+      (define-font font font-name scaling)))
+
+  (apply string-append
+        (map (lambda (x) (font-load-command x))
+             (filter (lambda (x) (not (ly:pango-font? x)))
+                     font-list))))
index 8bdcf2a61be0856a8103e8e7e16ea1d438c7daaf..33826dd7e7dee95392f76e6cd1bea738c654a42a 100644 (file)
   (make-regexp "^(<[a-z]+ transform=\")(scale.[-0-9. ]+,[-0-9. ]+.\" .*>)"))
 
 (define pango-description-regexp-comma
-  (make-regexp ",( Bold)?( Italic)?( Small-Caps)? ([0-9.]+)$"))
+  (make-regexp ",( Bold)?( Italic)?( Small-Caps)?[ -]([0-9.]+)$"))
 
 (define pango-description-regexp-nocomma
-  (make-regexp "( Bold)?( Italic)?( Small-Caps)? ([0-9.]+)$"))
+  (make-regexp "( Bold)?( Italic)?( Small-Caps)?[ -]([0-9.]+)$"))
 
 (define (pango-description-to-text str expr)
   (define alist '())
        (cache-font font-file scaled-size glyph)
        (ly:warning (_ "cannot find SVG font ~S") font-file))))
 
-(define embedded #f)
-
 (define (woff-font-smob-to-text font expr)
   (let* ((name-style (font-name-style font))
         (scaled-size (modified-font-metric-font-scaling font))
         (font-file (ly:find-file (string-append name-style ".woff")))
         (charcode (ly:font-glyph-name-to-charcode font expr))
-        (text (format #f "&#~S;" charcode)))
+        (char-lookup (format #f "&#~S;" charcode))
+        (glyph-by-name (eoc 'altglyph `(glyphname . ,expr)))
+        (apparently-broken
+         (comment "FIXME: how to select glyph by name, altglyph is broken?"))
+        (text (string-regexp-substitute "\n" ""
+               (string-append glyph-by-name apparently-broken char-lookup))))
   (define alist '())
   (define (set-attribute attr val)
     (set! alist (assoc-set! alist attr val)))
   path)
 
 (define (woff-glyph-string font size cid glyphs)
-  (named-glyph font glyphs))
+  (if (list? glyphs)
+      (named-glyph font (last (car glyphs)))
+      (named-glyph font glyphs)))
 
 (define glyph-string
   (if (not (ly:get-option 'svg-woff)) embedded-glyph-string woff-glyph-string))