]> git.donarmstrong.com Git - lilypond.git/blob - lily/prob-scheme.cc
Merge branch 'master' of git+ssh://jneem@git.sv.gnu.org/srv/git/lilypond
[lilypond.git] / lily / prob-scheme.cc
1 /*
2   paper-system-scheme.cc -- implement Prob bindings
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #include "prob.hh"
10 #include "skyline.hh"
11
12 LY_DEFINE (ly_prob_set_property_x, "ly:prob-set-property!",
13            2, 1, 0, (SCM obj, SCM sym, SCM value),
14            "Set property @var{sym} of @var{obj} to @var{value}")
15 {
16   LY_ASSERT_SMOB (Prob, obj, 1);
17   Prob *ps = unsmob_prob (obj);
18   LY_ASSERT_TYPE (ly_is_symbol, sym, 2);
19
20   ps->set_property (sym, value);
21   return SCM_UNSPECIFIED;
22 }
23
24 /*
25   Hmm, this is not orthogonal.
26 */
27 LY_DEFINE (ly_prob_property_p, "ly:prob-property?",
28            2, 1, 0, (SCM obj, SCM sym),
29            "Is boolean prop @var{sym} set?")
30 {
31   return scm_equal_p (SCM_BOOL_T, ly_prob_property (obj, sym, SCM_BOOL_F));
32 }
33
34 LY_DEFINE (ly_prob_property, "ly:prob-property",
35            2, 1, 0, (SCM obj, SCM sym, SCM dfault),
36            "Return the value for @var{sym}.")
37 {
38   LY_ASSERT_SMOB (Prob, obj, 1);
39   Prob *ps = unsmob_prob (obj);
40   LY_ASSERT_TYPE (ly_is_symbol,sym, 2);
41
42   if (dfault == SCM_UNDEFINED)
43     dfault = SCM_EOL;
44
45   SCM retval = ps->internal_get_property (sym);
46   if (retval == SCM_EOL)
47     return dfault;
48   else
49     return retval;
50 }
51
52 LY_DEFINE (ly_prob_type_p, "ly:prob-type?",
53            2, 0, 0,
54            (SCM obj, SCM type),
55            "If obj the specified prob-type?")
56 {
57   Prob*prob = unsmob_prob (obj);
58   return scm_from_bool (prob && prob->type() == type);
59 }
60
61 LY_DEFINE (ly_make_prob, "ly:make-prob",
62            2, 0, 1,
63            (SCM type, SCM init, SCM rest),
64            "Create a Prob.")
65 {
66   Prob *pr = new Prob (type, init);
67
68   for (SCM s = rest;
69        scm_is_pair (s) && scm_is_pair (scm_cdr (s)); s = scm_cddr (s))
70     {
71       SCM sym = scm_car (s);
72       SCM val = scm_cadr (s);
73
74       pr->set_property (sym, val);
75     }
76   
77   return pr->unprotect ();
78 }
79
80   
81 LY_DEFINE(ly_paper_system_p, "ly:paper-system?",
82           1, 0, 0, (SCM obj),
83           "Type predicate.")
84 {
85   return ly_prob_type_p (obj, ly_symbol2scm ("paper-system"));
86 }
87
88 LY_DEFINE (ly_paper_system_minimum_distance, "ly:paper-system-minimum-distance",
89            2, 0, 0, (SCM sys1, SCM sys2),
90            "Measure the minimum distance between these two paper-systems "
91            "using their stored skylines if possible and falling back to "
92            "their extents otherwise.")
93 {
94   Real ret = 0;
95   Prob *p1 = unsmob_prob (sys1);
96   Prob *p2 = unsmob_prob (sys2);
97   Skyline_pair *sky1 = Skyline_pair::unsmob (p1->get_property ("skylines"));
98   Skyline_pair *sky2 = Skyline_pair::unsmob (p2->get_property ("skylines"));
99
100   if (sky1 && sky2)
101     ret = (*sky1)[DOWN].distance ((*sky2)[UP]);
102   else
103     {
104       Stencil *s1 = unsmob_stencil (p1->get_property ("stencil"));
105       Stencil *s2 = unsmob_stencil (p2->get_property ("stencil"));
106       Interval iv1 = s1->extent (Y_AXIS);
107       Interval iv2 = s2->extent (Y_AXIS);
108       ret = iv2[UP] - iv1[DOWN];
109     }
110   return scm_from_double (ret);
111 }