_strokeBorder(ctx, strokeStyle, { lineDashWidth, lineDashOffset, lineWidth }) {
      const halfWidth = this.width / 2;
      const halfHeight = this.height / 2;

      ctx.save();
      ctx.strokeStyle = strokeStyle;

      if (ctx.setLineDash) {
        ctx.setLineDash([lineDashWidth, lineDashWidth]);
      }
      if (lineDashOffset) {
        ctx.lineDashOffset = lineDashOffset;
      }
      if (lineWidth) {
        ctx.lineWidth = lineWidth;
      }

      ctx.beginPath();
      ctx.moveTo(-halfWidth, -halfHeight);
      ctx.lineTo(halfWidth, -halfHeight);
      ctx.lineTo(halfWidth, halfHeight);
      ctx.lineTo(-halfWidth, halfHeight);
      ctx.lineTo(-halfWidth, -halfHeight);
      ctx.stroke();

      ctx.restore();
    }
Stroke border
@param {CanvasRenderingContext2D} ctx - Context
@param {string|CanvasGradient|CanvasPattern} strokeStyle - Stroke-style
@param {number} lineDashWidth - Dash width
@param {number} [lineDashOffset] - Dash offset
@param {number} [lineWidth] - line width
@private