source file of the GNU LilyPond music typesetter
- (c) 1996, 1997--1998 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1996, 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
TODO: This is way too hairy
*/
#include "beam.hh"
#include "rest.hh"
-
-
-
Stem::~Stem ()
{
}
Stem::Stem ()
{
- /*
- TODO: staff-size
- */
beams_i_drul_[LEFT] = beams_i_drul_[RIGHT] = -1;
mult_i_ = 0;
yextent_drul_[DOWN] = yextent_drul_[UP] = 0;
flag_i_ = 2;
dir_ = CENTER;
- beam_dir_ = CENTER;
- dir_forced_b_ = false;
stem_xdir_ = LEFT;
- staff_size_i_ = 8;
beam_gap_i_ = 0;
beam_l_ = 0;
Interval_t<int>
Stem::head_positions () const
{
+ /*
+ Mysterious FreeBSD fix by John Galbraith. Somehow, the empty intervals
+ trigger FP exceptions on FreeBSD. Fix: do not return infinity
+
+ */
+ if (!head_l_arr_.size ())
+ {
+ return Interval_t<int> (100,-100);
+ }
+
Interval_t<int> r;
for (int i =0; i < head_l_arr_.size (); i++)
{
Real
Stem::chord_start_f () const
{
- return head_positions()[dir_] * paper ()->internote_f ();
+ return head_positions()[dir_] * staff_line_leading_f ()/2.0;
}
Real
Stem::add_head (Rhythmic_head *n)
{
n->add_dependency (this); // ?
- if (dynamic_cast<Note_head *> (n))
+ if (Note_head *nh = dynamic_cast<Note_head *> (n))
{
- head_l_arr_.push ((Note_head*)n);
+ head_l_arr_.push (nh);
}
- else if (dynamic_cast<Rest *> (n))
+ else if (Rest *r = dynamic_cast<Rest *> (n))
{
- rest_l_arr_.push ((Rest*)n);
+ rest_l_arr_.push (r);
}
}
void
Stem::set_default_stemlen ()
{
- /*
- TODO
- urg; this should be handled by Stem_info
- */
-
- Real length_f = paper ()->get_var ("stem_length");
- Real shorten_f = paper ()->get_var ("forced_stem_shorten");
+ Real internote_f = staff_line_leading_f ()/2.0;
+ Real length_f = paper_l ()->get_var ("stem_length0") / internote_f;
+ Real shorten_f = paper_l ()->get_var ("forced_stem_shorten0") / internote_f;
- Real internote_f = paper ()->internote_f ();
- length_f /= internote_f;
- shorten_f /= internote_f;
-
- Real len = length_f;
if (!dir_)
set_default_dir ();
/*
stems in unnatural (forced) direction should be shortened,
accoding to [Roush & Gourlay]
*/
- else if (dir_ != get_default_dir ())
- len -= shorten_f / internote_f;
+ if (((int)chord_start_f ())
+ && (dir_ != get_default_dir ()))
+ length_f -= shorten_f;
if (flag_i_ >= 5)
- len += 2.0;
+ length_f += 2.0;
if (flag_i_ >= 6)
- len += 1.0;
+ length_f += 1.0;
- set_stemend ((dir_ > 0) ? head_positions()[BIGGER] + len :
- head_positions()[SMALLER] - len);
+ set_stemend ((dir_ > 0) ? head_positions()[BIGGER] + length_f:
+ head_positions()[SMALLER] - length_f);
if (dir_ * stem_end_f () < 0)
- {
- set_stemend (0);
- }
+ set_stemend (0);
}
+
//xxx
void
Stem::set_default_extents ()
set_default_extents ();
set_noteheads ();
flag_i_ = flag_i_;
- transparent_b_ = invisible_b ();
+ if (invisible_b ())
+ {
+ set_elt_property (transparent_scm_sym, SCM_BOOL_T);
+ }
set_empty (invisible_b ());
}
{
Molecule *mol_p =new Molecule;
Drul_array<Real> stem_y = yextent_drul_;
- Real dy = paper ()->internote_f ();
+ Real dy = staff_line_leading_f ()/2.0;
Real head_wid = 0;
if (head_l_arr_.size ())
if (!invisible_b ())
{
- Atom ss =lookup_l ()->stem (stem_y[DOWN]*dy,
+ Molecule ss =lookup_l ()->stem (stem_y[DOWN]*dy,
stem_y[UP]*dy);
- mol_p->add_atom (ss);
+ mol_p->add_molecule (ss);
}
if (!beam_l_ && abs (flag_i_) > 2)
{
- Atom fl = lookup_l ()->flag (flag_i_, dir_);
+ Molecule fl = lookup_l ()->flag (flag_i_, dir_);
fl.translate_axis(stem_y[dir_]*dy, Y_AXIS);
- mol_p->add_atom (fl);
+ mol_p->add_molecule (fl);
}
if (head_l_arr_.size())
if (head_l_arr_.size())
{
Interval head_wid(0, head_l_arr_[0]->extent (X_AXIS).length ());
- Real rule_thick(paper ()->rule_thickness ());
+ Real rule_thick(paper_l ()->rule_thickness ());
Interval stem_wid(-rule_thick/2, rule_thick/2);
if (stem_xdir_ == CENTER)
r = head_wid.center ();
}
/*
- TODO: head_l_arr_/rest_l_arr_ in do_substitute_dependent ()
+ TODO: head_l_arr_/rest_l_arr_ in
*/
void
-Stem::do_substitute_dependency (Score_element*o,Score_element*n)
+Stem::do_substitute_element_pointer (Score_element*o,Score_element*n)
{
if (Note_head*h=dynamic_cast<Note_head*> (o))
head_l_arr_.substitute (h, dynamic_cast<Note_head*>(n));
if (Rest *r=dynamic_cast<Rest*> (o))
rest_l_arr_.substitute (r, dynamic_cast<Rest*>(n));
+ if (Beam* b = dynamic_cast<Beam*> (o))
+ {
+ if (b == beam_l_)
+ {
+ beam_l_ = dynamic_cast<Beam*> (n);
+ if (!beam_l_)
+ {
+ beams_i_drul_[LEFT] = 0;
+ beams_i_drul_[RIGHT] = 0;
+ mult_i_ = 0;
+ }
+ }
+ }
+ Staff_symbol_referencer::do_substitute_element_pointer (o,n);
+
}