SVGDropShadowEffect.js 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import {
  2. degToRads,
  3. rgbToHex,
  4. } from '../../../utils/common';
  5. import createNS from '../../../utils/helpers/svg_elements';
  6. import SVGComposableEffect from './SVGComposableEffect';
  7. import {
  8. extendPrototype,
  9. } from '../../../utils/functionExtensions';
  10. function SVGDropShadowEffect(filter, filterManager, elem, id, source) {
  11. var globalFilterSize = filterManager.container.globalData.renderConfig.filterSize;
  12. var filterSize = filterManager.data.fs || globalFilterSize;
  13. filter.setAttribute('x', filterSize.x || globalFilterSize.x);
  14. filter.setAttribute('y', filterSize.y || globalFilterSize.y);
  15. filter.setAttribute('width', filterSize.width || globalFilterSize.width);
  16. filter.setAttribute('height', filterSize.height || globalFilterSize.height);
  17. this.filterManager = filterManager;
  18. var feGaussianBlur = createNS('feGaussianBlur');
  19. feGaussianBlur.setAttribute('in', 'SourceAlpha');
  20. feGaussianBlur.setAttribute('result', id + '_drop_shadow_1');
  21. feGaussianBlur.setAttribute('stdDeviation', '0');
  22. this.feGaussianBlur = feGaussianBlur;
  23. filter.appendChild(feGaussianBlur);
  24. var feOffset = createNS('feOffset');
  25. feOffset.setAttribute('dx', '25');
  26. feOffset.setAttribute('dy', '0');
  27. feOffset.setAttribute('in', id + '_drop_shadow_1');
  28. feOffset.setAttribute('result', id + '_drop_shadow_2');
  29. this.feOffset = feOffset;
  30. filter.appendChild(feOffset);
  31. var feFlood = createNS('feFlood');
  32. feFlood.setAttribute('flood-color', '#00ff00');
  33. feFlood.setAttribute('flood-opacity', '1');
  34. feFlood.setAttribute('result', id + '_drop_shadow_3');
  35. this.feFlood = feFlood;
  36. filter.appendChild(feFlood);
  37. var feComposite = createNS('feComposite');
  38. feComposite.setAttribute('in', id + '_drop_shadow_3');
  39. feComposite.setAttribute('in2', id + '_drop_shadow_2');
  40. feComposite.setAttribute('operator', 'in');
  41. feComposite.setAttribute('result', id + '_drop_shadow_4');
  42. filter.appendChild(feComposite);
  43. var feMerge = this.createMergeNode(
  44. id,
  45. [
  46. id + '_drop_shadow_4',
  47. source,
  48. ]
  49. );
  50. filter.appendChild(feMerge);
  51. //
  52. }
  53. extendPrototype([SVGComposableEffect], SVGDropShadowEffect);
  54. SVGDropShadowEffect.prototype.renderFrame = function (forceRender) {
  55. if (forceRender || this.filterManager._mdf) {
  56. if (forceRender || this.filterManager.effectElements[4].p._mdf) {
  57. this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4);
  58. }
  59. if (forceRender || this.filterManager.effectElements[0].p._mdf) {
  60. var col = this.filterManager.effectElements[0].p.v;
  61. this.feFlood.setAttribute('flood-color', rgbToHex(Math.round(col[0] * 255), Math.round(col[1] * 255), Math.round(col[2] * 255)));
  62. }
  63. if (forceRender || this.filterManager.effectElements[1].p._mdf) {
  64. this.feFlood.setAttribute('flood-opacity', this.filterManager.effectElements[1].p.v / 255);
  65. }
  66. if (forceRender || this.filterManager.effectElements[2].p._mdf || this.filterManager.effectElements[3].p._mdf) {
  67. var distance = this.filterManager.effectElements[3].p.v;
  68. var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads;
  69. var x = distance * Math.cos(angle);
  70. var y = distance * Math.sin(angle);
  71. this.feOffset.setAttribute('dx', x);
  72. this.feOffset.setAttribute('dy', y);
  73. }
  74. }
  75. };
  76. export default SVGDropShadowEffect;