     }
     
     @inlinable
-    func _offset2(_ signed: Bool, _ _offset_point: (Double) -> Point?, _ range: ClosedRange<Double>, _ limit: Int, _ calback: (ClosedRange<Double>, CubicBezier<Point>) throws -> Void) rethrows {
+    func _offset2(_ signed: Bool, _ _offset_point: (Double) -> (Point, Point)?, _ range: ClosedRange<Double>, _ limit: Int, _ calback: (ClosedRange<Double>, CubicBezier<Point>) throws -> Void) rethrows {
         
         let s = range.lowerBound
         let t = range.upperBound

        
        let t = self._stationary.flatMap { abs(self._curvature($0)) > 0.05 ? [$0, $0 - 0.05, $0 + 0.05] : [$0] }.sorted().filter { !$0.almostZero() && !$0.almostEqual(1) && 0...1 ~= $0 }
        
        func _offset_point(_ t: Double) -> Point? {
            let q = self._direction(t)
            let s = self._length(t)
            let offset = tangent.eval(s / length) - Point(x: s, y: 0)
            return q.almostZero() ? nil : self.eval(t) + offset * SDTransform.rotate(q.phase)
        }
        
        for ((s, t), segment) in zip(zip(CollectionOfOne(0).concat(t), t.appended(1)), self.split(t)) where !s.almostEqual(t) {

extension BezierProtocol where Scalar == Double, Element == Point {
    
    @inlinable
    func _offset(_ signed: Bool, _ _offset_point: (Double) -> (Point, Point)?, _ calback: (ClosedRange<Double>, CubicBezier<Point>) throws -> Void) rethrows {
        
        var s = 0.0
        
