]> git.donarmstrong.com Git - lilypond.git/commitdiff
(ly:interpret-stencil): Was:
authorJan Nieuwenhuizen <janneke@gnu.org>
Sun, 13 Jun 2004 22:39:32 +0000 (22:39 +0000)
committerJan Nieuwenhuizen <janneke@gnu.org>
Sun, 13 Jun 2004 22:39:32 +0000 (22:39 +0000)
interpret_stencil_expression.

ChangeLog
lily/include/stencil.hh
lily/paper-outputter.cc
lily/stencil.cc

index 48da22da575d547d1944cfa225484e354ab143c6..09faea3e6ba457679a8040faa7b63d4419362d17 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-06-14  Jan Nieuwenhuizen  <janneke@gnu.org>
+
+       * lily/stencil.cc (ly:interpret-stencil): Was:
+       interpret_stencil_expression.
+
 2004-06-13  Jan Nieuwenhuizen  <janneke@gnu.org>
 
        * buildscripts/guile-gnome.sh: New file.
index a01c891a813cfc594828f291344a2de929864736..1b64d7f3f84d14b92e0b9b7adb2c9189b40aa3ec 100644 (file)
@@ -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 */
index 6824f893ca29ed1c4dae4ab149107aa843907cd2..c384996375858f717afe55cebcb0bb1965998c67 100644 (file)
@@ -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 ("#<Paper_outputter>", 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");
   
index 18b73bfb1ed78d54c743fb18408fe703fff07090..003594bbbf3aa7d48fee3454f5d4ed432f0cd852 100644 (file)
@@ -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 ());
 }