2 hyphen-spanner.cc -- implement Lyric_hyphen
4 source file of the GNU LilyPond music typesetter
6 (c) 2003--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
9 #include "lyric-hyphen.hh"
13 #include "output-def.hh"
14 #include "paper-column.hh"
19 TODO: should extract hyphen dimensions or hyphen glyph from the
23 MAKE_SCHEME_CALLBACK (Lyric_hyphen
, print
, 1);
25 Lyric_hyphen::print (SCM smob
)
27 Spanner
*me
= unsmob_spanner (smob
);
28 Drul_array
<Item
*> bounds (me
->get_bound (LEFT
),
29 me
->get_bound (RIGHT
));
31 if (bounds
[LEFT
]->break_status_dir ()
32 && (Paper_column::when_mom (bounds
[LEFT
])
33 == Paper_column::when_mom (bounds
[RIGHT
]->get_column ())))
36 Grob
*common
= bounds
[LEFT
]->common_refpoint (bounds
[RIGHT
], X_AXIS
);
40 Drul_array
<bool> broken
;
43 Interval iv
= bounds
[d
]->extent (common
, X_AXIS
);
45 span_points
[d
] = iv
.is_empty ()
46 ? bounds
[d
]->relative_coordinate (common
, X_AXIS
)
49 while (flip (&d
) != LEFT
);
51 Real lt
= me
->layout ()->get_dimension (ly_symbol2scm ("line-thickness"));
52 Real th
= robust_scm2double (me
->get_property ("thickness"), 1) * lt
;
53 Real font_size_step
= robust_scm2double (me
->get_property ("font-size"), 0.0);
54 Real h
= robust_scm2double (me
->get_property ("height"), 0.5)
55 * pow (2.0, font_size_step
/ 6.0);
59 Real dash_period
= robust_scm2double (me
->get_property ("dash-period"), 1.0);
60 Real dash_length
= robust_scm2double (me
->get_property ("length"), .5);
61 Real padding
= robust_scm2double (me
->get_property ("padding"), 0.1);
63 if (dash_period
< dash_length
)
64 dash_period
= 1.5 * dash_length
;
66 Real l
= span_points
.length ();
68 int n
= int (ceil (l
/ dash_period
- 0.5));
72 if (l
< dash_length
+ 2 * padding
73 && !bounds
[RIGHT
]->break_status_dir ())
75 Real minimum_length
= robust_scm2double (me
->get_property ("minimum-length"), .3);
76 dash_length
= max ((l
- 2 * padding
), minimum_length
);
79 Real space_left
= l
- dash_length
- (n
- 1) * dash_period
;
82 If there is not enough space, the hyphen should disappear, but not
83 at the end of the line.
86 && !bounds
[RIGHT
]->break_status_dir ())
89 space_left
= max (space_left
, 0.0);
91 Box
b (Interval (0, dash_length
), Interval (h
, h
+ th
));
92 Stencil
dash_mol (Lookup::round_filled_box (b
, 0.8 * lt
));
95 for (int i
= 0; i
< n
; i
++)
98 m
.translate_axis (span_points
[LEFT
] + i
* dash_period
+ space_left
/ 2, X_AXIS
);
99 total
.add_stencil (m
);
102 total
.translate_axis (-me
->relative_coordinate (common
, X_AXIS
), X_AXIS
);
103 return total
.smobbed_copy ();
106 MAKE_SCHEME_CALLBACK (Lyric_hyphen
, set_spacing_rods
, 1);
108 Lyric_hyphen::set_spacing_rods (SCM smob
)
110 Grob
*me
= unsmob_grob (smob
);
113 Spanner
*sp
= dynamic_cast<Spanner
*> (me
);
115 r
.distance_
= robust_scm2double (me
->get_property ("minimum-distance"), 0);
119 r
.item_drul_
[d
] = sp
->get_bound (d
);
121 r
.distance_
+= -d
* r
.item_drul_
[d
]->extent (r
.item_drul_
[d
], X_AXIS
)[-d
];
123 while (flip (&d
) != LEFT
);
125 if (r
.item_drul_
[LEFT
]
126 && r
.item_drul_
[RIGHT
])
129 return SCM_UNSPECIFIED
;
132 ADD_INTERFACE (Lyric_hyphen
,
134 "A centered hyphen is a simple line between "
135 "lyrics used to divide syllables",