You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
159 lines
5.1 KiB
159 lines
5.1 KiB
1 month ago
|
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;
|