X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fslur-scoring.cc;h=7271cc7a7cf139a9109bf9fe794e22424f61abbd;hb=47db9a3883d726ca53e2133a3b2298f78dd6a32e;hp=eaadde5c587031a50ae5ad35be5e55ed59d22f84;hpb=1152d91a1c8ac90528660df7dfa6be2181f89c05;p=lilypond.git diff --git a/lily/slur-scoring.cc b/lily/slur-scoring.cc index eaadde5c58..7271cc7a7c 100644 --- a/lily/slur-scoring.cc +++ b/lily/slur-scoring.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2012 Han-Wen Nienhuys + Copyright (C) 1996--2015 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -22,6 +22,7 @@ #include +#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 (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;