]> git.donarmstrong.com Git - lilypond.git/blob - lily/span-bar-engraver.cc
* lily/text-item.cc (interpret_string): new file, select font with
[lilypond.git] / lily / span-bar-engraver.cc
1 /*
2   span-bar-grav.cc -- implement Span_bar_engraver
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7 */
8
9
10 #include "lily-guile.hh"
11 #include "bar-line.hh"
12 #include "item.hh"
13 #include "span-bar.hh"
14 #include "engraver.hh"
15
16
17 /** 
18
19   Make bars that span multiple "staves". Catch bars, and span a
20   Span_bar over them if we find more than 2 bars.  Vertical alignment
21   of staves changes the appearance of spanbars.  It is up to the
22   aligner (Vertical_align_engraver, in this case, to add extra
23   dependencies to the spanbars.
24
25   */
26 class Span_bar_engraver : public Engraver
27 {
28   Item *spanbar_;
29   Link_array<Item> bars_;
30
31 public:
32   TRANSLATOR_DECLARATIONS (Span_bar_engraver);
33 protected:
34   virtual void acknowledge_grob (Grob_info);
35   virtual void stop_translation_timestep ();
36 };
37
38 Span_bar_engraver::Span_bar_engraver ()
39 {
40   spanbar_ =0;
41 }
42
43 void
44 Span_bar_engraver::acknowledge_grob (Grob_info i)
45 {
46   int depth = i.origin_contexts (this).size ();
47   if (depth && Bar_line::has_interface (i.grob_))
48     {
49       Item * it = dynamic_cast<Item*> (i.grob_);
50       bars_.push (it);
51
52       if (bars_.size () >= 2 && !spanbar_) 
53         {
54           spanbar_ = make_item ("SpanBar");
55
56           spanbar_->set_parent (bars_[0], X_AXIS);
57           announce_grob (spanbar_, SCM_EOL);
58         }
59     }
60 }
61
62 void
63 Span_bar_engraver::stop_translation_timestep ()
64 {
65   if (spanbar_) 
66     {
67       for (int i=0; i < bars_.size () ; i++)
68         Span_bar::add_bar (spanbar_,bars_[i]);
69
70       SCM vissym =ly_symbol2scm ("break-visibility");
71       SCM vis = bars_[0]->internal_get_property (vissym);         
72       if (is_equal (spanbar_->internal_get_property (vissym), vis))
73         spanbar_->internal_set_property (vissym, vis);
74
75       typeset_grob (spanbar_);
76       spanbar_ =0;
77     }
78   bars_.set_size (0);
79 }
80
81
82 ENTER_DESCRIPTION (Span_bar_engraver,
83 /* descr */       "This engraver makes cross-staff barlines: It catches all normal "
84 "bar lines, and draws a single span-bar across them.",
85 /* creats*/       "SpanBar",
86 /* accepts */     "",
87 /* acks  */      "bar-line-interface",
88 /* reads */       "",
89 /* write */       "");