import { __extends } from "tslib"; 
 | 
import Element from '../Element.js'; 
 | 
import BoundingRect from '../core/BoundingRect.js'; 
 | 
import { keys, extend, createObject } from '../core/util.js'; 
 | 
import { REDRAW_BIT, STYLE_CHANGED_BIT } from './constants.js'; 
 | 
var STYLE_MAGIC_KEY = '__zr_style_' + Math.round((Math.random() * 10)); 
 | 
export var DEFAULT_COMMON_STYLE = { 
 | 
    shadowBlur: 0, 
 | 
    shadowOffsetX: 0, 
 | 
    shadowOffsetY: 0, 
 | 
    shadowColor: '#000', 
 | 
    opacity: 1, 
 | 
    blend: 'source-over' 
 | 
}; 
 | 
export var DEFAULT_COMMON_ANIMATION_PROPS = { 
 | 
    style: { 
 | 
        shadowBlur: true, 
 | 
        shadowOffsetX: true, 
 | 
        shadowOffsetY: true, 
 | 
        shadowColor: true, 
 | 
        opacity: true 
 | 
    } 
 | 
}; 
 | 
DEFAULT_COMMON_STYLE[STYLE_MAGIC_KEY] = true; 
 | 
var PRIMARY_STATES_KEYS = ['z', 'z2', 'invisible']; 
 | 
var PRIMARY_STATES_KEYS_IN_HOVER_LAYER = ['invisible']; 
 | 
var Displayable = (function (_super) { 
 | 
    __extends(Displayable, _super); 
 | 
    function Displayable(props) { 
 | 
        return _super.call(this, props) || this; 
 | 
    } 
 | 
    Displayable.prototype._init = function (props) { 
 | 
        var keysArr = keys(props); 
 | 
        for (var i = 0; i < keysArr.length; i++) { 
 | 
            var key = keysArr[i]; 
 | 
            if (key === 'style') { 
 | 
                this.useStyle(props[key]); 
 | 
            } 
 | 
            else { 
 | 
                _super.prototype.attrKV.call(this, key, props[key]); 
 | 
            } 
 | 
        } 
 | 
        if (!this.style) { 
 | 
            this.useStyle({}); 
 | 
        } 
 | 
    }; 
 | 
    Displayable.prototype.beforeBrush = function () { }; 
 | 
    Displayable.prototype.afterBrush = function () { }; 
 | 
    Displayable.prototype.innerBeforeBrush = function () { }; 
 | 
    Displayable.prototype.innerAfterBrush = function () { }; 
 | 
    Displayable.prototype.shouldBePainted = function (viewWidth, viewHeight, considerClipPath, considerAncestors) { 
 | 
        var m = this.transform; 
 | 
        if (this.ignore 
 | 
            || this.invisible 
 | 
            || this.style.opacity === 0 
 | 
            || (this.culling 
 | 
                && isDisplayableCulled(this, viewWidth, viewHeight)) 
 | 
            || (m && !m[0] && !m[3])) { 
 | 
            return false; 
 | 
        } 
 | 
        if (considerClipPath && this.__clipPaths) { 
 | 
            for (var i = 0; i < this.__clipPaths.length; ++i) { 
 | 
                if (this.__clipPaths[i].isZeroArea()) { 
 | 
                    return false; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        if (considerAncestors && this.parent) { 
 | 
            var parent_1 = this.parent; 
 | 
            while (parent_1) { 
 | 
                if (parent_1.ignore) { 
 | 
                    return false; 
 | 
                } 
 | 
                parent_1 = parent_1.parent; 
 | 
            } 
 | 
        } 
 | 
        return true; 
 | 
    }; 
 | 
    Displayable.prototype.contain = function (x, y) { 
 | 
        return this.rectContain(x, y); 
 | 
    }; 
 | 
    Displayable.prototype.traverse = function (cb, context) { 
 | 
        cb.call(context, this); 
 | 
    }; 
 | 
    Displayable.prototype.rectContain = function (x, y) { 
 | 
        var coord = this.transformCoordToLocal(x, y); 
 | 
        var rect = this.getBoundingRect(); 
 | 
        return rect.contain(coord[0], coord[1]); 
 | 
    }; 
 | 
    Displayable.prototype.getPaintRect = function () { 
 | 
        var rect = this._paintRect; 
 | 
        if (!this._paintRect || this.__dirty) { 
 | 
            var transform = this.transform; 
 | 
            var elRect = this.getBoundingRect(); 
 | 
            var style = this.style; 
 | 
            var shadowSize = style.shadowBlur || 0; 
 | 
            var shadowOffsetX = style.shadowOffsetX || 0; 
 | 
            var shadowOffsetY = style.shadowOffsetY || 0; 
 | 
            rect = this._paintRect || (this._paintRect = new BoundingRect(0, 0, 0, 0)); 
 | 
            if (transform) { 
 | 
                BoundingRect.applyTransform(rect, elRect, transform); 
 | 
            } 
 | 
            else { 
 | 
                rect.copy(elRect); 
 | 
            } 
 | 
            if (shadowSize || shadowOffsetX || shadowOffsetY) { 
 | 
                rect.width += shadowSize * 2 + Math.abs(shadowOffsetX); 
 | 
                rect.height += shadowSize * 2 + Math.abs(shadowOffsetY); 
 | 
                rect.x = Math.min(rect.x, rect.x + shadowOffsetX - shadowSize); 
 | 
                rect.y = Math.min(rect.y, rect.y + shadowOffsetY - shadowSize); 
 | 
            } 
 | 
            var tolerance = this.dirtyRectTolerance; 
 | 
            if (!rect.isZero()) { 
 | 
                rect.x = Math.floor(rect.x - tolerance); 
 | 
                rect.y = Math.floor(rect.y - tolerance); 
 | 
                rect.width = Math.ceil(rect.width + 1 + tolerance * 2); 
 | 
                rect.height = Math.ceil(rect.height + 1 + tolerance * 2); 
 | 
            } 
 | 
        } 
 | 
        return rect; 
 | 
    }; 
 | 
    Displayable.prototype.setPrevPaintRect = function (paintRect) { 
 | 
        if (paintRect) { 
 | 
            this._prevPaintRect = this._prevPaintRect || new BoundingRect(0, 0, 0, 0); 
 | 
            this._prevPaintRect.copy(paintRect); 
 | 
        } 
 | 
        else { 
 | 
            this._prevPaintRect = null; 
 | 
        } 
 | 
    }; 
 | 
    Displayable.prototype.getPrevPaintRect = function () { 
 | 
        return this._prevPaintRect; 
 | 
    }; 
 | 
    Displayable.prototype.animateStyle = function (loop) { 
 | 
        return this.animate('style', loop); 
 | 
    }; 
 | 
    Displayable.prototype.updateDuringAnimation = function (targetKey) { 
 | 
        if (targetKey === 'style') { 
 | 
            this.dirtyStyle(); 
 | 
        } 
 | 
        else { 
 | 
            this.markRedraw(); 
 | 
        } 
 | 
    }; 
 | 
    Displayable.prototype.attrKV = function (key, value) { 
 | 
        if (key !== 'style') { 
 | 
            _super.prototype.attrKV.call(this, key, value); 
 | 
        } 
 | 
        else { 
 | 
            if (!this.style) { 
 | 
                this.useStyle(value); 
 | 
            } 
 | 
            else { 
 | 
                this.setStyle(value); 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Displayable.prototype.setStyle = function (keyOrObj, value) { 
 | 
        if (typeof keyOrObj === 'string') { 
 | 
            this.style[keyOrObj] = value; 
 | 
        } 
 | 
        else { 
 | 
            extend(this.style, keyOrObj); 
 | 
        } 
 | 
        this.dirtyStyle(); 
 | 
        return this; 
 | 
    }; 
 | 
    Displayable.prototype.dirtyStyle = function (notRedraw) { 
 | 
        if (!notRedraw) { 
 | 
            this.markRedraw(); 
 | 
        } 
 | 
        this.__dirty |= STYLE_CHANGED_BIT; 
 | 
        if (this._rect) { 
 | 
            this._rect = null; 
 | 
        } 
 | 
    }; 
 | 
    Displayable.prototype.dirty = function () { 
 | 
        this.dirtyStyle(); 
 | 
    }; 
 | 
    Displayable.prototype.styleChanged = function () { 
 | 
        return !!(this.__dirty & STYLE_CHANGED_BIT); 
 | 
    }; 
 | 
    Displayable.prototype.styleUpdated = function () { 
 | 
        this.__dirty &= ~STYLE_CHANGED_BIT; 
 | 
    }; 
 | 
    Displayable.prototype.createStyle = function (obj) { 
 | 
        return createObject(DEFAULT_COMMON_STYLE, obj); 
 | 
    }; 
 | 
    Displayable.prototype.useStyle = function (obj) { 
 | 
        if (!obj[STYLE_MAGIC_KEY]) { 
 | 
            obj = this.createStyle(obj); 
 | 
        } 
 | 
        if (this.__inHover) { 
 | 
            this.__hoverStyle = obj; 
 | 
        } 
 | 
        else { 
 | 
            this.style = obj; 
 | 
        } 
 | 
        this.dirtyStyle(); 
 | 
    }; 
 | 
    Displayable.prototype.isStyleObject = function (obj) { 
 | 
        return obj[STYLE_MAGIC_KEY]; 
 | 
    }; 
 | 
    Displayable.prototype._innerSaveToNormal = function (toState) { 
 | 
        _super.prototype._innerSaveToNormal.call(this, toState); 
 | 
        var normalState = this._normalState; 
 | 
        if (toState.style && !normalState.style) { 
 | 
            normalState.style = this._mergeStyle(this.createStyle(), this.style); 
 | 
        } 
 | 
        this._savePrimaryToNormal(toState, normalState, PRIMARY_STATES_KEYS); 
 | 
    }; 
 | 
    Displayable.prototype._applyStateObj = function (stateName, state, normalState, keepCurrentStates, transition, animationCfg) { 
 | 
        _super.prototype._applyStateObj.call(this, stateName, state, normalState, keepCurrentStates, transition, animationCfg); 
 | 
        var needsRestoreToNormal = !(state && keepCurrentStates); 
 | 
        var targetStyle; 
 | 
        if (state && state.style) { 
 | 
            if (transition) { 
 | 
                if (keepCurrentStates) { 
 | 
                    targetStyle = state.style; 
 | 
                } 
 | 
                else { 
 | 
                    targetStyle = this._mergeStyle(this.createStyle(), normalState.style); 
 | 
                    this._mergeStyle(targetStyle, state.style); 
 | 
                } 
 | 
            } 
 | 
            else { 
 | 
                targetStyle = this._mergeStyle(this.createStyle(), keepCurrentStates ? this.style : normalState.style); 
 | 
                this._mergeStyle(targetStyle, state.style); 
 | 
            } 
 | 
        } 
 | 
        else if (needsRestoreToNormal) { 
 | 
            targetStyle = normalState.style; 
 | 
        } 
 | 
        if (targetStyle) { 
 | 
            if (transition) { 
 | 
                var sourceStyle = this.style; 
 | 
                this.style = this.createStyle(needsRestoreToNormal ? {} : sourceStyle); 
 | 
                if (needsRestoreToNormal) { 
 | 
                    var changedKeys = keys(sourceStyle); 
 | 
                    for (var i = 0; i < changedKeys.length; i++) { 
 | 
                        var key = changedKeys[i]; 
 | 
                        if (key in targetStyle) { 
 | 
                            targetStyle[key] = targetStyle[key]; 
 | 
                            this.style[key] = sourceStyle[key]; 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
                var targetKeys = keys(targetStyle); 
 | 
                for (var i = 0; i < targetKeys.length; i++) { 
 | 
                    var key = targetKeys[i]; 
 | 
                    this.style[key] = this.style[key]; 
 | 
                } 
 | 
                this._transitionState(stateName, { 
 | 
                    style: targetStyle 
 | 
                }, animationCfg, this.getAnimationStyleProps()); 
 | 
            } 
 | 
            else { 
 | 
                this.useStyle(targetStyle); 
 | 
            } 
 | 
        } 
 | 
        var statesKeys = this.__inHover ? PRIMARY_STATES_KEYS_IN_HOVER_LAYER : PRIMARY_STATES_KEYS; 
 | 
        for (var i = 0; i < statesKeys.length; i++) { 
 | 
            var key = statesKeys[i]; 
 | 
            if (state && state[key] != null) { 
 | 
                this[key] = state[key]; 
 | 
            } 
 | 
            else if (needsRestoreToNormal) { 
 | 
                if (normalState[key] != null) { 
 | 
                    this[key] = normalState[key]; 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
    }; 
 | 
    Displayable.prototype._mergeStates = function (states) { 
 | 
        var mergedState = _super.prototype._mergeStates.call(this, states); 
 | 
        var mergedStyle; 
 | 
        for (var i = 0; i < states.length; i++) { 
 | 
            var state = states[i]; 
 | 
            if (state.style) { 
 | 
                mergedStyle = mergedStyle || {}; 
 | 
                this._mergeStyle(mergedStyle, state.style); 
 | 
            } 
 | 
        } 
 | 
        if (mergedStyle) { 
 | 
            mergedState.style = mergedStyle; 
 | 
        } 
 | 
        return mergedState; 
 | 
    }; 
 | 
    Displayable.prototype._mergeStyle = function (targetStyle, sourceStyle) { 
 | 
        extend(targetStyle, sourceStyle); 
 | 
        return targetStyle; 
 | 
    }; 
 | 
    Displayable.prototype.getAnimationStyleProps = function () { 
 | 
        return DEFAULT_COMMON_ANIMATION_PROPS; 
 | 
    }; 
 | 
    Displayable.initDefaultProps = (function () { 
 | 
        var dispProto = Displayable.prototype; 
 | 
        dispProto.type = 'displayable'; 
 | 
        dispProto.invisible = false; 
 | 
        dispProto.z = 0; 
 | 
        dispProto.z2 = 0; 
 | 
        dispProto.zlevel = 0; 
 | 
        dispProto.culling = false; 
 | 
        dispProto.cursor = 'pointer'; 
 | 
        dispProto.rectHover = false; 
 | 
        dispProto.incremental = false; 
 | 
        dispProto._rect = null; 
 | 
        dispProto.dirtyRectTolerance = 0; 
 | 
        dispProto.__dirty = REDRAW_BIT | STYLE_CHANGED_BIT; 
 | 
    })(); 
 | 
    return Displayable; 
 | 
}(Element)); 
 | 
var tmpRect = new BoundingRect(0, 0, 0, 0); 
 | 
var viewRect = new BoundingRect(0, 0, 0, 0); 
 | 
function isDisplayableCulled(el, width, height) { 
 | 
    tmpRect.copy(el.getBoundingRect()); 
 | 
    if (el.transform) { 
 | 
        tmpRect.applyTransform(el.transform); 
 | 
    } 
 | 
    viewRect.width = width; 
 | 
    viewRect.height = height; 
 | 
    return !tmpRect.intersect(viewRect); 
 | 
} 
 | 
export default Displayable; 
 |