SCM_VALIDATE_REST_ARGUMENT (args);
SCM expr = SCM_EOL;
- SCM *tail = &expr;
+ SCM cs = ly_symbol2scm ("combine-stencil");
+
Box extent;
extent.set_empty ();
SCM_ASSERT_TYPE (s, scm_car (args), SCM_ARGn, __FUNCTION__, "Stencil");
extent.unite (s->extent_box ());
- *tail = scm_cons (s->expr (), SCM_EOL);
- tail = SCM_CDRLOC (*tail);
+ if (scm_is_pair (s->expr ()) && scm_is_eq (cs, s->expr ()))
+ {
+ expr = scm_reverse_x (scm_list_copy (scm_cdr (s->expr ())),
+ expr);
+ }
+ else
+ expr = scm_cons (s->expr (), expr);
+
args = scm_cdr (args);
}
- expr = scm_cons (ly_symbol2scm ("combine-stencil"), expr);
+ expr = scm_cons (cs, scm_reverse_x (expr, SCM_EOL));
return Stencil (extent, expr).smobbed_copy ();
}
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_);
}