+ it = std::upper_bound (line_pos.begin (), line_pos.end (),
+ ydim[UP]);
+ assert (it < line_pos.end ());
+ val = (it[-1] + it[0]) / 2;
+ if (val < ydim[UP] && it + 1 < line_pos.end ())
+ val = (it[0] + it[1]) / 2;
+ ydim.add_point (val);
+ }
+ }
+ }
+
+ ydim *= Staff_symbol_referencer::staff_space (me) / 2;
+
+ Interval xdim (0, thickness);
+ Box b (xdim, ydim);
+ Stencil out = Lookup::round_filled_box (b, blotdiameter);
+ return out.smobbed_copy ();
+}
+
+/*
+ Gregorian chant divisio maxima.
+*/
+MAKE_SCHEME_CALLBACK (Breathing_sign, divisio_maxima, 1);
+SCM
+Breathing_sign::divisio_maxima (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Real staff_space = Staff_symbol_referencer::staff_space (me);
+ Real thickness = Staff_symbol_referencer::line_thickness (me);
+ thickness *= robust_scm2double (me->get_property ("thickness"), 1.0);
+
+ Real blotdiameter = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
+
+ // like a "|" type bar
+ Interval xdim (0, thickness);
+ Interval ydim = Staff_symbol_referencer::staff_span (me);
+ ydim *= staff_space / 2;
+ Box b (xdim, ydim);
+ Stencil out = Lookup::round_filled_box (b, blotdiameter);
+ return out.smobbed_copy ();
+}
+
+/*
+ Gregorian chant finalis.
+*/
+MAKE_SCHEME_CALLBACK (Breathing_sign, finalis, 1);
+SCM
+Breathing_sign::finalis (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Real staff_space = Staff_symbol_referencer::staff_space (me);
+ Real thickness = Staff_symbol_referencer::line_thickness (me);
+ thickness *= robust_scm2double (me->get_property ("thickness"), 1.0);
+
+ Real blotdiameter = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
+
+ // like a "||" type bar
+ Interval xdim (0, thickness);
+ Interval ydim = Staff_symbol_referencer::staff_span (me);
+ ydim *= staff_space / 2;
+ Box b (xdim, ydim);
+ Stencil line1 = Lookup::round_filled_box (b, blotdiameter);
+ Stencil line2 (line1);
+ line2.translate_axis (0.5 * staff_space, X_AXIS);
+ line1.add_stencil (line2);
+
+ return line1.smobbed_copy ();