SVGGradientFillStyleData.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import {
  2. degToRads,
  3. createElementID,
  4. } from '../../../utils/common';
  5. import { getLocationHref } from '../../../main';
  6. import {
  7. extendPrototype,
  8. } from '../../../utils/functionExtensions';
  9. import DynamicPropertyContainer from '../../../utils/helpers/dynamicProperties';
  10. import PropertyFactory from '../../../utils/PropertyFactory';
  11. import createNS from '../../../utils/helpers/svg_elements';
  12. import GradientProperty from '../../../utils/shapes/GradientProperty';
  13. import {
  14. lineCapEnum,
  15. lineJoinEnum,
  16. } from '../../../utils/helpers/shapeEnums';
  17. function SVGGradientFillStyleData(elem, data, styleOb) {
  18. this.initDynamicPropertyContainer(elem);
  19. this.getValue = this.iterateDynamicProperties;
  20. this.initGradientData(elem, data, styleOb);
  21. }
  22. SVGGradientFillStyleData.prototype.initGradientData = function (elem, data, styleOb) {
  23. this.o = PropertyFactory.getProp(elem, data.o, 0, 0.01, this);
  24. this.s = PropertyFactory.getProp(elem, data.s, 1, null, this);
  25. this.e = PropertyFactory.getProp(elem, data.e, 1, null, this);
  26. this.h = PropertyFactory.getProp(elem, data.h || { k: 0 }, 0, 0.01, this);
  27. this.a = PropertyFactory.getProp(elem, data.a || { k: 0 }, 0, degToRads, this);
  28. this.g = new GradientProperty(elem, data.g, this);
  29. this.style = styleOb;
  30. this.stops = [];
  31. this.setGradientData(styleOb.pElem, data);
  32. this.setGradientOpacity(data, styleOb);
  33. this._isAnimated = !!this._isAnimated;
  34. };
  35. SVGGradientFillStyleData.prototype.setGradientData = function (pathElement, data) {
  36. var gradientId = createElementID();
  37. var gfill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');
  38. gfill.setAttribute('id', gradientId);
  39. gfill.setAttribute('spreadMethod', 'pad');
  40. gfill.setAttribute('gradientUnits', 'userSpaceOnUse');
  41. var stops = [];
  42. var stop;
  43. var j;
  44. var jLen;
  45. jLen = data.g.p * 4;
  46. for (j = 0; j < jLen; j += 4) {
  47. stop = createNS('stop');
  48. gfill.appendChild(stop);
  49. stops.push(stop);
  50. }
  51. pathElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + getLocationHref() + '#' + gradientId + ')');
  52. this.gf = gfill;
  53. this.cst = stops;
  54. };
  55. SVGGradientFillStyleData.prototype.setGradientOpacity = function (data, styleOb) {
  56. if (this.g._hasOpacity && !this.g._collapsable) {
  57. var stop;
  58. var j;
  59. var jLen;
  60. var mask = createNS('mask');
  61. var maskElement = createNS('path');
  62. mask.appendChild(maskElement);
  63. var opacityId = createElementID();
  64. var maskId = createElementID();
  65. mask.setAttribute('id', maskId);
  66. var opFill = createNS(data.t === 1 ? 'linearGradient' : 'radialGradient');
  67. opFill.setAttribute('id', opacityId);
  68. opFill.setAttribute('spreadMethod', 'pad');
  69. opFill.setAttribute('gradientUnits', 'userSpaceOnUse');
  70. jLen = data.g.k.k[0].s ? data.g.k.k[0].s.length : data.g.k.k.length;
  71. var stops = this.stops;
  72. for (j = data.g.p * 4; j < jLen; j += 2) {
  73. stop = createNS('stop');
  74. stop.setAttribute('stop-color', 'rgb(255,255,255)');
  75. opFill.appendChild(stop);
  76. stops.push(stop);
  77. }
  78. maskElement.setAttribute(data.ty === 'gf' ? 'fill' : 'stroke', 'url(' + getLocationHref() + '#' + opacityId + ')');
  79. if (data.ty === 'gs') {
  80. maskElement.setAttribute('stroke-linecap', lineCapEnum[data.lc || 2]);
  81. maskElement.setAttribute('stroke-linejoin', lineJoinEnum[data.lj || 2]);
  82. if (data.lj === 1) {
  83. maskElement.setAttribute('stroke-miterlimit', data.ml);
  84. }
  85. }
  86. this.of = opFill;
  87. this.ms = mask;
  88. this.ost = stops;
  89. this.maskId = maskId;
  90. styleOb.msElem = maskElement;
  91. }
  92. };
  93. extendPrototype([DynamicPropertyContainer], SVGGradientFillStyleData);
  94. export default SVGGradientFillStyleData;