2 text-engraver.cc -- implement Text_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "engraver.hh"
11 #include "staff-side.hh"
12 #include "text-item.hh"
13 #include "musical-request.hh"
14 #include "note-head.hh"
16 #include "staff-symbol.hh"
18 class Text_engraver
: public Engraver
20 Link_array
<Text_script_req
> reqs_
;
21 Link_array
<Staff_side_item
> positionings_
;
22 Link_array
<Text_item
> texts_
;
25 VIRTUAL_COPY_CONS(Translator
);
27 virtual bool do_try_music (Music
* m
);
28 virtual void do_pre_move_processing ();
29 virtual void do_post_move_processing ();
30 virtual void do_process_requests ();
31 virtual void acknowledge_element (Score_element_info
);
34 Text_engraver::Text_engraver ()
40 Text_engraver::do_try_music (Music
*m
)
42 if (Text_script_req
*r
= dynamic_cast<Text_script_req
*> (m
))
52 Text_engraver::acknowledge_element (Score_element_info i
)
54 if (Note_head
*n
= dynamic_cast<Note_head
*> (i
.elem_l_
))
56 for (int i
=0; i
< positionings_
.size (); i
++)
58 positionings_
[i
]->add_support (n
);
61 if (Stem
*n
= dynamic_cast<Stem
*> (i
.elem_l_
))
63 for (int i
=0; i
< positionings_
.size (); i
++)
65 positionings_
[i
]->add_support (n
);
71 Text_engraver::do_process_requests ()
73 for (int i
=0; i
< reqs_
.size (); i
++)
75 Text_script_req
* r
= reqs_
[i
];
77 Text_item
*text
= new Text_item
;
78 Staff_side_item
*ss
= new Staff_side_item
;
80 ss
->set_victim (text
);
81 ss
->set_elt_property (script_priority_scm_sym
,
86 text
->text_str_
= r
->text_str_
;
88 if (r
->style_str_
.empty_b ())
90 Scalar
p (get_property ("textStyle", 0));
95 text
->style_str_
= r
->style_str_
;
97 Scalar padding
= get_property ("textScriptPadding", 0);
98 if (padding
.length_i() && padding
.isnum_b ())
100 ss
->set_elt_property (padding_scm_sym
, gh_double2scm(Real(padding
)));
103 Scalar empty
= get_property ("textEmptyDimension", 0);
104 if (empty
.to_bool ())
106 text
->dim_cache_
[X_AXIS
]->set_empty (true);
109 announce_element (Score_element_info (text
, r
));
110 announce_element (Score_element_info (ss
, r
));
113 positionings_
.push (ss
);
118 Text_engraver::do_pre_move_processing ()
120 for (int i
=0; i
< texts_
.size (); i
++)
122 typeset_element (texts_
[i
]);
123 typeset_element (positionings_
[i
]);
126 positionings_
.clear ();
130 Text_engraver::do_post_move_processing ()
135 ADD_THIS_TRANSLATOR(Text_engraver
);