]> git.donarmstrong.com Git - lilypond.git/blob - lily/include/translator.icc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / include / translator.icc
1 /*
2   translator.icc -- declare Translator glue wiring.
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
7 */
8
9 #ifndef TRANSLATOR_ICC
10 #define TRANSLATOR_ICC
11
12 #include "std-vector.hh"
13 #include "translator.hh"
14
15 /**
16    A macro to automate administration of translators.
17 */
18 #define ADD_THIS_TRANSLATOR(T)                                          \
19   SCM T::static_description_ = SCM_EOL;                                 \
20   static void _ ## T ## _adder ()                                       \
21   {                                                                     \
22     T *t = new T;                                                       \
23     T::static_description_ = t->static_translator_description ();       \
24     scm_permanent_object (T::static_description_);                      \
25     add_translator (t);                                                 \
26   }                                                                     \
27   SCM T::translator_description () const                                \
28   {                                                                     \
29     return static_description_;                                         \
30   }                                                                     \
31   ADD_GLOBAL_CTOR (_ ## T ## _adder);
32
33 #define ADD_TRANSLATOR(classname, desc, grobs, accepted, read, write)   \
34   Drul_array< vector<Acknowledge_information> > classname::acknowledge_static_array_drul_;      \
35   IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS (classname);                    \
36   ADD_THIS_TRANSLATOR (classname);                                      \
37   Engraver_void_function_engraver_grob_info                             \
38   classname::static_get_acknowledger (SCM sym)                          \
39   {                                                                     \
40     return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[START]);      \
41   }                                                                     \
42   Engraver_void_function_engraver_grob_info                             \
43   classname::static_get_end_acknowledger (SCM sym)                              \
44   {                                                                     \
45     return generic_get_acknowledger (sym, &acknowledge_static_array_drul_[STOP]);       \
46   }                                                                     \
47   SCM                                                                   \
48   classname::static_translator_description () const                     \
49   {                                                                     \
50     SCM static_properties = SCM_EOL;                                    \
51     /*  static_properties = acons (name , gh_str02scm (Translator::name (self_scm ())), \
52         static_properties_);                                            \
53     */                                                                  \
54     static_properties = scm_acons (ly_symbol2scm ("grobs-created"),     \
55                                    parse_symbol_list (grobs), static_properties); \
56                                                                         \
57     static_properties = scm_acons (ly_symbol2scm ("description"),       \
58                                    scm_makfrom0str (desc), static_properties); \
59                                                                         \
60     static_properties = scm_acons (ly_symbol2scm ("events-accepted"),   \
61                                    parse_symbol_list (accepted), static_properties); \
62                                                                         \
63     static_properties = scm_acons (ly_symbol2scm ("properties-read"),   \
64                                    parse_symbol_list (read), static_properties); \
65                                                                         \
66     static_properties = scm_acons (ly_symbol2scm ("properties-written"), \
67                                    parse_symbol_list (write), static_properties); \
68                                                                         \
69     return static_properties;                                           \
70   }
71
72 #define IMPLEMENT_FETCH_PRECOMPUTABLE_METHODS(T)                        \
73   void                                                                  \
74   T::fetch_precomputable_methods (Translator_void_method_ptr ptrs[])    \
75   {                                                                     \
76     ptrs[START_TRANSLATION_TIMESTEP] =                                  \
77       ((Translator_void_method_ptr) & T::start_translation_timestep ==  \
78        (Translator_void_method_ptr) & Translator::start_translation_timestep) \
79       ? 0                                                               \
80       : (Translator_void_method_ptr) & T::start_translation_timestep;   \
81                                                                         \
82     ptrs[STOP_TRANSLATION_TIMESTEP] =                                   \
83       ((Translator_void_method_ptr) & T::stop_translation_timestep == (Translator_void_method_ptr) & Translator::stop_translation_timestep) \
84       ? 0                                                               \
85       : (Translator_void_method_ptr) & T::stop_translation_timestep;    \
86                                                                         \
87     ptrs[PROCESS_MUSIC] =                                               \
88       ((Translator_void_method_ptr) & T::process_music == (Translator_void_method_ptr) & Translator::process_music) \
89       ? 0                                                               \
90       : (Translator_void_method_ptr) & T::process_music;                \
91                                                                         \
92     ptrs[PROCESS_ACKNOWLEDGED] =                                        \
93       ((Translator_void_method_ptr) & T::process_acknowledged == (Translator_void_method_ptr) & Translator::process_acknowledged) \
94       ? 0                                                               \
95       : (Translator_void_method_ptr) & T::process_acknowledged;         \
96   }
97
98 void add_acknowledger (Engraver_void_function_engraver_grob_info ptr,
99                        char const *func_name,
100                        vector<Acknowledge_information> *ack_array);
101
102 Engraver_void_function_engraver_grob_info
103 generic_get_acknowledger (SCM sym,
104                           vector<Acknowledge_information> const *ack_array);
105
106 #define ADD_ACKNOWLEDGER(CLASS, NAME)                                   \
107   void CLASS ## NAME ## _ack_adder ()                                   \
108   {                                                                     \
109     add_acknowledger ((Engraver_void_function_engraver_grob_info) & CLASS::acknowledge_ ## NAME, #NAME, &CLASS::acknowledge_static_array_drul_[START]); \
110   }                                                                     \
111   ADD_SCM_INIT_FUNC (CLASS ## NAME ## _ack_adder_initclass, CLASS ## NAME ## _ack_adder);
112
113 #define ADD_END_ACKNOWLEDGER(CLASS, NAME)                                       \
114   void CLASS ## NAME ## _end_ack_adder ()                                       \
115   {                                                                     \
116     add_acknowledger ((Engraver_void_function_engraver_grob_info) & CLASS::acknowledge_end_ ## NAME, #NAME, &CLASS::acknowledge_static_array_drul_[STOP]); \
117   }                                                                     \
118   ADD_SCM_INIT_FUNC (CLASS ## NAME ## _end_ack_adder_initclass, CLASS ## NAME ## _end_ack_adder);
119
120
121 #endif /* TRANSLATOR_ICC */
122