]> git.donarmstrong.com Git - lilypond.git/blob - lily/stream-event.cc
Fix some bugs in the dynamic engraver and PostScript backend
[lilypond.git] / lily / stream-event.cc
1 /*
2   stream-event.cc -- implement Stream_event
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 2005-2006 Erik Sandberg  <mandolaerik@gmail.com>
7 */
8
9 #include "stream-event.hh"
10
11 #include "ly-smobs.icc"
12 #include "context.hh"
13 #include "input.hh"
14 #include "input-smob.hh"
15
16 // ES todo: Add stuff to lily-proto.hh: Stream_event and its subclasses, Stream_creator, etc.
17
18 Stream_event::~Stream_event ()
19 {
20 }
21
22 void
23 Stream_event::init ()
24 {
25   self_scm_ = SCM_EOL;
26   property_alist_ = SCM_EOL;
27   origin_ = 0;
28
29   smobify_self ();
30 }
31
32 Stream_event::Stream_event ()
33 {
34   init ();
35 }
36
37 Stream_event::Stream_event (Context *c, Input *origin)
38 {
39   init ();
40   set_property ("context", scm_int2num (c->get_unique()));
41   origin_ = origin;
42 }
43
44 Stream_event::Stream_event (SCM property_alist)
45 {
46   init ();
47   property_alist_ = property_alist;
48   origin_ = &dummy_input_global;
49 }
50
51 Stream_event::Stream_event (Context *c, SCM class_name)
52 {
53   init ();
54   set_property ("context", scm_int2num (c->get_unique()));
55   set_property ("class", class_name);
56   origin_ = &dummy_input_global;
57 }
58
59 Stream_event::Stream_event (Stream_event *ev)
60 {
61   init ();
62   property_alist_ = scm_copy_tree (ev->property_alist_);
63   origin_ = ev->origin_;
64 }
65
66 Input *
67 Stream_event::origin () const
68 {
69   return origin_;
70 }
71
72 SCM
73 Stream_event::mark_smob (SCM sm)
74 {
75   Stream_event *me = (Stream_event *) SCM_CELL_WORD_1 (sm);
76   return me->property_alist_;
77 }
78
79 int
80 Stream_event::print_smob (SCM s, SCM port, scm_print_state *)
81 {
82   scm_puts ("#<Stream_event ", port);
83   scm_write (dump (s), port);
84   scm_puts (" >", port);
85   return 1;
86 }
87
88 IMPLEMENT_SMOBS (Stream_event);
89 IMPLEMENT_DEFAULT_EQUAL_P (Stream_event);
90 IMPLEMENT_TYPE_P (Stream_event, "ly:stream-event?");
91
92 MAKE_SCHEME_CALLBACK (Stream_event, undump, 1);
93 MAKE_SCHEME_CALLBACK (Stream_event, dump, 1);
94
95 SCM
96 Stream_event::dump (SCM self)
97 {
98   Stream_event *ev = unsmob_stream_event (self);
99   // Reversed alists look prettier.
100   return scm_reverse (ev->property_alist_);
101 }
102
103 SCM
104 Stream_event::undump (SCM data)
105 {
106   Stream_event *obj = new Stream_event ();
107   obj->property_alist_ = scm_reverse (data);
108   return obj->unprotect ();
109 }
110
111 SCM
112 Stream_event::internal_get_property (SCM sym) const
113 {
114   SCM s = scm_sloppy_assq (sym, property_alist_);
115   if (s != SCM_BOOL_F)
116     return scm_cdr (s);
117   return SCM_EOL;
118 }
119
120 void 
121 Stream_event::internal_set_property (SCM prop, SCM val)
122 {
123   property_alist_ = scm_assq_set_x (property_alist_, prop, val);
124 }