2 notehead.cc -- implement Note_head
4 source file of the GNU LilyPond music typesetter
6 (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "note-head.hh"
13 #include <algorithm> // min, max
17 #include "directional-element-interface.hh"
18 #include "font-interface.hh"
19 #include "international.hh"
24 internal_print (Grob
*me
, string
*font_char
)
26 SCM style
= me
->get_property ("style");
27 if (!scm_is_symbol (style
))
28 style
= ly_symbol2scm ("default");
30 string suffix
= to_string (min (robust_scm2int (me
->get_property ("duration-log"), 2), 2));
31 if (style
!= ly_symbol2scm ("default"))
33 SCM gn
= me
->get_property ("glyph-name");
34 if (scm_is_string (gn
))
35 suffix
= ly_scm2string (gn
);
38 Font_metric
*fm
= Font_interface::get_default_font (me
);
43 idx_symmetric
= idx_either
= "noteheads.s" + suffix
;
44 Stencil out
= fm
->find_by_name (idx_symmetric
);
47 string prefix
= "noteheads.";
49 Grob
*stem
= unsmob_grob (me
->get_object ("stem"));
50 Direction stem_dir
= stem
? get_grob_direction (stem
) : CENTER
;
52 if (stem_dir
== CENTER
)
53 programming_error ("must have stem dir for note head");
55 idx_directed
= idx_either
=
56 prefix
+ ((stem_dir
== UP
) ? "u" : "d") + suffix
;
57 out
= fm
->find_by_name (idx_directed
);
63 me
->warning (_f ("none of note heads `%s' or `%s' found",
64 idx_symmetric
.c_str (), idx_directed
.c_str ()));
65 out
= Stencil (Box (Interval (0, 0), Interval (0, 0)), SCM_EOL
);
68 *font_char
= idx_either
;
74 TODO: make stem X-parent of notehead.
76 MAKE_SCHEME_CALLBACK (Note_head
, stem_x_shift
, 1);
78 Note_head::stem_x_shift (SCM smob
)
80 Grob
*me
= unsmob_grob (smob
);
81 Grob
*stem
= unsmob_grob (me
->get_object ("stem"));
83 (void) stem
->get_property ("positioning-done");
85 return scm_from_int (0);
88 MAKE_SCHEME_CALLBACK (Note_head
, print
, 1);
90 Note_head::print (SCM smob
)
92 Grob
*me
= unsmob_grob (smob
);
95 return internal_print (me
, &idx
).smobbed_copy ();
99 Note_head::stem_attachment_coordinate (Grob
*me
, Axis a
)
101 Offset off
= robust_scm2offset (me
->get_property ("stem-attachment"),
108 Note_head::get_stem_attachment (Font_metric
*fm
, string key
)
112 int k
= fm
->name_to_index (key
);
115 Box b
= fm
->get_indexed_char (k
);
116 Offset wxwy
= fm
->attachment_point (key
);
117 for (int i
= X_AXIS
; i
< NO_AXES
; i
++)
124 att
[a
] = (2 * (wxwy
[a
] - v
.center ()) / v
.length ());
132 MAKE_SCHEME_CALLBACK (Note_head
, calc_stem_attachment
, 1);
134 Note_head::calc_stem_attachment (SCM smob
)
136 Grob
*me
= unsmob_grob (smob
);
137 Font_metric
*fm
= Font_interface::get_default_font (me
);
139 internal_print (me
, &key
);
141 return ly_offset2scm (get_stem_attachment (fm
, key
));
145 ADD_INTERFACE (Note_head
,