{"version":3,"sources":["../../src/encode/ppm.ts"],"names":[],"mappings":";;;AAEO,IAAM,IAAA,GAAmB;AAAA,EAC9B,GAAA,EAAK,KAAA;AAAA,EACL,SAAS,EAAC;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,yBAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,mBAAA,EAAqB,KAAA;AAAA,EACrB,eAAA,EAAiB,MAAA;AAAA,EACjB,cAAA,EAAgB,IAAA;AAAA,EAChB,YAAA,EAAc,IAAA;AAAA,EACd,WAAA,EAAa,wCAAA;AAAA,EACb,wBAAA,EAA0B,IAAA;AAAA,EAC1B,oBAAA,EAAsB;AACxB;AAMA,eAAsB,MAAA,CACpB,QACA,QAAA,EACe;AACf,EAAA,MAAM,IAAI,MAAA,CAAO,KAAA;AACjB,EAAA,MAAM,IAAI,MAAA,CAAO,MAAA;AAEjB,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAIlC,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,2CAA2C,CAAA;AAErE,EAAA,MAAM,YAAY,GAAA,CAAI,YAAA,CAAa,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAC7C,EAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AAGvB,EAAA,MAAM,MAAA,GAAS,CAAA;AAAA,EAAO,CAAC,IAAI,CAAC;AAAA;AAAA,CAAA;AAC5B,EAAA,MAAM,WAAA,GAAc,IAAI,WAAA,EAAY,CAAE,OAAO,MAAM,CAAA;AAGnD,EAAA,MAAM,aAAa,CAAA,GAAI,CAAA;AACvB,EAAA,MAAM,GAAA,GAAM,IAAI,UAAA,CAAW,UAAA,GAAa,CAAC,CAAA;AAEzC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,IAAA,GAAA,CAAI,CAAA,GAAI,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,CAAC,CAAA;AACvB,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI,CAAC,IAAI,IAAA,CAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAC/B,IAAA,GAAA,CAAI,IAAI,CAAA,GAAI,CAAC,IAAI,IAAA,CAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,WAAA,EAAa,GAAG,GAAG,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AACzD","file":"ppm.cjs","sourcesContent":["import type { FormatMeta, EncodeOptions } from '../types.js';\n\nexport const meta: FormatMeta = {\n  key: 'ppm',\n  aliases: [],\n  label: 'PPM',\n  mime: 'image/x-portable-pixmap',\n  ext: 'ppm',\n  supportsCompression: false,\n  compressionType: 'none',\n  defaultQuality: null,\n  qualityRange: null,\n  qualityHint: 'Raw pixel format — no compression',\n  requiresAlphaCompositing: true,\n  supportsTransparency: false,\n};\n\n/**\n * Encode a Canvas to PPM (P6 binary format).\n * Manual encoder — no dependencies, ~30 lines.\n */\nexport async function encode(\n  canvas: HTMLCanvasElement | OffscreenCanvas,\n  _options?: EncodeOptions,\n): Promise<Blob> {\n  const w = canvas.width;\n  const h = canvas.height;\n\n  const ctx = canvas.getContext('2d') as\n    | CanvasRenderingContext2D\n    | OffscreenCanvasRenderingContext2D;\n\n  if (!ctx) throw new Error('Failed to get 2D context for PPM encoding');\n\n  const imageData = ctx.getImageData(0, 0, w, h);\n  const rgba = imageData.data;\n\n  // P6 header: \"P6\\n{width} {height}\\n255\\n\"\n  const header = `P6\\n${w} ${h}\\n255\\n`;\n  const headerBytes = new TextEncoder().encode(header);\n\n  // RGB pixels (drop alpha channel)\n  const pixelCount = w * h;\n  const rgb = new Uint8Array(pixelCount * 3);\n\n  for (let i = 0; i < pixelCount; i++) {\n    rgb[i * 3] = rgba[i * 4]!;     // R\n    rgb[i * 3 + 1] = rgba[i * 4 + 1]!; // G\n    rgb[i * 3 + 2] = rgba[i * 4 + 2]!; // B\n  }\n\n  return new Blob([headerBytes, rgb], { type: meta.mime });\n}\n"]}