@opendisplay/epaper-dithering 2.1.4 → 2.2.1
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 +80 -126
- package/dist/index.cjs +406 -128
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +24 -16
- package/dist/index.d.ts +24 -16
- package/dist/index.js +400 -129
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/enums.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}","import type { RGB, ColorPalette } from './types';\n\n/**\n * E-paper display color schemes\n * Values match firmware conventions (0-5)\n */\nexport enum ColorScheme {\n MONO = 0,\n BWR = 1,\n BWY = 2,\n BWRY = 3,\n BWGBRY = 4,\n GRAYSCALE_4 = 5,\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};\n\n/**\n * Get color palette for a color scheme\n */\nexport function getPalette(scheme: ColorScheme): ColorPalette {\n return PALETTES[scheme];\n}\n\n/**\n * Get number of colors in a color scheme\n */\nexport function getColorCount(scheme: ColorScheme): number {\n return Object.keys(PALETTES[scheme].colors).length;\n}\n\n/**\n * Create ColorScheme from firmware integer value\n */\nexport function fromValue(value: number): ColorScheme {\n if (value < 0 || value > 5) {\n throw new Error(`Invalid color scheme value: ${value}`);\n }\n return value as ColorScheme;\n}","import type { RGB, ImageBuffer, PaletteImageBuffer } from './types';\nimport { ColorScheme, getPalette } from './palettes';\n\n/**\n * Get RGB palette colors from color scheme\n */\nexport function getPaletteColors(scheme: ColorScheme): RGB[] {\n const palette = getPalette(scheme);\n return Object.values(palette.colors);\n}\n\n/**\n * Find closest palette color using Euclidean distance\n */\nexport function findClosestPaletteColor(rgb: RGB, palette: RGB[]): number {\n let minDistance = Infinity;\n let closestIdx = 0;\n\n for (let i = 0; i < palette.length; i++) {\n const pal = palette[i];\n // Euclidean distance in RGB space\n const distance =\n (rgb.r - pal.r) ** 2 + (rgb.g - pal.g) ** 2 + (rgb.b - pal.b) ** 2;\n\n if (distance < minDistance) {\n minDistance = distance;\n closestIdx = i;\n }\n }\n\n return closestIdx;\n}\n\n/**\n * Error diffusion kernel entry\n */\ninterface ErrorKernel {\n dx: number;\n dy: number;\n weight: number;\n}\n\n/**\n * Apply error diffusion dithering with specified kernel\n */\nfunction errorDiffusionDither(\n image: ImageBuffer,\n colorScheme: ColorScheme,\n kernel: ErrorKernel[]\n): PaletteImageBuffer {\n const { width, height } = image;\n const palette = getPaletteColors(colorScheme);\n\n // Convert RGBA to RGB float array for error accumulation\n const pixels = new Float32Array(width * height * 3);\n for (let i = 0; i < width * height; i++) {\n pixels[i * 3] = image.data[i * 4]; // R\n pixels[i * 3 + 1] = image.data[i * 4 + 1]; // G\n pixels[i * 3 + 2] = image.data[i * 4 + 2]; // B\n }\n\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 idx = y * width + x;\n const pixelIdx = idx * 3;\n\n // Get old pixel (truncate, no clamping - matches Python behavior)\n const oldPixel: RGB = {\n r: Math.trunc(pixels[pixelIdx]),\n g: Math.trunc(pixels[pixelIdx + 1]),\n b: Math.trunc(pixels[pixelIdx + 2]),\n };\n\n // Find closest palette color\n const newIdx = findClosestPaletteColor(oldPixel, palette);\n const newPixel = palette[newIdx];\n indices[idx] = newIdx;\n\n // Calculate quantization error\n const errorR = oldPixel.r - newPixel.r;\n const errorG = oldPixel.g - newPixel.g;\n const errorB = oldPixel.b - newPixel.b;\n\n // Distribute error to neighbors using kernel\n for (const { dx, dy, weight } of kernel) {\n const nx = x + dx;\n const ny = y + dy;\n\n if (nx >= 0 && nx < width && ny >= 0 && ny < height) {\n const neighborIdx = (ny * width + nx) * 3;\n pixels[neighborIdx] += errorR * weight;\n pixels[neighborIdx + 1] += errorG * weight;\n pixels[neighborIdx + 2] += errorB * weight;\n }\n }\n }\n }\n\n return { width, height, indices, palette };\n}\n\n/**\n * Direct palette mapping without dithering (NONE)\n */\nexport function directPaletteMap(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const { width, height } = image;\n const palette = getPaletteColors(colorScheme);\n const indices = new Uint8Array(width * height);\n\n for (let i = 0; i < width * height; i++) {\n const rgb: RGB = {\n r: image.data[i * 4],\n g: image.data[i * 4 + 1],\n b: image.data[i * 4 + 2],\n };\n indices[i] = findClosestPaletteColor(rgb, palette);\n }\n\n return { width, height, indices, palette };\n}\n\n/**\n * Ordered dithering using 4x4 Bayer matrix\n */\nexport function orderedDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const bayerMatrix = new Uint8Array([\n 0, 8, 2, 10, 12, 4, 14, 6, 3, 11, 1, 9, 15, 7, 13, 5,\n ]).map((v) => v * 16);\n\n const { width, height } = image;\n const palette = getPaletteColors(colorScheme);\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 idx = y * width + x;\n const dataIdx = idx * 4;\n\n // Get threshold from Bayer matrix\n const threshold = bayerMatrix[(y % 4) * 4 + (x % 4)];\n\n // Add threshold noise (clamp to 0-255 like Python's np.clip)\n const rgb: RGB = {\n r: Math.max(0, Math.min(255, Math.trunc(image.data[dataIdx] + threshold))),\n g: Math.max(0, Math.min(255, Math.trunc(image.data[dataIdx + 1] + threshold))),\n b: Math.max(0, Math.min(255, Math.trunc(image.data[dataIdx + 2] + threshold))),\n };\n\n indices[idx] = findClosestPaletteColor(rgb, palette);\n }\n }\n\n return { width, height, indices, palette };\n}\n\n/**\n * Burkes dithering (divisor 200)\n * Kernel:\n * X 32 12\n * 5 12 26 12 5\n */\nexport function burkesDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const kernel: ErrorKernel[] = [\n { dx: 1, dy: 0, weight: 32 / 200 },\n { dx: 2, dy: 0, weight: 12 / 200 },\n { dx: -2, dy: 1, weight: 5 / 200 },\n { dx: -1, dy: 1, weight: 12 / 200 },\n { dx: 0, dy: 1, weight: 26 / 200 },\n { dx: 1, dy: 1, weight: 12 / 200 },\n { dx: 2, dy: 1, weight: 5 / 200 },\n ];\n\n return errorDiffusionDither(image, colorScheme, kernel);\n}\n\n/**\n * Floyd-Steinberg dithering (divisor 16)\n * Most popular error diffusion algorithm\n * Kernel:\n * X 7\n * 3 5 1\n */\nexport function floydSteinbergDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const kernel: ErrorKernel[] = [\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 ];\n\n return errorDiffusionDither(image, colorScheme, kernel);\n}\n\n/**\n * Sierra dithering (divisor 32)\n * Kernel:\n * X 5 3\n * 2 4 5 4 2\n * 2 3 2\n */\nexport function sierraDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const kernel: ErrorKernel[] = [\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 ];\n\n return errorDiffusionDither(image, colorScheme, kernel);\n}\n\n/**\n * Sierra Lite dithering (divisor 4)\n * Fastest error diffusion algorithm\n * Kernel:\n * X 2\n * 1 1\n */\nexport function sierraLiteDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const kernel: ErrorKernel[] = [\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 ];\n\n return errorDiffusionDither(image, colorScheme, kernel);\n}\n\n/**\n * Atkinson dithering (divisor 8)\n * Created by Bill Atkinson for original Macintosh\n * Kernel:\n * X 1 1\n * 1 1 1\n * 1\n */\nexport function atkinsonDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const kernel: ErrorKernel[] = [\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 ];\n\n return errorDiffusionDither(image, colorScheme, kernel);\n}\n\n/**\n * Stucki dithering (divisor 42)\n * High quality error diffusion\n * Kernel:\n * X 8 4\n * 2 4 8 4 2\n * 1 2 4 2 1\n */\nexport function stuckiDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const kernel: ErrorKernel[] = [\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 ];\n\n return errorDiffusionDither(image, colorScheme, kernel);\n}\n\n/**\n * Jarvis-Judice-Ninke dithering (divisor 48)\n * Highest quality, slowest algorithm\n * Kernel:\n * X 7 5\n * 3 5 7 5 3\n * 1 3 5 3 1\n */\nexport function jarvisJudiceNinkeDither(\n image: ImageBuffer,\n colorScheme: ColorScheme\n): PaletteImageBuffer {\n const kernel: ErrorKernel[] = [\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 ];\n\n return errorDiffusionDither(image, colorScheme, kernel);\n}","import type { ImageBuffer, PaletteImageBuffer } 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)\n * @param colorScheme - Target e-paper color scheme\n * @param mode - Dithering algorithm (default: BURKES)\n * @returns Palette-indexed image buffer\n *\n * @example\n * ```typescript\n * const dithered = ditherImage(imageBuffer, ColorScheme.BWR, DitherMode.FLOYD_STEINBERG);\n * ```\n */\nexport function ditherImage(\n image: ImageBuffer,\n colorScheme: ColorScheme,\n mode: DitherMode = DitherMode.BURKES\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);\n case DitherMode.ATKINSON:\n return algorithms.atkinsonDither(image, colorScheme);\n case DitherMode.STUCKI:\n return algorithms.stuckiDither(image, colorScheme);\n case DitherMode.SIERRA:\n return algorithms.sierraDither(image, colorScheme);\n case DitherMode.SIERRA_LITE:\n return algorithms.sierraLiteDither(image, colorScheme);\n case DitherMode.JARVIS_JUDICE_NINKE:\n return algorithms.jarvisJudiceNinkeDither(image, colorScheme);\n case DitherMode.BURKES:\n default:\n return algorithms.burkesDither(image, colorScheme);\n }\n}","export { ditherImage } from './core';\nexport { DitherMode } from './enums';\nexport {\n ColorScheme,\n getPalette,\n getColorCount,\n fromValue,\n} from './palettes';\nexport type { RGB, ImageBuffer, PaletteImageBuffer, ColorPalette } from './types';\n\nexport const VERSION = '0.1.0';"]}
|
|
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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@opendisplay/epaper-dithering",
|
|
3
|
-
"version": "2.1
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "Dithering algorithms for e-paper/e-ink displays (JavaScript/TypeScript)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
],
|
|
19
19
|
"scripts": {
|
|
20
20
|
"build": "tsup",
|
|
21
|
+
"dev": "bun run build && bunx serve . --listen 3456",
|
|
21
22
|
"test": "vitest run",
|
|
22
23
|
"test:watch": "vitest",
|
|
23
24
|
"test:coverage": "vitest run --coverage",
|
|
@@ -54,8 +55,8 @@
|
|
|
54
55
|
"license": "MIT",
|
|
55
56
|
"repository": {
|
|
56
57
|
"type": "git",
|
|
57
|
-
"url": "git+https://github.com/OpenDisplay
|
|
58
|
+
"url": "git+https://github.com/OpenDisplay/epaper-dithering.git",
|
|
58
59
|
"directory": "packages/javascript"
|
|
59
60
|
},
|
|
60
|
-
"homepage": "https://github.com/OpenDisplay
|
|
61
|
+
"homepage": "https://github.com/OpenDisplay/epaper-dithering#readme"
|
|
61
62
|
}
|