summaryrefslogtreecommitdiff
path: root/lily/script.cc
blob: 2f471e6ef2344f416b22b5954e2c8091feb17702 (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
  script.cc -- implement Script

  source file of the LilyPond music typesetter

  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/

#include "musical-request.hh"
#include "paper-def.hh"
#include "script.hh"
#include "stem.hh"
#include "molecule.hh"
#include "lookup.hh"



void
Script::set_stem(Stem*st_l)
{
    stem_l_ = st_l;
    add_support(st_l);
}


Script::Script(Script_req* rq)
    :Staff_side(this)
{    
    specs_l_ = rq->scriptdef_p_;
    inside_staff_b_ = specs_l_->inside_staff_b_;
    stem_l_ = 0;
    pos_i_ = 0;
    symdir_i_=1;
    dir_i_ =rq->dir_i_;
}

void
Script::set_symdir()
{
    if (specs_l_->invertsym_b_)
	symdir_i_ = (dir_i_ < 0) ? -1:1;
}

void
Script::set_default_dir()
{
    int s_i=specs_l_->rel_stem_dir_i_;
    if (s_i && stem_l_)
	dir_i_ = stem_l_->dir_i_ * s_i;
    else {
	dir_i_ =specs_l_->staff_dir_i_;
    }
}

void
Script::set_default_index()
{
    pos_i_ = get_position_i();
}

Interval
Script::do_width() const
{
    return symbol().dim.x;
}

Symbol
Script::symbol()const
{
    String preidx_str = (symdir_i_ < 0) ?"-" :"";
    return paper()->lookup_l()->script(preidx_str + specs_l_->symidx);
}

void
Script::do_pre_processing()
{
    set_default_dir();
    set_symdir();
}

void
Script::do_post_processing()
{
    set_default_index();
}

Molecule*
Script::brew_molecule_p() const
{
    Real dy = paper()->internote();
    
    Molecule*out = new Molecule(Atom(symbol()));
    out->translate(Offset(0,dy * pos_i_));
    return out;
}
IMPLEMENT_STATIC_NAME(Script);

int 
Script::compare(Script  *const&l1, Script *const&l2) 
{
    return l1->specs_l_->priority_i_ - l2->specs_l_->priority_i_;
}