#include "spanner.hh"
#include "group-interface.hh"
#include "paper-column.hh"
-#include "ambitus.hh"
struct Ledger_line_spanner
{
if (heads.is_empty ())
return SCM_EOL;
+
+ // find size of note heads.
+ Grob * staff = Staff_symbol_referencer::get_staff_symbol (me);
+ if (!staff)
+ return SCM_EOL;
+
Stencil ledgers;
Stencil default_ledger;
common[a] = common[a]->common_refpoint (g, a);
}
- // find size of note heads.
- Grob * staff = Staff_symbol_referencer::get_staff_symbol (me);
int interspaces = Staff_symbol::line_count (staff)-1;
Ledger_requests reqs;
Real length_fraction = 0.25;
Item *h = dynamic_cast<Item*> (heads[i]);
int pos = Staff_symbol_referencer::get_rounded_position (h);
- if (abs (pos) > interspaces)
+ if (pos
+ && abs (pos) > interspaces)
{
Interval head_extent = h->extent (common[X_AXIS], X_AXIS);
Interval ledger_extent = head_extent;
- head_extent.widen (length_fraction * head_extent.length ());
+ ledger_extent.widen (length_fraction * head_extent.length ());
Direction vdir = Direction (sign (pos));
int rank = Paper_column::get_rank (h->get_column ());
// create ledgers for note heads
Real ledgerlinethickness =
Staff_symbol::get_ledger_line_thickness (staff);
- Real halfspace = Staff_symbol::staff_space (me)/2;
+ Real halfspace = Staff_symbol::staff_space (staff)/2;
for (int i = heads.size (); i--; )
{
Item *h = dynamic_cast<Item*> (heads[i]);
int pos = Staff_symbol_referencer::get_rounded_position (h);
if (abs (pos) > interspaces + 1)
{
- Interval ledger_size = h->extent (common[X_AXIS], X_AXIS);
+ Interval head_size = h->extent (common[X_AXIS], X_AXIS);
+ Interval ledger_size = head_size;
ledger_size.widen (ledger_size.length ()* length_fraction);
Interval max_size = reqs[Paper_column::get_rank (h->get_column ())][Direction (sign(pos))].ledger_extent_;
Real left_shorten =0.0;
if (Grob * g = unsmob_grob (h->get_property ("accidental-grob")))
{
+ Interval accidental_size = g->extent (common[X_AXIS], X_AXIS);
Real d =
- linear_combination (Drul_array<Real> (h->extent (common[X_AXIS], X_AXIS)[LEFT],
- g->extent (common[X_AXIS], X_AXIS)[RIGHT]),
-
- 0.5);
+ linear_combination (Drul_array<Real> (accidental_size[RIGHT],
+ head_size[LEFT]),
+ 0.0);
left_shorten = (-ledger_size[LEFT] + d) >? 0 ;
ADD_INTERFACE (Ledger_line_spanner,
"ledger-line-interface",
- "This spanner draws the ledger lines of a staff on note heads. ",
- "note-heads thickness gap length minimum-length")
+ "This spanner draws the ledger lines of a staff, for note heads that stick out. ",
+ "note-heads thickness gap length minimum-length");
+
+
+struct Ledgered_interface {
+ static bool has_interface (Grob*);
+};
+
+ADD_INTERFACE (Ledgered_interface,
+ "ledgered-interface",
+ "Objects that need ledger lines.",
+ "no-ledgers");