DECLARE_SCHEME_CALLBACK (brew_ez_stencil, (SCM));
DECLARE_SCHEME_CALLBACK (stem_x_shift, (SCM));
DECLARE_SCHEME_CALLBACK (calc_stem_attachment, (SCM));
+ DECLARE_SCHEME_CALLBACK (include_ledger_line_height, (SCM));
DECLARE_GROB_INTERFACE();
static Real stem_attachment_coordinate (Grob *, Axis a);
static int get_steps (Grob *);
static int line_count (Grob *);
static bool on_line (Grob *me, int pos);
+ static Interval line_span (Grob *);
DECLARE_SCHEME_CALLBACK (print, (SCM));
DECLARE_SCHEME_CALLBACK (height, (SCM));
DECLARE_GROB_INTERFACE();
#include "directional-element-interface.hh"
#include "font-interface.hh"
+#include "grob.hh"
#include "international.hh"
+#include "staff-symbol.hh"
+#include "staff-symbol-referencer.hh"
#include "warn.hh"
-#include "grob.hh"
static Stencil
internal_print (Grob *me, string *font_char)
return internal_print (me, &idx).smobbed_copy ();
}
+MAKE_SCHEME_CALLBACK (Note_head, include_ledger_line_height, 1);
+SCM
+Note_head::include_ledger_line_height (SCM smob)
+{
+ Grob *me = unsmob_grob (smob);
+ Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
+
+ if (staff)
+ {
+ Real ss = Staff_symbol::staff_space (staff);
+ Interval lines = Staff_symbol::line_span (staff) * (ss / 2.0);
+ Real my_pos = Staff_symbol_referencer::get_position (me) * ss / 2.0;
+ Interval my_ext = me->extent (me, Y_AXIS) + my_pos;
+
+ // The +1 and -1 come from the fact that we only want to add
+ // the interval between the note and the first ledger line, not
+ // the whole interval between the note and the staff.
+ Interval iv (min (0.0, lines[UP] - my_ext[DOWN] + 1),
+ max (0.0, lines[DOWN] - my_ext[UP] - 1));
+ return ly_interval2scm (iv);
+ }
+
+ return ly_interval2scm (Interval (0, 0));
+}
+
Real
Note_head::stem_attachment_coordinate (Grob *me, Axis a)
{
return ((abs (pos + line_count (me)) % 2) == 1);
}
+Interval
+Staff_symbol::line_span (Grob *me)
+{
+ SCM line_positions = me->get_property ("line-positions");
+ Interval iv;
+
+ if (scm_is_pair (line_positions))
+ for (SCM s = line_positions; scm_is_pair (s); s = scm_cdr (s))
+ iv.add_point (scm_to_double (scm_car (s)));
+ else
+ {
+ int count = line_count (me);
+ return Interval (-count + 1, count - 1);
+ }
+
+ return iv;
+}
+
ADD_INTERFACE (Staff_symbol,
"This spanner draws the lines of a staff. A staff symbol"
" defines a vertical unit, the @emph{staff space}. Quantities"
(NoteHead
. (
(duration-log . ,note-head::calc-duration-log)
+ (extra-spacing-height . ,ly:note-head::include-ledger-line-height)
(glyph-name . ,note-head::calc-glyph-name)
(stem-attachment . ,ly:note-head::calc-stem-attachment)
(stencil . ,ly:note-head::print)