(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-25 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * 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 <hanwen@xs4all.nl>
+ * 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(!)
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.")
header_0_ = header;
}
else if (Music_output *mop = unsmob_music_output (scm_car (s)))
-
{
if (Paper_score *pscore = dynamic_cast<Paper_score *> (mop))
{
#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)
}
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?")
{
}
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 ();
}
System *system = dynamic_cast<System *> (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) + "]");
}
pl->set_property ("refpoint-Y-extent", ly_interval2scm (staff_refpoints));
}
-
+
+ pl->set_property ("system-grob", this->self_scm ());
+
return pl->unprotect ();
}
(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))
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"""))
(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
(go (make <gnome-outputter>
#: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
(ice-9 string-fun)
(ice-9 format)
(guile)
+ (scm page)
(srfi srfi-1)
(srfi srfi-13)
(lily))
(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)
(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)
; (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)
(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))))
(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
(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))))
(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
(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)))
;; - 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)
(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))
(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
(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
"\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))
(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"))))
page-property
page-set-property!
page-prev
- page-height
+ page-printable-height
+ layout->page-init
page-lines
page-force
page-penalty
page-page-number
page-system-numbers
page-stencil
+ page-free-height
page?
))
(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
(map (lambda (ps) (ly:prob-property ps 'number))
(page-lines node)))
-
-
(define (annotate-page stencil layout)
(let*
((topmargin (ly:output-def-lookup layout 'topmargin))
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))
\f
(offsets (page-configuration page))
(number (page-page-number page))
(last? (page-property page 'is-last))
-
)
(page-headfoot layout scopes number
'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))
(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)
(ly:stencil-translate stencil
(cons
system-xoffset
- (- 0 head-height y topmargin))
+ (- 0 head-height y (prop 'top-margin)))
)))))
(add-system
(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
(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)))
(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)))
(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))
(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))
;; (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))
+
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