X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fstencil.cc;h=c684dcb31c7d7fc4feeb5cd12532f88592b290c3;hb=a33165e3b6af2d807d069e6eacd0e220ba2ef68a;hp=18b73bfb1ed78d54c743fb18408fe703fff07090;hpb=c2d7bd9507fb36d3f7da86653e3fb0b905ec2bc1;p=lilypond.git diff --git a/lily/stencil.cc b/lily/stencil.cc index 18b73bfb1e..c684dcb31c 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -6,15 +6,16 @@ (c) 1997--2004 Han-Wen Nienhuys */ +#include "stencil.hh" + #include + #include // isinf #include "input-smob.hh" -#include "font-metric.hh" +#include "font-metric.hh" #include "dimensions.hh" -#include "interval.hh" -#include "string.hh" -#include "stencil.hh" +#include "string-convert.hh" #include "warn.hh" #include "ly-smobs.icc" @@ -42,7 +43,7 @@ Stencil::print_smob (SCM, SCM port, scm_print_state *) SCM Stencil::mark_smob (SCM smob) { - Stencil *s = (Stencil*) ly_cdr (smob); + Stencil *s = (Stencil*) SCM_CELL_WORD_1 (smob); return s->expr_; } @@ -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,7 +105,7 @@ Stencil::translate (Offset o) dim_.translate (o); origin_ += o; } - + void Stencil::translate_axis (Real x, Axis a) { @@ -140,7 +142,7 @@ void Stencil::align_to (Axis a, Real x) { if (is_empty ()) - return ; + return; Interval i (extent (a)); translate_axis (-i.linear_combination (x), a); @@ -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, SCM_EOL, SCM_ARG1, __FUNCTION__, ""); } else his_extent = i[-d]; @@ -189,57 +192,49 @@ Stencil::add_at_edge (Axis a, Direction d, Stencil const &s, Real padding, /****************************************************************/ + void interpret_stencil_expression (SCM expr, - void (*func) (void*, SCM), - void *func_arg, - Offset o) + void (*func) (void*, SCM), + void *func_arg, + Offset o) { while (1) { - if (!ly_c_pair_p (expr)) - return; - - SCM head =ly_car (expr); - if (unsmob_input (head)) - { - Input *ip = unsmob_input (head); - (*func)(func_arg, - scm_list_4 (ly_symbol2scm ("define-origin"), - scm_makfrom0str (ip->file_string () - .to_str0 ()), - scm_int2num (ip->line_number ()), - scm_int2num (ip->column_number ()))); - - expr = ly_cadr (expr); - } - else if (head == ly_symbol2scm ("no-origin")) - { - (*func) (func_arg, scm_list_1 (head)); - expr = ly_cadr (expr); - } - else if (head == ly_symbol2scm ("translate-stencil")) - { - o += ly_scm2offset (ly_cadr (expr)); - expr = ly_caddr (expr); - } + if (!scm_is_pair (expr)) + return; + + SCM head = scm_car (expr); + + if (head == ly_symbol2scm ("translate-stencil")) + { + o += ly_scm2offset (scm_cadr (expr)); + expr = scm_caddr (expr); + } else if (head == ly_symbol2scm ("combine-stencil")) + { + for (SCM x = scm_cdr (expr); scm_is_pair (x); x = scm_cdr (x)) + interpret_stencil_expression (scm_car (x), func, func_arg, o); + return; + } + else if (head == ly_symbol2scm ("grob-cause")) { - for (SCM x = ly_cdr (expr); ly_c_pair_p (x); x = ly_cdr (x)) - { - interpret_stencil_expression (ly_car (x), func, func_arg, o); - } - return ; - } - else - { - (*func) (func_arg, - scm_list_4 (ly_symbol2scm ("placebox"), - scm_make_real (o[X_AXIS]), - scm_make_real (o[Y_AXIS]), - expr)); + SCM grob = scm_cadr (expr); + + (*func) (func_arg, scm_list_2 (head, grob)); + interpret_stencil_expression (scm_caddr (expr), func, func_arg, o); + (*func) (func_arg, scm_list_1 (ly_symbol2scm ("no-origin"))); return; } + else + { + (*func) (func_arg, + scm_list_4 (ly_symbol2scm ("placebox"), + scm_make_real (o[X_AXIS]), + scm_make_real (o[Y_AXIS]), + expr)); + return; + } } } @@ -250,23 +245,23 @@ struct Font_list }; static void -find_font_function (void * fs, SCM x) +find_font_function (void *fs, SCM x) { - Font_list * me = (Font_list*)fs; - - if (ly_car (x) == ly_symbol2scm ("placebox")) - { - SCM args = ly_cdr (x); - SCM what = ly_caddr (args); + Font_list *me = (Font_list*) fs; - if (ly_c_pair_p (what)) - { - SCM head = ly_car (what); - if (ly_symbol2scm ("text") == head) - me->fonts_ = scm_cons (ly_cadr (what), me->fonts_); - else if (head == ly_symbol2scm ("char")) - me->fonts_ = scm_cons (ly_cadr (what), me->fonts_); - } + if (scm_car (x) == ly_symbol2scm ("placebox")) + { + SCM args = scm_cdr (x); + SCM what = scm_caddr (args); + + if (scm_is_pair (what)) + { + SCM head = scm_car (what); + if (ly_symbol2scm ("text") == head) + me->fonts_ = scm_cons (scm_cadr (what), me->fonts_); + else if (head == ly_symbol2scm ("char")) + me->fonts_ = scm_cons (scm_cadr (what), me->fonts_); + } } } @@ -274,20 +269,53 @@ 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)); + + 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}.") + +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); + Stencil *stil = unsmob_stencil (s); SCM_ASSERT_TYPE (stil, s, SCM_ARG1, __FUNCTION__, "Stencil"); return find_expression_fonts (stil->expr ()); } + +struct Stencil_interpret_arguments +{ + SCM func; + SCM arg1; +}; + +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); +} + + + +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; +} +