bool
Stencil::is_empty () const
+/* If only one of X- or Y-extent is empty; such a stencil can be useful
+ * for backspacing, as with \hspace #-2, so we do not consider it empty.
+ */
{
return (expr_ == SCM_EOL
- || dim_[X_AXIS].is_empty ()
- || dim_[Y_AXIS].is_empty ());
+ || (dim_[X_AXIS].is_empty ()
+ && dim_[Y_AXIS].is_empty ()));
}
SCM
void
Stencil::add_stencil (Stencil const &s)
{
- expr_ = scm_list_3 (ly_symbol2scm ("combine-stencil"), s.expr_, expr_);
+ SCM cs = ly_symbol2scm ("combine-stencil");
+ if (scm_is_pair (expr_)
+ && scm_is_eq (cs, scm_car (expr_)))
+ {
+ if (scm_is_pair (s.expr_)
+ && scm_is_eq (cs, scm_car (s.expr_)))
+ expr_ = scm_append (scm_list_2 (s.expr_, scm_cdr (expr_)));
+ else
+ expr_ = scm_cons2 (cs, s.expr_, scm_cdr (expr_));
+ }
+ else
+ {
+ if (scm_is_pair (s.expr_)
+ && scm_is_eq (cs, scm_car (s.expr_)))
+ expr_ = scm_append (scm_list_2 (s.expr_, scm_list_1 (expr_)));
+ else
+ expr_ = scm_list_3 (cs, s.expr_, expr_);
+ }
dim_.unite (s.dim_);
}