| import { __extends } from "tslib"; | 
| import Definable from './Definable.js'; | 
| import * as zrUtil from '../../core/util.js'; | 
| import * as colorTool from '../../tool/color.js'; | 
| function isLinearGradient(value) { | 
|     return value.type === 'linear'; | 
| } | 
| function isRadialGradient(value) { | 
|     return value.type === 'radial'; | 
| } | 
| function isGradient(value) { | 
|     return value && (value.type === 'linear' | 
|         || value.type === 'radial'); | 
| } | 
| var GradientManager = (function (_super) { | 
|     __extends(GradientManager, _super); | 
|     function GradientManager(zrId, svgRoot) { | 
|         return _super.call(this, zrId, svgRoot, ['linearGradient', 'radialGradient'], '__gradient_in_use__') || this; | 
|     } | 
|     GradientManager.prototype.addWithoutUpdate = function (svgElement, displayable) { | 
|         if (displayable && displayable.style) { | 
|             var that_1 = this; | 
|             zrUtil.each(['fill', 'stroke'], function (fillOrStroke) { | 
|                 var value = displayable.style[fillOrStroke]; | 
|                 if (isGradient(value)) { | 
|                     var gradient = value; | 
|                     var defs = that_1.getDefs(true); | 
|                     var dom = void 0; | 
|                     if (gradient.__dom) { | 
|                         dom = gradient.__dom; | 
|                         if (!defs.contains(gradient.__dom)) { | 
|                             that_1.addDom(dom); | 
|                         } | 
|                     } | 
|                     else { | 
|                         dom = that_1.add(gradient); | 
|                     } | 
|                     that_1.markUsed(displayable); | 
|                     var id = dom.getAttribute('id'); | 
|                     svgElement.setAttribute(fillOrStroke, 'url(#' + id + ')'); | 
|                 } | 
|             }); | 
|         } | 
|     }; | 
|     GradientManager.prototype.add = function (gradient) { | 
|         var dom; | 
|         if (isLinearGradient(gradient)) { | 
|             dom = this.createElement('linearGradient'); | 
|         } | 
|         else if (isRadialGradient(gradient)) { | 
|             dom = this.createElement('radialGradient'); | 
|         } | 
|         else { | 
|             zrUtil.logError('Illegal gradient type.'); | 
|             return null; | 
|         } | 
|         gradient.id = gradient.id || this.nextId++; | 
|         dom.setAttribute('id', 'zr' + this._zrId | 
|             + '-gradient-' + gradient.id); | 
|         this.updateDom(gradient, dom); | 
|         this.addDom(dom); | 
|         return dom; | 
|     }; | 
|     GradientManager.prototype.update = function (gradient) { | 
|         if (!isGradient(gradient)) { | 
|             return; | 
|         } | 
|         var that = this; | 
|         this.doUpdate(gradient, function () { | 
|             var dom = gradient.__dom; | 
|             if (!dom) { | 
|                 return; | 
|             } | 
|             var tagName = dom.tagName; | 
|             var type = gradient.type; | 
|             if (type === 'linear' && tagName === 'linearGradient' | 
|                 || type === 'radial' && tagName === 'radialGradient') { | 
|                 that.updateDom(gradient, gradient.__dom); | 
|             } | 
|             else { | 
|                 that.removeDom(gradient); | 
|                 that.add(gradient); | 
|             } | 
|         }); | 
|     }; | 
|     GradientManager.prototype.updateDom = function (gradient, dom) { | 
|         if (isLinearGradient(gradient)) { | 
|             dom.setAttribute('x1', gradient.x + ''); | 
|             dom.setAttribute('y1', gradient.y + ''); | 
|             dom.setAttribute('x2', gradient.x2 + ''); | 
|             dom.setAttribute('y2', gradient.y2 + ''); | 
|         } | 
|         else if (isRadialGradient(gradient)) { | 
|             dom.setAttribute('cx', gradient.x + ''); | 
|             dom.setAttribute('cy', gradient.y + ''); | 
|             dom.setAttribute('r', gradient.r + ''); | 
|         } | 
|         else { | 
|             zrUtil.logError('Illegal gradient type.'); | 
|             return; | 
|         } | 
|         if (gradient.global) { | 
|             dom.setAttribute('gradientUnits', 'userSpaceOnUse'); | 
|         } | 
|         else { | 
|             dom.setAttribute('gradientUnits', 'objectBoundingBox'); | 
|         } | 
|         dom.innerHTML = ''; | 
|         var colors = gradient.colorStops; | 
|         for (var i = 0, len = colors.length; i < len; ++i) { | 
|             var stop_1 = this.createElement('stop'); | 
|             stop_1.setAttribute('offset', colors[i].offset * 100 + '%'); | 
|             var color = colors[i].color; | 
|             if (color.indexOf('rgba') > -1) { | 
|                 var opacity = colorTool.parse(color)[3]; | 
|                 var hex = colorTool.toHex(color); | 
|                 stop_1.setAttribute('stop-color', '#' + hex); | 
|                 stop_1.setAttribute('stop-opacity', opacity + ''); | 
|             } | 
|             else { | 
|                 stop_1.setAttribute('stop-color', colors[i].color); | 
|             } | 
|             dom.appendChild(stop_1); | 
|         } | 
|         gradient.__dom = dom; | 
|     }; | 
|     GradientManager.prototype.markUsed = function (displayable) { | 
|         if (displayable.style) { | 
|             var gradient = displayable.style.fill; | 
|             if (gradient && gradient.__dom) { | 
|                 _super.prototype.markDomUsed.call(this, gradient.__dom); | 
|             } | 
|             gradient = displayable.style.stroke; | 
|             if (gradient && gradient.__dom) { | 
|                 _super.prototype.markDomUsed.call(this, gradient.__dom); | 
|             } | 
|         } | 
|     }; | 
|     return GradientManager; | 
| }(Definable)); | 
| export default GradientManager; |