{"version":3,"file":"RectElement.cjs","sources":["../../../src/elements/RectElement.js"],"sourcesContent":["import { BaseElement } from './BaseElement.js';\nimport { DEFAULT_ELEMENT_CONFIG } from '../types/constants.js';\nimport { deepMerge } from '../utils/helpers.js';\nimport { ElementType } from '../types/enums.js';\nimport { toPixels } from '../utils/unit-converter.js';\nimport paper from '@chnak/paper';\n\n/**\n * 矩形元素\n */\nexport class RectElement extends BaseElement {\n  constructor(config = {}) {\n    super(config);\n    this.type = ElementType.RECT;\n    // 重新合并配置，确保传入的config优先级最高\n    this.config = deepMerge({}, DEFAULT_ELEMENT_CONFIG, config);\n    this.config.bgcolor = this.config.bgcolor || '#ffffff';\n    this.config.borderRadius = this.config.borderRadius || 0;\n    this.config.borderWidth = this.config.borderWidth || 0;\n    this.config.borderColor = this.config.borderColor || '#000000';\n  }\n\n  /**\n   * 设置背景颜色\n   */\n  setBgColor(color) {\n    this.config.bgcolor = color;\n  }\n\n  /**\n   * 设置圆角\n   */\n  setBorderRadius(radius) {\n    this.config.borderRadius = radius;\n  }\n\n  /**\n   * 设置边框\n   */\n  setBorder(width, color) {\n    this.config.borderWidth = width;\n    this.config.borderColor = color;\n  }\n\n  /**\n   * 渲染矩形元素（使用 Paper.js）\n   * @param {paper.Layer} layer - Paper.js 图层\n   * @param {number} time - 当前时间（秒）\n   * @param {Object} paperInstance - Paper.js 实例 { project, paper }\n   */\n  render(layer, time, paperInstance = null) {\n    if (!this.visible) return null;\n    \n    // 检查时间范围\n    if (!this.isActiveAtTime(time)) {\n      return null;\n    }\n\n    // 获取 Paper.js 实例\n    const { paper: p, project } = this.getPaperInstance(paperInstance);\n\n    // 优先使用元素的 canvasWidth/canvasHeight，如果没有则使用 project.view.viewSize\n    const viewSize = project && project.view && project.view.viewSize \n      ? project.view.viewSize \n      : { width: 1920, height: 1080 };\n    const context = { \n      width: this.canvasWidth || viewSize.width, \n      height: this.canvasHeight || viewSize.height \n    };\n    const state = this.getStateAtTime(time, context);\n\n    // 使用 BaseElement 的通用方法转换尺寸\n    // state.x 和 state.y 已经在 getStateAtTime 中转换了单位\n    const { width, height } = this.convertSize(state.width, state.height, context);\n    const x = state.x || 0;\n    const y = state.y || 0;\n\n    // 使用 BaseElement 的通用方法计算位置（包括 anchor 对齐）\n    const { x: rectX, y: rectY } = this.calculatePosition(state, context, {\n      elementWidth: width,\n      elementHeight: height,\n    });\n\n    // 创建矩形\n    let rect;\n    if (state.borderRadius > 0) {\n      // 圆角矩形 - Paper.js 需要手动创建圆角路径\n      const r = Math.min(state.borderRadius, width / 2, height / 2);\n      const path = new p.Path();\n      \n      // 创建圆角矩形路径（顺时针）\n      // 从左上角开始\n      path.moveTo(new p.Point(rectX + r, rectY));\n      // 上边\n      path.lineTo(new p.Point(rectX + width - r, rectY));\n      // 右上角圆弧\n      path.arcTo(new p.Point(rectX + width, rectY + r));\n      // 右边\n      path.lineTo(new p.Point(rectX + width, rectY + height - r));\n      // 右下角圆弧\n      path.arcTo(new p.Point(rectX + width - r, rectY + height));\n      // 下边\n      path.lineTo(new p.Point(rectX + r, rectY + height));\n      // 左下角圆弧\n      path.arcTo(new p.Point(rectX, rectY + height - r));\n      // 左边\n      path.lineTo(new p.Point(rectX, rectY + r));\n      // 左上角圆弧\n      path.arcTo(new p.Point(rectX + r, rectY));\n      path.closePath();\n      rect = path;\n    } else {\n      // 普通矩形\n      rect = new p.Path.Rectangle({\n        rectangle: new p.Rectangle(rectX, rectY, width, height),\n      });\n    }\n\n    // 处理填充颜色（支持 fillColor 和 bgcolor）\n    const fillColor = state.fillColor || state.bgcolor || '#ffffff';\n    rect.fillColor = fillColor;\n\n    // 边框（支持 strokeColor 和 borderColor）\n    const strokeColor = state.strokeColor || state.borderColor;\n    const strokeWidth = state.strokeWidth || state.borderWidth || 0;\n    if (strokeWidth > 0 && strokeColor) {\n      rect.strokeColor = strokeColor;\n      rect.strokeWidth = strokeWidth;\n    }\n\n    // 使用统一的变换方法应用动画\n    // 优化：对于没有动画的静态矩形，直接设置 opacity，避免不必要的变换计算\n    if (this.animations.length === 0 && state.opacity === undefined) {\n      // 没有动画，直接设置默认透明度\n      rect.opacity = 1;\n    } else {\n      // 有动画或需要设置透明度，使用统一的变换方法\n      this.applyTransform(rect, state, {\n        pivot: new p.Point(x, y), // 使用矩形中心作为变换中心\n        paperInstance: paperInstance,\n      });\n    }\n\n    // 添加到 layer\n    layer.addChild(rect);\n    \n    // 调用 onRender 回调（传递 paperItem 和 paperInstance）\n    this._callOnRender(time, rect, paperInstance);\n    \n    return rect;\n  }\n\n}\n\n"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_ELEMENT_CONFIG"],"mappings":"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"}