Blame view

node_modules/zrender/src/graphic/helper/fixClipWithShadow.js 2.13 KB
aaac7fed   liuqimichale   add
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
  import env from '../../core/env';
  
  // Fix weird bug in some version of IE11 (like 11.0.9600.178**),
  // where exception "unexpected call to method or property access"
  // might be thrown when calling ctx.fill or ctx.stroke after a path
  // whose area size is zero is drawn and ctx.clip() is called and
  // shadowBlur is set. See #4572, #3112, #5777.
  // (e.g.,
  //  ctx.moveTo(10, 10);
  //  ctx.lineTo(20, 10);
  //  ctx.closePath();
  //  ctx.clip();
  //  ctx.shadowBlur = 10;
  //  ...
  //  ctx.fill();
  // )
  
  var shadowTemp = [
      ['shadowBlur', 0],
      ['shadowColor', '#000'],
      ['shadowOffsetX', 0],
      ['shadowOffsetY', 0]
  ];
  
  export default function (orignalBrush) {
  
      // version string can be: '11.0'
      return (env.browser.ie && env.browser.version >= 11)
  
          ? function () {
              var clipPaths = this.__clipPaths;
              var style = this.style;
              var modified;
  
              if (clipPaths) {
                  for (var i = 0; i < clipPaths.length; i++) {
                      var clipPath = clipPaths[i];
                      var shape = clipPath && clipPath.shape;
                      var type = clipPath && clipPath.type;
  
                      if (shape && (
                          (type === 'sector' && shape.startAngle === shape.endAngle)
                          || (type === 'rect' && (!shape.width || !shape.height))
                      )) {
                          for (var j = 0; j < shadowTemp.length; j++) {
                              // It is save to put shadowTemp static, because shadowTemp
                              // will be all modified each item brush called.
                              shadowTemp[j][2] = style[shadowTemp[j][0]];
                              style[shadowTemp[j][0]] = shadowTemp[j][1];
                          }
                          modified = true;
                          break;
                      }
                  }
              }
  
              orignalBrush.apply(this, arguments);
  
              if (modified) {
                  for (var j = 0; j < shadowTemp.length; j++) {
                      style[shadowTemp[j][0]] = shadowTemp[j][2];
                  }
              }
          }
  
          : orignalBrush;
  }