]> git.donarmstrong.com Git - lilypond.git/commitdiff
(class Tie_configuration): add
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 1 May 2006 14:57:03 +0000 (14:57 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 1 May 2006 14:57:03 +0000 (14:57 +0000)
column_ranks_ to specification and configuration, to distinguish
between ties for different heads in arpegiated chords.

ChangeLog
lily/include/tie-configuration.hh
lily/include/tie-formatting-problem.hh
lily/tie-configuration.cc
lily/tie-formatting-problem.cc

index 598c548caa0ca3761e7419171a7dcb6713c321d7..ba69b42e8b96dae85c4d91840b3937bd0fdf8365 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,9 @@
 2006-05-01  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
+       * lily/include/tie-configuration.hh (class Tie_configuration): add
+       column_ranks_ to specification and configuration, to distinguish
+       between ties for different heads in arpegiated chords.
+
        * lily/relocate.cc (framework_relocation): use INSTALLER_PREFIX.
 
        * *.py: more 4 space indents.
index 1e48922d68c2159767f2b058adfaf6c76e870082..0594de6eaf8eb4d9bc27573f9a80ad7c2b7c4b6e 100644 (file)
@@ -25,6 +25,7 @@ class Tie_configuration
   Real score_;
   bool scored_;
   friend class Tie_formatting_problem;
+
 public:
   Real score () const { return score_; }
   string card () const { return score_card_; }
@@ -32,7 +33,8 @@ public:
   int position_;
   Direction dir_;
   Real delta_y_;
-
+  Drul_array<int> column_ranks_;
+  
   /* computed. */
   Interval attachment_x_;
 
index befb430c5d51308f5cff9c5b2e7b6a85af7863b8..fd7a373b5254712b7cd2e3886e7a6cf4efe0378e 100644 (file)
 #include <map>
 #include <set>
 
-typedef map< pair<int, int>, Tie_configuration *> Tie_configuration_map;
+template<class T, int N>
+struct Tuple
+{
+  T t_array[N];
+  Tuple (T const *src)
+  {
+    for (int i = 0; i < N; i++)
+      t_array[i] = src[i];
+  }
+};
+
+template<class T, int N>
+inline bool
+operator<(Tuple<T, N> const &t1,
+         Tuple<T, N> const &t2)
+{
+  for (int i = 0; i < N ; i++)
+    {
+      if (t1.t_array[i] > t2.t_array[i])
+       return false;
+      if (t1.t_array[i] < t2.t_array[i])
+       return true;
+    }
+
+  return false;
+}
+
+
+typedef map< Tuple<int,4>, Tie_configuration *> Tie_configuration_map;
 
 struct Tie_specification
 {
   int position_;
   Drul_array<Grob*> note_head_drul_;
+  Drul_array<int> column_ranks_;
   
   bool has_manual_position_;
   bool has_manual_dir_;
@@ -34,6 +63,7 @@ struct Tie_specification
   Direction manual_dir_;
   
   Tie_specification ();
+  int column_span () const;
 };
 
 struct Tie_configuration_variation
@@ -57,8 +87,8 @@ class Tie_formatting_problem
   Grob *x_refpoint_;
 
   
-  Tie_configuration *get_configuration (int position, Direction dir) const;
-  Tie_configuration *generate_configuration (int position, Direction dir) const;
+  Tie_configuration *get_configuration (int position, Direction dir, Drul_array<int> cols) const;
+  Tie_configuration *generate_configuration (int position, Direction dir, Drul_array<int> cols) const;
   vector<Tie_configuration_variation> generate_collision_variations (Ties_configuration const &ties) const;
   vector<Tie_configuration_variation> generate_extremal_tie_variations (Ties_configuration const &ties) const;
 
@@ -77,6 +107,7 @@ class Tie_formatting_problem
 public:
   Tie_details details_;
   void print_ties_configuration (Ties_configuration const *);
+
 public:
   Tie_formatting_problem ();
   ~Tie_formatting_problem ();
@@ -85,6 +116,7 @@ public:
   Ties_configuration generate_optimal_chord_configuration ();
   Ties_configuration generate_ties_configuration (Ties_configuration const &);
   Tie_configuration find_optimal_tie_configuration (Tie_specification const &) const;
+
   void from_ties (vector<Grob*> const &ties);
   void from_tie (Grob *tie);
   void from_semi_ties (vector<Grob*> const &, Direction head_dir);
index c8f9da20de0e84cd5d2b809d78bb83ab9749a441..438d22e2c7e59933a187f390ecbd1eebb66ef4de 100644 (file)
@@ -29,6 +29,7 @@ Tie_configuration::Tie_configuration ()
   delta_y_ = 0.0;
   score_ = 0.0;
   scored_ = false;
+  column_ranks_ = Drul_array<int> (0, 0);
 }
 
 
index 439e76cf5069ea5023c0ca5c96b354114876fc2e..aca4338730dae4cd105ce636a0b2e9eaf61c3a2d 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "tie-formatting-problem.hh"
 
+#include "paper-column.hh"
 #include "bezier.hh" 
 #include "directional-element-interface.hh"
 #include "item.hh"
@@ -252,9 +253,10 @@ Tie_formatting_problem::from_ties (vector<Grob*> const &ties)
       do
        {
          spec.note_head_drul_[d] = Tie::head (ties[i], d);
+         spec.column_ranks_[d] =
+           dynamic_cast<Spanner*> (ties[i])->get_bound (d)->get_column ()->get_rank ();
        }
       while (flip (&d) != LEFT);
-      
       specifications_.push_back (spec);
     }
 }
@@ -317,32 +319,41 @@ Tie_formatting_problem::get_tie_specification (int i) const
 }
 
 
+/*
+  Return configuration, create it if necessary. 
+*/
 Tie_configuration*
-Tie_formatting_problem::get_configuration (int pos, Direction dir) const
+Tie_formatting_problem::get_configuration (int pos, Direction dir, Drul_array<int> columns) const
 {
-  pair<int,int> key (pos, dir);
+  int key_components[] = {
+    pos, dir, columns[LEFT], columns[RIGHT]
+  };
+  Tuple<int,4> key (key_components);
+    
   Tie_configuration_map::const_iterator f = possibilities_.find (key);
-                                                             
   if (f != possibilities_.end ())
     {
       return (*f).second;
     }
 
   
-  Tie_configuration *conf = generate_configuration (pos, dir);
+  Tie_configuration *conf = generate_configuration (pos, dir, columns);
   ((Tie_formatting_problem*) this)->possibilities_[key] = conf;
   return conf;
 }
 
 Tie_configuration*
-Tie_formatting_problem::generate_configuration (int pos, Direction dir) const
+Tie_formatting_problem::generate_configuration (int pos, Direction dir,
+                                               Drul_array<int> columns) const
 {
   Tie_configuration *conf = new Tie_configuration;
   conf->position_ = pos;
   conf->dir_ = dir;
+  
+  conf->column_ranks_ = columns;
+  
   Real y = conf->position_ * 0.5 * details_.staff_space_;
 
-
   bool y_tune = true;
   if (dot_positions_.find (pos) != dot_positions_.end ())
     {
@@ -571,7 +582,8 @@ Tie_formatting_problem::find_optimal_tie_configuration (Tie_specification const
 
   for (int i = 0; i < details_.single_tie_region_size_; i ++)
     {
-      confs.push_back (generate_configuration (pos + i * dir, dir));
+      confs.push_back (generate_configuration (pos + i * dir, dir,
+                                              spec.column_ranks_));
       
       if (spec.has_manual_position_)
        {
@@ -616,8 +628,15 @@ Tie_specification::Tie_specification ()
   manual_dir_ = CENTER;
   note_head_drul_[LEFT] =
     note_head_drul_[RIGHT] = 0;
+  column_ranks_[RIGHT] =
+    column_ranks_[LEFT] = 0;
 }
 
+int
+Tie_specification::column_span () const
+{
+  return column_ranks_[RIGHT] - column_ranks_[LEFT];
+}
 
 void
 Tie_formatting_problem::score_ties_aptitude (Ties_configuration *ties) const
@@ -709,7 +728,8 @@ Tie_formatting_problem::generate_ties_configuration (Ties_configuration const &t
   Ties_configuration copy;
   for (vsize i = 0; i < ties_config.size (); i++)
     {
-      Tie_configuration * ptr = get_configuration (ties_config[i].position_, ties_config[i].dir_);
+      Tie_configuration * ptr = get_configuration (ties_config[i].position_, ties_config[i].dir_,
+                                                  ties_config[i].column_ranks_);
       if (specifications_[i].has_manual_position_)
        {
          ptr->delta_y_
@@ -814,10 +834,19 @@ Tie_formatting_problem::set_ties_config_standard_directions (Ties_configuration
    */
   for (vsize i = 1; i < tie_configs->size (); i++)
     {
-      Real diff = (tie_configs->at (i-1).position_
-                  - tie_configs->at (i).position_);
-
-      if (fabs (diff) <= 1)
+      Real diff = (tie_configs->at (i).position_
+                  -tie_configs->at (i-1).position_);
+                  
+      Real span_diff 
+       = specifications_[i].column_span () - specifications_[i-1].column_span ();
+      if (span_diff && fabs (diff) <= 2)
+       {
+         if  (span_diff > 0)
+           tie_configs->at (i).dir_ = UP;
+         else if (span_diff < 0)
+           tie_configs->at (i-1).dir_ = DOWN;  
+       }
+      else if (fabs (diff) <= 1)
        {
          if (!tie_configs->at (i-1).dir_)
            tie_configs->at (i-1).dir_ = DOWN;
@@ -861,7 +890,8 @@ Tie_formatting_problem::generate_extremal_tie_variations (Ties_configuration con
            Tie_configuration_variation var;
            var.index_ = (d == DOWN) ? 0 : ties.size () - 1;
            var.suggestion_ = get_configuration (boundary (ties, d, 0).position_
-                                                + d * i, d);
+                                                + d * i, d,
+                                                boundary (ties, d, 0).column_ranks_);
            vars.push_back (var);
          }
     }
@@ -894,7 +924,10 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const
                  var.index_ = i;
                  var.suggestion_ = get_configuration (specifications_[i].position_
                                                       - ties[i].dir_,
-                                                      -ties[i].dir_);
+                                                      - ties[i].dir_,
+
+                                                      ties[i].column_ranks_
+                                                      );
 
                  vars.push_back (var);
                }
@@ -905,7 +938,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const
                  var.index_ = i-1;
                  var.suggestion_ = get_configuration (specifications_[i-1].position_
                                                       - ties[i-1].dir_,
-                                                      - ties[i-1].dir_);
+                                                      - ties[i-1].dir_,
+                                                      specifications_[i-1].column_ranks_);
 
                  vars.push_back (var);
                }
@@ -915,8 +949,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const
                {
                  Tie_configuration_variation var;
                  var.index_ = i-1;
-                 var.suggestion_ = get_configuration (specifications_[i-1].position_
-                                                      - 1, DOWN);
+                 var.suggestion_ = get_configuration (specifications_[i-1].position_ - 1, DOWN,
+                                                      specifications_[i-1].column_ranks_);
                  vars.push_back (var);
                }
              if (i == ties.size() && !specifications_[i].has_manual_position_
@@ -925,7 +959,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const
                  Tie_configuration_variation var;
                  var.index_ = i;
                  var.suggestion_ = get_configuration (specifications_[i].position_
-                                                      + 1, UP);
+                                                      + 1, UP,
+                                                      specifications_[i].column_ranks_);
                  vars.push_back (var);
                }
            }
@@ -935,7 +970,8 @@ Tie_formatting_problem::generate_collision_variations (Ties_configuration const
              Tie_configuration_variation var;
              var.index_ = i;
              var.suggestion_ = get_configuration (ties[i].position_  + ties[i].dir_,
-                                                  ties[i].dir_);
+                                                  ties[i].dir_,
+                                                  ties[i].column_ranks_);
              vars.push_back (var);
            }