]> git.donarmstrong.com Git - lilypond.git/blob - lily/text-engraver.cc
release: 1.1.67
[lilypond.git] / lily / text-engraver.cc
1 /*   
2   text-engraver.cc --  implement Text_engraver
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include "dimension-cache.hh"
10
11 #include "engraver.hh"
12 #include "staff-side.hh"
13 #include "text-item.hh"
14 #include "musical-request.hh"
15 #include "note-head.hh"
16 #include "stem.hh"
17 #include "staff-symbol.hh"
18
19 class Text_engraver : public Engraver
20 {
21   Link_array<Text_script_req> reqs_;
22   Link_array<Staff_side_item> positionings_;
23   Link_array<Text_item> texts_;
24 public:
25   Text_engraver();
26   VIRTUAL_COPY_CONS(Translator);
27 protected:
28   virtual bool do_try_music (Music* m);
29   virtual void do_pre_move_processing ();
30   virtual void do_post_move_processing ();
31   virtual void do_process_requests ();
32   virtual void acknowledge_element (Score_element_info);
33 };
34
35 Text_engraver::Text_engraver ()
36 {
37   
38 }
39
40 bool
41 Text_engraver::do_try_music (Music *m)
42 {
43   if (Text_script_req *r = dynamic_cast<Text_script_req*> (m))
44     {
45       reqs_.push (r);
46       return true;
47     }
48   return false;
49 }
50
51
52 void
53 Text_engraver::acknowledge_element (Score_element_info i)
54 {
55   if (Note_head *n = dynamic_cast<Note_head*> (i.elem_l_))
56     {
57       for (int i=0; i < positionings_.size (); i++)
58         {
59           positionings_[i]->add_support (n);
60         }
61     }
62   if (Stem *n = dynamic_cast<Stem*> (i.elem_l_))
63     {
64       for (int i=0; i < positionings_.size (); i++)
65         {
66           positionings_[i]->add_support (n);
67         }
68     }
69 }
70
71 void
72 Text_engraver::do_process_requests ()
73 {
74   for (int i=0; i < reqs_.size (); i++)
75     {
76       Text_script_req * r = reqs_[i];
77
78       Text_item *text = new Text_item;
79       Staff_side_item *ss = new Staff_side_item;
80
81       ss->set_victim (text);
82       ss->set_elt_property (script_priority_scm_sym,
83                             gh_int2scm (200));
84
85       ss->dir_ = r->dir_;
86
87       text->text_str_ = r->text_str_;
88       
89       if (r->style_str_.empty_b ())
90         {
91           Scalar p (get_property ("textStyle", 0));
92           if (p.length_i ())
93             text->style_str_ = p;
94         }
95       else
96         text->style_str_ = r->style_str_;
97       
98       Scalar padding = get_property ("textScriptPadding", 0);
99       if (padding.length_i() && padding.isnum_b ())
100         {
101           ss->set_elt_property (padding_scm_sym, gh_double2scm(Real(padding)));
102         }
103
104       Scalar empty = get_property ("textEmptyDimension", 0);
105       if (empty.to_bool ())
106         {
107           text->dim_cache_[X_AXIS]->set_empty (true);
108         }
109       
110       announce_element (Score_element_info (text, r));
111       announce_element (Score_element_info (ss, r));
112
113       texts_.push (text);
114       positionings_.push (ss);
115     }
116 }
117
118 void
119 Text_engraver::do_pre_move_processing ()
120 {
121   for (int i=0; i < texts_.size (); i++)
122     {
123       typeset_element (texts_[i]);
124       typeset_element (positionings_[i]);
125     }
126   texts_.clear ();
127   positionings_.clear ();
128 }
129
130 void
131 Text_engraver::do_post_move_processing ()
132 {
133   reqs_.clear ();
134 }
135
136 ADD_THIS_TRANSLATOR(Text_engraver);