{"version":3,"file":"canvas.mjs","names":[],"sources":["../../src/renderers/canvas.ts"],"sourcesContent":["/**\n * Canvas 2D 渲染器\n *\n * 将 boolean[][] 矩阵绘制到 Canvas 上。\n * 接收外部 Canvas 对象，兼容浏览器 HTMLCanvasElement、OffscreenCanvas、\n * 微信小程序 Canvas、node-canvas 等任意实现了 Canvas 2D API 的对象。\n */\n\nexport interface CanvasOptions {\n  /** 每个模块的像素大小，默认 10 */\n  moduleSize?: number\n  /** 静默区模块数，默认 4 */\n  quietZone?: number\n  /** 前景色，默认 '#000000' */\n  foreground?: string\n  /** 背景色，默认 '#ffffff' */\n  background?: string\n  /** 是否透明背景（忽略 background），默认 false */\n  transparent?: boolean\n}\n\n/**\n * 兼容各平台的最小 Canvas 接口\n * 仅要求 getContext('2d') 和可写的 width/height\n */\nexport interface CanvasLike {\n  width: number\n  height: number\n  getContext(type: '2d'): CanvasRenderingContext2DLike | null\n}\n\nexport interface CanvasRenderingContext2DLike {\n  fillStyle: string\n  fillRect(x: number, y: number, w: number, h: number): void\n  clearRect(x: number, y: number, w: number, h: number): void\n}\n\n/**\n * 将 QR 码矩阵绘制到 Canvas 上\n *\n * @returns 绘制后的画布像素尺寸\n */\nexport function toCanvas(\n  modules: boolean[][],\n  canvas: CanvasLike,\n  options?: CanvasOptions\n): { size: number } {\n  const {\n    moduleSize = 10,\n    quietZone = 4,\n    foreground = '#000000',\n    background = '#ffffff',\n    transparent = false\n  } = options ?? {}\n\n  const count = modules.length\n  const totalSize = (count + quietZone * 2) * moduleSize\n\n  canvas.width = totalSize\n  canvas.height = totalSize\n\n  const ctx = canvas.getContext('2d')\n  if (!ctx) {\n    throw new Error('Failed to get 2d context from canvas')\n  }\n\n  // 绘制背景\n  if (transparent) {\n    ctx.clearRect(0, 0, totalSize, totalSize)\n  } else {\n    ctx.fillStyle = background\n    ctx.fillRect(0, 0, totalSize, totalSize)\n  }\n\n  // 绘制二维码模块\n  ctx.fillStyle = foreground\n  for (let row = 0; row < count; row++) {\n    for (let col = 0; col < count; col++) {\n      if (modules[row][col]) {\n        ctx.fillRect(\n          (col + quietZone) * moduleSize,\n          (row + quietZone) * moduleSize,\n          moduleSize,\n          moduleSize\n        )\n      }\n    }\n  }\n\n  return { size: totalSize }\n}\n"],"mappings":";;;;;;AA0CA,SAAgB,SACd,SACA,QACA,SACkB;CAClB,MAAM,EACJ,aAAa,IACb,YAAY,GACZ,aAAa,WACb,aAAa,WACb,cAAc,UACZ,WAAW,EAAE;CAEjB,MAAM,QAAQ,QAAQ;CACtB,MAAM,aAAa,QAAQ,YAAY,KAAK;AAE5C,QAAO,QAAQ;AACf,QAAO,SAAS;CAEhB,MAAM,MAAM,OAAO,WAAW,KAAK;AACnC,KAAI,CAAC,IACH,OAAM,IAAI,MAAM,uCAAuC;AAIzD,KAAI,YACF,KAAI,UAAU,GAAG,GAAG,WAAW,UAAU;MACpC;AACL,MAAI,YAAY;AAChB,MAAI,SAAS,GAAG,GAAG,WAAW,UAAU;;AAI1C,KAAI,YAAY;AAChB,MAAK,IAAI,MAAM,GAAG,MAAM,OAAO,MAC7B,MAAK,IAAI,MAAM,GAAG,MAAM,OAAO,MAC7B,KAAI,QAAQ,KAAK,KACf,KAAI,UACD,MAAM,aAAa,aACnB,MAAM,aAAa,YACpB,YACA,WACD;AAKP,QAAO,EAAE,MAAM,WAAW"}