X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fkey-signature-interface.cc;h=375bac59b323a982f55c12b79d8a61395e28c285;hb=f4c0b9541aceba91c49b08207e7fa9a1adb0d2c7;hp=0616dcffcb23529114bfb445353dedd168948499;hpb=e7020dbb36a9e9c10bda48e5197213e8a3bacef6;p=lilypond.git diff --git a/lily/key-signature-interface.cc b/lily/key-signature-interface.cc index 0616dcffcb..375bac59b3 100644 --- a/lily/key-signature-interface.cc +++ b/lily/key-signature-interface.cc @@ -3,63 +3,51 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2004 Han-Wen Nienhuys + (c) 1996--2005 Han-Wen Nienhuys keyplacement by Mats Bengtsson */ #include "item.hh" - -#include "stencil.hh" -#include "paper-def.hh" +#include "output-def.hh" #include "font-interface.hh" #include "staff-symbol-referencer.hh" #include "lookup.hh" -#include "lily-guile.hh" -#include "lily-proto.hh" #include "accidental-interface.hh" struct Key_signature_interface { - DECLARE_SCHEME_CALLBACK (print, (SCM )); + DECLARE_SCHEME_CALLBACK (print, (SCM)); - static bool has_interface (Grob*); + static bool has_interface (Grob *); }; - /* FIXME: too much hardcoding here. - */ -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 */ +*/ +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; - - - + 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 the thinking to other parties. - TODO: put this in Scheme - - - 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. + TODO: can we do without c0pos? it's partly musical. */ int -alteration_pos (SCM what, int alter, int c0p) +alteration_pos (SCM what, int alter, int c0p) { - if (ly_c_pair_p (what)) - return ly_scm2int (ly_car (what)) * 7 + ly_scm2int (ly_cdr (what)) + c0p; + if (scm_is_pair (what)) + return scm_to_int (scm_car (what)) * 7 + scm_to_int (scm_cdr (what)) + c0p; - int p = ly_scm2int (what); + int p = scm_to_int (what); // Find the c in the range -4 through 2 int from_bottom_pos = c0p + 4; @@ -67,44 +55,44 @@ alteration_pos (SCM what, int alter, int c0p) from_bottom_pos = (from_bottom_pos + 7)%7; // Precaution to get positive. 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)) - || (alter == 0 && ((p > NATURAL_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 */ } - /* Provide for the four cases in which there's a glitch - it's a hack, but probably not worth - the effort of finding a nicer solution. - --dl. */ - if (c0==2 && alter >0 && p==3) + + /* Provide for the four cases in which there's a glitch + it's a hack, but probably not worth + the effort of finding a nicer solution. + --dl. */ + if (c0 == 2 && alter > 0 && p == 3) p -= 7; - if (c0==-3 && alter>0 && p==-1) + if (c0==-3 && alter > 0 && p ==-1) p += 7; - if (c0==-4 && alter<0 && p==-1) + if (c0==-4 && alter < 0 && p ==-1) p += 7; - if (c0==-2 && alter<0 && p==-3) + if (c0==-2 && alter < 0 && p ==-3) p += 7; - + return p + c0; } /* TODO - space the `natural' signs wider - */ -MAKE_SCHEME_CALLBACK (Key_signature_interface,print,1); +*/ +MAKE_SCHEME_CALLBACK (Key_signature_interface, print, 1); SCM Key_signature_interface::print (SCM smob) { - Grob*me =unsmob_grob (smob); + Grob *me = unsmob_grob (smob); - Real inter = Staff_symbol_referencer::staff_space (me)/2.0; + Real inter = Staff_symbol_referencer::staff_space (me) / 2.0; SCM scm_style = me->get_property ("style"); String style; - if (ly_c_symbol_p (scm_style)) + if (scm_is_symbol (scm_style)) { style = ly_symbol2string (scm_style); } @@ -113,13 +101,13 @@ Key_signature_interface::print (SCM smob) style = ""; } - SCM newas = me->get_property ("new-accidentals"); + SCM newas = me->get_property ("new-accidentals"); Stencil mol; SCM c0s = me->get_property ("c0-position"); int c0p = 0; - if (is_number (c0s)) - c0p = ly_scm2int (c0s); + if (scm_is_number (c0s)) + c0p = scm_to_int (c0s); /* SCM lists are stacks, so we work from right to left, ending with @@ -127,12 +115,12 @@ Key_signature_interface::print (SCM smob) */ Font_metric *fm = Font_interface::get_default_font (me); - for (SCM s = newas; ly_c_pair_p (s); s = ly_cdr (s)) + for (SCM s = newas; scm_is_pair (s); s = scm_cdr (s)) { - int alteration = ly_scm2int (ly_cdar (s)); - String font_char = - Accidental_interface::get_fontcharname (style, alteration); - Stencil acc (fm->find_by_name ("accidentals-" + font_char)); + int alteration = scm_to_int (scm_cdar (s)); + String font_char + = Accidental_interface::get_fontcharname (style, alteration); + Stencil acc (fm->find_by_name ("accidentals." + font_char)); if (acc.is_empty ()) { @@ -140,62 +128,58 @@ Key_signature_interface::print (SCM smob) } else { - SCM what = ly_caar (s); + SCM what = scm_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) ; + Item *it = dynamic_cast (me); if (it->break_status_dir () != RIGHT) { SCM old = me->get_property ("old-accidentals"); - - /* - Add half a space between cancellation and key sig. - - As suggested by [Ross], p.148. - */ - Interval x (0, inter); - Interval y (0,0); - - mol.add_at_edge (X_AXIS, LEFT, Lookup::blank (Box (x,y)), 0, 0); Stencil natural; - if (ly_c_pair_p (old)) - natural=Font_interface::get_default_font (me)-> - find_by_name (String ("accidentals-") + style + String ("0")); - - for (; ly_c_pair_p (old); old = ly_cdr (old)) - { - SCM found = scm_assoc (ly_caar (old), newas); + if (scm_is_pair (old)) + natural = Font_interface::get_default_font (me)-> + find_by_name (String ("accidentals.") + style + String ("0")); + + int last_pos = -100; + for (; scm_is_pair (old); old = scm_cdr (old)) + { + SCM found = scm_assoc (scm_caar (old), newas); if (found == SCM_BOOL_F - || ly_cdr (found) != ly_cdar (old)) + || scm_cdr (found) != scm_cdar (old)) { - SCM what = ly_caar (old); + SCM what = scm_caar (old); int alteration = 0; int pos = alteration_pos (what, alteration, c0p); Stencil m = natural; - m.translate_axis (pos* inter, Y_AXIS); + m.translate_axis (pos * inter, Y_AXIS); /* The natural sign (unlike flat & sharp) has vertical edges on both sides. A little padding is needed to prevent collisions. - */ - Real padding = 0.1 ; + */ + Real padding = 0.0; + if (last_pos < pos + 2 + && last_pos > pos - 6) + padding = 0.3; + mol.add_at_edge (X_AXIS, LEFT, m, padding, 0); - } - } + last_pos = pos; + } + } } mol.align_to (X_AXIS, LEFT); - + return mol.smobbed_copy (); } ADD_INTERFACE (Key_signature_interface, "key-signature-interface", - "A group of accidentals, to be printed as signature sign.", - "c0-position old-accidentals new-accidentals"); + "A group of accidentals, to be printed as signature sign.", + "style c0-position old-accidentals new-accidentals");