| import type { ZRenderType } from '../zrender'; | 
| import type CanvasPainter from '../canvas/Painter'; | 
| import type BoundingRect from '../core/BoundingRect'; | 
| import { extend } from '../core/util'; | 
|   | 
| class DebugRect { | 
|   | 
|     dom: HTMLDivElement | 
|   | 
|     private _hideTimeout: number | 
|   | 
|     constructor(style: Opts['style']) { | 
|         const dom = this.dom = document.createElement('div'); | 
|         dom.className = 'ec-debug-dirty-rect'; | 
|   | 
|         style = extend({}, style); | 
|         extend(style, { | 
|             backgroundColor: 'rgba(0, 0, 255, 0.2)', | 
|             border: '1px solid #00f' | 
|         }); | 
|         dom.style.cssText = ` | 
| position: absolute; | 
| opacity: 0; | 
| transition: opacity 0.5s linear; | 
| pointer-events: none; | 
| `; | 
|   | 
|         for (let key in style) { | 
|             if (style.hasOwnProperty(key)) { | 
|                 (dom.style as any)[key] = (style as any)[key]; | 
|             } | 
|         } | 
|     } | 
|   | 
|     update(rect: BoundingRect) { | 
|         const domStyle = this.dom.style; | 
|         domStyle.width = rect.width + 'px'; | 
|         domStyle.height = rect.height + 'px'; | 
|         domStyle.left = rect.x + 'px'; | 
|         domStyle.top = rect.y + 'px'; | 
|     } | 
|   | 
|     hide() { | 
|         this.dom.style.opacity = '0'; | 
|     } | 
|     show(autoHideDelay?: number) { | 
|         clearTimeout(this._hideTimeout); | 
|   | 
|         this.dom.style.opacity = '1'; | 
|   | 
|         // Auto hide after 2 second | 
|         this._hideTimeout = setTimeout(() => { | 
|             this.hide(); | 
|         }, autoHideDelay || 1000) as unknown as number; | 
|     } | 
|   | 
| } | 
|   | 
| interface Opts { | 
|     style?: { | 
|         backgroundColor?: string | 
|         color?: string | 
|     } | 
|   | 
|     autoHideDelay?: number | 
| } | 
|   | 
| export default function showDebugDirtyRect(zr: ZRenderType, opts?: Opts) { | 
|     opts = opts || {}; | 
|     const painter = zr.painter as CanvasPainter; | 
|     if (!painter.getLayers) { | 
|         throw new Error('Debug dirty rect can only been used on canvas renderer.'); | 
|     } | 
|     if (painter.isSingleCanvas()) { | 
|         throw new Error('Debug dirty rect can only been used on zrender inited with container.'); | 
|     } | 
|     const debugViewRoot = document.createElement('div'); | 
|     debugViewRoot.style.cssText = ` | 
| position:absolute; | 
| left:0; | 
| top:0; | 
| right:0; | 
| bottom:0; | 
| pointer-events:none; | 
| `; | 
|     debugViewRoot.className = 'ec-debug-dirty-rect-container'; | 
|   | 
|     const debugRects: DebugRect[] = []; | 
|     const dom = zr.dom; | 
|     dom.appendChild(debugViewRoot); | 
|     const computedStyle = getComputedStyle(dom); | 
|     if (computedStyle.position === 'static') { | 
|         dom.style.position = 'relative'; | 
|     } | 
|   | 
|     zr.on('rendered', function () { | 
|         if (painter.getLayers) { | 
|             let idx = 0; | 
|             painter.eachBuiltinLayer((layer) => { | 
|                 if (!layer.debugGetPaintRects) { | 
|                     return; | 
|                 } | 
|                 const paintRects = layer.debugGetPaintRects(); | 
|                 for (let i = 0; i < paintRects.length; i++) { | 
|                     if (!paintRects[i].width || !paintRects[i].height) { | 
|                         continue; | 
|                     } | 
|   | 
|                     if (!debugRects[idx]) { | 
|                         debugRects[idx] = new DebugRect(opts.style); | 
|                         debugViewRoot.appendChild(debugRects[idx].dom); | 
|                     } | 
|                     debugRects[idx].show(opts.autoHideDelay); | 
|                     debugRects[idx].update(paintRects[i]); | 
|                     idx++; | 
|                 } | 
|             }); | 
|             for (let i = idx; i < debugRects.length; i++) { | 
|                 debugRects[i].hide(); | 
|             } | 
|         } | 
|     }); | 
| } |