]> git.donarmstrong.com Git - lilypond.git/commitdiff
Adds stem-begin-position callback.
authorMike Solomon <mike@apollinemike.com>
Tue, 19 Jul 2011 13:59:37 +0000 (15:59 +0200)
committerMike Solomon <mike@apollinemike.com>
Tue, 19 Jul 2011 13:59:37 +0000 (15:59 +0200)
lily/include/stem.hh
lily/stem.cc
scm/define-grob-properties.scm
scm/define-grobs.scm

index 27fe988b615bb33436ee152317bf027a82ab59ec..3388e34b590b8d92601e990fa4dd21ecc765545a 100644 (file)
@@ -61,6 +61,7 @@ public:
   DECLARE_SCHEME_CALLBACK (calc_direction, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_beaming, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_length, (SCM));
+  DECLARE_SCHEME_CALLBACK (calc_stem_begin_position, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_stem_end_position, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_stem_info, (SCM));
   DECLARE_SCHEME_CALLBACK (calc_positioning_done, (SCM));
index 04bc4105922e0ecfbca2ea41da058b007ff25fe7..5b1a3d5041423e488e9cdc40eba25f4f7bf7a34a 100644 (file)
@@ -733,6 +733,32 @@ Stem::thickness (Grob *me)
     * Staff_symbol_referencer::line_thickness (me);
 }
 
+MAKE_SCHEME_CALLBACK (Stem, calc_stem_begin_position, 1);
+SCM
+Stem::calc_stem_begin_position (SCM smob)
+{
+  Grob *me = unsmob_grob (smob);
+  Direction d = get_grob_direction (me);
+  Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
+  Grob *lh
+    = to_boolean (me->get_property ("avoid-note-head"))
+    ? last_head (me)
+    : first_head (me);
+
+  Real pos = Staff_symbol_referencer::get_position (lh);
+
+  if (Grob *head = support_head (me))
+    {
+      Interval head_height = head->extent (head, Y_AXIS);
+      Real y_attach = Note_head::stem_attachment_coordinate (head, Y_AXIS);
+
+      y_attach = head_height.linear_combination (y_attach);
+      pos += d * y_attach / half_space;
+    }
+
+  return scm_from_double (pos);
+}
+
 MAKE_SCHEME_CALLBACK (Stem, print, 1);
 SCM
 Stem::print (SCM smob)
@@ -771,7 +797,7 @@ Stem::print (SCM smob)
   Real half_space = Staff_symbol_referencer::staff_space (me) * 0.5;
 
   if (lh)
-    y2 = Staff_symbol_referencer::get_position (lh);
+    y2 = robust_scm2double (me->get_property ("stem-begin-position"), 0.0);
   else if (stemlet)
     {
       Real beam_translation = Beam::get_beam_translation (beam);
@@ -786,18 +812,6 @@ Stem::print (SCM smob)
 
   Interval stem_y (min (y1, y2), max (y2, y1));
 
-  if (Grob *head = support_head (me))
-    {
-      /*
-       must not take ledgers into account.
-      */
-      Interval head_height = head->extent (head, Y_AXIS);
-      Real y_attach = Note_head::stem_attachment_coordinate (head, Y_AXIS);
-
-      y_attach = head_height.linear_combination (y_attach);
-      stem_y[Direction (-d)] += d * y_attach / half_space;
-    }
-
   // URG
   Real stem_width = thickness (me);
   Real blot
@@ -1110,6 +1124,7 @@ ADD_INTERFACE (Stem,
               "note-heads "
               "positioning-done "
               "rests "
+              "stem-begin-position "
               "stem-end-position "
               "stem-info "
               "stemlet-length "
index 5c2114338e053cb5468c5af6672d689d22d74ddf..40732d0e9d10997850ade1bc6b85a168fad765f8 100644 (file)
@@ -841,6 +841,8 @@ the @code{staff-staff-spacing} property of the staff's
 structure.")
      (stem-attachment ,number-pair? "An @code{(@var{x} . @var{y})}
 pair where the stem attaches to the notehead.")
+     (stem-begin-position ,number? "Where does the stem begin (the
+position of the support-head)?")
      (stem-end-position ,number? "Where does the stem end (the end is
 opposite to the support-head)?")
      ;;[TODO: doco]
index 177ebafc847426248949e66dc7d4d4c02b697415..393bc7c187ebaf3d165070c7713431aeb18a2295 100644 (file)
        (length . ,ly:stem::calc-length)
        (neutral-direction . ,DOWN)
        (positioning-done . ,ly:stem::calc-positioning-done)
+       (stem-begin-position . ,ly:stem::calc-stem-begin-position)
        (stem-end-position . ,ly:stem::calc-stem-end-position)
        (stem-info . ,ly:stem::calc-stem-info)
        (stencil . ,ly:stem::print)