]> git.donarmstrong.com Git - lilypond.git/blob - lily/local-key-item.cc
release: 0.1.15
[lilypond.git] / lily / local-key-item.cc
1 /*
2   local-key-item.cc -- implement Local_key_item, Local_acc
3
4   source file of the GNU LilyPond music typesetter
5
6   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
7 */
8
9 #include "local-key-item.hh"
10 #include "molecule.hh"
11 #include "scalar.hh"
12 #include "lookup.hh"
13 #include "paper-def.hh"
14 #include "musical-request.hh"
15 #include "note-head.hh"
16 #include "misc.hh"
17
18
19
20 Local_key_item::Local_key_item (int i)
21 {
22   c0_position  = i;
23 }
24
25 void
26 Local_key_item::add_support (Item*head_l)
27 {
28   support_items_.push (head_l);
29   add_dependency (head_l);
30 }
31
32 void
33 Local_key_item::add (Melodic_req*m_l)
34 {
35   add (m_l->octave_i_, m_l->notename_i_, m_l->accidental_i_);
36 }
37
38 void
39 Local_key_item::add (int o, int p , int a)
40 {
41   Local_acc l;
42   l.octave_i_ = o;
43   l.name_i_ = p;
44   l.accidental_i_ = a;
45   for (int i=0; i< accs.size(); i++)
46     if (!Local_acc::compare (l, accs[i]))
47       return;
48   
49   accs.push (l);
50 }
51
52 void
53 Local_key_item::do_pre_processing()
54 {
55   accs.sort (Local_acc::compare);
56 }
57
58 Molecule*
59 Local_key_item::brew_molecule_p() const
60 {
61   Molecule* output = new Molecule;
62   Molecule*octmol = 0;
63   int lastoct = -100;
64   for  (int i = 0; i <  accs.size(); i++) 
65     {
66       // do one octave
67       if (accs[i].octave_i_ != lastoct) 
68         {
69           if (octmol)
70             {
71               Real dy =lastoct*7*paper()->internote_f ();
72               octmol->translate (dy, Y_AXIS);
73               output->add (*octmol);
74               delete octmol;
75             }
76           octmol= new Molecule;
77         }
78       lastoct = accs[i].octave_i_;
79       
80       Real dy = (accs[i].name_i_ + c0_position) * paper()->internote_f ();
81       Atom a (paper()->lookup_l ()->accidental (accs[i].accidental_i_));
82       a.translate (dy, Y_AXIS);
83       Molecule m(a);
84       octmol->add_at_edge (X_AXIS, RIGHT, m);
85     }
86
87   if (octmol)
88     {
89       Real dy =lastoct*7*paper()->internote_f ();
90       octmol->translate (dy, Y_AXIS);
91       output->add (*octmol);
92       delete octmol;
93     }
94
95   Interval head_width=itemlist_width (support_items_);
96   output->translate (-output->extent().x ().right + head_width.left , X_AXIS);
97   
98   return output;
99 }
100
101 int
102 Local_acc::compare (Local_acc&a, Local_acc&b)
103 {
104   if (a.octave_i_ - b.octave_i_)
105     return a.octave_i_ - b.octave_i_;
106   if (a.name_i_ - b.name_i_)
107     return a.name_i_ - b.name_i_;
108   
109   return a.accidental_i_ - b.accidental_i_;
110 };
111
112 IMPLEMENT_IS_TYPE_B1(Local_key_item,Item);
113
114 void
115 Local_key_item::do_substitute_dependency (Score_elem*o,Score_elem*n)
116 {
117   Item* o_l = o->item();
118   Item* n_l = n?n->item():0;
119
120   support_items_.substitute (o_l, n_l);
121 }