X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fpaper-system-scheme.cc;h=137cef0c5c2f22f6d0c22febf16324babaf34206;hb=128e91673163c6beeea6b9328e507d87be7175c9;hp=f61c5a05340d00a7bdaf7aa0702ccdfa376f6f87;hpb=f4aad1d9884bd73c04cc89ecc3f943d8295ebab6;p=lilypond.git diff --git a/lily/paper-system-scheme.cc b/lily/paper-system-scheme.cc index f61c5a0534..137cef0c5c 100644 --- a/lily/paper-system-scheme.cc +++ b/lily/paper-system-scheme.cc @@ -1,33 +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--2009 Han-Wen Nienhuys + */ -#include "paper-system.hh" - - +#include "prob.hh" -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.") +#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"); - if (dfault == SCM_UNDEFINED) - dfault = SCM_EOL; + return ly_prob_type_p (obj, ly_symbol2scm ("paper-system")); +} - SCM retval = ps->internal_get_property (sym); - if (retval == SCM_EOL) - return dfault; +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.") +{ + 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); } - -