2 accidental.cc -- implement Accidental_interface
4 source file of the GNU LilyPond music typesetter
6 (c) 2001--2006 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "accidental-interface.hh"
10 #include "font-interface.hh"
11 #include "international.hh"
13 #include "output-def.hh"
18 parenthesize (Grob *me, Stencil m)
21 = Font_interface::get_default_font (me);
23 = font->find_by_name ("accidentals.leftparen");
25 = font->find_by_name ("accidentals.rightparen");
27 m.add_at_edge (X_AXIS, LEFT, Stencil (open), 0, 0);
28 m.add_at_edge (X_AXIS, RIGHT, Stencil (close), 0, 0);
34 Hmm. Need separate callback, or perhaps #'live bool property.
36 MAKE_SCHEME_CALLBACK (Accidental_interface, after_line_breaking, 1);
38 Accidental_interface::after_line_breaking (SCM smob)
40 Grob *me = unsmob_grob (smob);
41 Grob *tie = unsmob_grob (me->get_object ("tie"));
43 if (tie && !tie->original ()
44 && !to_boolean (me->get_property ("forced")))
49 return SCM_UNSPECIFIED;
53 Accidental_interface::accurate_boxes (Grob *me, Grob **common)
56 b[X_AXIS] = me->extent (me, X_AXIS);
57 b[Y_AXIS] = me->extent (me, Y_AXIS);
61 bool parens = to_boolean (me->get_property ("parenthesized"));
63 SCM scm_style = me->get_property ("style");
64 if (!scm_is_symbol (scm_style)
65 && !to_boolean (me->get_property ("restore-first"))
68 Rational alteration = ly_scm2rational (me->get_property ("alteration"));
69 if (alteration == FLAT_ALTERATION)
75 we could make the stem thinner, but that places the flats
78 stem[X_AXIS][RIGHT] *= .5;
81 To prevent vertical alignment for 6ths
84 bulb[Y_AXIS][UP] *= .35;
86 boxes.push_back (bulb);
87 boxes.push_back (stem);
89 else if (alteration == NATURAL_ALTERATION)
98 belly[Y_AXIS] *= 0.75;
99 lstem[X_AXIS][RIGHT] *= .33;
100 rstem[X_AXIS][LEFT] = rstem[X_AXIS].linear_combination (1.0 / 3.0);
101 lstem[Y_AXIS][DOWN] = belly[Y_AXIS][DOWN];
102 rstem[Y_AXIS][UP] = belly[Y_AXIS][UP];
103 boxes.push_back (belly);
104 boxes.push_back (lstem);
105 boxes.push_back (rstem);
108 TODO: add support for, double flat.
115 Offset o (me->relative_coordinate (common[X_AXIS], X_AXIS),
116 me->relative_coordinate (common[Y_AXIS], Y_AXIS));
118 for (vsize i = boxes.size (); i--;)
119 boxes[i].translate (o);
124 MAKE_SCHEME_CALLBACK (Accidental_interface, print, 1);
126 Accidental_interface::print (SCM smob)
128 Grob *me = unsmob_grob (smob);
130 Font_metric *fm = Font_interface::get_default_font (me);
132 SCM alist = me->get_property ("glyph-name-alist");
133 SCM alt = me->get_property ("alteration");
134 SCM glyph_name = ly_assoc_get (alt, alist, SCM_BOOL_F);
136 if (!scm_is_string (glyph_name))
138 me->warning (_f ("Could not find glyph-name for alteration %s",
139 ly_scm2rational (alt).to_string ().c_str ()));
143 Stencil mol (fm->find_by_name (scm_i_string_chars (glyph_name)));
144 if (to_boolean (me->get_property ("restore-first")))
147 this isn't correct for ancient accidentals, but they don't
148 use double flats/sharps anyway.
150 Stencil acc (fm->find_by_name ("accidentals.natural"));
153 me->warning (_ ("natural alteration glyph not found"));
155 mol.add_at_edge (X_AXIS, LEFT, acc, 0.1, 0);
158 if (to_boolean (me->get_property ("parenthesized")))
159 mol = parenthesize (me, mol);
161 return mol.smobbed_copy ();
165 ADD_INTERFACE (Accidental_interface,
166 "a single accidental",