 
 extension Shape {
     
-    @_transparent
-    fileprivate var _identity : Shape {
+    public var identity : Shape {
         if rotate == 0 && scale == 1 && baseTransform == SDTransform.Identity() {
             return self
         }
-        let transform = self.transform
-        if transform == SDTransform.Identity() {
-            return Shape(self.commands)
-        }
-        var _path = Shape()
-        _path.reserveCapacity(self.commands.count)
-        for command in self.commands {
-            switch command {
-            case let .move(point): _path.commands.append(.move(point * transform))
-            case let .line(point): _path.commands.append(.line(point * transform))
-            case let .quad(p1, p2): _path.commands.append(.quad(p1 * transform, p2 * transform))
-            case let .cubic(p1, p2, p3): _path.commands.append(.cubic(p1 * transform, p2 * transform, p3 * transform))
-            case .close: _path.commands.append(.close)
-            }
-        }
-        return _path
-    }
-    
-    public var identity : Shape {
         if cache.identity == nil {
-            cache.identity = _identity
+            let transform = self.transform
+            if transform == SDTransform.Identity() {
+                let _path = Shape(self.commands)
+                _path.cache.originalBoundary = cache.originalBoundary
+                _path.cache.boundary = cache.boundary
+                _path.cache.area = cache.area
+                cache.identity = _path
+            } else {
+                var _path = Shape()
+                _path.reserveCapacity(self.commands.count)
+                for command in self.commands {
+                    switch command {
+                    case let .move(point): _path.commands.append(.move(point * transform))
+                    case let .line(point): _path.commands.append(.line(point * transform))
+                    case let .quad(p1, p2): _path.commands.append(.quad(p1 * transform, p2 * transform))
+                    case let .cubic(p1, p2, p3): _path.commands.append(.cubic(p1 * transform, p2 * transform, p3 * transform))
+                    case .close: _path.commands.append(.close)
+                    }
+                }
+                cache.identity = _path
+            }
         }
         return cache.identity!
     }

            }
        }
    }
    
    public init() {
        self.commands = []

    }
    
    public var boundary : Rect {
        if cache.boundary == nil {
            cache.boundary = identity.originalBoundary
        }
        return cache.boundary!
    }
