]> git.donarmstrong.com Git - lilypond.git/blob - lily/global-translator.cc
patch::: 1.3.86.jcn2
[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 "music-iterator.hh"
12 #include "global-translator.hh"
13
14 Global_translator::Global_translator ()
15 {
16 }
17
18 void
19 Global_translator::add_moment_to_process (Moment m)
20 {
21   if (m  > final_mom_)
22     return;
23
24   if (m < now_mom_ )
25     programming_error ("Trying to freeze in time.");
26   
27   for (int i=0; i <  extra_mom_pq_.size(); i++)
28     if (extra_mom_pq_[i] == m)
29       return;
30   extra_mom_pq_.insert (m);
31 }
32
33 Moment
34 Global_translator::sneaky_insert_extra_moment (Moment w)
35 {
36   while (extra_mom_pq_.size() && extra_mom_pq_.front() <= w)
37     w = extra_mom_pq_.get();
38   return w;
39 }
40
41 int
42 Global_translator::moments_left_i() const
43 {
44   return extra_mom_pq_.size();
45 }
46
47 void
48 Global_translator::prepare (Moment m)
49 {
50   prev_mom_  = now_mom_;
51   now_mom_ = m;
52 }
53
54 Moment
55 Global_translator::now_mom () const
56 {
57   return now_mom_;
58 }
59
60
61
62 Music_output*
63 Global_translator::get_output_p()
64 {
65   return 0;
66 }
67
68 void
69 Global_translator::process ()
70 {
71 }
72 void
73 Global_translator::start ()
74 {
75 }
76 void
77 Global_translator::finish ()
78 {
79 }
80
81 void
82 Global_translator::run_iterator_on_me (Music_iterator * iter)
83 {
84   while (iter->ok() || moments_left_i ())
85     {
86       Moment w;
87       w.set_infinite (1);
88       if (iter->ok())
89         {
90           w = iter->next_moment();
91           DEBUG_OUT << "proccing: " << w << '\n';
92           if (flower_dstream && !flower_dstream->silent_b ("walking"))
93             iter->print();
94         }
95       
96       w = sneaky_insert_extra_moment (w);
97       prepare (w);
98       
99       if (flower_dstream && !flower_dstream->silent_b ("walking"))
100         print();
101
102       iter->process (w);
103       for (SCM i = iter->get_music (); gh_pair_p (i); i = SCM_CDR (i))
104         {
105           assert (gh_pair_p (i));
106           SCM p = SCM_CAR (i);
107           Music *m = unsmob_music (SCM_CAR (p));
108           Translator *t = unsmob_translator (SCM_CDR (p));
109           assert (m);
110           assert (t);
111           bool b = t->try_music (m);
112           if (!b)
113             {
114               /*
115                 Children?
116               */
117               printf ("junking:\n");
118               m->print ();
119               t->print ();
120             }
121
122         }
123       
124       iter->next ();
125       process();
126     }
127 }