@opendisplay/epaper-dithering 2.2.1 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +46 -23
- package/dist/index.cjs +158 -380
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +31 -16
- package/dist/index.d.ts +31 -16
- package/dist/index.js +158 -381
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/enums.ts","../src/color_space.ts","../src/color_space_lab.ts","../src/tone_map.ts","../src/palettes.ts","../src/algorithms.ts","../src/core.ts","../src/index.ts"],"names":["DitherMode","ColorScheme"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dithering algorithm modes\n * Values match firmware conventions (0-8)\n */\nexport enum DitherMode {\n NONE = 0,\n BURKES = 1,\n ORDERED = 2,\n FLOYD_STEINBERG = 3,\n ATKINSON = 4,\n STUCKI = 5,\n SIERRA = 6,\n SIERRA_LITE = 7,\n JARVIS_JUDICE_NINKE = 8,\n}","/**\n * sRGB ↔ linear RGB conversion (IEC 61966-2-1).\n *\n * Key optimization: SRGB_TO_LINEAR_LUT is a 256-entry lookup table built once\n * at module load. Since input pixels are always integers 0–255 (Uint8ClampedArray),\n * conversion is a single array index — no Math.pow per pixel.\n */\n\n// 256-entry LUT: index = sRGB byte value, value = linear [0, 1]\nexport const SRGB_TO_LINEAR_LUT: Float64Array = (() => {\n const lut = new Float64Array(256);\n for (let i = 0; i < 256; i++) {\n const s = i / 255.0;\n lut[i] = s <= 0.04045 ? s / 12.92 : Math.pow((s + 0.055) / 1.055, 2.4);\n }\n return lut;\n})();\n\n/**\n * Convert a single linear [0, 1] value to a rounded sRGB byte [0, 255].\n * Only needed for palette color encoding — not called per pixel.\n */\nexport function linearToSrgbByte(v: number): number {\n const s = v <= 0.0031308 ? v * 12.92 : 1.055 * Math.pow(v, 1.0 / 2.4) - 0.055;\n return Math.max(0, Math.min(255, Math.round(s * 255)));\n}\n","/**\n * CIELAB color space conversion and LCH-weighted color matching.\n *\n * Why LCH weighting for dithering:\n * Error diffusion compensates for lightness errors spatially (mixing pixels),\n * but CANNOT compensate for hue errors. So hue must be matched accurately on\n * the first try. Weights: WL=0.5 (de-emphasized), WC=1.0, WH=2.0 (emphasized).\n *\n * Uses the CIE identity: da² + db² = dC² + dH²\n * This decomposes a·b plane distance into chroma+hue without atan2/angle wrapping.\n */\n\n// sRGB → XYZ matrix (D65 illuminant) — Brucelindbloom\n// Stored as scalar constants to avoid array indexing overhead in hot path\nconst M00 = 0.4124564, M01 = 0.3575761, M02 = 0.1804375;\nconst M10 = 0.2126729, M11 = 0.7151522, M12 = 0.0721750;\nconst M20 = 0.0193339, M21 = 0.1191920, M22 = 0.9503041;\n\n// D65 white point\nconst XN = 0.95047, YN = 1.00000, ZN = 1.08883;\n\n// CIE LAB transfer function constants\nconst EPSILON = 216.0 / 24389.0; // 0.008856...\nconst KAPPA = 24389.0 / 27.0; // 903.296...\n\n// LCH distance weights — pre-squared to eliminate squaring in inner loop\n// WL=0.5 → WL²=0.25, WC=1.0 → WC²=1.0, WH=2.0 → WH²=4.0\nconst WL2 = 0.25;\nconst WC2 = 1.0;\nconst WH2 = 4.0;\n\nfunction labF(t: number): number {\n return t > EPSILON ? Math.cbrt(t) : (KAPPA * t + 16.0) / 116.0;\n}\n\n/** Convert linear RGB [0,1] to CIELAB. Inlined XYZ multiply for speed. */\nfunction rgbToLabScalar(r: number, g: number, b: number): [number, number, number] {\n const x = M00 * r + M01 * g + M02 * b;\n const y = M10 * r + M11 * g + M12 * b;\n const z = M20 * r + M21 * g + M22 * b;\n\n const fx = labF(x / XN);\n const fy = labF(y / YN);\n const fz = labF(z / ZN);\n\n return [116.0 * fy - 16.0, 500.0 * (fx - fy), 200.0 * (fy - fz)];\n}\n\n/** Pre-computed palette LAB components for the error diffusion inner loop. */\nexport interface PaletteLabArrays {\n L: Float64Array;\n a: Float64Array;\n b: Float64Array;\n C: Float64Array; // chroma = sqrt(a² + b²)\n}\n\n/**\n * Pre-compute palette LAB components before the dithering loop.\n * Call once per ditherImage call, then pass results to matchPixelLch.\n */\nexport function precomputePaletteLab(\n paletteLinear: Array<[number, number, number]>,\n): PaletteLabArrays {\n const n = paletteLinear.length;\n const L = new Float64Array(n);\n const a = new Float64Array(n);\n const b = new Float64Array(n);\n const C = new Float64Array(n);\n\n for (let i = 0; i < n; i++) {\n const [pl, pa, pb] = rgbToLabScalar(paletteLinear[i][0], paletteLinear[i][1], paletteLinear[i][2]);\n L[i] = pl;\n a[i] = pa;\n b[i] = pb;\n C[i] = Math.sqrt(pa * pa + pb * pb);\n }\n\n return { L, a, b, C };\n}\n\n/**\n * Find the closest palette color for a single pixel using LCH-weighted LAB distance.\n *\n * Pure scalar arithmetic — no object allocation, no array creation.\n * This is the innermost hot loop; called once per pixel.\n */\nexport function matchPixelLch(\n r: number,\n g: number,\n b: number,\n paletteL: Float64Array,\n paletteA: Float64Array,\n paletteB: Float64Array,\n paletteC: Float64Array,\n): number {\n const [pL, pa, pb] = rgbToLabScalar(r, g, b);\n const pC = Math.sqrt(pa * pa + pb * pb);\n\n let bestIdx = 0;\n let bestDist = Infinity;\n const n = paletteL.length;\n\n for (let i = 0; i < n; i++) {\n const dL = pL - paletteL[i];\n const da = pa - paletteA[i];\n const db = pb - paletteB[i];\n const dC = pC - paletteC[i];\n let dHsq = da * da + db * db - dC * dC;\n if (dHsq < 0.0) dHsq = 0.0;\n\n const dist = WL2 * dL * dL + WC2 * dC * dC + WH2 * dHsq;\n if (dist < bestDist) {\n bestDist = dist;\n bestIdx = i;\n }\n }\n\n return bestIdx;\n}\n","/**\n * Dynamic range compression for measured e-paper palettes.\n *\n * Real e-paper displays reflect much less light than pure sRGB colors suggest.\n * Measured white is ~185,202,205 vs pure 255,255,255 — a significant dynamic\n * range reduction. Compressing the image into the display's actual range before\n * dithering reduces large quantization errors at highlights and shadows.\n *\n * Only applied when using measured ColorPalette instances, never for ColorScheme enums.\n */\n\n// ITU-R BT.709 / sRGB luminance coefficients\nconst LUM_R = 0.2126729;\nconst LUM_G = 0.7151522;\nconst LUM_B = 0.0721750;\n\n/**\n * Compress image dynamic range to match display capabilities.\n *\n * Remaps pixel luminance from [0, 1] to the display's actual [black_Y, white_Y],\n * scaling RGB channels proportionally to preserve hue.\n *\n * @param pixels - Linear RGB flat buffer [r,g,b, r,g,b, ...], modified in-place\n * @param width - Image width\n * @param height - Image height\n * @param paletteLinear - Palette in linear RGB: index 0 = black, index 1 = white\n * @param strength - Blend factor: 0.0 = no compression, 1.0 = full compression\n */\nexport function compressDynamicRange(\n pixels: Float32Array,\n width: number,\n height: number,\n paletteLinear: Array<[number, number, number]>,\n strength: number = 1.0,\n): void {\n if (strength <= 0.0) return;\n\n const [br, bg, bb] = paletteLinear[0];\n const [wr, wg, wb] = paletteLinear[1];\n const blackY = LUM_R * br + LUM_G * bg + LUM_B * bb;\n const whiteY = LUM_R * wr + LUM_G * wg + LUM_B * wb;\n const displayRange = whiteY - blackY;\n if (displayRange <= 0) return;\n\n const n = width * height;\n const blackLevel = blackY * strength;\n\n for (let i = 0; i < n; i++) {\n const base = i * 3;\n const r = pixels[base];\n const g = pixels[base + 1];\n const b = pixels[base + 2];\n const Y = LUM_R * r + LUM_G * g + LUM_B * b;\n\n if (Y > 1e-6) {\n const compressedY = blackY + Y * displayRange;\n const targetY = strength < 1.0 ? Y + strength * (compressedY - Y) : compressedY;\n const scale = targetY / Y;\n pixels[base] = Math.max(0, Math.min(1, r * scale));\n pixels[base + 1] = Math.max(0, Math.min(1, g * scale));\n pixels[base + 2] = Math.max(0, Math.min(1, b * scale));\n } else {\n pixels[base] = blackLevel;\n pixels[base + 1] = blackLevel;\n pixels[base + 2] = blackLevel;\n }\n }\n}\n\n/**\n * Auto-levels dynamic range compression fitted to the image's actual content.\n *\n * Uses 2nd/98th percentile luminance to ignore outliers, maximizing contrast\n * within the display's capabilities. Falls back to full compressDynamicRange\n * for uniform images.\n *\n * @param pixels - Linear RGB flat buffer, modified in-place\n * @param width - Image width\n * @param height - Image height\n * @param paletteLinear - Palette in linear RGB: index 0 = black, index 1 = white\n */\nexport function autoCompressDynamicRange(\n pixels: Float32Array,\n width: number,\n height: number,\n paletteLinear: Array<[number, number, number]>,\n): void {\n const [br, bg, bb] = paletteLinear[0];\n const [wr, wg, wb] = paletteLinear[1];\n const blackY = LUM_R * br + LUM_G * bg + LUM_B * bb;\n const whiteY = LUM_R * wr + LUM_G * wg + LUM_B * wb;\n const displayRange = whiteY - blackY;\n if (displayRange <= 0) return;\n\n const n = width * height;\n\n // First pass: compute per-pixel luminance\n const luminances = new Float32Array(n);\n for (let i = 0; i < n; i++) {\n const base = i * 3;\n luminances[i] = LUM_R * pixels[base] + LUM_G * pixels[base + 1] + LUM_B * pixels[base + 2];\n }\n\n // Sort to find percentiles\n luminances.sort();\n const pLow = luminances[Math.floor(n * 0.02)];\n const pHigh = luminances[Math.floor(n * 0.98)];\n const imageRange = pHigh - pLow;\n\n if (imageRange < 1e-6) {\n // Uniform image: fall back to standard linear compression\n compressDynamicRange(pixels, width, height, paletteLinear, 1.0);\n return;\n }\n\n // Second pass: remap [pLow, pHigh] → [blackY, whiteY]\n for (let i = 0; i < n; i++) {\n const base = i * 3;\n const r = pixels[base];\n const g = pixels[base + 1];\n const b = pixels[base + 2];\n const Y = LUM_R * r + LUM_G * g + LUM_B * b;\n\n if (Y > 1e-6) {\n const normalizedY = (Y - pLow) / imageRange;\n const targetY = blackY + normalizedY * displayRange;\n const scale = targetY / Y;\n pixels[base] = Math.max(0, Math.min(1, r * scale));\n pixels[base + 1] = Math.max(0, Math.min(1, g * scale));\n pixels[base + 2] = Math.max(0, Math.min(1, b * scale));\n } else {\n pixels[base] = blackY;\n pixels[base + 1] = blackY;\n pixels[base + 2] = blackY;\n }\n }\n}\n","import type { ColorPalette } from './types';\n\n/**\n * E-paper display color schemes\n * Values match firmware conventions (0-7)\n */\nexport enum ColorScheme {\n MONO = 0,\n BWR = 1,\n BWY = 2,\n BWRY = 3,\n BWGBRY = 4,\n GRAYSCALE_4 = 5,\n GRAYSCALE_8 = 6,\n GRAYSCALE_16 = 7,\n}\n\nconst PALETTES: Record<ColorScheme, ColorPalette> = {\n [ColorScheme.MONO]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n [ColorScheme.BWR]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n red: { r: 255, g: 0, b: 0 },\n },\n accent: 'red',\n },\n [ColorScheme.BWY]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n yellow: { r: 255, g: 255, b: 0 },\n },\n accent: 'yellow',\n },\n [ColorScheme.BWRY]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n yellow: { r: 255, g: 255, b: 0 },\n red: { r: 255, g: 0, b: 0 },\n },\n accent: 'red',\n },\n [ColorScheme.BWGBRY]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n yellow: { r: 255, g: 255, b: 0 },\n red: { r: 255, g: 0, b: 0 },\n blue: { r: 0, g: 0, b: 255 },\n green: { r: 0, g: 255, b: 0 },\n },\n accent: 'red',\n },\n [ColorScheme.GRAYSCALE_4]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n gray1: { r: 85, g: 85, b: 85 },\n gray2: { r: 170, g: 170, b: 170 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n [ColorScheme.GRAYSCALE_8]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n gray1: { r: 36, g: 36, b: 36 },\n gray2: { r: 73, g: 73, b: 73 },\n gray3: { r: 109, g: 109, b: 109 },\n gray4: { r: 146, g: 146, b: 146 },\n gray5: { r: 182, g: 182, b: 182 },\n gray6: { r: 219, g: 219, b: 219 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n [ColorScheme.GRAYSCALE_16]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n gray1: { r: 17, g: 17, b: 17 },\n gray2: { r: 34, g: 34, b: 34 },\n gray3: { r: 51, g: 51, b: 51 },\n gray4: { r: 68, g: 68, b: 68 },\n gray5: { r: 85, g: 85, b: 85 },\n gray6: { r: 102, g: 102, b: 102 },\n gray7: { r: 119, g: 119, b: 119 },\n gray8: { r: 136, g: 136, b: 136 },\n gray9: { r: 153, g: 153, b: 153 },\n gray10: { r: 170, g: 170, b: 170 },\n gray11: { r: 187, g: 187, b: 187 },\n gray12: { r: 204, g: 204, b: 204 },\n gray13: { r: 221, g: 221, b: 221 },\n gray14: { r: 238, g: 238, b: 238 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n};\n\n/** Get color palette for a color scheme */\nexport function getPalette(scheme: ColorScheme): ColorPalette {\n return PALETTES[scheme];\n}\n\n/** Get number of colors in a color scheme */\nexport function getColorCount(scheme: ColorScheme): number {\n return Object.keys(PALETTES[scheme].colors).length;\n}\n\n/** Create ColorScheme from firmware integer value */\nexport function fromValue(value: number): ColorScheme {\n if (value < 0 || value > 7) {\n throw new Error(`Invalid color scheme value: ${value}`);\n }\n return value as ColorScheme;\n}\n\n// =============================================================================\n// Measured Palettes for Specific E-Paper Displays\n// =============================================================================\n//\n// These constants provide measured RGB values from real e-paper displays.\n// Pass them directly to ditherImage() instead of a ColorScheme enum.\n//\n// Usage:\n// import { ditherImage, SPECTRA_7_3_6COLOR } from '@opendisplay/epaper-dithering';\n// const result = ditherImage(imageBuffer, SPECTRA_7_3_6COLOR);\n//\n// Color order MUST match the corresponding ColorScheme palette order.\n// =============================================================================\n\n// 7.3\" Spectra™ 6-color (BWGBRY scheme)\n// Measured: 2026-02-03, iPhone 15 Pro Max RAW + Hue Play bars @ 6500K\n// Paper reference RGB(215,217,218); normalization: value × (255/paper_channel)\nexport const SPECTRA_7_3_6COLOR: ColorPalette = {\n colors: {\n black: { r: 26, g: 13, b: 35 },\n white: { r: 185, g: 202, b: 205 },\n yellow: { r: 202, g: 184, b: 0 },\n red: { r: 121, g: 9, b: 0 },\n blue: { r: 0, g: 69, b: 139 },\n green: { r: 40, g: 82, b: 57 },\n },\n accent: 'red',\n};\n\n// 4.26\" Monochrome (MONO scheme)\nexport const MONO_4_26: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 220, g: 220, b: 220 },\n },\n accent: 'black',\n};\n\n// 4.2\" BWRY (BWRY scheme)\nexport const BWRY_4_2: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n yellow: { r: 200, g: 180, b: 0 },\n red: { r: 120, g: 15, b: 5 },\n },\n accent: 'red',\n};\n\n// Solum BWR (harvested display, BWR scheme)\nexport const SOLUM_BWR: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n red: { r: 120, g: 15, b: 5 },\n },\n accent: 'red',\n};\n\n// Hanshow BWR (harvested display, BWR scheme)\nexport const HANSHOW_BWR: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n red: { r: 120, g: 15, b: 5 },\n },\n accent: 'red',\n};\n\n// Hanshow BWY (harvested display, BWY scheme)\nexport const HANSHOW_BWY: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n yellow: { r: 200, g: 180, b: 0 },\n },\n accent: 'yellow',\n};\n\n// 3.97\" BWRY — EP397YR_800x480 (BWRY scheme)\n// Measured: 2026-03-06, iPhone RAW\n// Paper reference RGB(205,205,205); normalization: value × (255/205)\nexport const BWRY_3_97: ColorPalette = {\n colors: {\n black: { r: 10, g: 7, b: 14 },\n white: { r: 173, g: 178, b: 174 },\n yellow: { r: 172, g: 128, b: 0 },\n red: { r: 85, g: 24, b: 14 },\n },\n accent: 'red',\n};\n","import { SRGB_TO_LINEAR_LUT } from './color_space';\nimport { precomputePaletteLab, matchPixelLch } from './color_space_lab';\nimport { autoCompressDynamicRange } from './tone_map';\nimport type { RGB, ImageBuffer, PaletteImageBuffer, ColorPalette } from './types';\nimport { ColorScheme, getPalette } from './palettes';\n\n// Bayer 4×4 matrix normalized to [-0.5, 0.5] — matches Python's _BAYER_4X4\nconst BAYER_4X4: Float32Array = new Float32Array([\n 0, 8, 2, 10,\n 12, 4, 14, 6,\n 3, 11, 1, 9,\n 15, 7, 13, 5,\n].map(v => v / 16.0 - 0.5));\n\ninterface ErrorKernel {\n dx: number;\n dy: number;\n weight: number; // pre-normalized (already divided by divisor)\n}\n\n// =============================================================================\n// Internal helpers\n// =============================================================================\n\nfunction resolvePalette(scheme: ColorScheme | ColorPalette): ColorPalette {\n return typeof scheme === 'number' ? getPalette(scheme) : scheme;\n}\n\n/** Convert ColorPalette sRGB colors to linear [0,1] tuples. */\nfunction paletteToLinear(palette: ColorPalette): {\n paletteRgb: RGB[];\n paletteLinear: Array<[number, number, number]>;\n} {\n const paletteRgb = Object.values(palette.colors);\n const paletteLinear = paletteRgb.map(c => [\n SRGB_TO_LINEAR_LUT[c.r],\n SRGB_TO_LINEAR_LUT[c.g],\n SRGB_TO_LINEAR_LUT[c.b],\n ] as [number, number, number]);\n return { paletteRgb, paletteLinear };\n}\n\n/**\n * Build a Float32Array linear pixel buffer from RGBA input, compositing on white.\n * Alpha compositing in linear space: channel = LUT[srgb] * alpha + (1 - alpha)\n * (white = 1.0 in linear; compositing is done in one pass, no separate alpha step)\n */\nfunction buildLinearBuffer(image: ImageBuffer): Float32Array {\n const n = image.width * image.height;\n const pixels = new Float32Array(n * 3);\n const { data } = image;\n\n for (let i = 0; i < n; i++) {\n const base4 = i * 4;\n const base3 = i * 3;\n const alpha = data[base4 + 3] / 255.0;\n const inv = 1.0 - alpha;\n pixels[base3] = SRGB_TO_LINEAR_LUT[data[base4]] * alpha + inv;\n pixels[base3 + 1] = SRGB_TO_LINEAR_LUT[data[base4 + 1]] * alpha + inv;\n pixels[base3 + 2] = SRGB_TO_LINEAR_LUT[data[base4 + 2]] * alpha + inv;\n }\n\n return pixels;\n}\n\n// =============================================================================\n// Error diffusion\n// =============================================================================\n\nfunction errorDiffusionDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n kernel: ErrorKernel[],\n serpentine: boolean,\n): PaletteImageBuffer {\n const { width, height } = image;\n const palette = resolvePalette(scheme);\n const { paletteRgb, paletteLinear } = paletteToLinear(palette);\n const numColors = paletteRgb.length;\n\n // Build linear pixel buffer with RGBA compositing\n const pixels = buildLinearBuffer(image);\n\n // Tone compression for measured palettes only\n if (typeof scheme !== 'number') {\n autoCompressDynamicRange(pixels, width, height, paletteLinear);\n }\n\n // Pre-compute palette LAB for the hot loop\n const { L: palL, a: palA, b: palB, C: palC } = precomputePaletteLab(paletteLinear);\n\n // Palette linear RGB as flat typed arrays for error computation\n const palR = new Float64Array(numColors);\n const palG = new Float64Array(numColors);\n const palBl = new Float64Array(numColors);\n for (let i = 0; i < numColors; i++) {\n palR[i] = paletteLinear[i][0];\n palG[i] = paletteLinear[i][1];\n palBl[i] = paletteLinear[i][2];\n }\n\n const indices = new Uint8Array(width * height);\n\n for (let y = 0; y < height; y++) {\n // Serpentine: alternate row direction to reduce directional artifacts\n const leftToRight = !serpentine || (y % 2 === 0);\n const xStart = leftToRight ? 0 : width - 1;\n const xEnd = leftToRight ? width : -1;\n const xStep = leftToRight ? 1 : -1;\n\n for (let x = xStart; x !== xEnd; x += xStep) {\n const pixIdx = (y * width + x) * 3;\n\n // Clamp accumulated error to valid range before matching\n const r = Math.max(0.0, Math.min(1.0, pixels[pixIdx]));\n const g = Math.max(0.0, Math.min(1.0, pixels[pixIdx + 1]));\n const b = Math.max(0.0, Math.min(1.0, pixels[pixIdx + 2]));\n\n // LCH-weighted LAB color matching\n const newIdx = matchPixelLch(r, g, b, palL, palA, palB, palC);\n indices[y * width + x] = newIdx;\n\n // Quantization error in linear space\n const errR = r - palR[newIdx];\n const errG = g - palG[newIdx];\n const errB = b - palBl[newIdx];\n\n // Distribute error to neighbors\n for (let k = 0; k < kernel.length; k++) {\n const kEntry = kernel[k];\n // Flip horizontal offset on right-to-left rows (serpentine)\n const nx = x + (leftToRight ? kEntry.dx : -kEntry.dx);\n const ny = y + kEntry.dy;\n\n if (nx >= 0 && nx < width && ny >= 0 && ny < height) {\n const nIdx = (ny * width + nx) * 3;\n pixels[nIdx] += errR * kEntry.weight;\n pixels[nIdx + 1] += errG * kEntry.weight;\n pixels[nIdx + 2] += errB * kEntry.weight;\n }\n }\n }\n }\n\n return { width, height, indices, palette: paletteRgb };\n}\n\n// =============================================================================\n// Non-error-diffusion algorithms\n// =============================================================================\n\nexport function directPaletteMap(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n): PaletteImageBuffer {\n const { width, height } = image;\n const palette = resolvePalette(scheme);\n const { paletteRgb, paletteLinear } = paletteToLinear(palette);\n\n const pixels = buildLinearBuffer(image);\n\n if (typeof scheme !== 'number') {\n autoCompressDynamicRange(pixels, width, height, paletteLinear);\n }\n\n const { L: palL, a: palA, b: palB, C: palC } = precomputePaletteLab(paletteLinear);\n const indices = new Uint8Array(width * height);\n const n = width * height;\n\n for (let i = 0; i < n; i++) {\n const base = i * 3;\n const r = Math.max(0.0, Math.min(1.0, pixels[base]));\n const g = Math.max(0.0, Math.min(1.0, pixels[base + 1]));\n const b = Math.max(0.0, Math.min(1.0, pixels[base + 2]));\n indices[i] = matchPixelLch(r, g, b, palL, palA, palB, palC);\n }\n\n return { width, height, indices, palette: paletteRgb };\n}\n\nexport function orderedDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n): PaletteImageBuffer {\n const { width, height } = image;\n const palette = resolvePalette(scheme);\n const { paletteRgb, paletteLinear } = paletteToLinear(palette);\n\n const pixels = buildLinearBuffer(image);\n\n if (typeof scheme !== 'number') {\n autoCompressDynamicRange(pixels, width, height, paletteLinear);\n }\n\n const { L: palL, a: palA, b: palB, C: palC } = precomputePaletteLab(paletteLinear);\n const indices = new Uint8Array(width * height);\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const base = (y * width + x) * 3;\n const threshold = BAYER_4X4[(y % 4) * 4 + (x % 4)];\n\n const r = Math.max(0.0, Math.min(1.0, pixels[base] + threshold));\n const g = Math.max(0.0, Math.min(1.0, pixels[base + 1] + threshold));\n const b = Math.max(0.0, Math.min(1.0, pixels[base + 2] + threshold));\n\n indices[y * width + x] = matchPixelLch(r, g, b, palL, palA, palB, palC);\n }\n }\n\n return { width, height, indices, palette: paletteRgb };\n}\n\n// =============================================================================\n// Error diffusion algorithm wrappers\n// Kernel weights are pre-normalized (divided by divisor) to eliminate per-pixel division.\n// =============================================================================\n\nexport function floydSteinbergDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n return errorDiffusionDither(image, scheme, [\n { dx: 1, dy: 0, weight: 7 / 16 },\n { dx: -1, dy: 1, weight: 3 / 16 },\n { dx: 0, dy: 1, weight: 5 / 16 },\n { dx: 1, dy: 1, weight: 1 / 16 },\n ], serpentine);\n}\n\nexport function burkesDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n // Correct Burkes kernel: divisor 32 (not 200)\n return errorDiffusionDither(image, scheme, [\n { dx: 1, dy: 0, weight: 8 / 32 },\n { dx: 2, dy: 0, weight: 4 / 32 },\n { dx: -2, dy: 1, weight: 2 / 32 },\n { dx: -1, dy: 1, weight: 4 / 32 },\n { dx: 0, dy: 1, weight: 8 / 32 },\n { dx: 1, dy: 1, weight: 4 / 32 },\n { dx: 2, dy: 1, weight: 2 / 32 },\n ], serpentine);\n}\n\nexport function sierraDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n return errorDiffusionDither(image, scheme, [\n { dx: 1, dy: 0, weight: 5 / 32 },\n { dx: 2, dy: 0, weight: 3 / 32 },\n { dx: -2, dy: 1, weight: 2 / 32 },\n { dx: -1, dy: 1, weight: 4 / 32 },\n { dx: 0, dy: 1, weight: 5 / 32 },\n { dx: 1, dy: 1, weight: 4 / 32 },\n { dx: 2, dy: 1, weight: 2 / 32 },\n { dx: -1, dy: 2, weight: 2 / 32 },\n { dx: 0, dy: 2, weight: 3 / 32 },\n { dx: 1, dy: 2, weight: 2 / 32 },\n ], serpentine);\n}\n\nexport function sierraLiteDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n return errorDiffusionDither(image, scheme, [\n { dx: 1, dy: 0, weight: 2 / 4 },\n { dx: -1, dy: 1, weight: 1 / 4 },\n { dx: 0, dy: 1, weight: 1 / 4 },\n ], serpentine);\n}\n\nexport function atkinsonDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n return errorDiffusionDither(image, scheme, [\n { dx: 1, dy: 0, weight: 1 / 8 },\n { dx: 2, dy: 0, weight: 1 / 8 },\n { dx: -1, dy: 1, weight: 1 / 8 },\n { dx: 0, dy: 1, weight: 1 / 8 },\n { dx: 1, dy: 1, weight: 1 / 8 },\n { dx: 0, dy: 2, weight: 1 / 8 },\n ], serpentine);\n}\n\nexport function stuckiDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n return errorDiffusionDither(image, scheme, [\n { dx: 1, dy: 0, weight: 8 / 42 },\n { dx: 2, dy: 0, weight: 4 / 42 },\n { dx: -2, dy: 1, weight: 2 / 42 },\n { dx: -1, dy: 1, weight: 4 / 42 },\n { dx: 0, dy: 1, weight: 8 / 42 },\n { dx: 1, dy: 1, weight: 4 / 42 },\n { dx: 2, dy: 1, weight: 2 / 42 },\n { dx: -2, dy: 2, weight: 1 / 42 },\n { dx: -1, dy: 2, weight: 2 / 42 },\n { dx: 0, dy: 2, weight: 4 / 42 },\n { dx: 1, dy: 2, weight: 2 / 42 },\n { dx: 2, dy: 2, weight: 1 / 42 },\n ], serpentine);\n}\n\nexport function jarvisJudiceNinkeDither(\n image: ImageBuffer,\n scheme: ColorScheme | ColorPalette,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n return errorDiffusionDither(image, scheme, [\n { dx: 1, dy: 0, weight: 7 / 48 },\n { dx: 2, dy: 0, weight: 5 / 48 },\n { dx: -2, dy: 1, weight: 3 / 48 },\n { dx: -1, dy: 1, weight: 5 / 48 },\n { dx: 0, dy: 1, weight: 7 / 48 },\n { dx: 1, dy: 1, weight: 5 / 48 },\n { dx: 2, dy: 1, weight: 3 / 48 },\n { dx: -2, dy: 2, weight: 1 / 48 },\n { dx: -1, dy: 2, weight: 3 / 48 },\n { dx: 0, dy: 2, weight: 5 / 48 },\n { dx: 1, dy: 2, weight: 3 / 48 },\n { dx: 2, dy: 2, weight: 1 / 48 },\n ], serpentine);\n}\n","import type { ImageBuffer, PaletteImageBuffer, ColorPalette } from './types';\nimport { DitherMode } from './enums';\nimport { ColorScheme } from './palettes';\nimport * as algorithms from './algorithms';\n\n/**\n * Apply dithering algorithm to image for e-paper display.\n *\n * @param image - Input image buffer (RGBA format). Alpha is composited on white.\n * @param colorScheme - Target color scheme (ColorScheme enum) or measured palette (ColorPalette)\n * @param mode - Dithering algorithm (default: BURKES)\n * @param serpentine - Alternate row direction to reduce artifacts (default: true)\n * @returns Palette-indexed image buffer\n *\n * @example\n * ```typescript\n * // Standard color scheme\n * const dithered = ditherImage(imageBuffer, ColorScheme.BWR, DitherMode.FLOYD_STEINBERG);\n *\n * // Measured palette for accurate color matching\n * const dithered = ditherImage(imageBuffer, SPECTRA_7_3_6COLOR);\n * ```\n */\nexport function ditherImage(\n image: ImageBuffer,\n colorScheme: ColorScheme | ColorPalette,\n mode: DitherMode = DitherMode.BURKES,\n serpentine: boolean = true,\n): PaletteImageBuffer {\n switch (mode) {\n case DitherMode.NONE:\n return algorithms.directPaletteMap(image, colorScheme);\n case DitherMode.ORDERED:\n return algorithms.orderedDither(image, colorScheme);\n case DitherMode.FLOYD_STEINBERG:\n return algorithms.floydSteinbergDither(image, colorScheme, serpentine);\n case DitherMode.ATKINSON:\n return algorithms.atkinsonDither(image, colorScheme, serpentine);\n case DitherMode.STUCKI:\n return algorithms.stuckiDither(image, colorScheme, serpentine);\n case DitherMode.SIERRA:\n return algorithms.sierraDither(image, colorScheme, serpentine);\n case DitherMode.SIERRA_LITE:\n return algorithms.sierraLiteDither(image, colorScheme, serpentine);\n case DitherMode.JARVIS_JUDICE_NINKE:\n return algorithms.jarvisJudiceNinkeDither(image, colorScheme, serpentine);\n case DitherMode.BURKES:\n default:\n return algorithms.burkesDither(image, colorScheme, serpentine);\n }\n}\n","export { ditherImage } from './core';\nexport { DitherMode } from './enums';\nexport {\n ColorScheme,\n getPalette,\n getColorCount,\n fromValue,\n // Measured palettes\n SPECTRA_7_3_6COLOR,\n MONO_4_26,\n BWRY_4_2,\n SOLUM_BWR,\n HANSHOW_BWR,\n HANSHOW_BWY,\n BWRY_3_97,\n} from './palettes';\nexport type { RGB, ImageBuffer, PaletteImageBuffer, ColorPalette } from './types';\n\nexport const VERSION = '0.1.0';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/enums.ts","../src/palettes.ts","../src/wasm-core/epaper_dithering_wasm_bg.js","../src/core.ts","../src/index.ts"],"names":["DitherMode","ColorScheme"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Dithering algorithm modes\n * Values match firmware conventions (0-8)\n */\nexport enum DitherMode {\n NONE = 0,\n BURKES = 1,\n ORDERED = 2,\n FLOYD_STEINBERG = 3,\n ATKINSON = 4,\n STUCKI = 5,\n SIERRA = 6,\n SIERRA_LITE = 7,\n JARVIS_JUDICE_NINKE = 8,\n}","import type { ColorPalette } from './types';\n\n/**\n * E-paper display color schemes\n * Values match firmware conventions (0-7)\n */\nexport enum ColorScheme {\n MONO = 0,\n BWR = 1,\n BWY = 2,\n BWRY = 3,\n BWGBRY = 4,\n GRAYSCALE_4 = 5,\n GRAYSCALE_8 = 6,\n GRAYSCALE_16 = 7,\n}\n\nconst PALETTES: Record<ColorScheme, ColorPalette> = {\n [ColorScheme.MONO]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n [ColorScheme.BWR]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n red: { r: 255, g: 0, b: 0 },\n },\n accent: 'red',\n },\n [ColorScheme.BWY]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n yellow: { r: 255, g: 255, b: 0 },\n },\n accent: 'yellow',\n },\n [ColorScheme.BWRY]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n yellow: { r: 255, g: 255, b: 0 },\n red: { r: 255, g: 0, b: 0 },\n },\n accent: 'red',\n },\n [ColorScheme.BWGBRY]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n white: { r: 255, g: 255, b: 255 },\n yellow: { r: 255, g: 255, b: 0 },\n red: { r: 255, g: 0, b: 0 },\n blue: { r: 0, g: 0, b: 255 },\n green: { r: 0, g: 255, b: 0 },\n },\n accent: 'red',\n },\n [ColorScheme.GRAYSCALE_4]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n gray1: { r: 85, g: 85, b: 85 },\n gray2: { r: 170, g: 170, b: 170 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n [ColorScheme.GRAYSCALE_8]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n gray1: { r: 36, g: 36, b: 36 },\n gray2: { r: 73, g: 73, b: 73 },\n gray3: { r: 109, g: 109, b: 109 },\n gray4: { r: 146, g: 146, b: 146 },\n gray5: { r: 182, g: 182, b: 182 },\n gray6: { r: 219, g: 219, b: 219 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n [ColorScheme.GRAYSCALE_16]: {\n colors: {\n black: { r: 0, g: 0, b: 0 },\n gray1: { r: 17, g: 17, b: 17 },\n gray2: { r: 34, g: 34, b: 34 },\n gray3: { r: 51, g: 51, b: 51 },\n gray4: { r: 68, g: 68, b: 68 },\n gray5: { r: 85, g: 85, b: 85 },\n gray6: { r: 102, g: 102, b: 102 },\n gray7: { r: 119, g: 119, b: 119 },\n gray8: { r: 136, g: 136, b: 136 },\n gray9: { r: 153, g: 153, b: 153 },\n gray10: { r: 170, g: 170, b: 170 },\n gray11: { r: 187, g: 187, b: 187 },\n gray12: { r: 204, g: 204, b: 204 },\n gray13: { r: 221, g: 221, b: 221 },\n gray14: { r: 238, g: 238, b: 238 },\n white: { r: 255, g: 255, b: 255 },\n },\n accent: 'black',\n },\n};\n\n/** Get color palette for a color scheme */\nexport function getPalette(scheme: ColorScheme): ColorPalette {\n return PALETTES[scheme];\n}\n\n/** Get number of colors in a color scheme */\nexport function getColorCount(scheme: ColorScheme): number {\n return Object.keys(PALETTES[scheme].colors).length;\n}\n\n/** Create ColorScheme from firmware integer value */\nexport function fromValue(value: number): ColorScheme {\n if (value < 0 || value > 7) {\n throw new Error(`Invalid color scheme value: ${value}`);\n }\n return value as ColorScheme;\n}\n\n// =============================================================================\n// Measured Palettes for Specific E-Paper Displays\n// =============================================================================\n//\n// These constants provide measured RGB values from real e-paper displays.\n// Pass them directly to ditherImage() instead of a ColorScheme enum.\n//\n// Usage:\n// import { ditherImage, SPECTRA_7_3_6COLOR } from '@opendisplay/epaper-dithering';\n// const result = ditherImage(imageBuffer, SPECTRA_7_3_6COLOR);\n//\n// NOTE: RGB values are defined in packages/rust/core/src/measured_palettes.rs\n// (single source of truth). The Python package derives its constants from Rust\n// via FFI at import time. TypeScript cannot do the same (WASM init order), so\n// values here must be kept in sync manually with the Rust source.\n// The WASM `measured_palettes()` function is exposed for future tooling.\n//\n// TO ADD A NEW DISPLAY: update measured_palettes.rs + add the constant below.\n// =============================================================================\n\n// 7.3\" Spectra™ 6-color (BWGBRY scheme)\n// Measured: 2026-02-03, iPhone 15 Pro Max RAW + Hue Play bars @ 6500K\n// Paper reference RGB(215,217,218); normalization: value × (255/paper_channel)\nexport const SPECTRA_7_3_6COLOR: ColorPalette = {\n colors: {\n black: { r: 26, g: 13, b: 35 },\n white: { r: 185, g: 202, b: 205 },\n yellow: { r: 202, g: 184, b: 0 },\n red: { r: 121, g: 9, b: 0 },\n blue: { r: 0, g: 69, b: 139 },\n green: { r: 40, g: 82, b: 57 },\n },\n accent: 'red',\n};\n\n// 4.26\" Monochrome (MONO scheme)\nexport const MONO_4_26: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 220, g: 220, b: 220 },\n },\n accent: 'black',\n};\n\n// 4.2\" BWRY (BWRY scheme)\nexport const BWRY_4_2: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n yellow: { r: 200, g: 180, b: 0 },\n red: { r: 120, g: 15, b: 5 },\n },\n accent: 'red',\n};\n\n// Solum BWR (harvested display, BWR scheme)\nexport const SOLUM_BWR: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n red: { r: 120, g: 15, b: 5 },\n },\n accent: 'red',\n};\n\n// Hanshow BWR (harvested display, BWR scheme)\nexport const HANSHOW_BWR: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n red: { r: 120, g: 15, b: 5 },\n },\n accent: 'red',\n};\n\n// Hanshow BWY (harvested display, BWY scheme)\nexport const HANSHOW_BWY: ColorPalette = {\n colors: {\n black: { r: 5, g: 5, b: 5 },\n white: { r: 200, g: 200, b: 200 },\n yellow: { r: 200, g: 180, b: 0 },\n },\n accent: 'yellow',\n};\n\n// 3.97\" BWRY — EP397YR_800x480 (BWRY scheme)\n// 7.3\" Spectra™ 6-color (BWGBRY scheme) — v2 measurement\n// Measured: 2026-03-15, iPhone 15 Pro Max RAW + Affinity (v3), A4 paper white reference\n// Method: DNG with linear tone curve, WB from A4 paper, uniform ×2.4 scale\nexport const SPECTRA_7_3_6COLOR_V2: ColorPalette = {\n colors: {\n black: { r: 31, g: 24, b: 41 },\n white: { r: 168, g: 180, b: 182 },\n yellow: { r: 180, g: 173, b: 0 },\n red: { r: 113, g: 24, b: 19 },\n blue: { r: 36, g: 70, b: 139 },\n green: { r: 50, g: 84, b: 60 },\n },\n accent: 'red',\n};\n\n// Measured: 2026-03-06, iPhone RAW\n// Paper reference RGB(205,205,205); normalization: value × (255/205)\nexport const BWRY_3_97: ColorPalette = {\n colors: {\n black: { r: 10, g: 7, b: 14 },\n white: { r: 173, g: 178, b: 174 },\n yellow: { r: 172, g: 128, b: 0 },\n red: { r: 85, g: 24, b: 14 },\n },\n accent: 'red',\n};\n","/**\n * Composite an RGBA buffer onto white, returning flat RGB bytes (sRGB).\n * @param {Uint8Array} rgba\n * @returns {Uint8Array}\n */\nexport function composite_rgba(rgba) {\n const ptr0 = passArray8ToWasm0(rgba, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ret = wasm.composite_rgba(ptr0, len0);\n var v2 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v2;\n}\n\n/**\n * Dither a flat RGB image. Accepts either an idealized `scheme_id` or a measured\n * `palette_bytes`/`accent_idx` pair; `palette_bytes` empty ⇒ use `scheme_id`.\n *\n * Returns a `Uint8Array` of palette indices (one per pixel, length = width × height).\n * @param {Uint8Array} pixels\n * @param {number} width\n * @param {number} scheme_id\n * @param {Uint8Array} palette_bytes\n * @param {number} accent_idx\n * @param {number} mode_id\n * @param {boolean} serpentine\n * @param {number} exposure\n * @param {number} saturation\n * @param {number} shadows\n * @param {number} highlights\n * @param {number | null} [tone]\n * @param {number | null} [gamut]\n * @returns {Uint8Array}\n */\nexport function dither_image(pixels, width, scheme_id, palette_bytes, accent_idx, mode_id, serpentine, exposure, saturation, shadows, highlights, tone, gamut) {\n const ptr0 = passArray8ToWasm0(pixels, wasm.__wbindgen_malloc);\n const len0 = WASM_VECTOR_LEN;\n const ptr1 = passArray8ToWasm0(palette_bytes, wasm.__wbindgen_malloc);\n const len1 = WASM_VECTOR_LEN;\n const ret = wasm.dither_image(ptr0, len0, width, scheme_id, ptr1, len1, accent_idx, mode_id, serpentine, exposure, saturation, shadows, highlights, !isLikeNone(tone), isLikeNone(tone) ? 0 : tone, !isLikeNone(gamut), isLikeNone(gamut) ? 0 : gamut);\n if (ret[3]) {\n throw takeFromExternrefTable0(ret[2]);\n }\n var v3 = getArrayU8FromWasm0(ret[0], ret[1]).slice();\n wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);\n return v3;\n}\n\n/**\n * Returns all measured palettes as a JSON string.\n *\n * Format: `[{\"id\": \"SPECTRA_7_3_6COLOR\", \"colors\": [[r,g,b], ...], \"color_names\": [...], \"accent_idx\": 3}, ...]`\n * @returns {string}\n */\nexport function measured_palettes() {\n let deferred1_0;\n let deferred1_1;\n try {\n const ret = wasm.measured_palettes();\n deferred1_0 = ret[0];\n deferred1_1 = ret[1];\n return getStringFromWasm0(ret[0], ret[1]);\n } finally {\n wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);\n }\n}\nexport function __wbindgen_cast_0000000000000001(arg0, arg1) {\n // Cast intrinsic for `Ref(String) -> Externref`.\n const ret = getStringFromWasm0(arg0, arg1);\n return ret;\n}\nexport function __wbindgen_init_externref_table() {\n const table = wasm.__wbindgen_externrefs;\n const offset = table.grow(4);\n table.set(0, undefined);\n table.set(offset + 0, undefined);\n table.set(offset + 1, null);\n table.set(offset + 2, true);\n table.set(offset + 3, false);\n}\nfunction getArrayU8FromWasm0(ptr, len) {\n ptr = ptr >>> 0;\n return getUint8ArrayMemory0().subarray(ptr / 1, ptr / 1 + len);\n}\n\nfunction getStringFromWasm0(ptr, len) {\n return decodeText(ptr >>> 0, len);\n}\n\nlet cachedUint8ArrayMemory0 = null;\nfunction getUint8ArrayMemory0() {\n if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {\n cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);\n }\n return cachedUint8ArrayMemory0;\n}\n\nfunction isLikeNone(x) {\n return x === undefined || x === null;\n}\n\nfunction passArray8ToWasm0(arg, malloc) {\n const ptr = malloc(arg.length * 1, 1) >>> 0;\n getUint8ArrayMemory0().set(arg, ptr / 1);\n WASM_VECTOR_LEN = arg.length;\n return ptr;\n}\n\nfunction takeFromExternrefTable0(idx) {\n const value = wasm.__wbindgen_externrefs.get(idx);\n wasm.__externref_table_dealloc(idx);\n return value;\n}\n\nlet cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\ncachedTextDecoder.decode();\nconst MAX_SAFARI_DECODE_BYTES = 2146435072;\nlet numBytesDecoded = 0;\nfunction decodeText(ptr, len) {\n numBytesDecoded += len;\n if (numBytesDecoded >= MAX_SAFARI_DECODE_BYTES) {\n cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });\n cachedTextDecoder.decode();\n numBytesDecoded = len;\n }\n return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));\n}\n\nlet WASM_VECTOR_LEN = 0;\n\n\nlet wasm;\nexport function __wbg_set_wasm(val) {\n wasm = val;\n}\n","import type { ImageBuffer, PaletteImageBuffer, ColorPalette } from './types';\nimport { DitherMode } from './enums';\nimport { ColorScheme, getPalette } from './palettes';\nimport {\n dither_image as wasmDitherImage,\n composite_rgba as wasmCompositeRgba,\n __wbg_set_wasm,\n __wbindgen_init_externref_table,\n __wbindgen_cast_0000000000000001,\n} from './wasm-core/epaper_dithering_wasm_bg.js';\nimport wasmBytes from './wasm-core/epaper_dithering_wasm_bg.wasm';\n\n// Synchronous WASM initialization — runs once at module load time.\nconst wasmModule = new WebAssembly.Module(wasmBytes as unknown as ArrayBuffer);\nconst wasmInstance = new WebAssembly.Instance(wasmModule, {\n './epaper_dithering_wasm_bg.js': {\n __wbindgen_init_externref_table,\n __wbindgen_cast_0000000000000001,\n },\n});\n__wbg_set_wasm(wasmInstance.exports);\n(wasmInstance.exports as Record<string, () => void>).__wbindgen_start?.();\n\n/**\n * Options for `ditherImage`. All fields are optional — defaults are sensible.\n *\n * Pre-processing pipeline (each step is a no-op at its identity value):\n * `exposure → saturation → shadows/highlights → tone → gamut → dither`.\n */\nexport interface DitherOptions {\n /** Dithering algorithm. Default: `DitherMode.BURKES`. */\n mode?: DitherMode;\n /** Alternate row scan direction for error diffusion. Default: `true`. */\n serpentine?: boolean;\n /** Linear-RGB exposure multiplier. 1.0 = no change, 2.0 = +1 stop. Default: `1.0`. */\n exposure?: number;\n /** OKLab saturation multiplier. 1.0 = no change, 0.0 = grayscale. Default: `1.0`. */\n saturation?: number;\n /** Shadow lift strength (S-curve lower half). 0.0 = off, 1.0 = strong. Default: `0.0`. */\n shadows?: number;\n /** Highlight compression strength (S-curve upper half). 0.0 = off, 1.0 = strong. Default: `0.0`. */\n highlights?: number;\n /** Dynamic-range compression: `'auto'` | `'off'` | 0.0–1.0. Default: `'auto'`. */\n tone?: number | 'auto' | 'off';\n /** Gamut compression: `'auto'` | `'off'` | 0.0–1.0. Default: `'auto'`. */\n gamut?: number | 'auto' | 'off';\n}\n\n/**\n * Apply dithering to an RGBA image for an e-paper display.\n *\n * @param image Input RGBA image. Alpha is composited on white.\n * @param palette Target palette: `ColorScheme` enum (idealized) or `ColorPalette` (measured).\n * @param options Per-call overrides — see {@link DitherOptions}.\n * @returns Palette-indexed image buffer.\n */\nexport function ditherImage(\n image: ImageBuffer,\n palette: ColorScheme | ColorPalette,\n options: DitherOptions = {},\n): PaletteImageBuffer {\n const {\n mode = DitherMode.BURKES,\n serpentine = true,\n exposure = 1.0,\n saturation = 1.0,\n shadows = 0.0,\n highlights = 0.0,\n tone = 'auto',\n gamut = 'auto',\n } = options;\n\n const rgba = new Uint8Array(image.data.buffer, image.data.byteOffset, image.data.byteLength);\n const pixels = wasmCompositeRgba(rgba);\n\n // Idealized schemes don't have a measured display range, so tone/gamut don't apply.\n const isScheme = typeof palette === 'number';\n const toneArg = isScheme ? 0.0 : parseCompression(tone);\n const gamutArg = isScheme ? 0.0 : parseCompression(gamut);\n\n let schemeId = 0;\n let paletteBytes: Uint8Array;\n let accentIdx = 0;\n let outputColors: { r: number; g: number; b: number }[];\n\n if (isScheme) {\n schemeId = palette as number;\n paletteBytes = new Uint8Array(0);\n outputColors = Object.values(getPalette(palette).colors);\n } else {\n const colors = Object.values(palette.colors);\n paletteBytes = new Uint8Array(colors.flatMap(c => [c.r, c.g, c.b]));\n accentIdx = Object.keys(palette.colors).indexOf(palette.accent);\n outputColors = colors;\n }\n\n const indices = wasmDitherImage(\n pixels, image.width,\n schemeId, paletteBytes, accentIdx,\n mode as number, serpentine,\n exposure, saturation, shadows, highlights,\n toneArg, gamutArg,\n );\n\n return { width: image.width, height: image.height, indices, palette: outputColors };\n}\n\n/** Map `'auto'` → `undefined` (Rust None = auto), `'off'` → 0.0, number → pass through. */\nfunction parseCompression(v: number | 'auto' | 'off'): number | undefined {\n if (v === 'auto') return undefined;\n if (v === 'off') return 0.0;\n return v;\n}\n","export { ditherImage } from './core';\nexport type { DitherOptions } from './core';\nexport { DitherMode } from './enums';\nexport {\n ColorScheme,\n getPalette,\n getColorCount,\n fromValue,\n // Measured palettes\n SPECTRA_7_3_6COLOR,\n SPECTRA_7_3_6COLOR_V2,\n MONO_4_26,\n BWRY_4_2,\n SOLUM_BWR,\n HANSHOW_BWR,\n HANSHOW_BWY,\n BWRY_3_97,\n} from './palettes';\nexport type { RGB, ImageBuffer, PaletteImageBuffer, ColorPalette } from './types';\n\nexport const VERSION = '0.1.0';\n"]}
|