]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/stem.cc
Put list of os-cpu back as found at http://lilypond.org/download/binaries.
[lilypond.git] / lily / stem.cc
index 4189915f372fadb795c5e56861961e37735975ae..4ac91fa7f38ac3d650ca984affadd61000d2bf20 100644 (file)
@@ -239,19 +239,28 @@ Stem::pure_height (SCM smob, SCM start, SCM end)
 
   if (!is_normal_stem (me))
     return ly_interval2scm (iv);
-  
+
   Real ss = Staff_symbol_referencer::staff_space (me);
-  Real len = scm_to_double (calc_length (smob)) * ss / 2;
-  Direction dir = get_grob_direction (me);
 
-  Interval hp = head_positions (me);
-  if (dir == UP)
-    iv = Interval (0, len);
-  else
-    iv = Interval (-len, 0);
+  if (!to_boolean (me->get_property ("cross-staff")))
+    {
+      Real len = scm_to_double (calc_length (smob)) * ss / 2;
+      Direction dir = get_grob_direction (me);
 
-  if (!hp.is_empty ())
-    iv.translate (hp[dir] * ss / 2);
+      Interval hp = head_positions (me);
+      if (dir == UP)
+       iv = Interval (0, len);
+      else
+       iv = Interval (-len, 0);
+
+      if (!hp.is_empty ())
+       iv.translate (hp[dir] * ss / 2);
+    }
+
+  /* at a minimum, make the pure-height cover the staff symbol */
+  Real rad = Staff_symbol_referencer::staff_radius (me);
+  iv.add_point (-rad * ss);
+  iv.add_point (rad * ss);
 
   return ly_interval2scm (iv);
 }
@@ -271,8 +280,6 @@ Stem::calc_stem_end_position (SCM smob)
       return me->get_property ("stem-end-position");
     }
   
-  Real ss = Staff_symbol_referencer::staff_space (me);
-  int durlog = duration_log (me);
   vector<Real> a;
 
   /* WARNING: IN HALF SPACES */
@@ -287,41 +294,6 @@ Stem::calc_stem_end_position (SCM smob)
   if (!no_extend_b && dir * stem_end < 0)
     stem_end = 0.0;
 
-  
-  /* Make a little room if we have a upflag and there is a dot.
-     previous approach was to lengthen the stem. This is not
-     good typesetting practice.  */
-  if (!get_beam (me) && dir == UP
-      && durlog > 2)
-    {
-      Grob *closest_to_flag = extremal_heads (me)[dir];
-      Grob *dots = closest_to_flag
-       ? Rhythmic_head::get_dots (closest_to_flag) : 0;
-
-      if (dots)
-       {
-         Real dp = Staff_symbol_referencer::get_position (dots);
-         Interval flag_yext = flag (me).extent (Y_AXIS) * (2 / ss) + stem_end;
-
-         /* Very gory: add myself to the X-support of the parent,
-            which should be a dot-column. */
-         
-         if (flag_yext.distance (dp) < 0.5)
-           {
-             Grob *par = dots->get_parent (X_AXIS);
-
-             if (Dot_column::has_interface (par))
-               {
-                 Side_position_interface::add_support (par, me);
-
-                 /* TODO: apply some better logic here. The flag is
-                    curved inwards, so this will typically be too
-                    much. */
-               }
-           }
-       }
-    }
-
   return scm_from_double (stem_end);
 }
 
@@ -602,6 +574,9 @@ Stem::flag (Grob *me)
       || unsmob_grob (me->get_object ("beam")))
     return Stencil ();
 
+  if (!is_normal_stem (me))
+    return Stencil ();
+  
   /*
     TODO: maybe property stroke-style should take different values,
     e.g. "" (i.e. no stroke), "single" and "double" (currently, it's
@@ -1001,6 +976,20 @@ Stem::beam_multiplicity (Grob *stem)
   return le;
 }
 
+bool
+Stem::is_cross_staff (Grob *stem)
+{
+  Grob *beam = unsmob_grob (stem->get_object ("beam"));
+  return beam && Beam::is_cross_staff (beam);
+}
+
+MAKE_SCHEME_CALLBACK (Stem, calc_cross_staff, 1)
+SCM
+Stem::calc_cross_staff (SCM smob)
+{
+  return scm_from_bool (is_cross_staff (unsmob_grob (smob)));
+}
+
 /* FIXME:  Too many properties  */
 ADD_INTERFACE (Stem,
               "The stem represent the graphical stem.  "