written for the GNU LilyPond music typesetter
-TODO: --> see breathing-sign-engraver.cc
+ TODO: --> see breathing-sign-engraver.cc
*/
-#include "staff-symbol-referencer.hh"
+#include "staff-symbol-referencer.hh"
+#include "directional-element-interface.hh"
#include "breathing-sign.hh"
#include "string.hh"
#include "molecule.hh"
#include "paper-def.hh"
#include "lookup.hh"
-#include "debug.hh"
+
#include "dimensions.hh"
#include "direction.hh"
-
-Breathing_sign::Breathing_sign ()
+MAKE_SCHEME_CALLBACK (Breathing_sign,brew_molecule,1);
+SCM
+Breathing_sign::brew_molecule (SCM smob)
{
- set_direction (UP);
- set_elt_property ("breakable", SCM_BOOL_T);
-}
+ Grob * me = unsmob_grob (smob);
+ Real space = Staff_symbol_referencer::staff_space (me);
+ // todo: cfg'able.
+ Interval i1 (0, space / 6), i2 (-space / 2, space / 2);
+ Box b (i1, i2);
+ return Lookup::filledbox (b).smobbed_copy ();
+}
-Molecule*
-Breathing_sign::do_brew_molecule_p () const
+MAKE_SCHEME_CALLBACK (Breathing_sign,offset_callback,2);
+SCM
+Breathing_sign::offset_callback (SCM element_smob, SCM)
{
- Staff_symbol_referencer_interface si (this);
+ Grob *me = unsmob_grob (element_smob);
- Real dl = si.staff_line_leading_f();
- Interval i1(0, dl / 6), i2(-dl / 2, dl / 2);
- Box b(i1, i2);
-
- Molecule *output = new Molecule (lookup_l()->filledbox(b));
-
- return output;
+ Direction d = Directional_element_interface::get (me);
+ if (!d)
+ {
+ d = UP;
+ Directional_element_interface::set (me, d);
+ }
+
+ Real inter_f = Staff_symbol_referencer::staff_space (me)/2;
+ int sz = Staff_symbol_referencer::line_count (me)-1;
+ return gh_double2scm (inter_f * sz * d);
}
-void
-Breathing_sign::do_post_processing()
-{
- Real dl = Staff_symbol_referencer_interface (this).staff_line_leading_f();
-
- translate_axis(2.0 * dl * get_direction (), Y_AXIS);
-}
+ADD_INTERFACE(Breathing_sign, "breathing-sign-interface",
+ "A breathing sign.",
+ "direction");