X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faccidental.cc;h=ad781baeded6b98f5c16adedb6bb91ef9f2ca7b5;hb=6e227b10eed0ebe522ca7512eb7d2cc1d9561e64;hp=4200f3b88aca3c76a64a14205a32f133cf22c76d;hpb=6251180897739ec2d134f50039cb6a151d054fb5;p=lilypond.git diff --git a/lily/accidental.cc b/lily/accidental.cc index 4200f3b88a..ad781baede 100644 --- a/lily/accidental.cc +++ b/lily/accidental.cc @@ -1,7 +1,17 @@ +/* + accidental.cc -- implement Accidental_interface + + source file of the GNU LilyPond music typesetter + + (c) 2001--2005 Han-Wen Nienhuys +*/ + +#include "accidental-interface.hh" #include "font-interface.hh" #include "item.hh" -#include "molecule.hh" -#include "accidental-interface.hh" +#include "output-def.hh" +#include "pitch.hh" +#include "stencil.hh" /* TODO: insert support for smaller cautionaries, tie-break-reminders. @@ -9,158 +19,231 @@ 'accidentals should go, for a single 'accidental property -- see accidental-placement.cc - */ - - -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 ("accidentals.leftparen"); + Stencil close = Font_interface::get_default_font (me)->find_by_name ("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; } - -MAKE_SCHEME_CALLBACK (Accidental_interface,after_line_breaking,1); +MAKE_SCHEME_CALLBACK (Accidental_interface, after_line_breaking, 1); SCM Accidental_interface::after_line_breaking (SCM smob) { - Grob *me = unsmob_grob (smob); - Grob *tie = unsmob_grob (me->get_grob_property ("tie")); + Grob *me = unsmob_grob (smob); + Grob *tie = unsmob_grob (me->get_object ("tie")); if (tie && !tie->original_) - { - me->suicide (); - } + me->suicide (); return SCM_UNSPECIFIED; } Array -Accidental_interface::accurate_boxes (Grob *a,Grob**common) +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"))) + if (to_boolean (a->get_property ("cautionary"))) { - SCM cstyle = a->get_grob_property ("cautionary-style"); - parens = gh_equal_p (cstyle, ly_symbol2scm ("parentheses")); - + SCM cstyle = a->get_property ("cautionary-style"); + parens = ly_is_equal (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) + SCM accs = a->get_property ("accidentals"); + SCM scm_style = a->get_property ("style"); + if (!scm_is_symbol (scm_style) && !parens && scm_ilength (accs) == 1) { - if (gh_scm2int (gh_car (accs)) == -1) + switch (scm_to_int (scm_car (accs))) { - Box stem = b; - Box bulb = b; - + case 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; + + /* + To prevent vertical alignment for 6ths + */ + stem[Y_AXIS] *= 1.1; + bulb[Y_AXIS][UP] *= .35; + + boxes.push (bulb); + boxes.push (stem); + } + break; + case NATURAL: + { + Box lstem = b; + Box rstem = b; + Box belly = b; + + lstem[Y_AXIS] *= 1.1; + rstem[Y_AXIS] *= 1.1; + + belly[Y_AXIS] *= 0.75; + lstem[X_AXIS][RIGHT] *= .33; + rstem[X_AXIS][LEFT] = rstem[X_AXIS].linear_combination (1.0 / 3.0); + lstem[Y_AXIS][DOWN] = belly[Y_AXIS][DOWN]; + rstem[Y_AXIS][UP] = belly[Y_AXIS][UP]; + boxes.push (belly); + boxes.push (lstem); + boxes.push (rstem); + } + break; /* - we could make the stem thinner, but that places the flats - really close. + TODO: add support for, double flat. */ - 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()) + 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--;) + 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); + boxes[i].translate (o); } - + return boxes; } -MAKE_SCHEME_CALLBACK (Accidental_interface,brew_molecule,1); +/* + * 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"; + } + + if (style == "neomensural") + 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")); + + bool caut = to_boolean (me->get_property ("cautionary")); if (caut) { - SCM cstyle = me->get_grob_property ("cautionary-style"); - parens = gh_equal_p (cstyle, ly_symbol2scm ("parentheses")); - smaller = gh_equal_p (cstyle, ly_symbol2scm ("smaller")); + SCM cstyle = me->get_property ("cautionary-style"); + parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses")); + smaller = ly_is_equal (cstyle, ly_symbol2scm ("smaller")); } - - SCM scm_style = me->get_grob_property ("style"); + + SCM scm_style = me->get_property ("style"); String style; - if (gh_symbol_p (scm_style)) - { - style = ly_scm2string (scm_symbol_to_string (scm_style)); - } + if (scm_is_symbol (scm_style)) + style = ly_symbol2string (scm_style); else - { - /* - preferably no name for the default style. - */ - style = ""; - } - + /* + 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"), - scm_int2num (-1)), SCM_EOL), - ac); - fm = Font_interface::get_font (me, ac); + SCM ac = Font_interface::music_font_alist_chain (me); + /* + TODO: should calc font-size by adding -2 to current font-size + */ + ac = scm_cons (scm_list_1 (scm_cons + (ly_symbol2scm ("font-size"), + scm_from_int (-2))), + ac); + fm = select_font (me->get_layout (), ac); } else fm = Font_interface::get_default_font (me); - Molecule mol; - for (SCM s = me->get_grob_property ("accidentals"); - gh_pair_p (s); s= gh_cdr (s)) + Stencil mol; + for (SCM s = me->get_property ("accidentals"); + scm_is_pair (s); s = scm_cdr (s)) { - SCM entry = gh_car (s); - - - Molecule acc (fm->find_by_name (String ("accidentals-") + - style + - to_string (gh_scm2int(entry)))); - - mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1); + int alteration = scm_to_int (scm_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) - mol = parenthesize (me, mol); + mol = parenthesize (me, mol); - return mol.smobbed_copy(); + return mol.smobbed_copy (); } - - +/* + TODO: should move inside-slur into item? +*/ ADD_INTERFACE (Accidental_interface, "accidental-interface", - "a single accidental", - "cautionary cautionary-style style tie accidentals"); + "a single accidental", + "inside-slur cautionary cautionary-style style tie accidentals");