]> git.donarmstrong.com Git - lilypond.git/blob - lily/breathing-sign.cc
* lily/breathing-sign.cc (railtracks): another caesura.
[lilypond.git] / lily / breathing-sign.cc
1 /*
2   breathing_sign.cc -- implement Breathing_sign
3
4   Copyright (C) 1999 Michael Krause
5
6   written for the GNU LilyPond music typesetter
7
8   TODO: --> see breathing-sign-engraver.cc
9
10 */
11
12 #include "staff-symbol-referencer.hh"
13 #include "directional-element-interface.hh"
14 #include "breathing-sign.hh"
15 #include "string.hh"
16 #include "molecule.hh"
17 #include "paper-def.hh"
18 #include "lookup.hh"
19
20 #include "dimensions.hh"
21 #include "direction.hh"
22
23 MAKE_SCHEME_CALLBACK (Breathing_sign,brew_molecule,1);
24 SCM 
25 Breathing_sign::brew_molecule (SCM smob)
26 {
27   Grob * me = unsmob_grob (smob);
28   Real space = Staff_symbol_referencer::staff_space (me);
29
30   // todo: cfg'able.
31   Interval i1 (0, space / 6), i2 (-space / 2, space / 2);
32   Box b (i1, i2);
33
34   return Lookup::filledbox (b).smobbed_copy ();
35 }
36
37 /*
38   Simplistic caesura.
39  */
40 MAKE_SCHEME_CALLBACK (Breathing_sign,railtracks,1);
41 SCM 
42 Breathing_sign::railtracks (SCM smob)
43 {
44   Grob * me = unsmob_grob (smob);
45   Real space = Staff_symbol_referencer::staff_space (me);
46   Real th = me->get_paper ()->get_var ("linethickness");
47   SCM lt =  me->get_grob_property ("thickness");
48   if (gh_number_p (lt))
49     th *= gh_scm2double (lt);
50   
51   Offset x1 (0, -space);
52   Offset x2 (space / 3, space);
53   Molecule l1 (Lookup::line (th, x1, x2));
54   Molecule l2 (l1);
55   l2.translate_axis (space *0.6 , X_AXIS);
56   l1.add_molecule (l2);
57   return l1.smobbed_copy();
58 }
59
60
61 MAKE_SCHEME_CALLBACK (Breathing_sign,offset_callback,2);
62 SCM
63 Breathing_sign::offset_callback (SCM element_smob, SCM)
64 {
65   Grob *me = unsmob_grob (element_smob);
66   
67   Direction d = Directional_element_interface::get (me);
68   if (!d)
69     {
70       d = UP;
71       Directional_element_interface::set (me, d);
72     }
73
74   Real inter_f = Staff_symbol_referencer::staff_space (me)/2;
75   int sz = Staff_symbol_referencer::line_count (me)-1;
76   return gh_double2scm (inter_f * sz * d);
77 }
78
79
80 ADD_INTERFACE(Breathing_sign, "breathing-sign-interface",
81               "A breathing sign.",
82               "direction");