import * as util from './core/util.js'; 
 | 
import timsort from './core/timsort.js'; 
 | 
import { REDRAW_BIT } from './graphic/constants.js'; 
 | 
var invalidZErrorLogged = false; 
 | 
function logInvalidZError() { 
 | 
    if (invalidZErrorLogged) { 
 | 
        return; 
 | 
    } 
 | 
    invalidZErrorLogged = true; 
 | 
    console.warn('z / z2 / zlevel of displayable is invalid, which may cause unexpected errors'); 
 | 
} 
 | 
function shapeCompareFunc(a, b) { 
 | 
    if (a.zlevel === b.zlevel) { 
 | 
        if (a.z === b.z) { 
 | 
            return a.z2 - b.z2; 
 | 
        } 
 | 
        return a.z - b.z; 
 | 
    } 
 | 
    return a.zlevel - b.zlevel; 
 | 
} 
 | 
var Storage = (function () { 
 | 
    function Storage() { 
 | 
        this._roots = []; 
 | 
        this._displayList = []; 
 | 
        this._displayListLen = 0; 
 | 
        this.displayableSortFunc = shapeCompareFunc; 
 | 
    } 
 | 
    Storage.prototype.traverse = function (cb, context) { 
 | 
        for (var i = 0; i < this._roots.length; i++) { 
 | 
            this._roots[i].traverse(cb, context); 
 | 
        } 
 | 
    }; 
 | 
    Storage.prototype.getDisplayList = function (update, includeIgnore) { 
 | 
        includeIgnore = includeIgnore || false; 
 | 
        var displayList = this._displayList; 
 | 
        if (update || !displayList.length) { 
 | 
            this.updateDisplayList(includeIgnore); 
 | 
        } 
 | 
        return displayList; 
 | 
    }; 
 | 
    Storage.prototype.updateDisplayList = function (includeIgnore) { 
 | 
        this._displayListLen = 0; 
 | 
        var roots = this._roots; 
 | 
        var displayList = this._displayList; 
 | 
        for (var i = 0, len = roots.length; i < len; i++) { 
 | 
            this._updateAndAddDisplayable(roots[i], null, includeIgnore); 
 | 
        } 
 | 
        displayList.length = this._displayListLen; 
 | 
        timsort(displayList, shapeCompareFunc); 
 | 
    }; 
 | 
    Storage.prototype._updateAndAddDisplayable = function (el, clipPaths, includeIgnore) { 
 | 
        if (el.ignore && !includeIgnore) { 
 | 
            return; 
 | 
        } 
 | 
        el.beforeUpdate(); 
 | 
        el.update(); 
 | 
        el.afterUpdate(); 
 | 
        var userSetClipPath = el.getClipPath(); 
 | 
        if (el.ignoreClip) { 
 | 
            clipPaths = null; 
 | 
        } 
 | 
        else if (userSetClipPath) { 
 | 
            if (clipPaths) { 
 | 
                clipPaths = clipPaths.slice(); 
 | 
            } 
 | 
            else { 
 | 
                clipPaths = []; 
 | 
            } 
 | 
            var currentClipPath = userSetClipPath; 
 | 
            var parentClipPath = el; 
 | 
            while (currentClipPath) { 
 | 
                currentClipPath.parent = parentClipPath; 
 | 
                currentClipPath.updateTransform(); 
 | 
                clipPaths.push(currentClipPath); 
 | 
                parentClipPath = currentClipPath; 
 | 
                currentClipPath = currentClipPath.getClipPath(); 
 | 
            } 
 | 
        } 
 | 
        if (el.childrenRef) { 
 | 
            var children = el.childrenRef(); 
 | 
            for (var i = 0; i < children.length; i++) { 
 | 
                var child = children[i]; 
 | 
                if (el.__dirty) { 
 | 
                    child.__dirty |= REDRAW_BIT; 
 | 
                } 
 | 
                this._updateAndAddDisplayable(child, clipPaths, includeIgnore); 
 | 
            } 
 | 
            el.__dirty = 0; 
 | 
        } 
 | 
        else { 
 | 
            var disp = el; 
 | 
            if (clipPaths && clipPaths.length) { 
 | 
                disp.__clipPaths = clipPaths; 
 | 
            } 
 | 
            else if (disp.__clipPaths && disp.__clipPaths.length > 0) { 
 | 
                disp.__clipPaths = []; 
 | 
            } 
 | 
            if (isNaN(disp.z)) { 
 | 
                logInvalidZError(); 
 | 
                disp.z = 0; 
 | 
            } 
 | 
            if (isNaN(disp.z2)) { 
 | 
                logInvalidZError(); 
 | 
                disp.z2 = 0; 
 | 
            } 
 | 
            if (isNaN(disp.zlevel)) { 
 | 
                logInvalidZError(); 
 | 
                disp.zlevel = 0; 
 | 
            } 
 | 
            this._displayList[this._displayListLen++] = disp; 
 | 
        } 
 | 
        var decalEl = el.getDecalElement && el.getDecalElement(); 
 | 
        if (decalEl) { 
 | 
            this._updateAndAddDisplayable(decalEl, clipPaths, includeIgnore); 
 | 
        } 
 | 
        var textGuide = el.getTextGuideLine(); 
 | 
        if (textGuide) { 
 | 
            this._updateAndAddDisplayable(textGuide, clipPaths, includeIgnore); 
 | 
        } 
 | 
        var textEl = el.getTextContent(); 
 | 
        if (textEl) { 
 | 
            this._updateAndAddDisplayable(textEl, clipPaths, includeIgnore); 
 | 
        } 
 | 
    }; 
 | 
    Storage.prototype.addRoot = function (el) { 
 | 
        if (el.__zr && el.__zr.storage === this) { 
 | 
            return; 
 | 
        } 
 | 
        this._roots.push(el); 
 | 
    }; 
 | 
    Storage.prototype.delRoot = function (el) { 
 | 
        if (el instanceof Array) { 
 | 
            for (var i = 0, l = el.length; i < l; i++) { 
 | 
                this.delRoot(el[i]); 
 | 
            } 
 | 
            return; 
 | 
        } 
 | 
        var idx = util.indexOf(this._roots, el); 
 | 
        if (idx >= 0) { 
 | 
            this._roots.splice(idx, 1); 
 | 
        } 
 | 
    }; 
 | 
    Storage.prototype.delAllRoots = function () { 
 | 
        this._roots = []; 
 | 
        this._displayList = []; 
 | 
        this._displayListLen = 0; 
 | 
        return; 
 | 
    }; 
 | 
    Storage.prototype.getRoots = function () { 
 | 
        return this._roots; 
 | 
    }; 
 | 
    Storage.prototype.dispose = function () { 
 | 
        this._displayList = null; 
 | 
        this._roots = null; 
 | 
    }; 
 | 
    return Storage; 
 | 
}()); 
 | 
export default Storage; 
 |