X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstencil.cc;h=688efe2855bea5771efca0e166a9d42676da4a5a;hb=4300e287a18cbc4569c79f8e8445609dc7d4546a;hp=b1ac31b705c45b05c2863ac7aa715c481aa04f4b;hpb=c659cb200486c2f908703696a1b2873e78c8160a;p=lilypond.git diff --git a/lily/stencil.cc b/lily/stencil.cc index b1ac31b705..688efe2855 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -3,18 +3,19 @@ source file of the GNU LilyPond music typesetter - (c) 1997--2004 Han-Wen Nienhuys + (c) 1997--2005 Han-Wen Nienhuys */ #include "stencil.hh" -#include +#include #include // isinf #include "input-smob.hh" -#include "font-metric.hh" +#include "font-metric.hh" #include "dimensions.hh" +#include "string-convert.hh" #include "warn.hh" #include "ly-smobs.icc" @@ -87,10 +88,11 @@ Stencil::translate (Offset o) Axis a = X_AXIS; while (a < NO_AXES) { - if (abs (o[a]) > 100 CM - || isinf (o[a]) || isnan (o[a])) + if (isinf (o[a]) || isnan (o[a])) { - programming_error ("Improbable offset for translation: setting to zero"); + programming_error (String_convert::form_string ("Improbable offset for stencil: %f staff space", o[a]) + + "\n" + + "Setting to zero."); o[a] = 0.0; } incr (a); @@ -103,11 +105,11 @@ Stencil::translate (Offset o) dim_.translate (o); origin_ += o; } - + void Stencil::translate_axis (Real x, Axis a) { - Offset o (0,0); + Offset o (0, 0); o[a] = x; translate (o); } @@ -131,8 +133,8 @@ Stencil::set_empty (bool e) } else { - dim_[X_AXIS] = Interval (0,0); - dim_[Y_AXIS] = Interval (0,0); + dim_[X_AXIS] = Interval (0, 0); + dim_[Y_AXIS] = Interval (0, 0); } } @@ -161,6 +163,7 @@ Stencil::moved_to_edge (Axis a, Direction d, Stencil const &s, { programming_error ("Stencil::moved_to_edge: adding empty stencil."); his_extent = 0.0; + // SCM_ASSERT_TYPE (0, s.expr (), SCM_ARG1, __FUNCTION__, "non-empty stencil"); } else his_extent = i[-d]; @@ -169,7 +172,7 @@ Stencil::moved_to_edge (Axis a, Direction d, Stencil const &s, + d * padding; Stencil toadd (s); - toadd.translate_axis (offset,a); + toadd.translate_axis (offset, a); if (minimum > 0 && d * (-origin ()[a] + toadd.origin ()[a]) < minimum) toadd.translate_axis ( -toadd.origin ()[a] @@ -202,7 +205,7 @@ interpret_stencil_expression (SCM expr, return; SCM head = scm_car (expr); - + if (head == ly_symbol2scm ("translate-stencil")) { o += ly_scm2offset (scm_cadr (expr)); @@ -217,16 +220,29 @@ interpret_stencil_expression (SCM expr, else if (head == ly_symbol2scm ("grob-cause")) { SCM grob = scm_cadr (expr); - - (*func) (func_arg, scm_list_2 (head, grob)); + + (*func) (func_arg, scm_list_3 (head, + ly_quote_scm (ly_offset2scm (o)), grob)); interpret_stencil_expression (scm_caddr (expr), func, func_arg, o); (*func) (func_arg, scm_list_1 (ly_symbol2scm ("no-origin"))); - - return ; + return; } + else if (head == ly_symbol2scm ("color")) + { + SCM color = scm_cadr (expr); + SCM r = scm_car (color); + SCM g = scm_cadr (color); + SCM b = scm_caddr (color); + + (*func) (func_arg, scm_list_4 (ly_symbol2scm ("setcolor"), r, g, b)); + interpret_stencil_expression (scm_caddr (expr), func, func_arg, o); + (*func) (func_arg, scm_list_1 (ly_symbol2scm ("resetcolor"))); + + return; + } else { - (*func) (func_arg, + (*func) (func_arg, scm_list_4 (ly_symbol2scm ("placebox"), scm_make_real (o[X_AXIS]), scm_make_real (o[Y_AXIS]), @@ -249,7 +265,7 @@ find_font_function (void *fs, SCM x) if (scm_car (x) == ly_symbol2scm ("placebox")) { - SCM args = scm_cdr (x); + SCM args = scm_cdr (x); SCM what = scm_caddr (args); if (scm_is_pair (what)) @@ -267,53 +283,13 @@ SCM find_expression_fonts (SCM expr) { Font_list fl; - - fl.fonts_ = SCM_EOL; - - interpret_stencil_expression (expr, &find_font_function, - (void*) &fl, Offset (0,0)); - return fl.fonts_; -} - - -LY_DEFINE (ly_stencil_fonts, "ly:stencil-fonts", - 1, 0, 0, (SCM s), - " Analyse @var{s}, and return a list of fonts used in @var{s}.") -{ - Stencil *stil = unsmob_stencil (s); - SCM_ASSERT_TYPE (stil, s, SCM_ARG1, __FUNCTION__, "Stencil"); - return find_expression_fonts (stil->expr ()); -} + fl.fonts_ = SCM_EOL; -struct Stencil_interpret_arguments -{ - SCM func; - SCM arg1; -}; + interpret_stencil_expression (expr, &find_font_function, + (void*) &fl, Offset (0, 0)); -void stencil_interpret_in_scm (void *p, SCM expr) -{ - Stencil_interpret_arguments *ap = (Stencil_interpret_arguments*) p; - scm_call_2 (ap->func, ap->arg1, expr); + return fl.fonts_; } - -LY_DEFINE (ly_interpret_stencil_expression, "ly:interpret-stencil-expression", - 4, 0, 0, (SCM expr, SCM func, SCM arg1, SCM offset), - "Parse EXPR, feed bits to FUNC with first arg ARG1") -{ - SCM_ASSERT_TYPE (ly_c_procedure_p(func), func, SCM_ARG1, __FUNCTION__, - "procedure"); - - Stencil_interpret_arguments a; - a.func = func; - a.arg1 = arg1; - Offset o = ly_scm2offset (offset); - - interpret_stencil_expression (expr, stencil_interpret_in_scm, (void*) &a, o); - - return SCM_UNSPECIFIED; -} -