summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Kastrup <dak@gnu.org>2016-08-29 01:14:43 +0200
committerDavid Kastrup <dak@gnu.org>2016-09-05 19:07:09 +0200
commitaca522d3460b83df6a893e9d0cc43378f7e97f6e (patch)
tree46f8d5731e1b0da1a60a6a2fb6a4a086f2d9e16b
parent1cab9ca99b60c249f4f813746e91070dbd745a4f (diff)
Issue 4961/3: Add ly:length, ly:directed, ly:angle
Those are functions working on and/or producing coordinate pairs, usually based on angles expressed in degrees.
-rw-r--r--lily/stencil-scheme.cc72
1 files changed, 72 insertions, 0 deletions
diff --git a/lily/stencil-scheme.cc b/lily/stencil-scheme.cc
index c8d87439d6..5c43189e0b 100644
--- a/lily/stencil-scheme.cc
+++ b/lily/stencil-scheme.cc
@@ -20,9 +20,81 @@
#include "font-metric.hh"
#include "libc-extension.hh"
#include "lookup.hh"
+#include "offset.hh"
#include "stencil.hh"
/*
+ * A few general helpers in degrees
+ */
+
+LY_DEFINE (ly_angle, "ly:angle",
+ 1, 1, 0, (SCM x, SCM y),
+ "Calculates angle in degrees of given vector. With one argument,"
+ " @var{x} is a number pair indicating the vector. With two"
+ " arguments, @var{x} and @var{y} specify the respective coordinates.")
+{
+ Offset off;
+ if (SCM_UNBNDP (y)) {
+ LY_ASSERT_TYPE (is_number_pair, x, 1);
+ off = ly_scm2offset (x);
+ } else {
+ LY_ASSERT_TYPE (scm_is_number, x, 1);
+ LY_ASSERT_TYPE (scm_is_number, y, 2);
+ off = Offset (scm_to_double (x), scm_to_double (y));
+ }
+ return scm_from_double (off.angle_degrees ());
+}
+
+LY_DEFINE (ly_length, "ly:length",
+ 1, 1, 0, (SCM x, SCM y),
+ "Calculates magnitude of given vector. With one argument,"
+ " @var{x} is a number pair indicating the vector. With two"
+ " arguments, @var{x} and @var{y} specify the respective coordinates.")
+{
+ Offset off;
+ if (SCM_UNBNDP (y)) {
+ LY_ASSERT_TYPE (is_number_pair, x, 1);
+ off = ly_scm2offset (x);
+ } else {
+ LY_ASSERT_TYPE (scm_is_number, x, 1);
+ LY_ASSERT_TYPE (scm_is_number, y, 2);
+ off = Offset (scm_to_double (x), scm_to_double (y));
+ }
+ return scm_from_double (off.length ());
+}
+
+LY_DEFINE (ly_directed, "ly:directed",
+ 1, 1, 0, (SCM direction, SCM magnitude),
+ "Calculates an @code{(x . y)} pair with optional @var{magnitude}"
+ " (defaulting to @code{1.0}) and @var{direction} specified either"
+ " as an angle in degrees or a coordinate pair giving the direction. "
+ " If @var{magnitude} is a pair, the respective coordinates are"
+ " scaled independently, useful for ellipse drawings.")
+{
+ Offset res;
+ if (scm_is_pair (direction))
+ {
+ LY_ASSERT_TYPE (is_number_pair, direction, 1);
+ res = ly_scm2offset (direction).direction ();
+ }
+ else
+ {
+ LY_ASSERT_TYPE (scm_is_number, direction, 1);
+ res = offset_directed (scm_to_double (direction));
+ }
+ if (SCM_UNBNDP (magnitude))
+ return ly_offset2scm (res);
+ if (scm_is_pair (magnitude))
+ {
+ LY_ASSERT_TYPE (is_number_pair, magnitude, 2);
+ return ly_offset2scm (res.scale (ly_scm2offset (magnitude)));
+ }
+ LY_ASSERT_TYPE (scm_is_number, magnitude, 2);
+ return ly_offset2scm (scm_to_double (magnitude) * res);
+}
+
+
+/*
TODO: naming add/combine.
*/