2 text-engraver.cc -- implement Text_engraver
4 source file of the GNU LilyPond music typesetter
6 (c) 1998--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "dimension-cache.hh"
11 #include "engraver.hh"
12 #include "side-position-interface.hh"
14 #include "musical-request.hh"
17 #include "staff-symbol.hh"
20 typeset directions that are plain text.
22 class Text_engraver : public Engraver
24 Link_array<Text_script_req> reqs_;
25 Link_array<Item> texts_;
27 VIRTUAL_COPY_CONS(Translator);
29 virtual bool do_try_music (Music* m);
30 virtual void do_pre_move_processing ();
31 virtual void do_post_move_processing ();
32 virtual void do_process_music ();
33 virtual void acknowledge_element (Score_element_info);
38 Text_engraver::do_try_music (Music *m)
40 if (Text_script_req *r = dynamic_cast<Text_script_req*> (m))
50 Text_engraver::acknowledge_element (Score_element_info inf)
52 if (to_boolean (inf.elem_l_->get_elt_property ("note-head-interface")))
54 for (int i=0; i < texts_.size (); i++)
56 Side_position_interface st (texts_[i]);
57 st.add_support (inf.elem_l_);
58 if (st.get_axis( ) == X_AXIS
59 && !texts_[i]->parent_l (Y_AXIS))
60 texts_[i]->set_parent (inf.elem_l_, Y_AXIS);
63 if (Stem *n = dynamic_cast<Stem*> (inf.elem_l_))
65 for (int i=0; i < texts_.size (); i++)
67 Side_position_interface st(texts_[i]);
74 Text_engraver::do_process_music ()
76 for (int i=0; i < reqs_.size (); i++)
78 Text_script_req * r = reqs_[i];
80 Item *text = new Item (get_property ("basicTextScriptProperties"));
81 Side_position_interface stafy (text);
83 SCM axisprop = get_property ("scriptHorizontal");
84 if (to_boolean (axisprop))
86 stafy.set_axis (X_AXIS);
87 // text->set_parent (ss, Y_AXIS);
90 stafy.set_axis (Y_AXIS);
93 make sure they're in order by adding i to the priority field.
95 text->set_elt_property ("script-priority",
96 gh_int2scm (200 + i));
98 if (r->get_direction ())
99 stafy.set_direction (r->get_direction ());
101 text->set_elt_property ("text",
102 ly_str02scm ( r->text_str_.ch_C ()));
104 if (r->style_str_.length_i ())
105 text->set_elt_property ("style", ly_str02scm (r->style_str_.ch_C()));
107 SCM empty = get_property ("textNonEmpty");
108 if (to_boolean (empty))
110 text->set_elt_property ("no-spacing-rods" , SCM_BOOL_F);
111 text->set_extent_callback (0, X_AXIS);
113 announce_element (Score_element_info (text, r));
119 Text_engraver::do_pre_move_processing ()
121 for (int i=0; i < texts_.size (); i++)
123 Item *ti = texts_[i];
124 Side_position_interface (ti).add_staff_support ();
125 typeset_element (ti);
131 Text_engraver::do_post_move_processing ()
136 ADD_THIS_TRANSLATOR(Text_engraver);