| import { getLocationHref } from '../../main'; |
| import { |
| createElementID, |
| } from '../../utils/common'; |
| import filtersFactory from '../../utils/filters'; |
| import SVGTintFilter from './effects/SVGTintEffect'; |
| import SVGFillFilter from './effects/SVGFillFilter'; |
| import SVGStrokeEffect from './effects/SVGStrokeEffect'; |
| import SVGTritoneFilter from './effects/SVGTritoneFilter'; |
| import SVGProLevelsFilter from './effects/SVGProLevelsFilter'; |
| import SVGDropShadowEffect from './effects/SVGDropShadowEffect'; |
| import SVGMatte3Effect from './effects/SVGMatte3Effect'; |
| import SVGGaussianBlurEffect from './effects/SVGGaussianBlurEffect'; |
| |
| var registeredEffects = {}; |
| |
| function SVGEffects(elem) { |
| var i; |
| var len = elem.data.ef ? elem.data.ef.length : 0; |
| var filId = createElementID(); |
| var fil = filtersFactory.createFilter(filId, true); |
| var count = 0; |
| this.filters = []; |
| var filterManager; |
| for (i = 0; i < len; i += 1) { |
| filterManager = null; |
| var type = elem.data.ef[i].ty; |
| if (registeredEffects[type]) { |
| var Effect = registeredEffects[type].effect; |
| filterManager = new Effect(fil, elem.effectsManager.effectElements[i], elem); |
| if (registeredEffects[type].countsAsEffect) { |
| count += 1; |
| } |
| } |
| if (elem.data.ef[i].ty === 20) { |
| count += 1; |
| filterManager = new SVGTintFilter(fil, elem.effectsManager.effectElements[i]); |
| } else if (elem.data.ef[i].ty === 21) { |
| count += 1; |
| filterManager = new SVGFillFilter(fil, elem.effectsManager.effectElements[i]); |
| } else if (elem.data.ef[i].ty === 22) { |
| filterManager = new SVGStrokeEffect(elem, elem.effectsManager.effectElements[i]); |
| } else if (elem.data.ef[i].ty === 23) { |
| count += 1; |
| filterManager = new SVGTritoneFilter(fil, elem.effectsManager.effectElements[i]); |
| } else if (elem.data.ef[i].ty === 24) { |
| count += 1; |
| filterManager = new SVGProLevelsFilter(fil, elem.effectsManager.effectElements[i]); |
| } else if (elem.data.ef[i].ty === 25) { |
| count += 1; |
| filterManager = new SVGDropShadowEffect(fil, elem.effectsManager.effectElements[i]); |
| } else if (elem.data.ef[i].ty === 28) { |
| // count += 1; |
| filterManager = new SVGMatte3Effect(fil, elem.effectsManager.effectElements[i], elem); |
| } else if (elem.data.ef[i].ty === 29) { |
| count += 1; |
| filterManager = new SVGGaussianBlurEffect(fil, elem.effectsManager.effectElements[i]); |
| } |
| if (filterManager) { |
| this.filters.push(filterManager); |
| } |
| } |
| if (count) { |
| elem.globalData.defs.appendChild(fil); |
| elem.layerElement.setAttribute('filter', 'url(' + getLocationHref() + '#' + filId + ')'); |
| } |
| if (this.filters.length) { |
| elem.addRenderableComponent(this); |
| } |
| } |
| |
| SVGEffects.prototype.renderFrame = function (_isFirstFrame) { |
| var i; |
| var len = this.filters.length; |
| for (i = 0; i < len; i += 1) { |
| this.filters[i].renderFrame(_isFirstFrame); |
| } |
| }; |
| |
| export function registerEffect(id, effect, countsAsEffect) { |
| registeredEffects[id] = { |
| effect, |
| countsAsEffect, |
| }; |
| } |
| |
| export default SVGEffects; |