{"version":3,"sources":["../../src/encode/gif.ts"],"names":["normalizeQuality","quantize","applyPalette","GIFEncoder"],"mappings":";;;;;AAMO,IAAM,IAAA,GAAmB;AAAA,EAC9B,GAAA,EAAK,KAAA;AAAA,EACL,SAAS,EAAC;AAAA,EACV,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,WAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,mBAAA,EAAqB,IAAA;AAAA,EACrB,eAAA,EAAiB,SAAA;AAAA,EACjB,cAAA,EAAgB,GAAA;AAAA,EAChB,YAAA,EAAc,CAAC,CAAA,EAAG,GAAG,CAAA;AAAA,EACrB,WAAA,EAAa,uDAAA;AAAA,EACb,wBAAA,EAA0B,KAAA;AAAA,EAC1B,oBAAA,EAAsB;AACxB;AAMA,eAAsB,MAAA,CACpB,QACA,OAAA,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,YAAYA,kCAAA,CAAiB,KAAA,EAAO,OAAA,EAAS,OAAA,IAAW,KAAK,cAAe,CAAA;AAElF,EAAA,MAAM,OAAA,GAAUC,eAAA,CAAS,IAAA,EAAM,SAAS,CAAA;AACxC,EAAA,MAAM,KAAA,GAAQC,mBAAA,CAAa,IAAA,EAAM,OAAO,CAAA;AAExC,EAAA,MAAM,MAAMC,iBAAA,EAAW;AACvB,EAAA,GAAA,CAAI,WAAW,KAAA,EAAO,CAAA,EAAG,CAAA,EAAG,EAAE,SAAS,CAAA;AACvC,EAAA,GAAA,CAAI,MAAA,EAAO;AAEX,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,GAAA,CAAI,KAAA,EAAM,CAAE,MAAqB,CAAA,EAAG,EAAE,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,CAAA;AAC1E","file":"gif.cjs","sourcesContent":["import type { FormatMeta, EncodeOptions } from '../types.js';\n\nimport { GIFEncoder, quantize, applyPalette } from 'gifenc';\n\nimport { normalizeQuality } from '../compression/normalize.js';\n\nexport const meta: FormatMeta = {\n  key: 'gif',\n  aliases: [],\n  label: 'GIF',\n  mime: 'image/gif',\n  ext: 'gif',\n  supportsCompression: true,\n  compressionType: 'palette',\n  defaultQuality: 100,\n  qualityRange: [1, 100],\n  qualityHint: 'Controls palette size: 100 = 256 colors, 1 = 2 colors',\n  requiresAlphaCompositing: false,\n  supportsTransparency: true,\n};\n\n/**\n * Encode a Canvas to GIF using gifenc.\n * Quality 0-100 controls palette size (2-256 colors).\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 GIF encoding');\n\n  const imageData = ctx.getImageData(0, 0, w, h);\n  const rgba = imageData.data;\n\n  // normalizeQuality returns maxColors (2-256) for GIF\n  const maxColors = normalizeQuality('gif', options?.quality ?? meta.defaultQuality!) as number;\n\n  const palette = quantize(rgba, maxColors);\n  const index = applyPalette(rgba, palette);\n\n  const gif = GIFEncoder();\n  gif.writeFrame(index, w, h, { palette });\n  gif.finish();\n\n  return new Blob([gif.bytes().buffer as ArrayBuffer], { type: meta.mime });\n}\n"]}