From 9be810ebcf226f2e5d7445f4e647f13aa0ac29e3 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Wed, 25 Jan 2006 01:20:59 +0000 Subject: [PATCH] * scm/page.scm (make-page): add footer/header. (annotate-space-left): revise: only take page argument. (layout->page-init): new function. * scm/layout-page-layout.scm (write-page-breaks): preliminary version of the system/spacing/linebreak hack writing to the output * lily/prob-scheme.cc (LY_DEFINE): take optional 'key val args in ly:make-prob. * lily/grob-scheme.cc (LY_DEFINE): ly:spanner-get-bound -> ly:spanner-bound --- ChangeLog | 20 +++++ lily/grob-scheme.cc | 2 +- lily/paper-book.cc | 1 - lily/prob-scheme.cc | 43 ++++++++--- lily/system.cc | 7 +- ly/paper-defaults.ly | 4 +- python/convertrules.py | 7 ++ scm/framework-eps.scm | 3 +- scm/framework-gnome.scm | 2 +- scm/framework-ps.scm | 8 +- scm/framework-scm.scm | 2 +- scm/framework-svg.scm | 6 +- scm/framework-tex.scm | 6 +- scm/layout-page-layout.scm | 92 ++++++++++++++++++---- scm/lily.scm | 2 + scm/page.scm | 152 ++++++++++++++++++++----------------- scm/safe-lily.scm | 2 +- 17 files changed, 247 insertions(+), 112 deletions(-) diff --git a/ChangeLog b/ChangeLog index e54e951f21..8c77c2976b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,25 @@ +2006-01-25 Han-Wen Nienhuys + + * scm/page.scm (make-page): add footer/header. + (annotate-space-left): revise: only take page argument. + (layout->page-init): new function. + + * scm/layout-page-layout.scm (write-page-breaks): preliminary + version of the system/spacing/linebreak hack writing to the output + + * lily/prob-scheme.cc (LY_DEFINE): take optional 'key val args in ly:make-prob. + + * lily/grob-scheme.cc (LY_DEFINE): ly:spanner-get-bound -> ly:spanner-bound + 2006-01-24 Han-Wen Nienhuys + * scm/stencil.scm (annotate-y-interval): move from layout-page-layout.scm + + * scm/paper-system.scm (paper-system-annotate): new file. Handle paper-system. + + * scm/layout-page-layout.scm (optimal-page-breaks): move all page + handling to page.scm + * lily/prob-scheme.cc (LY_DEFINE): new file. (LY_DEFINE): functions ly:make-prob , ly:prob-type? , ly:prob-(set-)property(!) diff --git a/lily/grob-scheme.cc b/lily/grob-scheme.cc index f31c5fdbb4..15cf075a25 100644 --- a/lily/grob-scheme.cc +++ b/lily/grob-scheme.cc @@ -85,7 +85,7 @@ LY_DEFINE (ly_grob_object, "ly:grob-object", return sc->internal_get_object (sym); } -LY_DEFINE (ly_spanner_get_bound, "ly:spanner-get-bound", +LY_DEFINE (ly_spanner_get_bound, "ly:spanner-bound", 2, 0, 0, (SCM slur, SCM dir), "Get one of the bounds of @var{spanner}. @var{dir} is @code{-1} " "for left, and @code{1} for right.") diff --git a/lily/paper-book.cc b/lily/paper-book.cc index cd295de778..48b0fe34f7 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -288,7 +288,6 @@ Paper_book::systems () header_0_ = header; } else if (Music_output *mop = unsmob_music_output (scm_car (s))) - { if (Paper_score *pscore = dynamic_cast (mop)) { diff --git a/lily/prob-scheme.cc b/lily/prob-scheme.cc index 3d847543e7..ceadabdd69 100644 --- a/lily/prob-scheme.cc +++ b/lily/prob-scheme.cc @@ -9,23 +9,33 @@ #include "prob.hh" LY_DEFINE (ly_prob_set_property_x, "ly:prob-set-property!", - 2, 1, 0, (SCM system, SCM sym, SCM value), - "Set property @var{sym} of @var{system} to @var{value}") + 2, 1, 0, (SCM obj, SCM sym, SCM value), + "Set property @var{sym} of @var{obj} to @var{value}") { - Prob *ps = unsmob_prob (system); - SCM_ASSERT_TYPE (ps, system, SCM_ARG1, __FUNCTION__, "Prob"); + Prob *ps = unsmob_prob (obj); + SCM_ASSERT_TYPE (ps, obj, SCM_ARG1, __FUNCTION__, "Prob"); SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol"); ps->internal_set_property (sym, value); return SCM_UNSPECIFIED; } +/* + Hmm, this is not orthogonal. + */ +LY_DEFINE (ly_prob_property_p, "ly:prob-property?", + 2, 1, 0, (SCM obj, SCM sym), + "Is boolean prop @var{sym} set?") +{ + return scm_equal_p (SCM_BOOL_T, ly_prob_property (obj, sym, SCM_BOOL_F)); +} + LY_DEFINE (ly_prob_property, "ly:prob-property", - 2, 1, 0, (SCM system, SCM sym, SCM dfault), + 2, 1, 0, (SCM obj, SCM sym, SCM dfault), "Return the value for @var{sym}.") { - Prob *ps = unsmob_prob (system); - SCM_ASSERT_TYPE (ps, system, SCM_ARG1, __FUNCTION__, "Prob"); + Prob *ps = unsmob_prob (obj); + SCM_ASSERT_TYPE (ps, obj, SCM_ARG1, __FUNCTION__, "Prob"); SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol"); if (dfault == SCM_UNDEFINED) @@ -39,7 +49,7 @@ LY_DEFINE (ly_prob_property, "ly:prob-property", } LY_DEFINE (ly_prob_type_p, "ly:prob-type?", - 1, 0, 0, + 2, 0, 0, (SCM obj, SCM type), "If obj the specified prob-type?") { @@ -48,13 +58,22 @@ LY_DEFINE (ly_prob_type_p, "ly:prob-type?", } LY_DEFINE (ly_make_prob, "ly:make-prob", - 2, 0, 0, - (SCM type, SCM init), + 2, 0, 1, + (SCM type, SCM init, SCM rest), "Create a Prob.") { Prob *pr = new Prob (type, init); - SCM x = pr->self_scm () ; - return scm_gc_unprotect_object (x); + + for (SCM s = rest; + scm_is_pair (s) && scm_is_pair (scm_cdr (s)); s = scm_cddr (s)) + { + SCM sym = scm_car (s); + SCM val = scm_cadr (s); + + pr->internal_set_property (sym, val); + } + + return pr->unprotect (); } diff --git a/lily/system.cc b/lily/system.cc index a1636c8a1a..07d156a65b 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -190,7 +190,8 @@ System::get_paper_systems () System *system = dynamic_cast (broken_intos_[i]); system->post_processing (); - scm_vector_set_x (lines, scm_from_int (i), system->get_paper_system ()); + scm_vector_set_x (lines, scm_from_int (i), + system->get_paper_system ()); if (be_verbose_global) progress_indication (to_string (i) + "]"); @@ -394,7 +395,9 @@ System::get_paper_system () } pl->set_property ("refpoint-Y-extent", ly_interval2scm (staff_refpoints)); } - + + pl->set_property ("system-grob", this->self_scm ()); + return pl->unprotect (); } diff --git a/ly/paper-defaults.ly b/ly/paper-defaults.ly index 14340cc50b..c8116b55c1 100644 --- a/ly/paper-defaults.ly +++ b/ly/paper-defaults.ly @@ -91,8 +91,8 @@ (word-space . 0.6))) #(define page-breaking optimal-page-breaks) - #(define page-music-height default-page-music-height ) - #(define page-make-stencil default-page-make-stencil ) +% #(define page-music-height default-page-music-height ) +% #(define page-make-stencil default-page-make-stencil ) #(define make-header (marked-up-headfoot 'oddHeaderMarkup 'evenHeaderMarkup)) #(define make-footer (marked-up-headfoot 'oddFooterMarkup 'evenFooterMarkup)) diff --git a/python/convertrules.py b/python/convertrules.py index 3710cf0422..1a65a7281e 100644 --- a/python/convertrules.py +++ b/python/convertrules.py @@ -2673,3 +2673,10 @@ def conv (str): conversions.append (((2, 7, 24), conv, """deprecate number-visibility""")) + +def conv (str): + str = re.sub (r"ly:spanner-get-bound", "ly:spanner-bound", str) + return str + +conversions.append (((2, 7, 28), conv, + """ly:spanner-get-bound -> ly:spanner-bound""")) diff --git a/scm/framework-eps.scm b/scm/framework-eps.scm index 78de309b8f..44d9adab45 100644 --- a/scm/framework-eps.scm +++ b/scm/framework-eps.scm @@ -103,7 +103,8 @@ stencil, so LaTeX includegraphics doesn't fuck up the alignment." (define-public (output-framework basename book scopes fields) (output-scopes scopes fields basename) - (dump-stencils-as-EPSes (ly:paper-book-pages book) book basename)) + (dump-stencils-as-EPSes + (map page-stencil (ly:paper-book-pages book)) book basename)) ; redefine to imports from framework-ps diff --git a/scm/framework-gnome.scm b/scm/framework-gnome.scm index f66c6bfd31..36dba09daa 100644 --- a/scm/framework-gnome.scm +++ b/scm/framework-gnome.scm @@ -120,7 +120,7 @@ (go (make #:name name - #:page-stencils (list->vector (ly:paper-book-pages book)) + #:page-stencils (list->vector (map page-stencil (ly:paper-book-pages book))) #:canvas-width page-width #:canvas-height page-height #:window-width diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index 9bd77fa270..26ea51e042 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -12,6 +12,7 @@ (ice-9 string-fun) (ice-9 format) (guile) + (scm page) (srfi srfi-1) (srfi srfi-13) (lily)) @@ -424,10 +425,11 @@ (open-file filename "wb") "ps")) (paper (ly:paper-book-paper book)) - (pages (ly:paper-book-pages book)) + (page-stencils (map page-stencil (ly:paper-book-pages book))) + (landscape? (eq? (ly:output-def-lookup paper 'landscape) #t)) (page-number (1- (ly:output-def-lookup paper 'firstpagenumber))) - (page-count (length pages)) + (page-count (length page-stencils)) (port (ly:outputter-port outputter))) (output-scopes scopes fields basename) @@ -438,7 +440,7 @@ (lambda (page) (set! page-number (1+ page-number)) (dump-page outputter page page-number page-count landscape?)) - pages) + page-stencils) (display "%%Trailer\n%%EOF\n" port) (ly:outputter-close outputter) diff --git a/scm/framework-scm.scm b/scm/framework-scm.scm index 058217e0b3..d20e5dea35 100644 --- a/scm/framework-scm.scm +++ b/scm/framework-scm.scm @@ -25,7 +25,7 @@ ; (pretty-print (ly:stencil-expr page) file) (write (ly:stencil-expr page) file) ) - (ly:paper-book-pages book)))) + (map page-stencil (ly:paper-book-pages book))))) (define-public output-classic-framework output-framework) diff --git a/scm/framework-svg.scm b/scm/framework-svg.scm index 49841f25c5..3a569c9bde 100644 --- a/scm/framework-svg.scm +++ b/scm/framework-svg.scm @@ -25,10 +25,10 @@ (unit-length (ly:output-def-lookup paper 'outputscale)) (output-scale (* lily-unit->mm-factor unit-length)) - (pages (ly:paper-book-pages book)) + (page-stencils (map page-stencil (ly:paper-book-pages book))) (landscape? (eq? (ly:output-def-lookup paper 'landscape) #t)) (page-number (1- (ly:output-def-lookup paper 'firstpagenumber))) - (page-count (length pages)) + (page-count (length page-stencils)) (hsize (ly:output-def-lookup paper 'hsize)) (vsize (ly:output-def-lookup paper 'vsize)) (page-width (inexact->exact (ceiling (* output-scale hsize)))) @@ -59,7 +59,7 @@ (lambda (page) (set! page-number (1+ page-number)) (dump-page outputter page page-number page-count landscape? page-set?)) - pages) + page-stencils) (if page-set? (eo 'pageSet) "") (dump diff --git a/scm/framework-tex.scm b/scm/framework-tex.scm index 5c896d5859..09af77a747 100644 --- a/scm/framework-tex.scm +++ b/scm/framework-tex.scm @@ -193,7 +193,7 @@ (let* ((filename (format "~a.tex" basename)) (outputter (ly:make-paper-outputter (open-file filename "wb") "tex")) (paper (ly:paper-book-paper book)) - (pages (ly:paper-book-pages book)) + (page-stencils (map page-stencil (ly:paper-book-pages book))) (last-page (car (last-pair pages))) (with-extents (eq? #t (ly:output-def-lookup paper 'dump-extents)))) @@ -201,14 +201,14 @@ (lambda (x) (ly:outputter-dump-string outputter x)) (list - (header paper (length pages) #f) + (header paper (length page-stencils) #f) (define-fonts paper) (header-end))) (ly:outputter-dump-string outputter "\\lilypondnopagebreak\n") (for-each (lambda (page) (dump-page outputter page (eq? last-page page) with-extents)) - pages) + page-stencils) (ly:outputter-dump-string outputter "\\lilypondend\n") (ly:outputter-close outputter) (postprocess-output book framework-tex-module filename diff --git a/scm/layout-page-layout.scm b/scm/layout-page-layout.scm index 9d7ab8288b..148ac1cc34 100644 --- a/scm/layout-page-layout.scm +++ b/scm/layout-page-layout.scm @@ -11,8 +11,73 @@ (scm page) ) +(define (write-page-breaks pages) + "Dump page breaks" + + (define tweaks '()) + + (define (record when property-pairs) + (set! tweaks + (acons when property-pairs + tweaks))) + + (define (moment->skip mom) + (format "s1*~a/~a" + (ly:moment-main-numerator mom) + (ly:moment-main-denominator mom))) + + (define (dump-tweaks out-port tweak-list last-moment) + (if (not (null? tweak-list)) + (let* + ((now (caar tweak-list)) + (diff (ly:moment-sub now last-moment)) + (these-tweaks (cdar tweak-list)) + (skip (moment->skip diff)) + + (base (format "\\overrideProperty + #\"Score.NonMusicalPaperColumn\" + #'line-break-system-details + #'~a" these-tweaks)) + ) + + (format out-port "\\skip ~a\n~a\n" skip base) + (dump-tweaks out-port (cdr tweak-list) now) + ) + + )) + + (define (handle-page page) + (define (handle-system sys) + (let* + ((props '((line-break . #t)))) + + (if (equal? (car (page-lines page)) sys) + (set! props (cons '(page-break . #t) + props))) + + (if (not (ly:prob-property? sys 'is-title)) + (record (ly:grob-property (ly:spanner-bound (ly:prob-property sys 'system-grob) LEFT) 'when) + props)) + )) + (for-each handle-system (page-lines page))) + + + (for-each handle-page pages) + + (let* + ((out-port (open-output-file "breaks.ly"))) + (display "{" out-port) + (dump-tweaks out-port (reverse tweaks) (ly:make-moment 0 1)) + (display "}" out-port) + )) + + + +(define (post-process-pages pages) + (if (ly:get-option 'write-page-layout) + (write-page-breaks pages))) @@ -28,12 +93,13 @@ ;; - raggedbottom? raggedlastbottom? (define-public (optimal-page-breaks lines paper-book) - "Return pages as a list starting with 1st page. Each page is a 'page prob. - -" + "Return pages as a list starting with 1st page. Each page is a 'page Prob." (define MAXPENALTY 1e9) (define paper (ly:paper-book-paper paper-book)) + + ;; ugh. + (define page-alist (layout->page-init (ly:paper-book-paper paper-book))) (define scopes (ly:paper-book-scopes paper-book)) (define force-equalization-factor #f) (define (get-path node done) @@ -55,7 +121,6 @@ is what have collected so far, and has ascending page numbers." (relative-force (/ force inter-system-space)) (abs-relative-force (abs relative-force))) - (+ (* abs-relative-force (+ abs-relative-force 1)) prev-penalty (* force-equalization-factor (/ (abs (- prev-force force)) @@ -206,16 +271,17 @@ CURRENT-BEST is the best result sofar, or #f." (1+ (page-page-number (car best-paths))))) (this-page (make-page + page-alist 'paper-book paper-book - 'is-last last? + 'is-last last? 'page-number this-page-num)) - + (ragged-all? (eq? #t (ly:output-def-lookup paper 'raggedbottom))) (ragged-last? (eq? #t (ly:output-def-lookup paper 'raggedlastbottom))) (ragged? (or ragged-all? (and ragged-last? last?))) - (height (page-height this-page)) + (height (page-printable-height this-page)) (vertical-spacing (space-systems height current-lines ragged?)) (satisfied-constraints (car vertical-spacing)) (force (if satisfied-constraints @@ -316,9 +382,7 @@ DONE." (break-nodes (get-path best-break-node '())) ) - - (set! (page-property (car (last-pair break-nodes)) 'is-last) #t) - + (page-set-property! (car (last-pair break-nodes)) 'is-last #t) (if #f; (ly:get-option 'verbose) (begin (display (list @@ -327,6 +391,8 @@ DONE." "\npenalties " (map page-penalty break-nodes) "\nconfigs " (map page-configuration break-nodes)))) - (let ((stencils (map page-stencil break-nodes))) - (ly:progress "\n") - stencils))) + ;; construct page stencils. + (for-each page-stencil break-nodes) + (post-process-pages paper break-nodes) + + break-nodes)) diff --git a/scm/lily.scm b/scm/lily.scm index 1812ab74bd..7ef7c147d2 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -34,6 +34,8 @@ similar to chord syntax") (verbose ,(ly:command-line-verbose?) "value for the --verbose flag") (ttf-verbosity 0 "how much verbosity for TTF font embedding?") + (write-page-layout #f + "dump page layout settings.") (debug-gc #f "dump GC protection info")))) diff --git a/scm/page.scm b/scm/page.scm index aff8dfa67e..7eb5cb69ae 100644 --- a/scm/page.scm +++ b/scm/page.scm @@ -12,7 +12,8 @@ page-property page-set-property! page-prev - page-height + page-printable-height + layout->page-init page-lines page-force page-penalty @@ -21,6 +22,7 @@ page-page-number page-system-numbers page-stencil + page-free-height page? )) @@ -35,18 +37,23 @@ (define page-module (current-module)) -(define (make-page . args) - (apply ly:make-prob (append - (list 'page '()) - args))) +(define (make-page init . args) + (let* + ((p (apply ly:make-prob (append + (list 'page init) + args)))) + (page-set-property! p 'head-stencil (page-header p)) + (page-set-property! p 'foot-stencil (page-footer p)) + + p)) + (define page-property ly:prob-property) +(define page-set-property! ly:prob-set-property!) (define (page-property? page sym) (eq? #t (page-property page sym))) - (define (page? x) (ly:prob-type? x 'page)) -(define page-set-property! ly:prob-set-property!) ;; define accessors. (for-each @@ -63,8 +70,6 @@ (map (lambda (ps) (ly:prob-property ps 'number)) (page-lines node))) - - (define (annotate-page stencil layout) (let* ((topmargin (ly:output-def-lookup layout 'topmargin)) @@ -99,15 +104,19 @@ stencil)) -(define (annotate-space-left page-stencil layout bottom-edge) +(define (annotate-space-left page) (let* - ((arrow (annotate-y-interval layout - "space left" - (cons (- bottom-edge) (car (ly:stencil-extent page-stencil Y))) - #t))) - + ((p-book (page-property page 'paper-book)) + (layout (ly:paper-book-paper page)) + (arrow (annotate-y-interval layout + "space left" + (cons (- (page-property page 'bottom-edge)) + (page-property page 'bottom-system-edge)) + #t))) + (set! arrow (ly:stencil-translate-axis arrow 8 X)) - (ly:stencil-add page-stencil arrow))) + + arrow)) @@ -176,7 +185,6 @@ (offsets (page-configuration page)) (number (page-page-number page)) (last? (page-property page 'is-last)) - ) (page-headfoot layout scopes number @@ -188,34 +196,56 @@ 'footsep) dir last?))) -(define (page-footer page) +(define (page-header page) (page-header-or-footer page UP)) -(define (page-header page) +(define (page-footer page) (page-header-or-footer page DOWN)) +(define (layout->page-init layout) + "Alist of settings for page layout" + (let* + ((vsize (ly:output-def-lookup layout 'vsize)) + (hsize (ly:output-def-lookup layout 'hsize)) + + (lmargin (ly:output-def-lookup layout 'leftmargin)) + (leftmargin (if lmargin + lmargin + (/ (- hsize + (ly:output-def-lookup layout 'linewidth)) 2))) + + (bottom-edge (- vsize + (ly:output-def-lookup layout 'bottommargin))) + (top-margin (ly:output-def-lookup layout 'topmargin)) + ) + + `((vsize . ,vsize) + (hsize . ,hsize) + (left-margin . ,leftmargin) + (top-margin . ,top-margin) + (bottom-edge . ,bottom-edge) + ))) + (define (make-page-stencil page) "Construct a stencil representing the page from LINES. Offsets is a list of increasing numbers. They must be negated to create offsets. - " +" + + (let* ((p-book (page-property page 'paper-book)) + (prop (lambda (sym) (page-property page sym))) (layout (ly:paper-book-paper p-book)) (scopes (ly:paper-book-scopes p-book)) (lines (page-lines page)) (offsets (page-configuration page)) (number (page-page-number page)) - (last? (page-property page 'is-last)) - - (topmargin (ly:output-def-lookup layout 'topmargin)) ;; TODO: naming vsize/hsize not analogous to TeX. - (vsize (ly:output-def-lookup layout 'vsize)) - (hsize (ly:output-def-lookup layout 'hsize)) (system-xoffset (ly:output-def-lookup layout 'horizontalshift 0.0)) (system-separator-markup (ly:output-def-lookup layout 'systemSeparatorMarkup)) @@ -224,29 +254,16 @@ create offsets. (layout-extract-page-properties layout) system-separator-markup) #f)) - (lmargin (ly:output-def-lookup layout 'leftmargin)) - (leftmargin (if lmargin - lmargin - (/ (- hsize - (ly:output-def-lookup layout 'linewidth)) 2))) - - (rightmargin (ly:output-def-lookup layout 'rightmargin)) - (bottom-edge (- vsize - (ly:output-def-lookup layout 'bottommargin))) - - (head (page-header page)) - (foot (page-footer page)) - - (head-height (if (ly:stencil? head) - (interval-length (ly:stencil-extent head Y)) + (head-height (if (ly:stencil? (prop 'head-stencil)) + (interval-length (ly:stencil-extent (prop 'head-stencil) Y)) 0.0)) - (height-proc (ly:output-def-lookup layout 'page-music-height)) + (page-stencil (ly:make-stencil + '() + (cons (prop 'left-margin) (prop 'hsize)) + (cons (- (prop 'top-margin)) 0))) - (page-stencil (ly:make-stencil '() - (cons leftmargin hsize) - (cons (- topmargin) 0))) (last-system #f) (last-y 0.0) (add-to-page (lambda (stencil y) @@ -255,7 +272,7 @@ create offsets. (ly:stencil-translate stencil (cons system-xoffset - (- 0 head-height y topmargin)) + (- 0 head-height y (prop 'top-margin))) ))))) (add-system @@ -278,21 +295,16 @@ create offsets. (cdr (paper-system-staff-extents system)))))) (set! last-system system) (set! last-y y)))) + (head (prop 'head-stencil)) + (foot (prop 'foot-stencil)) ) - (if (annotate? layout) (begin (for-each (lambda (sys) (paper-system-annotate sys layout)) lines) (paper-system-annotate-last (car (last-pair lines)) layout))) - - (if #f - (display (list - "leftmargin " leftmargin "rightmargin " rightmargin - ))) - (set! page-stencil (ly:stencil-combine-at-edge page-stencil Y DOWN (if (and @@ -304,16 +316,15 @@ create offsets. (map add-system (zip lines offsets)) - (if (annotate? layout) - (set! - page-stencil - (annotate-space-left page-stencil layout - (- bottom-edge - (if (ly:stencil? foot) - (interval-length (ly:stencil-extent foot Y)) - 0))) - )) + (ly:prob-set-property! page 'bottom-system-edge + (car (ly:stencil-extent page-stencil Y))) + (ly:prob-set-property! page 'space-left + (car (ly:stencil-extent page-stencil Y))) + (if (annotate? layout) + (set! page-stencil + (ly:stencil-add page-stencil + (annotate-space-left page)))) (if (and (ly:stencil? foot) (not (ly:stencil-empty? foot))) @@ -323,21 +334,19 @@ create offsets. (ly:stencil-translate foot (cons 0 - (+ (- bottom-edge) + (+ (- (prop 'bottom-edge)) (- (car (ly:stencil-extent foot Y))))))))) (set! page-stencil - (ly:stencil-translate page-stencil (cons leftmargin 0))) + (ly:stencil-translate page-stencil (cons (prop 'left-margin) 0))) ;; annotation. (if (annotate? layout) (set! page-stencil (annotate-page layout page-stencil))) - page-stencil)) - (define (page-stencil page) (if (not (ly:stencil? (page-property page 'stencil))) @@ -347,7 +356,7 @@ create offsets. (page-set-property! page 'stencil (make-page-stencil page))) (page-property page 'stencil)) -(define (page-height page) +(define (calc-printable-height page) "Printable area for music and titles; matches default-page-make-stencil." (let* ((p-book (page-property page 'paper-book)) @@ -359,8 +368,8 @@ create offsets. (ly:output-def-lookup layout 'topmargin) (ly:output-def-lookup layout 'bottommargin))) - (head (page-headfoot layout scopes number 'make-header 'headsep UP last?)) - (foot (page-headfoot layout scopes number 'make-footer 'footsep DOWN last?)) + (head (page-property page 'head-stencil)) + (foot (page-property page 'foot-stencil)) (available (- h (if (ly:stencil? head) (interval-length (ly:stencil-extent head Y)) @@ -371,3 +380,10 @@ create offsets. ;; (display (list "\n available" available head foot)) available)) + +(define (page-printable-height page) + (if (not (number? (page-property page 'printable-height))) + (page-set-property! page 'printable-height (calc-printable-height page))) + + (page-property page 'printable-height)) + diff --git a/scm/safe-lily.scm b/scm/safe-lily.scm index f96a8b7243..54bdeb032d 100644 --- a/scm/safe-lily.scm +++ b/scm/safe-lily.scm @@ -118,7 +118,7 @@ ly:set-option ly:set-point-and-click ly:spanner-broken-into - ly:spanner-get-bound + ly:spanner-bound ly:spanner? ly:stencil-add ly:stencil-aligned-to -- 2.39.5