From 4a2675fe43cc429bdfb64923b908897895d494ee Mon Sep 17 00:00:00 2001 From: hanwen Date: Mon, 3 Apr 2006 17:08:35 +0000 Subject: [PATCH] *** empty log message *** --- ChangeLog | 20 ++++++--- lily/hairpin.cc | 82 +++++++++++++++++++++++++++++----- scm/define-grob-properties.scm | 1 + scm/define-grobs.scm | 1 + 4 files changed, 86 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0f247266ec..f2e8d0554b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,6 +1,14 @@ +2006-04-03 Erlend Aasland + + * lily/hairpin.cc (print): add support for circled tip + + * scm/define-grob-properties.scm: add circled-tip parameter + + * scm/define-grobs.scm: init circled-tip to false + 2006-04-03 Han-Wen Nienhuys - * scm/music-functions.scm (quote-substitute): set iterators-ctor + * scm/music-functions.scm (quote-substitute): set iterators-ctor. Backportme. 2006-03-31 Han-Wen Nienhuys @@ -121,12 +129,12 @@ 2006-03-29 Han-Wen Nienhuys * lily/tuplet-bracket.cc (calc_control_points): handle suicide - case. Backportme. + case. 2006-03-29 Han-Wen Nienhuys * lily/ttf.cc (make_index_to_charcode_map): restore old - cmap. Backportme. + cmap. 2006-03-28 Werner Lemberg @@ -144,7 +152,7 @@ 2006-03-28 Han-Wen Nienhuys * mf/feta-bolletjes.mf: match width of solfa notes with normal - note heads. Backportme. + note heads. * lily/ttf.cc (print_trailer): use it. @@ -166,10 +174,10 @@ * Documentation/topdocs/INSTALL.texi (Top): update versions. * lily/note-collision.cc (get_clash_groups): only consider when - Note_column::dir <> CENTER. Backportme. + Note_column::dir <> CENTER. * scripts/lilypond-book.py (get_option_parser): init output_name - to ''. Backportme. + to ''. 2006-03-24 Graham Percival diff --git a/lily/hairpin.cc b/lily/hairpin.cc index addd26b1c2..7a349c7f3a 100644 --- a/lily/hairpin.cc +++ b/lily/hairpin.cc @@ -94,6 +94,21 @@ Hairpin::print (SCM smob) Grob *common = bounds[LEFT]->common_refpoint (bounds[RIGHT], X_AXIS); Drul_array x_points; + /* + 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); + /* + FIXME: 0.65 is just a guess... + */ + Real rad = height * 0.65; + Real thick = 1.0; + if (circled_tip) + thick = robust_scm2double (me->get_property ("thickness"), 1.0) + * Staff_symbol_referencer::line_thickness (me); + do { Item *b = bounds[d]; @@ -130,14 +145,24 @@ Hairpin::print (SCM smob) neighbor_found = true; } - /* - 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. - */ Interval e = robust_relative_extent (b, common, X_AXIS); - x_points[d] - = neighbor_found ? e.center () - d * padding / 3 : e[d]; + 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. + */ + else + x_points[d] = e.center () - d * padding / 3; + } + else + x_points[d] = e[d]; } } } @@ -152,8 +177,6 @@ Hairpin::print (SCM smob) } bool continued = broken[Direction (-grow_dir)]; - Real height = robust_scm2double (me->get_property ("height"), 0.2) * - Staff_symbol_referencer::staff_space (me); Real starth, endh; if (grow_dir < 0) @@ -172,11 +195,46 @@ Hairpin::print (SCM smob) */ Stencil mol; - mol = Line_interface::line (me, Offset (0, starth), Offset (width, endh)); + Real x = 0.0; + + /* + Compensate for size of circle + */ + Direction tip_dir = -grow_dir; + if (circled_tip && !broken[tip_dir]) + { + if (grow_dir > 0) + x = rad * 2.0; + else if (grow_dir < 0) + width -= rad *2.0; + } + mol = Line_interface::line (me, Offset (x, starth), Offset (width, endh)); mol.add_stencil (Line_interface::line (me, - Offset (0, -starth), + Offset (x, -starth), Offset (width, -endh))); + /* + Support al/del niente notation by putting a circle at the + tip of the (de)crescendo. + */ + 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)); + + /* + don't add another circle the hairpin is broken + */ + if (!broken[tip_dir]) + mol.add_at_edge (X_AXIS, tip_dir, Stencil (circle), 0, 0); + } + mol.translate_axis (x_points[LEFT] - bounds[LEFT]->relative_coordinate (common, X_AXIS), X_AXIS); @@ -186,8 +244,8 @@ Hairpin::print (SCM smob) ADD_INTERFACE (Hairpin, "hairpin-interface", "A hairpin crescendo/decrescendo.", "adjacent-hairpins " + "circled-tip " "bound-padding " "grow-direction " "height " ); - diff --git a/scm/define-grob-properties.scm b/scm/define-grob-properties.scm index bc4afc84d4..e1222cbdfe 100644 --- a/scm/define-grob-properties.scm +++ b/scm/define-grob-properties.scm @@ -498,6 +498,7 @@ set, which grob to get the direction from .") (bounded-by-me ,ly:grob-array? "list of spanners that have this column as start/begin point. Only columns that have grobs or act as bounds are spaced.") + (circled-tip ,boolean? "Put a circle at start/end of hairpins (al/del niente)") (columns ,ly:grob-array? "list of grobs, typically containing paper-columns or note-column objects.") (conditional-elements ,ly:grob-array? "Internal use only") diff --git a/scm/define-grobs.scm b/scm/define-grobs.scm index 20cb7b3f2e..7609b3ec99 100644 --- a/scm/define-grobs.scm +++ b/scm/define-grobs.scm @@ -652,6 +652,7 @@ (stencil . ,ly:hairpin::print) (springs-and-rods . ,ly:spanner::set-spacing-rods) (after-line-breaking . ,ly:hairpin::after-line-breaking) + (circled-tip . #f) (thickness . 1.0) (height . 0.6666) (minimum-length . 2.0) -- 2.39.5