{"version":3,"file":"SubtitleElement.cjs","sources":["../../../src/elements/SubtitleElement.js"],"sourcesContent":["import { BaseElement, normalizeAnimationConfig } from './BaseElement.js';\nimport { TextElement } from './TextElement.js';\nimport { ElementType } from '../types/enums.js';\nimport { parseSubtitles, calculateMixedTextCapacity } from '../utils/subtitle-utils.js';\nimport { getDefaultFontFamily } from '../utils/font-manager.js';\nimport paper from '@chnak/paper';\n\n/**\n * 字幕元素\n * 根据时长自动分割文本，并创建多个 TextElement 进行渲染\n */\nexport class SubtitleElement extends BaseElement {\n  constructor(config = {}) {\n    // 在调用 super 之前保存原始动画配置\n    const originalAnimations = config.animations || [];\n    \n    super(config);\n    this.type = ElementType.TEXT; // 使用 TEXT 类型，因为最终渲染的是文本\n    \n    // 保存原始动画配置\n    this.originalAnimations = originalAnimations;\n    \n    // 字幕相关配置\n    this.text = config.text || '';\n    this.fontSize = config.fontSize || 72;\n    this.fontFamily = config.fontFamily || getDefaultFontFamily();\n    this.textColor = config.color || config.textColor || '#ffffff';\n    this.position = config.position || 'center';\n    this.textAlign = config.textAlign || 'center';\n    \n    // 分割相关配置\n    this.split = config.split || null; // 'letter', 'word', 'line' 或 null\n    this.splitDelay = config.splitDelay || 0.1;\n    this.splitDuration = config.splitDuration || 0.3;\n    \n    // 字幕分割相关\n    this.maxLength = config.maxLength || 20; // 每段最大字符数\n    \n    // 文本效果相关配置（传递给子 TextElement）\n    // 描边效果\n    this.stroke = config.stroke;\n    this.strokeColor = config.strokeColor;\n    this.strokeWidth = config.strokeWidth;\n    this.strokeStyle = config.strokeStyle;\n    this.strokeDashArray = config.strokeDashArray;\n    this.strokeDashOffset = config.strokeDashOffset;\n    this.strokeCap = config.strokeCap;\n    this.strokeJoin = config.strokeJoin;\n    this.strokeMiterLimit = config.strokeMiterLimit;\n    \n    // 文本阴影效果\n    this.textShadow = config.textShadow;\n    this.textShadowColor = config.textShadowColor;\n    this.textShadowOffsetX = config.textShadowOffsetX;\n    this.textShadowOffsetY = config.textShadowOffsetY;\n    this.textShadowBlur = config.textShadowBlur;\n    this.textShadowOpacity = config.textShadowOpacity;\n    this.textShadowStyle = config.textShadowStyle;\n    this.textShadowSpread = config.textShadowSpread;\n    \n    // 文本渐变效果\n    this.gradient = config.gradient;\n    this.gradientColors = config.gradientColors;\n    this.gradientDirection = config.gradientDirection;\n    \n    // 文本发光效果\n    this.textGlow = config.textGlow;\n    this.textGlowColor = config.textGlowColor;\n    this.textGlowBlur = config.textGlowBlur;\n    this.textGlowIntensity = config.textGlowIntensity;\n    \n    // 文本背景\n    this.textBackground = config.textBackground;\n    this.textBackgroundColor = config.textBackgroundColor;\n    this.textBackgroundPadding = config.textBackgroundPadding;\n    this.textBackgroundRadius = config.textBackgroundRadius;\n    \n    // 其他文本属性\n    this.fontWeight = config.fontWeight;\n    this.fontStyle = config.fontStyle;\n    this.lineHeight = config.lineHeight;\n    this.textBaseline = config.textBaseline;\n    \n    // 存储分割后的 TextElement 列表\n    this.textElements = [];\n    this.initialized = false;\n  }\n  \n  /**\n   * 初始化字幕元素\n   * 根据时长分割文本并创建 TextElement\n   */\n  async initialize(context = {}) {\n    if (this.initialized) {\n      return;\n    }\n    \n    const { width = 1920, height = 1080 } = context;\n    \n    // 使用 BaseElement 的通用方法转换字体大小\n    const unitContext = { width, height, baseFontSize: 16 };\n    const fontSize = this.convertFontSize(this.fontSize, unitContext, 24);\n    \n    const fontFamily = this.fontFamily || getDefaultFontFamily();\n    \n    // 计算文本容量\n    const capacity = calculateMixedTextCapacity(width * 0.85, fontSize, this.text, fontFamily);\n    \n    // 解析字幕，按时长分割\n    const subtitleSegments = parseSubtitles(this.text, this.duration, capacity.maxChars || this.maxLength);\n    \n    // 为每个段落创建 TextElement\n    this.textElements = [];\n\n    // 如果配置中有明确的 startTime（如 LRC 歌词），使用它；否则使用累计时间\n    const hasExplicitStartTime = this.startTime !== undefined && this.startTime !== null;\n    let currentStartTime = this.startTime || 0;\n\n    for (const segment of subtitleSegments) {\n      // 如果只有一个段落且有明确的 startTime（LRC 歌词），使用配置的 startTime\n      // 否则使用累计时间\n      const segmentStartTime = (hasExplicitStartTime && subtitleSegments.length === 1)\n        ? this.startTime\n        : currentStartTime;\n\n      const textElement = new TextElement({\n        text: segment.text,\n        x: this.config.x || (this.position === 'center' ? '50%' : this.config.x),\n        y: this.config.y || (this.position === 'center' ? '80%' : this.config.y),\n        fontSize: fontSize,\n        fontFamily: fontFamily,\n        color: this.textColor,\n        textAlign: this.textAlign,\n        anchor: this.config.anchor || [0.5, 0.5],\n        // 时间范围\n        startTime: segmentStartTime,\n        duration: segment.duration,\n        endTime: segmentStartTime + segment.duration,\n        // 分割配置\n        split: this.split,\n        splitDelay: this.splitDelay,\n        splitDuration: this.splitDuration,\n        // 动画配置（使用统一的动画配置规范化函数）\n        animations: this.originalAnimations && Array.isArray(this.originalAnimations)\n          ? this.originalAnimations.map(anim => normalizeAnimationConfig(anim))\n          : [],\n        // 其他配置\n        opacity: this.config.opacity !== undefined ? this.config.opacity : 1,\n        rotation: this.config.rotation || 0,\n        scaleX: this.config.scaleX || 1,\n        scaleY: this.config.scaleY || 1,\n        // 文本效果配置\n        // 描边效果\n        stroke: this.stroke,\n        strokeColor: this.strokeColor,\n        strokeWidth: this.strokeWidth,\n        strokeStyle: this.strokeStyle,\n        strokeDashArray: this.strokeDashArray,\n        strokeDashOffset: this.strokeDashOffset,\n        strokeCap: this.strokeCap,\n        strokeJoin: this.strokeJoin,\n        strokeMiterLimit: this.strokeMiterLimit,\n        // 文本阴影效果\n        textShadow: this.textShadow,\n        textShadowColor: this.textShadowColor,\n        textShadowOffsetX: this.textShadowOffsetX,\n        textShadowOffsetY: this.textShadowOffsetY,\n        textShadowBlur: this.textShadowBlur,\n        textShadowOpacity: this.textShadowOpacity,\n        textShadowStyle: this.textShadowStyle,\n        textShadowSpread: this.textShadowSpread,\n        // 文本渐变效果\n        gradient: this.gradient,\n        gradientColors: this.gradientColors,\n        gradientDirection: this.gradientDirection,\n        // 文本发光效果\n        textGlow: this.textGlow,\n        textGlowColor: this.textGlowColor,\n        textGlowBlur: this.textGlowBlur,\n        textGlowIntensity: this.textGlowIntensity,\n        // 文本背景\n        textBackground: this.textBackground,\n        textBackgroundColor: this.textBackgroundColor,\n        textBackgroundPadding: this.textBackgroundPadding,\n        textBackgroundRadius: this.textBackgroundRadius,\n        // 其他文本属性\n        fontWeight: this.fontWeight,\n        fontStyle: this.fontStyle,\n        lineHeight: this.lineHeight,\n        textBaseline: this.textBaseline,\n      });\n\n      this.textElements.push(textElement);\n      currentStartTime += segment.duration;\n    }\n    \n    this.initialized = true;\n  }\n  \n  /**\n   * 渲染字幕元素\n   */\n  /**\n   * 渲染字幕元素（使用 Paper.js）\n   * 注意：字幕元素需要异步初始化，所以在首次渲染时可能需要同步初始化\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    // 获取 Paper.js 实例\n    const { project } = this.getPaperInstance(paperInstance);\n\n    // 如果未初始化，尝试同步初始化（使用视图尺寸）\n    if (!this.initialized) {\n      try {\n        const viewSize = project && project.view && project.view.viewSize \n          ? project.view.viewSize \n          : { width: 1920, height: 1080 };\n        const width = viewSize.width || 1920;\n        const height = viewSize.height || 1080;\n        // 同步初始化（如果可能）\n        // 注意：这可能会阻塞，但对于字幕元素，初始化应该很快\n        this.initialize({ width, height }).catch(err => {\n          console.warn('SubtitleElement 初始化失败:', err);\n        });\n      } catch (error) {\n        console.warn('SubtitleElement 同步初始化失败:', error);\n      }\n    }\n\n    // 如果已初始化，渲染所有 TextElement\n    if (this.initialized) {\n      for (const textElement of this.textElements) {\n        if (textElement && textElement.isActiveAtTime(time)) {\n          if (typeof textElement.render === 'function') {\n            // 传递 paperInstance 给 TextElement\n            textElement.render(layer, time, paperInstance);\n          }\n        }\n      }\n    }\n    \n    return null; // 字幕元素不返回单个元素\n  }\n  \n  /**\n   * 获取所有 TextElement（用于添加到 Layer）\n   */\n  getTextElements() {\n    return this.textElements;\n  }\n  \n  /**\n   * 清理资源\n   */\n  destroy() {\n    if (this.textElements && this.textElements.length > 0) {\n      for (const textElement of this.textElements) {\n        if (textElement && typeof textElement.destroy === 'function') {\n          textElement.destroy();\n        }\n      }\n      this.textElements = [];\n    }\n    this.initialized = false;\n    \n    if (super.destroy) {\n      super.destroy();\n    }\n  }\n}\n\n"],"names":["BaseElement","ElementType","getDefaultFontFamily","calculateMixedTextCapacity","parseSubtitles","TextElement","normalizeAnimationConfig"],"mappings":"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"}