lilypond-1.1.51
[lilypond.git] / lily / text-engraver.cc
blob74a0d33fc1f93168d7ef256cdec3c7f5c309c106
1 /*
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>
8 */
10 #include "engraver.hh"
11 #include "staff-side.hh"
12 #include "text-item.hh"
13 #include "musical-request.hh"
14 #include "note-head.hh"
15 #include "stem.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_;
23 public:
24 Text_engraver();
25 VIRTUAL_COPY_CONS(Translator);
26 protected:
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 ()
39 bool
40 Text_engraver::do_try_music (Music *m)
42 if (Text_script_req *r = dynamic_cast<Text_script_req*> (m))
44 reqs_.push (r);
45 return true;
47 return false;
51 void
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);
70 void
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,
82 gh_int2scm (200));
84 ss->dir_ = r->dir_;
86 text->text_str_ = r->text_str_;
88 if (r->style_str_.empty_b ())
90 Scalar p (get_property ("textStyle", 0));
91 if (p.length_i ())
92 text->style_str_ = p;
94 else
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));
112 texts_.push (text);
113 positionings_.push (ss);
117 void
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]);
125 texts_.clear ();
126 positionings_.clear ();
129 void
130 Text_engraver::do_post_move_processing ()
132 reqs_.clear ();
135 ADD_THIS_TRANSLATOR(Text_engraver);