From 46b687aca821801f779e479ccc601c713ed0917e Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 24 Jan 2006 13:51:14 +0000 Subject: [PATCH] * lily/prob-scheme.cc (LY_DEFINE): new file. (LY_DEFINE): functions ly:make-prob , ly:prob-type? , ly:prob-(set-)property(!) * lily/music-scheme.cc (LY_DEFINE): rewrite get/set property using prob functions. * lily/music.cc (derived_mark): derive Music from Prob. * lily/paper-system.cc (LY_DEFINE): derive from Prob. * lily/prob.cc (Module): Implement Prob (Property Object), object with shared and r/w property alists. * lily/include/prob.hh (Module): new file. Declare Prob. --- ChangeLog | 6 ++++ lily/include/lily-proto.hh | 1 - lily/include/paper-system.hh | 8 ++--- lily/include/prob.hh | 12 ++++--- lily/music-scheme.cc | 17 +++------- lily/music.cc | 4 +-- lily/paper-book.cc | 16 +++++---- lily/paper-score-scheme.cc | 2 +- lily/paper-system-scheme.cc | 42 ----------------------- lily/paper-system.cc | 31 +++++++---------- lily/prob-scheme.cc | 66 ++++++++++++++++++++++++++++++++++++ lily/prob.cc | 9 ++--- lily/system.cc | 4 +-- scm/framework-ps.scm | 2 +- scm/layout-page-layout.scm | 34 +++++++++---------- scm/lily-library.scm | 4 +-- scm/music-functions.scm | 6 ++-- 17 files changed, 140 insertions(+), 124 deletions(-) delete mode 100644 lily/paper-system-scheme.cc create mode 100644 lily/prob-scheme.cc diff --git a/ChangeLog b/ChangeLog index a33b524019..e54e951f21 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2006-01-24 Han-Wen Nienhuys + * lily/prob-scheme.cc (LY_DEFINE): new file. + (LY_DEFINE): functions ly:make-prob , ly:prob-type? , ly:prob-(set-)property(!) + + * lily/music-scheme.cc (LY_DEFINE): rewrite get/set property using + prob functions. + * lily/music.cc (derived_mark): derive Music from Prob. * lily/paper-system.cc (LY_DEFINE): derive from Prob. diff --git a/lily/include/lily-proto.hh b/lily/include/lily-proto.hh index 1e9affd339..da0f30e1f6 100644 --- a/lily/include/lily-proto.hh +++ b/lily/include/lily-proto.hh @@ -120,7 +120,6 @@ class Paper_book; class Paper_column; class Paper_outputter; class Paper_score; -class Paper_system; class Performance; class Performer; class Performer_group; diff --git a/lily/include/paper-system.hh b/lily/include/paper-system.hh index a152f789b7..8c709c3464 100644 --- a/lily/include/paper-system.hh +++ b/lily/include/paper-system.hh @@ -17,11 +17,7 @@ formatted content of the grob is put into a Paper_system. Page-breaking handles Paper_system objects. */ -class Paper_system : public Prob -{ -public: - Paper_system (Stencil, SCM); -}; -Paper_system*unsmob_paper_system (SCM); +Prob *make_paper_system (SCM immutable_init); +void paper_system_set_stencil (Prob *prob, Stencil s); #endif /* PAPER_SYSTEM_HH */ diff --git a/lily/include/prob.hh b/lily/include/prob.hh index 80827a67a3..f854bf3a41 100644 --- a/lily/include/prob.hh +++ b/lily/include/prob.hh @@ -27,21 +27,23 @@ class Prob protected: SCM mutable_property_alist_; SCM immutable_property_alist_; - + SCM type_; + virtual void derived_mark () const; virtual SCM copy_mutable_properties () const; virtual void type_check_assignment (SCM,SCM) const; public: - Prob (SCM); + Prob (SCM, SCM); Prob (Prob const &); virtual String name () const; - + SCM type () const { return type_; } SCM get_property_alist (bool mutble) const; SCM internal_get_property (SCM sym) const; void internal_set_property (SCM sym, SCM val); }; - -DECLARE_UNSMOB (Prob, prob); +DECLARE_UNSMOB(Prob,prob); +SCM ly_prob_set_property_x (SCM system, SCM sym, SCM value); +SCM ly_prob_property (SCM system, SCM sym, SCM dfault); #endif /* PROPERTY_OBJECT_HH */ diff --git a/lily/music-scheme.cc b/lily/music-scheme.cc index 4da2726782..27e5db9880 100644 --- a/lily/music-scheme.cc +++ b/lily/music-scheme.cc @@ -11,6 +11,7 @@ #include "music.hh" #include "pitch.hh" + LY_DEFINE (ly_music_length, "ly:music-length", 1, 0, 0, (SCM mus), "Get the length of music expression @var{mus}, and return as a @code{Moment} object.") @@ -21,15 +22,13 @@ LY_DEFINE (ly_music_length, "ly:music-length", } LY_DEFINE (ly_music_property, - "ly:music-property", 2, 0, 0, (SCM mus, SCM sym), + "ly:music-property", 2, 1, 0, (SCM mus, SCM sym, SCM dfault), "Get the property @var{sym} of music expression @var{mus}.\n" - "If @var{sym} is undefined, return @code{' ()}.\n") + "If @var{sym} is undefined, return @code{'()}.\n") { Music *sc = unsmob_music (mus); SCM_ASSERT_TYPE (sc, mus, SCM_ARG1, __FUNCTION__, "music"); - SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol"); - - return sc->internal_get_property (sym); + return ly_prob_property (mus,sym,dfault); } LY_DEFINE (ly_music_set_property, "ly:music-set-property!", @@ -38,13 +37,7 @@ LY_DEFINE (ly_music_set_property, "ly:music-set-property!", { Music *sc = unsmob_music (mus); SCM_ASSERT_TYPE (sc, mus, SCM_ARG1, __FUNCTION__, "music"); - SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol"); - - bool ok = type_check_assignment (sym, val, ly_symbol2scm ("music-type?")); - if (ok) - sc->internal_set_property (sym, val); - - return SCM_UNSPECIFIED; + return ly_prob_set_property_x (mus, sym, val); } diff --git a/lily/music.cc b/lily/music.cc index cba10da79c..cf48775f00 100644 --- a/lily/music.cc +++ b/lily/music.cc @@ -32,7 +32,7 @@ Music::internal_is_music_type (SCM k) const } Music::Music (SCM init) - : Prob (init) + : Prob (ly_symbol2scm ("Music"), init) { length_callback_ = SCM_EOL; start_callback_ = SCM_EOL; @@ -219,8 +219,6 @@ Music::transpose (Pitch delta) set_property ("pitch-alist", ly_transpose_key_alist (pa, delta.smobbed_copy ())); } - - void Music::set_spot (Input ip) { diff --git a/lily/paper-book.cc b/lily/paper-book.cc index 032af56391..cd295de778 100644 --- a/lily/paper-book.cc +++ b/lily/paper-book.cc @@ -216,7 +216,7 @@ Paper_book::score_title (SCM header) } void -set_system_penalty (Paper_system *ps, SCM header) +set_system_penalty (Prob *ps, SCM header) { if (ly_is_module (header)) { @@ -245,7 +245,9 @@ Paper_book::add_score_title (SCM header) override settings from \paper {} */ SCM props = paper_->lookup_variable (ly_symbol2scm ("score-title-properties")); - Paper_system *ps = new Paper_system (title, props); + Prob *ps = make_paper_system (props); + paper_system_set_stencil (ps, title); + systems_ = scm_cons (ps->self_scm (), systems_); ps->unprotect (); set_system_penalty (ps, header); @@ -264,7 +266,8 @@ Paper_book::systems () if (!title.is_empty ()) { SCM props = paper_->lookup_variable (ly_symbol2scm ("book-title-properties")); - Paper_system *ps = new Paper_system (title, props); + Prob *ps = make_paper_system (props); + paper_system_set_stencil (ps, title); set_system_penalty (ps, header_); systems_ = scm_cons (ps->self_scm (), systems_); @@ -323,7 +326,8 @@ Paper_book::systems () scm_car (s)); // TODO: init props - Paper_system *ps = new Paper_system (*unsmob_stencil (t), SCM_EOL); + Prob *ps = make_paper_system (SCM_EOL); + paper_system_set_stencil (ps, *unsmob_stencil (t)); ps->set_property ("is-title", SCM_BOOL_T); systems_ = scm_cons (ps->self_scm (), systems_); ps->unprotect (); @@ -338,10 +342,10 @@ Paper_book::systems () systems_ = scm_reverse (systems_); int i = 0; - Paper_system *last = 0; + Prob *last = 0; for (SCM s = systems_; s != SCM_EOL; s = scm_cdr (s)) { - Paper_system *ps = unsmob_paper_system (scm_car (s)); + Prob *ps = unsmob_prob (scm_car (s)); ps->set_property ("number", scm_from_int (++i)); if (last diff --git a/lily/paper-score-scheme.cc b/lily/paper-score-scheme.cc index d3ea9b3105..a2e475093a 100644 --- a/lily/paper-score-scheme.cc +++ b/lily/paper-score-scheme.cc @@ -11,7 +11,7 @@ LY_DEFINE (ly_paper_score_paper_systems, "ly:paper-score-paper-systems", 1, 0, 0, (SCM paper_score), - "Return vector of Paper_system objects from @var{paper-score}.") + "Return vector of paper_system objects from @var{paper-score}.") { Paper_score *pscore = dynamic_cast (unsmob_music_output (paper_score)); SCM_ASSERT_TYPE (pscore, paper_score, SCM_ARG1, __FUNCTION__, "Paper score (Music output)"); diff --git a/lily/paper-system-scheme.cc b/lily/paper-system-scheme.cc deleted file mode 100644 index fe891b9920..0000000000 --- a/lily/paper-system-scheme.cc +++ /dev/null @@ -1,42 +0,0 @@ -/* - paper-system-scheme.cc -- implement Paper_system bindings - - source file of the GNU LilyPond music typesetter - - (c) 2005--2006 Han-Wen Nienhuys -*/ - -#include "paper-system.hh" - -LY_DEFINE (ly_paper_system_set_property_x, "ly:paper-system-set-property!", - 2, 1, 0, (SCM system, SCM sym, SCM value), - "Set property @var{sym} of @var{system} to @var{value}") -{ - Paper_system *ps = unsmob_paper_system (system); - SCM_ASSERT_TYPE (ps, system, SCM_ARG1, __FUNCTION__, "paper-system"); - - ps->internal_set_property (sym, value); - return SCM_UNSPECIFIED; -} - -LY_DEFINE (ly_paper_system_property, "ly:paper-system-property", - 2, 1, 0, (SCM system, SCM sym, SCM dfault), - "Return the value for @var{sym}. Properties may be set by " - "setting the @code{line-break-system-details} property of " - "NonMusicalPaperColumn. If the property is not found, " - "return @var{dfault}, " - "or @code{'()} if undefined.") -{ - Paper_system *ps = unsmob_paper_system (system); - SCM_ASSERT_TYPE (ps, system, SCM_ARG1, __FUNCTION__, "paper-system"); - if (dfault == SCM_UNDEFINED) - dfault = SCM_EOL; - - SCM retval = ps->internal_get_property (sym); - if (retval == SCM_EOL) - return dfault; - else - return retval; -} - - diff --git a/lily/paper-system.cc b/lily/paper-system.cc index d5e8b914ba..5b26cd2508 100644 --- a/lily/paper-system.cc +++ b/lily/paper-system.cc @@ -1,5 +1,5 @@ /* - paper-system.cc -- implement Paper_system + paper-system.cc -- implement Prob functions for paper-system source file of the GNU LilyPond music typesetter @@ -9,10 +9,17 @@ #include "paper-system.hh" #include "item.hh" -Paper_system::Paper_system (Stencil s, SCM immutable_init) - : Prob (immutable_init) +Prob * +make_paper_system (SCM immutable_init) { - SCM yext = get_property ("Y-extent"); + Prob *prob = new Prob (ly_symbol2scm ("paper-system"), immutable_init); + return prob; +} + +void +paper_system_set_stencil (Prob *prob, Stencil s) +{ + SCM yext = prob->get_property ("Y-extent"); if (is_number_pair (yext)) { @@ -23,19 +30,5 @@ Paper_system::Paper_system (Stencil s, SCM immutable_init) s = Stencil (b, s.expr ()); } - set_property ("stencil", s.smobbed_copy ()); -} - -Paper_system * -unsmob_paper_system (SCM x) -{ - Prob *prob = unsmob_prob (x); - return dynamic_cast (prob); -} - -LY_DEFINE(ly_paper_system_p, "ly:paper-system?", - 1,0,0, (SCM obj), - "Type predicate.") -{ - return scm_from_bool (unsmob_paper_system (obj)); + prob->set_property ("stencil", s.smobbed_copy ()); } diff --git a/lily/prob-scheme.cc b/lily/prob-scheme.cc new file mode 100644 index 0000000000..3d847543e7 --- /dev/null +++ b/lily/prob-scheme.cc @@ -0,0 +1,66 @@ +/* + paper-system-scheme.cc -- implement Prob bindings + + source file of the GNU LilyPond music typesetter + + (c) 2005--2006 Han-Wen Nienhuys +*/ + +#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}") +{ + Prob *ps = unsmob_prob (system); + SCM_ASSERT_TYPE (ps, system, 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; +} + +LY_DEFINE (ly_prob_property, "ly:prob-property", + 2, 1, 0, (SCM system, SCM sym, SCM dfault), + "Return the value for @var{sym}.") +{ + Prob *ps = unsmob_prob (system); + SCM_ASSERT_TYPE (ps, system, SCM_ARG1, __FUNCTION__, "Prob"); + SCM_ASSERT_TYPE (scm_is_symbol (sym), sym, SCM_ARG2, __FUNCTION__, "symbol"); + + if (dfault == SCM_UNDEFINED) + dfault = SCM_EOL; + + SCM retval = ps->internal_get_property (sym); + if (retval == SCM_EOL) + return dfault; + else + return retval; +} + +LY_DEFINE (ly_prob_type_p, "ly:prob-type?", + 1, 0, 0, + (SCM obj, SCM type), + "If obj the specified prob-type?") +{ + Prob*prob = unsmob_prob (obj); + return scm_from_bool (prob && prob->type() == type); +} + +LY_DEFINE (ly_make_prob, "ly:make-prob", + 2, 0, 0, + (SCM type, SCM init), + "Create a Prob.") +{ + Prob *pr = new Prob (type, init); + SCM x = pr->self_scm () ; + return scm_gc_unprotect_object (x); +} + + +LY_DEFINE(ly_paper_system_p, "ly:paper-system?", + 1, 0, 0, (SCM obj), + "Type predicate.") +{ + return ly_prob_type_p (obj, ly_symbol2scm ("paper-system")); +} diff --git a/lily/prob.cc b/lily/prob.cc index 4dbd2858ab..66829f3b2e 100644 --- a/lily/prob.cc +++ b/lily/prob.cc @@ -1,5 +1,5 @@ /* - paper-system.cc -- implement Paper_system + prob.cc -- implement Prob source file of the GNU LilyPond music typesetter @@ -16,11 +16,12 @@ IMPLEMENT_SMOBS (Prob); IMPLEMENT_TYPE_P (Prob, "ly:prob?"); IMPLEMENT_DEFAULT_EQUAL_P (Prob); -Prob::Prob (SCM immutable_init) +Prob::Prob (SCM type, SCM immutable_init) { self_scm_ = SCM_EOL; mutable_property_alist_ = SCM_EOL; immutable_property_alist_ = immutable_init; + type_ = type; smobify_self (); } @@ -69,8 +70,8 @@ Prob::print_smob (SCM smob, SCM port, scm_print_state*) Prob *p = (Prob *) SCM_CELL_WORD_1 (smob); scm_puts ("#<", port); scm_puts ("Prob: ", port); - - + scm_display (p->type_, port); + scm_puts (" C++: ", port); scm_puts (p->class_name (), port); scm_display (p->mutable_property_alist_, port); scm_display (p->immutable_property_alist_, port); diff --git a/lily/system.cc b/lily/system.cc index cdff8cb829..a1636c8a1a 100644 --- a/lily/system.cc +++ b/lily/system.cc @@ -377,8 +377,8 @@ System::get_paper_system () Grob *left_bound = this->get_bound (LEFT); SCM prop_init = left_bound->get_property ("line-break-system-details"); - Paper_system *pl = new Paper_system (sys_stencil, - prop_init); + Prob *pl = make_paper_system (prop_init); + paper_system_set_stencil (pl, sys_stencil); pl->set_property ("penalty", left_bound->get_property ("page-penalty")); diff --git a/scm/framework-ps.scm b/scm/framework-ps.scm index d3a0891ff2..9bd77fa270 100644 --- a/scm/framework-ps.scm +++ b/scm/framework-ps.scm @@ -504,7 +504,7 @@ (if (and (not (ly:get-option 'preview-include-book-title)) (pair? systems) - (ly:paper-system-property (car systems) 'is-book-title #f)) + (ly:prob-property (car systems) 'is-book-title #f)) (set! systems (cdr systems))) diff --git a/scm/layout-page-layout.scm b/scm/layout-page-layout.scm index fd362128db..5d307da64f 100644 --- a/scm/layout-page-layout.scm +++ b/scm/layout-page-layout.scm @@ -28,7 +28,7 @@ "\n"))) (define-method (node-system-numbers (node )) - (map (lambda (ps) (ly:paper-system-property ps 'number)) + (map (lambda (ps) (ly:prob-property ps 'number)) (node-lines node))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -40,7 +40,7 @@ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (define-public (paper-system-staff-extents ps) - (ly:paper-system-property ps 'refpoint-Y-extent '(0 . 0))) + (ly:prob-property ps 'refpoint-Y-extent '(0 . 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -91,10 +91,10 @@ (define (paper-system-annotate-last system layout) (let* - ((bottomspace (ly:paper-system-property system 'bottom-space)) + ((bottomspace (ly:prob-property system 'bottom-space)) (y-extent (paper-system-extent system Y)) (x-extent (paper-system-extent system X)) - (stencil (ly:paper-system-property system 'stencil)) + (stencil (ly:prob-property system 'stencil)) (arrow (if (number? bottomspace) (annotate-y-interval layout @@ -108,7 +108,7 @@ (set! stencil (ly:stencil-add stencil arrow))) - (set! (ly:paper-system-property system 'stencil) + (set! (ly:prob-property system 'stencil) stencil) )) @@ -128,11 +128,11 @@ name extent is-length?))))) (bbox-extent (paper-system-extent system Y)) - (refp-extent (ly:paper-system-property system 'refpoint-Y-extent)) - (next-space (ly:paper-system-property system 'next-space + (refp-extent (ly:prob-property system 'refpoint-Y-extent)) + (next-space (ly:prob-property system 'next-space (ly:output-def-lookup layout 'betweensystemspace) )) - (next-padding (ly:paper-system-property system 'next-padding + (next-padding (ly:prob-property system 'next-padding (ly:output-def-lookup layout 'betweensystempadding) )) @@ -158,9 +158,9 @@ - (set! (ly:paper-system-property system 'stencil) + (set! (ly:prob-property system 'stencil) (ly:stencil-add - (ly:paper-system-property system 'stencil) + (ly:prob-property system 'stencil) (ly:make-stencil (ly:stencil-expr annotations) (ly:stencil-extent empty-stencil X) @@ -512,8 +512,8 @@ is what have collected so far, and has ascending page numbers." (interval-end (vector-ref real-extents 0)) )) (last-system (vector-ref system-vector (1- system-count))) - (bottom-space (if (ly:paper-system? last-system) - (ly:paper-system-property last-system 'bottom-space 0.0) + (bottom-space (if (ly:prob? last-system) + (ly:prob-property last-system 'bottom-space 0.0) 0.0)) (space-left (- page-height bottom-space @@ -530,9 +530,9 @@ is what have collected so far, and has ascending page numbers." (lambda (idx) (let* ( (upper-system (vector-ref system-vector idx)) - (between-space (ly:paper-system-property upper-system 'next-space + (between-space (ly:prob-property upper-system 'next-space global-inter-system-space)) - (fixed-dist (ly:paper-system-property upper-system 'next-padding + (fixed-dist (ly:prob-property upper-system 'next-padding global-fixed-dist)) (this-system-ext (vector-ref staff-extents idx)) @@ -564,7 +564,7 @@ is what have collected so far, and has ascending page numbers." (lambda (idx) (let* ( (upper-system (vector-ref system-vector idx)) - (fixed-dist (ly:paper-system-property upper-system 'next-padding + (fixed-dist (ly:prob-property upper-system 'next-padding global-fixed-dist)) (this-system-ext (vector-ref real-extents idx)) (next-system-ext (vector-ref real-extents (1+ idx))) @@ -634,7 +634,7 @@ CURRENT-BEST is the best result sofar, or #f." 10000)) (positions (cdr vertical-spacing)) (get-break-penalty (lambda (sys) - (ly:paper-system-property sys 'penalty 0.0))) + (ly:prob-property sys 'penalty 0.0))) (user-nobreak-penalties (- (apply + (filter negative? @@ -709,7 +709,7 @@ DONE." (cdr todo))))) (define (line-number node) - (ly:paper-system-property (car (node-lines node)) 'number)) + (ly:prob-property (car (node-lines node)) 'number)) (ly:message (_ "Calculating page breaks...")) (set! force-equalization-factor diff --git a/scm/lily-library.scm b/scm/lily-library.scm index 057d6f8807..8a5b28d227 100644 --- a/scm/lily-library.scm +++ b/scm/lily-library.scm @@ -118,11 +118,11 @@ (define-public (paper-system-title? system) - (equal? #t (ly:paper-system-property system 'is-title) + (equal? #t (ly:prob-property system 'is-title) )) (define-public (paper-system-stencil system) - (ly:paper-system-property system 'stencil)) + (ly:prob-property system 'stencil)) (define-public (paper-system-extent system axis) (ly:stencil-extent (paper-system-stencil system) axis)) diff --git a/scm/music-functions.scm b/scm/music-functions.scm index 3650dd0e8b..d3b5b2fda5 100644 --- a/scm/music-functions.scm +++ b/scm/music-functions.scm @@ -22,9 +22,9 @@ (make-procedure-with-setter ly:grob-property ly:grob-set-property!)) -(define-public ly:paper-system-property - (make-procedure-with-setter ly:paper-system-property - ly:paper-system-set-property!)) +(define-public ly:prob-property + (make-procedure-with-setter ly:prob-property + ly:prob-set-property!)) (define-public (music-map function music) "Apply @var{function} to @var{music} and all of the music it contains. -- 2.39.5