| import { |
| degToRads, |
| rgbToHex, |
| } from '../../../utils/common'; |
| import createNS from '../../../utils/helpers/svg_elements'; |
| import SVGComposableEffect from './SVGComposableEffect'; |
| import { |
| extendPrototype, |
| } from '../../../utils/functionExtensions'; |
| |
| function SVGDropShadowEffect(filter, filterManager, elem, id, source) { |
| var filterSize = filterManager.container.globalData.renderConfig.filterSize; |
| filter.setAttribute('x', filterSize.x); |
| filter.setAttribute('y', filterSize.y); |
| filter.setAttribute('width', filterSize.width); |
| filter.setAttribute('height', filterSize.height); |
| this.filterManager = filterManager; |
| |
| var feGaussianBlur = createNS('feGaussianBlur'); |
| feGaussianBlur.setAttribute('in', 'SourceAlpha'); |
| feGaussianBlur.setAttribute('result', id + '_drop_shadow_1'); |
| feGaussianBlur.setAttribute('stdDeviation', '0'); |
| this.feGaussianBlur = feGaussianBlur; |
| filter.appendChild(feGaussianBlur); |
| |
| var feOffset = createNS('feOffset'); |
| feOffset.setAttribute('dx', '25'); |
| feOffset.setAttribute('dy', '0'); |
| feOffset.setAttribute('in', id + '_drop_shadow_1'); |
| feOffset.setAttribute('result', id + '_drop_shadow_2'); |
| this.feOffset = feOffset; |
| filter.appendChild(feOffset); |
| var feFlood = createNS('feFlood'); |
| feFlood.setAttribute('flood-color', '#00ff00'); |
| feFlood.setAttribute('flood-opacity', '1'); |
| feFlood.setAttribute('result', id + '_drop_shadow_3'); |
| this.feFlood = feFlood; |
| filter.appendChild(feFlood); |
| |
| var feComposite = createNS('feComposite'); |
| feComposite.setAttribute('in', id + '_drop_shadow_3'); |
| feComposite.setAttribute('in2', id + '_drop_shadow_2'); |
| feComposite.setAttribute('operator', 'in'); |
| feComposite.setAttribute('result', id + '_drop_shadow_4'); |
| filter.appendChild(feComposite); |
| |
| var feMerge = this.createMergeNode( |
| id, |
| [ |
| id + '_drop_shadow_4', |
| source, |
| ] |
| ); |
| filter.appendChild(feMerge); |
| // |
| } |
| extendPrototype([SVGComposableEffect], SVGDropShadowEffect); |
| |
| SVGDropShadowEffect.prototype.renderFrame = function (forceRender) { |
| if (forceRender || this.filterManager._mdf) { |
| if (forceRender || this.filterManager.effectElements[4].p._mdf) { |
| this.feGaussianBlur.setAttribute('stdDeviation', this.filterManager.effectElements[4].p.v / 4); |
| } |
| if (forceRender || this.filterManager.effectElements[0].p._mdf) { |
| var col = this.filterManager.effectElements[0].p.v; |
| this.feFlood.setAttribute('flood-color', rgbToHex(Math.round(col[0] * 255), Math.round(col[1] * 255), Math.round(col[2] * 255))); |
| } |
| if (forceRender || this.filterManager.effectElements[1].p._mdf) { |
| this.feFlood.setAttribute('flood-opacity', this.filterManager.effectElements[1].p.v / 255); |
| } |
| if (forceRender || this.filterManager.effectElements[2].p._mdf || this.filterManager.effectElements[3].p._mdf) { |
| var distance = this.filterManager.effectElements[3].p.v; |
| var angle = (this.filterManager.effectElements[2].p.v - 90) * degToRads; |
| var x = distance * Math.cos(angle); |
| var y = distance * Math.sin(angle); |
| this.feOffset.setAttribute('dx', x); |
| this.feOffset.setAttribute('dy', y); |
| } |
| } |
| }; |
| |
| export default SVGDropShadowEffect; |