/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 1996--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 1996--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
Jan Nieuwenhuizen <janneke@gnu.org>
LilyPond is free software: you can redistribute it and/or modify
{
public:
DECLARE_SCHEME_CALLBACK (print, (SCM));
+ DECLARE_SCHEME_CALLBACK (glyph_name, (SCM));
DECLARE_SCHEME_CALLBACK (width, (SCM));
DECLARE_SCHEME_CALLBACK (calc_y_offset, (SCM));
+ DECLARE_SCHEME_CALLBACK (pure_calc_y_offset, (SCM, SCM, SCM));
DECLARE_SCHEME_CALLBACK (calc_x_offset, (SCM));
- DECLARE_GROB_INTERFACE ();
+
+ static SCM internal_calc_y_offset (SCM smob, bool pure);
};
MAKE_SCHEME_CALLBACK (Flag, width, 1);
SCM
Flag::width (SCM smob)
{
- Grob *me = unsmob_grob (smob);
- Stencil *sten = unsmob_stencil (me->get_property ("stencil"));
+ Grob *me = unsmob<Grob> (smob);
+ Stencil *sten = unsmob<Stencil> (me->get_property ("stencil"));
if (!sten)
return ly_interval2scm (Interval (0.0, 0.0));
return ly_interval2scm (sten->extent (X_AXIS) - stem->extent (stem, X_AXIS)[RIGHT]);
}
-MAKE_SCHEME_CALLBACK (Flag, print, 1);
+
+MAKE_SCHEME_CALLBACK (Flag, glyph_name, 1);
SCM
-Flag::print (SCM smob)
+Flag::glyph_name (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = unsmob<Grob> (smob);
Grob *stem = me->get_parent (X_AXIS);
Direction d = get_grob_direction (stem);
if (scm_is_symbol (flag_style_scm))
flag_style = ly_symbol2string (flag_style_scm);
- if (flag_style == "no-flag")
- return Stencil ().smobbed_copy ();
-
bool adjust = true;
string staffline_offs;
char dir = (d == UP) ? 'u' : 'd';
string font_char = flag_style
- + to_string (dir) + staffline_offs + to_string (log);
+ + ::to_string (dir) + staffline_offs + ::to_string (log);
+ return ly_string2scm ("flags." + font_char);
+}
+
+MAKE_SCHEME_CALLBACK (Flag, print, 1);
+SCM
+Flag::print (SCM smob)
+{
+ Grob *me = unsmob<Grob> (smob);
+ Grob *stem = me->get_parent (X_AXIS);
+
+ Direction d = get_grob_direction (stem);
+ string flag_style;
+
+ SCM flag_style_scm = me->get_property ("style");
+ if (scm_is_symbol (flag_style_scm))
+ flag_style = ly_symbol2string (flag_style_scm);
+
+ if (flag_style == "no-flag")
+ return Stencil ().smobbed_copy ();
+
+ char dir = (d == UP) ? 'u' : 'd';
Font_metric *fm = Font_interface::get_default_font (me);
- Stencil flag = fm->find_by_name ("flags." + font_char);
+ string font_char = robust_scm2string (me->get_property ("glyph-name"), "");
+ Stencil flag = fm->find_by_name (font_char);
if (flag.is_empty ())
me->warning (_f ("flag `%s' not found", font_char));
string stroke_style = ly_scm2string (stroke_style_scm);
if (!stroke_style.empty ())
{
- string font_char = flag_style + to_string (dir) + stroke_style;
+ string font_char = flag_style + ::to_string (dir) + stroke_style;
Stencil stroke = fm->find_by_name ("flags." + font_char);
if (stroke.is_empty ())
{
- font_char = to_string (dir) + stroke_style;
+ font_char = ::to_string (dir) + stroke_style;
stroke = fm->find_by_name ("flags." + font_char);
}
if (stroke.is_empty ())
return flag.smobbed_copy ();
}
+MAKE_SCHEME_CALLBACK (Flag, pure_calc_y_offset, 3);
+SCM
+Flag::pure_calc_y_offset (SCM smob,
+ SCM /* beg */,
+ SCM /* end */)
+{
+ return internal_calc_y_offset (smob, true);
+}
+
MAKE_SCHEME_CALLBACK (Flag, calc_y_offset, 1);
SCM
Flag::calc_y_offset (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ return internal_calc_y_offset (smob, false);
+}
+
+SCM
+Flag::internal_calc_y_offset (SCM smob, bool pure)
+{
+ Grob *me = unsmob<Grob> (smob);
Grob *stem = me->get_parent (X_AXIS);
Direction d = get_grob_direction (stem);
Real blot
= me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter"));
- Real y2 = stem->extent (stem, Y_AXIS)[d];
+ Interval stem_extent = pure
+ ? stem->pure_y_extent (stem, 0, INT_MAX)
+ : stem->extent (stem, Y_AXIS);
- return scm_from_double (y2 - d * blot / 2);
+ return scm_from_double (stem_extent.is_empty ()
+ ? 0.0
+ : stem_extent[d] - d * blot / 2);
}
MAKE_SCHEME_CALLBACK (Flag, calc_x_offset, 1);
SCM
Flag::calc_x_offset (SCM smob)
{
- Grob *me = unsmob_grob (smob);
+ Grob *me = unsmob<Grob> (smob);
Grob *stem = me->get_parent (X_AXIS);
return scm_from_double (stem->extent (stem, X_AXIS)[RIGHT]);
}
" @code{'no-flag}, which switches off the flag.",
/* properties */
+ "glyph-name "
"style "
"stroke-style "
);