notes = \relative c' {
\time 3/4
- c2. | d | e | f \bar ":|"
- g2. | a | b | c \bar "|:"
- d2. | e | f | g \bar ":|:"
+ c2. | d | e | f
+ g2. | a | b | c
+ d2. | e | f | g
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' \bar ":|" c'' e g
+ g,4 c e b' c'' e g
}
\new Staff \relative c' {
\override Staff.StaffSymbol #'line-positions = #'(-7 -2 0 3 9)
- g c f b \bar ":|" e a
+ g c f b e a
}
+
+
\override StaffSymbol #'staff-space = #0
} {
\relative c' {
- c1 \bar ":|"
+ c1
}
}
#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");
- /*
- 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;
-
+ int lines = Staff_symbol_referencer::line_count (me);
+ Real dist
+ = ((lines & 1 || lines == 0)
+ ? 1
+ : (staff_space < 2 ? 2 : .5)) * staff_space;
Stencil colon (dot);
- colon.translate_axis (dist * staff_space / 2, Y_AXIS);
+ colon.translate_axis (dist, Y_AXIS);
colon.add_stencil (dot);
- colon.translate_axis ((centre - dist / 2) * staff_space / 2, Y_AXIS);
+ colon.translate_axis (-dist / 2, Y_AXIS);
Real const h = extent.length ();
Stencil m;
// we need two translations: the normal one and
// the one of the lowest segment
- size_t idx[] = {i, extreme};
+ int 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 (staff_span.contains (rest_extent[d] + staff_space * shift)
- || staff_span.contains (rest_extent[-d] + staff_space * shift))
+ if ((rest_extent[d] + staff_space * shift) * d
+ < rad
+ || (rest_extent[-d] + staff_space * shift) * -d
+ < rad)
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.
*/
- 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);
+ 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 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 = Staff_symbol_referencer::staff_span (me);
- ydim *= staff_space / 2;
+ Interval ydim (-0.5 * staff_size, +0.5 * staff_size);
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 = Staff_symbol_referencer::staff_span (me);
- ydim *= staff_space / 2;
+ Interval ydim (-0.5 * staff_size, +0.5 * staff_size);
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 += Staff_symbol_referencer::on_line (me, pos) ? "1" : "0";
+ font_char += (((pos ^ sz) & 0x1) == 0) ? "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 (staff_span.contains
- (Staff_symbol_referencer::get_position (rest) + discrete_y))
+ if (fabs (Staff_symbol_referencer::get_position (rest)
+ + discrete_y) < stafflines + 1)
{
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 && Staff_symbol_referencer::line_count (me) > 1)
+ if (duration_log == 0 && line_count > 1)
pos += 2;
/*
* 2.0 / staff_space_;
if (fabs (pos - my_round (pos)) < 0.2
- && Staff_symbol_referencer::on_staff_line (on_staff, (int) rint (pos)))
+ && Staff_symbol_referencer::on_line (on_staff, (int) rint (pos))
+ && Staff_symbol_referencer::line_count (on_staff) - 1 >= 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);
- /*
- 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);
- }
- }
+ if (Staff_symbol_referencer::line_count (me) % 2 == 0)
+ m.translate_axis (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);
- bool above_staff = pos > Staff_symbol_referencer::staff_span (me)[UP];
+ int interspaces = Staff_symbol_referencer::line_count (me) - 1;
+ bool above_staff = pos > interspaces;
if (delta_pitch > -1)
{