~ubuntu-branches/ubuntu/precise/lilypond/precise

« back to all changes in this revision

Viewing changes to lily/break-align-engraver.cc

  • Committer: Bazaar Package Importer
  • Author(s): Thomas Bushnell, BSG
  • Date: 2006-12-19 10:18:12 UTC
  • mfrom: (3.1.4 feisty)
  • Revision ID: james.westby@ubuntu.com-20061219101812-7awtjkp0i393wxty
Tags: 2.8.7-3
scripts/midi2ly.py: When setting DATADIR, find Lilypond python files
in the @TOPLEVEL_VERSION@ directory, not 'current'.  Patch thanks to
Chris Lamb (chris@chris-lamb.co.uk).  (Closes: #400550)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*   
2
 
  break-align-engraver.cc --  implement Break_align_engraver
3
 
  
 
1
/*
 
2
  break-align-engraver.cc -- implement Break_align_engraver
 
3
 
4
4
  source file of the GNU LilyPond music typesetter
5
 
  
6
 
  (c) 1999--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7
 
  
8
 
 */
 
5
 
 
6
  (c) 1999--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
 
7
*/
9
8
#include "engraver.hh"
10
9
#include "protected-scm.hh"
11
10
#include "break-align-interface.hh"
12
 
#include "item.hh"
13
11
#include "align-interface.hh"
14
12
#include "axis-group-interface.hh"
 
13
#include "context.hh"
 
14
#include "translator-group.hh"
15
15
 
 
16
#include "translator.icc"
16
17
 
17
18
class Break_align_engraver : public Engraver
18
19
{
19
20
  Item *align_;
20
 
  Protected_scm column_alist_;
 
21
  SCM column_alist_;
21
22
  Item *left_edge_;
22
23
 
23
 
  void add_to_group (SCM,Item*);
 
24
  void add_to_group (SCM, Item *);
24
25
protected:
25
 
  virtual void finalize ();
26
 
  virtual void acknowledge_grob (Grob_info i);
27
 
  virtual void stop_translation_timestep ();
28
 
  void add_column (SCM);
29
 
  
 
26
  void stop_translation_timestep ();
 
27
  virtual void derived_mark () const;
30
28
public:
31
29
  TRANSLATOR_DECLARATIONS (Break_align_engraver);
 
30
  DECLARE_ACKNOWLEDGER (break_aligned);
32
31
};
33
32
 
34
33
void
35
 
Break_align_engraver::add_column (SCM smob)
36
 
{
37
 
  Grob * e = unsmob_grob (smob);
38
 
  Break_align_interface::add_element (align_,e);
39
 
  typeset_grob (e);
40
 
}
41
 
 
42
 
void
43
 
Break_align_engraver::finalize ()
44
 
{
45
 
  column_alist_ = SCM_EOL;
46
 
}
47
 
 
48
 
void
49
34
Break_align_engraver::stop_translation_timestep ()
50
35
{
51
 
  for (SCM p = column_alist_; gh_pair_p (p); p = ly_cdr (p))
52
 
    {
53
 
      SCM pair = ly_car (p);
54
 
      add_column (ly_cdr (pair));
55
 
    }
56
36
  column_alist_ = SCM_EOL;
57
37
 
58
 
  if (align_)
59
 
    {
60
 
      typeset_grob (align_);
61
 
      align_ = 0;
62
 
    }
63
 
  if (left_edge_)
64
 
    {
65
 
      typeset_grob (left_edge_);
66
 
      left_edge_ = 0;
67
 
    }
 
38
  align_ = 0;
 
39
  left_edge_ = 0;
68
40
}
69
41
 
70
 
 
71
42
Break_align_engraver::Break_align_engraver ()
72
43
{
73
44
  column_alist_ = SCM_EOL;
76
47
}
77
48
 
78
49
void
79
 
Break_align_engraver::acknowledge_grob (Grob_info inf)
80
 
{
81
 
  if (Item * item = dynamic_cast <Item *> (inf.grob_))
 
50
Break_align_engraver::derived_mark () const
 
51
{
 
52
  scm_gc_mark (column_alist_);
 
53
}
 
54
 
 
55
void
 
56
Break_align_engraver::acknowledge_break_aligned (Grob_info inf)
 
57
{
 
58
  if (Item *item = dynamic_cast<Item *> (inf.grob ()))
82
59
    {
83
60
      /*
84
61
        Removed check for item->empty (X_AXIS). --hwn 20/1/04
85
 
       */
 
62
      */
86
63
      if (item->get_parent (X_AXIS))
87
64
        return;
88
65
 
89
 
      SCM bp=item->get_property ("breakable");
 
66
      SCM bp = item->get_property ("breakable");
90
67
      bool breakable = (to_boolean (bp));
91
68
      if (!breakable)
92
 
        return ;
 
69
        return;
93
70
 
94
71
      SCM align_name = item->get_property ("break-align-symbol");
95
 
      if (!gh_symbol_p (align_name))
96
 
        return ;
97
 
 
 
72
      if (!scm_is_symbol (align_name))
 
73
        return;
 
74
          
98
75
      if (!align_)
99
76
        {
100
 
          align_ = make_item ("BreakAlignment");
101
 
 
102
 
          announce_grob (align_, SCM_EOL);
103
 
 
104
 
          left_edge_ = make_item ("LeftEdge");
105
 
          add_to_group (left_edge_->get_property ("break-align-symbol"), left_edge_);
106
 
          announce_grob (left_edge_, SCM_EOL);
 
77
          align_ = make_item ("BreakAlignment", SCM_EOL);
 
78
 
 
79
          Context *origin = inf.origin_contexts (this)[0];
 
80
 
 
81
          Translator_group *tg = origin->implementation ();
 
82
          Engraver *random_source = dynamic_cast<Engraver *> (unsmob_translator (scm_car (tg->get_simple_trans_list ())));
 
83
 
 
84
          /*
 
85
            Make left edge appear to come from same context as clef/bar-line etc.
 
86
          */
 
87
          left_edge_ = make_item_from_properties (random_source,
 
88
                                                  ly_symbol2scm ("LeftEdge"),
 
89
                                                  SCM_EOL,
 
90
                                                  "LeftEdge");
 
91
          add_to_group (left_edge_->get_property ("break-align-symbol"),
 
92
                        left_edge_);
107
93
        }
108
 
      
 
94
 
109
95
      add_to_group (align_name, item);
110
96
    }
111
97
}
112
98
 
113
99
void
114
 
Break_align_engraver::add_to_group (SCM align_name, Item*item)
 
100
Break_align_engraver::add_to_group (SCM align_name, Item *item)
115
101
{
116
102
  SCM s = scm_assoc (align_name, column_alist_);
117
 
  Item * group = 0;
 
103
  Item *group = 0;
118
104
 
119
105
  if (s != SCM_BOOL_F)
120
106
    {
121
 
      Grob *e =  unsmob_grob (ly_cdr (s));
122
 
      group = dynamic_cast<Item*> (e);
 
107
      Grob *e = unsmob_grob (scm_cdr (s));
 
108
      group = dynamic_cast<Item *> (e);
123
109
    }
124
110
  else
125
111
    {
126
 
      group = make_item ("BreakAlignGroup");
 
112
      group = make_item ("BreakAlignGroup", item->self_scm ());
127
113
 
128
114
      group->set_property ("break-align-symbol", align_name);
129
115
      group->set_parent (align_, Y_AXIS);
130
 
      announce_grob (group, item->self_scm ());
131
 
          
 
116
 
132
117
      column_alist_ = scm_assoc_set_x (column_alist_, align_name, group->self_scm ());
133
118
 
 
119
      Break_align_interface::add_element (align_, group);
134
120
    }
135
121
  Axis_group_interface::add_element (group, item);
136
122
}
137
 
 
138
 
ENTER_DESCRIPTION (Break_align_engraver,
139
 
/* descr */       "Align grobs with corresponding break-align-symbols into groups, and order the groups according to breakAlignOrder",
140
 
/* creats*/       "BreakAlignment BreakAlignGroup LeftEdge",
141
 
/* accepts */     "",
142
 
/* acks  */       "break-aligned-interface"
143
 
,/* reads */       "",
144
 
/* write */       "");
 
123
ADD_ACKNOWLEDGER (Break_align_engraver, break_aligned);
 
124
ADD_TRANSLATOR (Break_align_engraver,
 
125
                "Align grobs with corresponding @code{break-align-symbols} into "
 
126
                "groups, and order the groups according to @code{breakAlignOrder}. "
 
127
                "The left edge of the alignment gets a separate group, with a symbol @code{left-edge}. ",
 
128
                /* create */ "BreakAlignment BreakAlignGroup LeftEdge",
 
129
                /* accept */ "",
 
130
                /* read */ "",
 
131
                /* write */ "");