]> git.donarmstrong.com Git - lilypond.git/blobdiff - scm/stencil.scm
Doc: fix calculation of global-staff-size in points (3114)
[lilypond.git] / scm / stencil.scm
index 21d7bb86f9924f697df71b92e7d5cc3553ea53cc..9b0db9a3fd4617e1ac786cfe95e077910a567473 100644 (file)
 ;;;; You should have received a copy of the GNU General Public License
 ;;;; along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.
 
+(define (make-bezier-sandwich-stencil coords thick xext yext)
+  (let* ((command-list `(moveto
+                         ,(car (list-ref coords 3))
+                         ,(cdr (list-ref coords 3))
+                         curveto
+                         ,(car (list-ref coords 0))
+                         ,(cdr (list-ref coords 0))
+                         ,(car (list-ref coords 1))
+                         ,(cdr (list-ref coords 1))
+                         ,(car (list-ref coords 2))
+                         ,(cdr (list-ref coords 2))
+                         curveto
+                         ,(car (list-ref coords 4))
+                         ,(cdr (list-ref coords 4))
+                         ,(car (list-ref coords 5))
+                         ,(cdr (list-ref coords 5))
+                         ,(car (list-ref coords 6))
+                         ,(cdr (list-ref coords 6))
+                         closepath)))
+  (ly:make-stencil
+    `(path ,thick `(,@' ,command-list) 'round 'round #t)
+    xext
+    yext)))
+
 (define-public (stack-stencils axis dir padding stils)
   "Stack stencils @var{stils} in direction @var{axis}, @var{dir}, using
 @var{padding}."
@@ -128,26 +152,25 @@ the more angular the shape of the parenthesis."
         (lower-inner-control-point
          (cons inner-control-x lower-control-y)))
 
-    (ly:make-stencil
-     (list 'bezier-sandwich
-          `(quote ,(list
-                    ;; Step 4: curve through inner control points
-                    ;; to lower end point.
-                    upper-inner-control-point
-                    lower-inner-control-point
-                    lower-end-point
-                    ;; Step 3: move to upper end point.
-                    upper-end-point
-                    ;; Step 2: curve through outer control points
-                    ;; to upper end point.
-                    lower-outer-control-point
-                    upper-outer-control-point
-                    upper-end-point
-                    ;; Step 1: move to lower end point.
-                    lower-end-point))
-          line-width)
-     (interval-widen x-extent (/ line-width 2))
-     (interval-widen y-extent (/ line-width 2)))))
+    (make-bezier-sandwich-stencil
+      (list
+            ;; Step 4: curve through inner control points
+            ;; to lower end point.
+            upper-inner-control-point
+            lower-inner-control-point
+            lower-end-point
+            ;; Step 3: move to upper end point.
+            upper-end-point
+            ;; Step 2: curve through outer control points
+            ;; to upper end point.
+            lower-outer-control-point
+            upper-outer-control-point
+            upper-end-point
+            ;; Step 1: move to lower end point.
+            lower-end-point)
+      line-width
+      (interval-widen x-extent (/ line-width 2))
+      (interval-widen y-extent (/ line-width 2)))))
 
 (define-public (parenthesize-stencil
                stencil half-thickness width angularity padding)
@@ -301,55 +324,55 @@ defined by @code{fill}."
       (cons (min-max-crawler min cddr possible-extrema)
             (min-max-crawler max cddr possible-extrema)))))
 
-(define (path-min-max origin pointlist)
+(define (line-part-min-max x1 x2)
+  (list (min x1 x2) (max x1 x2)))
+
+(define (bezier-part-min-max x1 x2 x3 x4)
+  ((lambda (x) (list (reduce min 10000 x) (reduce max -10000 x)))
+    (map
+      (lambda (x)
+        (+ (* x1 (expt (- 1 x) 3))
+           (+ (* 3 (* x2 (* (expt (- 1 x) 2) x)))
+              (+ (* 3 (* x3 (* (- 1 x) (expt x 2))))
+                 (* x4 (expt x 3))))))
+      (if (< (+ (expt x2 2) (+ (expt x3 2) (* x1 x4)))
+             (+ (* x1 x3) (+ (* x2 x4) (* x2 x3))))
+          (list 0.0 1.0)
+          (filter
+            (lambda (x) (and (>= x 0) (<= x 1)))
+            (append
+              (list 0.0 1.0)
+              (map (lambda (op)
+                     (if (not (eqv? 0.0
+                                    (exact->inexact (- (+ x1 (* 3 x3)) (+ x4 (* 3 x2))))))
+                         ;; Zeros of the bezier curve
+                         (/ (+ (- x1 (* 2 x2))
+                               (op x3
+                                   (sqrt (- (+ (expt x2 2)
+                                               (+ (expt x3 2) (* x1 x4)))
+                                            (+ (* x1 x3)
+                                               (+ (* x2 x4) (* x2 x3)))))))
+                            (- (+ x1 (* 3 x3)) (+ x4 (* 3 x2))))
+                         ;; Apply L'hopital's rule to get the zeros if 0/0
+                         (* (op 0 1)
+                            (/ (/ (- x4 x3) 2)
+                               (sqrt (- (+ (* x2 x2)
+                                           (+ (* x3 x3) (* x1 x4)))
+                                        (+ (* x1 x3)
+                                           (+ (* x2 x4) (* x2 x3)))))))))
+                   (list + -))))))))
+
+(define (bezier-min-max x1 y1 x2 y2 x3 y3 x4 y4)
+  (map (lambda (x)
+         (apply bezier-part-min-max x))
+       `((,x1 ,x2 ,x3 ,x4) (,y1 ,y2 ,y3 ,y4))))
+
+(define (line-min-max x1 y1 x2 y2)
+  (map (lambda (x)
+         (apply line-part-min-max x))
+       `((,x1 ,x2) (,y1 ,y2))))
 
-  (define (line-part-min-max x1 x2)
-    (list (min x1 x2) (max x1 x2)))
-
-  (define (bezier-part-min-max x1 x2 x3 x4)
-    ((lambda (x) (list (reduce min 10000 x) (reduce max -10000 x)))
-      (map
-       (lambda (x)
-         (+ (* x1 (expt (- 1 x) 3))
-            (+ (* 3 (* x2 (* (expt (- 1 x) 2) x)))
-               (+ (* 3 (* x3 (* (- 1 x) (expt x 2))))
-                  (* x4 (expt x 3))))))
-       (if (< (+ (expt x2 2) (+ (expt x3 2) (* x1 x4)))
-              (+ (* x1 x3) (+ (* x2 x4) (* x2 x3))))
-           (list 0.0 1.0)
-           (filter
-             (lambda (x) (and (>= x 0) (<= x 1)))
-             (append
-               (list 0.0 1.0)
-               (map (lambda (op)
-                      (if (not (eqv? 0.0
-                                     (- (+ x1 (* 3 x3)) (+ x4 (* 3 x2)))))
-                          ;; Zeros of the bezier curve
-                          (/ (+ (- x1 (* 2 x2))
-                                (op x3
-                                    (sqrt (- (+ (expt x2 2)
-                                                (+ (expt x3 2) (* x1 x4)))
-                                             (+ (* x1 x3)
-                                                (+ (* x2 x4) (* x2 x3)))))))
-                             (- (+ x1 (* 3 x3)) (+ x4 (* 3 x2))))
-                          ;; Apply L'hopital's rule to get the zeros if 0/0
-                          (* (op 0 1)
-                             (/ (/ (- x4 x3) 2)
-                                (sqrt (- (+ (* x2 x2)
-                                            (+ (* x3 x3) (* x1 x4)))
-                                         (+ (* x1 x3)
-                                            (+ (* x2 x4) (* x2 x3)))))))))
-                    (list + -))))))))
-
-  (define (bezier-min-max x1 y1 x2 y2 x3 y3 x4 y4)
-    (map (lambda (x)
-          (apply bezier-part-min-max x))
-        `((,x1 ,x2 ,x3 ,x4) (,y1 ,y2 ,y3 ,y4))))
-
-  (define (line-min-max x1 y1 x2 y2)
-    (map (lambda (x)
-          (apply line-part-min-max x))
-        `((,x1 ,x2) (,y1 ,y2))))
+(define (path-min-max origin pointlist)
 
   ((lambda (x)
      (list