From: Jan Nieuwenhuizen Date: Wed, 10 Mar 2004 23:02:39 +0000 (+0000) Subject: Do header and footer. X-Git-Tag: release/2.1.30~6 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=81e802ecf8f7fef6dc5719ea2c1ea64fa078b85d;p=lilypond.git Do header and footer. --- diff --git a/ChangeLog b/ChangeLog index bcbe09fb14..dd70232dbf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2004-03-11 Jan Nieuwenhuizen + + * lily/paper-book.cc: Do header and footer. + +2004-03-10 Jan Nieuwenhuizen + + * scm/lily.scm (safe-mode?): New name (was: security-paranoia). + + * scm/paper.scm (lineheight): Remove + (head-sep, foot-sep): Add. + 2004-03-10 Han-Wen Nienhuys * lily/piano-pedal-engraver.cc (finalize): attach unfinished diff --git a/input/test/title-markup.ly b/input/test/title-markup.ly index 98cf714064..2282f46127 100644 --- a/input/test/title-markup.ly +++ b/input/test/title-markup.ly @@ -36,6 +36,9 @@ sizeTest = \markup { spaceTest = \markup { "two space chars" } \header { texidoc = "Make titles using markup (WIP)." + + tagline = "my tagline for v \version" + copyright = "copyright by me" %dedication = "För my dør Lily" % ugh: encoding char-size @@ -103,7 +106,7 @@ spaceTest = \markup { "two space chars" } \score { \context Staff \notes \relative c' { - \repeat unfold 10 { a b c d \break } + \repeat unfold 1 { a b c d \break } c1 } } diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 65f4bdd966..92a9191d56 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -16,14 +16,34 @@ #include "paper-score.hh" #include "stencil.hh" +static SCM +stencil2line (Stencil* stil) +{ + static SCM z = ly_offset2scm (Offset (0, 0)); + Offset dim = Offset (stil->extent (X_AXIS).length (), + stil->extent (Y_AXIS).length ()); + return scm_cons (ly_offset2scm (dim), + scm_list_1 (scm_cons (z, stil->smobbed_copy ()))); +} + +static SCM +height2line (Real h) +{ + static SCM z = ly_offset2scm (Offset (0, 0)); + return scm_cons (ly_offset2scm (Offset (0, h)), + scm_list_1 (scm_cons (z, SCM_EOL))); +} + // WIP -- simplistic page interface // Do we need this at all? SCM, smob? class Page { public: Paper_def *paper_; + int number_; SCM lines_; + SCM protect_; Stencil *header_; Stencil *footer_; @@ -33,45 +53,76 @@ public: //HMMM all this size stuff to paper/paper-outputter? Real hsize_; Real vsize_; + Real top_margin_; + Real bottom_margin_; Real foot_sep_; Real head_sep_; /* available area for text. */ Real text_height (); - Page (Paper_def*); + Page (Paper_def*, int); void output (Paper_outputter*, bool); }; -Page::Page (Paper_def *paper) +Page::Page (Paper_def *paper, int number) { paper_ = paper; + number_ = number; height_ = 0; - header_ = 0; - footer_ = 0; lines_ = SCM_EOL; hsize_ = paper->get_realvar (ly_symbol2scm ("hsize")); vsize_ = paper->get_realvar (ly_symbol2scm ("vsize")); - head_sep_ = 0; //paper->get_realvar (ly_symbol2scm ("head-sep")); - foot_sep_ = 0; //paper->get_realvar (ly_symbol2scm ("foot-sep")); + top_margin_ = paper->get_realvar (ly_symbol2scm ("top-margin")); + bottom_margin_ = paper->get_realvar (ly_symbol2scm ("bottom-margin")); + head_sep_ = paper->get_realvar (ly_symbol2scm ("head-sep")); + foot_sep_ = paper->get_realvar (ly_symbol2scm ("foot-sep")); + + SCM make_header = scm_primitive_eval (ly_symbol2scm ("make-header")); + SCM make_footer = scm_primitive_eval (ly_symbol2scm ("make-footer")); + + header_ = unsmob_stencil (scm_call_2 (make_header, paper_->smobbed_copy (), + scm_int2num (number_))); + protect_ = SCM_EOL; + // ugh, how to protect a Stencil from the outside? + protect_ = scm_cons (header_->get_expr (), protect_); + if (header_) + header_->align_to (Y_AXIS, UP); + + // FIXME: tagline/copyright + footer_ = unsmob_stencil (scm_call_2 (make_footer, paper_->smobbed_copy (), + scm_int2num (number_))); + // ugh, how to protect a Stencil from the outside? + protect_ = scm_cons (footer_->get_expr (), protect_); + if (footer_) + footer_->align_to (Y_AXIS, UP); } void Page::output (Paper_outputter *out, bool is_last) { - // TODO: header/footer etc + if (header_) + { + out->output_line (stencil2line (header_), false); + out->output_line (height2line (head_sep_), false); + } out->output_scheme (scm_list_1 (ly_symbol2scm ("start-page"))); for (SCM s = lines_; gh_pair_p (s); s = ly_cdr (s)) out->output_line (ly_car (s), is_last && gh_pair_p (ly_cdr (s))); out->output_scheme (scm_list_2 (ly_symbol2scm ("stop-page"), - gh_bool2scm (is_last))); + gh_bool2scm (is_last && !footer_))); + if (footer_) + { + out->output_line (height2line (foot_sep_), false); + out->output_line (stencil2line (footer_), is_last); + } } Real Page::text_height () { - Real h = vsize_; + Real h = vsize_ - top_margin_ - bottom_margin_; if (header_) h -= header_->extent (Y_AXIS).length () + head_sep_; if (footer_) @@ -151,8 +202,9 @@ Paper_book::get_title (int i) } /* TODO: - - decent page breaking algorithm; fill-up page - - header / footer (generate per Page, with page#, tagline/copyright) + - decent page breaking algorithm + - top/bottom & inter-line filling + - footer: tagline/copyright - override: # pages, or pageBreakLines= #'(3 3 4), ? */ Link_array* Paper_book::get_pages () @@ -178,7 +230,8 @@ Paper_book::get_pages () } Paper_def *paper = papers_[0]; - Page *page = new Page (paper); + int page_number = 1; + Page *page = new Page (paper, page_number++); fprintf (stderr, "book_height: %f\n", book_height); fprintf (stderr, "vsize: %f\n", page->vsize_); fprintf (stderr, "pages: %f\n", book_height / page->text_height ()); @@ -202,22 +255,12 @@ Paper_book::get_pages () if (page->height_ + h > text_height) { pages->push (page); - page = new Page (paper); + page = new Page (paper, page_number++); } if (page->height_ + h <= text_height || page->height_ == 0) { if (j == 0 && title) - { - Offset dim = Offset (title->extent (X_AXIS).length (), - title->extent (Y_AXIS).length ()); - page->lines_ - = ly_snoc (scm_cons (ly_offset2scm (dim), - scm_list_1 - (scm_cons - (ly_offset2scm (Offset (0, 0)), - title->smobbed_copy ()))), - page->lines_); - } + page->lines_ = ly_snoc (stencil2line (title), page->lines_); page->lines_ = ly_snoc (line, page->lines_); page->height_ += h; h = 0; diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc index 4ec59b228f..0fe1330ba1 100644 --- a/lily/paper-outputter.cc +++ b/lily/paper-outputter.cc @@ -31,20 +31,28 @@ Paper_outputter::Paper_outputter (String name) { if (safe_global_b) - { - gh_define ("security-paranoia", SCM_BOOL_T); - } + scm_define (ly_symbol2scm ("safe-mode?"), SCM_BOOL_T); file_ = scm_open_file (scm_makfrom0str (name.to_str0 ()), - scm_makfrom0str ("w")); + scm_makfrom0str ("w")); static SCM find_dumper; if (!find_dumper) find_dumper = scm_c_eval_string ("find-dumper"); - - output_func_ = scm_call_1 (find_dumper,scm_makfrom0str (output_format_global.to_str0 ())); - output_scheme (gh_cons (ly_symbol2scm ("top-of-file"), SCM_EOL)); + output_func_ + = scm_call_1 (find_dumper, + scm_makfrom0str (output_format_global.to_str0 ())); + + String creator = gnu_lilypond_version_string (); + creator += " (http://lilypond.org)"; + time_t t (time (0)); + String time_stamp = ctime (&t); + time_stamp = time_stamp.left_string (time_stamp.length () - 1) + + " " + *tzname; + output_scheme (scm_list_3 (ly_symbol2scm ("header"), + scm_makfrom0str (creator.to_str0 ()), + scm_makfrom0str (time_stamp.to_str0 ()))); } Paper_outputter::~Paper_outputter () @@ -113,8 +121,9 @@ Paper_outputter::output_line (SCM line, bool is_last) between = stil->get_expr (); continue; } - - output_expr (stil->get_expr (), ly_scm2offset (head)); + + if (stil) + output_expr (stil->get_expr (), ly_scm2offset (head)); } if (is_last) diff --git a/ps/lilyponddefs.ps b/ps/lilyponddefs.ps index 3cbc5b1eb5..07d5babc8b 100644 --- a/ps/lilyponddefs.ps +++ b/ps/lilyponddefs.ps @@ -24,6 +24,7 @@ /paper-size { lilypondpaperpapersize } bind def %% FIXME: base-line-skip is too big, is this RIGHT? +%% /line-height 14 staff-space mul def %% /base-line-skip lilypondpaperlineheight def %%/base-line-skip lilypondpaperlineheight lilypondpaperoutputscale div def /base-line-skip 0 def diff --git a/scm/lily.scm b/scm/lily.scm index cf76e0afe5..cdbc6e8ad3 100644 --- a/scm/lily.scm +++ b/scm/lily.scm @@ -91,7 +91,7 @@ ;; lily specific variables. (define-public default-script-alist '()) -(define-public security-paranoia #f) +(define-public safe-mode? #f) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Unassorted utility functions. diff --git a/scm/output-pdftex.scm b/scm/output-pdftex.scm index ad3e3469b5..68425da5c6 100644 --- a/scm/output-pdftex.scm +++ b/scm/output-pdftex.scm @@ -174,11 +174,9 @@ (string-append "\n\\" s "{" (inexact->string i 10) "}" )) -;; -;; need to do something to make this really safe. -;; +;; FIXME: explain ploblem: need to do something to make this really safe. (define (output-tex-string s) - (if security-paranoia + (if safe-mode? (regexp-substitute/global #f "\\\\" s 'pre "$\\backslash$" 'post) s)) diff --git a/scm/output-ps.scm b/scm/output-ps.scm index 6850996fe1..7f3953bc8d 100644 --- a/scm/output-ps.scm +++ b/scm/output-ps.scm @@ -267,10 +267,16 @@ (string-append (select-font name-mag-pair) exp)) -(define (header creator generate) +(define (header creator time-stamp) (string-append "%!PS-Adobe-3.0\n" - "%%Creator: " creator generate "\n")) + "%%Creator: " creator " " time-stamp "\n" + ;;(string-append "GNU LilyPond (" (lilypond-version) "), ") + ;; (strftime "%c" (localtime (current-time)))) + ;; FIXME: duplicated in every backend + (ps-string-def + "lilypond" 'tagline + (string-append "Engraved by LilyPond (version " (lilypond-version) ")")))) (define (header-end) (string-append @@ -401,16 +407,6 @@ ;; (string-append "(" (escape-parentheses s) ") show ")) (string-append "(" (ps-encoding s) ") show ")) -;; top-of-file, wtf? -(define (top-of-file) - (string-append - (header (string-append "GNU LilyPond (" (lilypond-version) "), ") - (strftime "%c" (localtime (current-time)))) - ;;; ugh - (ps-string-def - "lilypond" 'tagline - (string-append "Engraved by LilyPond (" (lilypond-version) ")")))) - (define (unknown) "\n unknown\n") diff --git a/scm/output-tex.scm b/scm/output-tex.scm index 4e8b6e0b10..df5c7ded32 100644 --- a/scm/output-tex.scm +++ b/scm/output-tex.scm @@ -132,16 +132,6 @@ (format "Programming error: No such font: ~S" name-mag-pair)) "")))) -;; top-of-file, wtf? ugh: tagline? -(define (top-of-file) - (string-append - "% generated by LilyPond " - (lilypond-version) " (http://lilypond.org).\n" - "\\def\\lilypondtagline{Engraved by LilyPond (version " - (lilypond-version) - ")}\n" - )) - (define (blank) "") @@ -240,20 +230,21 @@ "\\lilypondspecial\n" "\\lilypondpostscript\n")) -;; Note: this string must match the string in lilypond.py!!! -(define (header creator generate) +(define (header creator time-stamp) (string-append - "% Generated automatically by: " creator generate "\n")) + "% Generated by " creator "\n" + "% at " time-stamp "\n" + ;; FIXME: duplicated in every backend + "\\def\\lilypondtagline{Engraved by LilyPond (version " + (lilypond-version)")}\n")) (define (invoke-char s i) (string-append "\n\\" s "{" (inexact->string i 10) "}" )) -;; -;; need to do something to make this really safe. -;; +;; FIXME: explain ploblem: need to do something to make this really safe. (define-public (output-tex-string s) - (if security-paranoia + (if safe-mode? (regexp-substitute/global #f "\\\\" s 'pre "$\\backslash$" 'post) s)) diff --git a/scm/page-layout.scm b/scm/page-layout.scm index 1d508dca82..fc86c8bb3f 100644 --- a/scm/page-layout.scm +++ b/scm/page-layout.scm @@ -84,3 +84,23 @@ (#:fill-line ("" (get 'opus)) #:fill-line (#:large #:bigger #:caps (get 'piece) ""))))))) + +(define-public (make-header paper page-number) + (let ((props (list (append `((linewidth . ,(ly:paper-get-number + paper 'linewidth)) + (font-family . roman)) + (ly:paper-lookup paper 'font-defaults))))) + + (interpret-markup paper props + (markup #:fill-line ("" (number->string page-number)))))) + + +(define-public (make-footer paper page-number) + (let ((props (list (append `((linewidth . ,(ly:paper-get-number + paper 'linewidth)) + (font-family . roman)) + (ly:paper-lookup paper 'font-defaults))))) + + (interpret-markup paper props + (markup #:fill-line ("" (number->string page-number)))))) + diff --git a/scm/paper.scm b/scm/paper.scm index bb152b057a..db8e4ad626 100644 --- a/scm/paper.scm +++ b/scm/paper.scm @@ -7,11 +7,10 @@ (define-public (paper-set-staff-size sz) "Function to be called inside a \\paper{} block to set the staff size." - (let* - ((m (current-module)) - (ss (/ sz 4)) - (pt (eval 'pt m)) - (mm (eval 'mm m)) ) + (let* ((m (current-module)) + (ss (/ sz 4)) + (pt (eval 'pt m)) + (mm (eval 'mm m))) (module-define! m 'fonts (scale-font-list (/ sz (* 20 pt)))) (module-define! m 'staffheight sz) @@ -24,9 +23,7 @@ (module-define! m 'outputscale ss) (module-define! m 'ledgerlinethickness (+ (* 0.5 pt) (/ ss 10))) (module-define! m 'blotdiameter (* 0.35 pt)) - (module-define! m 'interscoreline (* 4 mm)) - ;; REMOVEME - (module-define! m 'lineheight (* 14 ss)))) + (module-define! m 'interscoreline (* 4 mm)))) (define-public (set-global-staff-size sz) "Set the default staff size, where SZ is thought to be in PT." @@ -48,28 +45,29 @@ ;; todo: take dimension arguments. - (define (set-paper-dimensions m w h) "M is a module (ie. paper->scope_ )" - (let* ((mm (eval 'mm m))) (module-define! m 'hsize w) (module-define! m 'vsize h) (module-define! m 'linewidth (- w (* 20 mm))) (module-define! m 'raggedright #f) (module-define! m 'packed #f) - (module-define! m 'indent (/ w 14)))) + (module-define! m 'indent (/ w 14)) + ;; page layout + (module-define! m 'top-margin (* 3 mm)) + (module-define! m 'bottom-margin (* 3 mm)) + (module-define! m 'head-sep (* 4 mm)) + (module-define! m 'foot-sep (* 4 mm)))) (define-public (set-paper-size name) - (let* - ((entry (assoc name paper-alist)) - (pap (eval '$defaultpaper (current-module))) - (new-paper (ly:output-def-clone pap)) - (m (ly:output-def-scope new-paper)) - (mm (eval 'mm m)) - ) - + (let* ((entry (assoc name paper-alist)) + (pap (eval '$defaultpaper (current-module))) + (new-paper (ly:output-def-clone pap)) + (m (ly:output-def-scope new-paper)) + (mm (eval 'mm m))) + (if (pair? entry) (begin (set! entry (eval (cdr entry) m)) @@ -77,7 +75,5 @@ (module-define! m 'papersize name) (module-define! m 'papersizename name) (set-paper-dimensions m (car entry) (cdr entry)) - (module-define! (current-module) '$defaultpaper new-paper) - ) - (ly:warning (string-append "Unknown papersize: " name)) - ))) + (module-define! (current-module) '$defaultpaper new-paper)) + (ly:warning (string-append "Unknown papersize: " name)))))