{"version":3,"file":"pic-render-action.mjs","names":[],"sources":["../../src/actions/pic-render-action.ts"],"sourcesContent":["import type { Command } from 'commander';\nimport sharp, { type Sharp } from 'sharp';\n\nimport { decompress, parsePic } from '@4bitlabs/sci0';\nimport { renderPic } from '@4bitlabs/sci0-renderer';\nimport { renderPixelData } from '@4bitlabs/image';\nimport { picMatcher } from '../helpers/resource-matchers.js';\nimport { loadContentFromMap } from './load-content-from-map.js';\nimport type {\n  RenderPicOptions,\n  RenderPipelineOptions,\n} from '../models/render-pic-options.js';\nimport { pickRenderOptions } from './pick-render-options.js';\nimport { getRootOptions } from './get-root-options.js';\nimport { createPicPipeline } from '../helpers/create-pic-pipeline.js';\n\nconst FORMAT_MAPPING = {\n  png: (source: Sharp) => source.png().toBuffer(),\n  jpg: (source: Sharp) => source.jpeg().toBuffer(),\n  webp: (source: Sharp) => source.webp().toBuffer(),\n  raw: (source: Sharp) => source.raw().toBuffer(),\n};\n\ninterface PicRenderActionOptions {\n  readonly output: string;\n}\n\nexport async function picRenderAction(\n  id: number,\n  options: PicRenderActionOptions & RenderPicOptions & RenderPipelineOptions,\n  cmd: Command,\n) {\n  const { root, engine } = getRootOptions(cmd);\n  const [picOptions, renderOptions] = pickRenderOptions(options);\n  const {\n    format,\n    forcePal,\n    layer,\n    output: outfile = `pic.${id.toString(10).padStart(3, '0')}.${format}`,\n  } = picOptions;\n\n  const [header, compressed] = await loadContentFromMap(root, picMatcher(id));\n  const picData = decompress(engine, header.compression, compressed);\n  const pic = parsePic(picData, { defer: true });\n\n  const layers = renderPic(pic, { forcePal: forcePal });\n\n  const pipeline = createPicPipeline(layer, renderOptions);\n  const { data, width, height } = renderPixelData(layers[layer], pipeline);\n\n  const image = sharp(data, { raw: { width, height, channels: 4 } });\n\n  if (outfile === '-') {\n    process.stdout.write(await FORMAT_MAPPING[format](image));\n  } else {\n    await image.toFile(outfile);\n  }\n}\n"],"mappings":";;;;;;;;;;AAgBA,MAAM,iBAAiB;CACrB,MAAM,WAAkB,OAAO,IAAI,CAAC,CAAC,SAAS;CAC9C,MAAM,WAAkB,OAAO,KAAK,CAAC,CAAC,SAAS;CAC/C,OAAO,WAAkB,OAAO,KAAK,CAAC,CAAC,SAAS;CAChD,MAAM,WAAkB,OAAO,IAAI,CAAC,CAAC,SAAS;AAChD;AAMA,eAAsB,gBACpB,IACA,SACA,KACA;CACA,MAAM,EAAE,MAAM,WAAW,eAAe,GAAG;CAC3C,MAAM,CAAC,YAAY,iBAAiB,kBAAkB,OAAO;CAC7D,MAAM,EACJ,QACA,UACA,OACA,QAAQ,UAAU,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG,EAAE,GAAG,aAC3D;CAEJ,MAAM,CAAC,QAAQ,cAAc,MAAM,mBAAmB,MAAM,WAAW,EAAE,CAAC;CAC1E,MAAM,UAAU,WAAW,QAAQ,OAAO,aAAa,UAAU;CACjE,MAAM,MAAM,SAAS,SAAS,EAAE,OAAO,KAAK,CAAC;CAE7C,MAAM,SAAS,UAAU,KAAK,EAAY,SAAS,CAAC;CAEpD,MAAM,WAAW,kBAAkB,OAAO,aAAa;CACvD,MAAM,EAAE,MAAM,OAAO,WAAW,gBAAgB,OAAO,QAAQ,QAAQ;CAEvE,MAAM,QAAQ,MAAM,MAAM,EAAE,KAAK;EAAE;EAAO;EAAQ,UAAU;CAAE,EAAE,CAAC;CAEjE,IAAI,YAAY,KACd,QAAQ,OAAO,MAAM,MAAM,eAAe,OAAO,CAAC,KAAK,CAAC;MAExD,MAAM,MAAM,OAAO,OAAO;AAE9B"}