/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2013 Mike Solomon <mike@mikesolomon.org>
+ Copyright (C) 2013--2015 Mike Solomon <mike@mikesolomon.org>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
event_name_, int (d)));
}
-void
-Slur_proto_engraver::internal_listen_break_slur (Stream_event *ev)
-{
- // if break_slur_ is set, we only keep events with direction
- if (break_slur_
- && robust_scm2dir (ev->get_property ("span-direction"), CENTER))
- break_slur_ = ev;
- else if (!break_slur_)
- break_slur_ = ev;
- else if (break_slur_
- && robust_scm2dir (break_slur_->get_property ("span-direction"), CENTER)
- && robust_scm2dir (ev->get_property ("span-direction"), CENTER))
- ev->origin ()->warning (_f ("cannot set break slur with two directions"));
-}
-
-
void
Slur_proto_engraver::acknowledge_note_column (Grob_info info)
{
}
void
-Slur_proto_engraver::create_slur (string spanner_id, Stream_event *ev_cause, Grob *g_cause, Direction dir, bool left_broken)
+Slur_proto_engraver::create_slur (const string &spanner_id, Stream_event *ev_cause, Grob *g_cause, Direction dir, bool left_broken)
{
- Grob *ccc = unsmob_grob (get_property ("currentCommandColumn"));
+ Grob *ccc = unsmob<Grob> (get_property ("currentCommandColumn"));
SCM cause = ev_cause ? ev_cause->self_scm () : g_cause->self_scm ();
Spanner *slur = make_spanner (grob_name_, cause);
slur->set_property ("spanner-id", ly_string2scm (spanner_id));
slurs_.push_back (slur);
if (double_property_name_
&& to_boolean (get_property (double_property_name_)))
- {
- set_grob_direction (slur, DOWN);
- slur = make_spanner (grob_name_, cause);
- slur->set_property ("spanner-id", ly_string2scm (spanner_id));
- set_grob_direction (slur, UP);
- if (left_broken)
- slur->set_bound (LEFT, ccc);
- slurs_.push_back (slur);
- }
- else if (g_cause && Slur::has_interface (g_cause) && left_broken)
- {
- g_cause->set_object ("other-half", slur->self_scm ());
- slur->set_object ("other-half", g_cause->self_scm ());
- }
+ {
+ set_grob_direction (slur, DOWN);
+ slur = make_spanner (grob_name_, cause);
+ slur->set_property ("spanner-id", ly_string2scm (spanner_id));
+ set_grob_direction (slur, UP);
+ if (left_broken)
+ slur->set_bound (LEFT, ccc);
+ slurs_.push_back (slur);
+ }
+
}
bool
-Slur_proto_engraver::can_create_slur (string id, vsize old_slurs, vsize *event_idx, Stream_event *ev)
+Slur_proto_engraver::can_create_slur (const string &id, vsize old_slurs, vsize *event_idx, Stream_event *ev)
{
for (vsize j = slurs_.size (); j--;)
{
if (!updown)
return false;
- Stream_event *c = unsmob_stream_event (slur->get_property ("cause"));
+ Stream_event *c = unsmob<Stream_event> (slur->get_property ("cause"));
if (!c)
{
return ended;
}
-void
-Slur_proto_engraver::break_slurs ()
-{
- for (vsize i = slurs_.size (); i--;)
- {
- Grob *ccc = unsmob_grob (get_property ("currentCommandColumn"));
- Spanner *s = dynamic_cast<Spanner *> (slurs_[i]);
- s->set_bound (RIGHT, ccc);
- announce_end_grob (s, SCM_EOL);
- slurs_.erase (slurs_.begin () + i);
- SCM maybe_dir = s->get_property_data ("direction");
- Direction dir = is_direction (maybe_dir)
- ? robust_scm2dir (maybe_dir, CENTER)
- : CENTER;
- create_slur (robust_scm2string (s->get_property ("spanner-id"), ""),
- 0, s, dir, true);
- }
-}
-
void
Slur_proto_engraver::process_music ()
{
- // break slurs that span over this column
- // if break_slur_'s direction is center
- if (break_slur_
- && robust_scm2dir (break_slur_->get_property ("span-direction"), CENTER) == CENTER
- && unsmob_grob (get_property ("currentCommandColumn")))
- break_slurs ();
-
- // create broken slurs starting at this column if break_slur_ is left
- vsize old_slurs = slurs_.size ();
- if (break_slur_
- && robust_scm2dir (break_slur_->get_property ("span-direction"), CENTER) == LEFT
- && can_create_slur ("", old_slurs, 0, break_slur_))
- create_slur ("", break_slur_, 0,
- robust_scm2dir (break_slur_->get_property ("direction"), CENTER),
- true);
-
for (vsize i = 0; i < stop_events_.size (); i++)
{
string id = robust_scm2string (stop_events_[i]->get_property ("spanner-id"), "");
else
stop_events_[i]->origin ()->warning (_f ("cannot end %s", object_name_));
}
- old_slurs = slurs_.size ();
+ vsize old_slurs = slurs_.size ();
for (vsize i = start_events_.size (); i--;)
{
Stream_event *ev = start_events_[i];
string id = robust_scm2string (ev->get_property ("spanner-id"), "");
Direction updown = to_dir (ev->get_property ("direction"));
+
if (can_create_slur (id, old_slurs, &i, ev))
create_slur (id, ev, 0, updown, false);
}
- // if BreakSlurEvent with span-dir right, we end here
- if (break_slur_
- && robust_scm2dir (break_slur_->get_property ("span-direction"), CENTER) == RIGHT)
- (void) try_to_end (break_slur_);
-
set_melisma (slurs_.size ());
}
void
Slur_proto_engraver::stop_translation_timestep ()
{
- if (Grob *g = unsmob_grob (get_property ("currentCommandColumn")))
+ if (Grob *g = unsmob<Grob> (get_property ("currentCommandColumn")))
{
for (vsize i = 0; i < end_slurs_.size (); i++)
Slur::add_extra_encompass (end_slurs_[i], g);
{
Spanner *s = dynamic_cast<Spanner *> (end_slurs_[i]);
if (!s->get_bound (RIGHT))
- s->set_bound (RIGHT, unsmob_grob (get_property ("currentMusicalColumn")));
- // if BreakSlurEvent with span-dir right,
- // we set right bound to current command column
- if (break_slur_
- && robust_scm2dir (break_slur_->get_property ("span-direction"), CENTER) == RIGHT)
- s->set_bound (RIGHT, unsmob_grob (get_property ("currentCommandColumn")));
+ s->set_bound (RIGHT, unsmob<Grob> (get_property ("currentMusicalColumn")));
announce_end_grob (s, SCM_EOL);
}
end_slurs_.clear ();
start_events_.clear ();
stop_events_.clear ();
- break_slur_ = 0;
}
// no ADD_ACKNOWLEDGER / ADD_TRANSLATOR macro calls