| // CompoundPath to improve performance | 
|   | 
| import Path from './Path'; | 
| import PathProxy from '../core/PathProxy'; | 
|   | 
| export interface CompoundPathShape { | 
|     paths: Path[] | 
| } | 
|   | 
| export default class CompoundPath extends Path { | 
|   | 
|     type = 'compound' | 
|   | 
|     shape: CompoundPathShape | 
|   | 
|     private _updatePathDirty() { | 
|         const paths = this.shape.paths; | 
|         let dirtyPath = this.shapeChanged(); | 
|         for (let i = 0; i < paths.length; i++) { | 
|             // Mark as dirty if any subpath is dirty | 
|             dirtyPath = dirtyPath || paths[i].shapeChanged(); | 
|         } | 
|         if (dirtyPath) { | 
|             this.dirtyShape(); | 
|         } | 
|     } | 
|   | 
|     beforeBrush() { | 
|         this._updatePathDirty(); | 
|         const paths = this.shape.paths || []; | 
|         const scale = this.getGlobalScale(); | 
|         // Update path scale | 
|         for (let i = 0; i < paths.length; i++) { | 
|             if (!paths[i].path) { | 
|                 paths[i].createPathProxy(); | 
|             } | 
|             paths[i].path.setScale(scale[0], scale[1], paths[i].segmentIgnoreThreshold); | 
|         } | 
|     } | 
|   | 
|     buildPath(ctx: PathProxy | CanvasRenderingContext2D, shape: CompoundPathShape) { | 
|         const paths = shape.paths || []; | 
|         for (let i = 0; i < paths.length; i++) { | 
|             paths[i].buildPath(ctx, paths[i].shape, true); | 
|         } | 
|     } | 
|   | 
|     afterBrush() { | 
|         const paths = this.shape.paths || []; | 
|         for (let i = 0; i < paths.length; i++) { | 
|             paths[i].pathUpdated(); | 
|         } | 
|     } | 
|   | 
|     getBoundingRect() { | 
|         this._updatePathDirty.call(this); | 
|         return Path.prototype.getBoundingRect.call(this); | 
|     } | 
| } |