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.
--- /dev/null
+
+\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 }>}
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)
{
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;
}
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 *) ;
}
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); // ??
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"));
}
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;
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);