]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/slur-scoring.cc
Run grand replace for 2015.
[lilypond.git] / lily / slur-scoring.cc
index eaadde5c587031a50ae5ad35be5e55ed59d22f84..7271cc7a7cf139a9109bf9fe794e22424f61abbd 100644 (file)
@@ -1,7 +1,7 @@
 /*
   This file is part of LilyPond, the GNU music typesetter.
 
-  Copyright (C) 1996--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+  Copyright (C) 1996--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
   Jan Nieuwenhuizen <janneke@gnu.org>
 
   LilyPond is free software: you can redistribute it and/or modify
@@ -22,6 +22,7 @@
 
 #include <queue>
 
+#include "axis-group-interface.hh"
 #include "accidental-interface.hh"
 #include "beam.hh"
 #include "clef.hh"
@@ -41,7 +42,6 @@
 #include "staff-symbol-referencer.hh"
 #include "staff-symbol.hh"
 #include "stem.hh"
-#include "time-signature.hh"
 #include "warn.hh"
 
 /*
@@ -106,7 +106,7 @@ Slur_score_state::slur_direction () const
 Encompass_info
 Slur_score_state::get_encompass_info (Grob *col) const
 {
-  Grob *stem = unsmob_grob (col->get_object ("stem"));
+  Grob *stem = Grob::unsmob (col->get_object ("stem"));
   Encompass_info ei;
 
   if (!stem)
@@ -165,6 +165,8 @@ Slur_score_state::get_bound_info () const
         {
           extremes[d].note_column_ = extremes[d].bound_;
           extremes[d].stem_ = Note_column::get_stem (extremes[d].note_column_);
+          extremes[d].flag_ = Note_column::get_flag (extremes[d].note_column_);
+
           if (extremes[d].stem_)
             {
               extremes[d].stem_dir_ = get_grob_direction (extremes[d].stem_);
@@ -173,6 +175,8 @@ Slur_score_state::get_bound_info () const
                 {
                   Axis ax = Axis (a);
                   Interval s = extremes[d].stem_->extent (common_[ax], ax);
+                  if (extremes[d].flag_)
+                    s.unite (extremes[d].flag_->extent (common_[ax], ax));
                   if (s.is_empty ())
                     {
                       /*
@@ -221,8 +225,8 @@ Slur_score_state::fill (Grob *me)
 
   Slur::replace_breakable_encompass_objects (me);
   staff_space_ = Staff_symbol_referencer::staff_space (me);
-  Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
-  thickness_ = robust_scm2double (me->get_property ("thickness"), 1.0) * lt;
+  line_thickness_ = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
+  thickness_ = robust_scm2double (me->get_property ("thickness"), 1.0) * line_thickness_;
 
   dir_ = slur_direction ();
   parameters_.fill (me);
@@ -281,7 +285,7 @@ Slur_score_state::fill (Grob *me)
           && minmax (dir_, encompass_place, y_place) == encompass_place
           && (!extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("key-signature-interface"))
               && !Clef::has_interface (extra_encompass_infos_[i].grob_)
-              && !Time_signature::has_interface (extra_encompass_infos_[i].grob_)))
+              && !extra_encompass_infos_[i].grob_->internal_has_interface (ly_symbol2scm ("time-signature-interface"))))
         {
           for (LEFT_and_RIGHT (d))
             additional_ys[d] = minmax (dir_,
@@ -326,7 +330,7 @@ MAKE_SCHEME_CALLBACK (Slur, calc_control_points, 1)
 SCM
 Slur::calc_control_points (SCM smob)
 {
-  Spanner *me = unsmob_spanner (smob);
+  Spanner *me = Spanner::unsmob (smob);
 
   Slur_score_state state;
   state.fill (me);
@@ -422,10 +426,12 @@ Slur_score_state::get_best_curve () const
   return best;
 }
 
-Grob *
-Slur_score_state::breakable_bound_item (Direction d) const
+Interval
+Slur_score_state::breakable_bound_extent (Direction d) const
 {
   Grob *col = slur_->get_bound (d)->get_column ();
+  Interval ret;
+  ret.set_empty ();
 
   extract_grob_set (slur_, "encompass-objects", extra_encompasses);
 
@@ -433,10 +439,10 @@ Slur_score_state::breakable_bound_item (Direction d) const
     {
       Item *item = dynamic_cast<Item *> (extra_encompasses[i]);
       if (item && col == item->get_column ())
-        return item;
+        ret.unite (robust_relative_extent (item, common_[X_AXIS], X_AXIS));
     }
 
-  return 0;
+  return ret;
 }
 
 /*
@@ -452,11 +458,16 @@ Slur_score_state::get_y_attachment_range () const
     {
       if (extremes_[d].note_column_)
         {
-          end_ys[d] = dir_
-                      * max (max (dir_ * (base_attachments_[d][Y_AXIS]
-                                          + parameters_.region_size_ * dir_),
-                                  dir_ * (dir_ + extremes_[d].note_column_->extent (common_[Y_AXIS], Y_AXIS)[dir_])),
-                             dir_ * base_attachments_[-d][Y_AXIS]);
+          Interval nc_extent = extremes_[d].note_column_
+                               ->extent (common_[Y_AXIS], Y_AXIS);
+          if (nc_extent.is_empty ())
+            slur_->warning ("slur trying to encompass an empty note column.");
+          else
+            end_ys[d] = dir_
+                        * max (max (dir_ * (base_attachments_[d][Y_AXIS]
+                                            + parameters_.region_size_ * dir_),
+                                    dir_ * (dir_ + nc_extent[dir_])),
+                               dir_ * base_attachments_[-d][Y_AXIS]);
         }
       else
         end_ys[d] = base_attachments_[d][Y_AXIS] + parameters_.region_size_ * dir_;
@@ -526,14 +537,12 @@ Slur_score_state::get_base_attachments () const
           Real x = 0;
           Real y = 0;
 
-          if (Grob *g = breakable_bound_item (d))
-            {
-              x = robust_relative_extent (g, common_[X_AXIS], X_AXIS)[RIGHT];
-            }
-          else if (d == RIGHT)
-            x = robust_relative_extent (extremes_[d].bound_, common_[X_AXIS], X_AXIS)[d];
-          else
-            x = slur_->get_broken_left_end_align ();
+          Interval ext = breakable_bound_extent (d);
+          if (ext.is_empty ())
+            ext = Axis_group_interface::
+                  generic_bound_extent (extremes_[d].bound_,
+                                        common_[X_AXIS], X_AXIS);
+          x = ext[-d];
 
           Grob *col = (d == LEFT) ? columns_[0] : columns_.back ();
 
@@ -590,8 +599,7 @@ Slur_score_state::move_away_from_staffline (Real y,
       * 2.0 / staff_space_;
 
   if (fabs (pos - my_round (pos)) < 0.2
-      && Staff_symbol_referencer::on_line (on_staff, (int) rint (pos))
-      && Staff_symbol_referencer::line_count (on_staff) - 1 >= rint (pos))
+      && Staff_symbol_referencer::on_staff_line (on_staff, (int) rint (pos)))
     y += 1.5 * staff_space_ * dir_ / 10;
 
   return y;