]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.2.9
authorfred <fred>
Tue, 26 Mar 2002 22:26:16 +0000 (22:26 +0000)
committerfred <fred>
Tue, 26 Mar 2002 22:26:16 +0000 (22:26 +0000)
27 files changed:
flower/include/parray.hh
input/bugs/barline.ly
lily/all-font-metrics.cc
lily/axis-group-item.cc
lily/axis-group-spanner.cc
lily/break-algorithm.cc
lily/gdb.cc [new file with mode: 0644]
lily/graphical-axis-group.cc
lily/include/break.hh
lily/include/graphical-axis-group.hh
lily/include/item.hh
lily/include/line-of-score.hh
lily/include/score-element.hh
lily/include/spanner.hh
lily/item.cc
lily/line-of-score.cc
lily/main.cc
lily/multi-measure-rest.cc
lily/score-element.cc
lily/score-engraver.cc
lily/separating-group-spanner.cc
lily/spacing-spanner.cc
lily/spanner.cc
lily/staff-sym.cc
stepmake/stepmake/documentation-rules.make
stepmake/stepmake/executable-targets.make
stepmake/stepmake/executable-vars.make

index 3aabb2b06cb3a8c02982f86d2e49254bcdf788a7..8a2efcb6fdef6faf4eb0c4166b949d2575955462 100644 (file)
@@ -207,5 +207,76 @@ junk_pointer_array (Link_array<T> &a)
   a.clear ();
 }
 
+
+
+/*
+  lookup with binsearch, return tokencode.
+*/
+template<class T>
+int
+binsearch_array (Array<T> const &arr, T t, int (*compare)(T const&,T const&))
+{
+  int lo;
+  int hi;
+  int cmp;
+  int result;
+  lo = 0;
+  hi = maxkey;
+
+  /* binary search */
+  do
+  {
+      cmp = (lo + hi) / 2;
+
+      result = compare (t, arr[cmp]);
+
+      if (result < 0)
+          hi = cmp;
+      else
+          lo = cmp;
+    }
+  while (hi - lo > 1);
+  if (!compare (t, arr[lo]))
+    return lo;
+  else
+    return -1;              /* not found */
+}
+
+
+template<class T>
+int
+binsearch_link_array (Link_array<T> const &arr, T *t,
+                     int (*compare)(T *const&,T *const&))
+{
+  int lo;
+  int hi;
+  int cmp;
+  int result;
+  lo = 0;
+  hi = arr.size();
+
+  if (hi == 0)
+    return -1;
+  
+  /* binary search */
+  do
+  {
+      cmp = (lo + hi) / 2;
+
+      result = compare (t, arr[cmp]);
+
+      if (result < 0)
+          hi = cmp;
+      else
+          lo = cmp;
+    }
+  while (hi - lo > 1);
+  if (!compare (t, arr[lo]))
+    return lo;
+  else
+    return -1;              /* not found */
+}
+
+
 #endif // PARRAY_HH
 
index ff14437a0535ec56a461a12d75358572ce0d75d9..c9c96999065e521b40bf3c36cdef8d61e5987d31 100644 (file)
@@ -6,31 +6,23 @@
 melody = \notes \relative c' {
        \partial 8;
        g8 |
-       c4 c8 d [es () d] c4 | f4 f8 g [es() d] c g |
-       c4 c8 d [es () d] c4 | d4 es8 d c4.
+       
+       
        \bar "|.";\clef bass;
 }
 
-text = \lyrics {
-       The ri -- ver is flo -- wing, flo -- wing and gro -- wing, the
-       ri -- ver is flo -- wing down to the sea.
-}
+
 
 accompaniment =\chords  \sequential {
        r8
-       c2-min f-min 7 d-min es4 c8-min r8
-       c2-min f-min 7 g c-min
+       c2-min f-min 7 
 }
 
 \score {
        \simultaneous {
          \context ChordNames \accompaniment
-         \addlyrics
             \context Staff {
-               \property Voice.beamAuto = "0"
-               \property Staff.automaticMelismas = "1"
                \melody }
-            \context LyricVoice \text
        }
        \paper { }
        \midi  { }
index 339e74c8d35193ac127eac5eacc99a5bd40b7e53..0ecfbf4420de88d419e88b1e20a4ddc31f462970 100644 (file)
@@ -66,12 +66,13 @@ All_font_metrics::find_font (String name)
   if (f)
     return f;
 
-  warning (_f("Can't find font `%s', loading default font.", name.ch_C()));
+  warning (_f ("Can't find font: `%s'", name.ch_C ()));
+  warning (_ ("Loading default font"));
   
   f =  find_tfm (default_font_sz_);
   if (f)
     return f;
-  String s = _f("Can't find default font `%s\', giving up.", default_font_sz_);
-  s += String ("\n") + _f ("(search path: `%s)'", search_path_.str ());
-  error (s);
+  error (_f ("Can't find default font: `%s'", default_font_sz_));
+  error (_f ("(search path: `%s'", search_path_.str ()));
+  error (_ ("Giving up"));
 }
index b43f07e270476716a6267c1e73bac1366128cfed..5068ecd0994f82243cf75c3f07b832aeb7f0e179 100644 (file)
@@ -39,8 +39,8 @@ Axis_group_item::do_breakable_col_processing()
       do 
        {
          Axis_group_item * my_brok
-           = dynamic_cast<Axis_group_item*> (find_prebroken_piece(j));
-         Item *new_l = it_l->find_prebroken_piece (j);
+           = dynamic_cast<Axis_group_item*> (find_broken_piece(j));
+         Item *new_l = it_l->find_broken_piece (j);
          my_brok->add_element (new_l);
        }
       while (flip(&j)!=LEFT);
index 71064ac8b4b235eff42c0a7d40a1ca523c9978e3..246fcee710fdcd82af7086145ab610fa884059ec 100644 (file)
@@ -30,15 +30,15 @@ Axis_group_spanner::do_break_processing_if_unbroken()
               && item_l->break_status_dir() == 0) 
            {
              // last two checks are paranoia
-             Item * broken_item_l = 
-               item_l->find_prebroken_piece (my_line);
+             Score_element * broken_item_l = 
+               item_l->find_broken_piece (my_line);
              add_element (broken_item_l);
            }
 
          Spanner *spanner_l = dynamic_cast<Spanner*> (elems[i]);
          if (spanner_l)
            {
-             Spanner *broken_spanner_l =
+             Score_element *broken_spanner_l =
                spanner_l->find_broken_piece (my_line);
              add_element (broken_spanner_l);
            }
@@ -62,19 +62,43 @@ Axis_group_spanner::do_break_processing()
 
   break_into_pieces ();
   Link_array<Score_element> loose_elems = elem_l_arr ();
+
+  Array<int> axeses;
+
+  for (int i=0; i < loose_elems.size (); i++)
+    {
+      Score_element* elt = loose_elems[i];
+      /*
+           with which axes do we have to meddle?
+      */
+      int j =0;
+      int as [2];
+      for (int a = X_AXIS; a < NO_AXES; ++a)
+       if (elt->parent_l (Axis (a)) == this)
+         as[j++] = a;
+      if (j == 1)
+       as[j++] = as[0];
+
+      axeses.push (as[0]);
+      axeses.push (as[1]);
+    }
+
   remove_all();
   
   for (int i=0; i < loose_elems.size(); i++) 
     {
       Score_element * elt = loose_elems[i];
       Line_of_score *elt_line = elt->line_l();
-       
+
+      Axis a1= (Axis)axeses[2*i];      // ugh.
+      Axis a2= (Axis)axeses[2*i+1];    // ugh.      
       if (! elt_line)
        {
          /* this piece doesn't know where it belongs.
             Find out if it was broken, and use the broken remains
             */
 
+
          Item *it = dynamic_cast <Item *> (elt) ;        
          if (Spanner * sp =dynamic_cast <Spanner *> (elt))
            {
@@ -85,11 +109,11 @@ Axis_group_spanner::do_break_processing()
                  Axis_group_spanner * my_broken_l
                    = dynamic_cast<Axis_group_spanner*>(find_broken_piece (l));
                  
-                 Spanner * broken_span_l 
+                 Score_element * broken_span_l 
                    = sp->find_broken_piece (l);
-                   
+
                  if (broken_span_l) 
-                   my_broken_l->add_element (broken_span_l);
+                   my_broken_l->add_element (broken_span_l, a1, a2);
                }
            }
          else if (it && it->broken_original_b ())
@@ -98,7 +122,7 @@ Axis_group_spanner::do_break_processing()
              Direction  j=LEFT;
              do 
                {
-                 Item * broken_item = it->find_prebroken_piece (j);
+                 Item * broken_item = it->find_broken_piece (j);
                  Line_of_score * item_line_l = broken_item->line_l() ;
                  if (! item_line_l) 
                    continue;
@@ -106,7 +130,7 @@ Axis_group_spanner::do_break_processing()
                  Axis_group_spanner * v
                    = dynamic_cast<Axis_group_spanner*>(find_broken_piece (item_line_l));
                  if (v)
-                   v->add_element (broken_item);
+                   v->add_element (broken_item, a1, a2);
                  else
                    {
                      broken_item->set_elt_property (transparent_scm_sym, SCM_BOOL_T);
@@ -124,7 +148,7 @@ Axis_group_spanner::do_break_processing()
             */
          Axis_group_spanner * my_broken_l
            = dynamic_cast<Axis_group_spanner*> (find_broken_piece (elt->line_l()));
-         my_broken_l->add_element (elt);
+         my_broken_l->add_element (elt, a1, a2);
        }
     }
   
index 6674d5bcf0e8c1b130a3fb1a2050bbf7845748d4..32450301f83389ccbca4afc2d7fd28ef9148a5a5 100644 (file)
 #include "simple-spacer.hh"
 
 
-String
-Col_stats::str () const
-{
-  String s;
-  if (!count_i_)
-    s = _ ("0 lines");
-  else if (count_i_ == 1)
-    s = _f ("1 line (of %.0f columns)", (Real)cols_i_/count_i_);
-  else
-    s = _f ("%d lines (with an average of %.1f columns)", 
-      count_i_, (Real)cols_i_/count_i_);
-  return s;
-}
 
-void
-Col_stats::add (Line_of_cols const& line)
-{
-  count_i_++;
-  cols_i_ += line.size ();
-}
-
-
-Col_stats::Col_stats ()
-{
-  count_i_ =0;
-  cols_i_ =0;
-}
-
-/* **************************************************************** */
 
 
 Array<int>
@@ -152,7 +124,7 @@ void
 Break_algorithm::problem_OK () const
 {
   if (pscore_l_->col_l_arr_.empty ())
-    error (_("score does not have any columns"));
+    error (_("Score does not have any columns"));
   OK ();
 }
 
@@ -164,16 +136,8 @@ Break_algorithm::OK () const
 Array<Column_x_positions>
 Break_algorithm::solve () const
 {
-  Cpu_timer timer;
-
   Array<Column_x_positions> h= do_solve ();
-
-  if (approx_stats_.count_i_)
-    *mlog << '\n' << _f ("approximated %s", approx_stats_.str ()) << endl;
-  if (exact_stats_.count_i_)
-    *mlog << _f ("calculated %s exactly", exact_stats_.str ()) << endl;
-  *mlog << _f ("elapsed time %.2f seconds",  timer.read ()) << endl;
-
+  
   return h;
 }
 
diff --git a/lily/gdb.cc b/lily/gdb.cc
new file mode 100644 (file)
index 0000000..0df1e50
--- /dev/null
@@ -0,0 +1,14 @@
+#include "item.hh"
+#include "spanner.hh"
+
+// thanks to GDBs wonderful casting abilities, we need these:
+Item*
+to_item (Graphical_element* g)
+{
+  return dynamic_cast<Item*>(g);
+}
+Spanner*
+to_spanner (Graphical_element*g)
+{
+  return dynamic_cast<Spanner*>(g);
+}
index 02f32e1eb04a12464f41b73c9fd514968044e37b..1fe7c2b3026ed03fba0cb98880f04878a3568277 100644 (file)
@@ -42,25 +42,35 @@ Graphical_axis_group::extent (Axis axis) const
 }
 
 void
-Graphical_axis_group::add_element (Graphical_element*e)
+Graphical_axis_group::add_element (Graphical_element*e, Axis a1 , Axis a2)
 {
   used_b_ =true;
   e->used_b_ = true;
+
+  Axis as[2] = {
+    (a1 == NO_AXES) ? axes_[0] : a1,
+    (a2 == NO_AXES) ? axes_[1] : a2,    
+  };
+
+    
+  
   for (int i = 0; i < 2; i++)
     {
-      Axis a = axes_[i];
-      assert (a>=0);
-      assert (!e->parent_l (a)  || this  == e->parent_l (a));
-      e->set_parent (this, a);
+      if (e->parent_l (as[i]))
+       continue;
+      
+      e->set_parent (this, as[i]);
 
-      e->dim_cache_[a]->dependencies_l_arr_.push (dim_cache_[a]);
+      e->dim_cache_[as[i]]->dependencies_l_arr_.push (dim_cache_[as[i]]);
     }
-
+  assert (e->parent_l(Y_AXIS) == this || e->parent_l (X_AXIS) == this);
   elem_l_arr_.push (e);
 }
 
 
-
+/**
+   ugr. duplication of functionality with remove_all ()
+ */
 void
 Graphical_axis_group::remove_element (Graphical_element*e)
 {
@@ -69,13 +79,20 @@ Graphical_axis_group::remove_element (Graphical_element*e)
     elem_l_arr_.substitute (e,0);
   else
     elem_l_arr_.unordered_substitute (e,0);
-  
+
+  do_remove (e);
+}
+
+void
+Graphical_axis_group::do_remove (Graphical_element *e)
+{
   for (int i=0; i<  2; i++)
     {
       Axis a=axes_[i];
-      Dimension_cache * d = e->dim_cache_[a];
-      d->parent_l_ = 0;
-      d->dependencies_l_arr_.unordered_substitute (dim_cache_[a], 0);
+      if (e->parent_l (a) != this)
+       continue;
+      e->set_parent (0, a);
+      e->dim_cache_[a]->dependencies_l_arr_.clear ();
     }
 }
 
@@ -83,17 +100,8 @@ void
 Graphical_axis_group::remove_all ()
 {
   for (int i=0; i < elem_l_arr_.size(); i++) 
-    {
-      Graphical_element*e=elem_l_arr_[i];
-      for (int i=0; i<  2; i++)
-       {
-         Axis a=axes_[i];
-         Dimension_cache * d = e->dim_cache_[a];
-         d->parent_l_ = 0;
-         d->dependencies_l_arr_.clear ();
-       }
-      
-    }
+    do_remove (elem_l_arr_[i]);
+
   elem_l_arr_.clear ();
 }
 
index c6654fa8f04d2887aa719ad739d7d6d345466141..c3d2f915e36c02159a563255e8409ed738662e70 100644 (file)
 #include "lily-proto.hh"
 #include "column-x-positions.hh"
 
-/**
-  Statistics for the number of columns calced.
- */
-struct Col_stats
-{
-  int count_i_;
-  int cols_i_;
-
-  Col_stats(); 
-  void add (Line_of_cols const&l);
-  String str() const;
-};
 
 /** Class representation of an algorithm which decides where to put
   the column, and where to break lines.
@@ -61,8 +49,6 @@ protected:
   virtual void do_set_pscore();
 
 public:
-  Col_stats approx_stats_;
-  Col_stats exact_stats_;
   
   Line_spacer* (*get_line_spacer)();
     
index eacf5ff1adcf16227313a8a780d0715155855472..539f8d95e48337ded838c0482f44782ba9bfb591 100644 (file)
   Treat a group of graphical elements as an aggegrate.
  */
 class Graphical_axis_group : public virtual Graphical_element {
+private:
+
+  /// modify fields of E for removal.
+  void do_remove (Graphical_element*e);
 public:
   // keep array in order.
   bool ordered_b_;             
@@ -35,7 +39,7 @@ public:
   void remove_all ();
 
   bool contains_b (Graphical_element const *) const;
-  void add_element (Graphical_element*);
+  void add_element (Graphical_element*, Axis = NO_AXES, Axis = NO_AXES);
   void remove_element (Graphical_element*);
 };
 
index ce08eb0b3f1ea1f9e0b80749aabd4bde4284ddf4..be7d981d66c325ef4bf8561152dfddf77b1db7de 100644 (file)
@@ -50,8 +50,8 @@ public:
   
   Direction break_status_dir () const;
   
-  Item * find_prebroken_piece (Direction) const;
-  Item * find_prebroken_piece (Line_of_score*) const;    
+  Item * find_broken_piece (Direction) const;
+  Score_element * find_broken_piece (Line_of_score*) const;    
 
   Item();
   Real hpos_f() const;
index d80ae6b1e28816c14b24a24c34a4e7e98a93b406..6d0bfa66342c6f705fe6ea92118c7f116092a774 100644 (file)
@@ -16,14 +16,15 @@ class Line_of_score : public Axis_group_spanner, public Super_element
 {
 public:
   Link_array<Paper_column> cols_;
-
+  int rank_i_;
+  
   Line_of_score();
     
   /// is #c# contained in #*this#?
   bool contains_b (Paper_column const *c) const;
     
   Line_of_score * set_breaking (Array<Column_x_positions> const&, int j);
-
+  static int compare (Line_of_score* const &,Line_of_score* const &);
 
   void output_all (bool last_line);
   void add_column (Paper_column*);
index 3494e6b11dc575ff563ec6c629149dbb5cfa4af8..af9b484faa5f19e137d0223565779be05721d9ef 100644 (file)
@@ -105,6 +105,8 @@ public:
    */
   void calculate_dependencies (int final, int busy, Score_element_method_pointer funcptr);
 
+
+  virtual Score_element *find_broken_piece (Line_of_score*) const;
 protected:
   Score_element* dependency (int) const;
   int dependency_size () const;
@@ -112,7 +114,8 @@ protected:
   virtual void output_processing ();
   virtual Interval do_height () const;
   virtual Interval do_width () const;
-    
+
+
   /// do printing of derived info.
   virtual void do_print () const;
   /// generate the molecule    
@@ -125,6 +128,9 @@ protected:
   /// generate rods & springs
   virtual void do_space_processing ();
 
+  /// do postbreak substs on array of pointers.
+  virtual void do_substitute_arrays ();
+
   virtual void do_breakable_col_processing ();
   /// do calculations after determining horizontal spacing
   virtual void do_post_processing ();
@@ -141,5 +147,26 @@ protected:
 };
 
 
+template<class T>
+void
+substitute_element_array (Link_array<T> &arr, Line_of_score * to)
+{
+  Link_array<T> newarr;
+  for (int i =0; i < arr.size (); i++)
+    {
+      T * t = arr[i];
+      if (t->line_l () != to)
+       {
+         t = dynamic_cast<T*> (t->find_broken_piece (to));
+       }
+      
+      if (t)
+       newarr.push (t);
+    }
+  arr = newarr;
+}
+
+
+
 #endif // STAFFELEM_HH
 
index 9cca78c8c48061bf5e2e11e7818e998b6061335b..339280466640b8b7953bac84660047402faedd68 100644 (file)
 #include "drul-array.hh"
 #include "rod.hh"
 
-struct Breaking_information
-{
-  Line_of_score *line_l_;
-  Spanner * broken_spanner_l_;
-  Drul_array<Item*> bounds_;
-  Breaking_information ()
-    {
-      line_l_ =0;
-      broken_spanner_l_ =0;
-      bounds_[LEFT] = bounds_[RIGHT] =0;
-    }
-};
 
 class Axis_group_spanner;
 /** A symbol which is attached between two columns. A spanner is a
@@ -57,9 +45,10 @@ public:
   Spanner (Spanner const &);
   bool broken_b () const;
 
+  static int compare (Spanner * const &,Spanner * const &);
   virtual Array<Rod> get_rods () const;
   virtual Array<Spring> get_springs () const;  
-  virtual Spanner* find_broken_piece (Line_of_score*) const;
+  virtual Score_element* find_broken_piece (Line_of_score*) const;
 protected:
   void set_my_columns ();
   VIRTUAL_COPY_CONS(Score_element);
index e6798b5be1f70818077b7d2370ca7eb37ba137fe..e8ea0357df279be236b1f967808e36d71b5100c3 100644 (file)
@@ -118,8 +118,9 @@ Item::do_breakable_col_processing()
   else
     try_visibility_lambda ();
 }
-Item*
-Item::find_prebroken_piece (Line_of_score*l) const
+
+Score_element*
+Item::find_broken_piece (Line_of_score*l) const
 {
   if (line_l() == l) 
     return (Item*)(this);
@@ -132,7 +133,7 @@ Item::find_prebroken_piece (Line_of_score*l) const
 }
 
 Item*
-Item::find_prebroken_piece (Direction d) const
+Item::find_broken_piece (Direction d) const
 {
   if (!d)
     return (Item *) (this);    // ugh
@@ -186,8 +187,8 @@ Item::handle_prebroken_dependents ()
       Direction d = LEFT;
       do
        {
-         Item * broken_self = find_prebroken_piece (d);
-         Item * broken_parent = parent->find_prebroken_piece (d);
+         Item * broken_self = find_broken_piece (d);
+         Item * broken_parent = parent->find_broken_piece (d);
 
          broken_self->set_parent (broken_parent, X_AXIS);
 
@@ -199,7 +200,7 @@ Item::handle_prebroken_dependents ()
              Score_element * yparent =dynamic_cast<Score_element*>(parent_l (Y_AXIS));
              Item *yparenti = dynamic_cast<Item*> (yparent);
              Item *broken_yparent = yparenti ?
-               yparenti->find_prebroken_piece (d) : 0;
+               yparenti->find_broken_piece (d) : 0;
              
              if (!yparent)
                programming_error ("Vertical refpoint lost!");
@@ -225,3 +226,4 @@ Item::break_status_dir () const
   else
     return CENTER;
 }
+
index 441dcd9465178ea3012bf783c8af0b5128194c8b..b648ea10c5822d970c494206671ddf54b9ff2e00 100644 (file)
@@ -15,7 +15,7 @@
 
 Line_of_score::Line_of_score()
 {
-  set_axes (Y_AXIS,Y_AXIS);
+  set_axes (Y_AXIS,X_AXIS);
 }
 
 bool
@@ -33,7 +33,8 @@ Line_of_score::set_breaking (Array<Column_x_positions> const &breaking, int j)
   Line_of_score *line_l=0;
 
   line_l = dynamic_cast <Line_of_score*> (clone());
-
+  line_l->rank_i_ = j;
+  
   line_l->cols_ = curline;
   line_l->set_bounds(LEFT,curline[0]);
   line_l->set_bounds(RIGHT,curline.top());
@@ -41,16 +42,10 @@ Line_of_score::set_breaking (Array<Column_x_positions> const &breaking, int j)
   for (int i=0; i < curline.size(); i++)
     {
       curline[i]->translate_axis (config[i],X_AXIS);
-      curline[i]->line_l_ = dynamic_cast<Line_of_score*>(line_l);
+      curline[i]->line_l_ = dynamic_cast<Line_of_score*> (line_l);
     }
 
-  Breaking_information b;
-  b.bounds_ = line_l->spanned_drul_;
-  b.broken_spanner_l_ = line_l;
-  b.line_l_ = line_l;
-  
   broken_into_l_arr_.push (line_l);
-
   return line_l;
 }
 
@@ -58,6 +53,7 @@ void
 Line_of_score::add_column (Paper_column*p)
 {
   cols_.push (p);
+  add_element (p);
 }
 
 void
@@ -88,7 +84,7 @@ Line_of_score::output_all (bool last_line)
 {
   Interval i(extent(Y_AXIS));
   if (i.empty_b())
-    warning ("Huh? Empty Line_of_score?");
+    warning (_ ("Huh?  Empty Line_of_score?"));
   else
     translate_axis (- i[MAX], Y_AXIS);
   
@@ -99,3 +95,9 @@ Line_of_score::output_all (bool last_line)
   else
     pscore_l_->outputter_l_->stop_line ();
 }
+
+int
+Line_of_score::compare (Line_of_score* const &p1,Line_of_score* const &p2)
+{
+  return p1->rank_i_ - p2->rank_i_;
+}
index 149783ac29f28a99399c60e21724c60ea1ef8777..f4ad427ab9df9f05a5fbef42bf4d113912091ef9 100644 (file)
@@ -63,23 +63,26 @@ String distill_inname_str (String name_str, String& ext_r);
  Internationalisation kludge in two steps:
    * use _i () to get entry in POT file
    * call gettext () explicitely for actual "translation"
+
+ Note: these messages all start with lower case (ie, don't
+       follow regular localisation guidelines).
  */
 Long_option_init theopts[] = {
-  {_i ("BASENAME"), "output", 'o',  _i ("write output to BASENAME[-x].extension")},
-  {0, "warranty", 'w',  _i ("show warranty and copyright")},
-  {0, "help", 'h',  _i ("this help")},
-  {0, "test", 't',  _i ("switch on experimental features")},
   {0, "debug", 'd',  _i ("enable debugging output")},
-  {_i ("FILE"), "init", 'i',  _i ("use FILE as init file")},
+  {_i ("EXT"), "output-format", 'f',  _i ("use output format EXT")},
+  {0, "help", 'h',  _i ("this help")},
   {_i ("DIR"), "include", 'I',  _i ("add DIR to search path")},
-  {0, "no-paper", 'm',  _i ("produce midi output only")},
+  {_i ("FILE"), "init", 'i',  _i ("use FILE as init file")},
   {0, "dependencies", 'M',  _i ("write Makefile dependencies for every input file")},
+  {0, "no-paper", 'm',  _i ("produce MIDI output only")},
+  {_i ("BASENAME"), "output", 'o',  _i ("write output to BASENAME[-x].extension")},
+  {0, "find-old-relative", 'Q',  _i ("show all changes in relative syntax")},
+  {0, "safe", 's',  _i ("inhibit file output naming and exporting")},
   {0, "no-timestamps", 'T',  _i ("don't timestamp the output")},
-    {0, "find-old-relative", 'Q',  _i ("show all changes in relative syntax")},
+  {0, "test", 't',  _i ("switch on experimental features")},
   {0, "ignore-version", 'V',  _i ("ignore mudela version")},
   {0, "version", 'v',  _i ("print version number")},
-  {_i ("EXT"), "output-format", 'f',  _i ("use output format EXT")},
-  {0, "safe", 's',  _i ("inhibit file output naming and exporting")},
+  {0, "warranty", 'w',  _i ("show warranty and copyright")},
   {0,0,0, 0}
 };
 
@@ -88,7 +91,7 @@ usage ()
 {
   cout << _f ("Usage: %s [OPTION]... [FILE]...", "lilypond");
   cout << "\n\n";
-  cout << _ ("Typeset music and or play MIDI from FILE.");
+  cout << _ ("Typeset music and or play MIDI from FILE");
   cout << "\n\n";
   cout << 
 #include "BLURB.hh"
@@ -110,15 +113,14 @@ usage ()
     "STRING_UTILS_INLINED "
 #endif
     "\n"
-    "datadir =" DIR_DATADIR
-    "\n"
-    "localedir =" DIR_LOCALEDIR
-
-    "\n\n";
-
-  cout << _("Report bugs to") << " bug-gnu-music@gnu.org" << endl;
+    "datadir: `" DIR_DATADIR "'\n"
+    "localedir: `" DIR_LOCALEDIR "'\n"
+    "\n";
 
   print_mudela_versions (cout);
+  cout << endl;
+
+  cout << _f ("Report bugs to %s", "bug-gnu-music@gnu.org") << endl;
 }
 
 void
@@ -226,8 +228,6 @@ main_prog (int, char**)
   /*
     need to do this first. Engravers use lily.scm contents.
    */
-  extern void ly_init_protection();
-  ly_init_protection();  
   init_lily_guile ();
   read_lily_scm_file ( "lily.scm");
   cout << endl;
index dc6d8d547acdb50d09fbf80299bccfe80eecaadf..456c213917f8e777d447d7e74ea57bc99d6242ee 100644 (file)
@@ -153,8 +153,8 @@ Multi_measure_rest::get_rods () const
 
   Item * l = spanned_drul_[LEFT]->column_l ();
   Item * r = spanned_drul_[RIGHT]->column_l ();
-  Item * lb = l->find_prebroken_piece (RIGHT);
-  Item * rb = r->find_prebroken_piece (LEFT);      
+  Item * lb = l->find_broken_piece (RIGHT);
+  Item * rb = r->find_broken_piece (LEFT);      
   
   Item* combinations[4][2]={{l,r}, {lb,r}, {l,rb},{lb,rb}};
   for (int i=0; i < 4; i++)
index d8f254175c2559553adeacb10cc93577e26f59eb..9368f95f866620aedbd07afa7c717b20ecae4f46 100644 (file)
@@ -282,22 +282,6 @@ Score_element::line_l() const
   return 0;
 }
 
-/*
-  
-  DEPENDENCIES
-
-  */
-
-void
-Score_element::remove_dependency (Score_element*e)
-{
-  int i;
-  while ((i = dependency_arr_.find_i (e)) >=0 )
-    dependency_arr_.unordered_del (i);
-
-  substitute_dependency (e, 0);
-}
-
 void
 Score_element::add_dependency (Score_element*e)
 {
@@ -324,38 +308,27 @@ Score_element::handle_broken_dependencies()
   if (!line)
     return;
 
-  Link_array<Score_element> remove_us_arr;
+  do_substitute_arrays ();
+
+  Link_array<Score_element> new_deps;
+
   for (int i=0; i < dependency_size(); i++) 
     {
       Score_element * elt = dependency (i);
       if (elt->line_l() != line)
        {
-         if (Spanner *sp = dynamic_cast<Spanner *> (elt)) 
-           {
-             Spanner * broken = sp->find_broken_piece (line);
-             substitute_dependency (sp, broken);
-
-             if (broken)
-               add_dependency (broken);
-           }
-         else if (Item *original = dynamic_cast <Item *> (elt))
-           {
-             Item * my_item = original->find_prebroken_piece (line);
-               
-             substitute_dependency (elt, my_item);
-             if (my_item)
-               add_dependency (my_item);
-           }
-         remove_us_arr.push (elt);
+         Score_element * broken = elt->find_broken_piece (line);
+         substitute_dependency (elt, broken);
+         elt  = broken ;
        }
+      if (elt)
+       new_deps.push (elt);
     }
+  dependency_arr_ = new_deps;
 
-  remove_us_arr.default_sort();
-  remove_us_arr.uniq();
-  for (int i=0;  i <remove_us_arr.size(); i++)
-    remove_dependency (remove_us_arr[i]);
 }
 
+
 /*
   This sux.
 
@@ -368,6 +341,9 @@ Score_element::handle_broken_dependencies()
   span: item1 item2 item3
 
   How to let span (a derived class) know that this happened?
+
+
+  TODO: cleanify.
  */
 void
 Score_element::handle_prebroken_dependencies()
@@ -385,7 +361,7 @@ Score_element::handle_prebroken_dependencies()
       if (it_l && it_l->broken_original_b ())
        if (Item *me = dynamic_cast<Item*> (this) )
          {
-           Score_element *new_l = it_l->find_prebroken_piece (me->break_status_dir ());
+           Score_element *new_l = it_l->find_broken_piece (me->break_status_dir ());
            if (new_l != elt) 
              {
                new_arr.push (new_l);
@@ -397,7 +373,7 @@ Score_element::handle_prebroken_dependencies()
            Direction d = LEFT;
            do {
              old_arr.push (0);
-             new_arr.push (it_l->find_prebroken_piece (d));
+             new_arr.push (it_l->find_broken_piece (d));
            } while (flip(&d)!= LEFT);
          }
     }
@@ -436,3 +412,15 @@ void
 Score_element::do_print () const
 {
 }
+
+void
+Score_element::do_substitute_arrays ()
+{
+}
+
+
+Score_element*
+Score_element::find_broken_piece (Line_of_score*) const
+{
+  return 0;
+}
index 7c7adf3c6c06763631a6a615a77e0dcb5ea5b4db..1c1d39205c9acb7f8def95fe82d33afd0c7892a3 100644 (file)
@@ -55,7 +55,9 @@ void
 Score_engraver::do_creation_processing ()
 {
   scoreline_l_ = pscore_p_->line_l_;
-  scoreline_l_->set_bounds(LEFT,command_column_l_);
+
+  scoreline_l_->set_bounds(LEFT, command_column_l_);
+  
   command_column_l_->set_elt_property (breakable_scm_sym, SCM_BOOL_T);
 
   Engraver_group_engraver::do_creation_processing();
@@ -146,7 +148,7 @@ Score_engraver::typeset_all()
            if (!s->spanned_drul_[d])
              {
                s->set_bounds(d, command_column_l_);
-               ::warning (_f ("Unbound spanner `%s\'", classname(s)));
+               ::warning (_f ("unbound spanner `%s'", classname(s)));
              }
          } while (flip(&d) != LEFT);
        }
index 8890ddbdd7aec24f890796fc0398616a12d23cd2..590a10c78b978236da19b7551b5035c17b93a42c 100644 (file)
@@ -41,10 +41,10 @@ Separating_group_spanner::get_rods () const
     {
       Single_malt_grouping_item *l =spacing_unit_l_arr_[i];
       Single_malt_grouping_item *lb
-       = dynamic_cast<Single_malt_grouping_item*>(l->find_prebroken_piece (RIGHT));
+       = dynamic_cast<Single_malt_grouping_item*>(l->find_broken_piece (RIGHT));
       Single_malt_grouping_item *r = spacing_unit_l_arr_[i+1];
       Single_malt_grouping_item *rb
-       = dynamic_cast<Single_malt_grouping_item*>(r->find_prebroken_piece (LEFT));
+       = dynamic_cast<Single_malt_grouping_item*>(r->find_broken_piece (LEFT));
       
       a.push (make_rod(spacing_unit_l_arr_[i], spacing_unit_l_arr_[i+1]));
       if (lb)
index edc59bb49a170da802deb020a79541bfaaf81a23..479855cdcd38307e46a9b399eb13ce114732123c 100644 (file)
@@ -74,8 +74,8 @@ Spacing_spanner::do_measure (int col1, int col2) const
     {
       Item * l = scol(i);
       Item * r = scol(i+1);
-      Item * lb = l->find_prebroken_piece (RIGHT);
-      Item * rb = r->find_prebroken_piece (LEFT);      
+      Item * lb = l->find_broken_piece (RIGHT);
+      Item * rb = r->find_broken_piece (LEFT);      
 
       Item* combinations[4][2]={{l,r}, {lb,r}, {l,rb},{lb,rb}};
 
@@ -215,7 +215,7 @@ Spacing_spanner::note_spacing (Score_column *lc, Score_column *rc, Moment shorte
   Moment shortest_playing_len = lc->shortest_playing_mom_;
   if (! shortest_playing_len)
     {
-      programming_error ("can't find a ruling note at " + lc->when_mom ().str ());
+      programming_error ("Can't find a ruling note at " + lc->when_mom ().str ());
       shortest_playing_len = 1;
     }
   
index ca2f5d5618124553beb744034d9f0cb8e68ada26..bc168836be631be71ffaa050d6c3ba003f50d650 100644 (file)
@@ -38,7 +38,7 @@ Spanner::break_into_pieces ()
 
   if  (left == right)
     {
-      warning (_ ("left spanpoint is right spanpoint\n"));
+      warning (_ ("Left spanpoint is right spanpoint"));
       return;
     }
   
@@ -49,35 +49,31 @@ Spanner::break_into_pieces ()
 
   for (int i=1; i < break_points.size(); i++) 
     {
-      Breaking_information info;
-      info.bounds_[LEFT] = break_points[i-1];
-      info.bounds_[RIGHT] = break_points[i];
+      Drul_array<Item*> bounds;
+      bounds[LEFT] = break_points[i-1];
+      bounds[RIGHT] = break_points[i];
       Direction d = LEFT;
       do
        {
-         Item *&pc_l = info.bounds_[d] ;
+         Item *&pc_l = bounds[d] ;
          if (!pc_l->line_l())
-           pc_l =  pc_l->find_prebroken_piece(- d);
+           pc_l =  pc_l->find_broken_piece(- d);
          
          assert (pc_l);
-         if (!info.line_l_)
-           info.line_l_ = pc_l-> line_l ();
-         else
-           assert( info.line_l_ = pc_l->line_l ());
-         
        }
       while ((flip(&d))!= LEFT);
 
       Spanner *span_p = dynamic_cast<Spanner*>(clone ());
-      span_p->set_bounds(LEFT,info.bounds_[LEFT]);
-      span_p->set_bounds(RIGHT,info.bounds_[RIGHT]);
+      span_p->set_bounds(LEFT,bounds[LEFT]);
+      span_p->set_bounds(RIGHT,bounds[RIGHT]);
+      
       pscore_l_->typeset_element (span_p);
-
-      info.broken_spanner_l_ = span_p;
       span_p->handle_broken_dependencies();
 
       broken_into_l_arr_.push (span_p);
     }
+
+  broken_into_l_arr_.sort (Spanner::compare);
 }
 
 void
@@ -87,7 +83,7 @@ Spanner::set_my_columns()
   do 
     {
       if (!spanned_drul_[i]->line_l())
-       set_bounds(i,spanned_drul_[i]->find_prebroken_piece((Direction)-i));
+       set_bounds(i,spanned_drul_[i]->find_broken_piece((Direction)-i));
     } 
   while (flip(&i) != 1);
 }       
@@ -101,14 +97,17 @@ Spanner::set_bounds(Direction d, Item*i)
       i->used_b_ = true;
     }
 
-  if (d== LEFT)
+  /**
+     Prevent the column -> line_of_score -> column -> line_of_score -> etc situation
+  */
+  if (d== LEFT && !dynamic_cast<Line_of_score*> (this))
     {
-      set_parent ( i, X_AXIS);
+      set_parent (i, X_AXIS);
     }
   
   if  (spanned_drul_[Direction(-d)] == spanned_drul_[d]
        && i)
-    warning (_f ("Spanner `%s\' with equal left and right spanpoints", classname (this)));
+    warning (_f ("Spanner `%s' has equal left and right spanpoints", classname (this)));
 }
 
 void
@@ -140,7 +139,7 @@ Spanner::do_width() const
   Real r = spanned_drul_[RIGHT]->relative_coordinate (0, X_AXIS);
 
   if (r< l)
-    warning ("Spanner with negative length");
+    warning (_ ("spanner with negative length"));
        
   return Interval (0, r-l);
 }
@@ -150,22 +149,36 @@ Spanner::line_l() const
 {
   if (!spanned_drul_[LEFT] || !spanned_drul_[RIGHT])
     return 0;
-  if (spanned_drul_[LEFT]->line_l() != spanned_drul_[RIGHT]->line_l())
+  if (spanned_drul_[LEFT]->line_l () != spanned_drul_[RIGHT]->line_l ())
     return 0;
   return spanned_drul_[LEFT]->line_l();
 }
 
 
-Spanner*
+Score_element*
 Spanner::find_broken_piece (Line_of_score*l) const
 {
+  int idx = binsearch_link_array (broken_into_l_arr_,  (Spanner*)l, Spanner::compare);
+  if (idx < 0)
+    return 0;
+  else
+    return broken_into_l_arr_ [idx];
+}
+
+/*
   for (int i=0; i < broken_into_l_arr_.size (); i++)
     {
       if (broken_into_l_arr_[i]->line_l () == l)
        return broken_into_l_arr_[i];
     }
+  return 0;
+*/
+
 
-  return 0;                               
+int
+Spanner::compare (Spanner * const &p1, Spanner * const &p2)
+{
+  return p1->line_l ()->rank_i_ - p2->line_l ()->rank_i_;
 }
 
 bool
@@ -218,23 +231,25 @@ Spanner::handle_broken_dependents ()
   
   if (refpoint)
     {
-      Spanner * broken_refpoint = refpoint->find_broken_piece (line_l ());
+      Score_element * broken_refpoint = refpoint->find_broken_piece (line_l ());
       if (broken_refpoint)
-       set_parent ( broken_refpoint,Y_AXIS);
+       set_parent (broken_refpoint,Y_AXIS);
       else
        programming_error ("Spanner y -refpoint lost.");
     }
 }
 
-// If this is a broken spanner, return the amount the left end is to
-// be shifted horizontally so that the spanner starts after the
-// initial clef and key on the staves. This is necessary for ties,
-// slurs, crescendo and decrescendo signs, for example.
+/*
+  If this is a broken spanner, return the amount the left end is to be
+  shifted horizontally so that the spanner starts after the initial
+  clef and key on the staves. This is necessary for ties, slurs,
+  crescendo and decrescendo signs, for example.
+*/
 Real
 Spanner::get_broken_left_end_align () const
 {
   int i;
-  Line_of_score *l;
+
   Score_column *sc = dynamic_cast<Score_column*> (spanned_drul_[LEFT]->column_l());
 
   // Relevant only if left span point is first column in line
index 2065ef5d42a9e08b71d1761af5b8b2324221b449..2940d13a9a5047dd2831de2012a79e1b95591bae 100644 (file)
@@ -40,10 +40,24 @@ Staff_symbol::do_height() const
 Molecule*
 Staff_symbol::do_brew_molecule_p() const
 {
-  Real w = extent (X_AXIS).length ();
-  Paper_def * p = paper_l ();
-  Real t = p->get_var ("rulethickness");
-  Molecule rule  = lookup_l ()->filledbox (Box (Interval (0,w),
+  Graphical_element * common
+    = spanned_drul_[LEFT]->common_refpoint (spanned_drul_[RIGHT], X_AXIS);
+
+#if 0
+  Interval r =  spanned_drul_[RIGHT]->extent (X_AXIS);
+  Interval l =  spanned_drul_[LEFT]->extent (X_AXIS);
+  
+  Real left_shift =l.empty_b () ? 0.0: l[LEFT];
+  Real right_shift =r.empty_b () ? 0.0: r[RIGHT];  
+#endif
+  Real width =
+    // right_shift     - left_shift
+    + spanned_drul_[RIGHT]->relative_coordinate (common , X_AXIS)
+    - spanned_drul_[LEFT]->relative_coordinate (common, X_AXIS)
+    ;
+
+  Real t = paper_l ()->get_var ("rulethickness");
+  Molecule rule  = lookup_l ()->filledbox (Box (Interval (0,width),
                                                Interval (-t/2, t/2)));
 
   Real height = (no_lines_i_-1) * staff_line_leading_f_ /2;
@@ -55,6 +69,7 @@ Staff_symbol::do_brew_molecule_p() const
       m->add_molecule (a);
     }
 
+  //  m->translate_axis (left_shift, X_AXIS);
   return m;
 }
 
index 534db01acbd8903c218ecab9a03f0cf0c5c04c3e..8cb7ce851de497fd441b6149c8de122942b8e759 100644 (file)
@@ -15,6 +15,5 @@ $(outdir)/%.png: %.xpm
 $(outdir)/%.txt: $(outdir)/%.1
        troff -man -Tascii $< | grotty -b -u -o > $@
 
-include $(stepdir)/yodl-rules.make
 include $(stepdir)/texinfo-rules.make
 
index db4a7e0b99994fc96079641b7cd7c60871e464ef..85d77ef212e0019d39bcedcd551dcd0c04ff968a 100644 (file)
@@ -7,7 +7,7 @@ default: $(EXECUTABLE)
 
 $(EXECUTABLE): $(depth)/config.h $(O_FILES) $(outdir)/version.hh
        $(foreach a, $(MODULE_LIBS), $(MAKE) -C $(a) && ) true
-       $(LD_COMMAND) $(O_FILES) $(LOADLIBES)
+       $(LD_COMMAND) $(O_FILES) $(LOADLIBES) $(USER_LDFLAGS)
 
 exe: $(EXECUTABLE)
 
index 203c64be65e085cce15b3fc7273f023564ce0edd..117bfc5a5cc8441bf8a9fefed4d9947e320cd58f 100644 (file)
@@ -1,5 +1,5 @@
 # empty
-LDFLAGS = $(ILDFLAGS) $(USER_LDFLAGS) $(EXTRA_LDFLAGS) $(MODULE_LDFLAGS) $($(PACKAGE)_LDFLAGS)
+LDFLAGS = $(ILDFLAGS) $(EXTRA_LDFLAGS) $(MODULE_LDFLAGS) $($(PACKAGE)_LDFLAGS)
 
 MODULE_LIBES =$(addsuffix /$(outdir)/library.a, $(MODULE_LIBS))
 LOADLIBES = $(MODULE_LIBES) $($(PACKAGE)_LIBES) $(EXTRA_LIBES)