new file. (Thanks Hendrik Maryns)
[lilypond.git] / lily / piano-pedal-bracket.cc
blobb0d87558e9879b225ecfcd6d5063556121fbbce0
1 /*
2 piano-pedal-bracket.cc -- implement Piano_pedal_bracket
4 source file of the GNU LilyPond music typesetter
6 (c) 2003--2004 Han-Wen Nienhuys <hanwen@xs4all.nl>
8 */
10 #include "stencil.hh"
11 #include "spanner.hh"
12 #include "item.hh"
13 #include "tuplet-bracket.hh"
15 struct Piano_pedal_bracket
17 DECLARE_SCHEME_CALLBACK (print,(SCM));
18 static bool has_interface (Grob*);
22 MAKE_SCHEME_CALLBACK (Piano_pedal_bracket,print,1);
23 SCM
24 Piano_pedal_bracket::print (SCM smob)
26 Spanner *me = dynamic_cast<Spanner*> (unsmob_grob (smob));
27 Spanner *orig = dynamic_cast<Spanner*> (me->original_);
29 Drul_array<bool> broken (false,false);
30 Drul_array<Real> height = robust_scm2drul
31 (me->get_property ("edge-height"), Interval (0,0));
32 Drul_array<Real> shorten = robust_scm2drul
33 (me->get_property ("shorten-pair"), Interval (0,0));
34 Drul_array<Real> flare = robust_scm2drul
35 (me->get_property ("bracket-flare"), Interval (0,0));
37 Grob *common = me->get_bound (LEFT)
38 ->common_refpoint (me->get_bound (RIGHT), X_AXIS);
39 Grob *textbit = unsmob_grob (me->get_property ("pedal-text"));
41 if (textbit)
42 common = common->common_refpoint (textbit, X_AXIS);
44 Interval span_points (0,0);
45 Direction d = LEFT;
48 Item *b = me->get_bound (d);
49 broken[d] = b->break_status_dir () != CENTER;
50 if (broken[d])
52 if (orig
53 && ((d == RIGHT && me->get_break_index () != orig->broken_intos_.size()-1)
54 || (d == LEFT && me->get_break_index ())))
55 height[d] = 0.0;
56 else
57 flare[d] = 0.0;
60 Interval ext = b->extent (common, X_AXIS);
61 span_points[d] = ext [broken[d] ? RIGHT : LEFT];
63 while (flip (&d) != LEFT);
66 /* For 'Mixed' style pedals, i.e. a bracket preceded by text: Ped._____|
67 need to shorten by the extent of the text grob
69 if (textbit)
71 height[LEFT] = 0;
73 Real padding = robust_scm2double (me->get_property ("if-text-padding"), 0);
75 span_points[LEFT] = padding
76 + textbit->extent (common, X_AXIS)[RIGHT];
80 Stencil m ;
81 if (!span_points.is_empty () &&
82 span_points.length () > 0.001)
84 m = Tuplet_bracket::make_bracket (me, Y_AXIS,
85 Offset (span_points.length (), 0),
86 height,
87 Interval (),
88 flare, shorten);
90 m.translate_axis (span_points[LEFT]
91 - me->relative_coordinate (common, X_AXIS), X_AXIS);
92 return m.smobbed_copy ();
97 ADD_INTERFACE (Piano_pedal_bracket,"piano-pedal-bracket-interface",
98 "The bracket of the piano pedal. It can be tuned through the regular "
99 "bracket properties.",
100 "edge-height shorten-pair bracket-flare pedal-text");