X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fkey-signature-interface.cc;h=7c175e20a05c37904fea86de4ba924ed890dcb79;hb=d088cb4d9526a4a93e92bdf3d0b6cbb012883b6f;hp=802a6bf015657e20661e2a260fb49348d40dcf43;hpb=c380a7abde14a60ebd6d8a6eab91ae4e13677a23;p=lilypond.git diff --git a/lily/key-signature-interface.cc b/lily/key-signature-interface.cc index 802a6bf015..7c175e20a0 100644 --- a/lily/key-signature-interface.cc +++ b/lily/key-signature-interface.cc @@ -1,10 +1,9 @@ - /* key-item.cc -- implement Key_signature_interface source file of the GNU LilyPond music typesetter - (c) 1996--2002 Han-Wen Nienhuys + (c) 1996--2003 Han-Wen Nienhuys keyplacement by Mats Bengtsson */ @@ -18,11 +17,13 @@ #include "lookup.hh" #include "lily-guile.hh" #include "lily-proto.hh" - +#include "accidental-interface.hh" struct Key_signature_interface { DECLARE_SCHEME_CALLBACK (brew_molecule, (SCM )); + + static bool has_interface (Grob*); }; @@ -32,6 +33,13 @@ struct Key_signature_interface const int FLAT_TOP_PITCH=2; /* fes,ges,as and bes typeset in lower octave */ const int SHARP_TOP_PITCH=4; /* ais and bis typeset in lower octave */ +/* + TODO: look this up. I'm not sure where the naturals ought to go. + */ +const int NATURAL_TOP_PITCH = 4; + + + /* FIXME: key-item should just get a list of (position, acc), and leave @@ -42,6 +50,8 @@ const int SHARP_TOP_PITCH=4; /* ais and bis typeset in lower octave */ - lots of values trivially shared (key doesn't change very often). Compute those once, and use that as cache for the rest. + TODO: can we do without c0pos? it's partly musical. + */ int alteration_pos (SCM what, int alter, int c0p) @@ -58,9 +68,9 @@ alteration_pos (SCM what, int alter, int c0p) int c0 = from_bottom_pos - 4; - if ((alter <0 && ((p>FLAT_TOP_PITCH) || (p+c0>4)) && (p+c0>1)) - || - (alter >0 && ((p>SHARP_TOP_PITCH) || (p+c0>5)) && (p+c0>2))) + if ((alter <0 && ((p>FLAT_TOP_PITCH) || (p+c0>4)) && (p+c0>1)) + || (alter >0 && ((p > SHARP_TOP_PITCH) || (p+c0>5)) && (p+c0>2)) + || (alter == 0 && ((p > NATURAL_TOP_PITCH) || (p + c0>5)) && (p + c0>2))) { p -= 7; /* Typeset below c_position */ } @@ -91,12 +101,12 @@ Key_signature_interface::brew_molecule (SCM smob) Grob*me =unsmob_grob (smob); Real inter = Staff_symbol_referencer::staff_space (me)/2.0; - + SCM scm_style = me->get_grob_property ("style"); String style; if (gh_symbol_p (scm_style)) { - style = ly_scm2string (scm_symbol_to_string (scm_style)); + style = ly_symbol2string (scm_style); } else { @@ -107,25 +117,34 @@ Key_signature_interface::brew_molecule (SCM smob) Molecule mol; SCM c0s = me->get_grob_property ("c0-position"); - int c0p=0; + int c0p = 0; if (gh_number_p (c0s)) - c0p = gh_scm2int (c0s); + c0p = gh_scm2int (c0s); /* SCM lists are stacks, so we work from right to left, ending with the cancellation signature. */ + Font_metric *fm = Font_interface::get_default_font (me); for (SCM s = newas; gh_pair_p (s); s = ly_cdr (s)) { - SCM what = ly_caar (s); - int alter = gh_scm2int (ly_cdar (s)); - int pos = alteration_pos (what, alter, c0p); - - Molecule m = Font_interface::get_default_font (me)-> - find_by_name (String ("accidentals-") + style + to_str (alter)); - m.translate_axis (pos * inter, Y_AXIS); - mol.add_at_edge (X_AXIS, LEFT, m, 0); + int alteration = gh_scm2int (ly_cdar (s)); + String font_char = + Accidental_interface::get_fontcharname (style, alteration); + Molecule acc (fm->find_by_name ("accidentals-" + font_char)); + + if (acc.is_empty ()) + { + me->warning (_f ("accidental `%s' not found", font_char)); + } + else + { + SCM what = ly_caar (s); + int pos = alteration_pos (what, alteration, c0p); + acc.translate_axis (pos * inter, Y_AXIS); + mol.add_at_edge (X_AXIS, LEFT, acc, 0, 0); + } } Item *it = dynamic_cast (me) ; @@ -141,7 +160,7 @@ Key_signature_interface::brew_molecule (SCM smob) Interval x (0, inter); Interval y (0,0); - mol.add_at_edge (X_AXIS, LEFT, Lookup::blank (Box (x,y)),0); + mol.add_at_edge (X_AXIS, LEFT, Lookup::blank (Box (x,y)), 0, 0); Molecule natural; if (gh_pair_p (old)) @@ -155,13 +174,19 @@ Key_signature_interface::brew_molecule (SCM smob) || ly_cdr (found) != ly_cdar (old)) { SCM what = ly_caar (old); - int alter = 0; - int pos = alteration_pos (what, alter, c0p); + int alteration = 0; + int pos = alteration_pos (what, alteration, c0p); Molecule m = natural; m.translate_axis (pos* inter, Y_AXIS); - mol.add_at_edge (X_AXIS, LEFT, m, 0); + /* + The natural sign (unlike flat & sharp) + has vertical edges on both sides. A little padding is + needed to prevent collisions. + */ + Real padding = 0.1 ; + mol.add_at_edge (X_AXIS, LEFT, m, padding, 0); } } } @@ -172,5 +197,5 @@ Key_signature_interface::brew_molecule (SCM smob) } ADD_INTERFACE (Key_signature_interface, "key-signature-interface", - "A group of accidentals.", + "A group of accidentals, to be printed as signature sign.", "c0-position old-accidentals new-accidentals");