]> git.donarmstrong.com Git - lilypond.git/blob - lily/system-start-delimiter.cc
release: 1.3.50
[lilypond.git] / lily / system-start-delimiter.cc
1 /*   
2   system-start-delimiter.cc --  implement System_start_delimiter
3   
4   source file of the GNU LilyPond music typesetter
5   
6   (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
7   
8  */
9 #include <math.h>
10
11 #include "system-start-delimiter.hh"
12 #include "paper-def.hh"
13 #include "molecule.hh"
14 #include "axis-group-interface.hh"
15 #include "lookup.hh"
16 #include "all-font-metrics.hh"
17
18 Molecule
19 System_start_delimiter::staff_bracket (Real height) const 
20 {
21   Paper_def* p= paper_l ();
22   Real arc_height = p->get_var("bracket_arch_height");
23   SCM at = gh_list (ly_symbol2scm ("bracket"),
24                     gh_double2scm (p->get_var("bracket_arch_angle")),
25                     gh_double2scm (p->get_var("bracket_arch_width")),
26                     gh_double2scm (arc_height),
27                     gh_double2scm (p->get_var("bracket_width")),
28                     gh_double2scm (height),
29                     gh_double2scm (p->get_var("bracket_arch_thick")),
30                     gh_double2scm (p->get_var("bracket_thick")),
31                     SCM_UNDEFINED);
32
33   Real staff_space = p->get_var ("interline");
34   Real h = height + 2 * arc_height;
35   Box b (Interval (0, 1.5 * staff_space), Interval (-h/2, h/2));
36   Molecule mol (b, at);
37   
38   mol.translate_axis (- mol.dim_[X_AXIS].length () / 2, X_AXIS);
39   return mol;
40 }
41
42 System_start_delimiter::System_start_delimiter ()
43 {
44   set_extent_callback (0, Y_AXIS);
45   Group_interface (this).set_interface();
46 }
47
48 Molecule
49 System_start_delimiter::simple_bar (Real h) const
50 {
51   Real w = paper_l ()->get_var ("barthick_score");
52   return lookup_l ()->filledbox (Box (Interval(0,w), Interval(-h/2, h/2)));
53 }
54    
55
56 Molecule
57 System_start_delimiter::do_brew_molecule ()const
58 {
59   Interval ext = Axis_group_interface::group_extent_callback (dim_cache_[Y_AXIS]);
60   Real l = ext.length (); 
61   Molecule m;
62
63   SCM s = get_elt_property ("collapse-height");
64   if (gh_number_p (s) && l < gh_scm2double (s))
65     {
66       System_start_delimiter * me = (System_start_delimiter*)this;
67       me->set_elt_property ("transparent", SCM_BOOL_T);
68       me->set_extent_callback (0, X_AXIS);
69       me->set_extent_callback (0, Y_AXIS);
70       return m;
71     }
72
73   
74   s = get_elt_property ("glyph");
75   if (gh_symbol_p (s) && s == ly_symbol2scm ("bracket"))
76     m = staff_bracket (l);
77   else if (gh_symbol_p (s) && s == ly_symbol2scm ("brace"))
78     m =  staff_brace (l);
79   else
80     m = simple_bar (l);
81   
82   
83   m.translate_axis (ext.center (), Y_AXIS);
84   return m;
85 }
86
87 /*
88   ugh. Suck me plenty.
89  */
90 Molecule
91 System_start_delimiter::staff_brace (Real y)  const
92 {
93   Real staffht  = paper_l ()->get_var ("staffheight");
94   int staff_size  = int (rint (staffht ));
95
96   // URG
97   Real step  = 1.0;
98   int minht  = 2 * staff_size;
99   int maxht = 7 *  minht;
100   int idx = int (((maxht - step) <? y - minht) / step);
101   idx = idx >? 0;
102
103   SCM l = scm_eval (gh_list (ly_symbol2scm ("style-to-cmr"),
104                             ly_str02scm ("brace"),
105                             SCM_UNDEFINED));
106   
107   String nm = "feta-braces";
108   if (l != SCM_BOOL_F)
109     nm = ly_scm2string (gh_cdr (l));
110   nm += to_str (staff_size);
111   SCM e =gh_list (ly_symbol2scm ("char"), gh_int2scm (idx), SCM_UNDEFINED);
112   SCM at = (e);
113
114   at = fontify_atom (find_font (nm), at);
115   
116   Box b (Interval (0,0), Interval (-y/2, y/2));
117
118   return Molecule(b, at);
119 }
120