X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fflag.cc;h=31ddf349c92cf1098836fa98b11252ea19cf2b00;hb=079ab0329358f7c42802d065cc16f84ca9cfd2b3;hp=5aee4d9d155d9e1f2b1a2b94210f83e2cd895b50;hpb=ddd74753371d73e65bb57d086fe376e771ef86b8;p=lilypond.git diff --git a/lily/flag.cc b/lily/flag.cc index 5aee4d9d15..31ddf349c9 100644 --- a/lily/flag.cc +++ b/lily/flag.cc @@ -1,7 +1,7 @@ /* This file is part of LilyPond, the GNU music typesetter. - Copyright (C) 1996--2011 Han-Wen Nienhuys + Copyright (C) 1996--2012 Han-Wen Nienhuys Jan Nieuwenhuizen LilyPond is free software: you can redistribute it and/or modify @@ -33,13 +33,15 @@ class Flag { 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 @@ -60,9 +62,10 @@ Flag::width (SCM smob) 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 *stem = me->get_parent (X_AXIS); @@ -75,9 +78,6 @@ Flag::print (SCM smob) 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; @@ -106,8 +106,30 @@ Flag::print (SCM smob) char dir = (d == UP) ? 'u' : 'd'; string font_char = flag_style + 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)); @@ -138,9 +160,24 @@ Flag::print (SCM smob) 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) +{ + 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); @@ -149,9 +186,13 @@ Flag::calc_y_offset (SCM smob) Real blot = me->layout ()->get_dimension (ly_symbol2scm ("blot-diameter")); - Real y2 = stem->extent (stem, Y_AXIS)[d]; + Interval stem_extent = pure + ? stem->pure_height (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); @@ -172,6 +213,7 @@ ADD_INTERFACE (Flag, " @code{'no-flag}, which switches off the flag.", /* properties */ + "glyph-name " "style " "stroke-style " - ); \ No newline at end of file + );