X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fbeam.cc;h=d217d555d3bf211ad7ab88c1c0fae0fc1d70fe55;hb=5bbfc22fce036b9b69df5e420de93e11da23c05e;hp=4a2e752947bcf753815e151e207f1cae6f7b562d;hpb=01df8ad908c92687d0c352e5ad5f067e52809423;p=lilypond.git diff --git a/lily/beam.cc b/lily/beam.cc index 4a2e752947..d217d555d3 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1997--2012 Han-Wen Nienhuys + Copyright (C) 1997--2014 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -49,7 +49,6 @@ #include "lookup.hh" #include "main.hh" #include "misc.hh" -#include "note-column.hh" #include "note-head.hh" #include "output-def.hh" #include "pointer-group-interface.hh" @@ -142,101 +141,15 @@ Beam::get_beam_count (Grob *me) return m; } -//------ for whole note chord tremolos - -bool -Beam::whole_note_close_chord_tremolo (Grob *me) -{ - if (!scm_is_integer (me->get_property ("gap-count"))) - return false; - - extract_grob_set (me, "stems", stems); - for (vsize i = 0; i < stems.size (); i++) - if (Stem::duration_log (stems[i])) - return false; - - Grob *staff = Staff_symbol_referencer::get_staff_symbol (me); - if (staff) - { - Grob *outside_stems[2] = {Stem::extremal_heads (stems[0])[DOWN], - Stem::extremal_heads (stems.back ())[DOWN]}; - - Interval lines = Staff_symbol::line_span (staff); - for (int i = 0; i < 2; i++) - { - Real my_pos = Staff_symbol_referencer::get_position (outside_stems[i]); - if (my_pos > lines[UP] + 1) - return false; - else if (my_pos < lines[DOWN] - 1) - return false; - } - } - - return (Staff_symbol_referencer::get_position (Stem::extremal_heads (stems.back ())[DOWN]) - - Staff_symbol_referencer::get_position (Stem::extremal_heads (stems[0])[DOWN])) - < 2; -} - -MAKE_SCHEME_CALLBACK (Beam, calc_beam_gap, 1); -SCM -Beam::calc_beam_gap (SCM smob) -{ - Spanner *me = unsmob_spanner (smob); - SCM default_value = scm_cons (scm_from_double (0.8), scm_from_double (0.8)); - if (!whole_note_close_chord_tremolo (me)) - return default_value; - - Interval left = Note_column::accidental_width - (me->get_bound (RIGHT)->get_parent (X_AXIS)); - - if (left.length () > 0.4) - return scm_cons (scm_from_double (0.8), scm_from_double (1.3 + left.length ())); - else - return default_value; -} - -MAKE_SCHEME_CALLBACK (Beam, calc_springs_and_rods, 1); -SCM -Beam::calc_springs_and_rods (SCM smob) -{ - Grob *me = unsmob_grob (smob); - - if (!whole_note_close_chord_tremolo (me)) - return SCM_BOOL_F; - - return scm_call_1 (Spanner::set_spacing_rods_proc, smob); -} - -MAKE_SCHEME_CALLBACK (Beam, calc_minimum_length, 1); -SCM -Beam::calc_minimum_length (SCM smob) -{ - Spanner *me = unsmob_spanner (smob); - SCM default_value = scm_from_double (0.0); - - if (!whole_note_close_chord_tremolo (me)) - return SCM_BOOL_F; - - Interval left = Note_column::accidental_width - (me->get_bound (RIGHT)->get_parent (X_AXIS)); - - if (left.length () > 0.4) - return scm_from_double (left.length () + 4.0); - else - return default_value; -} - -//------ and everything else - MAKE_SCHEME_CALLBACK (Beam, calc_normal_stems, 1); SCM Beam::calc_normal_stems (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); extract_grob_set (me, "stems", stems); SCM val = Grob_array::make_array (); - Grob_array *ga = unsmob_grob_array (val); + Grob_array *ga = Grob_array::unsmob (val); for (vsize i = 0; i < stems.size (); i++) if (Stem::is_normal_stem (stems[i])) ga->add (stems[i]); @@ -248,7 +161,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_direction, 1); SCM Beam::calc_direction (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); /* Beams with less than 2 two stems don't make much sense, but could happen when you do @@ -361,7 +274,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_beaming, 1) SCM Beam::calc_beaming (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); extract_grob_set (me, "stems", stems); @@ -440,7 +353,7 @@ Beam::calc_beam_segments (SCM smob) { /* ugh, this has a side-effect that we need to ensure that Stem #'beaming is correct */ - Grob *me_grob = unsmob_grob (smob); + Grob *me_grob = Grob::unsmob (smob); (void) me_grob->get_property ("beaming"); Spanner *me = dynamic_cast (me_grob); @@ -452,7 +365,7 @@ Beam::calc_beam_segments (SCM smob) commonx = me->get_bound (d)->common_refpoint (commonx, X_AXIS); int gap_count = robust_scm2int (me->get_property ("gap-count"), 0); - Interval gap_lengths = robust_scm2interval (me->get_property ("beam-gap"), Interval (0.0, 0.0)); + Real gap_length = robust_scm2double (me->get_property ("gap"), 0.0); Position_stem_segments_map stem_segments; Real lt = me->layout ()->get_dimension (ly_symbol2scm ("line-thickness")); @@ -608,7 +521,7 @@ Beam::calc_beam_segments (SCM smob) current.horizontal_[event_dir] += event_dir * seg.width_ / 2; if (seg.gapped_) { - current.horizontal_[event_dir] -= event_dir * gap_lengths[event_dir]; + current.horizontal_[event_dir] -= event_dir * gap_length; if (Stem::is_invisible (seg.stem_)) { @@ -621,7 +534,7 @@ Beam::calc_beam_segments (SCM smob) for (vsize k = 0; k < heads.size (); k++) current.horizontal_[event_dir] = event_dir * min (event_dir * current.horizontal_[event_dir], - - gap_lengths[event_dir] / 2 + - gap_length / 2 + event_dir * heads[k]->extent (commonx, X_AXIS)[-event_dir]); @@ -743,9 +656,9 @@ Beam::print (SCM grob) Interval placements = robust_scm2interval (me->get_property ("normalized-endpoints"), Interval (0.0, 0.0)); Stencil the_beam; - int extreme = (segments[0].vertical_count_ == 0 - ? segments[0].vertical_count_ - : segments.back ().vertical_count_); + vsize extreme = (segments[0].vertical_count_ == 0 + ? segments[0].vertical_count_ + : segments.back ().vertical_count_); for (vsize i = 0; i < segments.size (); i++) { @@ -826,7 +739,7 @@ Beam::print (SCM grob) Direction stem_dir = stems.size () ? to_dir (stems[0]->get_property ("direction")) : UP; - Stencil score = *unsmob_stencil (Text_interface::interpret_markup + Stencil score = *Stencil::unsmob (Text_interface::interpret_markup (me->layout ()->self_scm (), properties, annotation)); if (!score.is_empty ()) @@ -1034,7 +947,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_stem_shorten, 1) SCM Beam::calc_stem_shorten (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); /* shortening looks silly for x staff beams @@ -1069,7 +982,7 @@ MAKE_SCHEME_CALLBACK (Beam, quanting, 3); SCM Beam::quanting (SCM smob, SCM ys_scm, SCM align_broken_intos) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); Drul_array ys = robust_scm2drul (ys_scm, Drul_array (infinity_f, -infinity_f)); bool cbs = to_boolean (align_broken_intos); @@ -1151,7 +1064,7 @@ MAKE_SCHEME_CALLBACK (Beam, set_stem_lengths, 1); SCM Beam::set_stem_lengths (SCM smob) { - Grob *me = unsmob_grob (smob); + Grob *me = Grob::unsmob (smob); /* trigger callbacks. */ (void) me->get_property ("direction"); @@ -1304,17 +1217,17 @@ MAKE_SCHEME_CALLBACK_WITH_OPTARGS (Beam, rest_collision_callback, 2, 1, ""); SCM Beam::rest_collision_callback (SCM smob, SCM prev_offset) { - Grob *rest = unsmob_grob (smob); + Grob *rest = Grob::unsmob (smob); if (scm_is_number (rest->get_property ("staff-position"))) return scm_from_int (0); Real offset = robust_scm2double (prev_offset, 0.0); - Grob *st = unsmob_grob (rest->get_object ("stem")); + Grob *st = Grob::unsmob (rest->get_object ("stem")); Grob *stem = st; if (!stem) return scm_from_double (0.0); - Grob *beam = unsmob_grob (stem->get_object ("beam")); + Grob *beam = Grob::unsmob (stem->get_object ("beam")); if (!beam || !Beam::has_interface (beam) || !Beam::normal_stem_count (beam)) @@ -1399,11 +1312,11 @@ Beam::pure_rest_collision_callback (SCM smob, { Real previous = robust_scm2double (prev_offset, 0.0); - Grob *me = unsmob_grob (smob); - Grob *stem = unsmob_grob (me->get_object ("stem")); + Grob *me = Grob::unsmob (smob); + Grob *stem = Grob::unsmob (me->get_object ("stem")); if (!stem) return scm_from_double (previous); - Grob *beam = unsmob_grob (stem->get_object ("beam")); + Grob *beam = Grob::unsmob (stem->get_object ("beam")); if (!beam || !Beam::normal_stem_count (beam) || !is_direction (beam->get_property_data ("direction"))) @@ -1511,7 +1424,7 @@ MAKE_SCHEME_CALLBACK (Beam, calc_cross_staff, 1) SCM Beam::calc_cross_staff (SCM smob) { - return scm_from_bool (is_cross_staff (unsmob_grob (smob))); + return scm_from_bool (is_cross_staff (Grob::unsmob (smob))); } int @@ -1578,7 +1491,6 @@ ADD_INTERFACE (Beam, "auto-knee-gap " "beamed-stem-shorten " "beaming " - "beam-gap " "beam-segments " "beam-thickness " "break-overshoot " @@ -1590,6 +1502,7 @@ ADD_INTERFACE (Beam, "damping " "details " "direction " + "gap " "gap-count " "grow-direction " "inspect-quants "