accidentals and arpeggios in horizontal script stacking.
* lily/script-row-engraver.cc (acknowledge_accidental_placement):
new function.
* input/regression/script-stack-horizontal.ly: trim.
+2006-10-17 Han-Wen Nienhuys <hanwen@lilypond.org>
+
+ * lily/script-column.cc (row_before_line_breaking): also handle
+ accidentals and arpeggios in horizontal script stacking.
+
+ * lily/script-row-engraver.cc (acknowledge_accidental_placement):
+ new function.
+
+ * input/regression/script-stack-horizontal.ly: trim.
+
2006-10-16 Han-Wen Nienhuys <hanwen@lilypond.org>
* scm/output-lib.scm (stroke-finger::calc-text): allow reading of
+
\header
{
texidoc = "horizontal scripts are ordered, so they do not overlap.
\relative
{
- \set stringFingerOrientations = #'(left)
+ \set stringNumberOrientations = #'(left)
\set fingeringOrientations = #'(left)
- \set strokeNumberOrientations = #'(left)
+ \set strokeFingerOrientations = #'(left)
<cis-1\4
- -\rightHandFinger #1
- es-2\5
- -\rightHandFinger #2
- gis-3\6
- -\rightHandFinger #3
- >\arpeggio
+ -\rightHandFinger #1 f>\arpeggio
}
#include "script-column.hh"
+#include "accidental-placement.hh"
+#include "arpeggio.hh"
#include "directional-element-interface.hh"
#include "side-position-interface.hh"
#include "warn.hh"
extract_grob_set (me, "scripts", scripts);
Grob_scripts_map head_scripts_map;
+ vector<Grob *> affect_all_grobs;
for (vsize i = 0; i < scripts.size (); i++)
{
Grob *sc = scripts[i];
/*
Don't want to consider scripts horizontally next to notes.
*/
- if (sc->get_property_data (ly_symbol2scm ("Y-offset")) !=
- Side_position_interface::x_aligned_side_proc)
+ if (Accidental_placement::has_interface (sc)
+ || Arpeggio::has_interface (sc))
+ {
+ affect_all_grobs.push_back (sc);
+ }
+ else if (sc->get_property_data (ly_symbol2scm ("Y-offset")) !=
+ Side_position_interface::x_aligned_side_proc)
{
head_scripts_map[sc->get_parent (Y_AXIS)].push_back (sc);
}
i != head_scripts_map.end ();
i++)
{
- order_grobs ((*i).second);
+ vector<Grob*> grobs = (*i).second;
+
+ // this isn't right in all cases, but in general a safe assumption.
+ concat (grobs, affect_all_grobs);
+ order_grobs (grobs);
}
return SCM_UNSPECIFIED;
for (vsize i = 0; i < scripts.size (); i++)
{
Grob *sc = scripts[i];
-
/*
Don't want to consider scripts horizontally next to notes.
*/
Side_position_interface::x_aligned_side_proc)
staff_sided.push_back (sc);
}
-
+
order_grobs (staff_sided);
return SCM_UNSPECIFIED;
-
}
void
*/
-
#include "engraver.hh"
+
+#include "accidental-placement.hh"
#include "script-column.hh"
#include "side-position-interface.hh"
public:
TRANSLATOR_DECLARATIONS (Script_row_engraver);
protected:
+ DECLARE_ACKNOWLEDGER (accidental_placement);
DECLARE_ACKNOWLEDGER (side_position);
void process_acknowledged ();
void stop_translation_timestep ();
if (script_row_)
{
for (vsize i = 0; i < scripts_.size (); i++)
- if (Side_position_interface::get_axis (scripts_[i]) == X_AXIS)
+ if (Accidental_placement::has_interface (scripts_[i])
+ || Side_position_interface::get_axis (scripts_[i]) == X_AXIS)
Script_column::add_side_positioned (script_row_, scripts_[i]);
}
}
}
+
+void
+Script_row_engraver::acknowledge_accidental_placement (Grob_info inf)
+{
+ scripts_.push_back (inf.grob ());
+}
+
+
void
Script_row_engraver::process_acknowledged ()
{
}
+ADD_ACKNOWLEDGER (Script_row_engraver, accidental_placement);
ADD_ACKNOWLEDGER (Script_row_engraver, side_position);
ADD_TRANSLATOR (Script_row_engraver,
/* doc */ "Determine order in horizontal side position elements. ",
\consists "Axis_group_engraver"
\consists "Figured_bass_engraver"
\consists "Figured_bass_position_engraver"
+ \consists "Script_row_engraver"
\override VerticalAxisGroup #'minimum-Y-extent = #'(-4 . 4)
extraVerticalExtent = ##f
\consists "Script_engraver"
\consists "Script_column_engraver"
- \consists "Script_row_engraver"
\consists "Rhythmic_column_engraver"
\consists "Phrasing_slur_engraver"
\consists "Cluster_spanner_engraver"
. (
(left-padding . 0.2)
+ ;; for horizontally stacked scripts.
+ (script-priority . -100)
+ (direction . ,LEFT)
+
(positioning-done . ,ly:accidental-placement::calc-positioning-done)
(X-extent . ,ly:axis-group-interface::width)
(right-padding . 0.15)
(meta . ((class . Item)
(interfaces . (accidental-placement-interface))))))
+
(Ambitus
. (
(axes . (0 1))
(X-offset . ,ly:side-position-interface::x-aligned-side)
(direction . ,LEFT)
(padding . 0.5)
+ (script-priority . 0)
(side-axis . ,X)
(staff-position . 0.0)
(meta . ((class . Item)
(duration-log . ,note-head::calc-duration-log)
(default-direction . ,ly:stem::calc-default-direction)
(stem-end-position . ,ly:stem::calc-stem-end-position)
+
(neutral-direction . ,DOWN)
(stem-info . ,ly:stem::calc-stem-info)
(positioning-done . ,ly:stem::calc-positioning-done)
. (
(stencil . ,ly:text-interface::print)
(text . ,stroke-finger::calc-text)
- (digit-names . #("P" "I" "m" "a" "x"))
+ (digit-names . #("p" "i" "m" "a" "x"))
(padding . 0.5)
(staff-padding . 0.5)
(self-alignment-X . 0)