| import { devicePixelRatio } from '../config.js'; | 
| import * as util from '../core/util.js'; | 
| import Layer from './Layer.js'; | 
| import requestAnimationFrame from '../animation/requestAnimationFrame.js'; | 
| import env from '../core/env.js'; | 
| import { brush, brushSingle } from './graphic.js'; | 
| import { REDRAW_BIT } from '../graphic/constants.js'; | 
| import { getSize } from './helper.js'; | 
| var HOVER_LAYER_ZLEVEL = 1e5; | 
| var CANVAS_ZLEVEL = 314159; | 
| var EL_AFTER_INCREMENTAL_INC = 0.01; | 
| var INCREMENTAL_INC = 0.001; | 
| function isLayerValid(layer) { | 
|     if (!layer) { | 
|         return false; | 
|     } | 
|     if (layer.__builtin__) { | 
|         return true; | 
|     } | 
|     if (typeof (layer.resize) !== 'function' | 
|         || typeof (layer.refresh) !== 'function') { | 
|         return false; | 
|     } | 
|     return true; | 
| } | 
| function createRoot(width, height) { | 
|     var domRoot = document.createElement('div'); | 
|     domRoot.style.cssText = [ | 
|         'position:relative', | 
|         'width:' + width + 'px', | 
|         'height:' + height + 'px', | 
|         'padding:0', | 
|         'margin:0', | 
|         'border-width:0' | 
|     ].join(';') + ';'; | 
|     return domRoot; | 
| } | 
| var CanvasPainter = (function () { | 
|     function CanvasPainter(root, storage, opts, id) { | 
|         this.type = 'canvas'; | 
|         this._zlevelList = []; | 
|         this._prevDisplayList = []; | 
|         this._layers = {}; | 
|         this._layerConfig = {}; | 
|         this._needsManuallyCompositing = false; | 
|         this.type = 'canvas'; | 
|         var singleCanvas = !root.nodeName | 
|             || root.nodeName.toUpperCase() === 'CANVAS'; | 
|         this._opts = opts = util.extend({}, opts || {}); | 
|         this.dpr = opts.devicePixelRatio || devicePixelRatio; | 
|         this._singleCanvas = singleCanvas; | 
|         this.root = root; | 
|         var rootStyle = root.style; | 
|         if (rootStyle) { | 
|             util.disableUserSelect(root); | 
|             root.innerHTML = ''; | 
|         } | 
|         this.storage = storage; | 
|         var zlevelList = this._zlevelList; | 
|         this._prevDisplayList = []; | 
|         var layers = this._layers; | 
|         if (!singleCanvas) { | 
|             this._width = getSize(root, 0, opts); | 
|             this._height = getSize(root, 1, opts); | 
|             var domRoot = this._domRoot = createRoot(this._width, this._height); | 
|             root.appendChild(domRoot); | 
|         } | 
|         else { | 
|             var rootCanvas = root; | 
|             var width = rootCanvas.width; | 
|             var height = rootCanvas.height; | 
|             if (opts.width != null) { | 
|                 width = opts.width; | 
|             } | 
|             if (opts.height != null) { | 
|                 height = opts.height; | 
|             } | 
|             this.dpr = opts.devicePixelRatio || 1; | 
|             rootCanvas.width = width * this.dpr; | 
|             rootCanvas.height = height * this.dpr; | 
|             this._width = width; | 
|             this._height = height; | 
|             var mainLayer = new Layer(rootCanvas, this, this.dpr); | 
|             mainLayer.__builtin__ = true; | 
|             mainLayer.initContext(); | 
|             layers[CANVAS_ZLEVEL] = mainLayer; | 
|             mainLayer.zlevel = CANVAS_ZLEVEL; | 
|             zlevelList.push(CANVAS_ZLEVEL); | 
|             this._domRoot = root; | 
|         } | 
|     } | 
|     CanvasPainter.prototype.getType = function () { | 
|         return 'canvas'; | 
|     }; | 
|     CanvasPainter.prototype.isSingleCanvas = function () { | 
|         return this._singleCanvas; | 
|     }; | 
|     CanvasPainter.prototype.getViewportRoot = function () { | 
|         return this._domRoot; | 
|     }; | 
|     CanvasPainter.prototype.getViewportRootOffset = function () { | 
|         var viewportRoot = this.getViewportRoot(); | 
|         if (viewportRoot) { | 
|             return { | 
|                 offsetLeft: viewportRoot.offsetLeft || 0, | 
|                 offsetTop: viewportRoot.offsetTop || 0 | 
|             }; | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.refresh = function (paintAll) { | 
|         var list = this.storage.getDisplayList(true); | 
|         var prevList = this._prevDisplayList; | 
|         var zlevelList = this._zlevelList; | 
|         this._redrawId = Math.random(); | 
|         this._paintList(list, prevList, paintAll, this._redrawId); | 
|         for (var i = 0; i < zlevelList.length; i++) { | 
|             var z = zlevelList[i]; | 
|             var layer = this._layers[z]; | 
|             if (!layer.__builtin__ && layer.refresh) { | 
|                 var clearColor = i === 0 ? this._backgroundColor : null; | 
|                 layer.refresh(clearColor); | 
|             } | 
|         } | 
|         if (this._opts.useDirtyRect) { | 
|             this._prevDisplayList = list.slice(); | 
|         } | 
|         return this; | 
|     }; | 
|     CanvasPainter.prototype.refreshHover = function () { | 
|         this._paintHoverList(this.storage.getDisplayList(false)); | 
|     }; | 
|     CanvasPainter.prototype._paintHoverList = function (list) { | 
|         var len = list.length; | 
|         var hoverLayer = this._hoverlayer; | 
|         hoverLayer && hoverLayer.clear(); | 
|         if (!len) { | 
|             return; | 
|         } | 
|         var scope = { | 
|             inHover: true, | 
|             viewWidth: this._width, | 
|             viewHeight: this._height | 
|         }; | 
|         var ctx; | 
|         for (var i = 0; i < len; i++) { | 
|             var el = list[i]; | 
|             if (el.__inHover) { | 
|                 if (!hoverLayer) { | 
|                     hoverLayer = this._hoverlayer = this.getLayer(HOVER_LAYER_ZLEVEL); | 
|                 } | 
|                 if (!ctx) { | 
|                     ctx = hoverLayer.ctx; | 
|                     ctx.save(); | 
|                 } | 
|                 brush(ctx, el, scope, i === len - 1); | 
|             } | 
|         } | 
|         if (ctx) { | 
|             ctx.restore(); | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.getHoverLayer = function () { | 
|         return this.getLayer(HOVER_LAYER_ZLEVEL); | 
|     }; | 
|     CanvasPainter.prototype.paintOne = function (ctx, el) { | 
|         brushSingle(ctx, el); | 
|     }; | 
|     CanvasPainter.prototype._paintList = function (list, prevList, paintAll, redrawId) { | 
|         if (this._redrawId !== redrawId) { | 
|             return; | 
|         } | 
|         paintAll = paintAll || false; | 
|         this._updateLayerStatus(list); | 
|         var _a = this._doPaintList(list, prevList, paintAll), finished = _a.finished, needsRefreshHover = _a.needsRefreshHover; | 
|         if (this._needsManuallyCompositing) { | 
|             this._compositeManually(); | 
|         } | 
|         if (needsRefreshHover) { | 
|             this._paintHoverList(list); | 
|         } | 
|         if (!finished) { | 
|             var self_1 = this; | 
|             requestAnimationFrame(function () { | 
|                 self_1._paintList(list, prevList, paintAll, redrawId); | 
|             }); | 
|         } | 
|         else { | 
|             this.eachLayer(function (layer) { | 
|                 layer.afterBrush && layer.afterBrush(); | 
|             }); | 
|         } | 
|     }; | 
|     CanvasPainter.prototype._compositeManually = function () { | 
|         var ctx = this.getLayer(CANVAS_ZLEVEL).ctx; | 
|         var width = this._domRoot.width; | 
|         var height = this._domRoot.height; | 
|         ctx.clearRect(0, 0, width, height); | 
|         this.eachBuiltinLayer(function (layer) { | 
|             if (layer.virtual) { | 
|                 ctx.drawImage(layer.dom, 0, 0, width, height); | 
|             } | 
|         }); | 
|     }; | 
|     CanvasPainter.prototype._doPaintList = function (list, prevList, paintAll) { | 
|         var _this = this; | 
|         var layerList = []; | 
|         var useDirtyRect = this._opts.useDirtyRect; | 
|         for (var zi = 0; zi < this._zlevelList.length; zi++) { | 
|             var zlevel = this._zlevelList[zi]; | 
|             var layer = this._layers[zlevel]; | 
|             if (layer.__builtin__ | 
|                 && layer !== this._hoverlayer | 
|                 && (layer.__dirty || paintAll)) { | 
|                 layerList.push(layer); | 
|             } | 
|         } | 
|         var finished = true; | 
|         var needsRefreshHover = false; | 
|         var _loop_1 = function (k) { | 
|             var layer = layerList[k]; | 
|             var ctx = layer.ctx; | 
|             var repaintRects = useDirtyRect | 
|                 && layer.createRepaintRects(list, prevList, this_1._width, this_1._height); | 
|             var start = paintAll ? layer.__startIndex : layer.__drawIndex; | 
|             var useTimer = !paintAll && layer.incremental && Date.now; | 
|             var startTime = useTimer && Date.now(); | 
|             var clearColor = layer.zlevel === this_1._zlevelList[0] | 
|                 ? this_1._backgroundColor : null; | 
|             if (layer.__startIndex === layer.__endIndex) { | 
|                 layer.clear(false, clearColor, repaintRects); | 
|             } | 
|             else if (start === layer.__startIndex) { | 
|                 var firstEl = list[start]; | 
|                 if (!firstEl.incremental || !firstEl.notClear || paintAll) { | 
|                     layer.clear(false, clearColor, repaintRects); | 
|                 } | 
|             } | 
|             if (start === -1) { | 
|                 console.error('For some unknown reason. drawIndex is -1'); | 
|                 start = layer.__startIndex; | 
|             } | 
|             var i; | 
|             var repaint = function (repaintRect) { | 
|                 var scope = { | 
|                     inHover: false, | 
|                     allClipped: false, | 
|                     prevEl: null, | 
|                     viewWidth: _this._width, | 
|                     viewHeight: _this._height | 
|                 }; | 
|                 for (i = start; i < layer.__endIndex; i++) { | 
|                     var el = list[i]; | 
|                     if (el.__inHover) { | 
|                         needsRefreshHover = true; | 
|                     } | 
|                     _this._doPaintEl(el, layer, useDirtyRect, repaintRect, scope, i === layer.__endIndex - 1); | 
|                     if (useTimer) { | 
|                         var dTime = Date.now() - startTime; | 
|                         if (dTime > 15) { | 
|                             break; | 
|                         } | 
|                     } | 
|                 } | 
|                 if (scope.prevElClipPaths) { | 
|                     ctx.restore(); | 
|                 } | 
|             }; | 
|             if (repaintRects) { | 
|                 if (repaintRects.length === 0) { | 
|                     i = layer.__endIndex; | 
|                 } | 
|                 else { | 
|                     var dpr = this_1.dpr; | 
|                     for (var r = 0; r < repaintRects.length; ++r) { | 
|                         var rect = repaintRects[r]; | 
|                         ctx.save(); | 
|                         ctx.beginPath(); | 
|                         ctx.rect(rect.x * dpr, rect.y * dpr, rect.width * dpr, rect.height * dpr); | 
|                         ctx.clip(); | 
|                         repaint(rect); | 
|                         ctx.restore(); | 
|                     } | 
|                 } | 
|             } | 
|             else { | 
|                 ctx.save(); | 
|                 repaint(); | 
|                 ctx.restore(); | 
|             } | 
|             layer.__drawIndex = i; | 
|             if (layer.__drawIndex < layer.__endIndex) { | 
|                 finished = false; | 
|             } | 
|         }; | 
|         var this_1 = this; | 
|         for (var k = 0; k < layerList.length; k++) { | 
|             _loop_1(k); | 
|         } | 
|         if (env.wxa) { | 
|             util.each(this._layers, function (layer) { | 
|                 if (layer && layer.ctx && layer.ctx.draw) { | 
|                     layer.ctx.draw(); | 
|                 } | 
|             }); | 
|         } | 
|         return { | 
|             finished: finished, | 
|             needsRefreshHover: needsRefreshHover | 
|         }; | 
|     }; | 
|     CanvasPainter.prototype._doPaintEl = function (el, currentLayer, useDirtyRect, repaintRect, scope, isLast) { | 
|         var ctx = currentLayer.ctx; | 
|         if (useDirtyRect) { | 
|             var paintRect = el.getPaintRect(); | 
|             if (!repaintRect || paintRect && paintRect.intersect(repaintRect)) { | 
|                 brush(ctx, el, scope, isLast); | 
|                 el.setPrevPaintRect(paintRect); | 
|             } | 
|         } | 
|         else { | 
|             brush(ctx, el, scope, isLast); | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.getLayer = function (zlevel, virtual) { | 
|         if (this._singleCanvas && !this._needsManuallyCompositing) { | 
|             zlevel = CANVAS_ZLEVEL; | 
|         } | 
|         var layer = this._layers[zlevel]; | 
|         if (!layer) { | 
|             layer = new Layer('zr_' + zlevel, this, this.dpr); | 
|             layer.zlevel = zlevel; | 
|             layer.__builtin__ = true; | 
|             if (this._layerConfig[zlevel]) { | 
|                 util.merge(layer, this._layerConfig[zlevel], true); | 
|             } | 
|             else if (this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC]) { | 
|                 util.merge(layer, this._layerConfig[zlevel - EL_AFTER_INCREMENTAL_INC], true); | 
|             } | 
|             if (virtual) { | 
|                 layer.virtual = virtual; | 
|             } | 
|             this.insertLayer(zlevel, layer); | 
|             layer.initContext(); | 
|         } | 
|         return layer; | 
|     }; | 
|     CanvasPainter.prototype.insertLayer = function (zlevel, layer) { | 
|         var layersMap = this._layers; | 
|         var zlevelList = this._zlevelList; | 
|         var len = zlevelList.length; | 
|         var domRoot = this._domRoot; | 
|         var prevLayer = null; | 
|         var i = -1; | 
|         if (layersMap[zlevel]) { | 
|             if (process.env.NODE_ENV !== 'production') { | 
|                 util.logError('ZLevel ' + zlevel + ' has been used already'); | 
|             } | 
|             return; | 
|         } | 
|         if (!isLayerValid(layer)) { | 
|             if (process.env.NODE_ENV !== 'production') { | 
|                 util.logError('Layer of zlevel ' + zlevel + ' is not valid'); | 
|             } | 
|             return; | 
|         } | 
|         if (len > 0 && zlevel > zlevelList[0]) { | 
|             for (i = 0; i < len - 1; i++) { | 
|                 if (zlevelList[i] < zlevel | 
|                     && zlevelList[i + 1] > zlevel) { | 
|                     break; | 
|                 } | 
|             } | 
|             prevLayer = layersMap[zlevelList[i]]; | 
|         } | 
|         zlevelList.splice(i + 1, 0, zlevel); | 
|         layersMap[zlevel] = layer; | 
|         if (!layer.virtual) { | 
|             if (prevLayer) { | 
|                 var prevDom = prevLayer.dom; | 
|                 if (prevDom.nextSibling) { | 
|                     domRoot.insertBefore(layer.dom, prevDom.nextSibling); | 
|                 } | 
|                 else { | 
|                     domRoot.appendChild(layer.dom); | 
|                 } | 
|             } | 
|             else { | 
|                 if (domRoot.firstChild) { | 
|                     domRoot.insertBefore(layer.dom, domRoot.firstChild); | 
|                 } | 
|                 else { | 
|                     domRoot.appendChild(layer.dom); | 
|                 } | 
|             } | 
|         } | 
|         layer.__painter = this; | 
|     }; | 
|     CanvasPainter.prototype.eachLayer = function (cb, context) { | 
|         var zlevelList = this._zlevelList; | 
|         for (var i = 0; i < zlevelList.length; i++) { | 
|             var z = zlevelList[i]; | 
|             cb.call(context, this._layers[z], z); | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.eachBuiltinLayer = function (cb, context) { | 
|         var zlevelList = this._zlevelList; | 
|         for (var i = 0; i < zlevelList.length; i++) { | 
|             var z = zlevelList[i]; | 
|             var layer = this._layers[z]; | 
|             if (layer.__builtin__) { | 
|                 cb.call(context, layer, z); | 
|             } | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.eachOtherLayer = function (cb, context) { | 
|         var zlevelList = this._zlevelList; | 
|         for (var i = 0; i < zlevelList.length; i++) { | 
|             var z = zlevelList[i]; | 
|             var layer = this._layers[z]; | 
|             if (!layer.__builtin__) { | 
|                 cb.call(context, layer, z); | 
|             } | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.getLayers = function () { | 
|         return this._layers; | 
|     }; | 
|     CanvasPainter.prototype._updateLayerStatus = function (list) { | 
|         this.eachBuiltinLayer(function (layer, z) { | 
|             layer.__dirty = layer.__used = false; | 
|         }); | 
|         function updatePrevLayer(idx) { | 
|             if (prevLayer) { | 
|                 if (prevLayer.__endIndex !== idx) { | 
|                     prevLayer.__dirty = true; | 
|                 } | 
|                 prevLayer.__endIndex = idx; | 
|             } | 
|         } | 
|         if (this._singleCanvas) { | 
|             for (var i_1 = 1; i_1 < list.length; i_1++) { | 
|                 var el = list[i_1]; | 
|                 if (el.zlevel !== list[i_1 - 1].zlevel || el.incremental) { | 
|                     this._needsManuallyCompositing = true; | 
|                     break; | 
|                 } | 
|             } | 
|         } | 
|         var prevLayer = null; | 
|         var incrementalLayerCount = 0; | 
|         var prevZlevel; | 
|         var i; | 
|         for (i = 0; i < list.length; i++) { | 
|             var el = list[i]; | 
|             var zlevel = el.zlevel; | 
|             var layer = void 0; | 
|             if (prevZlevel !== zlevel) { | 
|                 prevZlevel = zlevel; | 
|                 incrementalLayerCount = 0; | 
|             } | 
|             if (el.incremental) { | 
|                 layer = this.getLayer(zlevel + INCREMENTAL_INC, this._needsManuallyCompositing); | 
|                 layer.incremental = true; | 
|                 incrementalLayerCount = 1; | 
|             } | 
|             else { | 
|                 layer = this.getLayer(zlevel + (incrementalLayerCount > 0 ? EL_AFTER_INCREMENTAL_INC : 0), this._needsManuallyCompositing); | 
|             } | 
|             if (!layer.__builtin__) { | 
|                 util.logError('ZLevel ' + zlevel + ' has been used by unkown layer ' + layer.id); | 
|             } | 
|             if (layer !== prevLayer) { | 
|                 layer.__used = true; | 
|                 if (layer.__startIndex !== i) { | 
|                     layer.__dirty = true; | 
|                 } | 
|                 layer.__startIndex = i; | 
|                 if (!layer.incremental) { | 
|                     layer.__drawIndex = i; | 
|                 } | 
|                 else { | 
|                     layer.__drawIndex = -1; | 
|                 } | 
|                 updatePrevLayer(i); | 
|                 prevLayer = layer; | 
|             } | 
|             if ((el.__dirty & REDRAW_BIT) && !el.__inHover) { | 
|                 layer.__dirty = true; | 
|                 if (layer.incremental && layer.__drawIndex < 0) { | 
|                     layer.__drawIndex = i; | 
|                 } | 
|             } | 
|         } | 
|         updatePrevLayer(i); | 
|         this.eachBuiltinLayer(function (layer, z) { | 
|             if (!layer.__used && layer.getElementCount() > 0) { | 
|                 layer.__dirty = true; | 
|                 layer.__startIndex = layer.__endIndex = layer.__drawIndex = 0; | 
|             } | 
|             if (layer.__dirty && layer.__drawIndex < 0) { | 
|                 layer.__drawIndex = layer.__startIndex; | 
|             } | 
|         }); | 
|     }; | 
|     CanvasPainter.prototype.clear = function () { | 
|         this.eachBuiltinLayer(this._clearLayer); | 
|         return this; | 
|     }; | 
|     CanvasPainter.prototype._clearLayer = function (layer) { | 
|         layer.clear(); | 
|     }; | 
|     CanvasPainter.prototype.setBackgroundColor = function (backgroundColor) { | 
|         this._backgroundColor = backgroundColor; | 
|         util.each(this._layers, function (layer) { | 
|             layer.setUnpainted(); | 
|         }); | 
|     }; | 
|     CanvasPainter.prototype.configLayer = function (zlevel, config) { | 
|         if (config) { | 
|             var layerConfig = this._layerConfig; | 
|             if (!layerConfig[zlevel]) { | 
|                 layerConfig[zlevel] = config; | 
|             } | 
|             else { | 
|                 util.merge(layerConfig[zlevel], config, true); | 
|             } | 
|             for (var i = 0; i < this._zlevelList.length; i++) { | 
|                 var _zlevel = this._zlevelList[i]; | 
|                 if (_zlevel === zlevel || _zlevel === zlevel + EL_AFTER_INCREMENTAL_INC) { | 
|                     var layer = this._layers[_zlevel]; | 
|                     util.merge(layer, layerConfig[zlevel], true); | 
|                 } | 
|             } | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.delLayer = function (zlevel) { | 
|         var layers = this._layers; | 
|         var zlevelList = this._zlevelList; | 
|         var layer = layers[zlevel]; | 
|         if (!layer) { | 
|             return; | 
|         } | 
|         layer.dom.parentNode.removeChild(layer.dom); | 
|         delete layers[zlevel]; | 
|         zlevelList.splice(util.indexOf(zlevelList, zlevel), 1); | 
|     }; | 
|     CanvasPainter.prototype.resize = function (width, height) { | 
|         if (!this._domRoot.style) { | 
|             if (width == null || height == null) { | 
|                 return; | 
|             } | 
|             this._width = width; | 
|             this._height = height; | 
|             this.getLayer(CANVAS_ZLEVEL).resize(width, height); | 
|         } | 
|         else { | 
|             var domRoot = this._domRoot; | 
|             domRoot.style.display = 'none'; | 
|             var opts = this._opts; | 
|             var root = this.root; | 
|             width != null && (opts.width = width); | 
|             height != null && (opts.height = height); | 
|             width = getSize(root, 0, opts); | 
|             height = getSize(root, 1, opts); | 
|             domRoot.style.display = ''; | 
|             if (this._width !== width || height !== this._height) { | 
|                 domRoot.style.width = width + 'px'; | 
|                 domRoot.style.height = height + 'px'; | 
|                 for (var id in this._layers) { | 
|                     if (this._layers.hasOwnProperty(id)) { | 
|                         this._layers[id].resize(width, height); | 
|                     } | 
|                 } | 
|                 this.refresh(true); | 
|             } | 
|             this._width = width; | 
|             this._height = height; | 
|         } | 
|         return this; | 
|     }; | 
|     CanvasPainter.prototype.clearLayer = function (zlevel) { | 
|         var layer = this._layers[zlevel]; | 
|         if (layer) { | 
|             layer.clear(); | 
|         } | 
|     }; | 
|     CanvasPainter.prototype.dispose = function () { | 
|         this.root.innerHTML = ''; | 
|         this.root = | 
|             this.storage = | 
|                 this._domRoot = | 
|                     this._layers = null; | 
|     }; | 
|     CanvasPainter.prototype.getRenderedCanvas = function (opts) { | 
|         opts = opts || {}; | 
|         if (this._singleCanvas && !this._compositeManually) { | 
|             return this._layers[CANVAS_ZLEVEL].dom; | 
|         } | 
|         var imageLayer = new Layer('image', this, opts.pixelRatio || this.dpr); | 
|         imageLayer.initContext(); | 
|         imageLayer.clear(false, opts.backgroundColor || this._backgroundColor); | 
|         var ctx = imageLayer.ctx; | 
|         if (opts.pixelRatio <= this.dpr) { | 
|             this.refresh(); | 
|             var width_1 = imageLayer.dom.width; | 
|             var height_1 = imageLayer.dom.height; | 
|             this.eachLayer(function (layer) { | 
|                 if (layer.__builtin__) { | 
|                     ctx.drawImage(layer.dom, 0, 0, width_1, height_1); | 
|                 } | 
|                 else if (layer.renderToCanvas) { | 
|                     ctx.save(); | 
|                     layer.renderToCanvas(ctx); | 
|                     ctx.restore(); | 
|                 } | 
|             }); | 
|         } | 
|         else { | 
|             var scope = { | 
|                 inHover: false, | 
|                 viewWidth: this._width, | 
|                 viewHeight: this._height | 
|             }; | 
|             var displayList = this.storage.getDisplayList(true); | 
|             for (var i = 0, len = displayList.length; i < len; i++) { | 
|                 var el = displayList[i]; | 
|                 brush(ctx, el, scope, i === len - 1); | 
|             } | 
|         } | 
|         return imageLayer.dom; | 
|     }; | 
|     CanvasPainter.prototype.getWidth = function () { | 
|         return this._width; | 
|     }; | 
|     CanvasPainter.prototype.getHeight = function () { | 
|         return this._height; | 
|     }; | 
|     return CanvasPainter; | 
| }()); | 
| export default CanvasPainter; | 
| ; |