"use strict";

var __decorate = this && this.__decorate || function(decorators, target, key, desc) {
    var d, c = arguments.length, r = c < 3 ? target : null === desc ? desc = Object.getOwnPropertyDescriptor(target, key) : desc;
    if ("object" == typeof Reflect && "function" == typeof Reflect.decorate) r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) (d = decorators[i]) && (r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r);
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};

Object.defineProperty(exports, "__esModule", {
    value: !0
}), exports.renderStrokeWithCornerRadius = exports.SplitRectAfterRenderContribution = exports.SplitRectBeforeRenderContribution = void 0;

const vrender_1 = require("./../../../vrender"), group_contribution_render_1 = require("./group-contribution-render"), vutils_1 = require("@visactor/vutils"), vrender_2 = require("./../../../vrender");

let SplitRectBeforeRenderContribution = class {
    constructor() {
        this.time = vrender_1.BaseRenderContributionTime.beforeFillStroke, this.useStyle = !0, 
        this.order = 0;
    }
    drawShape(rect, context, x, y, doFill, doStroke, fVisible, sVisible, rectAttribute, drawContext, fillCb, strokeCb, doFillOrStroke) {
        const {stroke: stroke = rectAttribute.stroke, strokeArrayWidth: strokeArrayWidth = rectAttribute.strokeArrayWidth, strokeArrayColor: strokeArrayColor = rectAttribute.strokeArrayColor} = rect.attribute;
        stroke && (Array.isArray(stroke) || Array.isArray(strokeArrayWidth) || Array.isArray(strokeArrayColor)) && (doFillOrStroke.doStroke = !1);
    }
};

SplitRectBeforeRenderContribution = __decorate([ (0, vrender_1.injectable)() ], SplitRectBeforeRenderContribution), 
exports.SplitRectBeforeRenderContribution = SplitRectBeforeRenderContribution;

let SplitRectAfterRenderContribution = class {
    constructor() {
        this.time = vrender_1.BaseRenderContributionTime.afterFillStroke, this.useStyle = !0, 
        this.order = 0;
    }
    drawShape(rect, context, x, y, doFill, doStroke, fVisible, sVisible, rectAttribute, drawContext, fillCb, strokeCb) {
        const {width: width = rectAttribute.width, height: height = rectAttribute.height, stroke: stroke = rectAttribute.stroke, strokeArrayColor: strokeArrayColor = rectAttribute.strokeArrayColor, strokeArrayWidth: strokeArrayWidth = rectAttribute.strokeArrayWidth, lineWidth: lineWidth = rectAttribute.lineWidth, strokeColor: strokeColor = rectAttribute.stroke, cornerRadius: cornerRadius = rectAttribute.cornerRadius} = rect.attribute;
        if (!(!stroke || !Array.isArray(strokeArrayWidth) && 0 === lineWidth || width <= 0 || height <= 0) && (Array.isArray(stroke) || Array.isArray(strokeArrayColor) || Array.isArray(strokeArrayWidth))) {
            const deltaWidth = 0, deltaHeight = 0;
            "border-rect" !== rect.name && "table-border-rect" !== rect.name && ("number" == typeof lineWidth && 1 & lineWidth || Array.isArray(strokeArrayWidth) && strokeArrayWidth.some((width => 1 & width))) && (x = Math.floor(x) + .5, 
            y = Math.floor(y) + .5), 0 === cornerRadius || (0, vutils_1.isArray)(cornerRadius) && cornerRadius.every((num => 0 === num)) ? (0, 
            group_contribution_render_1.renderStroke)(rect, context, x, y, rectAttribute, stroke, strokeArrayWidth || lineWidth, strokeArrayColor || strokeColor, "table-border-rect" !== rect.name ? Math.ceil(width + deltaWidth) : width + deltaWidth, "table-border-rect" !== rect.name ? Math.ceil(height + deltaHeight) : height + deltaHeight) : (context.beginPath(), 
            (0, vrender_2.createRectPath)(context, x, y, width, height, cornerRadius, !0, new Array(4).fill(0).map(((_, i) => (x1, y1, x2, y2) => {
                renderStrokeWithCornerRadius(i, x1, y1, x2, y2, rect, context, x, y, rectAttribute, stroke, strokeArrayWidth || lineWidth, strokeArrayColor || strokeColor, Math.ceil(width + deltaWidth), Math.ceil(height + deltaHeight));
            }))), context.stroke());
        }
    }
};

function renderStrokeWithCornerRadius(i, x1, y1, x2, y2, rect, context, x, y, rectAttribute, stroke, strokeArrayWidth, strokeArrayColor, width, height) {
    var _a, _b, _c, _d;
    const group = rect, groupAttribute = rectAttribute, widthInfo = (0, group_contribution_render_1.getWidthInfo)(strokeArrayWidth), isWidthNumber = !Array.isArray(strokeArrayWidth), isStrokeTrue = !Array.isArray(stroke), isSplitDraw = Array.isArray(strokeArrayColor) || widthInfo.isSplitDraw;
    context.stroke(), context.setStrokeStyle(rect, rect.attribute, x, y, rectAttribute);
    const {lineDash: lineDash = groupAttribute.lineDash} = group.attribute;
    let isDash = !1;
    lineDash.length && lineDash.some((dash => Array.isArray(dash))) && (isDash = !0), 
    context.beginPath(), context.moveTo(x, y);
    const strokeTop = (isStrokeTrue || stroke[0]) && (isWidthNumber || strokeArrayWidth[0]), strokeRight = (isStrokeTrue || stroke[1]) && (isWidthNumber || strokeArrayWidth[1]), strokeBottom = (isStrokeTrue || stroke[2]) && (isWidthNumber || strokeArrayWidth[2]), strokeLeft = (isStrokeTrue || stroke[3]) && (isWidthNumber || strokeArrayWidth[3]);
    if (strokeTop && 0 === i) {
        isWidthNumber ? widthInfo.width : strokeArrayWidth[0], isWidthNumber ? widthInfo.width : strokeArrayWidth[0];
        context.moveTo(x1, y1), context.lineTo(x2, y2), (isSplitDraw || isDash) && (strokeArrayColor && strokeArrayColor[0] ? context.strokeStyle = strokeArrayColor[0] : strokeArrayColor && !strokeArrayColor[0] && (context.strokeStyle = "transparent"), 
        isWidthNumber || (context.lineWidth = strokeArrayWidth[0]), context.lineDashOffset = context.currentMatrix.e / context.currentMatrix.a, 
        isDash && context.setLineDash(null !== (_a = lineDash[0]) && void 0 !== _a ? _a : []), 
        context.stroke(), context.beginPath());
    } else 0 === i && context.moveTo(x + width, y);
    if (strokeRight && 1 === i) {
        isWidthNumber ? widthInfo.width : strokeArrayWidth[1], isWidthNumber ? widthInfo.width : strokeArrayWidth[1];
        context.moveTo(x1, y1), context.lineTo(x2, y2), (isSplitDraw || isDash) && (strokeArrayColor && strokeArrayColor[1] ? context.strokeStyle = strokeArrayColor[1] : strokeArrayColor && !strokeArrayColor[1] && (context.strokeStyle = "transparent"), 
        isWidthNumber || (context.lineWidth = strokeArrayWidth[1]), context.lineDashOffset = context.currentMatrix.f / context.currentMatrix.d, 
        isDash && context.setLineDash(null !== (_b = lineDash[1]) && void 0 !== _b ? _b : []), 
        context.stroke(), context.beginPath(), context.moveTo(x + width, y + height));
    } else 1 === i && context.moveTo(x + width, y + height);
    if (strokeBottom && 2 === i) {
        isWidthNumber ? widthInfo.width : strokeArrayWidth[2], isWidthNumber ? widthInfo.width : strokeArrayWidth[2];
        context.moveTo(x1, y1), context.lineTo(x2, y2), (isSplitDraw || isDash) && (strokeArrayColor && strokeArrayColor[2] ? context.strokeStyle = strokeArrayColor[2] : strokeArrayColor && !strokeArrayColor[2] && (context.strokeStyle = "transparent"), 
        isWidthNumber || (context.lineWidth = strokeArrayWidth[2]), context.lineDashOffset = context.currentMatrix.e / context.currentMatrix.a, 
        isDash && context.setLineDash(null !== (_c = lineDash[2]) && void 0 !== _c ? _c : []), 
        context.stroke(), context.beginPath(), context.moveTo(x, y + height));
    } else 2 === i && context.moveTo(x, y + height);
    if (strokeLeft && 3 === i) {
        isWidthNumber ? widthInfo.width : strokeArrayWidth[3], isWidthNumber ? widthInfo.width : strokeArrayWidth[3];
        context.moveTo(x1, y1), context.lineTo(x2, y2), (isSplitDraw || isDash) && (strokeArrayColor && strokeArrayColor[3] ? context.strokeStyle = strokeArrayColor[3] : strokeArrayColor && !strokeArrayColor[3] && (context.strokeStyle = "transparent"), 
        isWidthNumber || (context.lineWidth = strokeArrayWidth[3]), context.lineDashOffset = context.currentMatrix.f / context.currentMatrix.d, 
        isDash && context.setLineDash(null !== (_d = lineDash[3]) && void 0 !== _d ? _d : []), 
        context.stroke(), context.beginPath(), context.moveTo(x, y));
    } else 3 === i && context.moveTo(x, y);
    context.closePath(), isSplitDraw || isDash || (!isWidthNumber && widthInfo.width && (context.lineWidth = widthInfo.width), 
    context.stroke()), context.lineDashOffset = 0, context.setLineDash([]), context.beginPath();
}

SplitRectAfterRenderContribution = __decorate([ (0, vrender_1.injectable)() ], SplitRectAfterRenderContribution), 
exports.SplitRectAfterRenderContribution = SplitRectAfterRenderContribution, exports.renderStrokeWithCornerRadius = renderStrokeWithCornerRadius;
//# sourceMappingURL=rect-contribution-render.js.map
