2 stem-info.cc -- implement Stem_info
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--1998 Jan Nieuwenhuizen <janneke@gnu.org>
15 #include "paper-def.hh"
17 #include "stem-info.hh"
19 #include "staff-sym.hh"
21 Stem_info::Stem_info ()
25 Stem_info::Stem_info (Stem
*s
)
28 x_
= stem_l_
->hpos_f ();
30 beam_dir_
= stem_l_
->beam_dir_
;
31 mult_i_
= stem_l_
->mult_i_
;
34 Paper_def
* paper_l
= stem_l_
->paper ();
35 Real internote_f
= paper_l
->internote_f ();
36 Real interbeam_f
= paper_l
->interbeam_f (mult_i_
);
37 Real beam_f
= paper_l
->beam_thickness_f ();
41 DOUT
<< "******" << i
++ << "******\n"
42 << "begin_f: " << stem_l_
->stem_begin_f () * dir_
43 << "\nchord_f/i: " << stem_l_
->chord_start_f () * dir_
/ internote_f
<< '\n';
46 // strangely enough, dim(chord_start_f) == pt (and not internote!)
47 idealy_f_
= stem_l_
->chord_start_f () / internote_f
;
49 // calculate using dim(y) == pt
50 idealy_f_
*= internote_f
;
52 // for simplicity, we calculate as if dir == UP
53 idealy_f_
*= beam_dir_
;
55 int stem_max
= (int)rint(paper_l
->get_var ("stem_max"));
56 Real min_stem_f
= paper_l
->get_var (String ("minimum_stem_length")
57 + to_str (mult_i_
<? stem_max
));
58 Real stem_f
= paper_l
->get_var (String ("stem_length")
59 + to_str (mult_i_
<? stem_max
));
61 if (!beam_dir_
|| (beam_dir_
== dir_
))
62 /* normal beamed stem */
67 idealy_f_
+= (mult_i_
- 1) * interbeam_f
;
73 miny_f_
+= min_stem_f
;
75 // lowest beam of (UP) beam must never be lower than second staffline
76 miny_f_
= miny_f_
>? (- 2 * internote_f
- beam_f
77 + (mult_i_
> 0) * beam_f
+ interbeam_f
* (mult_i_
- 1));
83 // idealy_f_ -= (mult_i_ - 1) * interbeam_f;
84 // idealy_f_ += (mult_i_ - stem_l_->flag_i_ >? 0) * interbeam_f;
89 maxy_f_
-= min_stem_f
;
92 // set dim(y) == internote
93 idealy_f_
/= internote_f
;
94 miny_f_
/= internote_f
;
95 maxy_f_
/= internote_f
;
97 DOUT
<< "dir_: " << dir_
<< '\n';
98 DOUT
<< "mult_i_: " << mult_i_
<< '\n';
99 DOUT
<< "idealy_f_: " << idealy_f_
<< '\n';
100 DOUT
<< "miny_f_: " << miny_f_
<< '\n';
101 DOUT
<< "maxy_f_: " << maxy_f_
<< '\n';
103 idealy_f_
= maxy_f_
<? idealy_f_
;
104 idealy_f_
= miny_f_
>? idealy_f_
;
107 Beam
* beam_l_
= stem_l_
->beam_l_
;
108 if (beam_l_
->sinfo_
.size ()
109 && stem_l_
->staff_sym_l_
!= beam_l_
->sinfo_
[0].stem_l_
->staff_sym_l_
)
111 if (stem_l_
->staff_sym_l_
->dim_cache_
[Y_AXIS
].valid_b ())
113 interstaff_f_
= stem_l_
->staff_sym_l_
->absolute_coordinate (Y_AXIS
)
114 - beam_l_
->sinfo_
[0].stem_l_
->staff_sym_l_
->absolute_coordinate (Y_AXIS
) / internote_f
;
118 warning (_ ("invalid dimension cache: guessing staff position"));
119 if (beam_l_
->vertical_align_drul_
[MIN
] !=
120 beam_l_
->vertical_align_drul_
[MAX
])
121 warning (_ ("minVerticalAlign != maxVerticalAlign: interstaff slurs may be broken"));
122 interstaff_f_
= beam_l_
->vertical_align_drul_
[MIN
] / internote_f
;
123 // urg, guess staff order:
124 // if our stem ends higher, our staff is probably lower...
125 if (idealy_f_
* beam_dir_
> beam_l_
->sinfo_
[0].idealy_f_
* beam_dir_
)
128 idealy_f_
+= interstaff_f_
* beam_dir_
;
129 miny_f_
+= interstaff_f_
* beam_dir_
;
130 maxy_f_
+= interstaff_f_
* beam_dir_
;