notes = \relative c' {
\time 3/4
- c2. | d | e | f
- g2. | a | b | c
- d2. | e | f | g
+ c2. | d | e | f \bar ":|"
+ g2. | a | b | c \bar "|:"
+ d2. | e | f | g \bar ":|:"
a2.
}
\override Staff.StaffSymbol #'line-positions = #'(1 3 5 7 9)
c''1 \bar "||"
c''1 \bar ":"
+ c''1 \bar ":|"
c''1 \bar "|."
}
\override Staff.StaffSymbol #'line-positions = #'(-5 -2 -1 2 5 6)
\override Staff.StaffSymbol #'ledger-positions = #'(-5 (-2 -1) 2)
\override Staff.StaffSymbol #'ledger-extra = #1
- g,4 c e b' c'' e g
+ g,4 c e b' \bar ":|" c'' e g
}
\new Staff \relative c' {
\override Staff.StaffSymbol #'line-positions = #'(-7 -2 0 3 9)
- g c f b e a
+ g c f b \bar ":|" e a
}
-
-
\override StaffSymbol #'staff-space = #0
} {
\relative c' {
- c1
+ c1 \bar ":|"
}
}
#include "lookup.hh"
#include "output-def.hh"
#include "paper-column.hh"
+#include "staff-symbol.hh"
#include "staff-symbol-referencer.hh"
+#include <set>
+
+
MAKE_SCHEME_CALLBACK (Bar_line, calc_bar_extent, 1)
SCM
Bar_line::calc_bar_extent (SCM smob)
Stencil thick = simple_barline (me, fatline, extent, rounded);
Stencil dot = Font_interface::get_default_font (me)->find_by_name ("dots.dot");
- int lines = Staff_symbol_referencer::line_count (me);
- Real dist
- = ((lines & 1 || lines == 0)
- ? 1
- : (staff_space < 2 ? 2 : .5)) * staff_space;
+ /*
+ the two dots of the repeat sign should be centred at the middle of
+ the staff and both should avoid staff lines
+ */
+ Real centre = 0.0, dist = 1.0;
+ if (staff_space)
+ {
+ if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (me))
+ {
+ std::vector<Real> linepos = Staff_symbol::line_positions (staff);
+ if (!linepos.empty ())
+ {
+ centre = Staff_symbol::line_span (staff).center ();
+
+ /*
+ fold the staff into two at centre and find the first gap
+ big enough to hold a dot and some space below and above
+ */
+ std::set<Real> half_staff;
+ half_staff.insert (0.0);
+ for (std::vector<Real>::const_iterator
+ i = linepos.begin (), e = linepos.end ();
+ i != e;
+ ++i)
+ half_staff.insert (fabs (*i - centre));
+
+ /*
+ gap is measured like line-positions;
+ 1.0 for dot diameter, twice the staffline width for the
+ gap above and below and one more staffline width for the
+ two half stafflines
+ */
+ Real const gap_to_find = (1.0 + 3 * staffline) / staff_space;
+ dist = *half_staff.rbegin () * 2 + gap_to_find;
+ for (std::set<Real>::const_iterator
+ i0 = half_staff.begin (), i1 = i0, e = half_staff.end ();
+ ++i1 != e;
+ i0 = i1)
+ if (*i1 - *i0 > gap_to_find)
+ {
+ dist = *i0 + *i1;
+ break;
+ }
+ }
+ }
+ }
+ else
+ dist += 3 * staffline;
+
+ if (staff_space == 0.0)
+ staff_space = 1.0;
+
Stencil colon (dot);
- colon.translate_axis (dist, Y_AXIS);
+ colon.translate_axis (dist * staff_space / 2, Y_AXIS);
colon.add_stencil (dot);
- colon.translate_axis (-dist / 2, Y_AXIS);
+ colon.translate_axis ((centre - dist / 2) * staff_space / 2, Y_AXIS);
Real const h = extent.length ();
Stencil m;
// we need two translations: the normal one and
// the one of the lowest segment
- int idx[] = {i, extreme};
+ size_t idx[] = {i, extreme};
Real translations[2];
for (int j = 0; j < 2; j++)
Real shift = d * min (d * (beam_y - d * minimum_distance - rest_dim), 0.0);
shift /= staff_space;
- Real rad = Staff_symbol_referencer::line_count (rest) * staff_space / 2;
/* Always move discretely by half spaces */
shift = ceil (fabs (shift * 2.0)) / 2.0 * sign (shift);
+ Interval staff_span = Staff_symbol_referencer::staff_span (rest);
+ staff_span *= staff_space / 2;
+
/* Inside staff, move by whole spaces*/
- if ((rest_extent[d] + staff_space * shift) * d
- < rad
- || (rest_extent[-d] + staff_space * shift) * -d
- < rad)
+ if (staff_span.contains (rest_extent[d] + staff_space * shift)
+ || staff_span.contains (rest_extent[-d] + staff_space * shift))
shift = ceil (fabs (shift)) * sign (shift);
return scm_from_double (offset + staff_space * shift);
* more than half the size of the staff, such that the endings of
* the line are in the middle of a staff space.
*/
- int lines = Staff_symbol_referencer::line_count (me);
- int height = lines / 2; // little more than half of staff size
- if ((lines & 1) != (height & 1))
- height++; // ensure endings are centered in staff space
+ Interval ydim = Staff_symbol_referencer::staff_span (me);
+ ydim.widen (-0.25 * ydim.delta ());
+ for (UP_and_DOWN (i))
+ {
+ int const int_dim = (int) ydim[i];
+ if (int_dim == ydim[i]
+ && Staff_symbol_referencer::on_staff_line (me, int_dim))
+ ydim[i] += i;
+ }
+
+ ydim *= 1.0 / Staff_symbol_referencer::staff_space (me);
Interval xdim (0, thickness);
- Interval ydim (-0.5 * height, +0.5 * height);
Box b (xdim, ydim);
Stencil out = Lookup::round_filled_box (b, blotdiameter);
return out.smobbed_copy ();
{
Grob *me = unsmob_grob (smob);
Real staff_space = Staff_symbol_referencer::staff_space (me);
- Real staff_size;
Real thickness = Staff_symbol_referencer::line_thickness (me);
thickness *= robust_scm2double (me->get_property ("thickness"), 1.0);
- if (Staff_symbol_referencer::get_staff_symbol (me))
- staff_size = (Staff_symbol_referencer::line_count (me) - 1) * staff_space;
- else
- staff_size = 0.0;
-
Real blotdiameter = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
// like a "|" type bar
Interval xdim (0, thickness);
- Interval ydim (-0.5 * staff_size, +0.5 * staff_size);
+ 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 ();
{
Grob *me = unsmob_grob (smob);
Real staff_space = Staff_symbol_referencer::staff_space (me);
- Real staff_size;
Real thickness = Staff_symbol_referencer::line_thickness (me);
thickness *= robust_scm2double (me->get_property ("thickness"), 1.0);
- if (Staff_symbol_referencer::get_staff_symbol (me))
- staff_size = (Staff_symbol_referencer::line_count (me) - 1) * staff_space;
- else
- staff_size = 0.0;
-
Real blotdiameter = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
// like a "||" type bar
Interval xdim (0, thickness);
- Interval ydim (-0.5 * staff_size, +0.5 * staff_size);
+ 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);
= to_dir (me->get_property ("neutral-direction"));
int pos = Staff_symbol_referencer::get_rounded_position (me);
- int sz = Staff_symbol_referencer::line_count (me) - 1;
string font_char = "custodes." + style + ".";
if (pos < neutral_pos)
font_char += "d";
if (adjust)
- font_char += (((pos ^ sz) & 0x1) == 0) ? "1" : "0";
+ font_char += Staff_symbol_referencer::on_line (me, pos) ? "1" : "0";
else
font_char += "2";
Real y = dir * max (0.0,
-dir * restdim[-dir] + dir * notedim[dir] + minimum_dist);
- int stafflines = Staff_symbol_referencer::line_count (me);
- if (!stafflines)
- {
- programming_error ("no staff line count");
- stafflines = 5;
- }
-
// move discretely by half spaces.
int discrete_y = dir * int (ceil (y / (0.5 * dir * staff_space)));
+ Interval staff_span = Staff_symbol_referencer::staff_span (rest);
+ staff_span.widen (1);
// move by whole spaces inside the staff.
- if (fabs (Staff_symbol_referencer::get_position (rest)
- + discrete_y) < stafflines + 1)
+ if (staff_span.contains
+ (Staff_symbol_referencer::get_position (rest) + discrete_y))
{
discrete_y = dir * int (ceil (dir * discrete_y / 2.0) * 2.0);
}
{
Grob *me = unsmob_grob (smob);
int duration_log = scm_to_int (me->get_property ("duration-log"));
- int line_count = Staff_symbol_referencer::line_count (me);
Real ss = Staff_symbol_referencer::staff_space (me);
bool position_override = scm_is_number (me->get_property ("staff-position"));
make a semibreve rest hang from the next line,
except for a single line staff
*/
- if (duration_log == 0 && line_count > 1)
+ if (duration_log == 0 && Staff_symbol_referencer::line_count (me) > 1)
pos += 2;
/*
* 2.0 / staff_space_;
if (fabs (pos - my_round (pos)) < 0.2
- && Staff_symbol_referencer::on_line (on_staff, (int) rint (pos))
- && Staff_symbol_referencer::line_count (on_staff) - 1 >= rint (pos))
+ && Staff_symbol_referencer::on_staff_line (on_staff, (int) rint (pos)))
y += 1.5 * staff_space_ * dir_ / 10;
return y;
#include "font-interface.hh"
#include "international.hh"
#include "output-def.hh"
+#include "staff-symbol.hh"
#include "staff-symbol-referencer.hh"
#include "text-interface.hh"
#include "warn.hh"
else
m = numbered_time_signature (me, n, d);
- if (Staff_symbol_referencer::line_count (me) % 2 == 0)
- m.translate_axis (Staff_symbol_referencer::staff_space (me) / 2, Y_AXIS);
+ /*
+ position the signature centred on the staff line
+ nearest to the middle of the staff
+ */
+ if (Grob *staff = Staff_symbol_referencer::get_staff_symbol (me))
+ {
+ std::vector<Real> const linepos = Staff_symbol::line_positions (staff);
+ if (!linepos.empty ())
+ {
+ Interval const span = Staff_symbol::line_span (staff);
+ Real const mid = span.center ();
+ Real pos = linepos.front ();
+ Real dist = fabs (pos - mid);
+ for (std::vector<Real>::const_iterator
+ i = linepos.begin (), e = linepos.end ();
+ ++i != e;)
+ {
+ double const d = fabs (*i - mid);
+ if (d < dist)
+ {
+ pos = *i;
+ dist = d;
+ }
+ }
+
+ m.translate_axis
+ (pos * Staff_symbol_referencer::staff_space (me) / 2, Y_AXIS);
+ }
+ }
return m.smobbed_copy ();
}
Real blotdiameter)
{
bool on_staffline = Staff_symbol_referencer::on_line (me, pos);
- int interspaces = Staff_symbol_referencer::line_count (me) - 1;
- bool above_staff = pos > interspaces;
+ bool above_staff = pos > Staff_symbol_referencer::staff_span (me)[UP];
if (delta_pitch > -1)
{