{"version":3,"file":"TextElement.cjs","sources":["../../../src/elements/TextElement.js"],"sourcesContent":["import { BaseElement, normalizeAnimationConfig } from './BaseElement.js';\nimport { DEFAULT_TEXT_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 { getDefaultFontFamily, isFontRegistered, getFontFallbackChain } from '../utils/font-manager.js';\nimport { TextSplitter } from '../utils/text-splitter.js';\nimport { TransformAnimation } from '../animations/TransformAnimation.js';\nimport { createCanvas, Image } from '@napi-rs/canvas';\nimport paper from '@chnak/paper';\n\n/**\n * 文本元素\n */\nexport class TextElement extends BaseElement {\n  constructor(config = {}) {\n    // 在调用 super 之前保存原始动画配置（因为 BaseElement 构造函数会删除它）\n    const originalAnimations = config.animations || [];\n    \n    super(config);\n    this.type = ElementType.TEXT;\n    // 重新合并配置，确保传入的config优先级最高\n    this.config = deepMerge({}, DEFAULT_TEXT_CONFIG, config);\n    \n    // 保存原始动画配置\n    this.originalAnimations = originalAnimations;\n    \n    // 文本分割相关配置\n    this.split = this.config.split || null; // 'letter', 'word', 'line' 或 null\n    this.splitDelay = this.config.splitDelay || 0.1; // 分割动画延迟（秒）\n    this.splitDuration = this.config.splitDuration || 0.3; // 分割动画持续时间（秒）\n    \n    // 存储分割后的子元素\n    this.segments = [];\n    this.splitter = null;\n    \n    // 如果启用了分割，初始化分割器\n    if (this.split) {\n      this._initializeSplitter();\n    }\n  }\n  \n\n\n  /**\n   * 初始化文本分割器\n   */\n  _initializeSplitter() {\n    if (!this.config.text) {\n      return;\n    }\n    \n    // 获取字体大小（可能需要单位转换）\n    // 暂时使用默认上下文，实际渲染时会重新计算\n    const context = { width: 1920, height: 1080, baseFontSize: 16 };\n    const fontSize = this.convertFontSize(this.config.fontSize, context, 24);\n\n    const rawFontFamily = this.config.fontFamily || getDefaultFontFamily();\n    // 应用字体回退链，确保文本测量和渲染使用相同的字体\n    const fontFamily = getFontFallbackChain(rawFontFamily);\n\n    // 创建分割器\n    this.splitter = new TextSplitter(this.config.text, {\n      fontSize,\n      fontFamily,\n      fontWeight: this.config.fontWeight || 'normal',\n      fontStyle: this.config.fontStyle || 'normal',\n      dynamicSpacing: true, // 启用动态间距，调整窄字符对之间的间距\n    });\n    \n    // 获取分割后的片段\n    const segments = this.splitter.getTextSegments(this.split);\n    \n    // 计算文本总宽度和高度（用于对齐）\n    const totalWidth = this.splitter.getTotalWidth();\n    const totalHeight = this.splitter.getTotalHeight();\n    \n    // 获取父元素的 anchor 和 textAlign\n    const anchor = this.config.anchor || [0.5, 0.5];\n    const textAlign = this.config.textAlign || 'center';\n    \n    // 计算父元素的结束时间\n    const parentStartTime = this.startTime || 0;\n    const parentEndTime = this.endTime !== undefined ? this.endTime : (parentStartTime + (this.duration || 5));\n    \n    // 为每个片段创建子 TextElement\n    this.segments = segments.map((segment, index) => {\n      // 计算每个片段的起始时间（相对于父元素的开始时间）\n      const segmentStartTime = parentStartTime + index * this.splitDelay;\n      // 子元素应该持续显示到父元素结束，而不是只显示 splitDuration\n      const segmentEndTime = parentEndTime;\n      \n      // 创建子元素配置\n      // 注意：位置会在 render 时动态计算，因为需要场景尺寸来转换单位\n      const segmentConfig = {\n        ...this.config,\n        text: segment.text,\n        // 子元素的位置偏移（相对于父元素位置）\n        // 注意：这些值必须在 ...this.config 之后设置，确保不被覆盖\n        segmentOffsetX: segment.x,\n        segmentOffsetY: segment.y,\n        // 保存父元素的位置和对齐信息，用于动态计算\n        parentX: this.config.x,\n        parentY: this.config.y,\n        parentAnchor: anchor,\n        parentTextAlign: textAlign,\n        totalTextWidth: totalWidth,\n        totalTextHeight: totalHeight,\n        // 子元素的尺寸\n        width: segment.width,\n        height: segment.height,\n        // 子元素的时间范围\n        startTime: segmentStartTime,\n        endTime: segmentEndTime,\n        duration: segmentEndTime - segmentStartTime,\n        // 子元素不进行分割\n        split: null,\n        // 子元素的文本对齐方式改为 left（因为位置已经计算好了）\n        textAlign: 'left',\n        // 分割文本初始透明度为 0，动画开始时才设置为 1\n        // 注意：不要在这里设置 opacity: 0，因为这会覆盖动画的初始状态\n        // opacity 应该由动画来控制\n        // 继承父元素的动画配置，但会应用到每个片段\n        // 参考 FKVideo 的实现：不调整动画的 delay，而是调整计算动画时使用的时间\n        // 这样每个片段的动画会相对于自己的延迟时间来计算，实现逐字动画效果\n        // 使用统一的动画配置规范化函数（从 BaseElement 导入）\n        animations: this.originalAnimations && Array.isArray(this.originalAnimations) \n          ? this.originalAnimations.map(anim => normalizeAnimationConfig(anim))\n          : [],\n      };\n      \n      // 创建子 TextElement\n      const segmentElement = new TextElement(segmentConfig);\n      segmentElement.parentElement = this; // 标记父元素\n      segmentElement.segmentIndex = index; // 标记片段索引\n      segmentElement.isSegment = true; // 标记这是分割后的片段\n      \n      // 调试信息：检查动画是否正确创建（已禁用）\n      // if (index === 0 && segmentElement.animations.length > 0) {\n      //   console.log(`[TextElement] Segment ${index} has ${segmentElement.animations.length} animations:`, \n      //     segmentElement.animations.map(a => ({ \n      //       type: a.type, \n      //       delay: a.config.delay, \n      //       duration: a.config.duration,\n      //       from: a.from,\n      //       to: a.to\n      //     })));\n      // }\n      \n      // 如果用户没有指定任何动画，为分割片段添加默认淡入动画\n      const hasAnyAnimation = this.originalAnimations && Array.isArray(this.originalAnimations) && this.originalAnimations.length > 0;\n      \n      if (!hasAnyAnimation) {\n        // 创建默认淡入动画实例\n        const fadeAnimation = new TransformAnimation({\n          from: { opacity: 0 },\n          to: { opacity: 1 },\n          duration: this.splitDuration || 0.3,\n          startTime: 0,\n          easing: 'easeOut',\n        });\n        segmentElement.addAnimation(fadeAnimation);\n      }\n      \n      // 不预先应用动画的初始状态，让动画在开始时才应用\n      // 这样分割文本的初始透明度就是 0，动画开始时才变为 1\n      \n      return segmentElement;\n    });\n  }\n\n  /**\n   * 设置文本内容\n   */\n  setText(text) {\n    this.config.text = text;\n  }\n\n  /**\n   * 设置字体大小\n   */\n  setFontSize(size) {\n    this.config.fontSize = size;\n  }\n\n  /**\n   * 设置字体\n   */\n  setFont(fontFamily, fontWeight = 'normal', fontStyle = 'normal') {\n    this.config.fontFamily = fontFamily;\n    this.config.fontWeight = fontWeight;\n    this.config.fontStyle = fontStyle;\n  }\n\n  /**\n   * 设置颜色\n   */\n  setColor(color) {\n    this.config.color = color;\n  }\n\n  /**\n   * 设置文本对齐\n   */\n  setTextAlign(align) {\n    this.config.textAlign = align;\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) {\n      return null;\n    }\n\n    // 如果没有传入 paperInstance，尝试使用全局 paper（向后兼容）\n    const p = paperInstance ? paperInstance.paper : paper;\n    const project = paperInstance ? paperInstance.project : (paper.project || null);\n\n    // 如果启用了分割，渲染所有子片段\n    if (this.split && this.segments.length > 0) {\n      // 先检查父元素是否在活动时间范围内\n      if (!this.isActiveAtTime(time)) {\n        return null;\n      }\n      \n      // 渲染所有子片段\n      // 参考 FKVideo 的实现：对于分割文本，每个片段有自己的 segmentDelay\n      // 动画的 delay 不需要调整，而是调整计算动画时使用的时间\n      // 注意：时间调整在子片段的 render 方法中进行，这里直接传递原始时间\n      for (const segment of this.segments) {\n        if (segment && typeof segment.render === 'function') {\n          // 直接传递原始时间和 paperInstance，子片段会在自己的 render 方法中调整时间\n          segment.render(layer, time, paperInstance);\n        }\n      }\n      return null; // 分割文本不返回单个元素\n    }\n\n    // 检查时间范围\n    if (!this.isActiveAtTime(time)) {\n      return null;\n    }\n\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      baseFontSize: 16 \n    };\n    \n    // 对于分割片段，不需要调整时间\n    // 退出动画的错开效果已经在 BaseElement.getStateAtTime 中通过调整 effectiveEndTime 实现\n    // 进入动画的错开效果通过每个片段的 startTime 不同自然实现\n    const state = this.getStateAtTime(time, context);\n\n    // 转换字体大小单位（使用 BaseElement 的通用方法）\n    const fontSize = this.convertFontSize(state.fontSize, context, 24);\n\n    // 处理分割后的片段位置计算\n    let x, y;\n    let segmentBaseline = null; // 用于标记分割片段应该使用的 baseline\n    if (this.isSegment && this.config.segmentOffsetX !== undefined) {\n      // 这是分割后的片段，使用 BaseElement 的通用方法计算位置\n      const segmentPos = this.calculateSegmentPosition(state, context, {\n        parentX: this.config.parentX || 0,\n        parentY: this.config.parentY || 0,\n        parentAnchor: this.config.parentAnchor || [0.5, 0.5],\n        parentTextAlign: this.config.parentTextAlign || 'center',\n        totalTextWidth: this.config.totalTextWidth || 0,\n        totalTextHeight: this.config.totalTextHeight || 0,\n        segmentOffsetX: this.config.segmentOffsetX || 0,\n        segmentOffsetY: this.config.segmentOffsetY || 0,\n      });\n      x = segmentPos.x;\n      y = segmentPos.y;\n      segmentBaseline = segmentPos.baseline;\n    } else {\n      // 普通元素，使用 BaseElement 的统一方法计算位置\n      // calculatePosition 会处理单位转换和 anchor 对齐\n      const position = this.calculatePosition(state, context, {\n        anchor: state.anchor || [0.5, 0.5],\n      });\n      x = position.x;\n      y = position.y;\n    }\n\n// 构建字体字符串\n    const fontStyle = state.fontStyle || 'normal';\n    const fontWeight = state.fontWeight || 'normal';\n    let fontFamily = state.fontFamily || getDefaultFontFamily();\n\n    // 使用字体回退链，确保 Emoji 等特殊字符能正确显示\n    fontFamily = getFontFallbackChain(fontFamily);\n\n    // 使用 Paper.js 的 PointText 渲染文本\n    const pointText = new p.PointText(new p.Point(x, y));\n    // 确保 text 属性正确传递（优先使用 state.text，如果没有则使用 this.config.text）\n    const textContent = state.text !== undefined ? state.text : (this.config.text || '');\n    pointText.content = textContent;\n    pointText.fontSize = fontSize;\n    pointText.fontFamily = fontFamily;\n    pointText.fontWeight = fontWeight;\n    pointText.fontStyle = fontStyle;\n    \n    // 设置文本对齐（需要在获取边界之前设置）\n    const textAlign = state.textAlign || 'center';\n    if (textAlign === 'center') {\n      pointText.justification = 'center';\n    } else if (textAlign === 'right') {\n      pointText.justification = 'right';\n    } else {\n      pointText.justification = 'left';\n    }\n\n    // 位置对齐：计算锚点位置\n    // Paper.js PointText 的 position 行为：\n    // - 当 justification='center' 时，position.x = bounds.center\n    // - 当 justification='left' 时，position.x = bounds.x\n    // 所以需要根据 justification 调整 position 使文本正确对齐\n    const boundsForAlign = pointText.bounds;\n    const textW = boundsForAlign.width;\n    const textH = boundsForAlign.height;\n    const anchor = state.anchor || [0.5, 0.5];\n\n    let finalX, finalY;\n    if (anchor[0] === 0.5 && anchor[1] === 0.5) {\n      finalX = x;\n      finalY = y;\n    } else {\n      finalX = x + textW * (0.5 - anchor[0]);\n      finalY = y + textH * (0.5 - anchor[1]);\n    }\n\n    // 调整 position 使 x 表示的字符中心位置正确\n    // 当 justification='left' 时，需要 position.x = finalX + width/2\n    // 当 justification='center' 时，position.x = finalX\n    if (state.textAlign === 'left') {\n      pointText.position = new p.Point(finalX + textW / 2, finalY);\n    } else {\n      pointText.position = new p.Point(finalX, finalY);\n    }\n    \n    // 应用渐变或普通颜色\n    if (state.gradient && state.gradientColors && Array.isArray(state.gradientColors) && state.gradientColors.length >= 2) {\n      // 先设置一个临时颜色来获取文本边界框\n      pointText.fillColor = state.color || '#000000';\n      \n      // 获取文本边界框来确定渐变范围\n      const bounds = pointText.bounds;\n      \n      // 创建渐变\n      const gradient = new p.Gradient();\n      const stops = state.gradientColors.map((color, index) => {\n        const stop = new p.GradientStop();\n        stop.color = new p.Color(color);\n        stop.rampPoint = index / (state.gradientColors.length - 1);\n        return stop;\n      });\n      gradient.stops = stops;\n      \n      // 根据渐变方向设置渐变起点和终点\n      const gradientDirection = state.gradientDirection || 'horizontal';\n      let startPoint, endPoint;\n      \n      if (gradientDirection === 'vertical') {\n        startPoint = new p.Point(bounds.x, bounds.y);\n        endPoint = new p.Point(bounds.x, bounds.y + bounds.height);\n      } else if (gradientDirection === 'diagonal') {\n        startPoint = new p.Point(bounds.x, bounds.y);\n        endPoint = new p.Point(bounds.x + bounds.width, bounds.y + bounds.height);\n      } else {\n        // horizontal (default)\n        startPoint = new p.Point(bounds.x, bounds.y);\n        endPoint = new p.Point(bounds.x + bounds.width, bounds.y);\n      }\n      \n      // 创建线性渐变颜色\n      const gradientColor = new p.Color(gradient, startPoint, endPoint);\n      pointText.fillColor = gradientColor;\n    } else {\n      // 使用普通颜色\n      pointText.fillColor = state.color || '#000000';\n    }\n\n    // 使用统一的变换方法应用动画\n    // 注意：TextElement 的位置已经在创建时通过 pointText.point 设置了，所以不需要再次应用位置\n    this.applyTransform(pointText, state, {\n      applyPosition: false, // 位置已经通过 pointText.point 设置了\n      paperInstance: paperInstance,\n    });\n\n    // 应用描边样式（使用 Paper.js 原生属性）\n    if (state.stroke && state.strokeWidth > 0) {\n      pointText.strokeColor = state.strokeColor || '#000000';\n      pointText.strokeWidth = state.strokeWidth || 2;\n      \n      // 虚线样式\n      const strokeStyle = state.strokeStyle || 'solid';\n      if (strokeStyle === 'dashed' || strokeStyle === 'dotted') {\n        const dashArray = state.strokeDashArray || (strokeStyle === 'dotted' ? [2, 2] : [5, 5]);\n        if (Array.isArray(dashArray) && dashArray.length >= 2) {\n          pointText.dashArray = dashArray;\n        }\n        if (state.strokeDashOffset !== undefined) {\n          pointText.dashOffset = state.strokeDashOffset;\n        }\n      }\n      \n      // 线帽样式\n      if (state.strokeCap) {\n        pointText.strokeCap = state.strokeCap;\n      }\n      \n      // 连接样式\n      if (state.strokeJoin) {\n        pointText.strokeJoin = state.strokeJoin;\n      }\n      \n      // 尖角限制\n      if (state.strokeMiterLimit !== undefined) {\n        pointText.miterLimit = state.strokeMiterLimit;\n      }\n    }\n\n    // 应用文本发光效果（使用多层阴影模拟）\n    if (state.textGlow) {\n      const glowColor = state.textGlowColor || '#FFFFFF';\n      const glowBlur = state.textGlowBlur || 20;\n      const glowIntensity = state.textGlowIntensity || 1;\n      \n      // 创建发光效果：使用多层阴影叠加\n      // Paper.js 的 shadowBlur 和 shadowColor 可以创建发光效果\n      // 为了增强发光效果，我们可以使用较大的模糊半径和较小的偏移\n      pointText.shadowColor = new p.Color(glowColor);\n      pointText.shadowColor.alpha = Math.min(glowIntensity, 1);\n      pointText.shadowBlur = glowBlur;\n      pointText.shadowOffset = new p.Point(0, 0); // 发光效果通常不需要偏移\n    }\n    \n    // 应用文本阴影效果（使用 Paper.js 原生属性）\n    // 注意：如果同时设置了发光和阴影，阴影会覆盖发光，所以发光应该在阴影之前设置\n    // 但为了更好的效果，我们优先使用阴影（如果设置了阴影）\n    if (state.textShadow && !state.textGlow) {\n      const shadowColor = state.textShadowColor || '#000000';\n      const shadowBlur = state.textShadowBlur || 0;\n      const shadowOffsetX = state.textShadowOffsetX || 2;\n      const shadowOffsetY = state.textShadowOffsetY || 2;\n      \n      // 设置阴影颜色\n      pointText.shadowColor = new p.Color(shadowColor);\n      if (state.textShadowOpacity !== undefined) {\n        pointText.shadowColor.alpha = state.textShadowOpacity;\n      }\n      \n      // 设置阴影模糊\n      pointText.shadowBlur = shadowBlur;\n      \n      // 设置阴影偏移\n      pointText.shadowOffset = new p.Point(shadowOffsetX, shadowOffsetY);\n    }\n\n    // 添加到 layer\n    layer.addChild(pointText);\n    \n    // 调用 onRender 回调（传递 paperItem 和 paperInstance）\n    this._callOnRender(time, pointText, paperInstance);\n    \n    return pointText;\n  }\n\n  \n  /**\n   * 清理资源\n   */\n  destroy() {\n    // 清理子片段\n    if (this.segments && this.segments.length > 0) {\n      for (const segment of this.segments) {\n        if (segment && typeof segment.destroy === 'function') {\n          segment.destroy();\n        }\n      }\n      this.segments = [];\n    }\n    \n    // 清理分割器\n    if (this.splitter && typeof this.splitter.destroy === 'function') {\n      this.splitter.destroy();\n      this.splitter = null;\n    }\n    \n    // 调用父类的清理方法\n    if (super.destroy) {\n      super.destroy();\n    }\n  }\n}\n\n\n"],"names":["BaseElement","ElementType","deepMerge","DEFAULT_TEXT_CONFIG","getDefaultFontFamily","getFontFallbackChain","TextSplitter","normalizeAnimationConfig","TransformAnimation"],"mappings":"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"}