SVGEffects.js 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { getLocationHref } from '../../main';
  2. import {
  3. createElementID,
  4. } from '../../utils/common';
  5. import filtersFactory from '../../utils/filters';
  6. var registeredEffects = {};
  7. var idPrefix = 'filter_result_';
  8. function SVGEffects(elem) {
  9. var i;
  10. var source = 'SourceGraphic';
  11. var len = elem.data.ef ? elem.data.ef.length : 0;
  12. var filId = createElementID();
  13. var fil = filtersFactory.createFilter(filId, true);
  14. var count = 0;
  15. this.filters = [];
  16. var filterManager;
  17. for (i = 0; i < len; i += 1) {
  18. filterManager = null;
  19. var type = elem.data.ef[i].ty;
  20. if (registeredEffects[type]) {
  21. var Effect = registeredEffects[type].effect;
  22. filterManager = new Effect(fil, elem.effectsManager.effectElements[i], elem, idPrefix + count, source);
  23. source = idPrefix + count;
  24. if (registeredEffects[type].countsAsEffect) {
  25. count += 1;
  26. }
  27. }
  28. if (filterManager) {
  29. this.filters.push(filterManager);
  30. }
  31. }
  32. if (count) {
  33. elem.globalData.defs.appendChild(fil);
  34. elem.layerElement.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')');
  35. }
  36. if (this.filters.length) {
  37. elem.addRenderableComponent(this);
  38. }
  39. }
  40. SVGEffects.prototype.renderFrame = function (_isFirstFrame) {
  41. var i;
  42. var len = this.filters.length;
  43. for (i = 0; i < len; i += 1) {
  44. this.filters[i].renderFrame(_isFirstFrame);
  45. }
  46. };
  47. SVGEffects.prototype.getEffects = function (type) {
  48. var i;
  49. var len = this.filters.length;
  50. var effects = [];
  51. for (i = 0; i < len; i += 1) {
  52. if (this.filters[i].type === type) {
  53. effects.push(this.filters[i]);
  54. }
  55. }
  56. return effects;
  57. };
  58. export function registerEffect(id, effect, countsAsEffect) {
  59. registeredEffects[id] = {
  60. effect,
  61. countsAsEffect,
  62. };
  63. }
  64. export default SVGEffects;