/*
- hairpin.cc -- implement Hairpin
+ This file is part of LilyPond, the GNU music typesetter.
- source file of the GNU LilyPond music typesetter
+ Copyright (C) 1997--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
- (c) 1997--2009 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ LilyPond is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ LilyPond is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
*/
#include "hairpin.hh"
#include "note-column.hh"
#include "warn.hh"
-MAKE_SCHEME_CALLBACK (Hairpin, height, 1);
-SCM
-Hairpin::height (SCM smob)
-{
- return Grob::stencil_height (smob);
-}
-
MAKE_SCHEME_CALLBACK (Hairpin, pure_height, 3);
SCM
Hairpin::pure_height (SCM smob, SCM, SCM)
broken[RIGHT] = broken[RIGHT] && me->broken_neighbor (RIGHT);
broken[RIGHT] = broken[RIGHT] && me->broken_neighbor (RIGHT)->is_live ();
-
+
if (broken[RIGHT])
{
Spanner *next = me->broken_neighbor (RIGHT);
Use the height and thickness of the hairpin when making a circled tip
*/
bool circled_tip = ly_scm2bool (me->get_property ("circled-tip"));
- Real height = robust_scm2double (me->get_property ("height"), 0.2) *
- Staff_symbol_referencer::staff_space (me);
+ Real height = robust_scm2double (me->get_property ("height"), 0.2)
+ * Staff_symbol_referencer::staff_space (me);
/*
FIXME: 0.525 is still just a guess...
*/
Real thick = 1.0;
if (circled_tip)
thick = robust_scm2double (me->get_property ("thickness"), 1.0)
- * Staff_symbol_referencer::line_thickness (me);
+ * Staff_symbol_referencer::line_thickness (me);
do
{
else
{
bool neighbor_found = false;
- extract_grob_set (me, "adjacent-hairpins", pins);
- for (vsize i = 0; i < pins.size (); i++)
+ Spanner *adjacent;
+ extract_grob_set (me, "adjacent-spanners", neighbors);
+ for (vsize i = 0; i < neighbors.size (); i++)
{
/*
FIXME: this will fuck up in case of polyphonic
notes in other voices. Need to look at note-columns
in the current staff/voice.
*/
-
- Spanner *pin = dynamic_cast<Spanner *> (pins[i]);
- if (pin
- && (pin->get_bound (LEFT)->get_column () == b->get_column ()
- || pin->get_bound (RIGHT)->get_column () == b->get_column ()))
- neighbor_found = true;
+ adjacent = dynamic_cast<Spanner *> (neighbors[i]);
+ if (adjacent
+ && (adjacent->get_bound (-d)->get_column ()
+ == b->get_column ()))
+ {
+ neighbor_found = true;
+ break;
+ }
}
Interval e = robust_relative_extent (b, common, X_AXIS);
if (neighbor_found)
{
- /*
- Handle back-to-back hairpins with a circle in the middle
- */
- if (circled_tip && (grow_dir != d))
- x_points[d] = e.center () + d * (rad - thick / 2.0);
- /*
- If we're hung on a paper column, that means we're not
- adjacent to a text-dynamic, and we may move closer. We
- make the padding a little smaller, here.
- */
+ if (Hairpin::has_interface (adjacent))
+ {
+ /*
+ Handle back-to-back hairpins with a circle in the middle
+ */
+ if (circled_tip && (grow_dir != d))
+ x_points[d] = e.center () + d * (rad - thick / 2.0);
+ /*
+ If we're hung on a paper column, that means we're not
+ adjacent to a text-dynamic, and we may move closer. We
+ make the padding a little smaller, here.
+ */
+ else
+ x_points[d] = e.center () - d * padding / 3;
+ }
+ // Our neighbor is a dynamic text spanner, so add the
+ // same amount of padding as for text dynamics
else
- x_points[d] = e.center () - d * padding / 3;
+ x_points[d] = e[-d] - d * padding;
}
else
{
x_points[d] = e[-d];
else
x_points[d] = e[d];
-
+
Item *bound = me->get_bound (d);
if (bound->is_non_musical (bound))
- x_points[d] -= d * padding;
+ x_points[d] -= d * padding;
}
}
}
if (circled_tip)
{
Box extent (Interval (-rad, rad), Interval (-rad, rad));
-
+
/* Hmmm, perhaps we should have a Lookup::circle () method? */
Stencil circle (extent,
- scm_list_4 (ly_symbol2scm ("circle"),
- scm_from_double (rad),
- scm_from_double (thick),
- SCM_BOOL_F));
+ scm_list_4 (ly_symbol2scm ("circle"),
+ scm_from_double (rad),
+ scm_from_double (thick),
+ SCM_BOOL_F));
/*
- don't add another circle the hairpin is broken
+ don't add another circle if the hairpin is broken
*/
if (!broken[tip_dir])
mol.add_at_edge (X_AXIS, tip_dir, Stencil (circle), 0);
"A hairpin crescendo or decrescendo.",
/* properties */
- "adjacent-hairpins "
+ "adjacent-spanners "
"circled-tip "
"bound-padding "
"grow-direction "