UGH.
*/
- return unsmob_grob (gh_car (me->get_grob_property ("heads")));
+ return unsmob_grob (ly_car (me->get_grob_property ("heads")));
}
else
return first_head (me);
Drul_array<Grob *> exthead;
exthead[LEFT] = exthead[RIGHT] =0;
- for (SCM s = me->get_grob_property ("heads"); gh_pair_p (s); s = gh_cdr (s))
+ for (SCM s = me->get_grob_property ("heads"); gh_pair_p (s); s = ly_cdr (s))
{
- Grob * n = unsmob_grob (gh_car (s));
+ Grob * n = unsmob_grob (ly_car (s));
int p = int (Staff_symbol_referencer::position_f (n));
return exthead;
}
+static int
+icmp (int const &a, int const &b)
+{
+ return a-b;
+}
+
+Array<int>
+Stem::note_head_positions (Grob *me)
+{
+ Array<int> ps ;
+ for (SCM s = me->get_grob_property ("heads"); gh_pair_p (s); s = ly_cdr (s))
+ {
+ Grob * n = unsmob_grob (ly_car (s));
+ int p = int (Staff_symbol_referencer::position_f (n));
+
+ ps.push (p);
+ }
+
+ ps.sort (icmp);
+ return ps;
+}
+
+
void
Stem::add_head (Grob*me, Grob *n)
{
else
{
s = me->get_grob_property ("lengths");
- for (SCM q = s; q != SCM_EOL; q = gh_cdr (q))
- a.push (gh_scm2double (gh_car (q)));
+ for (SCM q = s; q != SCM_EOL; q = ly_cdr (q))
+ a.push (gh_scm2double (ly_car (q)));
// stem uses half-spaces
length_f = a[ ((flag_i (me) - 2) >? 0) <? (a.size () - 1)] * 2;
a.clear ();
s = me->get_grob_property ("stem-shorten");
- for (SCM q = s; gh_pair_p (q); q = gh_cdr (q))
- a.push (gh_scm2double (gh_car (q)));
+ for (SCM q = s; gh_pair_p (q); q = ly_cdr (q))
+ a.push (gh_scm2double (ly_car (q)));
// stem uses half-spaces
- // fixme: use gh_list_ref () iso. array[]
+ // fixme: use scm_list_n_ref () iso. array[]
Real shorten_f = a[ ((flag_i (me) - 2) >? 0) <? (a.size () - 1)] * 2;
/* URGURGURG
return st;
}
+
+
/*
Number of hooks on the flag, ie. the log of the duration.
*/
Molecule
Stem::flag (Grob*me)
{
- // TODO: rename flag-style into something more appropriate,
- // e.g. "stroke-style", maybe with values "" (i.e. no stroke),
- // "single" and "double". Needs more discussion.
- String style, fstyle, stafflineOffs;
+ /* TODO: rename flag-style into something more appropriate,
+ e.g. "stroke-style", maybe with values "" (i.e. no stroke),
+ "single" and "double". Needs more discussion.
+ */
+ String style, fstyle, staffline_offs;
SCM fst = me->get_grob_property ("flag-style");
if (gh_string_p (fst))
{
style = "";
}
if (String::compare_i (style, "mensural") == 0)
- // Mensural notation: For notes on staff lines, use different
- // flags than for notes between staff lines. The idea is that
- // flags are always vertically aligned with the staff lines,
- // regardless if the note head is on a staff line or between two
- // staff lines. In other words, the inner end of a flag always
- // touches a staff line.
+ /* Mensural notation: For notes on staff lines, use different
+ flags than for notes between staff lines. The idea is that
+ flags are always vertically aligned with the staff lines,
+ regardless if the note head is on a staff line or between two
+ staff lines. In other words, the inner end of a flag always
+ touches a staff line.
+ */
{
- // Urrgh! We have to detect wether this stem ends on a staff
- // line or between two staff lines. But we can not call
- // stem_end_position(me) or get_default_stem_end_position(me),
- // since this encounters the flag and hence results in an
- // infinite recursion. However, in pure mensural notation,
- // there are no multiple note heads attached to a single stem,
- // neither is there usually need for using the stem_shorten
- // property (except for 32th and 64th notes, but that is not a
- // problem since the stem length in this case is augmented by
- // an integral multiple of staff_space). Hence, it should be
- // sufficient to just take the first note head, assume it's
- // the only one, look if it's on a staff line, and select the
- // flag's shape accordingly. In the worst case, the shape
- // looks slightly misplaced, but that will usually be the
- // programmer's fault (e.g. when trying to attach multiple
- // note heads to a single stem in mensural notation).
- Grob *firstHead = first_head(me);
+ /* Urrgh! We have to detect wether this stem ends on a staff
+ line or between two staff lines. But we can not call
+ stem_end_position(me) or get_default_stem_end_position(me),
+ since this encounters the flag and hence results in an
+ infinite recursion. However, in pure mensural notation,
+ there are no multiple note heads attached to a single stem,
+ neither is there usually need for using the stem_shorten
+ property (except for 32th and 64th notes, but that is not a
+ problem since the stem length in this case is augmented by
+ an integral multiple of staff_space). Hence, it should be
+ sufficient to just take the first note head, assume it's
+ the only one, look if it's on a staff line, and select the
+ flag's shape accordingly. In the worst case, the shape
+ looks slightly misplaced, but that will usually be the
+ programmer's fault (e.g. when trying to attach multiple
+ note heads to a single stem in mensural notation).
+
+ */
+ Grob *first = first_head(me);
int sz = Staff_symbol_referencer::line_count (me)-1;
- int p = (int)rint (Staff_symbol_referencer::position_f (firstHead));
- stafflineOffs = (((p ^ sz) & 0x1) == 0) ? "1" : "0";
+ int p = (int)rint (Staff_symbol_referencer::position_f (first));
+ staffline_offs = (((p ^ sz) & 0x1) == 0) ? "1" : "0";
}
else
{
- stafflineOffs = "";
+ staffline_offs = "";
}
char c = (get_direction (me) == UP) ? 'u' : 'd';
- Molecule m =
- Font_interface::get_default_font (me)->
- find_by_name (String ("flags-") + style + to_str (c) + stafflineOffs +
- to_str (flag_i (me)));
+ String index_str
+ = String ("flags-") + style + to_str (c) + staffline_offs + to_str (flag_i (me));
+ Molecule m
+ = Font_interface::get_default_font (me)->find_by_name (index_str);
if (!fstyle.empty_b ())
m.add_molecule (Font_interface::get_default_font (me)->find_by_name (String ("flags-") + to_str (c) + fstyle));
return m;
s = me->get_grob_property ("beamed-minimum-lengths");
a.clear ();
- for (SCM q = s; q != SCM_EOL; q = gh_cdr (q))
- a.push (gh_scm2double (gh_car (q)));
+ for (SCM q = s; q != SCM_EOL; q = ly_cdr (q))
+ a.push (gh_scm2double (ly_car (q)));
Real minimum_length = a[multiplicity <? (a.size () - 1)] * staff_space;
s = me->get_grob_property ("beamed-lengths");
a.clear ();
- for (SCM q = s; q != SCM_EOL; q = gh_cdr (q))
- a.push (gh_scm2double (gh_car (q)));
+ for (SCM q = s; q != SCM_EOL; q = ly_cdr (q))
+ a.push (gh_scm2double (ly_car (q)));
Real stem_length = a[multiplicity <? (a.size () - 1)] * staff_space;