From: David Kastrup Date: Tue, 24 Jan 2017 20:17:43 +0000 (+0100) Subject: Issue 5043/1: Implement ly:stencil-outline separating ink/metrics X-Git-Url: https://git.donarmstrong.com/lilypond.git?a=commitdiff_plain;h=cfbda61ff9743a8c32b2057ede4bc8407172c936;p=lilypond.git Issue 5043/1: Implement ly:stencil-outline separating ink/metrics --- diff --git a/lily/include/stencil.hh b/lily/include/stencil.hh index 8af67c0f76..a55c7f47e4 100644 --- a/lily/include/stencil.hh +++ b/lily/include/stencil.hh @@ -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); }; diff --git a/lily/stencil-integral.cc b/lily/stencil-integral.cc index 2a61da2388..b44258b6b1 100644 --- a/lily/stencil-integral.cc +++ b/lily/stencil-integral.cc @@ -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 out; diff --git a/lily/stencil-interpret.cc b/lily/stencil-interpret.cc index 25fad0d842..15f44c0f82 100644 --- a/lily/stencil-interpret.cc +++ b/lily/stencil-interpret.cc @@ -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, diff --git a/lily/stencil-scheme.cc b/lily/stencil-scheme.cc index 5c43189e0b..da9f0a8214 100644 --- a/lily/stencil-scheme.cc +++ b/lily/stencil-scheme.cc @@ -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 (); +} diff --git a/lily/stencil.cc b/lily/stencil.cc index 5e568c98db..dc5549f631 100644 --- a/lily/stencil.cc +++ b/lily/stencil.cc @@ -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; +} diff --git a/scm/define-stencil-commands.scm b/scm/define-stencil-commands.scm index 23c17abb9b..a7f762ecfd 100644 --- a/scm/define-stencil-commands.scm +++ b/scm/define-stencil-commands.scm @@ -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 diff --git a/scm/stencil.scm b/scm/stencil.scm index 433bf634d8..f4b5eb8bad 100644 --- a/scm/stencil.scm +++ b/scm/stencil.scm @@ -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