]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/abbreviation-beam-engraver.cc
release: 1.1.1
[lilypond.git] / lily / abbreviation-beam-engraver.cc
index 76d4e7e3eff622823e6bdaa21cace42c58d8f86b..145ab50bcb786e29cf65f910219878caf4ad9286 100644 (file)
@@ -3,8 +3,8 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-           Jan Nieuwenhuizen <jan@digicash.com>
+  (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+           Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "duration-convert.hh"
@@ -15,8 +15,8 @@
 #include "musical-request.hh"
 #include "misc.hh"
 
-IMPLEMENT_IS_TYPE_B1 (Abbreviation_beam_engraver, Engraver);
-ADD_THIS_ENGRAVER (Abbreviation_beam_engraver);
+IMPLEMENT_IS_TYPE_B1(Abbreviation_beam_engraver, Engraver);
+ADD_THIS_TRANSLATOR(Abbreviation_beam_engraver);
 
 Abbreviation_beam_engraver::Abbreviation_beam_engraver ()
 {
@@ -27,22 +27,18 @@ Abbreviation_beam_engraver::Abbreviation_beam_engraver ()
 bool
 Abbreviation_beam_engraver::do_try_request (Request*r)
 {
-  Musical_req* mus_l = r->musical ();
-  if (!mus_l)
-    return false;
-  
-  Abbreviation_beam_req * b = mus_l->abbrev_beam ();
+  Abbreviation_beam_req * b = dynamic_cast <Abbreviation_beam_req *> (r);
 
   if (!b)
     return false;
-    
+
   if (bool (abeam_p_) == bool (b->spantype == Span_req::START))
     return false;
-  
+
   Direction d = (!abeam_p_) ? LEFT : RIGHT;
-  if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (mus_l))
+  if (span_reqs_drul_[d] && !span_reqs_drul_[d]->equal_b (b))
     return false;
-  
+
   span_reqs_drul_[d] = b;
   return true;
 }
@@ -52,7 +48,7 @@ Abbreviation_beam_engraver::do_process_requests ()
 {
   if (!abeam_p_ && span_reqs_drul_[LEFT]) {
     abeam_p_ = new Abbreviation_beam;
-    announce_element (Score_elem_info (abeam_p_, span_reqs_drul_[LEFT]));
+    announce_element (Score_element_info (abeam_p_, span_reqs_drul_[LEFT]));
   }
 }
 
@@ -71,29 +67,31 @@ Abbreviation_beam_engraver::do_pre_move_processing ()
 void
 Abbreviation_beam_engraver::do_removal_processing ()
 {
-  if (abeam_p_) 
+  if (abeam_p_)
     {
-      span_reqs_drul_[LEFT]->warning ("unterminated beam");
+      span_reqs_drul_[LEFT]->warning (_("unterminated beam"));
       typeset_element (abeam_p_);
       abeam_p_ = 0;
     }
 }
 
-
 void
-Abbreviation_beam_engraver::acknowledge_element (Score_elem_info i)
+Abbreviation_beam_engraver::acknowledge_element (Score_element_info i)
 {
-  if (!abeam_p_ || !i.elem_l_->is_type_b (Stem::static_name ()))
+  Stem* s = dynamic_cast<Stem *> (i.elem_l_);
+  if (!abeam_p_ || !s)
     return;
 
-  Stem* s = (Stem*)i.elem_l_->item ();
-//  Rhythmic_req *rhythmic_req = i.req_l_->musical ()->rhythmic ();
-//  s->flag_i_ = Duration_convert::type2_i (rhythmic_req->duration_.durlog_i_);
   int type_i = span_reqs_drul_[LEFT]->type_i_;
   s->flag_i_ = intlog2 (type_i) - 2;
   if (span_reqs_drul_[RIGHT])
     s->beams_left_i_ = s->flag_i_;
   else
     s->beams_right_i_ = s->flag_i_;
-  abeam_p_->add (s);
-} 
+
+  abeam_p_->multiple_i_ = s->flag_i_;
+  if (s->type_i () != 1) // no abbrev gaps on half note
+    s->beam_gap_i_ = s->flag_i_ - ((s->type_i () >? 2) - 2);
+
+  abeam_p_->add_stem (s);
+}