2 tie.cc -- implement Tie
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2005 Han-Wen Nienhuys <hanwen@cs.uu.nl>
15 #include "output-def.hh"
16 #include "rhythmic-head.hh"
18 #include "paper-column.hh"
20 #include "staff-symbol-referencer.hh"
21 #include "directional-element-interface.hh"
24 #include "note-head.hh"
25 #include "tie-column.hh"
28 tie: Connect two noteheads.
32 c4 ~ \clef bass ; c4 or
36 do we have non-horizontal ties then?
40 Tie::set_head (Grob *me, Direction d, Grob *h)
42 assert (!head (me, d));
43 index_set_cell (me->get_property ("head-pair"), d, h->self_scm ());
45 dynamic_cast<Spanner *> (me)->set_bound (d, h);
46 me->add_dependency (h);
50 Tie::set_interface (Grob *me)
52 me->set_property ("head-pair", scm_cons (SCM_EOL, SCM_EOL));
56 Tie::head (Grob *me, Direction d)
58 SCM c = me->get_property ("head-pair");
61 return unsmob_grob (index_get_cell (c, d));
67 Tie::get_column_rank (Grob *me, Direction d)
69 Spanner *span = dynamic_cast<Spanner *> (me);
70 Grob *h = head (me, d);
72 h = span->get_bound (d);
74 Grob *col = dynamic_cast<Item *> (h)->get_column ();
75 return Paper_column::get_rank (col);
79 Tie::get_position (Grob *me)
81 Direction d = head (me, LEFT) ? LEFT : RIGHT;
82 return Staff_symbol_referencer::get_position (head (me, d));
86 Default: Put the tie oppositie of the stem [Wanske p231]
88 In case of chords: Tie_column takes over
90 The direction of the Tie is more complicated (See [Ross] p136 and
93 (what about linebreaks? )
96 Tie::get_default_dir (Grob *me)
98 Item *sl = head (me, LEFT) ? Rhythmic_head::get_stem (head (me, LEFT)) : 0;
99 Item *sr = head (me, RIGHT) ? Rhythmic_head::get_stem (head (me, RIGHT)) : 0;
102 if (get_grob_direction (sl) == UP
103 && get_grob_direction (sr) == UP)
108 Item *s = sl ? sl : sr;
109 return -get_grob_direction (s);
116 Tie::set_direction (Grob *me)
118 if (!get_grob_direction (me))
120 if (Tie_column::has_interface (me->get_parent (Y_AXIS)))
121 Tie_column::set_directions (me->get_parent (Y_AXIS));
123 set_grob_direction (me, Tie::get_default_dir (me));
127 MAKE_SCHEME_CALLBACK (Tie, print, 1);
129 Tie::print (SCM smob)
131 Grob *me = unsmob_grob (smob);
133 SCM cp = me->get_property ("control-points");
134 if (!scm_is_pair (cp)) // list is more accurate
136 cp = get_control_points (smob);
137 me->set_property ("control-points", cp);
140 if (!scm_is_pair (cp))
141 return Stencil ().smobbed_copy ();
143 Real staff_thick = Staff_symbol_referencer::line_thickness (me);
144 Real base_thick = robust_scm2double (me->get_property ("thickness"), 1);
145 Real thick = base_thick * staff_thick;
149 for (SCM s = cp; s != SCM_EOL; s = scm_cdr (s))
151 b.control_[i] = ly_scm2offset (scm_car (s));
157 SCM p = me->get_property ("dash-period");
158 SCM f = me->get_property ("dash-fraction");
159 if (scm_is_number (p) && scm_is_number (f))
160 a = Lookup::dashed_slur (b,
162 robust_scm2double (p, 1.0),
163 robust_scm2double (f, 0));
166 get_grob_direction (me) * staff_thick,
169 return a.smobbed_copy ();
174 "A tie connecting two noteheads.\n",
176 "y-offset dash-period dash-fraction "
177 "staffline-clearance control-points head-pair "
178 "details thickness x-gap direction minimum-length");