X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Fkey-signature-interface.cc;h=0db5cf7b69be290076c63ac55dc1668542ffde6c;hb=a276a19dc6bd57832db3107f2f2cbb04cb4677b6;hp=d374c59b2a3a0d88a6beff90ccc9b815502e680e;hpb=108cf0e8c08c8e15e2a800feb161cfad9057daa8;p=lilypond.git diff --git a/lily/key-signature-interface.cc b/lily/key-signature-interface.cc index d374c59b2a..0db5cf7b69 100644 --- a/lily/key-signature-interface.cc +++ b/lily/key-signature-interface.cc @@ -3,80 +3,26 @@ source file of the GNU LilyPond music typesetter - (c) 1996--2005 Han-Wen Nienhuys + (c) 1996--2007 Han-Wen Nienhuys keyplacement by Mats Bengtsson */ +#include "accidental-interface.hh" +#include "font-interface.hh" +#include "international.hh" #include "item.hh" +#include "lookup.hh" #include "output-def.hh" -#include "font-interface.hh" #include "staff-symbol-referencer.hh" -#include "lookup.hh" -#include "accidental-interface.hh" +#include "rational.hh" struct Key_signature_interface { DECLARE_SCHEME_CALLBACK (print, (SCM)); - - static bool has_interface (Grob *); + DECLARE_GROB_INTERFACE(); }; -/* - 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 */ - -/* - 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 - - TODO: can we do without c0pos? it's partly musical. -*/ -int -alteration_pos (SCM what, int alter, int c0p) -{ - if (scm_is_pair (what)) - return scm_to_int (scm_car (what)) * 7 + scm_to_int (scm_cdr (what)) + c0p; - - int p = scm_to_int (what); - - // Find the c in the range -4 through 2 - int from_bottom_pos = c0p + 4; - from_bottom_pos = from_bottom_pos % 7; - 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))) - { - 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) - p -= 7; - if (c0==-3 && alter > 0 && p ==-1) - p += 7; - if (c0==-4 && alter < 0 && p ==-1) - p += 7; - if (c0==-2 && alter < 0 && p ==-3) - p += 7; - - return p + c0; -} /* TODO @@ -91,19 +37,18 @@ Key_signature_interface::print (SCM smob) Real inter = Staff_symbol_referencer::staff_space (me) / 2.0; SCM scm_style = me->get_property ("style"); - String style; + string style; if (scm_is_symbol (scm_style)) style = ly_symbol2string (scm_style); else style = ""; - SCM newas = me->get_property ("alteration-alist"); Stencil mol; SCM c0s = me->get_property ("c0-position"); - int c0p = 0; - if (scm_is_number (c0s)) - c0p = scm_to_int (c0s); + + bool is_cancellation = me->internal_has_interface + (ly_symbol2scm ("key-cancellation-interface")); /* SCM lists are stacks, so we work from right to left, ending with @@ -112,19 +57,33 @@ Key_signature_interface::print (SCM smob) int last_pos = -1000; Font_metric *fm = Font_interface::get_default_font (me); - for (SCM s = newas; scm_is_pair (s); s = scm_cdr (s)) + SCM alist = me->get_property ("glyph-name-alist"); + + for (SCM s = me->get_property ("alteration-alist"); scm_is_pair (s); s = scm_cdr (s)) { - 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)); + SCM alt = is_cancellation + ? scm_from_int (0) + : scm_cdar (s); + + SCM glyph_name = ly_assoc_get (alt, alist, SCM_BOOL_F); + if (!scm_is_string (glyph_name)) + { + me->warning (_f ("No glyph found for alteration: %s", + ly_scm2rational (alt).to_string ().c_str ())); + continue; + } + + Stencil acc (fm->find_by_name (ly_scm2string (glyph_name))); if (acc.is_empty ()) - me->warning (_f ("accidental `%s' not found", font_char)); + me->warning (_ ("alteration not found")); else { SCM what = scm_caar (s); - int pos = alteration_pos (what, alteration, c0p); + + SCM proc = ly_lily_module_constant ("key-signature-interface::alteration-position"); + + int pos = scm_to_int (scm_call_3 (proc, what, scm_cdar (s), c0s)); acc.translate_axis (pos * inter, Y_AXIS); /* @@ -133,7 +92,7 @@ Key_signature_interface::print (SCM smob) needed to prevent collisions. */ Real padding = 0.0; - if (alteration == 0 + if (is_cancellation && last_pos < pos + 2 && last_pos > pos - 6) padding = 0.3; @@ -148,6 +107,11 @@ Key_signature_interface::print (SCM smob) return mol.smobbed_copy (); } -ADD_INTERFACE (Key_signature_interface, "key-signature-interface", +ADD_INTERFACE (Key_signature_interface, "A group of accidentals, to be printed as signature sign.", - "style c0-position alteration-alist"); + + "alteration-alist " + "c0-position " + "glyph-name-alist " + "style " + );