gradient.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. "use strict";
  2. /**
  3. * @fileoverview gradient
  4. * @author dengfuping_develop@163.com
  5. */
  6. Object.defineProperty(exports, "__esModule", { value: true });
  7. var util_1 = require("@antv/util");
  8. var dom_1 = require("../util/dom");
  9. var regexLG = /^l\s*\(\s*([\d.]+)\s*\)\s*(.*)/i;
  10. var regexRG = /^r\s*\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*\)\s*(.*)/i;
  11. var regexColorStop = /[\d.]+:(#[^\s]+|[^)]+\))/gi;
  12. function addStop(steps) {
  13. var arr = steps.match(regexColorStop);
  14. if (!arr) {
  15. return '';
  16. }
  17. var stops = '';
  18. arr.sort(function (a, b) {
  19. a = a.split(':');
  20. b = b.split(':');
  21. return Number(a[0]) - Number(b[0]);
  22. });
  23. util_1.each(arr, function (item) {
  24. item = item.split(':');
  25. stops += "<stop offset=\"" + item[0] + "\" stop-color=\"" + item[1] + "\"></stop>";
  26. });
  27. return stops;
  28. }
  29. function parseLineGradient(color, el) {
  30. var arr = regexLG.exec(color);
  31. var angle = util_1.mod(util_1.toRadian(parseFloat(arr[1])), Math.PI * 2);
  32. var steps = arr[2];
  33. var start;
  34. var end;
  35. if (angle >= 0 && angle < 0.5 * Math.PI) {
  36. start = {
  37. x: 0,
  38. y: 0,
  39. };
  40. end = {
  41. x: 1,
  42. y: 1,
  43. };
  44. }
  45. else if (0.5 * Math.PI <= angle && angle < Math.PI) {
  46. start = {
  47. x: 1,
  48. y: 0,
  49. };
  50. end = {
  51. x: 0,
  52. y: 1,
  53. };
  54. }
  55. else if (Math.PI <= angle && angle < 1.5 * Math.PI) {
  56. start = {
  57. x: 1,
  58. y: 1,
  59. };
  60. end = {
  61. x: 0,
  62. y: 0,
  63. };
  64. }
  65. else {
  66. start = {
  67. x: 0,
  68. y: 1,
  69. };
  70. end = {
  71. x: 1,
  72. y: 0,
  73. };
  74. }
  75. var tanTheta = Math.tan(angle);
  76. var tanTheta2 = tanTheta * tanTheta;
  77. var x = (end.x - start.x + tanTheta * (end.y - start.y)) / (tanTheta2 + 1) + start.x;
  78. var y = (tanTheta * (end.x - start.x + tanTheta * (end.y - start.y))) / (tanTheta2 + 1) + start.y;
  79. el.setAttribute('x1', start.x);
  80. el.setAttribute('y1', start.y);
  81. el.setAttribute('x2', x);
  82. el.setAttribute('y2', y);
  83. el.innerHTML = addStop(steps);
  84. }
  85. function parseRadialGradient(color, self) {
  86. var arr = regexRG.exec(color);
  87. var cx = parseFloat(arr[1]);
  88. var cy = parseFloat(arr[2]);
  89. var r = parseFloat(arr[3]);
  90. var steps = arr[4];
  91. self.setAttribute('cx', cx);
  92. self.setAttribute('cy', cy);
  93. self.setAttribute('r', r);
  94. self.innerHTML = addStop(steps);
  95. }
  96. var Gradient = /** @class */ (function () {
  97. function Gradient(cfg) {
  98. this.cfg = {};
  99. var el = null;
  100. var id = util_1.uniqueId('gradient_');
  101. if (cfg.toLowerCase()[0] === 'l') {
  102. el = dom_1.createSVGElement('linearGradient');
  103. parseLineGradient(cfg, el);
  104. }
  105. else {
  106. el = dom_1.createSVGElement('radialGradient');
  107. parseRadialGradient(cfg, el);
  108. }
  109. el.setAttribute('id', id);
  110. this.el = el;
  111. this.id = id;
  112. this.cfg = cfg;
  113. return this;
  114. }
  115. Gradient.prototype.match = function (type, attr) {
  116. return this.cfg === attr;
  117. };
  118. return Gradient;
  119. }());
  120. exports.default = Gradient;
  121. //# sourceMappingURL=gradient.js.map