]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/plet-engraver.cc
release: 1.1.0
[lilypond.git] / lily / plet-engraver.cc
index 41f154ed92e2641d8061a05c22feda6a6e0e1fbb..ed85c58bfddeeafab1061a3e96a31167c34ed7b3 100644 (file)
@@ -1,7 +1,7 @@
 /*
   plet-engraver.cc -- implement Plet_engraver
 
-  (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+  (c)  1997--1998 Jan Nieuwenhuizen <janneke@gnu.org>
 */
 
 #include "proto.hh"
@@ -9,6 +9,8 @@
 #include "plet-engraver.hh"
 #include "plet-spanner.hh"
 #include "text-def.hh"
+#include "beam.hh"
+#include "score-column.hh"
 #include "stem.hh"
 
 IMPLEMENT_IS_TYPE_B1 (Plet_engraver,Engraver);
@@ -16,12 +18,14 @@ ADD_THIS_TRANSLATOR (Plet_engraver);
 
 Plet_engraver::Plet_engraver ()
 {
+  beam_mom_drul_[LEFT] = span_mom_drul_[LEFT] = INT_MAX;
+  beam_mom_drul_[RIGHT] = span_mom_drul_[LEFT] = -INT_MAX;
   plet_spanner_p_ = 0;
   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
 }
 
 void
-Plet_engraver::acknowledge_element (Score_elem_info i)
+Plet_engraver::acknowledge_element (Score_element_info i)
 {
   if (!i.elem_l_->is_type_b (Stem::static_name ()))
     return;
@@ -31,20 +35,35 @@ Plet_engraver::acknowledge_element (Score_elem_info i)
     return;
 
   if (!plet_spanner_p_->stem_l_drul_[LEFT])
-    plet_spanner_p_->set_stem (LEFT, (Stem*)i.elem_l_->item ());
+    plet_spanner_p_->set_stem (LEFT, (Stem*)dynamic_cast <Item *> (i.elem_l_));
   else
     if (span_reqs_drul_[RIGHT] && !plet_spanner_p_->stem_l_drul_[RIGHT]) 
-      plet_spanner_p_->set_stem (RIGHT, (Stem*)i.elem_l_->item());
+      plet_spanner_p_->set_stem (RIGHT, (Stem*)dynamic_cast <Item *> (i.elem_l_));
 }
 
 bool
 Plet_engraver::do_try_request (Request* req_l)
 {
-  Musical_req* mus_l = req_l->musical ();
+  Musical_req* mus_l = dynamic_cast <Musical_req *> (req_l);
   if (!mus_l)
     return false;
 
-  Plet_req* p = mus_l->plet ();
+  /*
+    UGH! This is incorrect!
+    Beam_req might not reach the Plet_engraver if ordering is wrong!
+   */
+  Beam_req* b = dynamic_cast <Beam_req *> (mus_l);
+  if (b)
+    {
+      if (b->spantype)
+        {
+          Direction d = (Direction)(((int)(b->spantype - 1)) * 2 - 1);
+          beam_mom_drul_[d] = get_staff_info ().musical_l ()->when ();
+       }
+      return false;
+    }
+    
+  Plet_req* p = dynamic_cast <Plet_req *> (mus_l);
   if (!p)
     return false;
 
@@ -56,6 +75,7 @@ Plet_engraver::do_try_request (Request* req_l)
     return false;
 
   span_reqs_drul_[d] = p;
+  span_mom_drul_[d] = get_staff_info ().musical_l ()->when ();
   return true;
 }
 
@@ -64,10 +84,11 @@ Plet_engraver::do_removal_processing ()
 {
   if (plet_spanner_p_)
     {
-      span_reqs_drul_[LEFT]->warning (_("unterminated plet"));
+      span_reqs_drul_[LEFT]->warning (_ ("unterminated plet"));
       plet_spanner_p_->unlink ();
       delete plet_spanner_p_;
       plet_spanner_p_ = 0;
+      span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
     }
 }
 
@@ -78,9 +99,9 @@ Plet_engraver::do_process_requests ()
     return;
 
   plet_spanner_p_ = new Plet_spanner;
-  plet_spanner_p_->tdef_p_->text_str_ = span_reqs_drul_[LEFT]->plet_i_;
+  plet_spanner_p_->tdef_p_->text_str_ = to_str (span_reqs_drul_[LEFT]->plet_i_);
 
-  announce_element (Score_elem_info (plet_spanner_p_, span_reqs_drul_[LEFT]));
+  announce_element (Score_element_info (plet_spanner_p_, span_reqs_drul_[LEFT]));
 }
 
 void
@@ -89,7 +110,22 @@ Plet_engraver::do_pre_move_processing ()
   if (!plet_spanner_p_ || !span_reqs_drul_[RIGHT]) 
     return;
 
-  typeset_element (plet_spanner_p_);
+  Scalar prop = get_property ("pletvisibility");
+  if (prop.isnum_b ()) 
+    plet_spanner_p_->visibility_i_ = prop;
+
+  if ((beam_mom_drul_[LEFT] <= span_mom_drul_[LEFT])
+     && (beam_mom_drul_[RIGHT] >= span_mom_drul_[RIGHT]))
+     plet_spanner_p_->visibility_i_ &= ~2;
+
+  if (plet_spanner_p_->visibility_i_)
+    typeset_element (plet_spanner_p_);
+  else
+    {
+      plet_spanner_p_->unlink ();
+      delete plet_spanner_p_;
+    }
+  
   plet_spanner_p_ = 0;
   span_reqs_drul_[RIGHT] = span_reqs_drul_[LEFT] = 0;
 }