]> git.donarmstrong.com Git - lilypond.git/commitdiff
Issue 5043/1: Implement ly:stencil-outline separating ink/metrics
authorDavid Kastrup <dak@gnu.org>
Tue, 24 Jan 2017 20:17:43 +0000 (21:17 +0100)
committerDavid Kastrup <dak@gnu.org>
Mon, 30 Jan 2017 13:14:39 +0000 (14:14 +0100)
lily/include/stencil.hh
lily/stencil-integral.cc
lily/stencil-interpret.cc
lily/stencil-scheme.cc
lily/stencil.cc
scm/define-stencil-commands.scm
scm/stencil.scm

index 8af67c0f766f039184e6ba00500d43044a58a0e7..a55c7f47e4a26bd968220cd8a748e7c35dc1de11 100644 (file)
@@ -90,6 +90,7 @@ public:
   bool is_empty () const;
   bool is_empty (Axis) const;
   Stencil in_color (Real r, Real g, Real b) const;
+  Stencil with_outline (Stencil const &ol) const;
   static SCM skylines_from_stencil (SCM, Real, Axis);
 };
 
index 2a61da23882454b8eda1844816bfacdbdb4cde74..b44258b6b1973c19d117626ba769a232467dd7e4 100644 (file)
@@ -945,6 +945,8 @@ stencil_traverser (PangoMatrix trans, SCM expr)
     return stencil_traverser (trans, scm_cadr (expr));
   else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("output-attributes")))
     return stencil_traverser (trans, scm_caddr (expr));
+  else if (scm_is_eq (scm_car (expr), ly_symbol2scm ("with-outline")))
+    return stencil_traverser (trans, scm_cadr (expr));
   else
     {
       vector<Transform_matrix_and_expression> out;
index 25fad0d8429ef6c327ac2a08b57f959789015827..15f44c0f820efbf6bfc5c87c0fc7bcc4f92bd4e1 100644 (file)
@@ -121,6 +121,10 @@ interpret_stencil_expression (SCM expr,
 
           return;
         }
+      else if (scm_is_eq (head, ly_symbol2scm ("with-outline")))
+        {
+          expr = scm_caddr (expr);
+        }
       else
         {
           (*func) (func_arg,
index 5c43189e0bc713305d51245cee254b97021300d0..da9f0a8214afcdf7d9fc74d8c9691542ad74a7ac 100644 (file)
@@ -555,3 +555,14 @@ LY_DEFINE (ly_stencil_scale, "ly:stencil-scale",
   q->scale (scm_to_double (x), scm_to_double (y));
   return new_s;
 }
+
+LY_DEFINE (ly_stencil_outline, "ly:stencil-outline",
+           2, 0, 0, (SCM stil, SCM outline),
+           "Return a stencil with the stencil expression (inking)"
+           " of stencil @var{stil} but with outline and dimensions"
+           " from stencil @var{outline}.")
+{
+  Stencil s = *LY_ASSERT_SMOB (Stencil, stil, 1);
+  Stencil o = *LY_ASSERT_SMOB (Stencil, outline, 2);
+  return s.with_outline (o).smobbed_copy ();
+}
index 5e568c98dbd8efb38dd963f15a8313a242759b0d..dc5549f6314393a0c3393fd088d62cee50db1b70 100644 (file)
@@ -415,3 +415,13 @@ Stencil::translated (Offset z) const
   s.translate (z);
   return s;
 }
+
+Stencil
+Stencil::with_outline (Stencil const &ol) const
+{
+  Stencil new_stencil (ol.extent_box (),
+                       scm_list_3 (ly_symbol2scm ("with-outline"),
+                                   ol.expr (),
+                                   expr ()));
+  return new_stencil;
+}
index 23c17abb9be42fabe29f8ef9584ced97dd2440d5..a7f762ecfdcc5447be93ef2149ba258d576f99ec 100644 (file)
@@ -68,6 +68,7 @@ are used internally in @file{lily/@/stencil-interpret.cc}."
     scale-stencil
     translate-stencil
     transparent-stencil
+    with-outline
     ))
 
 (for-each ly:register-stencil-expression
index 433bf634d8c21961814c74961612d8088e6a2ccb..f4b5eb8bade977815f06d34d314778eea78b7059 100644 (file)
@@ -1129,6 +1129,9 @@ grestore
          ((eq? head 'color) (interpret (caddr expr)))
          ((eq? head 'rotate-stencil) (interpret (caddr expr)))
          ((eq? head 'translate-stencil) (interpret (caddr expr)))
+         ;; for signatures, we indeed want the _outline_ rather than
+         ;; the expression interpreted.  Right?
+         ((eq? head 'with-outline) (interpret (cadr expr)))
          ((eq? head 'combine-stencil)
           (for-each interpret  (cdr expr)))
          (else