]> git.donarmstrong.com Git - lilypond.git/commitdiff
''
authorHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 13 Apr 2002 11:57:25 +0000 (11:57 +0000)
committerHan-Wen Nienhuys <hanwen@xs4all.nl>
Sat, 13 Apr 2002 11:57:25 +0000 (11:57 +0000)
ChangeLog
input/regression/rest-collision-default.ly [new file with mode: 0644]
lily/beam.cc
lily/include/stem.hh
lily/rest-collision.cc
lily/stem.cc

index 7788a963b32d541a42a81c4786188011ea4bcf9f..564cb2d51a5f07c5053f95422434b01ae8e387a7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -7,6 +7,13 @@
        
 2002-04-13  Han-Wen  <hanwen@cs.uu.nl>
 
+       * lily/stem.cc (get_default_dir): set direction to CENTER if
+       invisible. Various other fixes to deal with invisible stems and
+       stem-direction == CENTER.
+
+       * lily/rest-collision.cc (do_shift): take direction from note if
+       not set.
+
        * input/regression/tie-grace.ly: new file.
 
        * lily/tie-engraver.cc (create_grobs): fix tied graces.
diff --git a/input/regression/rest-collision-default.ly b/input/regression/rest-collision-default.ly
new file mode 100644 (file)
index 0000000..0dd3ba2
--- /dev/null
@@ -0,0 +1,15 @@
+
+\header
+{
+texidoc = "Rests in collisions sit opposite of the note if no direction is
+  specified for the voice containing the rest."
+}
+
+
+\score{\notes\relative c''
+       \context Staff <
+\time 2/4
+\context Voice=upper {
+    r4 }
+\context Voice=lower {\voiceTwo
+b8  }>}
index 706b503eca2e1e812c7f94f87ccab16c1e7ffbb9..898c9e0ce3f7aa10215c413c905855b7a6d6c5d2 100644 (file)
@@ -179,8 +179,9 @@ Beam::get_default_dir (Grob *me)
     do {
       Grob *s = stems[i];
       Direction sd = Directional_element_interface::get (s);
-      int current = sd ? (1 + d * sd)/2
-       : Stem::get_center_distance (s, (Direction)-d);
+
+      int center_distance = int(- d * Stem::head_positions (s) [-d]) >? 0;
+      int current = sd ? (1 + d * sd)/2 : center_distance;
 
       if (current)
        {
@@ -558,7 +559,7 @@ Beam::score_stem_lengths (Link_array<Grob>stems,
       demerit_score += 5 * shrink_extra_weight (d * current_y  - info.ideal_y);
     }
 
-  demerit_score *= 2.0  /stems.size (); 
+  demerit_score *= 2.0 stems.size (); 
 
   return demerit_score;
 }
index 70051bed6b26dc84720096f84088e0dc0d0754c6..caa430cb42a835c8e9753fca36c414de0241d428 100644 (file)
@@ -32,7 +32,7 @@ public:
   static int type_i (Grob *) ;
   static void set_stemend (Grob *,Real);
   static Direction get_default_dir (Grob *) ;
-  static int get_center_distance (Grob *,Direction) ;
+
   static int heads_i (Grob *) ;
   static bool invisible_b (Grob *) ;
   static Interval head_positions (Grob *) ;
index 2569c7ab2b9153f5241faa423e4ba0d659b39633..2bbb79d07a7044c517b4e8a28cd2d105d4b61da4 100644 (file)
@@ -196,7 +196,11 @@ Rest_collision::do_shift (Grob *me, SCM elts)
        }
       Grob * rcol = rests[0];
       Direction dir = Note_column::dir (rests[0]);
+
+      if (!dir)
+       {
+         dir = - Note_column::dir (notes[0]);
+       }
       Grob * r = unsmob_grob (rcol->get_grob_property ("rest"));
       Interval restdim = r->extent (r, Y_AXIS);        // ??
 
index 7286daeee03a00bc04897dda09b7462e2afa6381..0f6591987ab71afc484e679fd73afe6d95f131a0 100644 (file)
@@ -238,22 +238,21 @@ Stem::invisible_b (Grob*me)
   return ! (heads_i (me) && Rhythmic_head::balltype_i (support_head (me)) >= 1);
 }
 
-int
-Stem::get_center_distance (Grob*me, Direction d)
-{
-  int staff_center = 0;
-  int distance = (int) (d* (head_positions (me)[d] - staff_center));
-  return distance >? 0;
-}
-
 Direction
 Stem::get_default_dir (Grob*me) 
 {
-  int du = get_center_distance (me,UP);
-  int dd = get_center_distance (me,DOWN);
-
-  if (sign (dd - du))
-    return Direction (sign (dd -du));
+  int staff_center = 0;
+  Interval hp = head_positions (me);
+  if (hp.empty_b())
+    {
+      return CENTER;
+    }
+  
+  int udistance = (int) (UP * hp[UP] - staff_center);
+  int ddistance = (int) (DOWN* hp[DOWN] - staff_center);  
+  
+  if (sign (ddistance - udistance))
+    return Direction (sign (ddistance -udistance));
 
   return to_dir (me->get_grob_property ("neutral-direction"));
 }
@@ -431,13 +430,15 @@ SCM
 Stem::before_line_breaking (SCM smob)
 {
   Grob*me = unsmob_grob (smob);
-  stem_end_position (me);      // ugh. Trigger direction calc.
-  position_noteheads (me);
 
-  if (invisible_b (me))
+  if (!invisible_b (me))
+    {
+      stem_end_position (me);  // ugh. Trigger direction calc.
+      position_noteheads (me);
+    }
+  else
     {
       me->remove_grob_property ("molecule-callback");
-      // suicide ();
     }
   
   return SCM_UNSPECIFIED;
@@ -628,6 +629,12 @@ Stem::off_callback (SCM element_smob, SCM)
   Grob *me = unsmob_grob (element_smob);
   
   Real r=0;
+
+  if (invisible_b (me))
+    {
+      return gh_double2scm (0.0);
+    }
+  
   if (Grob * f = first_head (me))
     {
       Interval head_wid = Note_head::head_extent(f, X_AXIS);