+(defmacro defpath (name args &optional relative-p)
+ (flet ((def (name type)
+ `(progn
+ ,(when (eq type 'optimized-double-float)
+ `(declaim (inline ,(first name))))
+ (defbinding ,name () nil
+ (cr context)
+ ,@(mapcar #'(lambda (arg) (list arg type)) args)))))
+
+ `(progn
+ ,(def name 'double-float)
+ ,(let ((name (intern (format nil "FAST-~A" name)))
+ (cname (gffi::default-alien-fname name)))
+ (def (list name cname) 'optimized-double-float))
+ ,@(when relative-p
+ (let* ((rel-name (intern (format nil "REL-~A" name)))
+ (fast-rel-name (intern (format nil "FAST-REL-~A" name)))
+ (cname (gffi::default-alien-fname rel-name)))
+ (list
+ (def rel-name 'double-float)
+ (def (list fast-rel-name cname) 'optimized-double-float)))))))
+
+
+(defpath arc (xc yc radius angle1 angle2))
+(defpath arc-negative (xc yc radius angle1 angle2))
+(defpath curve-to (x1 y1 x2 y2 x3 y3) t)
+(defpath line-to (x y) t)
+(defpath move-to (x y) t)
+(defpath rectangle (x y width height))
+
+(defun circle (cr x y radius &optional negative-p)
+ (move-to cr radius 0.0d0)
+ (if negative-p
+ (arc-negative cr x y radius (* pi 2) 0.0d0)
+ (arc cr x y radius 0.0d0 (* pi 2)))
+ (close-path cr))