]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/stencil-scheme.cc
Merge master into nested-bookparts
[lilypond.git] / lily / stencil-scheme.cc
index a603f01b5f5c9b123cbd1638bfb462cd4a1b268e..de39fca5c340ca19e20cfaf14a41e9b4a0d12761 100644 (file)
@@ -18,7 +18,8 @@
 
 LY_DEFINE (ly_stencil_translate_axis, "ly:stencil-translate-axis",
           3, 0, 0, (SCM stil, SCM amount, SCM axis),
-          "Return a copy of @var{stil} but translated by @var{amount} in @var{axis} direction.")
+          "Return a copy of @var{stil} but translated by @var{amount}"
+          " in @var{axis} direction.")
 {
   Stencil *s = unsmob_stencil (stil);
   LY_ASSERT_SMOB (Stencil, stil, 1);
@@ -35,8 +36,8 @@ LY_DEFINE (ly_stencil_translate_axis, "ly:stencil-translate-axis",
 
 LY_DEFINE (ly_stencil_translate, "ly:stencil-translate",
           2, 0, 0, (SCM stil, SCM offset),
-          "Return a @var{stil}, "
-          "but translated by @var{offset} (a pair of numbers).")
+          "Return a @var{stil}, but translated by @var{offset}"
+          " (a pair of numbers).")
 {
   Stencil *s = unsmob_stencil (stil);
   LY_ASSERT_SMOB (Stencil, stil, 1);
@@ -60,8 +61,9 @@ LY_DEFINE (ly_stencil_expr, "ly:stencil-expr",
 
 LY_DEFINE (ly_stencil_extent, "ly:stencil-extent",
           2, 0, 0, (SCM stil, SCM axis),
-          "Return a pair of numbers signifying the extent of @var{stil} in "
-          "@var{axis} direction (0 or 1 for x and y axis respectively).")
+          "Return a pair of numbers signifying the extent of @var{stil} in"
+          " @var{axis} direction (@code{0} or @code{1} for x and"
+          " y@tie{}axis, respectively).")
 {
   Stencil *s = unsmob_stencil (stil);
   LY_ASSERT_SMOB (Stencil, stil, 1);
@@ -72,7 +74,7 @@ LY_DEFINE (ly_stencil_extent, "ly:stencil-extent",
 
 LY_DEFINE (ly_stencil_empty_p, "ly:stencil-empty?",
           1, 0, 0, (SCM stil),
-          "Return whether @var{stil} is empty ")
+          "Return whether @var{stil} is empty.")
 {
   Stencil *s = unsmob_stencil (stil);
   LY_ASSERT_SMOB (Stencil, stil, 1);
@@ -84,13 +86,14 @@ LY_DEFINE (ly_stencil_combine_at_edge, "ly:stencil-combine-at-edge",
                     SCM second,
                     SCM padding,
                     SCM minimum),
-          "Construct a stencil by putting @var{second} next to @var{first}. "
-          "@var{axis} can be 0 (x-axis) or 1 (y-axis), "
-          "@var{direction} can be -1 (left or down) or 1 (right or up). "
-          "The stencils are juxtaposed with  @var{padding} as extra space. "
-          "If this puts the reference points closer than @var{minimum}, "
-          "they are moved by the latter amount."
-          "@var{first} and @var{second} may also be '() or #f.")
+          "Construct a stencil by putting @var{second} next to @var{first}."
+          "  @var{axis} can be 0 (x-axis) or@tie{}1 (y-axis)."
+          "  @var{direction} can be -1 (left or down) or@tie{}1 (right or"
+          "  up).  The stencils are juxtaposed with @var{padding} as extra"
+          " space.  If this puts the reference points closer than"
+          " @var{minimum}, they are moved by the latter amount."
+          "  @var{first} and @var{second} may also be @code{'()} or"
+          " @code{#f}.")
 {
   Stencil *s1 = unsmob_stencil (first);
   Stencil *s2 = unsmob_stencil (second);
@@ -128,7 +131,7 @@ LY_DEFINE (ly_stencil_combine_at_edge, "ly:stencil-combine-at-edge",
 
 LY_DEFINE (ly_stencil_add, "ly:stencil-add",
           0, 0, 1, (SCM args),
-          "Combine stencils. Takes any number of arguments.")
+          "Combine stencils.  Takes any number of arguments.")
 {
 #define FUNC_NAME __FUNCTION__
   SCM_VALIDATE_REST_ARGUMENT (args);
@@ -156,22 +159,19 @@ LY_DEFINE (ly_stencil_add, "ly:stencil-add",
 
 LY_DEFINE (ly_make_stencil, "ly:make-stencil",
           1, 2, 0, (SCM expr, SCM xext, SCM yext),
-          "Stencils are device independent output expressions.  "
-          "They carry two pieces of information:\n"
-
+          "Stencils are device independent output expressions."
+          "  They carry two pieces of information:\n"
+          "\n"
           "@enumerate\n"
-
           "@item\n"
-          "A specification of how to print this object.  "
-          "This specification is processed by the output backends, "
-          "for example @file{scm/output-ps.scm}.\n"
-
+          "A specification of how to print this object."
+          "  This specification is processed by the output backends,"
+          " for example @file{scm/output-ps.scm}.\n"
+          "\n"
           "@item\n"
-          "The vertical and horizontal extents of the object, "
-          "given as pairs.  "
-          "If an extent is unspecified (or if you use "
-          "@code{(1000 . -1000)} as its value), it is taken to be empty.\n"
-
+          "The vertical and horizontal extents of the object, given as"
+          " pairs.  If an extent is unspecified (or if you use"
+          " @code{(1000 . -1000)} as its value), it is taken to be empty.\n"
           "@end enumerate\n")
 {
   SCM_ASSERT_TYPE (!scm_is_pair (expr)
@@ -200,9 +200,9 @@ LY_DEFINE (ly_make_stencil, "ly:make-stencil",
 
 LY_DEFINE (ly_stencil_aligned_to, "ly:stencil-aligned-to",
           3, 0, 0, (SCM stil, SCM axis, SCM dir),
-          "Align @var{stil} using its own extents. "
-          "@var{dir} is a number -1, 1 are left and right respectively. "
-          "Other values are interpolated (so 0 means the center).")
+          "Align @var{stil} using its own extents.  @var{dir} is a number."
+          "  @code{-1} and @code{1} are left and right, respectively."
+          "  Other values are interpolated (so @code{0} means the center).")
 {
   LY_ASSERT_SMOB (Stencil, stil, 1);
   LY_ASSERT_TYPE (is_axis, axis, 2);
@@ -217,7 +217,8 @@ LY_DEFINE (ly_stencil_aligned_to, "ly:stencil-aligned-to",
 
 LY_DEFINE (ly_stencil_fonts, "ly:stencil-fonts",
           1, 0, 0, (SCM s),
-          " Analyse @var{s}, and return a list of fonts used in @var{s}.")
+          "Analyze @var{s}, and return a list of fonts used"
+          " in@tie{}@var{s}.")
 {
   LY_ASSERT_SMOB (Stencil, s, 1);
   Stencil *stil = unsmob_stencil (s);
@@ -250,7 +251,8 @@ void stencil_interpret_in_scm (void *p, SCM expr)
 
 LY_DEFINE (ly_interpret_stencil_expression, "ly:interpret-stencil-expression",
           4, 0, 0, (SCM expr, SCM func, SCM arg1, SCM offset),
-          "Parse EXPR, feed bits to FUNC with first arg ARG1")
+          "Parse @var{expr}, feed bits to @var{func} with first arg"
+          " @var{arg1} having offset @var{offset}.")
 {
   LY_ASSERT_TYPE (ly_is_procedure, func, 2);
 
@@ -267,14 +269,15 @@ LY_DEFINE (ly_interpret_stencil_expression, "ly:interpret-stencil-expression",
 LY_DEFINE (ly_bracket, "ly:bracket",
           4, 0, 0,
           (SCM a, SCM iv, SCM t, SCM p),
-          "Make a bracket in direction @var{a}. The extent of the bracket is "
-          "given by @var{iv}. The wings protude by an amount of @var{p}, which "
-          "may be negative. The thickness is given by @var{t}.")
+          "Make a bracket in direction@tie{}@var{a}.  The extent of the"
+          " bracket is given by @var{iv}.  The wings protrude by an amount"
+          " of@tie{}@var{p}, which may be negative.  The thickness is given"
+          " by@tie{}@var{t}.")
 {
   LY_ASSERT_TYPE (is_axis, a, 1);
   LY_ASSERT_TYPE (is_number_pair, iv, 2);
-  LY_ASSERT_TYPE (scm_is_number, t,3);
-  LY_ASSERT_TYPE (scm_is_number, p,4);
+  LY_ASSERT_TYPE (scm_is_number, t, 3);
+  LY_ASSERT_TYPE (scm_is_number, p, 4);
 
   return Lookup::bracket ((Axis)scm_to_int (a), ly_scm2interval (iv),
                          scm_to_double (t),
@@ -284,12 +287,34 @@ LY_DEFINE (ly_bracket, "ly:bracket",
 
 LY_DEFINE (ly_stencil_rotate, "ly:stencil-rotate",
           4, 0, 0, (SCM stil, SCM angle, SCM x, SCM y),
-          "Return a @var{stil} rotated @var{angle} degrees around point (@var{x}, @var{y}).")
+          "Return a stencil @var{stil} rotated @var{angle} degrees around"
+          " the relative offset (@var{x}, @var{y}). E.g. an offset of"
+          " (-1, 1) will rotate the stencil around the left upper corner.")
+{
+  Stencil *s = unsmob_stencil (stil);
+  LY_ASSERT_SMOB (Stencil, stil, 1);
+  LY_ASSERT_TYPE (scm_is_number, angle, 2);
+  LY_ASSERT_TYPE (scm_is_number, x, 3);
+  LY_ASSERT_TYPE (scm_is_number, y, 4);
+  Real a = scm_to_double (angle);
+  Real x_off = scm_to_double (x);
+  Real y_off = scm_to_double (y);
+
+  SCM new_s = s->smobbed_copy ();
+  Stencil *q = unsmob_stencil (new_s);
+  q->rotate_degrees (a, Offset (x_off, y_off));
+  return new_s;
+}
+
+LY_DEFINE (ly_stencil_rotate_absolute, "ly:stencil-rotate-absolute",
+          4, 0, 0, (SCM stil, SCM angle, SCM x, SCM y),
+          "Return a stencil @var{stil} rotated @var{angle} degrees around"
+          " point (@var{x}, @var{y}), given in absolute coordinates.")
 {
   Stencil *s = unsmob_stencil (stil);
   LY_ASSERT_SMOB (Stencil, stil, 1);
   LY_ASSERT_TYPE (scm_is_number, angle, 2);
-  LY_ASSERT_TYPE (scm_is_number, x,3);
+  LY_ASSERT_TYPE (scm_is_number, x, 3);
   LY_ASSERT_TYPE (scm_is_number, y, 4);
   Real a = scm_to_double (angle);
   Real x_off = scm_to_double (x);
@@ -297,16 +322,15 @@ LY_DEFINE (ly_stencil_rotate, "ly:stencil-rotate",
 
   SCM new_s = s->smobbed_copy ();
   Stencil *q = unsmob_stencil (new_s);
-  q->rotate (a, Offset (x_off, y_off));
+  q->rotate_degrees_absolute (a, Offset (x_off, y_off));
   return new_s;
 }
 
 LY_DEFINE (ly_round_filled_box, "ly:round-filled-box",
           3, 0, 0,
           (SCM xext, SCM yext, SCM blot),
-          "Make a @code{Stencil} "
-          "that prints a black box of dimensions @var{xext}, "
-          "@var{yext} and roundness @var{blot}.")
+          "Make a @code{Stencil} object that prints a black box of"
+          " dimensions @var{xext}, @var{yext} and roundness @var{blot}.")
 {
   LY_ASSERT_TYPE (is_number_pair, xext, 1);
   LY_ASSERT_TYPE (is_number_pair, yext, 2);
@@ -316,10 +340,32 @@ LY_DEFINE (ly_round_filled_box, "ly:round-filled-box",
                                   scm_to_double (blot)).smobbed_copy ();
 }
 
+LY_DEFINE (ly_round_filled_polygon, "ly:round-filled-polygon",
+           2, 0, 0,
+           (SCM points, SCM blot),
+           "Make a @code{Stencil} object that prints a black polygon with "
+           "corners at the points defined by @var{points} (list of coordinate "
+           "pairs) and roundness @var{blot}.")
+{
+  SCM_ASSERT_TYPE (scm_ilength (points) > 0, points, SCM_ARG1, __FUNCTION__, "list of coordinate pairs");
+  LY_ASSERT_TYPE (scm_is_number, blot, 2);
+  vector<Offset> pts;
+  for (SCM p = points; scm_is_pair (p); p = scm_cdr (p))
+    {
+      SCM scm_pt = scm_car (p);
+      if (scm_is_pair (scm_pt)) {
+        pts.push_back (ly_scm2offset (scm_pt));
+      } else {
+        // TODO: Print out warning
+      }
+    }
+  return Lookup::round_filled_polygon (pts, scm_to_double (blot)).smobbed_copy ();
+}
+
 LY_DEFINE (ly_register_stencil_expression, "ly:register-stencil-expression",
           1, 0, 0,
           (SCM symbol),
-          "Add @var{symbol} as head of a stencil expression")
+          "Add @var{symbol} as head of a stencil expression.")
 {
   LY_ASSERT_TYPE (ly_is_symbol, symbol, 1);
   register_stencil_head (symbol);