X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=lily%2Faccidental.cc;h=0557883267e56497f28304e3b66813576d185eff;hb=0971c8ef97eb8077e4bcd89f954a66e0cb3dcdab;hp=a0f4136a4594a709c3f6e0f7e3183b9426364e78;hpb=5d1ddaf889233f8e5c32a118f9e843e1becca2d2;p=lilypond.git diff --git a/lily/accidental.cc b/lily/accidental.cc index a0f4136a45..0557883267 100644 --- a/lily/accidental.cc +++ b/lily/accidental.cc @@ -2,31 +2,34 @@ accidental.cc -- implement Accidental_interface source file of the GNU LilyPond music typesetter - - (c) 2001--2005 Han-Wen Nienhuys + + (c) 2001--2006 Han-Wen Nienhuys */ +#include "accidental-interface.hh" #include "font-interface.hh" +#include "international.hh" #include "item.hh" -#include "stencil.hh" -#include "accidental-interface.hh" #include "output-def.hh" #include "pitch.hh" +#include "stencil.hh" /* - TODO: insert support for smaller cautionaries, tie-break-reminders. Either here or in new-accidental-engraver. 'accidentals should go, for a single 'accidental property -- see accidental-placement.cc - */ Stencil -parenthesize (Grob*me, Stencil m) +parenthesize (Grob *me, Stencil m) { - 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"); + Font_metric * font + = Font_interface::get_default_font (me); + Stencil open + = font->find_by_name ("accidentals.leftparen"); + Stencil close + = font->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); @@ -34,35 +37,39 @@ parenthesize (Grob*me, Stencil m) return m; } - +/* + Hmm. Need separate callback, or perhaps #'live bool property. + */ 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_property ("tie")); + Grob *me = unsmob_grob (smob); + Grob *tie = unsmob_grob (me->get_object ("tie")); - if (tie && !tie->original_) + if (tie && !tie->original () + && !to_boolean (me->get_property ("forced"))) { me->suicide (); } + return SCM_UNSPECIFIED; } -Array -Accidental_interface::accurate_boxes (Grob *a, Grob**common) +vector +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; - + vector boxes; + bool parens = false; if (to_boolean (a->get_property ("cautionary"))) { SCM cstyle = a->get_property ("cautionary-style"); - parens = ly_c_equal_p (cstyle, ly_symbol2scm ("parentheses")); + parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses")); } SCM accs = a->get_property ("accidentals"); @@ -71,42 +78,62 @@ Accidental_interface::accurate_boxes (Grob *a, Grob**common) && !parens && scm_ilength (accs) == 1) { - if (scm_to_int (scm_car (accs)) == FLAT) + 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; + /* + 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; + /* + To prevent vertical alignment for 6ths + */ + stem[Y_AXIS] *= 1.1; + bulb[Y_AXIS][UP] *= .35; + + boxes.push_back (bulb); + boxes.push_back (stem); + } + break; + case NATURAL: + { + Box lstem = b; + Box rstem = b; + Box belly = b; + + lstem[Y_AXIS] *= 1.1; + rstem[Y_AXIS] *= 1.1; - boxes.push (bulb); - boxes.push (stem); + 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_back (belly); + boxes.push_back (lstem); + boxes.push_back (rstem); + } + break; + /* + TODO: add support for, double flat. + */ } - - /* - TODO: add support for natural, double flat. - */ } if (!boxes.size ()) - boxes.push (b); + boxes.push_back (b); + + Offset o (a->relative_coordinate (common[X_AXIS], X_AXIS), + a->relative_coordinate (common[Y_AXIS], Y_AXIS)); + for (vsize i = boxes.size (); i--;) + boxes[i].translate (o); - 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; } @@ -118,16 +145,14 @@ Accidental_interface::accurate_boxes (Grob *a, Grob**common) /* todo: this sort of stuff in Scheme. --hwn. - */ -String -Accidental_interface::get_fontcharname (String style, int alteration) +*/ +string +Accidental_interface::get_fontcharname (string style, int alteration) { if (alteration == DOUBLE_FLAT || alteration == DOUBLE_SHARP) - { - return to_string (alteration); - } - + return to_string (alteration); + if (style == "hufnagel") switch (alteration) { @@ -156,7 +181,7 @@ Accidental_interface::get_fontcharname (String style, int alteration) case 0: return "vaticana0"; case SHARP: return "mensural1"; } - + if (style == "neomensural") style = ""; // currently same as default if (style == "default") @@ -172,27 +197,23 @@ Accidental_interface::print (SCM smob) bool smaller = false; bool parens = false; - bool caut = to_boolean (me->get_property ("cautionary")); + bool caut = to_boolean (me->get_property ("cautionary")); if (caut) { SCM cstyle = me->get_property ("cautionary-style"); - parens = ly_c_equal_p (cstyle, ly_symbol2scm ("parentheses")); - smaller = ly_c_equal_p (cstyle, ly_symbol2scm ("smaller")); + parens = ly_is_equal (cstyle, ly_symbol2scm ("parentheses")); + smaller = ly_is_equal (cstyle, ly_symbol2scm ("smaller")); } SCM scm_style = me->get_property ("style"); - String style; + string style; if (scm_is_symbol (scm_style)) - { - style = ly_symbol2string (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) @@ -203,9 +224,9 @@ Accidental_interface::print (SCM smob) */ ac = scm_cons (scm_list_1 (scm_cons (ly_symbol2scm ("font-size"), - scm_int2num (-2))), + scm_from_int (-2))), ac); - fm = select_font (me->get_layout (), ac); + fm = select_font (me->layout (), ac); } else fm = Font_interface::get_default_font (me); @@ -215,30 +236,31 @@ Accidental_interface::print (SCM smob) scm_is_pair (s); s = scm_cdr (s)) { int alteration = scm_to_int (scm_car (s)); - String font_char = get_fontcharname (style, alteration); + 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)); - } + me->warning (_f ("accidental `%s' not found", font_char)); else - { - mol.add_at_edge (X_AXIS, RIGHT, acc, 0.1, 0); - } + 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 (); } - /* - TODO: should move inside-slur into item? - - */ + TODO: should move avoid-slur into item? +*/ ADD_INTERFACE (Accidental_interface, "accidental-interface", - "a single accidental", - "inside-slur cautionary cautionary-style style tie accidentals"); + "a single accidental", + "accidentals " + "avoid-slur " + "cautionary " + "cautionary-style " + "forced " + "style " + "tie " + );