]> git.donarmstrong.com Git - lilypond.git/blob - lily/local-key-item.cc
50f870c1cfe9b1f2b353d5ffe7907c3df742135f
[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         // do one octave
66         if (accs[i].octave_i_ != lastoct) {
67             if (octmol){
68                 Real dy =lastoct*7*paper()->internote_f();
69                 octmol->translate_y( dy);
70                 output->add(*octmol);
71                 delete octmol;
72             }
73             octmol= new Molecule;
74         }
75         lastoct = accs[i].octave_i_;
76         Symbol s =paper()->lookup_l()->accidental(accs[i].accidental_i_);   
77         Atom a(s);
78         Real dy = (accs[i].name_i_ + c0_position) * paper()->internote_f();
79         a.translate_y(dy);
80
81         octmol->add_right(a);
82     }
83
84     if (octmol){
85         Real dy =lastoct*7*paper()->internote_f();
86         octmol->translate_y( dy);
87         output->add(*octmol);
88         delete octmol;
89     }
90
91     Interval head_width=itemlist_width(support_items_);
92     output->translate_x(-output->extent().x.right + head_width.left );
93     
94     return output;
95 }
96
97 int
98 Local_acc::compare(Local_acc&a, Local_acc&b)
99 {
100     if (a.octave_i_ - b.octave_i_)
101         return a.octave_i_ - b.octave_i_;
102     if (a.name_i_ - b.name_i_)
103         return a.name_i_ - b.name_i_;
104     
105     return a.accidental_i_ - b.accidental_i_;
106 };
107
108 IMPLEMENT_IS_TYPE_B1(Local_key_item,Item);
109
110 void
111 Local_key_item::do_substitute_dependency(Score_elem*o,Score_elem*n)
112 {
113     Item* o_l = o->item();
114     Item* n_l = n?n->item():0;
115
116     support_items_.substitute(o_l, n_l);
117 }