Blame view

node_modules/zrender/lib/svg-legacy/helper/GradientManager.js 4.87 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
122
123
124
125
126
127
128
  import { __extends } from "tslib";
  import Definable from './Definable.js';
  import * as zrUtil from '../../core/util.js';
  import { getIdURL, isGradient, isLinearGradient, isRadialGradient, normalizeColor, round4 } from '../../svg/helper.js';
  import { createElement } from '../../svg/core.js';
  var GradientManager = (function (_super) {
      __extends(GradientManager, _super);
      function GradientManager(zrId, svgRoot) {
          return _super.call(this, zrId, svgRoot, ['linearGradient', 'radialGradient'], '__gradient_in_use__') || this;
      }
      GradientManager.prototype.addWithoutUpdate = function (svgElement, displayable) {
          if (displayable && displayable.style) {
              var that_1 = this;
              zrUtil.each(['fill', 'stroke'], function (fillOrStroke) {
                  var value = displayable.style[fillOrStroke];
                  if (isGradient(value)) {
                      var gradient = value;
                      var defs = that_1.getDefs(true);
                      var dom = void 0;
                      if (gradient.__dom) {
                          dom = gradient.__dom;
                          if (!defs.contains(gradient.__dom)) {
                              that_1.addDom(dom);
                          }
                      }
                      else {
                          dom = that_1.add(gradient);
                      }
                      that_1.markUsed(displayable);
                      svgElement.setAttribute(fillOrStroke, getIdURL(dom.getAttribute('id')));
                  }
              });
          }
      };
      GradientManager.prototype.add = function (gradient) {
          var dom;
          if (isLinearGradient(gradient)) {
              dom = createElement('linearGradient');
          }
          else if (isRadialGradient(gradient)) {
              dom = createElement('radialGradient');
          }
          else {
              if (process.env.NODE_ENV !== 'production') {
                  zrUtil.logError('Illegal gradient type.');
              }
              return null;
          }
          gradient.id = gradient.id || this.nextId++;
          dom.setAttribute('id', 'zr' + this._zrId
              + '-gradient-' + gradient.id);
          this.updateDom(gradient, dom);
          this.addDom(dom);
          return dom;
      };
      GradientManager.prototype.update = function (gradient) {
          if (!isGradient(gradient)) {
              return;
          }
          var that = this;
          this.doUpdate(gradient, function () {
              var dom = gradient.__dom;
              if (!dom) {
                  return;
              }
              var tagName = dom.tagName;
              var type = gradient.type;
              if (type === 'linear' && tagName === 'linearGradient'
                  || type === 'radial' && tagName === 'radialGradient') {
                  that.updateDom(gradient, gradient.__dom);
              }
              else {
                  that.removeDom(gradient);
                  that.add(gradient);
              }
          });
      };
      GradientManager.prototype.updateDom = function (gradient, dom) {
          if (isLinearGradient(gradient)) {
              dom.setAttribute('x1', gradient.x);
              dom.setAttribute('y1', gradient.y);
              dom.setAttribute('x2', gradient.x2);
              dom.setAttribute('y2', gradient.y2);
          }
          else if (isRadialGradient(gradient)) {
              dom.setAttribute('cx', gradient.x);
              dom.setAttribute('cy', gradient.y);
              dom.setAttribute('r', gradient.r);
          }
          else {
              if (process.env.NODE_ENV !== 'production') {
                  zrUtil.logError('Illegal gradient type.');
              }
              return;
          }
          dom.setAttribute('gradientUnits', gradient.global
              ? 'userSpaceOnUse'
              : 'objectBoundingBox');
          dom.innerHTML = '';
          var colors = gradient.colorStops;
          for (var i = 0, len = colors.length; i < len; ++i) {
              var stop_1 = createElement('stop');
              stop_1.setAttribute('offset', round4(colors[i].offset) * 100 + '%');
              var stopColor = colors[i].color;
              var _a = normalizeColor(stopColor), color = _a.color, opacity = _a.opacity;
              stop_1.setAttribute('stop-color', color);
              if (opacity < 1) {
                  stop_1.setAttribute('stop-opacity', opacity);
              }
              dom.appendChild(stop_1);
          }
          gradient.__dom = dom;
      };
      GradientManager.prototype.markUsed = function (displayable) {
          if (displayable.style) {
              var gradient = displayable.style.fill;
              if (gradient && gradient.__dom) {
                  _super.prototype.markDomUsed.call(this, gradient.__dom);
              }
              gradient = displayable.style.stroke;
              if (gradient && gradient.__dom) {
                  _super.prototype.markDomUsed.call(this, gradient.__dom);
              }
          }
      };
      return GradientManager;
  }(Definable));
  export default GradientManager;