2 plet-spanner.cc -- implement Plet_spanner
4 source file of the GNU LilyPond music typesetter
6 (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
13 #include "molecule.hh"
15 #include "paper-def.hh"
16 #include "plet-spanner.hh"
18 #include "text-def.hh"
20 IMPLEMENT_IS_TYPE_B1 (Plet_spanner
,Bow
);
22 Plet_spanner::Plet_spanner ()
25 stem_l_drul_
[RIGHT
] =0;
26 stem_l_drul_
[LEFT
] =0;
29 tdef_p_
= new Text_def
;
30 tdef_p_
->align_i_
= CENTER
;
31 tdef_p_
->style_str_
= "italic";
34 Plet_spanner::Plet_spanner (Plet_spanner
const& c
)
37 tdef_p_
= new Text_def (*c
.tdef_p_
);
38 stem_l_drul_
= c
.stem_l_drul_
;
39 visibility_i_
= c
.visibility_i_
;
42 Plet_spanner::~Plet_spanner ()
48 Plet_spanner::brew_molecule_p () const
50 Molecule
* mol_p
= new Molecule
;
52 Real w
= width ().length ();
54 Real dy_f
= dy_f_drul_
[RIGHT
] - dy_f_drul_
[LEFT
];
56 w
+= (dx_f_drul_
[RIGHT
] - dx_f_drul_
[LEFT
]);
58 Atom a
= paper ()->lookup_l ()->plet (dy_f
, w
, dir_
);
60 a
.translate (Offset (dx_f_drul_
[LEFT
], dy_f_drul_
[LEFT
]));
62 if (visibility_i_
>= 2)
65 Real interline_f
= paper ()->interline_f ();
66 Real numy_f
= (dir_
> 0 ? 0 : -interline_f
) + dir_
* interline_f
/ 2;
67 Atom
num (tdef_p_
->get_atom (paper (), CENTER
));
68 num
.translate (Offset (width ().length ()/ 2 + dx_f_drul_
[LEFT
],
69 dy_f_drul_
[LEFT
] + dy_f
/ 2 + numy_f
));
71 if (visibility_i_
>= 1)
78 Plet_spanner::do_add_processing ()
80 if (! (stem_l_drul_
[LEFT
] && stem_l_drul_
[RIGHT
]))
81 warning (_ ("Lonely plet.. "));
84 Drul_array
<Stem
*> new_stem_drul
= stem_l_drul_
;
87 new_stem_drul
[d
] = stem_l_drul_
[(Direction
)-d
];
88 } while (flip(&d
) != LEFT
);
89 stem_l_drul_
= new_stem_drul
;
93 Plet_spanner::do_post_processing ()
95 Real interline_f
= paper ()->interline_f ();
96 Real nh_f
= interline_f
/ 2;
97 assert (stem_l_drul_
[LEFT
] || stem_l_drul_
[RIGHT
]);
100 Real nw_f
= paper ()->note_width () * 0.8;
105 Stem
* s
= stem_l_drul_
[d
] ? stem_l_drul_
[d
] : stem_l_drul_
[(Direction
)-d
];
106 dy_f_drul_
[d
] = dir_
== s
->get_dir () ? s
->stem_end_f ()
107 : s
->stem_begin_f () + dir_
* nh_f
/ 2;
108 dy_f_drul_
[d
] *= .5 * interline_f
;
109 dy_f_drul_
[d
] += dir_
* interline_f
;
111 dx_f_drul_
[d
] = nw_f
;
113 while (flip(&d
) != LEFT
);
117 Plet_spanner::do_substitute_dependency (Score_elem
* o
, Score_elem
* n
)
119 Stem
* new_l
= n
? (Stem
*)n
->item () : 0;
120 if (o
->item () == stem_l_drul_
[LEFT
])
121 stem_l_drul_
[LEFT
] = new_l
;
122 else if (o
->item () == stem_l_drul_
[RIGHT
])
123 stem_l_drul_
[RIGHT
] = new_l
;
127 Plet_spanner::set_default_dir ()
129 Real m
= (stem_l_drul_
[LEFT
]->stem_end_f ()
130 + stem_l_drul_
[RIGHT
]->stem_end_f ()) / 2;
131 dir_
= (m
< 0) ? DOWN
: UP
;
135 Plet_spanner::set_stem (Direction d
, Stem
* stem_l
)
137 assert (!stem_l_drul_
[d
]);
138 stem_l_drul_
[d
] = stem_l
;
139 set_bounds (d
, stem_l
);
141 add_dependency (stem_l
);