{"version":3,"sources":["../src/transform/resize.ts","../src/transform/alpha.ts","../src/transform/index.ts"],"names":["scale","tw","th","TransformError","createCanvas"],"mappings":"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","file":"chunk-JHRD5EOX.cjs","sourcesContent":["import type { ResizeOptions } from '../types.js';\n\nimport { TransformError } from '../errors.js';\nimport { createCanvas } from './canvas.js';\n\ntype AnyCanvas = HTMLCanvasElement | OffscreenCanvas;\n\ninterface DrawParams {\n  /** Destination width */\n  dw: number;\n  /** Destination height */\n  dh: number;\n  /** Source x offset */\n  sx: number;\n  /** Source y offset */\n  sy: number;\n  /** Source width */\n  sw: number;\n  /** Source height */\n  sh: number;\n}\n\n/**\n * Compute resize dimensions based on fit strategy.\n * Exported for testing and UI preview calculations.\n */\nexport function computeDimensions(\n  srcW: number,\n  srcH: number,\n  opts: ResizeOptions,\n): DrawParams {\n  const targetW = opts.width ?? 0;\n  const targetH = opts.height ?? 0;\n  const fit = opts.fit ?? 'contain';\n\n  // No resize requested\n  if (!targetW && !targetH) {\n    return { dw: srcW, dh: srcH, sx: 0, sy: 0, sw: srcW, sh: srcH };\n  }\n\n  if (fit === 'fill') {\n    return {\n      dw: targetW || srcW,\n      dh: targetH || srcH,\n      sx: 0,\n      sy: 0,\n      sw: srcW,\n      sh: srcH,\n    };\n  }\n\n  if (fit === 'cover') {\n    const outW = targetW || srcW;\n    const outH = targetH || srcH;\n    const scale = Math.max(outW / srcW, outH / srcH);\n    const cropW = outW / scale;\n    const cropH = outH / scale;\n    return {\n      dw: outW,\n      dh: outH,\n      sx: (srcW - cropW) / 2,\n      sy: (srcH - cropH) / 2,\n      sw: cropW,\n      sh: cropH,\n    };\n  }\n\n  if (fit === 'inside') {\n    // Scale down only — never upscale\n    const tw = targetW || Infinity;\n    const th = targetH || Infinity;\n    const scale = Math.min(tw / srcW, th / srcH, 1);\n    return {\n      dw: Math.round(srcW * scale),\n      dh: Math.round(srcH * scale),\n      sx: 0,\n      sy: 0,\n      sw: srcW,\n      sh: srcH,\n    };\n  }\n\n  if (fit === 'outside') {\n    // Scale to fill at least the target box\n    const tw = targetW || 0;\n    const th = targetH || 0;\n    const scale = Math.max(tw / srcW, th / srcH);\n    return {\n      dw: Math.round(srcW * scale),\n      dh: Math.round(srcH * scale),\n      sx: 0,\n      sy: 0,\n      sw: srcW,\n      sh: srcH,\n    };\n  }\n\n  // Default: contain — scale to fit within target, preserving aspect ratio\n  const tw = targetW || Infinity;\n  const th = targetH || Infinity;\n  const scale = Math.min(tw / srcW, th / srcH, 1);\n  return {\n    dw: Math.round(srcW * scale),\n    dh: Math.round(srcH * scale),\n    sx: 0,\n    sy: 0,\n    sw: srcW,\n    sh: srcH,\n  };\n}\n\n/**\n * Resize an ImageBitmap or Canvas to target dimensions.\n * Returns a new Canvas with the resized image.\n *\n * @throws {TransformError} if the canvas dimensions exceed browser limits\n */\nexport function resize(\n  source: ImageBitmap | AnyCanvas,\n  opts: ResizeOptions,\n): AnyCanvas {\n  const srcW = source.width;\n  const srcH = source.height;\n  const { dw, dh, sx, sy, sw, sh } = computeDimensions(srcW, srcH, opts);\n\n  // Guard against absurdly large canvas\n  const MAX_CANVAS = 16384;\n  if (dw > MAX_CANVAS || dh > MAX_CANVAS) {\n    throw new TransformError(\n      'CANVAS_TOO_LARGE',\n      `Resize target ${dw}×${dh} exceeds maximum canvas size of ${MAX_CANVAS}px`,\n    );\n  }\n\n  const canvas = createCanvas(dw, dh);\n  const ctx = canvas.getContext('2d') as\n    | CanvasRenderingContext2D\n    | OffscreenCanvasRenderingContext2D;\n\n  if (!ctx) {\n    throw new TransformError('RESIZE_FAILED', 'Failed to get 2D context for resize canvas');\n  }\n\n  ctx.drawImage(source as CanvasImageSource, sx, sy, sw, sh, 0, 0, dw, dh);\n\n  return canvas;\n}\n","import type { FormatMeta } from '../types.js';\n\nimport { createCanvas } from './canvas.js';\n\ntype AnyCanvas = HTMLCanvasElement | OffscreenCanvas;\n\n/**\n * Composite an image onto a white background.\n * Required for formats that don't support transparency (JPEG, BMP).\n *\n * If the target format supports transparency, returns the original canvas unchanged.\n */\nexport function compositeAlpha(\n  canvas: AnyCanvas,\n  meta: FormatMeta,\n): AnyCanvas {\n  if (!meta.requiresAlphaCompositing) return canvas;\n\n  const w = 'width' in canvas ? canvas.width : 0;\n  const h = 'height' in canvas ? canvas.height : 0;\n  const out = createCanvas(w, h);\n  const ctx = out.getContext('2d') as\n    | CanvasRenderingContext2D\n    | OffscreenCanvasRenderingContext2D;\n\n  if (!ctx) return canvas;\n\n  ctx.fillStyle = '#FFFFFF';\n  ctx.fillRect(0, 0, w, h);\n  ctx.drawImage(canvas as CanvasImageSource, 0, 0);\n\n  return out;\n}\n","import type { ResizeOptions, FormatMeta } from '../types.js';\n\nimport { TransformError } from '../errors.js';\nimport { createCanvas } from './canvas.js';\nimport { resize } from './resize.js';\nimport { compositeAlpha } from './alpha.js';\n\ntype AnyCanvas = HTMLCanvasElement | OffscreenCanvas;\n\n/**\n * Full transform: ImageBitmap → Canvas with optional resize + alpha compositing.\n *\n * @param bitmap  - Decoded ImageBitmap from the HEIC decoder\n * @param meta    - Encoder metadata (used to determine alpha compositing needs)\n * @param resizeOpts - Optional resize config\n * @returns A ready-to-encode Canvas\n */\nexport function toCanvas(\n  bitmap: ImageBitmap,\n  meta: FormatMeta,\n  resizeOpts?: ResizeOptions,\n): AnyCanvas {\n  let canvas: AnyCanvas;\n\n  // Step 1: Resize if requested, otherwise draw bitmap to canvas 1:1\n  if (resizeOpts?.width || resizeOpts?.height) {\n    canvas = resize(bitmap, resizeOpts);\n  } else {\n    canvas = createCanvas(bitmap.width, bitmap.height);\n    const ctx = canvas.getContext('2d') as\n      | CanvasRenderingContext2D\n      | OffscreenCanvasRenderingContext2D;\n\n    if (!ctx) {\n      throw new TransformError('RESIZE_FAILED', 'Failed to get 2D context');\n    }\n\n    ctx.drawImage(bitmap, 0, 0);\n  }\n\n  // Step 2: Alpha → white compositing (for JPEG, BMP, etc.)\n  canvas = compositeAlpha(canvas, meta);\n\n  // Clean up the source bitmap\n  bitmap.close();\n\n  return canvas;\n}\n\nexport { createCanvas, canvasToBlob } from './canvas.js';\nexport { resize } from './resize.js';\nexport { compositeAlpha } from './alpha.js';\n"]}