]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/stencil.cc
Merge branch 'master' into translation
[lilypond.git] / lily / stencil.cc
index a488c598137106339e3dc12951ce5ae6ff520a01..0a7f40205d610ef16d331675657132752ecf0403 100644 (file)
@@ -66,10 +66,13 @@ Stencil::extent (Axis a) const
 
 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
@@ -202,7 +205,24 @@ Stencil::scale (Real x, Real y)
 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_);
 }