2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 1997--2010 Han-Wen Nienhuys <hanwen@xs4all.nl>
6 LilyPond is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
11 LilyPond is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with LilyPond. If not, see <http://www.gnu.org/licenses/>.
20 #include "note-head.hh"
24 #include <algorithm> // min, max
28 #include "directional-element-interface.hh"
29 #include "font-interface.hh"
30 #include "international.hh"
35 internal_print (Grob
*me
, string
*font_char
)
37 SCM style
= me
->get_property ("style");
38 if (!scm_is_symbol (style
))
39 style
= ly_symbol2scm ("default");
41 string suffix
= to_string (min (robust_scm2int (me
->get_property ("duration-log"), 2), 2));
42 if (style
!= ly_symbol2scm ("default"))
44 SCM gn
= me
->get_property ("glyph-name");
45 if (scm_is_string (gn
))
46 suffix
= ly_scm2string (gn
);
49 Font_metric
*fm
= Font_interface::get_default_font (me
);
54 idx_symmetric
= idx_either
= "noteheads.s" + suffix
;
55 Stencil out
= fm
->find_by_name (idx_symmetric
);
58 string prefix
= "noteheads.";
60 Grob
*stem
= unsmob_grob (me
->get_object ("stem"));
61 Direction stem_dir
= stem
? get_grob_direction (stem
) : CENTER
;
63 if (stem_dir
== CENTER
)
64 programming_error ("must have stem dir for note head");
66 idx_directed
= idx_either
=
67 prefix
+ ((stem_dir
== UP
) ? "u" : "d") + suffix
;
68 out
= fm
->find_by_name (idx_directed
);
74 me
->warning (_f ("none of note heads `%s' or `%s' found",
75 idx_symmetric
.c_str (), idx_directed
.c_str ()));
76 out
= Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL
);
79 *font_char
= idx_either
;
85 TODO: make stem X-parent of notehead.
87 MAKE_SCHEME_CALLBACK (Note_head
, stem_x_shift
, 1);
89 Note_head::stem_x_shift (SCM smob
)
91 Grob
*me
= unsmob_grob (smob
);
92 Grob
*stem
= unsmob_grob (me
->get_object ("stem"));
94 (void) stem
->get_property ("positioning-done");
96 return scm_from_int (0);
99 MAKE_SCHEME_CALLBACK (Note_head
, print
, 1);
101 Note_head::print (SCM smob
)
103 Grob
*me
= unsmob_grob (smob
);
106 return internal_print (me
, &idx
).smobbed_copy ();
110 Note_head::stem_attachment_coordinate (Grob
*me
, Axis a
)
112 Offset off
= robust_scm2offset (me
->get_property ("stem-attachment"),
119 Note_head::get_stem_attachment (Font_metric
*fm
, string key
)
123 int k
= fm
->name_to_index (key
);
126 Box b
= fm
->get_indexed_char_dimensions (k
);
127 Offset wxwy
= fm
->attachment_point (key
);
128 for (int i
= X_AXIS
; i
< NO_AXES
; i
++)
135 att
[a
] = (2 * (wxwy
[a
] - v
.center ()) / v
.length ());
143 MAKE_SCHEME_CALLBACK (Note_head
, calc_stem_attachment
, 1);
145 Note_head::calc_stem_attachment (SCM smob
)
147 Grob
*me
= unsmob_grob (smob
);
148 Font_metric
*fm
= Font_interface::get_default_font (me
);
150 internal_print (me
, &key
);
152 return ly_offset2scm (get_stem_attachment (fm
, key
));
156 ADD_INTERFACE (Note_head
,
157 "A note head. There are many possible values for"
158 " @code{style}. For a complete list, see"
159 " @ruser{Note head styles}.",