+(defmacro defpath (name args &optional relative-p)
+ (flet ((def (name type)
+ `(progn
+ ,(when (eq type 'optimized-double-float)
+ `(declaim (ftype (function (context ,@(loop repeat (length args) collect 'double-float))) ,(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))