2006-01-24 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ * 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.
class Paper_column;
class Paper_outputter;
class Paper_score;
-class Paper_system;
class Performance;
class Performer;
class Performer_group;
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 */
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 */
#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.")
}
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!",
{
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);
}
}
Music::Music (SCM init)
- : Prob (init)
+ : Prob (ly_symbol2scm ("Music"), init)
{
length_callback_ = SCM_EOL;
start_callback_ = SCM_EOL;
set_property ("pitch-alist", ly_transpose_key_alist (pa, delta.smobbed_copy ()));
}
-
-
void
Music::set_spot (Input ip)
{
}
void
-set_system_penalty (Paper_system *ps, SCM header)
+set_system_penalty (Prob *ps, SCM header)
{
if (ly_is_module (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);
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_);
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 ();
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
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<Paper_score *> (unsmob_music_output (paper_score));
SCM_ASSERT_TYPE (pscore, paper_score, SCM_ARG1, __FUNCTION__, "Paper score (Music output)");
+++ /dev/null
-/*
- paper-system-scheme.cc -- implement Paper_system bindings
-
- source file of the GNU LilyPond music typesetter
-
- (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
-*/
-
-#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;
-}
-
-
/*
- paper-system.cc -- implement Paper_system
+ paper-system.cc -- implement Prob functions for paper-system
source file of the GNU LilyPond music typesetter
#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))
{
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<Paper_system*> (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 ());
}
--- /dev/null
+/*
+ paper-system-scheme.cc -- implement Prob bindings
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+*/
+
+#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"));
+}
/*
- paper-system.cc -- implement Paper_system
+ prob.cc -- implement Prob
source file of the GNU LilyPond music typesetter
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 ();
}
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);
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"));
(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)))
"\n")))
(define-method (node-system-numbers (node <optimally-broken-page-node>))
- (map (lambda (ps) (ly:paper-system-property ps 'number))
+ (map (lambda (ps) (ly:prob-property ps 'number))
(node-lines node)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(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
(set! stencil
(ly:stencil-add stencil arrow)))
- (set! (ly:paper-system-property system 'stencil)
+ (set! (ly:prob-property system 'stencil)
stencil)
))
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)
))
- (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)
(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
(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))
(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)))
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?
(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
(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))
(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.