]> git.donarmstrong.com Git - lilypond.git/commitdiff
*** empty log message ***
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 3 Apr 2006 17:08:35 +0000 (17:08 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Mon, 3 Apr 2006 17:08:35 +0000 (17:08 +0000)
ChangeLog
lily/hairpin.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

index 0f247266ec080bee87b04daf10b866fa8bdce3a6..f2e8d0554bbea548cf6cf57693e30358fb082d3a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,6 +1,14 @@
+2006-04-03  Erlend Aasland  <erlenda@gmail.com>
+
+       * 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  <hanwen@lilypond.org>
 
-       * 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  <hanwen@lilypond.org>
 
 2006-03-29  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
        * lily/tuplet-bracket.cc (calc_control_points): handle suicide
-       case. Backportme.
+       case. 
 
 2006-03-29  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
        * lily/ttf.cc (make_index_to_charcode_map): restore old
-       cmap. Backportme.
+       cmap. 
 
 2006-03-28  Werner Lemberg  <wl@gnu.org>
 
 2006-03-28  Han-Wen Nienhuys  <hanwen@lilypond.org>
 
        * mf/feta-bolletjes.mf: match width of solfa notes with normal
-       note heads. Backportme.
+       note heads. 
 
        * lily/ttf.cc (print_trailer): use it.
 
        * 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  <gpermus@gmail.com>
 
index addd26b1c25e7aa568da8f180f836e4e67805086..7a349c7f3a316211a2f56c4d7c590e49da206a6c 100644 (file)
@@ -94,6 +94,21 @@ Hairpin::print (SCM smob)
   Grob *common = bounds[LEFT]->common_refpoint (bounds[RIGHT], X_AXIS);
   Drul_array<Real> 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 "
               );
-
index bc4afc84d485e163b482731798eb1a07965babba..e1222cbdfe1e1f35c4680e25fd86138f14100f34 100644 (file)
@@ -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")
index 20cb7b3f2ee74c4ced2421c7d21341fd3763a316..7609b3ec99422cb4a532900a6961ee789de701f4 100644 (file)
        (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)