X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faccidental.cc;h=8c27bd2b2ee541dd96c0e1e56515327e68f3cd8c;hb=c484fb1da7751d35734194e623cb823b559e190f;hp=80bcc40de5d4eb041b970097412ba4ae685bf79c;hpb=cc24bf365e8b2537508e54f715ea063b72d5da56;p=lilypond.git diff --git a/lily/accidental.cc b/lily/accidental.cc index 80bcc40de5..8c27bd2b2e 100644 --- a/lily/accidental.cc +++ b/lily/accidental.cc @@ -1,6 +1,15 @@ +/* + accidental.cc -- implement Accidental_interface + + (c) 2001--2004 Han-Wen Nienhuys + + */ #include "font-interface.hh" #include "item.hh" -#include "molecule.hh" +#include "stencil.hh" +#include "accidental-interface.hh" +#include "paper-def.hh" +#include "pitch.hh" /* TODO: insert support for smaller cautionaries, tie-break-reminders. @@ -10,21 +19,15 @@ accidental-placement.cc */ -class Accidental_interface -{ -public: - DECLARE_SCHEME_CALLBACK (brew_molecule, (SCM)); - DECLARE_SCHEME_CALLBACK (after_line_breaking, (SCM)); - static bool has_interface (Grob*); -}; - -Molecule -parenthesize (Grob*me, Molecule m) + + +Stencil +parenthesize (Grob*me, Stencil m) { - Molecule open = Font_interface::get_default_font (me)->find_by_name (String ("accidentals-leftparen")); - Molecule close = Font_interface::get_default_font (me)->find_by_name (String ("accidentals-rightparen")); - m.add_at_edge (X_AXIS, LEFT, Molecule (open), 0); - m.add_at_edge (X_AXIS, RIGHT, Molecule (close), 0); + Stencil open = Font_interface::get_default_font (me)->find_by_name (String ("accidentals-leftparen")); + Stencil close = Font_interface::get_default_font (me)->find_by_name (String ("accidentals-rightparen")); + m.add_at_edge (X_AXIS, LEFT, Stencil (open), 0,0); + m.add_at_edge (X_AXIS, RIGHT, Stencil (close), 0,0); return m; } @@ -37,21 +40,132 @@ Accidental_interface::after_line_breaking (SCM smob) Grob *me = unsmob_grob (smob); Grob *tie = unsmob_grob (me->get_grob_property ("tie")); - if (tie && !tie->original_l_) + if (tie && !tie->original_) { me->suicide (); } return SCM_UNSPECIFIED; } + +Array +Accidental_interface::accurate_boxes (Grob *a,Grob**common) +{ + Box b; + b[X_AXIS] = a->extent (a, X_AXIS); + b[Y_AXIS] = a->extent (a, Y_AXIS); + + Array boxes; + + bool parens = false; + if (to_boolean (a->get_grob_property ("cautionary"))) + { + SCM cstyle = a->get_grob_property ("cautionary-style"); + parens = gh_equal_p (cstyle, ly_symbol2scm ("parentheses")); + + } + + SCM accs = a->get_grob_property ("accidentals"); + SCM scm_style = a->get_grob_property ("style"); + if (!gh_symbol_p (scm_style) + && !parens + && scm_ilength (accs) == 1) + { + if (gh_scm2int (gh_car (accs)) == FLAT) + { + Box stem = b; + Box bulb = b; + + /* + we could make the stem thinner, but that places the flats + really close. + */ + stem[X_AXIS][RIGHT] *= .5; + bulb[Y_AXIS][UP] *= .35; + + boxes.push (bulb); + boxes.push (stem); + } + + /* + TODO: add support for natural, double flat. + */ + } + + if (!boxes.size()) + boxes.push (b); + + Offset o (a->relative_coordinate (common[X_AXIS], X_AXIS), + a->relative_coordinate (common[Y_AXIS], Y_AXIS)); + for(int i = boxes.size(); i--;) + { + boxes[i].translate(o); + } + + return boxes; +} + +/* + * Some styles do not provide all flavours of accidentals, e.g. there + * is currently no sharp accidental in vaticana style. In these cases + * this function falls back to one of the other styles. + */ + +/* + todo: this sort of stuff in Scheme. --hwn. + */ +String +Accidental_interface::get_fontcharname (String style, int alteration) +{ + if (alteration == DOUBLE_FLAT + || alteration == DOUBLE_SHARP) + { + return to_string (alteration); + } + + if (style == "hufnagel") + switch (alteration) + { + case FLAT: return "hufnagel-1"; + case 0: return "vaticana0"; + case SHARP: return "mensural1"; + } + if (style == "medicaea") + switch (alteration) + { + case FLAT: return "medicaea-1"; + case 0: return "vaticana0"; + case SHARP: return "mensural1"; + } + if (style == "vaticana") + switch (alteration) + { + case FLAT: return "vaticana-1"; + case 0: return "vaticana0"; + case SHARP: return "mensural1"; + } + if (style == "mensural") + switch (alteration) + { + case FLAT: return "mensural-1"; + case 0: return "vaticana0"; + case SHARP: return "mensural1"; + } -MAKE_SCHEME_CALLBACK (Accidental_interface,brew_molecule,1); + if (style == "neo_mensural") + style = ""; // currently same as default + if (style == "default") + style = ""; + return style + to_string (alteration); +} + +MAKE_SCHEME_CALLBACK (Accidental_interface,print,1); SCM -Accidental_interface::brew_molecule (SCM smob) +Accidental_interface::print (SCM smob) { Grob *me = unsmob_grob (smob); bool smaller = false; bool parens = false; - + bool caut = to_boolean (me->get_grob_property ("cautionary")); if (caut) { @@ -59,47 +173,50 @@ Accidental_interface::brew_molecule (SCM smob) parens = gh_equal_p (cstyle, ly_symbol2scm ("parentheses")); smaller = gh_equal_p (cstyle, ly_symbol2scm ("smaller")); } - + 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 { /* preferably no name for the default style. - */ + */ style = ""; } - Font_metric *fm = 0; if (smaller) { SCM ac = Font_interface::font_alist_chain (me); ac = gh_cons (gh_cons (gh_cons (ly_symbol2scm ("font-relative-size"), - gh_int2scm (-1)), SCM_EOL), + scm_int2num (-1)), SCM_EOL), ac); - fm = Font_interface::get_font (me, ac); + fm = select_font (me->get_paper (), ac); } else fm = Font_interface::get_default_font (me); - Molecule mol; + Stencil mol; for (SCM s = me->get_grob_property ("accidentals"); - gh_pair_p (s); s= gh_cdr (s)) + gh_pair_p (s); s = gh_cdr (s)) { - SCM entry = gh_car (s); - - - Molecule acc (fm->find_by_name (String ("accidentals-") + - style + - to_str (gh_scm2int(entry)))); - - mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1); + int alteration = gh_scm2int (gh_car (s)); + String font_char = get_fontcharname (style, alteration); + Stencil acc (fm->find_by_name ("accidentals-" + font_char)); + + if (acc.is_empty ()) + { + me->warning (_f ("accidental `%s' not found", font_char)); + } + else + { + mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1,0); + } } if (parens) @@ -110,6 +227,6 @@ Accidental_interface::brew_molecule (SCM smob) -ADD_INTERFACE(Accidental_interface, "accidental-interface", +ADD_INTERFACE (Accidental_interface, "accidental-interface", "a single accidental", - "style tie accidentals"); + "cautionary cautionary-style style tie accidentals");