{"version":3,"file":"create-pic-pipeline.mjs","names":[],"sources":["../../src/helpers/create-pic-pipeline.ts"],"sourcesContent":["import { generatePairs } from '@4bitlabs/color/dithers';\nimport { softMixer, mixBy } from '@4bitlabs/color/mixers';\nimport {\n  CGA_PALETTE,\n  TRUE_CGA_PALETTE,\n  DGA_PALETTE,\n} from '@4bitlabs/color/palettes';\nimport { IBM5153Contrast, toGrayscale } from '@4bitlabs/color';\nimport {\n  createDitherFilter,\n  createPaletteFilter,\n  type ImageFilter,\n  type PixelFilter,\n  type RenderPipeline,\n} from '@4bitlabs/image';\nimport * as ResizeFilters from '@4bitlabs/resize-filters';\nimport * as BlurFilters from '@4bitlabs/blur-filters';\nimport type { RenderPipelineOptions } from '../models/render-pic-options.js';\nimport { crtFilter } from './apply-crt-filter.js';\n\nconst DEPTH_PALETTE = Uint32Array.of(\n  0xff000000,\n  0xff111111,\n  0xff222222,\n  0xff333333,\n  0xff444444,\n  0xff555555,\n  0xff666666,\n  0xff777777,\n\n  0xff888888,\n  0xff999999,\n  0xffaaaaaa,\n  0xffbbbbbb,\n  0xffcccccc,\n  0xffdddddd,\n  0xffeeeeee,\n  0xffffffff,\n);\n\nconst SCALER_MAPPING = {\n  '2x2': ResizeFilters.nearestNeighbor([2, 2]),\n  '3x3': ResizeFilters.nearestNeighbor([3, 3]),\n  '4x4': ResizeFilters.nearestNeighbor([4, 4]),\n  '5x5': ResizeFilters.nearestNeighbor([5, 5]),\n  '5x6': ResizeFilters.nearestNeighbor([5, 6]),\n  scale2x: ResizeFilters.scale2x,\n  scale3x: ResizeFilters.scale3x,\n  scale5x6: ResizeFilters.scale5x6,\n};\n\nconst BLUR_FILTER_MAPPING = {\n  box: BlurFilters.boxBlur,\n  hbox: BlurFilters.hBoxBlur,\n  hblur: BlurFilters.hBlur,\n  gauss: BlurFilters.gaussBlur,\n};\n\nexport function getScalerFromOptions(\n  key: keyof typeof SCALER_MAPPING | 'none',\n) {\n  return key !== 'none' && SCALER_MAPPING[key];\n}\n\nexport const createPrePipeline = (\n  options: RenderPipelineOptions,\n): (PixelFilter | false)[] => [getScalerFromOptions(options.preScaler)];\n\nexport function createPostPipeline(\n  options: RenderPipelineOptions,\n): (ImageFilter | false)[] {\n  const post: (ImageFilter | false)[] = [\n    getScalerFromOptions(options.postScaler),\n  ];\n\n  if (options.blur !== 'none' && options.blurAmount) {\n    const blurFilter = BLUR_FILTER_MAPPING[options.blur];\n    const blur = blurFilter(options.blurAmount);\n    post.push(blur);\n  }\n\n  if (options.crt) {\n    post.push(crtFilter);\n  }\n\n  return post;\n}\n\nexport function generatePalette(\n  options: Pick<RenderPipelineOptions, 'palette' | 'contrast' | 'grayscale'>,\n) {\n  const basePalette = {\n    cga: CGA_PALETTE,\n    'true-cga': TRUE_CGA_PALETTE,\n    dga: DGA_PALETTE,\n    depth: DEPTH_PALETTE,\n  }[options.palette];\n\n  const adjusted =\n    options.contrast !== false && options.contrast <= 1.0\n      ? IBM5153Contrast(basePalette, options.contrast)\n      : basePalette;\n\n  return options.grayscale ? toGrayscale(adjusted) : adjusted;\n}\n\nconst mixMode = 'CIE-XYZ';\n\nconst DITHER_STYLE = {\n  none: (pal: Uint32Array) => generatePairs(pal),\n  '10%': (pal: Uint32Array) => generatePairs(pal, mixBy(0.1, { mixMode })),\n  '15%': (pal: Uint32Array) => generatePairs(pal, mixBy(0.15, { mixMode })),\n  '25%': (pal: Uint32Array) => generatePairs(pal, mixBy(0.25, { mixMode })),\n  '50%': (pal: Uint32Array) => generatePairs(pal, mixBy(0.5, { mixMode })),\n  soft: (pal: Uint32Array) => generatePairs(pal, softMixer({ mixMode })),\n};\n\nexport function createPicPipeline(\n  layer: 'visible' | 'control' | 'priority',\n  options: RenderPipelineOptions,\n): RenderPipeline {\n  const palette = generatePalette(options);\n  const pairs = DITHER_STYLE[options.paletteMixer](generatePalette(options));\n\n  const render =\n    layer === 'visible'\n      ? createDitherFilter(pairs, options.dither)\n      : createPaletteFilter(palette);\n\n  return {\n    pre: createPrePipeline(options),\n    render,\n    post: createPostPipeline(options),\n  };\n}\n"],"mappings":";;;;;;;;;AAoBA,MAAM,gBAAgB,YAAY,GAChC,YACA,YACA,YACA,YACA,YACA,YACA,YACA,YAEA,YACA,YACA,YACA,YACA,YACA,YACA,YACA,UACF;AAEA,MAAM,iBAAiB;CACrB,OAAO,cAAc,gBAAgB,CAAC,GAAG,CAAC,CAAC;CAC3C,OAAO,cAAc,gBAAgB,CAAC,GAAG,CAAC,CAAC;CAC3C,OAAO,cAAc,gBAAgB,CAAC,GAAG,CAAC,CAAC;CAC3C,OAAO,cAAc,gBAAgB,CAAC,GAAG,CAAC,CAAC;CAC3C,OAAO,cAAc,gBAAgB,CAAC,GAAG,CAAC,CAAC;CAC3C,SAAS,cAAc;CACvB,SAAS,cAAc;CACvB,UAAU,cAAc;AAC1B;AAEA,MAAM,sBAAsB;CAC1B,KAAK,YAAY;CACjB,MAAM,YAAY;CAClB,OAAO,YAAY;CACnB,OAAO,YAAY;AACrB;AAEA,SAAgB,qBACd,KACA;CACA,OAAO,QAAQ,UAAU,eAAe;AAC1C;AAEA,MAAa,qBACX,YAC4B,CAAC,qBAAqB,QAAQ,SAAS,CAAC;AAEtE,SAAgB,mBACd,SACyB;CACzB,MAAM,OAAgC,CACpC,qBAAqB,QAAQ,UAAU,CACzC;CAEA,IAAI,QAAQ,SAAS,UAAU,QAAQ,YAAY;EACjD,MAAM,aAAa,oBAAoB,QAAQ;EAC/C,MAAM,OAAO,WAAW,QAAQ,UAAU;EAC1C,KAAK,KAAK,IAAI;CAChB;CAEA,IAAI,QAAQ,KACV,KAAK,KAAK,SAAS;CAGrB,OAAO;AACT;AAEA,SAAgB,gBACd,SACA;CACA,MAAM,cAAc;EAClB,KAAK;EACL,YAAY;EACZ,KAAK;EACL,OAAO;CACT,EAAE,QAAQ;CAEV,MAAM,WACJ,QAAQ,aAAa,SAAS,QAAQ,YAAY,IAC9C,gBAAgB,aAAa,QAAQ,QAAQ,IAC7C;CAEN,OAAO,QAAQ,YAAY,YAAY,QAAQ,IAAI;AACrD;AAEA,MAAM,UAAU;AAEhB,MAAM,eAAe;CACnB,OAAO,QAAqB,cAAc,GAAG;CAC7C,QAAQ,QAAqB,cAAc,KAAK,MAAM,IAAK,EAAE,QAAQ,CAAC,CAAC;CACvE,QAAQ,QAAqB,cAAc,KAAK,MAAM,KAAM,EAAE,QAAQ,CAAC,CAAC;CACxE,QAAQ,QAAqB,cAAc,KAAK,MAAM,KAAM,EAAE,QAAQ,CAAC,CAAC;CACxE,QAAQ,QAAqB,cAAc,KAAK,MAAM,IAAK,EAAE,QAAQ,CAAC,CAAC;CACvE,OAAO,QAAqB,cAAc,KAAK,UAAU,EAAE,QAAQ,CAAC,CAAC;AACvE;AAEA,SAAgB,kBACd,OACA,SACgB;CAChB,MAAM,UAAU,gBAAgB,OAAO;CACvC,MAAM,QAAQ,aAAa,QAAQ,aAAa,CAAC,gBAAgB,OAAO,CAAC;CAEzE,MAAM,SACJ,UAAU,YACN,mBAAmB,OAAO,QAAQ,MAAM,IACxC,oBAAoB,OAAO;CAEjC,OAAO;EACL,KAAK,kBAAkB,OAAO;EAC9B;EACA,MAAM,mBAAmB,OAAO;CAClC;AACF"}