]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/clef-engraver.cc
* lily/include/translator.icc (ADD_ACKNOWLEDGER): new macro.
[lilypond.git] / lily / clef-engraver.cc
index c22408b300f96ebaf8fa1aa20f3dacf1eb9772b4..99b92bd5e441d6203d4cd07476d5288452fb5845 100644 (file)
@@ -3,12 +3,12 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
+  (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>,
 
   Mats Bengtsson <matsb@s3.kth.se>
 */
 
-#include <ctype.h>
+#include <cctype>
 
 #include "context.hh"
 #include "bar-line.hh"
 #include "engraver.hh"
 #include "direction.hh"
 #include "side-position-interface.hh"
-#include "item.hh"
 
-class Clef_engraver : public  Engraver
+#include "translator.icc"
+
+class Clef_engraver : public Engraver
 {
 public:
   TRANSLATOR_DECLARATIONS (Clef_engraver);
@@ -26,12 +27,12 @@ public:
   Direction octave_dir_;
 
 protected:
-  virtual void stop_translation_timestep ();
-  virtual void process_music ();
-  virtual void acknowledge_grob (Grob_info);
+  PRECOMPUTED_VIRTUAL void stop_translation_timestep ();
+  PRECOMPUTED_VIRTUAL void process_music ();
+  DECLARE_ACKNOWLEDGER(bar_line);
 private:
-  Item * clef_;
-  Item * octavate_;
+  Item *clef_;
+  Item *octavate_;
 
   SCM prev_glyph_;
   SCM prev_cpos_;
@@ -49,7 +50,7 @@ Clef_engraver::Clef_engraver ()
 
   /*
     will trigger a clef at the start since #f != ' ()
-   */
+  */
   prev_cpos_ = prev_glyph_ = SCM_BOOL_F;
 }
 
@@ -60,25 +61,23 @@ Clef_engraver::set_glyph ()
   SCM glyph = get_property ("clefGlyph");
 
   SCM basic = ly_symbol2scm ("Clef");
-  
+
   execute_pushpop_property (context (), basic, glyph_sym, SCM_UNDEFINED);
   execute_pushpop_property (context (), basic, glyph_sym, glyph);
 }
 
-/** 
-  Generate a clef at the start of a measure. (when you see a Bar,
-  ie. a breakpoint) 
-  */
+/**
+   Generate a clef at the start of a measure. (when you see a Bar,
+   ie. a breakpoint)
+*/
 void
-Clef_engraver::acknowledge_grob (Grob_info info)
+Clef_engraver::acknowledge_bar_line (Grob_info info)
 {
-  Item * item =dynamic_cast <Item *> (info.grob_);
-  if (item)
+  Item *item = dynamic_cast<Item *> (info.grob ());
+  if (item && scm_is_string (get_property ("clefGlyph")))
     {
-      if (Bar_line::has_interface (info.grob_)
-         && ly_c_string_p (get_property ("clefGlyph")))
-       create_clef ();
-    } 
+      create_clef ();
+    }
 }
 
 void
@@ -87,36 +86,34 @@ Clef_engraver::create_clef ()
   if (!clef_)
     {
       Item *c = make_item ("Clef", SCM_EOL);
-      
 
       clef_ = c;
       SCM cpos = get_property ("clefPosition");
 
-      if (ly_c_number_p (cpos))
+      if (scm_is_number (cpos))
        clef_->set_property ("staff-position", cpos);
 
-      SCM oct =  get_property ("clefOctavation");
-      if (ly_c_number_p (oct) && ly_scm2int (oct))
+      SCM oct = get_property ("clefOctavation");
+      if (scm_is_number (oct) && scm_to_int (oct))
        {
-         Item * g = make_item ("OctavateEight", SCM_EOL);
+         Item *g = make_item ("OctavateEight", SCM_EOL);
 
-         int abs_oct = ly_scm2int (oct) ;
+         int abs_oct = scm_to_int (oct);
          int dir = sign (abs_oct);
-         abs_oct = abs (abs_oct)  + 1;
+         abs_oct = abs (abs_oct) + 1;
 
          SCM txt = scm_number_to_string (scm_int2num (abs_oct),
-                                         SCM_MAKINUM (10));
+                                         scm_from_int (10));
 
          g->set_property ("text",
-                          scm_list_n (ly_scheme_function ("vcenter-markup"),
-                                      txt,  SCM_UNDEFINED));
-         Side_position_interface::add_support (g,clef_);      
+                          scm_list_n (ly_lily_module_constant ("vcenter-markup"),
+                                      txt, SCM_UNDEFINED));
+         Side_position_interface::add_support (g, clef_);
 
          g->set_parent (clef_, Y_AXIS);
          g->set_parent (clef_, X_AXIS);
          g->set_property ("direction", scm_int2num (dir));
          octavate_ = g;
-         
        }
     }
 }
@@ -133,17 +130,19 @@ Clef_engraver::inspect_clef_properties ()
   SCM clefpos = get_property ("clefPosition");
   SCM octavation = get_property ("clefOctavation");
   SCM force_clef = get_property ("forceClef");
-  
-  if (clefpos == SCM_EOL
-      || scm_equal_p (glyph, prev_glyph_) == SCM_BOOL_F
-      || scm_equal_p (clefpos, prev_cpos_) == SCM_BOOL_F
-      || scm_equal_p (octavation, prev_octavation_) == SCM_BOOL_F
-      || to_boolean (force_clef))
+
+  if (clefpos == SCM_EOL 
+       || scm_equal_p (glyph, prev_glyph_) == SCM_BOOL_F
+       || scm_equal_p (clefpos, prev_cpos_) == SCM_BOOL_F
+       || scm_equal_p (octavation, prev_octavation_) == SCM_BOOL_F
+       || to_boolean (force_clef))
     {
       set_glyph ();
-      create_clef ();
+      if (prev_cpos_ != SCM_BOOL_F || to_boolean (get_property ("firstClef")))
+       create_clef ();
 
-      clef_->set_property ("non-default", SCM_BOOL_T);
+      if (clef_)
+       clef_->set_property ("non-default", SCM_BOOL_T);
 
       prev_cpos_ = clefpos;
       prev_glyph_ = glyph;
@@ -152,18 +151,17 @@ Clef_engraver::inspect_clef_properties ()
 
   if (to_boolean (force_clef))
     {
-      Context * w = context ()->where_defined (ly_symbol2scm ("forceClef"));
+      Context *w = context ()->where_defined (ly_symbol2scm ("forceClef"));
       w->set_property ("forceClef", SCM_EOL);
     }
 }
 
-
 void
 Clef_engraver::stop_translation_timestep ()
 {
   if (clef_)
     {
-      SCM vis = 0; 
+      SCM vis = 0;
       if (to_boolean (clef_->get_property ("non-default")))
        {
          vis = get_property ("explicitClefVisibility");
@@ -175,22 +173,20 @@ Clef_engraver::stop_translation_timestep ()
          if (octavate_)
            {
              octavate_->set_property ("break-visibility", vis);
-
            }
        }
-      
-      clef_ =0;
+
+      clef_ = 0;
 
       octavate_ = 0;
     }
 }
 
-
-
-ENTER_DESCRIPTION (Clef_engraver,
-/* descr */       "Determine and set reference point for pitches",
-/* creats*/       "Clef OctavateEight",
-/* accepts */     "",
-/* acks  */      "bar-line-interface",
-/* reads */       "clefPosition clefGlyph middleCPosition clefOctavation explicitClefVisibility",
-/* write */       "");
+ADD_ACKNOWLEDGER(Clef_engraver, bar_line);
+ADD_TRANSLATOR (Clef_engraver,
+               /* descr */ "Determine and set reference point for pitches",
+               /* creats*/ "Clef OctavateEight",
+               /* accepts */ "",
+               /* acks  */ "",
+               /* reads */ "clefPosition clefGlyph middleCPosition clefOctavation explicitClefVisibility forceClef",
+               /* write */ "");