]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/script-engraver.cc
Run `make grand-replace'.
[lilypond.git] / lily / script-engraver.cc
index da86b9c1725b05525c7425a6af0a891a56e5350a..f460892c138124322ee6b6d3ea817b711a50caa7 100644 (file)
@@ -3,30 +3,33 @@
 
   source file of the GNU LilyPond music typesetter
 
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
 */
 
 */
 
+#include "engraver.hh"
+
 #include "context.hh"
 #include "directional-element-interface.hh"
 #include "context.hh"
 #include "directional-element-interface.hh"
-#include "engraver.hh"
-#include "slur.hh"
+#include "international.hh"
 #include "note-column.hh"
 #include "paper-column.hh"
 #include "rhythmic-head.hh"
 #include "script-interface.hh"
 #include "side-position-interface.hh"
 #include "note-column.hh"
 #include "paper-column.hh"
 #include "rhythmic-head.hh"
 #include "script-interface.hh"
 #include "side-position-interface.hh"
+#include "slur.hh"
 #include "staff-symbol-referencer.hh"
 #include "stem.hh"
 #include "staff-symbol-referencer.hh"
 #include "stem.hh"
+#include "stream-event.hh"
 #include "warn.hh"
 
 #include "warn.hh"
 
+#include "translator.icc"
+
 struct Script_tuple
 {
 struct Script_tuple
 {
-  Music *event_;
+  Stream_event *event_;
   Grob *script_;
   Grob *script_;
-  bool follow_into_staff_;
   Script_tuple ()
   {
   Script_tuple ()
   {
-    follow_into_staff_ = false;
     event_ = 0;
     script_ = 0;
   }
     event_ = 0;
     script_ = 0;
   }
@@ -34,18 +37,17 @@ struct Script_tuple
 
 class Script_engraver : public Engraver
 {
 
 class Script_engraver : public Engraver
 {
-  Array<Script_tuple> scripts_;
-  Spanner *slur_;
+  vector<Script_tuple> scripts_;
 
 protected:
 
 protected:
-  virtual bool try_music (Music *);
   void stop_translation_timestep ();
   void process_music ();
 
   void stop_translation_timestep ();
   void process_music ();
 
-  DECLARE_ACKNOWLEDGER( slur);
-  DECLARE_ACKNOWLEDGER( rhythmic_head);
-  DECLARE_ACKNOWLEDGER( stem);
-  DECLARE_ACKNOWLEDGER( note_column);
+  DECLARE_TRANSLATOR_LISTENER (articulation);
+  DECLARE_ACKNOWLEDGER (rhythmic_head);
+  DECLARE_ACKNOWLEDGER (stem);
+  DECLARE_ACKNOWLEDGER (stem_tremolo);
+  DECLARE_ACKNOWLEDGER (note_column);
 
 public:
   TRANSLATOR_DECLARATIONS (Script_engraver);
 
 public:
   TRANSLATOR_DECLARATIONS (Script_engraver);
@@ -53,28 +55,23 @@ public:
 
 Script_engraver::Script_engraver ()
 {
 
 Script_engraver::Script_engraver ()
 {
-  slur_ = 0;
 }
 
 }
 
-bool
-Script_engraver::try_music (Music *m)
+IMPLEMENT_TRANSLATOR_LISTENER (Script_engraver, articulation);
+void
+Script_engraver::listen_articulation (Stream_event *ev)
 {
 {
-  if (m->is_mus_type ("articulation-event"))
-    {
-      /* Discard double articulations for part-combining.  */
-      int script_count = scripts_.size ();
-      for (int i = 0; i < script_count; i++)
-       if (ly_is_equal (scripts_[i].event_
-                        ->get_property ("articulation-type"),
-                        m->get_property ("articulation-type")))
-         return true;
-
-      Script_tuple t;
-      t.event_ = m;
-      scripts_.push (t);
-      return true;
-    }
-  return false;
+  /* Discard double articulations for part-combining.  */
+  int script_count = scripts_.size ();
+  for (int i = 0; i < script_count; i++)
+    if (ly_is_equal (scripts_[i].event_
+                    ->get_property ("articulation-type"),
+                    ev->get_property ("articulation-type")))
+      return;
+
+  Script_tuple t;
+  t.event_ = ev;
+  scripts_.push_back (t);
 }
 
 void
 }
 
 void
@@ -84,7 +81,7 @@ copy_property (Grob *g, SCM sym, SCM alist)
     {
       SCM entry = scm_assoc (sym, alist);
       if (scm_is_pair (entry))
     {
       SCM entry = scm_assoc (sym, alist);
       if (scm_is_pair (entry))
-       g->internal_set_property (sym, scm_cdr (entry));
+       g->set_property (sym, scm_cdr (entry));
     }
 }
 
     }
 }
 
@@ -92,8 +89,9 @@ copy_property (Grob *g, SCM sym, SCM alist)
    could be saved by tacking the props onto the Script grob (i.e. make
    ScriptStaccato , ScriptMarcato, etc. ).
 */
    could be saved by tacking the props onto the Script grob (i.e. make
    ScriptStaccato , ScriptMarcato, etc. ).
 */
-void make_script_from_event (Grob *p, bool *follow, Context *tg,
-                            SCM art_type, int index)
+void
+make_script_from_event (Grob *p,  Context *tg,
+                       SCM art_type, int index)
 {
   SCM alist = tg->get_property ("scriptDefinitions");
   SCM art = scm_assoc (art_type, alist);
 {
   SCM alist = tg->get_property ("scriptDefinitions");
   SCM art = scm_assoc (art_type, alist);
@@ -101,7 +99,7 @@ void make_script_from_event (Grob *p, bool *follow, Context *tg,
   if (art == SCM_BOOL_F)
     {
       /* FIXME: */
   if (art == SCM_BOOL_F)
     {
       /* FIXME: */
-      warning (_ ("don't know how to interpret articulation: "));
+      warning (_ ("do not know how to interpret articulation: "));
       warning (_ ("scheme encoding: "));
       scm_write (art_type, scm_current_error_port ());
       message ("");
       warning (_ ("scheme encoding: "));
       scm_write (art_type, scm_current_error_port ());
       message ("");
@@ -110,10 +108,6 @@ void make_script_from_event (Grob *p, bool *follow, Context *tg,
 
   art = scm_cdr (art);
 
 
   art = scm_cdr (art);
 
-  SCM follow_scm = scm_assoc (ly_symbol2scm ("follow-into-staff"),
-                             art);
-
-  *follow = scm_is_pair (follow_scm) && to_boolean (scm_cdr (follow_scm));
   bool priority_found = false;
 
   for (SCM s = art; scm_is_pair (s); s = scm_cdr (s))
   bool priority_found = false;
 
   for (SCM s = art; scm_is_pair (s); s = scm_cdr (s))
@@ -135,8 +129,11 @@ void make_script_from_event (Grob *p, bool *follow, Context *tg,
 
          val = scm_from_int (prio);
        }
 
          val = scm_from_int (prio);
        }
-      if (p->internal_get_property (sym) == SCM_EOL)
-       p->internal_set_property (sym, val);
+
+      SCM preset = p->get_property_data (sym);
+      if (val == SCM_EOL
+         || scm_call_1 (type, preset) == SCM_BOOL_F)
+       p->set_property (sym, val);
     }
 
   if (!priority_found)
     }
 
   if (!priority_found)
@@ -144,32 +141,29 @@ void make_script_from_event (Grob *p, bool *follow, Context *tg,
       p->set_property ("script-priority",
                       scm_from_int (index));
     }
       p->set_property ("script-priority",
                       scm_from_int (index));
     }
-
-  Side_position_interface::set_axis (p, Y_AXIS);
 }
 
 void
 Script_engraver::process_music ()
 {
 }
 
 void
 Script_engraver::process_music ()
 {
-  for (int i = 0; i < scripts_.size(); i++)
-     {
-      Music *m = scripts_[i].event_;
+  for (vsize i = 0; i < scripts_.size (); i++)
+    {
+      Stream_event *ev = scripts_[i].event_;
 
 
-      Grob *p = make_item ("Script", m->self_scm ());
+      Grob *p = make_item ("Script", ev->self_scm ());
 
 
-      make_script_from_event (p, &scripts_[i].follow_into_staff_, context (),
-                             m->get_property ("articulation-type"),
+      make_script_from_event (p, context (),
+                             ev->get_property ("articulation-type"),
                              i);
 
       scripts_[i].script_ = p;
 
                              i);
 
       scripts_[i].script_ = p;
 
-      SCM force_dir = m->get_property ("direction");
+      SCM force_dir = ev->get_property ("direction");
       if (is_direction (force_dir) && to_dir (force_dir))
        p->set_property ("direction", force_dir);
     }
 }
 
       if (is_direction (force_dir) && to_dir (force_dir))
        p->set_property ("direction", force_dir);
     }
 }
 
-
 void
 Script_engraver::acknowledge_stem (Grob_info info)
 {
 void
 Script_engraver::acknowledge_stem (Grob_info info)
 {
@@ -181,18 +175,28 @@ Script_engraver::acknowledge_stem (Grob_info info)
       if (to_dir (e->get_property ("side-relative-direction")))
        e->set_object ("direction-source", info.grob ()->self_scm ());
 
       if (to_dir (e->get_property ("side-relative-direction")))
        e->set_object ("direction-source", info.grob ()->self_scm ());
 
-      /* FIXME: add dependency */
-      e->add_dependency (info.grob ());
       Side_position_interface::add_support (e, info.grob ());
     }
 }
 
       Side_position_interface::add_support (e, info.grob ());
     }
 }
 
+void
+Script_engraver::acknowledge_stem_tremolo (Grob_info info)
+{
+  int script_count = scripts_.size ();
+  for (int i = 0; i < script_count; i++)
+    {
+      Grob *e = scripts_[i].script_;
+      Side_position_interface::add_support (e, info.grob ());
+    }
+}
+
+
 void
 Script_engraver::acknowledge_rhythmic_head (Grob_info info)
 {
 void
 Script_engraver::acknowledge_rhythmic_head (Grob_info info)
 {
-  if(info.music_cause ())
+  if (info.event_cause ())
     {
     {
-     for (int i = 0; i < scripts_.size(); i++)
+      for (vsize i = 0; i < scripts_.size (); i++)
        {
          Grob *e = scripts_[i].script_;
 
        {
          Grob *e = scripts_[i].script_;
 
@@ -200,7 +204,6 @@ Script_engraver::acknowledge_rhythmic_head (Grob_info info)
              && !e->get_parent (Y_AXIS))
            {
              e->set_parent (info.grob (), Y_AXIS);
              && !e->get_parent (Y_AXIS))
            {
              e->set_parent (info.grob (), Y_AXIS);
-             e->add_dependency (info.grob ());
            }
          Side_position_interface::add_support (e, info.grob ());
        }
            }
          Side_position_interface::add_support (e, info.grob ());
        }
@@ -215,9 +218,8 @@ Script_engraver::acknowledge_note_column (Grob_info info)
      swapped around horizontally.
 
      As the note head to put it on is not known now, postpone this
      swapped around horizontally.
 
      As the note head to put it on is not known now, postpone this
-     decision to Script_interface::before_line_breaking ().  */
-  
-  for (int i = 0; i < scripts_.size(); i++)
+     decision to Script_interface::calc_direction ().  */
+  for (vsize i = 0; i < scripts_.size (); i++)
     {
       Grob *e = scripts_[i].script_;
 
     {
       Grob *e = scripts_[i].script_;
 
@@ -226,39 +228,28 @@ Script_engraver::acknowledge_note_column (Grob_info info)
        e->set_parent (info.grob (), X_AXIS);
     }
 }
        e->set_parent (info.grob (), X_AXIS);
     }
 }
-void
-Script_engraver::acknowledge_slur (Grob_info info)
-{
-  slur_ = info.spanner ();
-}
 
 void
 Script_engraver::stop_translation_timestep ()
 {
 
 void
 Script_engraver::stop_translation_timestep ()
 {
-  int script_count = scripts_.size ();
-  for (int i = 0; i < script_count; i++)
-    if (scripts_[i].follow_into_staff_)
-      {
-       Grob *sc = scripts_[i].script_;
-       sc->add_offset_callback (Side_position_interface
-                                ::quantised_position_proc, Y_AXIS);
-       sc->set_property ("staff-padding", SCM_EOL);
-      }
-
   scripts_.clear ();
 }
 
   scripts_.clear ();
 }
 
-#include "translator.icc"
-
-ADD_ACKNOWLEDGER(Script_engraver, slur);
-ADD_ACKNOWLEDGER(Script_engraver, rhythmic_head);
-ADD_ACKNOWLEDGER(Script_engraver, stem);
-ADD_ACKNOWLEDGER(Script_engraver, note_column);
+ADD_ACKNOWLEDGER (Script_engraver, rhythmic_head);
+ADD_ACKNOWLEDGER (Script_engraver, stem);
+ADD_ACKNOWLEDGER (Script_engraver, note_column);
+ADD_ACKNOWLEDGER (Script_engraver, stem_tremolo);
 
 ADD_TRANSLATOR (Script_engraver,
 
 ADD_TRANSLATOR (Script_engraver,
-               /* descr */ "Handles note scripted articulations.",
-               /* creats*/ "Script",
-               /* accepts */ "script-event articulation-event",
-               /* reads */ "scriptDefinitions",
-               /* write */ "");
+               /* doc */
+               "Handle note scripted articulations.",
+
+               /* create */
+               "Script ",
+
+               /* read */
+               "scriptDefinitions ",
+
+               /* write */
+               ""
+               );