From: Jan Nieuwenhuizen Date: Sun, 13 Jun 2004 22:39:32 +0000 (+0000) Subject: (ly:interpret-stencil): Was: X-Git-Tag: release/2.2.3~1^2~48 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c500be4987b1db72f7c820608de56265b648ba26;p=lilypond.git (ly:interpret-stencil): Was: interpret_stencil_expression. --- diff --git a/ChangeLog b/ChangeLog index 48da22da57..09faea3e6b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-06-14 Jan Nieuwenhuizen + + * lily/stencil.cc (ly:interpret-stencil): Was: + interpret_stencil_expression. + 2004-06-13 Jan Nieuwenhuizen * buildscripts/guile-gnome.sh: New file. diff --git a/lily/include/stencil.hh b/lily/include/stencil.hh index a01c891a81..1b64d7f3f8 100644 --- a/lily/include/stencil.hh +++ b/lily/include/stencil.hh @@ -91,12 +91,8 @@ public: DECLARE_UNSMOB(Stencil,stencil); SCM fontify_atom (Font_metric const*, SCM atom); -void interpret_stencil_expression (SCM expr, - void (*func) (void*, SCM), - void *func_arg, - Offset o); - +SCM ly_interpret_stencil (SCM expr, SCM func, SCM arg1, SCM offset); Stencil create_stencil (SCM print); SCM find_expression_fonts (SCM expr); -#endif +#endif /* STENCIL_HH */ diff --git a/lily/paper-outputter.cc b/lily/paper-outputter.cc index 6824f893ca..c384996375 100644 --- a/lily/paper-outputter.cc +++ b/lily/paper-outputter.cc @@ -64,6 +64,7 @@ Paper_outputter::mark_smob (SCM x) int Paper_outputter::print_smob (SCM x, SCM p, scm_print_state*) { + (void) x; scm_puts ("#", p); return 1; } @@ -86,18 +87,23 @@ Paper_outputter::output_scheme (SCM scm) dump_string (scheme_to_string (scm)); } -void -paper_outputter_dump (void *po, SCM x) +LY_DEFINE (ly_paper_outputter_dump, "ly:paper-outputter-dump", + 2, 0, 0, (SCM outputter, SCM arg), + "Dump ARG on OUTPUTTER\n.") { - Paper_outputter *me = (Paper_outputter*) po; - me->output_scheme (x); + Paper_outputter *po = unsmob_outputter (outputter); + SCM_ASSERT_TYPE (po, outputter, SCM_ARG1, __FUNCTION__, "Paper_outputter"); + po->output_scheme (arg); + return SCM_UNSPECIFIED; } void Paper_outputter::output_stencil (Stencil stil) { - interpret_stencil_expression (stil.expr (), paper_outputter_dump, - (void*) this, Offset (0,0)); + ly_interpret_stencil (stil.expr (), + ly_scheme_function ("ly:paper-outputter-dump"), + smobify_self (), + ly_offset2scm (Offset (0, 0))); } Paper_outputter * @@ -114,14 +120,11 @@ LY_DEFINE (ly_outputter_dump_stencil, "ly:outputter-dump-stencil", 2, 0, 0, (SCM outputter, SCM stencil), "Dump stencil @var{expr} onto @var{outputter}.") { - Paper_outputter *po = unsmob_outputter (outputter); + Paper_outputter *po = unsmob_outputter (outputter); Stencil *st = unsmob_stencil (stencil); - SCM_ASSERT_TYPE (po, outputter, SCM_ARG1, __FUNCTION__, "Paper_outputter"); SCM_ASSERT_TYPE (st, stencil, SCM_ARG1, __FUNCTION__, "Paper_outputter"); - po->output_stencil (*st); - return SCM_UNSPECIFIED; } @@ -129,7 +132,7 @@ LY_DEFINE (ly_outputter_dump_string, "ly:outputter-dump-string", 2, 0, 0, (SCM outputter, SCM str), "Dump @var{str} onto @var{outputter}.") { - Paper_outputter *po = unsmob_outputter (outputter); + Paper_outputter *po = unsmob_outputter (outputter); SCM_ASSERT_TYPE (po, outputter, SCM_ARG1, __FUNCTION__, "Paper_outputter"); SCM_ASSERT_TYPE (ly_c_string_p (str), str, SCM_ARG1, __FUNCTION__, "Paper_outputter"); diff --git a/lily/stencil.cc b/lily/stencil.cc index 18b73bfb1e..003594bbbf 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -189,33 +189,31 @@ 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) +LY_DEFINE (ly_interpret_stencil, "ly:interpret-stencil", + 4, 0, 0, (SCM expr, SCM func, SCM arg1, SCM offset), + "Parse EXPR, feed bits to FUNC with first arg ARG1") { + Offset o = ly_scm2offset (offset); while (1) { if (!ly_c_pair_p (expr)) - return; + return SCM_UNDEFINED; - SCM head =ly_car (expr); + 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 ()))); - + scm_call_2 (func, arg1, + 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)); + scm_call_2 (func, arg1, scm_list_1 (head)); expr = ly_cadr (expr); } else if (head == ly_symbol2scm ("translate-stencil")) @@ -226,34 +224,25 @@ interpret_stencil_expression (SCM expr, else if (head == ly_symbol2scm ("combine-stencil")) { 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 ; + ly_interpret_stencil (ly_car (x), func, arg1, ly_offset2scm (o)); + return SCM_UNDEFINED; } else { - (*func) (func_arg, - scm_list_4 (ly_symbol2scm ("placebox"), - scm_make_real (o[X_AXIS]), - scm_make_real (o[Y_AXIS]), - expr)); - return; + scm_call_2 (func, arg1, + scm_list_4 (ly_symbol2scm ("placebox"), + scm_make_real (o[X_AXIS]), + scm_make_real (o[Y_AXIS]), + expr)); + return SCM_UNDEFINED; } } } - -struct Font_list -{ - SCM fonts_; -}; - -static void -find_font_function (void * fs, SCM x) +LY_DEFINE (ly_find_font_function, "ly:find-font-function", + 2, 0, 0, (SCM fs, SCM x), + "Make font list.") { - Font_list * me = (Font_list*)fs; - if (ly_car (x) == ly_symbol2scm ("placebox")) { SCM args = ly_cdr (x); @@ -263,31 +252,28 @@ find_font_function (void * fs, SCM x) { SCM head = ly_car (what); if (ly_symbol2scm ("text") == head) - me->fonts_ = scm_cons (ly_cadr (what), me->fonts_); + fs = scm_cons (ly_cadr (what), fs); else if (head == ly_symbol2scm ("char")) - me->fonts_ = scm_cons (ly_cadr (what), me->fonts_); + fs = scm_cons (ly_cadr (what), fs); } } + return SCM_UNDEFINED; } 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_; + SCM fonts = SCM_EOL; + ly_interpret_stencil (expr, ly_scheme_function ("ly:find-font-function"), + fonts, ly_offset2scm (Offset (0, 0))); + return 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 ()); }