source file of the GNU LilyPond music typesetter
- (c) 1997--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ (c) 1997--2004 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
#include <math.h>
#include <ctype.h>
+#include "staff-symbol.hh"
#include "misc.hh"
#include "dots.hh"
#include "note-head.hh"
int pos,
int interspaces,
Interval x_extent,
+ Real left_shorten,
bool take_space)
{
+ Grob *staff = Staff_symbol_referencer::get_staff_symbol (me);
Real inter_f = Staff_symbol_referencer::staff_space (me)/2;
int line_count = (abs (pos) < interspaces)
? 0
if (line_count)
{
Real ledgerlinethickness =
- (me->get_paper ()->get_realvar (ly_symbol2scm ("ledgerlinethickness")));
+ Staff_symbol::get_ledger_line_thickness (staff);
Real blotdiameter = ledgerlinethickness;
- // (me->get_paper ()->get_realvar (ly_symbol2scm ("blotdiameter")));
Interval y_extent =
Interval (-0.5*(ledgerlinethickness),
+0.5*(ledgerlinethickness));
- Box ledger_line (x_extent, y_extent);
-
Molecule proto_ledger_line =
- Lookup::round_filled_box (ledger_line, blotdiameter);
+ Lookup::round_filled_box (Box (x_extent, y_extent), blotdiameter);
- if (!take_space)
- proto_ledger_line.set_empty (true);
+ x_extent[LEFT] += left_shorten;
+ Molecule proto_first_line =
+ Lookup::round_filled_box (Box (x_extent, y_extent), blotdiameter);
+ if (!take_space)
+ {
+ proto_ledger_line.set_empty (true);
+ proto_first_line.set_empty (true);
+ }
Direction dir = (Direction)sign (pos);
Real offs = (Staff_symbol_referencer::on_staffline (me, pos))
? 0.0
: -dir * inter_f;
+
for (int i = 0; i < line_count; i++)
{
- Molecule ledger_line (proto_ledger_line);
+ Molecule ledger_line ((i == 0)
+ ? proto_first_line
+ : proto_ledger_line
+ );
ledger_line.translate_axis (-dir * inter_f * i * 2 + offs, Y_AXIS);
molecule.add_molecule (ledger_line);
}
Font_metric * fm = Font_interface::get_default_font (me);
Molecule out = fm->find_by_name (font_char);
- if (out.empty_b())
+ if (out.is_empty ())
{
me->warning (_f ("note head `%s' not found", font_char.to_str0 ()));
}
if (with_ledgers && interspaces >= 0
&& abs (pos) - interspaces > 1)
{
- Interval hd = out.extent (X_AXIS);
- Real left_ledger_protusion = hd.length ()/4;
- Real right_ledger_protusion = left_ledger_protusion;
+ Interval ledger_size = out.extent (X_AXIS);
+ ledger_size.widen ( ledger_size.length ()/4);
+ Real left_shorten =0.0;
if (Grob * g = unsmob_grob(me->get_grob_property ("accidental-grob")))
{
/*
Grob *common = g->common_refpoint (me, X_AXIS);
Real d =
- me->extent (common, X_AXIS)[LEFT]
- -g->extent (common, X_AXIS)[RIGHT];
-
- left_ledger_protusion = left_ledger_protusion <? (d/2);
+ (me->extent (common, X_AXIS)[LEFT]
+ +g->extent (common, X_AXIS)[RIGHT]) /2;
+
+ left_shorten = (-ledger_size[LEFT] + d) >? 0 ;
+
+ /*
+ TODO: shorten 2 ledger lines for the case natural +
+ downstem.
+ */
}
- Interval l_extents = Interval (hd[LEFT] - left_ledger_protusion,
- hd[RIGHT] + right_ledger_protusion);
out.add_molecule (Note_head::brew_ledger_lines (me, pos, interspaces,
- l_extents, false));
+ ledger_size,
+ left_shorten,
+ false));
}
return out;
}
{
Molecule mol = internal_brew_molecule (me, false);
- if (!mol.empty_b())
+ if (!mol.is_empty ())
return mol.extent (a);
}
else
if (abs (pos) - interspaces > 1)
{
Interval hd = m.extent (X_AXIS);
- Real hw = hd.length ()/4;
- Interval extent = Interval (hd[LEFT] - hw, hd[RIGHT] + hw);
- m.add_molecule (brew_ledger_lines (me, pos, interspaces, extent, false));
+ hd.widen ( hd.length ()/4);
+ m.add_molecule (brew_ledger_lines (me, pos, interspaces, hd, 0, false));
}
return m.smobbed_copy ();
Box b = fm->get_indexed_char (k);
Offset wxwy = fm->get_indexed_wxwy (k);
Interval v = b[a];
- if (!v.empty_b ())
+ if (!v.is_empty ())
return 2 * (wxwy[a] - v.center()) / v.length ();
}
}
result = (a == X_AXIS) ? ly_car (result) : ly_cdr (result);
- return gh_number_p (result) ? gh_scm2double (result) : 0.0;
+ return robust_scm2double (result,0);
}
int