2 This file is part of LilyPond, the GNU music typesetter.
4 Copyright (C) 2003--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 "lyric-hyphen.hh"
24 #include "output-def.hh"
25 #include "paper-column.hh"
30 TODO: should extract hyphen dimensions or hyphen glyph from the
34 MAKE_SCHEME_CALLBACK (Lyric_hyphen
, print
, 1);
36 Lyric_hyphen::print (SCM smob
)
38 Spanner
*me
= unsmob_spanner (smob
);
39 Drul_array
<Item
*> bounds (me
->get_bound (LEFT
),
40 me
->get_bound (RIGHT
));
42 if (bounds
[LEFT
]->break_status_dir ()
43 && (Paper_column::when_mom (bounds
[LEFT
])
44 == Paper_column::when_mom (bounds
[RIGHT
]->get_column ())))
47 Grob
*common
= bounds
[LEFT
]->common_refpoint (bounds
[RIGHT
], X_AXIS
);
51 Drul_array
<bool> broken
;
54 Interval iv
= bounds
[d
]->extent (common
, X_AXIS
);
56 span_points
[d
] = iv
.is_empty ()
57 ? bounds
[d
]->relative_coordinate (common
, X_AXIS
)
60 while (flip (&d
) != LEFT
);
62 Real lt
= me
->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
63 Real th
= robust_scm2double (me
->get_property ("thickness"), 1) * lt
;
64 Real font_size_step
= robust_scm2double (me
->get_property ("font-size"), 0.0);
65 Real h
= robust_scm2double (me
->get_property ("height"), 0.5)
66 * pow (2.0, font_size_step
/ 6.0);
70 Real dash_period
= robust_scm2double (me
->get_property ("dash-period"), 1.0);
71 Real dash_length
= robust_scm2double (me
->get_property ("length"), .5);
72 Real padding
= robust_scm2double (me
->get_property ("padding"), 0.1);
74 if (dash_period
< dash_length
)
75 dash_period
= 1.5 * dash_length
;
77 Real l
= span_points
.length ();
79 int n
= int (ceil (l
/ dash_period
- 0.5));
83 if (l
< dash_length
+ 2 * padding
84 && !bounds
[RIGHT
]->break_status_dir ())
86 Real minimum_length
= robust_scm2double (me
->get_property ("minimum-length"), .3);
87 dash_length
= max ((l
- 2 * padding
), minimum_length
);
90 Real space_left
= l
- dash_length
- (n
- 1) * dash_period
;
93 If there is not enough space, the hyphen should disappear, but not
94 at the end of the line.
97 && !bounds
[RIGHT
]->break_status_dir ())
100 space_left
= max (space_left
, 0.0);
102 Box
b (Interval (0, dash_length
), Interval (h
, h
+ th
));
103 Stencil
dash_mol (Lookup::round_filled_box (b
, 0.8 * lt
));
106 for (int i
= 0; i
< n
; i
++)
108 Stencil
m (dash_mol
);
109 m
.translate_axis (span_points
[LEFT
] + i
* dash_period
+ space_left
/ 2, X_AXIS
);
110 total
.add_stencil (m
);
113 total
.translate_axis (-me
->relative_coordinate (common
, X_AXIS
), X_AXIS
);
114 return total
.smobbed_copy ();
117 MAKE_SCHEME_CALLBACK (Lyric_hyphen
, set_spacing_rods
, 1);
119 Lyric_hyphen::set_spacing_rods (SCM smob
)
121 Grob
*me
= unsmob_grob (smob
);
124 Spanner
*sp
= dynamic_cast<Spanner
*> (me
);
126 r
.distance_
= robust_scm2double (me
->get_property ("minimum-distance"), 0);
130 r
.item_drul_
[d
] = sp
->get_bound (d
);
132 r
.distance_
+= -d
* r
.item_drul_
[d
]->extent (r
.item_drul_
[d
], X_AXIS
)[-d
];
134 while (flip (&d
) != LEFT
);
136 if (r
.item_drul_
[LEFT
]
137 && r
.item_drul_
[RIGHT
])
140 return SCM_UNSPECIFIED
;
143 ADD_INTERFACE (Lyric_hyphen
,
144 "A centered hyphen is simply a line between lyrics used to"
145 " divide syllables.",