pixel-data-js 0.1.0 → 0.3.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/color.ts","../src/ImageData/serialization.ts","../src/ImageData/blend-modes.ts","../src/ImageData/blit.ts","../src/ImageData/read-write-pixels.ts"],"sourcesContent":["export * from './color'\nexport * from './ImageData/serialization'\nexport * from './ImageData/blit'\nexport * from './ImageData/blend-modes'\nexport * from './ImageData/read-write-pixels'\n","import type { Color32, RGBA } from './_types'\n\n/**\n * Packs RGBA into a 32-bit integer compatible with\n * Little-Endian Uint32Array views on ImageData.\n */\nexport function packColor(r: number, g: number, b: number, a: number): Color32 {\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport function packRGBA({ r, g, b, a }: RGBA): Color32 {\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const unpackRed = (packed: Color32): number => (packed >>> 0) & 0xFF\nexport const unpackGreen = (packed: Color32): number => (packed >>> 8) & 0xFF\nexport const unpackBlue = (packed: Color32): number => (packed >>> 16) & 0xFF\nexport const unpackAlpha = (packed: Color32): number => (packed >>> 24) & 0xFF\n\nexport function unpackColor(packed: Color32): RGBA {\n return {\n r: (packed >>> 0) & 0xFF,\n g: (packed >>> 8) & 0xFF,\n b: (packed >>> 16) & 0xFF,\n a: (packed >>> 24) & 0xFF,\n }\n}\n\nconst SCRATCH_RGBA: RGBA = { r: 0, g: 0, b: 0, a: 0 }\n\n// uses a scratch arg for memory perf. Be careful about re-use.\nexport function unpackColorTo(packed: Color32, scratch = SCRATCH_RGBA): RGBA {\n scratch.r = (packed >>> 0) & 0xFF\n scratch.g = (packed >>> 8) & 0xFF\n scratch.b = (packed >>> 16) & 0xFF\n scratch.a = (packed >>> 24) & 0xFF\n return scratch\n}\n\nexport function colorDistance(a: Color32, b: Color32): number {\n const dr = (a & 0xFF) - (b & 0xFF)\n const dg = ((a >>> 8) & 0xFF) - ((b >>> 8) & 0xFF)\n const db = ((a >>> 16) & 0xFF) - ((b >>> 16) & 0xFF)\n const da = ((a >>> 24) & 0xFF) - ((b >>> 24) & 0xFF)\n return dr * dr + dg * dg + db * db + da * da\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using a floating-point weight.\n * * This is the preferred method for UI animations or scenarios where high\n * precision is required. It uses the standard `a + t * (b - a)` formula\n * for each channel.\n * @param a - The starting color as a 32-bit integer (AABBGGRR).\n * @param b - The target color as a 32-bit integer (AABBGGRR).\n * @param t - The interpolation factor between 0.0 and 1.0.\n * @returns The interpolated 32-bit color.\n */\nexport function lerpColor32(a: Color32, b: Color32, t: number): Color32 {\n const r = (a & 0xFF) + t * ((b & 0xFF) - (a & 0xFF))\n const g = ((a >>> 8) & 0xFF) + t * (((b >>> 8) & 0xFF) - ((a >>> 8) & 0xFF))\n const b_ = ((a >>> 16) & 0xFF) + t * (((b >>> 16) & 0xFF) - ((a >>> 16) & 0xFF))\n const a_ = ((a >>> 24) & 0xFF) + t * (((b >>> 24) & 0xFF) - ((a >>> 24) & 0xFF))\n\n return ((a_ << 24) | (b_ << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using integer fixed-point math.\n * Highly optimized for image processing and real-time blitting. It processes\n * channels in parallel using bitmasks (RB and GA pairs).\n * @note Subject to a 1-bit drift (rounding down) due to fast bit-shift division.\n * @param src - The source (foreground) color as a 32-bit integer.\n * @param dst - The destination (background) color as a 32-bit integer.\n * @param w - The blend weight as a byte value from 0 to 255. Where 0 is 100% dst and 255 is 100% src\n * @returns The blended 32-bit color.\n */export function lerpColor32Fast(src: Color32, dst: Color32, w: number): Color32 {\n const invA = 255 - w;\n\n // Masking Red and Blue: 0x00FF00FF\n // We process R and B in one go, then shift back down\n const rb = (((src & 0x00FF00FF) * w + (dst & 0x00FF00FF) * invA) >>> 8) & 0x00FF00FF;\n\n // Masking Green and Alpha: 0xFF00FF00\n // We shift down first to avoid overflow, then shift back up\n const ga = ((((src >>> 8) & 0x00FF00FF) * w + ((dst >>> 8) & 0x00FF00FF) * invA) >>> 8) & 0x00FF00FF;\n\n return (rb | (ga << 8)) >>> 0 as Color32;\n}\n\n// Convert 0xAABBGGRR to #RRGGBBAA\nexport function color32ToHex(color: Color32): string {\n const r = (color & 0xFF).toString(16).padStart(2, '0')\n const g = ((color >>> 8) & 0xFF).toString(16).padStart(2, '0')\n const b = ((color >>> 16) & 0xFF).toString(16).padStart(2, '0')\n const a = ((color >>> 24) & 0xFF).toString(16).padStart(2, '0')\n return `#${r}${g}${b}${a}`\n}\n\n/**\n * Converts a 32-bit integer (0xAABBGGRR) to a CSS rgba() string.\n * Example: 0xFF0000FF -> \"rgba(255,0,0,1)\"\n */\nexport function color32ToCssRGBA(color: Color32): string {\n const r = color & 0xFF\n const g = (color >>> 8) & 0xFF\n const b = (color >>> 16) & 0xFF\n const a = (color >>> 24) & 0xFF\n\n const alpha = Number((a / 255).toFixed(3))\n\n return `rgba(${r},${g},${b},${alpha})`\n}\n","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types'\n\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const binary = String.fromCharCode(...new Uint8Array(buffer))\n return btoa(binary) as Base64EncodedUInt8Array\n}\n\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray {\n const binary = atob(encoded)\n const bytes = new Uint8ClampedArray(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer),\n }\n}\n\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any\n\n return serializeImageData(imageData) as any\n}\n\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array),\n }\n}\n\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any\n}\n\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any\n return deserializeImageData(serialized) as any\n}\n","import type { BlendColor32, Color32 } from '../_types'\n\nexport const sourceOverColor32: BlendColor32 = (src, dst) => {\n const a = (src >>> 24) & 0xFF\n if (a === 255) return src\n if (a === 0) return dst\n\n // Pattern: (src * a + dst * (255 - a)) >> 8\n // We process RB and G separately so they don't overflow into each other\n const rbMask = 0xFF00FF\n const gMask = 0x00FF00\n\n const sRB = src & rbMask\n const sG = src & gMask\n const dRB = dst & rbMask\n const dG = dst & gMask\n\n const invA = 255 - a\n\n const outRB = ((sRB * a + dRB * invA) >> 8) & rbMask\n const outG = ((sG * a + dG * invA) >> 8) & gMask\n\n // Re-pack with opaque alpha (or calculate combined alpha if needed)\n const outA = (a + (((dst >>> 24) & 0xFF) * invA >> 8))\n return ((outA << 24) | outRB | outG) >>> 0 as Color32\n}\n\n/**\n * Screen: Lightens the destination (inverse of Multiply).\n * Result = 1 - ((1 - Src) * (1 - Dst))\n */\nexport const screenColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = 255 - (((255 - (src & 0xFF)) * (255 - dr)) >> 8)\n const bg = 255 - (((255 - ((src >> 8) & 0xFF)) * (255 - dg)) >> 8)\n const bb = 255 - (((255 - ((src >> 16) & 0xFF)) * (255 - db)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Linear Dodge (Additive): Simply adds the source to the destination.\n * Clamps at 255.\n */\nexport const linearDodgeColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math (Additive with clamping)\n const br = Math.min(255, (src & 0xFF) + dr)\n const bg = Math.min(255, ((src >> 8) & 0xFF) + dg)\n const bb = Math.min(255, ((src >> 16) & 0xFF) + db)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Multiply: Darkens the destination based on the source color.\n * Result = (Src * Dst) / 255\n */\nexport const multiplyColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = ((src & 0xFF) * dr) >> 8\n const bg = (((src >> 8) & 0xFF) * dg) >> 8\n const bb = (((src >> 16) & 0xFF) * db) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Difference: Subtracts the darker color from the lighter color.\n * Result = |Src - Dst|\n */\nexport const differenceColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = Math.abs((src & 0xFF) - dr)\n const bg = Math.abs(((src >> 8) & 0xFF) - dg)\n const bb = Math.abs(((src >> 16) & 0xFF) - db)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Hard Light: Decides Multiply vs Screen based on SOURCE brightness.\n * Acts like a harsh spotlight.\n */\nexport const hardLightColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >> 8) & 0xFF, sb = (src >> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = sr < 128 ? (2 * sr * dr) >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8)\n const bg = sg < 128 ? (2 * sg * dg) >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8)\n const bb = sb < 128 ? (2 * sb * db) >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Color Burn: Darkens the destination to reflect the source color.\n * Intense saturation in the darks.\n */\nexport const colorBurnColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >> 8) & 0xFF, sb = (src >> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math (Avoid division by zero)\n const br = dr === 255 ? 255 : Math.max(0, 255 - ((255 - dr) << 8) / (sr || 1))\n const bg = dg === 255 ? 255 : Math.max(0, 255 - ((255 - dg) << 8) / (sg || 1))\n const bb = db === 255 ? 255 : Math.max(0, 255 - ((255 - db) << 8) / (sb || 1))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n/**\n * Overlay: The classic \"Contrast\" mode.\n * Decides Multiply vs Screen based on DESTINATION brightness.\n */\nexport const overlayColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >> 8) & 0xFF, sb = (src >> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = dr < 128 ? (2 * sr * dr) >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8)\n const bg = dg < 128 ? (2 * sg * dg) >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8)\n const bb = db < 128 ? (2 * sb * db) >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const COLOR_32_BLEND_MODES = {\n sourceOver: sourceOverColor32,\n screen: screenColor32,\n linearDodge: linearDodgeColor32,\n multiply: multiplyColor32,\n difference: differenceColor32,\n overlay: overlayColor32,\n hardLight: hardLightColor32,\n colorBurn: colorBurnColor32,\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { sourceOverColor32 } from './blend-modes'\n\nexport type BlendImageDataOptions = {\n dx?: number\n dy?: number\n sx?: number\n sy?: number\n sw?: number\n sh?: number\n opacity?: number\n alpha?: number\n mask?: Uint8Array | null\n maskMode?: 'binary' | 'alpha'\n blendFn?: BlendColor32\n}\n\n/**\n * Blits source ImageData into a destination ImageData using 32-bit integer bitwise blending.\n * * This function bypasses standard Canvas API limitations by operating directly on\n * Uint32Array views. It supports various blend modes, binary/alpha masking, and\n * automatic clipping of both source and destination bounds.\n * * @param dst - The destination ImageData to write into.\n * @param src - The source ImageData to read from.\n * @param dst - The destination ImageData to write to.\n * @param opts - Configuration for the blit operation.\n * @param opts.dx - Destination X offset. Defaults to 0.\n * @param opts.dy - Destination Y offset. Defaults to 0.\n * @param opts.sx - Source X offset. Defaults to 0.\n * @param opts.sy - Source Y offset. Defaults to 0.\n * @param opts.sw - Width of the source area to blit. Defaults to src.width.\n * @param opts.sh - Height of the source area to blit. Defaults to src.height.\n * @param opts.opacity - Global strength of the blit (0.0 to 1.0). Defaults to 1.0.\n * @param opts.alpha - Global strength of the blit (0 to 255). Overrides 'opacity' if provided.\n * @param opts.mask - An optional Uint8Array acting as a stencil or alpha mask.\n * Must match source dimensions.\n * @param opts.maskMode - 'binary' ignores pixels where mask is 0.\n * 'alpha' scales source alpha by mask value (0-255).\n * @param opts.blendFn - The math logic used to combine pixels.\n * Defaults to `sourceOverColor32`.\n * * @example\n * blendImageData32(ctx.getImageData(0,0,100,100), sprite, {\n * blendFn: COLOR_32_BLEND_MODES.multiply,\n * mask: brushMask,\n * maskMode: 'alpha'\n * });\n */\nexport function blendImageData(\n dst: ImageData,\n src: ImageData,\n opts: BlendImageDataOptions,\n) {\n let {\n dx = 0,\n dy = 0,\n sx = 0,\n sy = 0,\n sw = src.width,\n sh = src.height,\n maskMode = 'alpha',\n opacity = 1,\n alpha,\n blendFn = sourceOverColor32,\n mask,\n } = opts\n\n // 1. Clip Source Area\n if (sx < 0) {\n dx -= sx\n sw += sx\n sx = 0\n }\n if (sy < 0) {\n dy -= sy\n sh += sy\n sy = 0\n }\n sw = Math.min(sw, src.width - sx)\n sh = Math.min(sh, src.height - sy)\n\n // 2. Clip Destination Area\n if (dx < 0) {\n sx -= dx\n sw += dx\n dx = 0\n }\n if (dy < 0) {\n sy -= dy\n sh += dy\n dy = 0\n }\n const actualW = Math.min(sw, dst.width - dx)\n const actualH = Math.min(sh, dst.height - dy)\n\n if (actualW <= 0 || actualH <= 0) return\n\n // 32-bit views of the same memory\n const dst32 = new Uint32Array(dst.data.buffer)\n const src32 = new Uint32Array(src.data.buffer)\n\n const dw = dst.width\n const sw_orig = src.width\n\n const gAlpha = alpha !== undefined\n ? (alpha | 0)\n : Math.round(opacity * 255)\n\n const maskIsAlpha = maskMode === 'alpha'\n\n for (let iy = 0; iy < actualH; iy++) {\n const dRow = (iy + dy) * dw\n const sRow = (iy + sy) * sw_orig\n\n for (let ix = 0; ix < actualW; ix++) {\n const di = dRow + (ix + dx)\n const si = sRow + (ix + sx)\n\n let s = src32[si] as Color32\n let sa = (s >>> 24) & 0xFF\n\n // skip fully transparent pixel\n if (sa === 0) continue\n\n let activeWeight = gAlpha\n\n if (mask) {\n const m = mask[si]\n if (m === 0) continue\n activeWeight = maskIsAlpha ? (m * activeWeight + 128) >> 8 : activeWeight\n }\n\n if (activeWeight < 255) {\n sa = (sa * activeWeight + 128) >> 8\n }\n\n // If combined alpha is 0 after masking/opacity, skip the blend math\n if (sa === 0) continue\n\n // Re-pack source with final calculated alpha\n s = ((s & 0x00FFFFFF) | (sa << 24)) >>> 0 as Color32\n\n dst32[di] = blendFn(s, dst32[di] as Color32)\n }\n }\n}\n","import type { Color32, ImageDataLike } from '../_types'\n\nexport function makeImageDataColor32Adapter(imageData: ImageDataLike) {\n const data32 = new Uint32Array(imageData.data.buffer)\n\n function inBounds(x: number, y: number) {\n return x < 0 || x >= imageData.width || y < 0 || y >= imageData.height\n }\n\n function setPixel(\n x: number,\n y: number,\n color: Color32,\n ): void {\n if (x < 0 || x >= imageData.width || y < 0 || y >= imageData.height) return\n data32[y * imageData.width + x] = color\n }\n\n function getPixel(\n x: number,\n y: number,\n ): Color32 | undefined {\n if (x < 0 || x >= imageData.width || y < 0 || y >= imageData.height) return\n\n return data32[y * imageData.width + x] as Color32\n }\n\n return {\n inBounds,\n imageData,\n data32,\n setPixel,\n getPixel,\n }\n}\n\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/_types.ts","../src/blend-modes.ts","../src/color.ts","../src/ImageData/copyImageData.ts","../src/ImageData/extractImageData.ts","../src/ImageData/serialization.ts","../src/PixelData/blendPixelData.ts"],"sourcesContent":["export * from './_types'\nexport * from './blend-modes'\nexport * from './color'\nexport * from './ImageData/copyImageData'\nexport * from './ImageData/extractImageData'\nexport * from './ImageData/serialization'\nexport * from './PixelData/blendPixelData'\n","/** ALL values are 0-255 (including alpha which in CSS is 0-1) */\nexport type RGBA = { r: number, g: number, b: number, a: number }\n\n/** Represents a 32-bit color in 0xAABBGGRR (Little endian) */\nexport type Color32 = number & { readonly __brandColor32: unique symbol }\n\n/**\n * A function that defines how to combine a source color with a destination color.\n * @param src - The incoming color (source).\n * @param dst - The existing color in the buffer (destination).\n * @returns The resulting 32-bit color to be written to the buffer.\n */\nexport type BlendColor32 = (src: Color32, dst: Color32) => Color32\n\nexport type ImageDataLike = {\n width: number\n height: number\n data: Uint8ClampedArray<ArrayBuffer>\n}\n\nexport type SerializedImageData = {\n width: number\n height: number\n data: string\n}\n\nexport type Base64EncodedUInt8Array = string & { readonly __brandBase64UInt8Array: unique symbol }\n\n/** Rectangle definition */\nexport type Rect = {\n x: number\n y: number\n w: number\n h: number\n}\n\n/**\n * Defines how mask values should be interpreted during a draw operation.\n */\nexport enum MaskType {\n /**\n * Values are treated as alpha weights.\n * 0 is skipped, values > 0 are processed.\n */\n ALPHA,\n /**\n * Values are treated as on/off.\n * 0 is fully transparent (skipped), any other value is fully opaque.\n */\n BINARY\n}\n\n/** Strictly 0 or 1 */\nexport type BinaryMask = Uint8Array & { readonly __brand: 'Binary' }\n/** Strictly 0-255 */\nexport type AlphaMask = Uint8Array & { readonly __brand: 'Alpha' }\n\nexport type AnyMask = BinaryMask | AlphaMask\n\n/**\n * Configuration for pixel manipulation operations.\n * Designed to be used by spreading a Rect object ({x, y, w, h}) directly.\n */\nexport interface PixelOptions {\n /**\n * The starting X coordinate in the destination buffer.\n * @Defaults 0.\n * */\n x?: number\n /**\n * The starting Y coordinate in the destination buffer.\n * @Default 0.\n * */\n y?: number\n /**\n * The width of the region to process.\n * @Default Source width.\n * */\n w?: number\n /**\n * The height of the region to process.\n * @Default Source height.\n * */\n h?: number\n\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number\n\n /**\n * Mask width.\n * @default w\n * */\n mw?: number\n\n /**\n * X offset into the mask buffer.\n * @default 0\n * */\n mx?: number\n\n /**\n * Y offset into the mask buffer.\n * @default 0\n * */\n my?: number\n\n /** An optional mask to restrict where pixels are written. */\n mask?: AnyMask | null\n\n /** The interpretation logic for the provided mask. Defaults to MaskType.Binary. */\n maskType?: MaskType\n\n /** If true the inverse of the mask will be applied */\n invertMask?: boolean\n}\n\n/**\n * Configuration for blitting (copying/blending) one image into another.\n */\nexport interface PixelBlendOptions extends PixelOptions {\n /**\n * The source rectangle x-coordinate\n * @default 0\n */\n sx?: number\n\n /**\n * The source rectangle y-coordinate\n * @default 0\n */\n sy?: number\n\n /** The specific blending function/algorithm to use for pixel math. */\n blendFn?: BlendColor32\n}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelOptions {\n /** The blending logic used to combine source and destination pixels. */\n blendFn?: BlendColor32\n}\n\nexport type ApplyMaskOptions = Omit<PixelOptions, 'mask'>\n\n// export function invertBinaryMask(dst: BinaryMask): void\n// export function invertAlphaMask(dst: AlphaMask): void\n\n","import type { BlendColor32, Color32 } from './_types'\n\nexport const sourceOverColor32: BlendColor32 = (src, dst) => {\n const a = (src >>> 24) & 0xFF\n if (a === 255) return src\n if (a === 0) return dst\n\n // Pattern: (src * a + dst * (255 - a)) >> 8\n // We process RB and G separately so they don't overflow into each other\n const rbMask = 0xFF00FF\n const gMask = 0x00FF00\n\n const sRB = src & rbMask\n const sG = src & gMask\n const dRB = dst & rbMask\n const dG = dst & gMask\n\n const invA = 255 - a\n\n const outRB = ((sRB * a + dRB * invA) >> 8) & rbMask\n const outG = ((sG * a + dG * invA) >> 8) & gMask\n\n // Re-pack with opaque alpha (or calculate combined alpha if needed)\n const outA = (a + (((dst >>> 24) & 0xFF) * invA >> 8))\n return ((outA << 24) | outRB | outG) >>> 0 as Color32\n}\n\n/**\n * Screen: Lightens the destination (inverse of Multiply).\n * Result = 1 - ((1 - Src) * (1 - Dst))\n */\nexport const screenColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = 255 - (((255 - (src & 0xFF)) * (255 - dr)) >> 8)\n const bg = 255 - (((255 - ((src >> 8) & 0xFF)) * (255 - dg)) >> 8)\n const bb = 255 - (((255 - ((src >> 16) & 0xFF)) * (255 - db)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Linear Dodge (Additive): Simply adds the source to the destination.\n * Clamps at 255.\n */\nexport const linearDodgeColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math (Additive with clamping)\n const br = Math.min(255, (src & 0xFF) + dr)\n const bg = Math.min(255, ((src >> 8) & 0xFF) + dg)\n const bb = Math.min(255, ((src >> 16) & 0xFF) + db)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Multiply: Darkens the destination based on the source color.\n * Result = (Src * Dst) / 255\n */\nexport const multiplyColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = ((src & 0xFF) * dr) >> 8\n const bg = (((src >> 8) & 0xFF) * dg) >> 8\n const bb = (((src >> 16) & 0xFF) * db) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Difference: Subtracts the darker color from the lighter color.\n * Result = |Src - Dst|\n */\nexport const differenceColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = Math.abs((src & 0xFF) - dr)\n const bg = Math.abs(((src >> 8) & 0xFF) - dg)\n const bb = Math.abs(((src >> 16) & 0xFF) - db)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Hard Light: Decides Multiply vs Screen based on SOURCE brightness.\n * Acts like a harsh spotlight.\n */\nexport const hardLightColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >> 8) & 0xFF, sb = (src >> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = sr < 128 ? (2 * sr * dr) >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8)\n const bg = sg < 128 ? (2 * sg * dg) >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8)\n const bb = sb < 128 ? (2 * sb * db) >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Color Burn: Darkens the destination to reflect the source color.\n * Intense saturation in the darks.\n */\nexport const colorBurnColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >> 8) & 0xFF, sb = (src >> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math (Avoid division by zero)\n const br = dr === 255 ? 255 : Math.max(0, 255 - ((255 - dr) << 8) / (sr || 1))\n const bg = dg === 255 ? 255 : Math.max(0, 255 - ((255 - dg) << 8) / (sg || 1))\n const bb = db === 255 ? 255 : Math.max(0, 255 - ((255 - db) << 8) / (sb || 1))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n/**\n * Overlay: The classic \"Contrast\" mode.\n * Decides Multiply vs Screen based on DESTINATION brightness.\n */\nexport const overlayColor32: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >> 8) & 0xFF, sb = (src >> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >> 8) & 0xFF, db = (dst >> 16) & 0xFF\n\n // 1. Core Math\n const br = dr < 128 ? (2 * sr * dr) >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8)\n const bg = dg < 128 ? (2 * sg * dg) >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8)\n const bb = db < 128 ? (2 * sb * db) >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 2. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const COLOR_32_BLEND_MODES = {\n sourceOver: sourceOverColor32,\n screen: screenColor32,\n linearDodge: linearDodgeColor32,\n multiply: multiplyColor32,\n difference: differenceColor32,\n overlay: overlayColor32,\n hardLight: hardLightColor32,\n colorBurn: colorBurnColor32,\n}\n","import type { Color32, RGBA } from './_types'\n\n/**\n * Packs RGBA into a 32-bit integer compatible with\n * Little-Endian Uint32Array views on ImageData.\n */\nexport function packColor(r: number, g: number, b: number, a: number): Color32 {\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport function packRGBA({ r, g, b, a }: RGBA): Color32 {\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const unpackRed = (packed: Color32): number => (packed >>> 0) & 0xFF\nexport const unpackGreen = (packed: Color32): number => (packed >>> 8) & 0xFF\nexport const unpackBlue = (packed: Color32): number => (packed >>> 16) & 0xFF\nexport const unpackAlpha = (packed: Color32): number => (packed >>> 24) & 0xFF\n\nexport function unpackColor(packed: Color32): RGBA {\n return {\n r: (packed >>> 0) & 0xFF,\n g: (packed >>> 8) & 0xFF,\n b: (packed >>> 16) & 0xFF,\n a: (packed >>> 24) & 0xFF,\n }\n}\n\nconst SCRATCH_RGBA: RGBA = { r: 0, g: 0, b: 0, a: 0 }\n\n// uses a scratch arg for memory perf. Be careful about re-use.\nexport function unpackColorTo(packed: Color32, scratch = SCRATCH_RGBA): RGBA {\n scratch.r = (packed >>> 0) & 0xFF\n scratch.g = (packed >>> 8) & 0xFF\n scratch.b = (packed >>> 16) & 0xFF\n scratch.a = (packed >>> 24) & 0xFF\n return scratch\n}\n\nexport function colorDistance(a: Color32, b: Color32): number {\n const dr = (a & 0xFF) - (b & 0xFF)\n const dg = ((a >>> 8) & 0xFF) - ((b >>> 8) & 0xFF)\n const db = ((a >>> 16) & 0xFF) - ((b >>> 16) & 0xFF)\n const da = ((a >>> 24) & 0xFF) - ((b >>> 24) & 0xFF)\n return dr * dr + dg * dg + db * db + da * da\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using a floating-point weight.\n * * This is the preferred method for UI animations or scenarios where high\n * precision is required. It uses the standard `a + t * (b - a)` formula\n * for each channel.\n * @param a - The starting color as a 32-bit integer (AABBGGRR).\n * @param b - The target color as a 32-bit integer (AABBGGRR).\n * @param t - The interpolation factor between 0.0 and 1.0.\n * @returns The interpolated 32-bit color.\n */\nexport function lerpColor32(a: Color32, b: Color32, t: number): Color32 {\n const r = (a & 0xFF) + t * ((b & 0xFF) - (a & 0xFF))\n const g = ((a >>> 8) & 0xFF) + t * (((b >>> 8) & 0xFF) - ((a >>> 8) & 0xFF))\n const b_ = ((a >>> 16) & 0xFF) + t * (((b >>> 16) & 0xFF) - ((a >>> 16) & 0xFF))\n const a_ = ((a >>> 24) & 0xFF) + t * (((b >>> 24) & 0xFF) - ((a >>> 24) & 0xFF))\n\n return ((a_ << 24) | (b_ << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * Linearly interpolates between two 32-bit colors using integer fixed-point math.\n * Highly optimized for image processing and real-time blitting. It processes\n * channels in parallel using bitmasks (RB and GA pairs).\n * @note Subject to a 1-bit drift (rounding down) due to fast bit-shift division.\n * @param src - The source (foreground) color as a 32-bit integer.\n * @param dst - The destination (background) color as a 32-bit integer.\n * @param w - The blend weight as a byte value from 0 to 255. Where 0 is 100% dst and 255 is 100% src\n * @returns The blended 32-bit color.\n */export function lerpColor32Fast(src: Color32, dst: Color32, w: number): Color32 {\n const invA = 255 - w;\n\n // Masking Red and Blue: 0x00FF00FF\n // We process R and B in one go, then shift back down\n const rb = (((src & 0x00FF00FF) * w + (dst & 0x00FF00FF) * invA) >>> 8) & 0x00FF00FF;\n\n // Masking Green and Alpha: 0xFF00FF00\n // We shift down first to avoid overflow, then shift back up\n const ga = ((((src >>> 8) & 0x00FF00FF) * w + ((dst >>> 8) & 0x00FF00FF) * invA) >>> 8) & 0x00FF00FF;\n\n return (rb | (ga << 8)) >>> 0 as Color32;\n}\n\n// Convert 0xAABBGGRR to #RRGGBBAA\nexport function color32ToHex(color: Color32): string {\n const r = (color & 0xFF).toString(16).padStart(2, '0')\n const g = ((color >>> 8) & 0xFF).toString(16).padStart(2, '0')\n const b = ((color >>> 16) & 0xFF).toString(16).padStart(2, '0')\n const a = ((color >>> 24) & 0xFF).toString(16).padStart(2, '0')\n return `#${r}${g}${b}${a}`\n}\n\n/**\n * Converts a 32-bit integer (0xAABBGGRR) to a CSS rgba() string.\n * Example: 0xFF0000FF -> \"rgba(255,0,0,1)\"\n */\nexport function color32ToCssRGBA(color: Color32): string {\n const r = color & 0xFF\n const g = (color >>> 8) & 0xFF\n const b = (color >>> 16) & 0xFF\n const a = (color >>> 24) & 0xFF\n\n const alpha = Number((a / 255).toFixed(3))\n\n return `rgba(${r},${g},${b},${alpha})`\n}\n","import type { ImageDataLike } from '../_types'\n\nexport function copyImageData({ data, width, height }: ImageDataLike): ImageData {\n return new ImageData(data.slice(), width, height)\n}\n\nexport function copyImageDataLike({ data, width, height }: ImageDataLike): ImageDataLike {\n return {\n data: data.slice(),\n width,\n height,\n }\n}\n","import type { ImageDataLike, Rect } from '../_types'\n\nexport function extractImageData(\n imageData: ImageDataLike,\n rect: Rect,\n): Uint8ClampedArray\nexport function extractImageData(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8ClampedArray\nexport function extractImageData(\n imageData: ImageDataLike,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): Uint8ClampedArray {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const { width: srcW, height: srcH, data: src } = imageData\n // Safety check for invalid dimensions\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0)\n const out = new Uint8ClampedArray(w * h * 4)\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(srcW, x + w)\n const y1 = Math.min(srcH, y + h)\n\n // If no intersection, return the empty\n if (x1 <= x0 || y1 <= y0) return out\n\n for (let row = 0; row < (y1 - y0); row++) {\n // Where to read from the source canvas\n const srcRow = y0 + row\n const srcStart = (srcRow * srcW + x0) * 4\n const rowLen = (x1 - x0) * 4\n\n // Where to write into the 'out' patch\n const dstRow = (y0 - y) + row\n const dstCol = (x0 - x)\n const dstStart = (dstRow * w + dstCol) * 4\n\n // Perform the high-speed bulk copy\n out.set(src.subarray(srcStart, srcStart + rowLen), dstStart)\n }\n\n return out\n}\n","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types'\n\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const binary = String.fromCharCode(...new Uint8Array(buffer))\n return btoa(binary) as Base64EncodedUInt8Array\n}\n\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded)\n const bytes = new Uint8ClampedArray(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer),\n }\n}\n\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any\n\n return serializeImageData(imageData) as any\n}\n\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array),\n }\n}\n\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any\n}\n\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any\n return deserializeImageData(serialized) as any\n}\n","import { type Color32, MaskType, type PixelBlendOptions } from '../_types'\nimport { sourceOverColor32 } from '../blend-modes'\nimport type { PixelData } from '../PixelData'\n\n/**\n * Blits source PixelData into a destination PixelData using 32-bit integer bitwise blending.\n * This function bypasses standard ImageData limitations by operating directly on\n * Uint32Array views. It supports various blend modes, binary/alpha masking, and\n * automatic clipping of both source and destination bounds.\n * @example\n *\n * const dst = new PixelData(ctx.getImageData(0,0,100,100))\n * blendImageData32(dst, sprite, {\n * blendFn: COLOR_32_BLEND_MODES.multiply,\n * mask: brushMask,\n * maskType: MaskType.ALPHA\n * });\n */\nexport function blendPixelData(\n dst: PixelData,\n src: PixelData,\n opts: PixelBlendOptions,\n) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n sx: sourceX = 0,\n sy: sourceY = 0,\n w: width = src.width,\n h: height = src.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverColor32,\n mask,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (globalAlpha === 0) return\n\n let x = targetX\n let y = targetY\n let sx = sourceX\n let sy = sourceY\n let w = width\n let h = height\n\n // 1. Source Clipping\n if (sx < 0) {\n x -= sx\n w += sx\n sx = 0\n }\n if (sy < 0) {\n y -= sy\n h += sy\n sy = 0\n }\n w = Math.min(w, src.width - sx)\n h = Math.min(h, src.height - sy)\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x\n w += x\n x = 0\n }\n if (y < 0) {\n sy -= y\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0) return\n\n const dst32 = dst.data32\n const src32 = src.data32\n const dw = dst.width\n const sw = src.width\n const mPitch = mw ?? width\n const isAlphaMask = maskType === MaskType.ALPHA\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let sIdx = sy * sw + sx\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const sStride = sw - actualW\n const mStride = mPitch - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const baseSrcColor = src32[sIdx] as Color32\n const baseSrcAlpha = (baseSrcColor >>> 24)\n\n // Early exit if source pixel is already transparent\n if (baseSrcAlpha === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n let weight = globalAlpha\n\n if (mask) {\n const mVal = mask[mIdx]\n\n if (isAlphaMask) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // If mask is transparent, skip\n if (effectiveM === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n // globalAlpha is not a factor\n if (globalAlpha === 255) {\n weight = effectiveM\n // mask is not a factor\n } else if (effectiveM === 255) {\n weight = globalAlpha\n } else {\n // use rounding-corrected multiplication\n weight = (effectiveM * globalAlpha + 128) >> 8\n }\n } else {\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // Final safety check for weight (can be 0 if globalAlpha or alphaMask rounds down)\n if (weight === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcAlpha = baseSrcAlpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (currentSrcAlpha === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n currentSrcColor = ((baseSrcColor & 0x00ffffff) | (currentSrcAlpha << 24)) >>> 0 as Color32\n }\n\n dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx] as Color32)\n\n dIdx++\n sIdx++\n mIdx++\n }\n\n dIdx += dStride\n sIdx += sStride\n mIdx += mStride\n }\n}\n"],"mappings":"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","names":["MaskType"]}
package/dist/index.dev.js CHANGED
@@ -1,107 +1,11 @@
1
- // src/color.ts
2
- function packColor(r, g, b, a) {
3
- return (a << 24 | b << 16 | g << 8 | r) >>> 0;
4
- }
5
- function packRGBA({ r, g, b, a }) {
6
- return (a << 24 | b << 16 | g << 8 | r) >>> 0;
7
- }
8
- var unpackRed = (packed) => packed >>> 0 & 255;
9
- var unpackGreen = (packed) => packed >>> 8 & 255;
10
- var unpackBlue = (packed) => packed >>> 16 & 255;
11
- var unpackAlpha = (packed) => packed >>> 24 & 255;
12
- function unpackColor(packed) {
13
- return {
14
- r: packed >>> 0 & 255,
15
- g: packed >>> 8 & 255,
16
- b: packed >>> 16 & 255,
17
- a: packed >>> 24 & 255
18
- };
19
- }
20
- var SCRATCH_RGBA = { r: 0, g: 0, b: 0, a: 0 };
21
- function unpackColorTo(packed, scratch = SCRATCH_RGBA) {
22
- scratch.r = packed >>> 0 & 255;
23
- scratch.g = packed >>> 8 & 255;
24
- scratch.b = packed >>> 16 & 255;
25
- scratch.a = packed >>> 24 & 255;
26
- return scratch;
27
- }
28
- function colorDistance(a, b) {
29
- const dr = (a & 255) - (b & 255);
30
- const dg = (a >>> 8 & 255) - (b >>> 8 & 255);
31
- const db = (a >>> 16 & 255) - (b >>> 16 & 255);
32
- const da = (a >>> 24 & 255) - (b >>> 24 & 255);
33
- return dr * dr + dg * dg + db * db + da * da;
34
- }
35
- function lerpColor32(a, b, t) {
36
- const r = (a & 255) + t * ((b & 255) - (a & 255));
37
- const g = (a >>> 8 & 255) + t * ((b >>> 8 & 255) - (a >>> 8 & 255));
38
- const b_ = (a >>> 16 & 255) + t * ((b >>> 16 & 255) - (a >>> 16 & 255));
39
- const a_ = (a >>> 24 & 255) + t * ((b >>> 24 & 255) - (a >>> 24 & 255));
40
- return (a_ << 24 | b_ << 16 | g << 8 | r) >>> 0;
41
- }
42
- function lerpColor32Fast(src, dst, w) {
43
- const invA = 255 - w;
44
- const rb = (src & 16711935) * w + (dst & 16711935) * invA >>> 8 & 16711935;
45
- const ga = (src >>> 8 & 16711935) * w + (dst >>> 8 & 16711935) * invA >>> 8 & 16711935;
46
- return (rb | ga << 8) >>> 0;
47
- }
48
- function color32ToHex(color) {
49
- const r = (color & 255).toString(16).padStart(2, "0");
50
- const g = (color >>> 8 & 255).toString(16).padStart(2, "0");
51
- const b = (color >>> 16 & 255).toString(16).padStart(2, "0");
52
- const a = (color >>> 24 & 255).toString(16).padStart(2, "0");
53
- return `#${r}${g}${b}${a}`;
54
- }
55
- function color32ToCssRGBA(color) {
56
- const r = color & 255;
57
- const g = color >>> 8 & 255;
58
- const b = color >>> 16 & 255;
59
- const a = color >>> 24 & 255;
60
- const alpha = Number((a / 255).toFixed(3));
61
- return `rgba(${r},${g},${b},${alpha})`;
62
- }
1
+ // src/_types.ts
2
+ var MaskType = /* @__PURE__ */ ((MaskType2) => {
3
+ MaskType2[MaskType2["ALPHA"] = 0] = "ALPHA";
4
+ MaskType2[MaskType2["BINARY"] = 1] = "BINARY";
5
+ return MaskType2;
6
+ })(MaskType || {});
63
7
 
64
- // src/ImageData/serialization.ts
65
- function base64EncodeArrayBuffer(buffer) {
66
- const binary = String.fromCharCode(...new Uint8Array(buffer));
67
- return btoa(binary);
68
- }
69
- function base64DecodeArrayBuffer(encoded) {
70
- const binary = atob(encoded);
71
- const bytes = new Uint8ClampedArray(binary.length);
72
- for (let i = 0; i < binary.length; i++) {
73
- bytes[i] = binary.charCodeAt(i);
74
- }
75
- return bytes;
76
- }
77
- function serializeImageData(imageData) {
78
- return {
79
- width: imageData.width,
80
- height: imageData.height,
81
- data: base64EncodeArrayBuffer(imageData.data.buffer)
82
- };
83
- }
84
- function serializeNullableImageData(imageData) {
85
- if (!imageData) return null;
86
- return serializeImageData(imageData);
87
- }
88
- function deserializeRawImageData(serialized) {
89
- return {
90
- width: serialized.width,
91
- height: serialized.height,
92
- data: base64DecodeArrayBuffer(serialized.data)
93
- };
94
- }
95
- function deserializeImageData(serialized) {
96
- const data = base64DecodeArrayBuffer(serialized.data);
97
- return new ImageData(data, serialized.width, serialized.height);
98
- }
99
- function deserializeNullableImageData(serialized) {
100
- if (!serialized) return null;
101
- return deserializeImageData(serialized);
102
- }
103
-
104
- // src/ImageData/blend-modes.ts
8
+ // src/blend-modes.ts
105
9
  var sourceOverColor32 = (src, dst) => {
106
10
  const a = src >>> 24 & 255;
107
11
  if (a === 255) return src;
@@ -237,117 +141,300 @@ var COLOR_32_BLEND_MODES = {
237
141
  colorBurn: colorBurnColor32
238
142
  };
239
143
 
240
- // src/ImageData/blit.ts
241
- function blendImageData(dst, src, opts) {
242
- let {
243
- dx = 0,
244
- dy = 0,
245
- sx = 0,
246
- sy = 0,
247
- sw = src.width,
248
- sh = src.height,
249
- maskMode = "alpha",
250
- opacity = 1,
251
- alpha,
144
+ // src/color.ts
145
+ function packColor(r, g, b, a) {
146
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
147
+ }
148
+ function packRGBA({ r, g, b, a }) {
149
+ return (a << 24 | b << 16 | g << 8 | r) >>> 0;
150
+ }
151
+ var unpackRed = (packed) => packed >>> 0 & 255;
152
+ var unpackGreen = (packed) => packed >>> 8 & 255;
153
+ var unpackBlue = (packed) => packed >>> 16 & 255;
154
+ var unpackAlpha = (packed) => packed >>> 24 & 255;
155
+ function unpackColor(packed) {
156
+ return {
157
+ r: packed >>> 0 & 255,
158
+ g: packed >>> 8 & 255,
159
+ b: packed >>> 16 & 255,
160
+ a: packed >>> 24 & 255
161
+ };
162
+ }
163
+ var SCRATCH_RGBA = { r: 0, g: 0, b: 0, a: 0 };
164
+ function unpackColorTo(packed, scratch = SCRATCH_RGBA) {
165
+ scratch.r = packed >>> 0 & 255;
166
+ scratch.g = packed >>> 8 & 255;
167
+ scratch.b = packed >>> 16 & 255;
168
+ scratch.a = packed >>> 24 & 255;
169
+ return scratch;
170
+ }
171
+ function colorDistance(a, b) {
172
+ const dr = (a & 255) - (b & 255);
173
+ const dg = (a >>> 8 & 255) - (b >>> 8 & 255);
174
+ const db = (a >>> 16 & 255) - (b >>> 16 & 255);
175
+ const da = (a >>> 24 & 255) - (b >>> 24 & 255);
176
+ return dr * dr + dg * dg + db * db + da * da;
177
+ }
178
+ function lerpColor32(a, b, t) {
179
+ const r = (a & 255) + t * ((b & 255) - (a & 255));
180
+ const g = (a >>> 8 & 255) + t * ((b >>> 8 & 255) - (a >>> 8 & 255));
181
+ const b_ = (a >>> 16 & 255) + t * ((b >>> 16 & 255) - (a >>> 16 & 255));
182
+ const a_ = (a >>> 24 & 255) + t * ((b >>> 24 & 255) - (a >>> 24 & 255));
183
+ return (a_ << 24 | b_ << 16 | g << 8 | r) >>> 0;
184
+ }
185
+ function lerpColor32Fast(src, dst, w) {
186
+ const invA = 255 - w;
187
+ const rb = (src & 16711935) * w + (dst & 16711935) * invA >>> 8 & 16711935;
188
+ const ga = (src >>> 8 & 16711935) * w + (dst >>> 8 & 16711935) * invA >>> 8 & 16711935;
189
+ return (rb | ga << 8) >>> 0;
190
+ }
191
+ function color32ToHex(color) {
192
+ const r = (color & 255).toString(16).padStart(2, "0");
193
+ const g = (color >>> 8 & 255).toString(16).padStart(2, "0");
194
+ const b = (color >>> 16 & 255).toString(16).padStart(2, "0");
195
+ const a = (color >>> 24 & 255).toString(16).padStart(2, "0");
196
+ return `#${r}${g}${b}${a}`;
197
+ }
198
+ function color32ToCssRGBA(color) {
199
+ const r = color & 255;
200
+ const g = color >>> 8 & 255;
201
+ const b = color >>> 16 & 255;
202
+ const a = color >>> 24 & 255;
203
+ const alpha = Number((a / 255).toFixed(3));
204
+ return `rgba(${r},${g},${b},${alpha})`;
205
+ }
206
+
207
+ // src/ImageData/copyImageData.ts
208
+ function copyImageData({ data, width, height }) {
209
+ return new ImageData(data.slice(), width, height);
210
+ }
211
+ function copyImageDataLike({ data, width, height }) {
212
+ return {
213
+ data: data.slice(),
214
+ width,
215
+ height
216
+ };
217
+ }
218
+
219
+ // src/ImageData/extractImageData.ts
220
+ function extractImageData(imageData, _x, _y, _w, _h) {
221
+ const { x, y, w, h } = typeof _x === "object" ? _x : { x: _x, y: _y, w: _w, h: _h };
222
+ const { width: srcW, height: srcH, data: src } = imageData;
223
+ if (w <= 0 || h <= 0) return new Uint8ClampedArray(0);
224
+ const out = new Uint8ClampedArray(w * h * 4);
225
+ const x0 = Math.max(0, x);
226
+ const y0 = Math.max(0, y);
227
+ const x1 = Math.min(srcW, x + w);
228
+ const y1 = Math.min(srcH, y + h);
229
+ if (x1 <= x0 || y1 <= y0) return out;
230
+ for (let row = 0; row < y1 - y0; row++) {
231
+ const srcRow = y0 + row;
232
+ const srcStart = (srcRow * srcW + x0) * 4;
233
+ const rowLen = (x1 - x0) * 4;
234
+ const dstRow = y0 - y + row;
235
+ const dstCol = x0 - x;
236
+ const dstStart = (dstRow * w + dstCol) * 4;
237
+ out.set(src.subarray(srcStart, srcStart + rowLen), dstStart);
238
+ }
239
+ return out;
240
+ }
241
+
242
+ // src/ImageData/serialization.ts
243
+ function base64EncodeArrayBuffer(buffer) {
244
+ const binary = String.fromCharCode(...new Uint8Array(buffer));
245
+ return btoa(binary);
246
+ }
247
+ function base64DecodeArrayBuffer(encoded) {
248
+ const binary = atob(encoded);
249
+ const bytes = new Uint8ClampedArray(binary.length);
250
+ for (let i = 0; i < binary.length; i++) {
251
+ bytes[i] = binary.charCodeAt(i);
252
+ }
253
+ return bytes;
254
+ }
255
+ function serializeImageData(imageData) {
256
+ return {
257
+ width: imageData.width,
258
+ height: imageData.height,
259
+ data: base64EncodeArrayBuffer(imageData.data.buffer)
260
+ };
261
+ }
262
+ function serializeNullableImageData(imageData) {
263
+ if (!imageData) return null;
264
+ return serializeImageData(imageData);
265
+ }
266
+ function deserializeRawImageData(serialized) {
267
+ return {
268
+ width: serialized.width,
269
+ height: serialized.height,
270
+ data: base64DecodeArrayBuffer(serialized.data)
271
+ };
272
+ }
273
+ function deserializeImageData(serialized) {
274
+ const data = base64DecodeArrayBuffer(serialized.data);
275
+ return new ImageData(data, serialized.width, serialized.height);
276
+ }
277
+ function deserializeNullableImageData(serialized) {
278
+ if (!serialized) return null;
279
+ return deserializeImageData(serialized);
280
+ }
281
+
282
+ // src/PixelData/blendPixelData.ts
283
+ function blendPixelData(dst, src, opts) {
284
+ const {
285
+ x: targetX = 0,
286
+ y: targetY = 0,
287
+ sx: sourceX = 0,
288
+ sy: sourceY = 0,
289
+ w: width = src.width,
290
+ h: height = src.height,
291
+ alpha: globalAlpha = 255,
252
292
  blendFn = sourceOverColor32,
253
- mask
293
+ mask,
294
+ maskType = 0 /* ALPHA */,
295
+ mw,
296
+ mx = 0,
297
+ my = 0,
298
+ invertMask = false
254
299
  } = opts;
300
+ if (globalAlpha === 0) return;
301
+ let x = targetX;
302
+ let y = targetY;
303
+ let sx = sourceX;
304
+ let sy = sourceY;
305
+ let w = width;
306
+ let h = height;
255
307
  if (sx < 0) {
256
- dx -= sx;
257
- sw += sx;
308
+ x -= sx;
309
+ w += sx;
258
310
  sx = 0;
259
311
  }
260
312
  if (sy < 0) {
261
- dy -= sy;
262
- sh += sy;
313
+ y -= sy;
314
+ h += sy;
263
315
  sy = 0;
264
316
  }
265
- sw = Math.min(sw, src.width - sx);
266
- sh = Math.min(sh, src.height - sy);
267
- if (dx < 0) {
268
- sx -= dx;
269
- sw += dx;
270
- dx = 0;
317
+ w = Math.min(w, src.width - sx);
318
+ h = Math.min(h, src.height - sy);
319
+ if (x < 0) {
320
+ sx -= x;
321
+ w += x;
322
+ x = 0;
271
323
  }
272
- if (dy < 0) {
273
- sy -= dy;
274
- sh += dy;
275
- dy = 0;
324
+ if (y < 0) {
325
+ sy -= y;
326
+ h += y;
327
+ y = 0;
276
328
  }
277
- const actualW = Math.min(sw, dst.width - dx);
278
- const actualH = Math.min(sh, dst.height - dy);
329
+ const actualW = Math.min(w, dst.width - x);
330
+ const actualH = Math.min(h, dst.height - y);
279
331
  if (actualW <= 0 || actualH <= 0) return;
280
- const dst32 = new Uint32Array(dst.data.buffer);
281
- const src32 = new Uint32Array(src.data.buffer);
332
+ const dst32 = dst.data32;
333
+ const src32 = src.data32;
282
334
  const dw = dst.width;
283
- const sw_orig = src.width;
284
- const gAlpha = alpha !== void 0 ? alpha | 0 : Math.round(opacity * 255);
285
- const maskIsAlpha = maskMode === "alpha";
335
+ const sw = src.width;
336
+ const mPitch = mw ?? width;
337
+ const isAlphaMask = maskType === 0 /* ALPHA */;
338
+ const dx = x - targetX;
339
+ const dy = y - targetY;
340
+ let dIdx = y * dw + x;
341
+ let sIdx = sy * sw + sx;
342
+ let mIdx = (my + dy) * mPitch + (mx + dx);
343
+ const dStride = dw - actualW;
344
+ const sStride = sw - actualW;
345
+ const mStride = mPitch - actualW;
286
346
  for (let iy = 0; iy < actualH; iy++) {
287
- const dRow = (iy + dy) * dw;
288
- const sRow = (iy + sy) * sw_orig;
289
347
  for (let ix = 0; ix < actualW; ix++) {
290
- const di = dRow + (ix + dx);
291
- const si = sRow + (ix + sx);
292
- let s = src32[si];
293
- let sa = s >>> 24 & 255;
294
- if (sa === 0) continue;
295
- let activeWeight = gAlpha;
348
+ const baseSrcColor = src32[sIdx];
349
+ const baseSrcAlpha = baseSrcColor >>> 24;
350
+ if (baseSrcAlpha === 0) {
351
+ dIdx++;
352
+ sIdx++;
353
+ mIdx++;
354
+ continue;
355
+ }
356
+ let weight = globalAlpha;
296
357
  if (mask) {
297
- const m = mask[si];
298
- if (m === 0) continue;
299
- activeWeight = maskIsAlpha ? m * activeWeight + 128 >> 8 : activeWeight;
358
+ const mVal = mask[mIdx];
359
+ if (isAlphaMask) {
360
+ const effectiveM = invertMask ? 255 - mVal : mVal;
361
+ if (effectiveM === 0) {
362
+ dIdx++;
363
+ sIdx++;
364
+ mIdx++;
365
+ continue;
366
+ }
367
+ if (globalAlpha === 255) {
368
+ weight = effectiveM;
369
+ } else if (effectiveM === 255) {
370
+ weight = globalAlpha;
371
+ } else {
372
+ weight = effectiveM * globalAlpha + 128 >> 8;
373
+ }
374
+ } else {
375
+ const isHit = invertMask ? mVal === 0 : mVal === 1;
376
+ if (!isHit) {
377
+ dIdx++;
378
+ sIdx++;
379
+ mIdx++;
380
+ continue;
381
+ }
382
+ weight = globalAlpha;
383
+ }
384
+ if (weight === 0) {
385
+ dIdx++;
386
+ sIdx++;
387
+ mIdx++;
388
+ continue;
389
+ }
300
390
  }
301
- if (activeWeight < 255) {
302
- sa = sa * activeWeight + 128 >> 8;
391
+ let currentSrcAlpha = baseSrcAlpha;
392
+ let currentSrcColor = baseSrcColor;
393
+ if (weight < 255) {
394
+ if (baseSrcAlpha === 255) {
395
+ currentSrcAlpha = weight;
396
+ } else {
397
+ currentSrcAlpha = baseSrcAlpha * weight + 128 >> 8;
398
+ }
399
+ if (currentSrcAlpha === 0) {
400
+ dIdx++;
401
+ sIdx++;
402
+ mIdx++;
403
+ continue;
404
+ }
405
+ currentSrcColor = (baseSrcColor & 16777215 | currentSrcAlpha << 24) >>> 0;
303
406
  }
304
- if (sa === 0) continue;
305
- s = (s & 16777215 | sa << 24) >>> 0;
306
- dst32[di] = blendFn(s, dst32[di]);
407
+ dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx]);
408
+ dIdx++;
409
+ sIdx++;
410
+ mIdx++;
307
411
  }
412
+ dIdx += dStride;
413
+ sIdx += sStride;
414
+ mIdx += mStride;
308
415
  }
309
416
  }
310
-
311
- // src/ImageData/read-write-pixels.ts
312
- function makeImageDataColor32Adapter(imageData) {
313
- const data32 = new Uint32Array(imageData.data.buffer);
314
- function inBounds(x, y) {
315
- return x < 0 || x >= imageData.width || y < 0 || y >= imageData.height;
316
- }
317
- function setPixel(x, y, color) {
318
- if (x < 0 || x >= imageData.width || y < 0 || y >= imageData.height) return;
319
- data32[y * imageData.width + x] = color;
320
- }
321
- function getPixel(x, y) {
322
- if (x < 0 || x >= imageData.width || y < 0 || y >= imageData.height) return;
323
- return data32[y * imageData.width + x];
324
- }
325
- return {
326
- inBounds,
327
- imageData,
328
- data32,
329
- setPixel,
330
- getPixel
331
- };
332
- }
333
417
  export {
334
418
  COLOR_32_BLEND_MODES,
419
+ MaskType,
335
420
  base64DecodeArrayBuffer,
336
421
  base64EncodeArrayBuffer,
337
- blendImageData,
422
+ blendPixelData,
338
423
  color32ToCssRGBA,
339
424
  color32ToHex,
340
425
  colorBurnColor32,
341
426
  colorDistance,
427
+ copyImageData,
428
+ copyImageDataLike,
342
429
  deserializeImageData,
343
430
  deserializeNullableImageData,
344
431
  deserializeRawImageData,
345
432
  differenceColor32,
433
+ extractImageData,
346
434
  hardLightColor32,
347
435
  lerpColor32,
348
436
  lerpColor32Fast,
349
437
  linearDodgeColor32,
350
- makeImageDataColor32Adapter,
351
438
  multiplyColor32,
352
439
  overlayColor32,
353
440
  packColor,