{"version":3,"file":"Renderer.cjs","sources":["../../../src/core/Renderer.js"],"sourcesContent":["import paper from '@chnak/paper';\nimport path from 'path';\nimport { fileURLToPath } from 'url';\nimport fs from 'fs-extra';\nimport { createCanvas } from '@napi-rs/canvas';\nimport {initDefaultFont,registerFontFile} from '../utils/font-manager.js';\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\ninitDefaultFont();\n/**\n * 渲染器类 - 使用 Paper.js 渲染\n */\nexport class Renderer {\n  constructor(config = {}) {\n    this.width = config.width || 1920;\n    this.height = config.height || 1080;\n    this.fps = config.fps || 30;\n    this.quality = config.quality || 'high';\n    this.canvas = null;\n    this.project = null;\n    this.paper = null; // Paper.js 实例引用\n    this.initialized = false;\n    \n  }\n\n  /**\n   * 初始化渲染器\n   */\n  async init() {\n    if (this.initialized) return;\n\n    // 创建离屏 Canvas（用于最终输出）\n    this.canvas = paper.createCanvas(this.width, this.height);\n\n    // 创建新的 Paper.js Project（实例化）\n    // 每个 Renderer 都有自己独立的 project\n    this.project = new paper.Project(this.canvas);\n    \n    // 保存 paper 引用（用于访问 Paper.js 的类，如 paper.Point, paper.Path 等）\n    this.paper = paper;\n\n    this.initialized = true;\n  }\n  \n  /**\n   * 获取 Paper.js 实例（用于传递给元素）\n   * @returns {Object} Paper.js 实例对象，包含 project 和 paper 类\n   */\n  getPaperInstance() {\n    return {\n      project: this.project,\n      paper: this.paper, // 用于访问 Paper.js 的类（Point, Path, Color 等）\n    };\n  }\n\n  /**\n   * 设置尺寸\n   */\n  setSize(width, height) {\n    this.width = width;\n    this.height = height;\n    if (this.canvas) {\n      this.canvas.width = width;\n      this.canvas.height = height;\n    }\n    if (this.project && this.project.view) {\n      this.project.view.viewSize = new this.paper.Size(width, height);\n    }\n  }\n\n  /**\n   * 清空场景\n   */\n  clear() {\n    // 清空当前 project 的 activeLayer\n    if (this.project && this.project.activeLayer) {\n      this.project.activeLayer.removeChildren();\n    }\n  }\n\n  /**\n   * 渲染一帧 - 使用 Paper.js\n   * @param {Array} layers - 图层数组\n   * @param {number} time - 当前时间（秒）\n   * @param {string} backgroundColor - 背景颜色\n   */\n  async renderFrame(layers, time, backgroundColor = '#000000') {\n    if (!this.initialized) {\n      await this.init();\n    }\n\n    // 先清空 canvas 的 2D context（确保 canvas 有初始状态）\n    const ctx = this.canvas.getContext('2d');\n    ctx.fillStyle = backgroundColor;\n    ctx.fillRect(0, 0, this.width, this.height);\n\n    // 清空 Paper.js 场景（复用 project 时只需要清空子元素）\n    if (this.project && this.project.activeLayer) {\n      this.project.activeLayer.removeChildren();\n    }\n    \n    // 绘制背景（使用 Paper.js）\n    // 只有当背景不是透明时才绘制\n    if (backgroundColor && backgroundColor !== 'transparent' && backgroundColor !== 'rgba(0,0,0,0)') {\n      const bgRect = new this.paper.Path.Rectangle({\n        rectangle: new this.paper.Rectangle(0, 0, this.width, this.height),\n        fillColor: backgroundColor,\n      });\n      bgRect.sendToBack();\n    }\n\n    // 按 zIndex 排序图层\n    const sortedLayers = [...layers].sort((a, b) => a.zIndex - b.zIndex);\n    \n    // 收集所有已渲染的元素\n    const renderedElements = [];\n    \n    // 获取 Paper.js 实例（传递给图层和元素）\n    const paperInstance = this.getPaperInstance();\n    \n    // 渲染所有图层到 Paper.js\n    for (let i = 0; i < sortedLayers.length; i++) {\n      const layer = sortedLayers[i];\n      if (layer.isActiveAtTime(time)) {\n        // 使用 Paper.js 渲染（支持异步）\n        // 传递 paperInstance 给图层，图层再传递给元素\n        const result = layer.render(this.project.activeLayer, time, paperInstance);\n        if (result && typeof result.then === 'function') {\n          await result;\n        }\n        \n        // 收集图层中已渲染的元素\n        if (layer.getRenderedElements && typeof layer.getRenderedElements === 'function') {\n          const elements = layer.getRenderedElements();\n          renderedElements.push(...elements);\n        }\n      }\n    }\n    \n    // 创建 onFrame 事件对象\n    const frameEvent = {\n      count: Math.floor(time * this.fps), // 帧计数\n      time: time, // 当前时间（秒）\n      delta: 1 / this.fps, // 帧间隔（秒）\n    };\n    \n    // 触发元素的 onFrame 回调\n    for (const element of renderedElements) {\n      if (element.onFrame) {\n        // 使用元素保存的 _paperItem 引用，并传递 paperInstance\n        element._callOnFrame(frameEvent, element._paperItem, paperInstance);\n      }\n    }\n    \n    // 触发全局的 Paper.js onFrame 事件（如果已注册，用于向后兼容）\n    if (this.project.view && typeof this.project.view.onFrame === 'function') {\n      try {\n        this.project.view.onFrame(frameEvent);\n      } catch (e) {\n        console.warn('[Renderer] 全局 onFrame 事件触发失败:', e);\n      }\n    }\n    \n    // 更新视图并绘制到 canvas\n    // Paper.js 在 Node.js 环境中需要调用 view.update() 来更新视图\n    // 然后使用 view.draw() 将内容绘制到 canvas\n    this.project.view.update();\n\n    // 检查 project 中的项目数量\n    const itemCount = this.project.activeLayer.children.length;\n    if (itemCount > 0) {\n      // 强制绘制\n      this.project.view.draw();\n    }\n\n    // DEBUG\n    const debugCtx = this.canvas.getContext('2d');\n    const data = debugCtx.getImageData(0, 0, this.width, this.height);\n    let count = 0;\n    for (let i = 0; i < data.data.length; i += 4) {\n      if (data.data[i] > 50 || data.data[i+1] > 50 || data.data[i+2] > 50) count++;\n    }\n    //console.log('[Renderer] after view.draw() canvas colorful=' + count);\n\n    return this.canvas;\n  }\n\n  /**\n   * 将 BGRA 格式转换为 RGBA 格式\n   * @param {Buffer} bgraBuffer - BGRA 格式的 Buffer\n   * @returns {Buffer} RGBA 格式的 Buffer\n   */\n  convertBGRAtoRGBA(bgraBuffer) {\n    const rgbaBuffer = Buffer.allocUnsafe(bgraBuffer.length);\n    // 每 4 个字节为一组：BGRA -> RGBA\n    for (let i = 0; i < bgraBuffer.length; i += 4) {\n      rgbaBuffer[i] = bgraBuffer[i + 2];     // R = B\n      rgbaBuffer[i + 1] = bgraBuffer[i + 1]; // G = G\n      rgbaBuffer[i + 2] = bgraBuffer[i];     // B = R\n      rgbaBuffer[i + 3] = bgraBuffer[i + 3]; // A = A\n    }\n    return rgbaBuffer;\n  }\n\n  /**\n   * 获取 Canvas 缓冲区\n   * @param {string} format - 格式：'raw'（原始 RGBA 数据）或 'png'（PNG 图片）\n   * @returns {Buffer|null} Canvas 缓冲区\n   */\n  getCanvasBuffer(format = 'raw') {\n    if (!this.canvas) return null;\n\n    if (format === 'raw') {\n      // @napi-rs/canvas 不支持 toBuffer('raw')，需要通过 ImageData 获取原始 RGBA 数据\n      const ctx = this.canvas.getContext('2d');\n      const imageData = ctx.getImageData(0, 0, this.width, this.height);\n      // ImageData.data 已经是 RGBA 格式的 Uint8ClampedArray\n      return Buffer.from(imageData.data);\n    } else {\n      // PNG 格式（用于保存帧文件或转场处理）\n      return this.canvas.toBuffer('image/png');\n    }\n  }\n\n  /**\n   * 获取 Canvas\n   */\n  getCanvas() {\n    return this.canvas;\n  }\n\n  /**\n   * 导出动画帧序列（类似 paper.view.exportFrames）\n   * @param {Array} layers - 图层数组\n   * @param {Object} options - 导出选项\n   * @param {number} options.amount - 要导出的总帧数\n   * @param {string} options.directory - 保存帧的目录\n   * @param {number} options.fps - 帧率（默认 30）\n   * @param {number} options.startTime - 开始时间（秒，默认 0）\n   * @param {number} options.endTime - 结束时间（秒）\n   * @param {string} options.backgroundColor - 背景颜色（默认 '#000000'）\n   * @param {Function} options.onProgress - 进度回调函数 (current, total) => {}\n   * @param {Function} options.onComplete - 完成回调函数\n   * @returns {Promise<string[]>} 返回所有导出帧的文件路径数组\n   */\n  async exportFrames(layers, options = {}) {\n    const {\n      amount,\n      directory = './frames',\n      fps = this.fps || 30,\n      startTime = 0,\n      endTime,\n      backgroundColor = '#000000',\n      onProgress,\n      onComplete,\n    } = options;\n\n    if (!this.initialized) {\n      await this.init();\n    }\n\n    // 确保目录存在\n    await fs.ensureDir(directory);\n\n    // 计算实际帧数和时间范围\n    let totalFrames = amount;\n    let actualEndTime = endTime;\n    \n    if (endTime !== undefined) {\n      // 如果指定了结束时间，根据帧率计算帧数\n      totalFrames = Math.ceil((endTime - startTime) * fps);\n    } else if (amount === undefined) {\n      // 如果都没有指定，使用默认值\n      totalFrames = 30; // 默认 1 秒\n      actualEndTime = startTime + 1;\n    } else {\n      // 如果只指定了帧数，计算结束时间\n      actualEndTime = startTime + totalFrames / fps;\n    }\n\n    const framePaths = [];\n\n    // 按 zIndex 排序图层\n    const sortedLayers = [...layers].sort((a, b) => a.zIndex - b.zIndex);\n\n    for (let frame = 0; frame < totalFrames; frame++) {\n      const time = startTime + frame / fps;\n      const frameNumber = frame + 1;\n\n      // 渲染帧\n      await this.renderFrame(sortedLayers, time, backgroundColor);\n\n      // 保存帧\n      const framePath = path.join(directory, `frame_${frameNumber.toString().padStart(4, '0')}.png`);\n      const buffer = this.getCanvasBuffer();\n      await fs.writeFile(framePath, buffer);\n      framePaths.push(framePath);\n\n      // 调用进度回调\n      if (onProgress && typeof onProgress === 'function') {\n        onProgress(frameNumber, totalFrames);\n      }\n    }\n\n    // 调用完成回调\n    if (onComplete && typeof onComplete === 'function') {\n      onComplete(framePaths);\n    }\n\n    return framePaths;\n  }\n\n  /**\n   * 销毁渲染器\n   */\n  destroy() {\n    // 清理 Paper.js 项目\n    if (this.project) {\n      try {\n        this.project.clear();\n        // 移除所有图层和项目\n        if (this.project.activeLayer) {\n          this.project.activeLayer.removeChildren();\n        }\n        // 移除项目\n        if (this.project && this.project.remove) {\n          this.project.remove();\n        }\n      } catch (error) {\n        // 忽略清理错误\n      }\n    }\n    \n    // 清理 Canvas\n    if (this.canvas) {\n      try {\n        // 清空 canvas 内容\n        const ctx = this.canvas.getContext('2d');\n        if (ctx) {\n          ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n        }\n      } catch (error) {\n        // 忽略清理错误\n      }\n      this.canvas = null;\n    }\n    \n    this.project = null;\n    this.initialized = false;\n  }\n}\n"],"names":["__filename","fileURLToPath","initDefaultFont"],"mappings":"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"}