Blame view

node_modules/zrender/lib/svg-legacy/helper/ClippathManager.js 4.59 KB
bd028579   易尊强   2/28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  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;