source file of the GNU LilyPond music typesetter
- (c) 1996--2001 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1996--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
TODO: This is way too hairy
*/
+
#include <math.h> // m_pi
#include "lookup.hh"
Real pos;
if (!gh_number_p (p))
{
-
pos = get_default_stem_end_position (me);
me->set_grob_property ("stem-end-position", gh_double2scm (pos));
}
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));
Stem::note_head_positions (Grob *me)
{
Array<int> ps ;
- 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));
ps.push (p);
if (Note_head::has_interface (n))
{
- Pointer_group_interface::add_element (me, "heads",n);
+ Pointer_group_interface::add_grob (me, ly_symbol2scm ("heads"), n);
}
else
{
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
which should be a dot-column.
*/
if (dir * (st + flagy - dp) < 0.5)
- Side_position_interface::add_support (dots->parent_l (X_AXIS), me);
+ Side_position_interface::add_support (dots->get_parent (X_AXIS), me);
/*
previous approach was to lengthen the stem. This is not
return;
Link_array<Grob> heads =
- Pointer_group_interface__extract_elements (me, (Grob*)0, "heads");
+ Pointer_group_interface__extract_grobs (me, (Grob*)0, "heads");
heads.sort (compare_position);
Direction dir =get_direction (me);
Grob *hed = support_head (me);
- Real w = hed->extent (hed, X_AXIS)[dir];
+ Real w = Note_head::head_extent (hed,X_AXIS)[dir];
for (int i=0; i < heads.size (); i++)
{
- heads[i]->translate_axis (w - heads[i]->extent (heads[i], X_AXIS)[dir], X_AXIS);
+ heads[i]->translate_axis (w - Note_head::head_extent (heads[i],X_AXIS)[dir],
+ X_AXIS);
}
bool parity= true; // todo: make me settable.
// suicide ();
}
- set_spacing_hints (me);
return SCM_UNSPECIFIED;
}
-
/*
ugh.
When in a beam with tuplet brackets, brew_mol is called early,
}
-/**
- set stem directions for hinting the optical spacing correction.
-
- Modifies DIR_LIST property of the Stem's Paper_column
-
- TODO: more advanced: supply height of noteheads as well, for more advanced spacing possibilities
- */
-void
-Stem::set_spacing_hints (Grob*me)
-{
- if (!invisible_b (me))
- {
- SCM scmdir = gh_int2scm (get_direction (me));
-
- Item* item = dynamic_cast<Item*> (me);
- Item * col = item->column_l ();
- SCM dirlist =col->get_grob_property ("dir-list");
- if (scm_c_memq (scmdir, dirlist) == SCM_BOOL_F)
- {
- dirlist = gh_cons (scmdir, dirlist);
- col->set_grob_property ("dir-list", dirlist);
- }
- }
-}
-
Molecule
Stem::flag (Grob*me)
{
Real y1 = Staff_symbol_referencer::position_f (first_head (me));
Real y2 = stem_end_position (me);
- Interval stem_y (y1,y2);
- stem_y.unite (Interval (y2,y1));
+ Interval stem_y (y1 <? y2,y2 >? y1);
+
// dy?
- Real dy = Staff_symbol_referencer::staff_space (me)/2.0;
-
+ Real dy = Staff_symbol_referencer::staff_space (me) * 0.5;
+
if (Grob *hed = support_head (me))
{
- Interval head_height = hed->extent (hed,Y_AXIS);
+ /*
+ must not take ledgers into account.
+ */
+ Interval head_height = Note_head::head_extent (hed,Y_AXIS);
Real y_attach = Note_head::stem_attachment_coordinate ( hed, Y_AXIS);
y_attach = head_height.linear_combination (y_attach);
- stem_y[Direction (-d)] += d * 2*y_attach;
+ stem_y[Direction (-d)] += d * y_attach/dy;
}
if (!invisible_b (me))
Real r=0;
if (Grob * f = first_head (me))
{
- Interval head_wid = f->extent (f,X_AXIS);
+ Interval head_wid = Note_head::head_extent(f, X_AXIS);
Real attach =
Note_head::stem_attachment_coordinate(f, X_AXIS);
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;