]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/score-element.cc
release: 1.1.29
[lilypond.git] / lily / score-element.cc
index 5eaff4dad8eaf399b4357b2936e9f14e6409f12e..e07bc053e7ddd254b0edbae9169de08adacd3830 100644 (file)
@@ -3,32 +3,29 @@
 
   source file of the GNU LilyPond music typesetter
 
-  (c)  1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c)  1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
 */
 
 
 #include <string.h>
 
-#include "tex-outputter.hh"
 #include "p-score.hh"
 #include "paper-def.hh"
 #include "lookup.hh"
 #include "molecule.hh"
 #include "score-element.hh"
 #include "debug.hh"
-#include "tex.hh"
-#include "dimension.hh"
 #include "spanner.hh"
 #include "line-of-score.hh"
 #include "item.hh"
 #include "p-col.hh"
 #include "molecule.hh"
 #include "misc.hh"
-
-#define PARANOID
+#include "paper-outputter.hh"
 
 Score_element::Score_element()
 {
+  output_p_ =0;
   transparent_b_ = false;
   size_i_ = 0;
   pscore_l_=0;
@@ -43,6 +40,7 @@ Score_element::Score_element (Score_element const&s)
      dependents.      
    */
   copy_edges_out (s);
+  output_p_ =0;
   transparent_b_ = s.transparent_b_;
   status_i_ = s.status_i_;
   pscore_l_ = s.pscore_l_;
@@ -54,13 +52,14 @@ Score_element::Score_element (Score_element const&s)
 
 Score_element::~Score_element()
 {
+  delete output_p_; 
   assert (status_i_ >=0);
 }
 
 Score_element*
 Score_element::dependency (int i) const
 {
-  return (Score_element*) get_out_edge_arr ()[i];
+  return (Score_element*) (get_out_edge_arr ()[i]);
 }
 
 int
@@ -72,7 +71,7 @@ Score_element::dependency_size () const
 Score_element*
 Score_element::dependent (int i) const
 {
-  return (Score_element*) get_in_edge_arr()[i];
+  return (Score_element *)( get_in_edge_arr()[i]);
 }
 
 int
@@ -88,9 +87,11 @@ Score_element::do_width() const
 {
   Interval r;
 
-  Molecule*m = brew_molecule_p();
+  Molecule*m = output_p_ ?  output_p_ : do_brew_molecule_p();
   r = m->extent().x ();
-  delete m;
+
+  if (!output_p_)
+    delete m;
   
   return r;
 }
@@ -99,9 +100,11 @@ Interval
 Score_element::do_height() const 
 {
   Interval r;
-  Molecule*m = brew_molecule_p();
+  Molecule*m = output_p_ ?  output_p_ : do_brew_molecule_p();
   r = m->extent().y ();
-  delete m;
+  if (!output_p_)
+    delete m;
+
   return r;
 }
 
@@ -113,7 +116,7 @@ void
 Score_element::print() const
 {
 #ifndef NPRINT
-  DOUT << name() << "{\n";
+  DOUT << classname(this) << "{\n";
   DOUT << "dets: " << dependent_size() << "dependencies: " << 
     dependency_size();
  
@@ -150,7 +153,7 @@ Score_element::add_processing()
 
 
 void
-Score_element::calcalute_dependencies (int final, int busy,
+Score_element::calculate_dependencies (int final, int busy,
                                    Score_element_method_pointer funcptr)
 {
   if (status_i_ >= final)
@@ -160,11 +163,11 @@ Score_element::calcalute_dependencies (int final, int busy,
   status_i_= busy;
 
   for (int i=0; i < dependency_size(); i++)
-    dependency (i)->calcalute_dependencies (final, busy, funcptr);
+    dependency (i)->calculate_dependencies (final, busy, funcptr);
 
   Link_array<Score_element> extra (get_extra_dependencies());
   for (int i=0; i < extra.size(); i++)
-    extra[i]->calcalute_dependencies (final, busy, funcptr);
+    extra[i]->calculate_dependencies (final, busy, funcptr);
   
   invalidate_cache (X_AXIS);
   invalidate_cache (Y_AXIS);
@@ -173,13 +176,17 @@ Score_element::calcalute_dependencies (int final, int busy,
 }
 
 void
-Score_element::do_brew_molecule () 
+Score_element::output_processing () 
 {
   if (transparent_b_)
     return;
-  Molecule *output= brew_molecule_p ();
-  pscore_l_->outputter_l_->output_molecule (output, absolute_offset (), name());
-  delete output;
+  if (output_p_)
+    delete output_p_;
+  
+  output_p_ = do_brew_molecule_p ();
+  pscore_l_->outputter_l_->output_molecule (output_p_,
+                                           absolute_offset (),
+                                           classname(this));
 }
 
 /*
@@ -239,12 +246,12 @@ Score_element::do_junk_links()
 {
 }
 
-IMPLEMENT_IS_TYPE_B1(Score_element, Graphical_element);
+
 
 Molecule*
-Score_element::brew_molecule_p() const
+Score_element::do_brew_molecule_p() const
 {
-  Atom a (lookup_l ()->fill (Box (Interval (0,0), Interval (0,0))));
+  Molecule a (lookup_l ()->fill (Box (Interval (0,0), Interval (0,0))));
   return new Molecule (a);
 }
 
@@ -293,17 +300,16 @@ Score_element::handle_broken_dependencies()
       Score_element * elt = dependency (i);
       if (elt->line_l() != line)
        {
-         if (elt->access_Spanner ()) 
+         if (Spanner *sp = dynamic_cast<Spanner *> (elt)) 
            {
-             Spanner * sp = elt->access_Spanner ();
              Spanner * broken = sp->find_broken_piece (line);
              substitute_dependency (sp, broken);
 
              add_dependency (broken);
            }
-         else if (elt->access_Item ())
+         else if (Item *original = dynamic_cast <Item *> (elt))
            {
-             Item * my_item = elt->access_Item ()->find_prebroken_piece (line);
+             Item * my_item = original->find_prebroken_piece (line);
                
              substitute_dependency (elt, my_item);
              if (my_item)
@@ -340,11 +346,11 @@ Score_element::handle_prebroken_dependencies()
   for (int i=0; i < dependency_size(); i++) 
     {
       Score_element * elt = dependency (i);
-      Item *it_l = elt->access_Item ();
+      Item *it_l = dynamic_cast <Item *> (elt);
       if (it_l && it_l->breakable_b_)
-       if (access_Item ()) 
+       if (Item *me = dynamic_cast<Item*> (this) )
          {
-           Score_element *new_l = it_l->find_prebroken_piece (access_Item ()->break_status_dir_);
+           Score_element *new_l = it_l->find_prebroken_piece (me->break_status_dir_);
            if (new_l != elt) 
              {
                new_arr.push (new_l);
@@ -365,6 +371,11 @@ Score_element::handle_prebroken_dependencies()
       substitute_dependency (old_arr[i], new_arr[i]);
 }
 
+void
+Score_element::handle_prebroken_dependents()
+{
+}
+
 
 void
 Score_element::junk_links ()