source file of the GNU LilyPond music typesetter
- (c) 1997--2007 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ (c) 1997--2008 Han-Wen Nienhuys <hanwen@xs4all.nl>
*/
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);
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);
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);
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);
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);
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);
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)
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);
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);
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);
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),
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, x, 3);
LY_ASSERT_TYPE (scm_is_number, y, 4);
Real a = scm_to_double (angle);
Real x_off = scm_to_double (x);
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, 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_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);
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);