import { __extends } from "tslib"; import Definable from './Definable.js'; import * as zrUtil from '../../core/util.js'; import { path } from '../graphic.js'; import { isClipPathChanged } from '../../canvas/helper.js'; import { getClipPathsKey, getIdURL } from '../../svg/helper.js'; import { createElement } from '../../svg/core.js'; export function hasClipPath(displayable) { var clipPaths = displayable.__clipPaths; return clipPaths && clipPaths.length > 0; } var ClippathManager = (function (_super) { __extends(ClippathManager, _super); function ClippathManager(zrId, svgRoot) { var _this = _super.call(this, zrId, svgRoot, 'clipPath', '__clippath_in_use__') || this; _this._refGroups = {}; _this._keyDuplicateCount = {}; return _this; } ClippathManager.prototype.markAllUnused = function () { _super.prototype.markAllUnused.call(this); var refGroups = this._refGroups; for (var key in refGroups) { if (refGroups.hasOwnProperty(key)) { this.markDomUnused(refGroups[key]); } } this._keyDuplicateCount = {}; }; ClippathManager.prototype._getClipPathGroup = function (displayable, prevDisplayable) { if (!hasClipPath(displayable)) { return; } var clipPaths = displayable.__clipPaths; var keyDuplicateCount = this._keyDuplicateCount; var clipPathKey = getClipPathsKey(clipPaths); if (isClipPathChanged(clipPaths, prevDisplayable && prevDisplayable.__clipPaths)) { keyDuplicateCount[clipPathKey] = keyDuplicateCount[clipPathKey] || 0; keyDuplicateCount[clipPathKey] && (clipPathKey += '-' + keyDuplicateCount[clipPathKey]); keyDuplicateCount[clipPathKey]++; } return this._refGroups[clipPathKey] || (this._refGroups[clipPathKey] = createElement('g')); }; ClippathManager.prototype.update = function (displayable, prevDisplayable) { var clipGroup = this._getClipPathGroup(displayable, prevDisplayable); if (clipGroup) { this.markDomUsed(clipGroup); this.updateDom(clipGroup, displayable.__clipPaths); } return clipGroup; }; ; ClippathManager.prototype.updateDom = function (parentEl, clipPaths) { if (clipPaths && clipPaths.length > 0) { var defs = this.getDefs(true); var clipPath = clipPaths[0]; var clipPathEl = void 0; var id = void 0; if (clipPath._dom) { id = clipPath._dom.getAttribute('id'); clipPathEl = clipPath._dom; if (!defs.contains(clipPathEl)) { defs.appendChild(clipPathEl); } } else { id = 'zr' + this._zrId + '-clip-' + this.nextId; ++this.nextId; clipPathEl = createElement('clipPath'); clipPathEl.setAttribute('id', id); defs.appendChild(clipPathEl); clipPath._dom = clipPathEl; } path.brush(clipPath); var pathEl = this.getSvgElement(clipPath); clipPathEl.innerHTML = ''; clipPathEl.appendChild(pathEl); parentEl.setAttribute('clip-path', getIdURL(id)); if (clipPaths.length > 1) { this.updateDom(clipPathEl, clipPaths.slice(1)); } } else { if (parentEl) { parentEl.setAttribute('clip-path', 'none'); } } }; ; ClippathManager.prototype.markUsed = function (displayable) { var _this = this; if (displayable.__clipPaths) { zrUtil.each(displayable.__clipPaths, function (clipPath) { if (clipPath._dom) { _super.prototype.markDomUsed.call(_this, clipPath._dom); } }); } }; ; ClippathManager.prototype.removeUnused = function () { _super.prototype.removeUnused.call(this); var newRefGroupsMap = {}; var refGroups = this._refGroups; for (var key in refGroups) { if (refGroups.hasOwnProperty(key)) { var group = refGroups[key]; if (!this.isDomUnused(group)) { newRefGroupsMap[key] = group; } else if (group.parentNode) { group.parentNode.removeChild(group); } } } this._refGroups = newRefGroupsMap; }; return ClippathManager; }(Definable)); export default ClippathManager;