source file of the GNU LilyPond music typesetter
- (c) 2002--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 2002--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
{
Grob *a = unsmob_grob (scm_car (s));
- if (unsmob_grob (a->get_object ("tie")))
+ if (unsmob_grob (a->get_object ("tie")) && !to_boolean (a->get_property ("forced")))
break_reminder->push_back (a);
else
real_acc->push_back (a);
}
}
-/*
- Accidentals are special, because they appear and disappear after
- ties at will.
-*/
-Interval
-Accidental_placement::get_relevant_accidental_extent (Grob *me,
- Item *item_col,
- Grob *left_object)
+vector<Grob*>
+Accidental_placement::get_relevant_accidentals (vector<Grob*> const &elts, Grob *left)
{
- vector<Grob*> br, ra;
- vector<Grob*> *which = 0;
+ vector<Grob*> br;
+ vector<Grob*> ra;
+ vector<Grob*> ret;
+ bool right = dynamic_cast<Item *> (left)->break_status_dir () == RIGHT;
- Accidental_placement::split_accidentals (me, &br, &ra);
- concat (br, ra);
-
- if (dynamic_cast<Item *> (left_object)->break_status_dir () == RIGHT)
- which = &br;
- else
- which = &ra;
-
- Interval extent;
- for (vsize i = 0; i < which->size (); i++)
- extent.unite (which->at (i)->extent (item_col, X_AXIS));
-
- if (!extent.is_empty ())
+ for (vsize i = 0; i < elts.size (); i++)
{
- Real p = robust_scm2double (me->get_property ("left-padding"), 0.2);
- extent[LEFT] -= p;
- }
+ split_accidentals (elts[i], &br, &ra);
+
+ ret.insert (ret.end (), ra.begin (), ra.end ());
- return extent;
+ if (right)
+ ret.insert (ret.end (), br.begin (), br.end ());
+ }
+ return ret;
}
struct Accidental_placement_entry
*/
-MAKE_SCHEME_CALLBACK(Accidental_placement, calc_positioning_done, 1);
+MAKE_SCHEME_CALLBACK (Accidental_placement, calc_positioning_done, 1);
SCM
Accidental_placement::calc_positioning_done (SCM smob)
{
if (!me->is_live ())
return SCM_BOOL_T;
+ me->set_property ("positioning-done", SCM_BOOL_T);
+
SCM accs = me->get_object ("accidental-grobs");
if (!scm_is_pair (accs))
return SCM_BOOL_T;
common[Y_AXIS] = common_refpoint_of_array (heads, common[Y_AXIS], Y_AXIS);
common[Y_AXIS] = common_refpoint_of_array (stems, common[Y_AXIS], Y_AXIS);
- vector<Grob *> stems;
for (vsize i = 0; i < heads.size (); i++)
{
if (Grob *s = Rhythmic_head::get_stem (heads[i]))
ape->extents_.insert (ape->extents_.end (), boxes.begin (), boxes.end ());
}
- ape->left_skyline_ = Skyline (ape->extents_, Y_AXIS, LEFT);
- ape->right_skyline_ = Skyline (ape->extents_, Y_AXIS, RIGHT);
+ ape->left_skyline_ = Skyline (ape->extents_, 0, Y_AXIS, LEFT);
+ ape->right_skyline_ = Skyline (ape->extents_, 0, Y_AXIS, RIGHT);
}
Interval total;
stems[i]->pure_height (common[Y_AXIS], 0, very_large)));
}
- head_ape->left_skyline_ = Skyline (head_extents, Y_AXIS, LEFT);
+ head_ape->left_skyline_ = Skyline (head_extents, 0, Y_AXIS, LEFT);
head_ape->offset_ = 0.0;
Real padding = robust_scm2double (me->get_property ("padding"), 0.2);
Skyline left_skyline = head_ape->left_skyline_;
- left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0))
-;
+ left_skyline.raise (-robust_scm2double (me->get_property ("right-padding"), 0));
+
/*
Add accs entries right-to-left.
*/
{
Real offset = -apes[i]->right_skyline_.distance (left_skyline);
if (isinf (offset))
- offset = (i < apes.size () - 1) ? apes[i + 1]->offset_ : 0.0;
+ offset = (i + 1 < apes.size ()) ? apes[i + 1]->offset_ : 0.0;
else
offset -= padding;
me->flush_extent_cache (X_AXIS);
me->set_property ("X-extent", scm_width);
- for (vsize i = apes.size (); i--;)
- delete apes[i];
+ junk_pointers (apes);
+ delete head_ape;
+
return SCM_BOOL_T;
}