]> git.donarmstrong.com Git - lilypond.git/blob - lily/global-translator.cc
patch::: 1.3.86.jcn3
[lilypond.git] / lily / global-translator.cc
1 /*
2   global-translator.cc -- implement Global_translator
3
4   source file of the GNU LilyPond music typesetter
5
6   (c)  1997--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9 #include "debug.hh"
10 #include "music.hh"
11 #include "request.hh"
12 #include "music-list.hh"
13 #include "music-iterator.hh"
14 #include "global-translator.hh"
15
16 Global_translator::Global_translator ()
17 {
18 }
19
20 void
21 Global_translator::add_moment_to_process (Moment m)
22 {
23   if (m  > final_mom_)
24     return;
25
26   if (m < now_mom_ )
27     programming_error ("Trying to freeze in time.");
28   
29   for (int i=0; i <  extra_mom_pq_.size(); i++)
30     if (extra_mom_pq_[i] == m)
31       return;
32   extra_mom_pq_.insert (m);
33 }
34
35 Moment
36 Global_translator::sneaky_insert_extra_moment (Moment w)
37 {
38   while (extra_mom_pq_.size() && extra_mom_pq_.front() <= w)
39     w = extra_mom_pq_.get();
40   return w;
41 }
42
43 int
44 Global_translator::moments_left_i() const
45 {
46   return extra_mom_pq_.size();
47 }
48
49 void
50 Global_translator::prepare (Moment m)
51 {
52   prev_mom_  = now_mom_;
53   now_mom_ = m;
54 }
55
56 Moment
57 Global_translator::now_mom () const
58 {
59   return now_mom_;
60 }
61
62
63
64 Music_output*
65 Global_translator::get_output_p()
66 {
67   return 0;
68 }
69
70 void
71 Global_translator::process ()
72 {
73 }
74 void
75 Global_translator::start ()
76 {
77 }
78 void
79 Global_translator::finish ()
80 {
81 }
82
83 void
84 Global_translator::run_iterator_on_me (Music_iterator * iter)
85 {
86   bool first = true;
87   while (iter->ok () || moments_left_i ())
88     {
89       Moment w;
90       w.set_infinite (1);
91       if (iter->ok ())
92         {
93           w = iter->next_moment();
94
95           if (!first)
96             iter->next ();
97           else
98             first = false;
99       
100           DEBUG_OUT << "proccing: " << w << '\n';
101           if (flower_dstream && !flower_dstream->silent_b ("walking"))
102             iter->print();
103         }
104
105       w = sneaky_insert_extra_moment (w);
106       prepare (w);
107       
108       if (flower_dstream && !flower_dstream->silent_b ("walking"))
109         print();
110
111       iter->process (w);
112
113       /*
114         Urg, this is request_chord_iterator.
115        */
116       for (SCM i = iter->get_music (); gh_pair_p (i); i = SCM_CDR (i))
117         {
118           assert (gh_pair_p (i));
119           SCM p = SCM_CAR (i);
120           Music *m = unsmob_music (SCM_CAR (p));
121           Translator *t = unsmob_translator (SCM_CDR (p));
122           assert (m);
123           assert (t);
124           for (SCM s = dynamic_cast<Music_sequence *> (m)->music_list ();
125                gh_pair_p (s);  s = SCM_CDR (s))
126             {
127               Music *m = unsmob_music (SCM_CAR (s));
128               if (Request* r = dynamic_cast<Request*> (m))
129                 {
130                   bool b = t->try_music (m);
131                   if (!b)
132                     m->origin ()->warning (_f ("Junking request: `%s'",
133                                                classname(m)));
134                 }
135               else
136                 m->origin ()->warning (_f ("Huh?  Not a Request: `%s'",
137                                            classname (m)));
138             }
139           if (! dynamic_cast<Music_sequence *> (m))
140             {
141               bool b = t->try_music (m);
142               if (!b)
143                 {
144                   /*
145                     Children?
146                   */
147                   printf ("junking:\n");
148                   m->print ();
149                   t->print ();
150                 }
151             }
152         }
153       
154       process ();
155     }
156 }