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>
9 #include "dimension-cache.hh"
11 #include "engraver.hh"
12 #include "side-position-interface.hh"
13 #include "text-item.hh"
14 #include "musical-request.hh"
15 #include "note-head.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
<Text_item
> texts_
;
28 VIRTUAL_COPY_CONS(Translator
);
30 virtual bool do_try_music (Music
* m
);
31 virtual void do_pre_move_processing ();
32 virtual void do_post_move_processing ();
33 virtual void do_process_requests ();
34 virtual void acknowledge_element (Score_element_info
);
39 Text_engraver::do_try_music (Music
*m
)
41 if (Text_script_req
*r
= dynamic_cast<Text_script_req
*> (m
))
51 Text_engraver::acknowledge_element (Score_element_info i
)
53 if (Note_head
*n
= dynamic_cast<Note_head
*> (i
.elem_l_
))
55 for (int i
=0; i
< texts_
.size (); i
++)
57 Side_position_interface
st (texts_
[i
]);
59 if (st
.get_axis( ) == X_AXIS
60 && !texts_
[i
]->parent_l (Y_AXIS
))
61 texts_
[i
]->set_parent (n
, Y_AXIS
);
64 if (Stem
*n
= dynamic_cast<Stem
*> (i
.elem_l_
))
66 for (int i
=0; i
< texts_
.size (); i
++)
68 Side_position_interface
st(texts_
[i
]);
75 Text_engraver::do_process_requests ()
77 for (int i
=0; i
< reqs_
.size (); i
++)
79 Text_script_req
* r
= reqs_
[i
];
81 Text_item
*text
= new Text_item
;
82 Side_position_interface
stafy (text
);
84 SCM axisprop
= get_property ("scriptHorizontal",0);
85 if (gh_boolean_p (axisprop
) && gh_scm2bool (axisprop
))
87 stafy
.set_axis (X_AXIS
);
88 // text->set_parent (ss, Y_AXIS);
91 stafy
.set_axis (Y_AXIS
);
93 text
->set_elt_property ("script-priority",
96 if (r
->get_direction ())
97 stafy
.set_direction (r
->get_direction ());
99 text
->text_str_
= r
->text_str_
;
101 if (r
->style_str_
.length_i ())
102 text
->set_elt_property ("style", ly_str02scm (r
->style_str_
.ch_C()));
104 SCM empty
= get_property ("textEmptyDimension", 0);
105 if (gh_boolean_p (empty
) && gh_scm2bool (empty
))
107 text
->set_empty (X_AXIS
);
110 announce_element (Score_element_info (text
, r
));
116 Text_engraver::do_pre_move_processing ()
118 for (int i
=0; i
< texts_
.size (); i
++)
120 typeset_element (texts_
[i
]);
126 Text_engraver::do_post_move_processing ()
131 ADD_THIS_TRANSLATOR(Text_engraver
);