X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-system-scheme.cc;h=69351106110980c61ca58bd7df7722bfd0b5313a;hb=5c9c9c0ae6cd4bed8f7a2c62b2c014f3659a188a;hp=9d887213c027339c053c248df938554fb22d71a7;hpb=4700a805e1627eb33cc38d7d3fa20e9d96ffe70f;p=lilypond.git diff --git a/lily/paper-system-scheme.cc b/lily/paper-system-scheme.cc index 9d887213c0..6935110611 100644 --- a/lily/paper-system-scheme.cc +++ b/lily/paper-system-scheme.cc @@ -1,53 +1,44 @@ -/* - paper-system-scheme.cc -- implement Paper_system bindings - +/* + paper-system-scheme.cc -- implement Paper_system bindings. + source file of the GNU LilyPond music typesetter - - (c) 2005 Han-Wen Nienhuys + + (c) 2008 Han-Wen Nienhuys + */ -#include "paper-system.hh" - -LY_DEFINE (ly_paper_system_height, "ly:paper-system-extent", - 2, 0, 0, (SCM system, SCM axis), - "Return the extent of @var{system}.") -{ - Paper_system *ps = unsmob_paper_system (system); - SCM_ASSERT_TYPE (ps, system, SCM_ARG1, __FUNCTION__, "paper-system"); - SCM_ASSERT_TYPE (is_axis (axis), axis, SCM_ARG2, __FUNCTION__, "axis"); - Axis ax = (Axis)scm_to_int (axis); - return ly_interval2scm (ps->to_stencil ().extent (ax)); -} +#include "prob.hh" -LY_DEFINE (ly_paper_system_stencil, "ly:paper-system-stencil", - 1, 0, 0, (SCM system), - "Return the height of @var{system}.") +#include "skyline-pair.hh" + +LY_DEFINE (ly_paper_system_p, "ly:paper-system?", + 1, 0, 0, (SCM obj), + "Type predicate.") { - Paper_system *ps = unsmob_paper_system (system); - SCM_ASSERT_TYPE (ps, system, SCM_ARG1, __FUNCTION__, "paper-system"); - return ps->to_stencil ().smobbed_copy (); + return ly_prob_type_p (obj, ly_symbol2scm ("paper-system")); } - - -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.") +LY_DEFINE (ly_paper_system_minimum_distance, "ly:paper-system-minimum-distance", + 2, 0, 0, (SCM sys1, SCM sys2), + "Measure the minimum distance between these two paper-systems," + " using their stored skylines if possible and falling back to" + " their extents otherwise.") { - 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; + Real ret = 0; + Prob *p1 = unsmob_prob (sys1); + Prob *p2 = unsmob_prob (sys2); + Skyline_pair *sky1 = Skyline_pair::unsmob (p1->get_property ("vertical-skylines")); + Skyline_pair *sky2 = Skyline_pair::unsmob (p2->get_property ("vertical-skylines")); + + if (sky1 && sky2) + ret = (*sky1)[DOWN].distance ((*sky2)[UP]); else - return retval; + { + Stencil *s1 = unsmob_stencil (p1->get_property ("stencil")); + Stencil *s2 = unsmob_stencil (p2->get_property ("stencil")); + Interval iv1 = s1->extent (Y_AXIS); + Interval iv2 = s2->extent (Y_AXIS); + ret = iv2[UP] - iv1[DOWN]; + } + return scm_from_double (ret); } - -