pixel-data-js 0.17.0 → 0.17.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/dist/index.dev.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/_types.ts","../src/color.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMask.ts","../src/Rect/trimRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/BlendModes/blend-modes-perfect.ts","../src/Canvas/_constants.ts","../src/Canvas/PixelCanvas.ts","../src/Canvas/ReusableCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/PixelPatchTiles.ts","../src/History/PixelAccumulator.ts","../src/History/HistoryManager.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyMaskToPixelData.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyMask.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorFillPixelData.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/copyImageData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/ImageData/imageDataToAlphaMask.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUInt32Array.ts","../src/ImageData/invertImageData.ts","../src/Internal/resample32.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/copyMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeMasks.ts","../src/PixelData/PixelData.ts","../src/PixelData/applyCircleBrushToPixelData.ts","../src/PixelData/applyRectBrushToPixelData.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/writePixelDataBuffer.ts"],"sourcesContent":["export * from './_types'\nexport * from './color'\n\nexport * from './Algorithm/floodFillSelection'\n\nexport * from './BlendModes/BlendModeRegistry'\nexport * from './BlendModes/blend-modes'\nexport * from './BlendModes/blend-modes-fast'\nexport * from './BlendModes/blend-modes-perfect'\n\nexport * from './Canvas/PixelCanvas'\nexport * from './Canvas/ReusableCanvas'\n\nexport * from './Clipboard/getImageDataFromClipboard'\nexport * from './Clipboard/writeImageDataToClipboard'\nexport * from './Clipboard/writeImgBlobToClipboard'\n\nexport * from './History/PixelAccumulator'\nexport * from './History/HistoryManager'\nexport * from './History/PixelEngineConfig'\nexport * from './History/PixelMutator'\nexport * from './History/PixelPatchTiles'\nexport * from './History/PixelWriter'\n\nexport * from './History/PixelMutator/mutatorApplyMask'\nexport * from './History/PixelMutator/mutatorBlendColor'\nexport * from './History/PixelMutator/mutatorBlendPixel'\nexport * from './History/PixelMutator/mutatorBlendPixelData'\nexport * from './History/PixelMutator/mutatorFillPixelData'\nexport * from './History/PixelMutator/mutatorInvert'\n\nexport * from './ImageData/ReusableImageData'\nexport * from './ImageData/copyImageData'\nexport * from './ImageData/extractImageDataBuffer'\nexport * from './ImageData/imageDataToAlphaMask'\nexport * from './ImageData/imageDataToDataUrl'\nexport * from './ImageData/imageDataToImgBlob'\nexport * from './ImageData/imageDataToUInt32Array'\nexport * from './ImageData/imgBlobToImageData'\nexport * from './ImageData/invertImageData'\nexport * from './ImageData/resampleImageData'\nexport * from './ImageData/resizeImageData'\nexport * from './ImageData/serialization'\nexport * from './ImageData/writeImageData'\nexport * from './ImageData/writeImageDataBuffer'\n\nexport * from './IndexedImage/IndexedImage'\nexport * from './IndexedImage/getIndexedImageColorCounts'\nexport * from './IndexedImage/indexedImageToAverageColor'\nexport * from './IndexedImage/resampleIndexedImage'\nexport * from './IndexedImage/indexedImageToImageData'\n\nexport * from './Input/fileInputChangeToImageData'\nexport * from './Input/fileToImageData'\nexport * from './Input/getSupportedRasterFormats'\n\nexport * from './Mask/copyMask'\nexport * from './Mask/extractMask'\nexport * from './Mask/invertMask'\nexport * from './Mask/mergeMasks'\n\nexport * from './PixelData/PixelData'\nexport * from './PixelData/applyCircleBrushToPixelData'\nexport * from './PixelData/applyMaskToPixelData'\nexport * from './PixelData/applyRectBrushToPixelData'\nexport * from './PixelData/blendColorPixelData'\nexport * from './PixelData/blendPixelData'\nexport * from './PixelData/clearPixelData'\nexport * from './PixelData/extractPixelData'\nexport * from './PixelData/extractPixelDataBuffer'\nexport * from './PixelData/fillPixelData'\nexport * from './PixelData/invertPixelData'\nexport * from './PixelData/pixelDataToAlphaMask'\nexport * from './PixelData/reflectPixelData'\nexport * from './PixelData/resamplePixelData'\nexport * from './PixelData/rotatePixelData'\nexport * from './PixelData/writePixelDataBuffer'\n\nexport * from './Rect/trimRectBounds'\n","import type { BlendColor32 } from '../_types'\n\nexport const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22,\n} as const\n\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\n\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>\n\nexport const overwriteBase: BlendColor32 = (src, _dst) => src\noverwriteBase.isOverwrite = true\n","import type { BlendColor32 } from '../_types'\nimport type { BaseBlendModes } from './blend-modes'\n\nexport type BlendModeRegistry<\n BlendModes extends BaseBlendModes = BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>\n\nexport function makeBlendModeRegistry<\n BlendModes extends BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n\n>(\n blendModes: BlendModes,\n initialEntries: Record<Index, BlendColor32>,\n) {\n\n const blendToName = new Map<BlendColor32, Name>()\n const blendToIndex = new Map<BlendColor32, Index>()\n const indexToName: Name[] = []\n const indexToBlend: BlendColor32[] = []\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 }\n const nameToIndex = {} as Record<Name, Index>\n\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n indexToName[index] = name\n indexToBlend[index] = blendFn\n blendToIndex.set(blendFn, index)\n blendToName.set(blendFn, name)\n nameToBlend[name] = blendFn\n nameToIndex[name] = index\n }\n\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index]\n add(name as Name, index as Index, blend)\n }\n\n return {\n nameToBlend,\n nameToIndex,\n\n blendToIndex,\n blendToName,\n\n indexToBlend,\n indexToName,\n\n indexType: null as unknown as Index,\n nameType: null as unknown as Name,\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwriteFast = overwriteBase\n\nexport const sourceOverFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return src\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 const da = (dst >>> 24) & 0xFF\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (sr * sa + dr * invA) >> 8\n const g = (sg * sa + dg * invA) >> 8\n const b = (sb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\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 const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** (src * dst) / 255 */\nexport const multiplyFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\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 // Consistent floor rounding for all channels\n const br = (sr * dr) >> 8\n const bg = (sg * dg) >> 8\n const bb = (sb * db) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\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 + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnFast: 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 const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / sr) | 0)\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / sg) | 0)\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\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 + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const bgU = dg + sg - 255\n const bbU = db + sb - 255\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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 darkerFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. 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/** Math.max(src, dst) */\nexport const lightenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const br = Math.max(src & 0xFF, dst & 0xFF)\n const bg = Math.max((src >> 8) & 0xFF, (dst >> 8) & 0xFF)\n const bb = Math.max((src >> 16) & 0xFF, (dst >> 16) & 0xFF)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const dr = dst & 0xFF\n const dg = (dst >> 8) & 0xFF\n const db = (dst >> 16) & 0xFF\n\n // 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 * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenFast: 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 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 // 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/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgeFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 255 ? 255 : Math.min(255, ((dr << 8) / (255 - sr)) | 0)\n const bg = sg === 255 ? 255 : Math.min(255, ((dg << 8) / (255 - sg)) | 0)\n const bb = sb === 255 ? 255 : Math.min(255, ((db << 8) / (255 - sb)) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** src + dst */\nexport const linearDodgeFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bbU = ((src >>> 16) & 0xFF) + db\n\n const br = brU > 255 ? 255 : brU\n const bg = bgU > 255 ? 255 : bgU\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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 lighterFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\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/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayFast: 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 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 // 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/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = ((255 - dr) * ((sr * dr) >> 8) + dr * (255 - (((255 - sr) * (255 - dr)) >> 8))) >> 8\n const bg = ((255 - dg) * ((sg * dg) >> 8) + dg * (255 - (((255 - sg) * (255 - dg)) >> 8))) >> 8\n const bb = ((255 - db) * ((sb * db) >> 8) + db * (255 - (((255 - sb) * (255 - db)) >> 8))) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\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 // 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 * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr + 2 * sr - 255\n const bgU = dg + 2 * sg - 255\n const bbU = db + 2 * sb - 255\n\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < 2 * sr ? dr : 2 * sr) : (dr > 2 * sr - 256 ? dr : 2 * sr - 256)\n const bg = sg < 128 ? (dg < 2 * sg ? dg : 2 * sg) : (dg > 2 * sg - 256 ? dg : 2 * sg - 256)\n const bb = sb < 128 ? (db < 2 * sb ? db : 2 * sb) : (db > 2 * sb - 256 ? db : 2 * sb - 256)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))) < 128 ? 0 : 255\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** Math.abs(src - dst) */\nexport const differenceFast: 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 const brD = (src & 0xFF) - dr\n const bgD = ((src >>> 8) & 0xFF) - dg\n const bbD = ((src >>> 16) & 0xFF) - db\n\n const br = brD < 0 ? -brD : brD\n const bg = bgD < 0 ? -bgD : bgD\n const bb = bbD < 0 ? -bbD : bbD\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** dst + src - ((dst * src) >> 7) */\nexport const exclusionFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr + sr - ((dr * sr) >> 7)\n const bg = dg + sg - ((dg * sg) >> 7)\n const bb = db + sb - ((db * sb) >> 7)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** Math.max(0, dst - src) */\nexport const subtractFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr - sr\n const bgU = dg - sg\n const bbU = db - sb\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const divideFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 0 ? 255 : Math.min(255, ((dr << 8) / sr) | 0)\n const bg = sg === 0 ? 255 : Math.min(255, ((dg << 8) / sg) | 0)\n const bb = sb === 0 ? 255 : Math.min(255, ((db << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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 BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast,\n}\n\nexport function makeFastBlendModeRegistry() {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS)\n}\n","import { sourceOverFast } from './BlendModes/blend-modes-fast'\n\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 = {\n (src: Color32, dst: Color32): Color32,\n isOverwrite?: true\n}\n\nexport type ImageDataLike = {\n width: number\n height: number\n data: Uint8ClampedArray<ArrayBufferLike>\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 PixelRectOptions {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number\n\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number\n\n /**\n * The width of the region to process.\n * @default Source width.\n */\n w?: number\n\n /**\n * The height of the region to process.\n * @default Source height.\n */\n h?: number\n}\n\nexport interface PixelMaskRectOptions {\n\n /**\n * Mask width.\n * @default value of `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\nexport interface PixelMaskInvertOptions {\n\n /**\n * If true the inverse of the mask will be applied\n * @default false\n */\n invertMask?: boolean\n}\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 extends PixelRectOptions, PixelMaskRectOptions, PixelMaskInvertOptions {\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: 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.\n * @default {@link MaskType.ALPHA}\n */\n maskType?: MaskType\n}\n\nexport interface PixelMutateOptions extends PixelRectOptions, PixelMaskRectOptions, PixelMaskInvertOptions {\n /** An optional mask to restrict where pixels are mutated. */\n mask?: BinaryMask | null\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 /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverFast}\n */\n blendFn?: BlendColor32\n}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelOptions {\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverFast}\n */\n blendFn?: BlendColor32\n}\n\nexport type ApplyMaskOptions = Omit<PixelOptions, 'mask'>\n\nexport type SelectionRect = Rect & ({\n mask: Uint8Array,\n maskType: MaskType,\n} | {\n mask?: null\n maskType?: null,\n})\n\nexport type Point = {\n x: number,\n y: number,\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, Rect } from '../_types'\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n rect: Rect,\n): Uint8ClampedArray\n/**\n * @param imageData - The source image data to read from.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8ClampedArray\nexport function extractImageDataBuffer(\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 { Rect } from '../_types'\n\n/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n rect: Rect,\n): Uint8Array\n/**\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8Array\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n xOrRect: number | Rect,\n y?: number,\n w?: number,\n h?: number,\n): Uint8Array {\n let finalX: number\n let finalY: number\n let finalW: number\n let finalH: number\n\n if (typeof xOrRect === 'object') {\n finalX = xOrRect.x\n finalY = xOrRect.y\n finalW = xOrRect.w\n finalH = xOrRect.h\n } else {\n finalX = xOrRect\n finalY = y!\n finalW = w!\n finalH = h!\n }\n\n const out = new Uint8Array(finalW * finalH)\n const srcH = mask.length / maskWidth\n\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row\n\n if (currentSrcY < 0 || currentSrcY >= srcH) {\n continue\n }\n\n const start = Math.max(0, finalX)\n const end = Math.min(maskWidth, finalX + finalW)\n\n if (start < end) {\n const srcOffset = currentSrcY * maskWidth + start\n const dstOffset = (row * finalW) + (start - finalX)\n const count = end - start\n\n out.set(\n mask.subarray(srcOffset, srcOffset + count),\n dstOffset,\n )\n }\n }\n\n return out\n}\n","import type { Rect, SelectionRect } from '../_types'\nimport { extractMask } from '../Mask/extractMask'\n\n/**\n * Intersects a target rectangle with a boundary, trimming dimensions and masks in-place.\n * This utility calculates the axis-aligned intersection between the `target` and `bounds`.\n * If the `target` includes a `mask` (as in a {@link SelectionRect}), the mask is physically\n * cropped and re-aligned using `extractMask` to match the new dimensions.\n * @param target - The rectangle or selection object to be trimmed. **Note:** This object is mutated in-place.\n * @param bounds - The boundary rectangle defining the maximum allowable area (e.g., canvas dimensions).\n * @example\n * const selection = { x: -10, y: -10, w: 50, h: 50, mask: new Uint8Array(2500) };\n * const canvas = { x: 0, y: 0, w: 100, h: 100 };\n * // Selection will be moved to (0,0) and resized to 40x40.\n * // The mask is cropped by 10 px on the top and left.\n * trimRectBounds(selection, canvas);\n */\nexport function trimRectBounds<T extends Rect | SelectionRect>(\n target: T,\n bounds: Rect,\n): void {\n const originalX = target.x\n const originalY = target.y\n const originalW = target.w\n\n const intersectedX = Math.max(target.x, bounds.x)\n const intersectedY = Math.max(target.y, bounds.y)\n\n const intersectedMaxX = Math.min(\n target.x + target.w,\n bounds.x + bounds.w,\n )\n const intersectedMaxY = Math.min(\n target.y + target.h,\n bounds.y + bounds.h,\n )\n\n // Intersection check\n if (intersectedMaxX <= intersectedX || intersectedMaxY <= intersectedY) {\n target.w = 0\n target.h = 0\n\n if ('mask' in target && target.mask) {\n // This line is now hit by the 'empty intersection' test below\n target.mask = new Uint8Array(0)\n }\n\n return\n }\n\n const intersectedW = intersectedMaxX - intersectedX\n const intersectedH = intersectedMaxY - intersectedY\n const offsetX = intersectedX - originalX\n const offsetY = intersectedY - originalY\n\n target.x = intersectedX\n target.y = intersectedY\n target.w = intersectedW\n target.h = intersectedH\n\n if ('mask' in target && target.mask) {\n const currentMask = extractMask(\n target.mask,\n originalW,\n offsetX,\n offsetY,\n intersectedW,\n intersectedH,\n )\n\n let minX = intersectedW\n let maxX = -1\n let minY = intersectedH\n let maxY = -1\n\n // Scan for content\n for (let y = 0; y < intersectedH; y++) {\n for (let x = 0; x < intersectedW; x++) {\n if (currentMask[y * intersectedW + x] !== 0) {\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n }\n\n // If no content is found (all zeros)\n if (maxX === -1) {\n target.w = 0\n target.h = 0\n // This covers the specific line you mentioned\n target.mask = new Uint8Array(0)\n return\n }\n\n const finalW = maxX - minX + 1\n const finalH = maxY - minY + 1\n\n // Only shift and crop if the content is smaller than the intersection\n if (finalW !== intersectedW || finalH !== intersectedH) {\n target.mask = extractMask(\n currentMask,\n intersectedW,\n minX,\n minY,\n finalW,\n finalH,\n )\n target.x += minX\n target.y += minY\n target.w = finalW\n target.h = finalH\n } else {\n target.mask = currentMask\n }\n }\n}\n","import { type Color32, type ImageDataLike, MaskType, type Rect, type SelectionRect } from '../_types'\nimport { colorDistance } from '../color'\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer'\nimport type { PixelData } from '../PixelData/PixelData'\nimport { trimRectBounds } from '../Rect/trimRectBounds'\n\nexport type FloodFillImageDataOptions = {\n contiguous?: boolean\n tolerance?: number\n bounds?: Rect\n}\n\nexport type FloodFillResult = {\n startX: number\n startY: number\n selectionRect: SelectionRect\n pixels: Uint8ClampedArray\n}\n\n/**\n * Performs a color-based flood fill selection on {@link ImageData} or {@link PixelData}.\n * This utility identifies pixels starting from a specific coordinate that fall within a\n * color tolerance. It can operate in \"contiguous\" mode (classic bucket fill) or\n * \"non-contiguous\" mode (selects all matching pixels in the buffer).\n *\n * @param img - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param options - Configuration for the fill operation.\n * @param options.contiguous - @default true. If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param options.tolerance - @default 0. The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param options.bounds - Optional bounding box to restrict the search area.\n *\n * @returns A {@link FloodFillResult} containing the mask and bounds of the selection,\n * or `null` if the starting coordinates are out of bounds.\n *\n * @example\n * ```typescript\n * const result = floodFillImageDataSelection(\n * ctx.getImageData(0, 0, 100, 100),\n * 50,\n * 50,\n * {\n * tolerance: 20,\n * contiguous: true\n * }\n * );\n * ```\n */\nexport function floodFillSelection(\n img: ImageDataLike | PixelData,\n startX: number,\n startY: number,\n {\n contiguous = true,\n tolerance = 0,\n bounds,\n }: FloodFillImageDataOptions = {},\n): FloodFillResult | null {\n\n let imageData: ImageDataLike\n let data32: Uint32Array\n if ('data32' in img) {\n data32 = img.data32\n imageData = img.imageData\n } else {\n data32 = new Uint32Array(\n img.data.buffer,\n img.data.byteOffset,\n img.data.byteLength >> 2,\n )\n imageData = img\n }\n const {\n width,\n height,\n } = img\n\n const limit = bounds || {\n x: 0,\n y: 0,\n w: width,\n h: height,\n }\n\n const xMin = Math.max(0, limit.x)\n const xMax = Math.min(width - 1, limit.x + limit.w - 1)\n const yMin = Math.max(0, limit.y)\n const yMax = Math.min(height - 1, limit.y + limit.h - 1)\n\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null\n }\n\n const baseColor = data32[startY * width + startX] as Color32\n\n let matchCount = 0\n const matchX = new Uint16Array(width * height)\n const matchY = new Uint16Array(width * height)\n\n let minX = startX\n let maxX = startX\n let minY = startY\n let maxY = startY\n\n if (contiguous) {\n const visited = new Uint8Array(width * height)\n const stack = new Uint32Array(width * height)\n let stackPtr = 0\n\n stack[stackPtr++] = (startY << 16) | startX\n visited[startY * width + startX] = 1\n\n while (stackPtr > 0) {\n const val = stack[--stackPtr]\n const x = val & 0xFFFF\n const y = val >>> 16\n\n matchX[matchCount] = x\n matchY[matchCount] = y\n matchCount++\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n\n // Right\n if (x + 1 <= xMax) {\n const idx = y * width + (x + 1)\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = (y << 16) | (x + 1)\n }\n }\n // Left\n if (x - 1 >= xMin) {\n const idx = y * width + (x - 1)\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = (y << 16) | (x - 1)\n }\n }\n // Down\n if (y + 1 <= yMax) {\n const idx = (y + 1) * width + x\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = ((y + 1) << 16) | x\n }\n }\n // Up\n if (y - 1 >= yMin) {\n const idx = (y - 1) * width + x\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = ((y - 1) << 16) | x\n }\n }\n }\n } else {\n for (let y = yMin; y <= yMax; y++) {\n for (let x = xMin; x <= xMax; x++) {\n const color = data32[y * width + x] as Color32\n if (colorDistance(color, baseColor) <= tolerance) {\n matchX[matchCount] = x\n matchY[matchCount] = y\n matchCount++\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n }\n }\n\n if (matchCount === 0) {\n return null\n }\n const selectionRect: SelectionRect = {\n x: minX,\n y: minY,\n w: maxX - minX + 1,\n h: maxY - minY + 1,\n mask: new Uint8Array((maxX - minX + 1) * (maxY - minY + 1)),\n maskType: MaskType.BINARY,\n }\n\n // REMOVED trimRectBounds from here\n\n const sw = selectionRect.w\n const sh = selectionRect.h\n const finalMask = selectionRect.mask!\n\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - selectionRect.x\n const my = matchY[i] - selectionRect.y\n\n if (mx >= 0 && mx < sw && my >= 0 && my < sh) {\n finalMask[my * sw + mx] = 1\n }\n }\n\n // trimRectBounds can see them and work correctly.\n trimRectBounds(\n selectionRect,\n { x: 0, y: 0, w: width, h: height },\n )\n\n // Use the UPDATED values from the selectionRect after trimming\n const extracted = extractImageDataBuffer(\n imageData,\n selectionRect.x,\n selectionRect.y,\n selectionRect.w,\n selectionRect.h,\n )\n\n return {\n startX,\n startY,\n selectionRect,\n pixels: extracted,\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwritePerfect = overwriteBase\n\nexport const sourceOverPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return src\n if (sa === 0) return dst\n\n const invA = 255 - sa\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 const da = (dst >>> 24) & 0xFF\n\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = (sr * sa + dr * invA)\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = (sg * sa + dg * invA)\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = (sb * sa + db * invA)\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = (255 * sa + da * invA)\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\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 const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (src * dst) / 255 */\nexport const multiplyPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const da = (dst >>> 24) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr\n const br = (mR + 1 + (mR >> 8)) >> 8\n\n const mG = sg * dg\n const bg = (mG + 1 + (mG >> 8)) >> 8\n\n const mB = sb * db\n const bb = (mB + 1 + (mB >> 8)) >> 8\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - (((255 - dr) * 255 / sr) | 0)\n const br = resR < 0 ? 0 : resR\n\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - (((255 - dg) * 255 / sg) | 0)\n const bg = resG < 0 ? 0 : resG\n\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - (((255 - db) * 255 / sb) | 0)\n const bb = resB < 0 ? 0 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const br = brU < 0 ? 0 : brU\n const bgU = dg + sg - 255\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db + sb - 255\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkerPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(src, dst) */\nexport const lightenPerfect: 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 const br = (src & 0xFF) > dr ? (src & 0xFF) : dr\n const bg = ((src >>> 8) & 0xFF) > dg ? ((src >>> 8) & 0xFF) : dg\n const bb = ((src >>> 16) & 0xFF) > db ? ((src >>> 16) & 0xFF) : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenPerfect: 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 const br = 255 - (((255 - (src & 0xFF)) * (255 - dr) / 255) | 0)\n const bg = 255 - (((255 - ((src >>> 8) & 0xFF)) * (255 - dg) / 255) | 0)\n const bb = 255 - (((255 - ((src >>> 16) & 0xFF)) * (255 - db) / 255) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : (dr * 255 / (255 - sr)) | 0\n const br = resR > 255 ? 255 : resR\n\n const resG = sg === 255 ? 255 : (dg * 255 / (255 - sg)) | 0\n const bg = resG > 255 ? 255 : resG\n\n const resB = sb === 255 ? 255 : (db * 255 / (255 - sb)) | 0\n const bb = resB > 255 ? 255 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst */\nexport const linearDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const br = brU > 255 ? 255 : brU\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bg = bgU > 255 ? 255 : bgU\n const bbU = ((src >>> 16) & 0xFF) + db\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const lighterPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayPerfect: 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 const br = dr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = dg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = db < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const mR = (sr * dr)\n const scR = (255 - sr) * (255 - dr)\n const br = ((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8)) + 1 + (((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8))) >> 8)) >> 8\n\n const mG = (sg * dg)\n const scG = (255 - sg) * (255 - dg)\n const bg = ((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8)) + 1 + (((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8))) >> 8)) >> 8\n\n const mB = (sb * db)\n const scB = (255 - sb) * (255 - db)\n const bb = ((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8)) + 1 + (((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8))) >> 8)) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = sg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = sb < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr + 2 * sr - 255\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bgU = dg + 2 * sg - 255\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bbU = db + 2 * sb - 255\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < (sr << 1) ? dr : (sr << 1)) : (dr > ((sr - 128) << 1) ? dr : ((sr - 128) << 1))\n const bg = sg < 128 ? (dg < (sg << 1) ? dg : (sg << 1)) : (dg > ((sg - 128) << 1) ? dg : ((sg - 128) << 1))\n const bb = sb < 128 ? (db < (sb << 1) ? db : (sb << 1)) : (db > ((sb - 128) << 1) ? db : ((sb - 128) << 1))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))) < 128 ? 0 : 255\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.abs(src - dst) */\nexport const differencePerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr > sr ? dr - sr : sr - dr\n const bg = dg > sg ? dg - sg : sg - dg\n const bb = db > sb ? db - sb : sb - db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const r2 = dr * sr\n const br = dr + sr - (((r2 + r2) + 1 + ((r2 + r2) >> 8)) >> 8)\n\n const g2 = dg * sg\n const bg = dg + sg - (((g2 + g2) + 1 + ((g2 + g2) >> 8)) >> 8)\n\n const b2 = db * sb\n const bb = db + sb - (((b2 + b2) + 1 + ((b2 + b2) >> 8)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(0, dst - src) */\nexport const subtractPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr - sr\n const br = brU < 0 ? 0 : brU\n const bgU = dg - sg\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db - sb\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const dividePerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr === 0 ? 255 : Math.min(255, ((dr * 255 / sr) | 0))\n const bg = sg === 0 ? 255 : Math.min(255, ((dg * 255 / sg) | 0))\n const bb = sb === 0 ? 255 : Math.min(255, ((db * 255 / sb) | 0))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect,\n}\n\nexport function makePerfectBlendModeRegistry() {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS)\n}\n","export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context'\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context'\n","import { CANVAS_CTX_FAILED } from './_constants'\n\nexport type PixelCanvas = {\n readonly canvas: HTMLCanvasElement,\n readonly ctx: CanvasRenderingContext2D,\n readonly resize: (w: number, h: number) => void\n}\n\n/**\n * Ensures the canvas ctx is always set to imageSmoothingEnabled = false.\n * Intended for canvas elements that are already part of the DOM.\n * @see makeReusableCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makePixelCanvas(\n canvas: HTMLCanvasElement,\n): PixelCanvas {\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error(CANVAS_CTX_FAILED)\n ctx.imageSmoothingEnabled = false\n\n return {\n canvas,\n ctx,\n resize(w: number, h: number) {\n canvas.width = w\n canvas.height = h\n ctx.imageSmoothingEnabled = false\n },\n }\n}\n","import { CANVAS_CTX_FAILED } from './_constants'\n\nexport type ReusableCanvas = {\n readonly canvas: HTMLCanvasElement\n readonly ctx: CanvasRenderingContext2D\n}\n\n/**\n * Creates a reusable canvas and context that are not part of the DOM.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makeReusableCanvas() {\n let canvas: HTMLCanvasElement | null = null\n let ctx: CanvasRenderingContext2D | null = null\n\n function get(width: number, height: number): ReusableCanvas {\n if (canvas === null) {\n canvas = document.createElement('canvas')!\n ctx = canvas.getContext('2d')!\n if (!ctx) throw new Error(CANVAS_CTX_FAILED)\n }\n\n // Resize if needed (resizing auto-clears)\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width\n canvas.height = height\n ctx!.imageSmoothingEnabled = false\n } else {\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height)\n }\n\n return { canvas, ctx: ctx! }\n }\n\n get.reset = () => {\n canvas = null\n ctx = null\n }\n\n return get\n}\n","/**\n * Decodes a {@link Blob} (typically PNG) back into an {@link ImageData} object.\n *\n * This function uses hardware-accelerated decoding via {@link createImageBitmap}\n * and processes the data using an {@link OffscreenCanvas} to ensure\n * compatibility with Web Workers.\n *\n * @param blob - The binary image data to decode.\n *\n * @returns A promise resolving to the decoded {@link ImageData}.\n *\n * @throws {Error}\n * Thrown if the blob is corrupted or the browser cannot decode the format.\n *\n * @example\n * ```typescript\n * const blob = await getBlobFromStorage();\n *\n * const imageData = await pngBlobToImageData(blob);\n * ```\n */\nexport async function imgBlobToImageData(\n blob: Blob,\n): Promise<ImageData> {\n let bitmap: ImageBitmap | null = null\n\n try {\n bitmap = await createImageBitmap(blob)\n\n const canvas = new OffscreenCanvas(\n bitmap.width,\n bitmap.height,\n )\n\n const ctx = canvas.getContext('2d')\n\n if (!ctx) {\n throw new Error('Failed to get 2D context')\n }\n\n ctx.drawImage(bitmap, 0, 0)\n\n return ctx.getImageData(\n 0,\n 0,\n bitmap.width,\n bitmap.height,\n )\n } finally {\n bitmap?.close()\n }\n}\n","import { imgBlobToImageData } from '../ImageData/imgBlobToImageData'\n\n/**\n * Extracts {@link ImageData} from a clipboard event if an image is present.\n *\n * This function iterates through the {@link DataTransferItemList} to find\n * the first item with an image MIME type and decodes it.\n *\n * @param clipboardEvent - The event object from a `paste` listener.\n *\n * @returns A promise resolving to {@link ImageData}, or `null` if no\n * image was found in the clipboard.\n *\n * @example\n * ```typescript\n * window.addEventListener('paste', async (event) => {\n * const data = await getImageDataFromClipboard(event)\n * if (data) {\n * console.log('Pasted image dimensions:', data.width, data.height)\n * }\n * });\n * ```\n */\nexport async function getImageDataFromClipboard(clipboardEvent: ClipboardEvent) {\n const items = clipboardEvent?.clipboardData?.items\n if (!items?.length) return null\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n\n if (item.type.startsWith('image/')) {\n const blob = item.getAsFile()\n\n if (!blob) {\n continue\n }\n\n return imgBlobToImageData(blob)\n }\n }\n return null\n}\n","/**\n * Converts an {@link ImageData} object into a {@link Blob} in PNG format.\n *\n * This operation is asynchronous and uses {@link OffscreenCanvas}\n * to perform the encoding, making it suitable for usage in both the main\n * thread and Web Workers.\n *\n * @param imageData - The pixel data to be encoded.\n *\n * @returns A promise that resolves to a {@link Blob} with the MIME type `image/png`.\n *\n * @throws {Error}\n * Thrown if the {@link OffscreenCanvas} context cannot be initialized or the blob\n * encoding fails.\n *\n * @example\n * ```typescript\n * const blob = await imageDataToImgBlob(imageData);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport async function imageDataToImgBlob(imageData: ImageData): Promise<Blob> {\n const canvas = new OffscreenCanvas(imageData.width, imageData.height)\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('could not create 2d context')\n\n ctx.putImageData(imageData, 0, 0)\n return canvas!.convertToBlob({\n type: 'image/png',\n })\n}\n","/**\n * Writes a {@link Blob} image to the system clipboard.\n *\n * @param blob - The image {@link Blob} (typically `image/png`) to copy.\n * @returns A promise that resolves when the clipboard has been updated.\n */\nexport async function writeImgBlobToClipboard(blob: Blob): Promise<void> {\n const item = new ClipboardItem({\n 'image/png': blob,\n })\n\n await navigator.clipboard.write([item])\n}\n","import { imageDataToImgBlob } from '../ImageData/imageDataToImgBlob'\nimport { writeImgBlobToClipboard } from './writeImgBlobToClipboard'\n\n/**\n * Converts {@link ImageData} to a PNG {@link Blob} and writes it to the system clipboard.\n * This is a high-level utility that combines {@link imageDataToImgBlob} and\n * {@link writeImgBlobToClipboard}.\n * @param imageData - The image data to copy to the clipboard.\n * @returns A promise that resolves when the image has been successfully copied.\n * @throws {Error}\n * If the conversion to blob fails or clipboard permissions are denied.\n *\n * @example\n * ```typescript\n * const canvas = document.querySelector('canvas')\n * const ctx = canvas.getContext('2d')\n * const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n * await writeImageDataToClipboard(imageData)\n * ```\n */\nexport async function writeImageDataToClipboard(imageData: ImageData): Promise<void> {\n const blob = await imageDataToImgBlob(imageData)\n\n return writeImgBlobToClipboard(blob)\n}\n","import type { PixelData } from '../PixelData/PixelData'\n\nexport type PixelPatchTiles = {\n beforeTiles: PixelTile[]\n afterTiles: PixelTile[]\n}\n\nexport class PixelTile {\n public data32: Uint32Array\n\n constructor(\n public id: number,\n public tx: number,\n public ty: number,\n tileArea: number,\n ) {\n this.data32 = new Uint32Array(tileArea)\n }\n}\n\nexport function applyPatchTiles(target: PixelData, tiles: PixelTile[], tileSize: number = 256) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i]\n\n if (!tile) continue\n\n const dst = target.data32\n const src = tile.data32\n const dstWidth = target.width\n const dstHeight = target.height\n const startX = tile.tx * tileSize\n const startY = tile.ty * tileSize\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX))\n\n if (copyWidth <= 0) return\n\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break\n\n const dstIndex = globalY * dstWidth + startX\n const srcIndex = ly * tileSize\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n dst.set(rowData, dstIndex)\n }\n }\n}\n","import type { PixelData } from '../PixelData/PixelData'\nimport type { PixelEngineConfig } from './PixelEngineConfig'\nimport { type PixelPatchTiles, PixelTile } from './PixelPatchTiles'\n\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[]\n public beforeTiles: PixelTile[]\n public pool: PixelTile[]\n\n constructor(\n public target: PixelData,\n readonly config: PixelEngineConfig,\n ) {\n this.lookup = []\n this.beforeTiles = []\n this.pool = []\n }\n\n getTile(\n id: number,\n tx: number,\n ty: number,\n ): PixelTile {\n let tile = this.pool.pop()\n\n if (tile) {\n tile.id = id\n tile.tx = tx\n tile.ty = ty\n\n return tile\n }\n\n return new PixelTile(\n id,\n tx,\n ty,\n this.config.tileArea,\n )\n }\n\n recyclePatch(patch: PixelPatchTiles) {\n const before = patch.beforeTiles\n\n for (let i = 0; i < before.length; i++) {\n let tile = before[i]\n\n if (tile) {\n this.pool.push(tile)\n }\n }\n\n const after = patch.afterTiles\n\n for (let i = 0; i < after.length; i++) {\n let tile = after[i]\n\n if (tile) {\n this.pool.push(tile)\n }\n }\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storeTileBeforeState(x: number, y: number): void {\n let target = this.target\n let shift = this.config.tileShift\n let columns = (target.width + this.config.tileMask) >> shift\n let tx = x >> shift\n let ty = y >> shift\n let id = ty * columns + tx\n\n let tile = this.lookup[id]\n\n if (!tile) {\n tile = this.getTile(\n id,\n tx,\n ty,\n )\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n }\n }\n\n /**\n *\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(\n x: number,\n y: number,\n w: number,\n h: number,\n ) {\n let target = this.target\n let shift = this.config.tileShift\n let columns = (target.width + this.config.tileMask) >> shift\n\n let startX = x >> shift\n let startY = y >> shift\n let endX = (x + w - 1) >> shift\n let endY = (y + h - 1) >> shift\n\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n let id = ty * columns + tx\n let tile = this.lookup[id]\n\n if (!tile) {\n tile = this.getTile(\n id,\n tx,\n ty,\n )\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n }\n }\n }\n }\n\n extractState(tile: PixelTile) {\n let target = this.target\n let TILE_SIZE = this.config.tileSize\n let dst = tile.data32\n let src = target.data32\n let startX = tile.tx * TILE_SIZE\n let startY = tile.ty * TILE_SIZE\n let targetWidth = target.width\n let targetHeight = target.height\n\n let copyWidth = Math.max(0, Math.min(TILE_SIZE, targetWidth - startX))\n\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly\n let dstIndex = ly * TILE_SIZE\n\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE)\n continue\n }\n\n let srcIndex = globalY * targetWidth + startX\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n dst.set(rowData, dstIndex)\n\n if (copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + copyWidth, dstIndex + TILE_SIZE)\n }\n }\n }\n\n extractAfterTiles(): PixelTile[] {\n let afterTiles: PixelTile[] = []\n let length = this.beforeTiles.length\n\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i]\n\n if (beforeTile) {\n let afterTile = this.getTile(\n beforeTile.id,\n beforeTile.tx,\n beforeTile.ty,\n )\n\n this.extractState(afterTile)\n afterTiles.push(afterTile)\n }\n }\n\n return afterTiles\n }\n\n reset() {\n this.lookup = []\n this.beforeTiles = []\n }\n}\n","export interface HistoryAction {\n undo: () => void\n redo: () => void\n dispose?: () => void\n}\n\nexport class HistoryManager {\n public undoStack: HistoryAction[]\n public redoStack: HistoryAction[]\n public listeners: Set<() => void>\n\n constructor(\n public maxSteps = 50,\n ) {\n this.undoStack = []\n this.redoStack = []\n this.listeners = new Set()\n }\n\n get canUndo() {\n return this.undoStack.length > 0\n }\n\n get canRedo() {\n return this.redoStack.length > 0\n }\n\n subscribe(fn: () => void) {\n this.listeners.add(fn)\n return () => this.listeners.delete(fn)\n }\n\n notify() {\n this.listeners.forEach((fn) => fn())\n }\n\n commit(action: HistoryAction) {\n this.undoStack.push(action)\n this.clearRedoStack()\n\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.()\n }\n\n this.notify()\n }\n\n undo() {\n let action = this.undoStack.pop()\n\n if (!action) return\n\n this.redoStack.push(action)\n action.undo()\n\n this.notify()\n }\n\n redo() {\n let action = this.redoStack.pop()\n\n if (!action) return\n\n this.undoStack.push(action)\n action.redo()\n\n this.notify()\n }\n\n clearRedoStack() {\n let length = this.redoStack.length\n\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i]\n\n if (action) {\n action.dispose?.()\n }\n }\n\n this.redoStack.length = 0\n }\n}\n","export class PixelEngineConfig {\n public readonly tileSize: number\n public readonly tileShift: number\n public readonly tileMask: number\n public readonly tileArea: number\n\n constructor(tileSize: number = 256) {\n // Ensure it's a power of 2 to guarantee bitwise math works\n if ((tileSize & (tileSize - 1)) !== 0) {\n throw new Error('tileSize must be a power of 2')\n }\n\n this.tileSize = tileSize\n this.tileShift = Math.log2(tileSize)\n this.tileMask = tileSize - 1\n this.tileArea = tileSize * tileSize\n }\n}\n","import { type AnyMask, type ApplyMaskOptions, MaskType } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n */\nexport function applyMaskToPixelData(\n dst: PixelData,\n mask: AnyMask,\n opts: ApplyMaskOptions = {},\n): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Clipping Logic\n if (x < 0) {\n w += x\n x = 0\n }\n\n if (y < 0) {\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 || globalAlpha === 0) {\n return\n }\n\n const dst32 = dst.data32\n const dw = dst.width\n const mPitch = mw ?? width\n const isAlpha = maskType === MaskType.ALPHA\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - 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 mVal = mask[mIdx]\n let weight = globalAlpha\n\n if (isAlpha) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // Short-circuit: if source is 0, destination alpha becomes 0\n if (effectiveM === 0) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n dIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha === 255\n ? effectiveM\n : (effectiveM * globalAlpha + 128) >> 8\n } else {\n // Strict Binary 1/0 Logic\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n dIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // If calculated weight is 0, clear alpha\n if (weight === 0) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n } else {\n const d = dst32[dIdx]\n const da = (d >>> 24)\n\n let finalAlpha = da\n\n if (da === 0) {\n // Already transparent\n } else if (weight === 255) {\n // Identity: keep original da\n } else if (da === 255) {\n // Identity: result is just the weight\n finalAlpha = weight\n } else {\n finalAlpha = (da * weight + 128) >> 8\n }\n\n dst32[dIdx] = ((d & 0x00ffffff) | (finalAlpha << 24)) >>> 0\n }\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import type { PixelData } from '../PixelData/PixelData'\nimport { type HistoryAction, HistoryManager } from './HistoryManager'\nimport { PixelAccumulator } from './PixelAccumulator'\nimport { PixelEngineConfig } from './PixelEngineConfig'\nimport { applyPatchTiles, type PixelPatchTiles } from './PixelPatchTiles'\n\nexport interface PixelWriterOptions {\n maxHistorySteps?: number\n tileSize?: number\n historyManager?: HistoryManager\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n public target: PixelData\n public historyManager: HistoryManager\n public accumulator: PixelAccumulator\n protected config: PixelEngineConfig\n private mutator: M\n\n constructor(target: PixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps),\n }: PixelWriterOptions = {}) {\n this.target = target\n this.config = new PixelEngineConfig(tileSize)\n this.historyManager = historyManager\n this.accumulator = new PixelAccumulator(target, this.config)\n this.mutator = mutatorFactory(this)\n }\n\n withHistory(cb: (mutator: M) => void) {\n cb(this.mutator)\n\n const beforeTiles = this.accumulator.beforeTiles\n if (beforeTiles.length === 0) return\n\n const afterTiles = this.accumulator.extractAfterTiles()\n\n const patch: PixelPatchTiles = {\n beforeTiles: beforeTiles,\n afterTiles: afterTiles,\n }\n\n const target = this.target\n const tileSize = this.config.tileSize\n const accumulator = this.accumulator\n\n const action: HistoryAction = {\n undo: () => applyPatchTiles(target, patch.beforeTiles, tileSize),\n redo: () => applyPatchTiles(target, patch.afterTiles, tileSize),\n dispose: () => accumulator.recyclePatch(patch),\n }\n\n this.historyManager.commit(action)\n this.accumulator.reset()\n }\n}\n","import { type AnyMask, type ApplyMaskOptions } from '../../_types'\nimport { applyMaskToPixelData } from '../../PixelData/applyMaskToPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorApplyMask(writer: PixelWriter<any>) {\n return {\n applyMask: (mask: AnyMask, opts: ApplyMaskOptions = {}) => {\n let target = writer.target\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n applyMaskToPixelData(target, mask, opts)\n },\n }\n}\n","import { type Color32, type ColorBlendOptions, MaskType } from '../_types'\nimport { sourceOverFast } from '../BlendModes/blend-modes-fast'\nimport type { PixelData } from './PixelData'\n\n/**\n * Fills a rectangle in the destination PixelData with a single color,\n * supporting blend modes, global alpha, and masking.\n */\nexport function blendColorPixelData(\n dst: PixelData,\n color: Color32,\n opts: ColorBlendOptions = {},\n) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverFast,\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 const baseSrcAlpha = (color >>> 24)\n const isOverwrite = blendFn.isOverwrite\n if (baseSrcAlpha === 0 && !isOverwrite) return\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\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 dw = dst.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 mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const mStride = mPitch - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\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 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 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 mask or global alpha are 0 we bail even if we are overwriting\n if (weight === 0) {\n dIdx++\n mIdx++\n continue\n }\n }\n\n let currentSrcColor = color\n\n if (weight < 255) {\n let currentSrcAlpha = baseSrcAlpha\n\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (!isOverwrite && currentSrcAlpha === 0) {\n dIdx++\n mIdx++\n continue\n }\n\n currentSrcColor = ((color & 0x00ffffff) | (currentSrcAlpha << 24)) >>> 0 as Color32\n }\n\n dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx] as Color32)\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import type { Color32, ColorBlendOptions } from '../../_types'\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendColor(writer: PixelWriter<any>) {\n return {\n blendColor(\n color: Color32,\n opts: ColorBlendOptions = {},\n ) {\n\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n blendColorPixelData(writer.target, color, opts)\n },\n }\n}\n","import type { BlendColor32, Color32 } from '../../_types'\nimport { overwriteFast } from '../../BlendModes/blend-modes-fast'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendPixel(writer: PixelWriter<any>) {\n return {\n blendPixel(\n x: number,\n y: number,\n color: Color32,\n alpha: number = 255,\n blendFn: BlendColor32 = overwriteFast,\n ) {\n let target = writer.target\n let width = target.width\n let height = target.height\n\n if (x < 0 || x >= width || y < 0 || y >= height) return\n\n writer.accumulator.storeTileBeforeState(x, y)\n\n let index = y * width + x\n let bg = target.data32[index] as Color32\n\n let finalColor = color\n\n if (alpha < 255) {\n let baseSrcAlpha = color >>> 24\n let finalAlpha = (baseSrcAlpha * alpha + 128) >> 8\n\n finalColor = (((color & 0x00ffffff) | (finalAlpha << 24)) >>> 0) as Color32\n }\n\n target.data32[index] = blendFn(finalColor, bg)\n },\n }\n}\n","import { type Color32, MaskType, type PixelBlendOptions } from '../_types'\nimport { sourceOverFast } from '../BlendModes/blend-modes-fast'\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 = sourceOverFast,\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 const isOverwrite = blendFn.isOverwrite\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 // In Overwrite, we process even if baseSrcAlpha is 0\n if (baseSrcAlpha === 0 && !isOverwrite) {\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 mask or global alpha are 0 we bail even if we are overwriting\n if (weight === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n let currentSrcAlpha = baseSrcAlpha\n\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (!isOverwrite && 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","import type { PixelBlendOptions } from '../../_types'\nimport { blendPixelData } from '../../PixelData/blendPixelData'\nimport type { PixelData } from '../../PixelData/PixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendPixelData(writer: PixelWriter<any>) {\n return {\n blendPixelData(\n src: PixelData,\n opts: PixelBlendOptions,\n ) {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n\n blendPixelData(writer.target, src, opts)\n },\n }\n}\n\n","import type { Color32, Rect } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Fills a region or the {@link PixelData} buffer with a solid color.\n *\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param rect - A {@link Rect} defining the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n rect?: Partial<Rect>,\n): void\n/**\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param x - Starting horizontal coordinate.\n * @param y - Starting vertical coordinate.\n * @param w - Width of the fill area.\n * @param h - Height of the fill area.\n */\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n _x?: Partial<Rect> | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n let x: number\n let y: number\n let w: number\n let h: number\n\n if (typeof _x === 'object') {\n x = _x.x ?? 0\n y = _x.y ?? 0\n w = _x.w ?? dst.width\n h = _x.h ?? dst.height\n } else if (typeof _x === 'number') {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n } else {\n x = 0\n y = 0\n w = dst.width\n h = dst.height\n }\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\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) {\n return\n }\n\n const dst32 = dst.data32\n const dw = dst.width\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.height && x === 0 && y === 0) {\n dst32.fill(color)\n return\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (y + iy) * dw + x\n const end = start + actualW\n dst32.fill(color, start, end)\n }\n}\n","import type { Color32, Rect } from '../../_types'\nimport { fillPixelData } from '../../PixelData/fillPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorFill(writer: PixelWriter<any>) {\n return {\n fill(\n color: Color32,\n rect: Partial<Rect> = {},\n ) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = rect\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n fillPixelData(writer.target, color, x, y, w, h)\n },\n }\n}\n","import { type PixelMutateOptions } from '../_types'\nimport type { PixelData } from './PixelData'\n\nexport function invertPixelData(\n pixelData: PixelData,\n opts: PixelMutateOptions = {},\n): void {\n const dst = pixelData\n const {\n x: targetX = 0,\n y: targetY = 0,\n\n w: width = pixelData.width,\n h: height = pixelData.height,\n mask,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\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 dw = dst.width\n const mPitch = mw ?? width\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const mStride = mPitch - actualW\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx]\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n }\n dIdx++\n mIdx++\n }\n dIdx += dStride\n mIdx += mStride\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n dIdx++\n }\n dIdx += dStride\n }\n }\n}\n","import type { PixelMutateOptions } from '../../_types'\nimport { invertPixelData } from '../../PixelData/invertPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorInvert(writer: PixelWriter<any>) {\n return {\n invert(opts: PixelMutateOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n invertPixelData(writer.target, opts)\n },\n }\n}\n","import { mutatorApplyMask } from './PixelMutator/mutatorApplyMask'\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor'\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel'\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData'\nimport { mutatorFill } from './PixelMutator/mutatorFillPixelData'\nimport { mutatorInvert } from './PixelMutator/mutatorInvert'\nimport type { PixelWriter } from './PixelWriter'\n\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n ...mutatorApplyMask(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorFill(writer),\n ...mutatorInvert(writer),\n }\n}\n","export type ReusableImageData = ReturnType<typeof makeReusableImageData>\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null\n let buffer: Uint8ClampedArray | null = null\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n const hasInstance = !!imageData\n const widthMatches = hasInstance && imageData!.width === width\n const heightMatches = hasInstance && imageData!.height === height\n\n if (!widthMatches || !heightMatches) {\n const buffer = new Uint8ClampedArray(width * height * 4)\n\n imageData = new ImageData(buffer, width, height)\n }\n\n return imageData!\n }\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 { AlphaMask } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(\n pixelData: PixelData,\n): AlphaMask {\n const {\n data32,\n width,\n height,\n } = pixelData\n const len = data32.length\n const mask = new Uint8Array(width * height) as AlphaMask\n\n for (let i = 0; i < len; i++) {\n const val = data32[i]\n\n // Extract the Alpha byte (top 8 bits in ABGR / Little-Endian)\n // Shift right by 24 moves the 4th byte to the 1st position\n mask[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import type { AlphaMask } from '../_types'\nimport { pixelDataToAlphaMask } from '../PixelData/pixelDataToAlphaMask'\n\n/**\n * Extracts the alpha channel from raw ImageData into an AlphaMask.\n * When possible use {@link pixelDataToAlphaMask} instead.\n * Repeat calls to the same data will use less memory.\n */\nexport function imageDataToAlphaMask(\n imageData: ImageData,\n): AlphaMask {\n const {\n width,\n height,\n data,\n } = imageData\n\n // Create a 32-bit view of the existing buffer\n const data32 = new Uint32Array(\n data.buffer,\n data.byteOffset,\n data.byteLength >> 2,\n )\n const len = data32.length\n const mask = new Uint8Array(width * height) as AlphaMask\n\n for (let i = 0; i < len; i++) {\n const val = data32[i]\n\n // Extract Alpha (top 8 bits in Little-Endian/ABGR)\n mask[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import { makeReusableCanvas } from '../Canvas/ReusableCanvas'\n\nconst get = makeReusableCanvas()\n\n/**\n * Converts an {@link ImageData} object into a base64-encoded Data URL string.\n *\n * @param imageData - The pixel data to be converted.\n *\n * @returns A string representing the image in `image/png` format as a\n * [Data URL](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n * @example\n * ```typescript\n * const dataUrl = imageDataToDataUrl(imageData);\n * const img = new Image();\n * img.src = dataUrl;\n * ```\n */\nexport function imageDataToDataUrl(imageData: ImageData): string {\n const { canvas, ctx } = get(imageData.width, imageData.height)\n\n ctx.putImageData(imageData, 0, 0)\n return canvas.toDataURL()\n}\n\nimageDataToDataUrl.reset = get.reset\n","import type { ImageDataLike } from '../_types'\n\n/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUInt32Array(imageData: ImageDataLike): Uint32Array {\n return new Uint32Array(\n imageData.data.buffer,\n imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2,\n )\n}\n","export function invertImageData(imageData: ImageData) {\n const data = imageData.data\n let length = data.length\n for (let i = 0; i < length; i += 4) {\n data[i] = 255 - data[i]!\n data[i + 1] = 255 - data[i + 1]!\n data[i + 2] = 255 - data[i + 2]!\n }\n return imageData\n}\n","const resample32Scratch = {\n data: null as null | Int32Array,\n width: 0,\n height: 0,\n}\n\n/**\n * @internal\n */\ntype Resample32Result = { data: Int32Array; width: number; height: number }\n\n/**\n * @internal\n */\nexport function resample32(\n srcData32: Uint32Array | Int32Array,\n srcW: number,\n srcH: number,\n factor: number,\n): Resample32Result {\n const dstW = Math.max(1, (srcW * factor) | 0)\n const dstH = Math.max(1, (srcH * factor) | 0)\n const dstData = new Int32Array(dstW * dstH)\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW\n const scaleY = srcH / dstH\n\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, (y * scaleY) | 0)\n const srcRowOffset = srcY * srcW\n const dstRowOffset = y * dstW\n\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, (x * scaleX) | 0)\n\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!\n }\n }\n\n resample32Scratch.data = dstData\n resample32Scratch.width = dstW\n resample32Scratch.height = dstH\n\n return resample32Scratch as Resample32Result\n}\n","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer)\n const { data, width, height } = resample32(src32, source.width, source.height, factor)\n\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>\n return new ImageData(uint8ClampedArray, width, height)\n}\n","import type { ImageDataLike } from '../_types'\n\n/**\n * Non destructively resizes the {@link ImageData} buffer to new dimensions, optionally\n * offsetting the original content.\n * This operation creates a new buffer. It does not scale or stretch pixels;\n * instead, it crops or pads the image based on the new dimensions and\n * provides an offset for repositioning.\n *\n * @param current The source {@link ImageDataLike} to resize.\n * @param newWidth The target width in pixels.\n * @param newHeight The target height in pixels.\n * @param offsetX The horizontal offset for placing the\n * original image within the new buffer.\n * @default 0\n * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\n * @default 0\n *\n * @returns A new {@link ImageData} instance with the specified dimensions.\n *\n * @example\n * ```typescript\n * // Centers an 80x80 image in a new 100x100 buffer\n * const resized = resizeImageData(\n * originalData,\n * 100,\n * 100,\n * 10,\n * 10\n * );\n * ```\n */\nexport function resizeImageData(\n current: ImageDataLike,\n newWidth: number,\n newHeight: number,\n offsetX = 0,\n offsetY = 0,\n): ImageData {\n const result = new ImageData(newWidth, newHeight)\n const {\n width: oldW,\n height: oldH,\n data: oldData,\n } = current\n const newData = result.data\n\n // Determine intersection of the old image (at offset) and new canvas bounds\n const x0 = Math.max(0, offsetX)\n const y0 = Math.max(0, offsetY)\n const x1 = Math.min(newWidth, offsetX + oldW)\n const y1 = Math.min(newHeight, offsetY + oldH)\n\n if (x1 <= x0 || y1 <= y0) {\n return result\n }\n\n const rowCount = y1 - y0\n const rowLen = (x1 - x0) * 4\n\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row\n const srcY = dstY - offsetY\n const srcX = x0 - offsetX\n\n const dstStart = (dstY * newWidth + x0) * 4\n const srcStart = (srcY * oldW + srcX) * 4\n\n newData.set(\n oldData.subarray(srcStart, srcStart + rowLen),\n dstStart,\n )\n }\n\n return result\n}\n","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types'\n\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer);\n const decoder = new TextDecoder('latin1');\n const binary = decoder.decode(uint8);\n\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 { MaskType } from '../_types'\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(\n target: ImageData,\n source: ImageData,\n x: number,\n y: number,\n sx: number = 0,\n sy: number = 0,\n sw: number = source.width,\n sh: number = source.height,\n mask: Uint8Array | null = null,\n maskType: MaskType = MaskType.BINARY,\n): void {\n const dstW = target.width\n const dstH = target.height\n const dstData = target.data\n const srcW = source.width\n const srcData = source.data\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + sw)\n const y1 = Math.min(dstH, y + sh)\n\n if (x1 <= x0 || y1 <= y0) {\n return\n }\n\n const useMask = !!mask\n const rowCount = y1 - y0\n const rowLenPixels = x1 - x0\n\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row\n const srcY = sy + (dstY - y)\n const srcXBase = sx + (x0 - x)\n\n const dstStart = (dstY * dstW + x0) * 4\n const srcStart = (srcY * srcW + srcXBase) * 4\n\n if (useMask && mask) {\n for (let ix = 0; ix < rowLenPixels; ix++) {\n const mi = srcY * srcW + (srcXBase + ix)\n const alpha = mask[mi]\n\n if (alpha === 0) {\n continue\n }\n\n const di = dstStart + (ix * 4)\n const si = srcStart + (ix * 4)\n\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si]\n dstData[di + 1] = srcData[si + 1]\n dstData[di + 2] = srcData[si + 2]\n dstData[di + 3] = srcData[si + 3]\n } else {\n const a = alpha / 255\n const invA = 1 - a\n\n dstData[di] = srcData[si] * a + dstData[di] * invA\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA\n }\n }\n } else {\n const byteLen = rowLenPixels * 4\n const sub = srcData.subarray(srcStart, srcStart + byteLen)\n dstData.set(sub, dstStart)\n }\n }\n}\n","import type { Rect } from '../_types'\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param imageData - The target {@link ImageData} to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A {@link Rect} object defining the destination region.\n */\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n rect: Rect,\n): void\n/**\n * @param imageData - The target {@link ImageData} to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const { width: dstW, height: dstH, data: dst } = imageData\n\n // 1. Calculate the intersection of the patch and the canvas\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + w)\n const y1 = Math.min(dstH, y + h)\n\n // If the intersection is empty, do nothing\n if (x1 <= x0 || y1 <= y0) return\n\n const rowLen = (x1 - x0) * 4\n const srcCol = x0 - x\n const srcYOffset = y0 - y\n const actualH = y1 - y0\n\n for (let row = 0; row < actualH; row++) {\n // Target index\n const dstStart = ((y0 + row) * dstW + x0) * 4\n\n // Source data index (must account for the offset if the rect was partially OOB)\n const srcRow = srcYOffset + row\n const o = (srcRow * w + srcCol) * 4\n\n dst.set(data.subarray(o, o + rowLen), dstStart)\n }\n}\n","import type { Color32 } from '../_types'\n\n/**\n * Represents an image using a palette-based indexing system.\n * Instead of storing 4 bytes (RGBA) per pixel, this class stores a single index\n * into a color palette. This format is optimized for memory efficiency and\n * high-speed pattern matching or recoloring operations.\n */\nexport class IndexedImage {\n /** The width of the image in pixels. */\n public readonly width: number\n /** The height of the image in pixels. */\n public readonly height: number\n /** Flat array of palette indices. Index = x + (y * width). */\n public readonly data: Int32Array\n /** The palette of unique 32-bit colors (ABGR/RGBA packed) found in the image. */\n public readonly palette: Uint32Array\n /** The specific index in the palette reserved for fully transparent pixels. */\n public readonly transparentPalletIndex: number\n\n /**\n * @param width - Image width.\n * @param height - Image height.\n * @param data - The indexed pixel data.\n * @param palette - The array of packed colors.\n * @param transparentPalletIndex - The index representing alpha 0.\n */\n constructor(\n width: number,\n height: number,\n data: Int32Array,\n palette: Uint32Array,\n transparentPalletIndex: number,\n ) {\n this.width = width\n this.height = height\n this.data = data\n this.palette = palette\n this.transparentPalletIndex = transparentPalletIndex\n }\n\n /**\n * Creates an IndexedImage from standard browser ImageData.\n * @param imageData - The source ImageData to convert.\n * @returns A new IndexedImage instance.\n */\n static fromImageData(imageData: ImageData): IndexedImage {\n return IndexedImage.fromRaw(imageData.data, imageData.width, imageData.height)\n }\n\n /**\n * Creates an IndexedImage from a raw byte buffer and dimensions.\n * Any pixel with an alpha channel of 0 is normalized to the transparent palette index.\n * @param data - Raw RGBA byte data.\n * @param width - Image width.\n * @param height - Image height.\n * @returns A new IndexedImage instance.\n */\n static fromRaw(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n ): IndexedImage {\n const buffer = data.buffer\n const rawData = new Uint32Array(buffer)\n const indexedData = new Int32Array(rawData.length)\n const colorMap = new Map<number, number>()\n const transparentColor = 0\n const transparentPalletIndex = 0\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex)\n\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number\n const alpha = (pixel >>> 24) & 0xFF\n const isTransparent = alpha === 0\n const colorKey = isTransparent ? transparentColor : (pixel >>> 0)\n\n let id = colorMap.get(colorKey)\n\n if (id === undefined) {\n id = colorMap.size\n colorMap.set(colorKey, id)\n }\n\n indexedData[i] = id\n }\n\n const palette = Uint32Array.from(colorMap.keys())\n\n return new IndexedImage(\n width,\n height,\n indexedData,\n palette,\n transparentPalletIndex,\n )\n }\n\n /**\n * Retrieves the 32-bit packed color value at the given coordinates.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @returns The packed color from the palette.\n */\n public getColorAt(x: number, y: number): Color32 {\n const index = x + y * this.width\n const paletteIndex = this.data[index]\n\n return this.palette[paletteIndex] as Color32\n }\n}\n","import type { IndexedImage } from './IndexedImage.ts'\n\n/**\n * Calculates the frequency of each palette index based on the image data.\n * The index of the returned array maps directly to the index of the palette.\n * @param indexedImage - The source image containing data and palette definitions.\n * @returns A typed array where each entry represents the total count of that palette index.\n */\nexport function getIndexedImageColorCounts(indexedImage: IndexedImage): Int32Array {\n const data = indexedImage.data\n const palette = indexedImage.palette\n const frequencies = new Int32Array(palette.length)\n\n for (let i = 0; i < data.length; i++) {\n const colorIndex = data[i]!\n frequencies[colorIndex]++\n }\n\n return frequencies\n}\n","import type { Color32 } from '../_types'\nimport { packColor } from '../color'\nimport type { IndexedImage } from './IndexedImage'\n\n/**\n * Calculates the area-weighted average color of an IndexedImage.\n * This accounts for how often each palette index appears in the pixel data.\n * @param indexedImage - The IndexedImage containing pixel indices and the palette.\n * @param includeTransparent - Whether to include the transparent pixels in the average.\n * @returns The average RGBA color of the image.\n */\nexport function indexedImageToAverageColor(\n indexedImage: IndexedImage,\n includeTransparent: boolean = false,\n): Color32 {\n const { data, palette, transparentPalletIndex } = indexedImage\n const counts = new Uint32Array(palette.length)\n\n // Tally occurrences of each index\n for (let i = 0; i < data.length; i++) {\n const id = data[i]!\n counts[id]!++\n }\n\n let rSum = 0\n let gSum = 0\n let bSum = 0\n let aSum = 0\n let totalWeight = 0\n\n for (let id = 0; id < counts.length; id++) {\n const weight = counts[id]!\n\n if (weight === 0) {\n continue\n }\n\n if (!includeTransparent && id === transparentPalletIndex) {\n continue\n }\n\n const color = palette[id]! >>> 0;\n\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 rSum += r * weight\n gSum += g * weight\n bSum += b * weight\n aSum += a * weight\n totalWeight += weight\n }\n\n if (totalWeight === 0) {\n return packColor(0, 0, 0, 0)\n }\n\n const r = (rSum / totalWeight) | 0\n const g = (gSum / totalWeight) | 0\n const b = (bSum / totalWeight) | 0\n const a = (aSum / totalWeight) | 0\n\n return packColor(r, g, b, a)\n}\n","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { IndexedImage } from '../index'\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleIndexedImage(\n source: IndexedImage,\n factor: number,\n): IndexedImage {\n\n const { data, width, height } = resample32(\n source.data,\n source.width,\n source.height,\n factor,\n )\n\n return new IndexedImage(\n width,\n height,\n data,\n source.palette,\n source.transparentPalletIndex,\n )\n}\n","import type { IndexedImage } from './IndexedImage'\n\n/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const { width, height, data, palette } = indexedImage\n const result = new ImageData(width, height)\n const data32 = new Uint32Array(result.data.buffer)\n\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i]\n const color = palette[paletteIndex]\n\n data32[i] = color\n }\n\n return result\n}\n","import { fileToImageData } from '../../src'\n\n/**\n * A convenience wrapper that extracts the first {@link File} from an\n * {@link HTMLInputElement} change event and converts it into {@link ImageData}.\n *\n * This function handles the boilerplate of accessing the file list and checking\n * for existence. It is ideal for use directly in an `onchange` event listener.\n *\n * @param event - The change {@link Event} from an `<input type=\"file\">` element.\n *\n * @returns A promise that resolves to {@link ImageData} if a file was successfully\n * processed, or `null` if no file was selected or the input was cleared.\n *\n * @example\n * ```typescript\n * const input = document.querySelector('input[type=\"file\"]');\n *\n * input.addEventListener('change', async (event) => {\n * const imageData = await fileInputChangeToImageData(event);\n *\n * if (imageData) {\n * console.log('Image loaded:', imageData.width, imageData.height);\n * }\n * });\n * ```\n */\nexport async function fileInputChangeToImageData(\n event: Event,\n): Promise<ImageData | null> {\n const target = event.target as HTMLInputElement\n\n const file = target.files?.[0]\n if (!file) return null\n\n return await fileToImageData(file)\n}\n","import { OFFSCREEN_CANVAS_CTX_FAILED } from '../Canvas/_constants'\n\n/**\n * Thrown when the user provides a file that isn't an image.\n */\nexport class UnsupportedFormatError extends Error {\n constructor(mimeType: string) {\n super(`File type ${mimeType} is not a supported image format.`)\n this.name = 'UnsupportedFormatError'\n }\n}\n\n/**\n * Converts a browser {@link File} object into {@link ImageData}.\n * This utility handles the full pipeline of image decoding using hardware-accelerated\n * APIs {@link createImageBitmap} and {@link OffscreenCanvas}. It ensures that underlying\n * resources like `ImageBitmap` are properly closed even if the conversion fails.\n *\n * @param file - The image file to convert. Can be null or undefined.\n * @returns A `Promise` resolving to the pixel data as {@link ImageData},\n * or `null` if no file was provided.\n * @throws {@link UnsupportedFormatError}\n * Thrown if the provided file's MIME type does not start with `image/`.\n * @example\n * ```typescript\n * try {\n * const imageData = await fileToImageData(file);\n * if (imageData) {\n * console.log('Pixels:', imageData.data);\n * }\n * } catch (err) {\n * if (err instanceof UnsupportedFormatError) {\n * // Handle bad file type\n * }\n * }\n * ```\n */\nexport async function fileToImageData(\n file: File | null | undefined,\n): Promise<ImageData | null> {\n if (!file) return null\n\n if (!file.type.startsWith('image/')) {\n throw new UnsupportedFormatError(file.type)\n }\n\n let bitmap: ImageBitmap | null = null\n\n try {\n bitmap = await createImageBitmap(file)\n\n const canvas = new OffscreenCanvas(\n bitmap.width,\n bitmap.height,\n )\n\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error(OFFSCREEN_CANVAS_CTX_FAILED)\n\n ctx.drawImage(\n bitmap,\n 0,\n 0,\n )\n\n return ctx.getImageData(\n 0,\n 0,\n bitmap.width,\n bitmap.height,\n )\n } finally {\n bitmap?.close()\n }\n}\n","// Cache the Promise to prevent race conditions during initialization\nlet formatsPromise: Promise<string[]> | null = null\n\nconst defaultRasterMimes = [\n 'image/png',\n 'image/jpeg',\n 'image/webp',\n 'image/avif',\n 'image/gif',\n 'image/bmp',\n]\n\n/**\n * Probes the browser environment to determine which image MIME types are\n * supported for pixel-level operations.\n * This function performs a one-time check by attempting to convert a\n * {@link OffscreenCanvas} to MIME types. The result is\n * cached to prevent redundant hardware-accelerated operations on\n * subsequent calls.\n * @param rasterMimes List of MIME types to check\n * @default ['image/png',\n * 'image/jpeg',\n * 'image/webp',\n * 'image/avif',\n * 'image/gif',\n * 'image/bmp']\n * @returns A `Promise` resolving to an array of supported MIME\n * types from the `rasterMimes` list.\n * @throws {Error} If the {@link OffscreenCanvas} context cannot be initialized.\n * @example\n * ```typescript\n * const supported = await getSupportedPixelFormats();\n * if (supported.includes('image/avif')) {\n * console.log('High-efficiency formats available');\n * }\n * ```\n */\nexport async function getSupportedPixelFormats(rasterMimes = defaultRasterMimes): Promise<string[]> {\n if (formatsPromise) {\n return formatsPromise\n }\n\n const probeCanvas = async () => {\n const canvas = new OffscreenCanvas(1, 1)\n\n const results = await Promise.all(\n rasterMimes.map(async (mime) => {\n try {\n const blob = await canvas.convertToBlob({\n type: mime,\n })\n\n return blob.type === mime ? mime : null\n } catch {\n return null\n }\n }),\n )\n\n return results.filter((type): type is string => {\n return type !== null\n })\n }\n\n // By chaining .catch here, the microtask guarantees formatsPromise\n // is assigned the promise BEFORE the catch block runs to reset it.\n formatsPromise = probeCanvas().catch((error) => {\n formatsPromise = null\n\n throw error\n })\n\n return formatsPromise\n}\n","import type { AnyMask } from '../index'\n\n/**\n * Creates a new copy of a mask.\n * Uses the underlying buffer's slice method for high-performance memory copying.\n */\nexport function copyMask<T extends AnyMask>(src: T): T {\n // Uint8Array.slice() is highly optimized at the engine level\n return src.slice() as T\n}\n","import type { AlphaMask, BinaryMask } from '../index'\n\n/**\n * Inverts a BinaryMask in-place.\n */\nexport function invertBinaryMask(dst: BinaryMask): void {\n const len = dst.length\n\n for (let i = 0; i < len; i++) {\n dst[i] = dst[i] === 0\n ? 1\n : 0\n }\n}\n\n/**\n * Inverts an AlphaMask in-place.\n */\nexport function invertAlphaMask(dst: AlphaMask): void {\n const len = dst.length\n\n for (let i = 0; i < len; i++) {\n dst[i] = 255 - dst[i]\n }\n}\n","import { type AlphaMask, type AnyMask, type ApplyMaskOptions, MaskType } from '../_types'\n\n/**\n * Merges a source mask into a destination AlphaMask.\n */\nexport function mergeMasks(\n dst: AlphaMask,\n dstWidth: number,\n src: AnyMask,\n opts: ApplyMaskOptions,\n): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n alpha: globalAlpha = 255,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (width <= 0 || height <= 0 || globalAlpha === 0) {\n return\n }\n\n const sPitch = mw ?? width\n const isAlpha = maskType === MaskType.ALPHA\n\n for (let iy = 0; iy < height; iy++) {\n const dy = targetY + iy\n const sy = my + iy\n\n if (dy < 0 || sy < 0) {\n continue\n }\n\n for (let ix = 0; ix < width; ix++) {\n const dx = targetX + ix\n const sx = mx + ix\n\n if (dx < 0 || dx >= dstWidth || sx < 0 || sx >= sPitch) {\n continue\n }\n\n const dIdx = dy * dstWidth + dx\n const sIdx = sy * sPitch + sx\n const mVal = src[sIdx]\n let weight = globalAlpha\n\n if (isAlpha) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n if (effectiveM === 0) {\n dst[dIdx] = 0\n continue\n }\n\n weight = globalAlpha === 255\n ? effectiveM\n : (effectiveM * globalAlpha + 128) >> 8\n } else {\n // Strict Binary 1/0 Logic\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dst[dIdx] = 0\n continue\n }\n\n // If binary hit, weight is just the global alpha\n weight = globalAlpha\n }\n\n if (weight === 0) {\n dst[dIdx] = 0\n continue\n }\n\n const da = dst[dIdx]\n\n if (da === 0) {\n // Already transparent\n } else if (weight === 255) {\n // Identity: keep da\n } else if (da === 255) {\n // Identity: result is weight\n dst[dIdx] = weight\n } else {\n dst[dIdx] = (da * weight + 128) >> 8\n }\n }\n }\n}\n","import { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array'\n\nexport class PixelData {\n public data32: Uint32Array\n public imageData!: ImageData\n\n get width(): number {\n return this.imageData.width\n }\n\n get height(): number {\n return this.imageData.height\n }\n\n constructor(imageData: ImageData) {\n this.data32 = imageDataToUInt32Array(imageData)\n this.imageData = imageData\n }\n\n set(imageData: ImageData): void {\n this.imageData = imageData\n this.data32 = imageDataToUInt32Array(imageData)\n }\n\n /**\n * Creates a deep copy of the PixelData using the environment's ImageData constructor.\n */\n copy(): PixelData {\n const buffer = new Uint8ClampedArray(this.imageData.data)\n\n // Fallback to the object's own constructor if the global ImageData is missing (Node tests)\n const ImageConstructor = (typeof ImageData !== 'undefined'\n ? ImageData\n : (this.imageData.constructor as typeof ImageData))\n\n const newImageData = new ImageConstructor(\n buffer,\n this.width,\n this.height,\n )\n\n return new PixelData(newImageData)\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { PixelData } from './PixelData'\n\n/**\n * Applies a circular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushSize The diameter of the brush.\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @default sourceOverPerfect\n */\nexport function applyCircleBrushToPixelData(\n target: PixelData,\n color: Color32,\n centerX: number,\n centerY: number,\n brushSize: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn: BlendColor32 = sourceOverPerfect,\n): void {\n const r = brushSize / 2\n const rSqr = r * r\n const centerOffset = (brushSize % 2 === 0) ? 0.5 : 0\n\n const xStart = Math.max(0, Math.ceil(centerX - r))\n const xEnd = Math.min(target.width - 1, Math.floor(centerX + r))\n const yStart = Math.max(0, Math.ceil(centerY - r))\n const yEnd = Math.min(target.height - 1, Math.floor(centerY + r))\n\n const data32 = target.data32\n const targetWidth = target.width\n const baseColor = color & 0x00ffffff\n const invR = 1 / r\n\n // Pre-calculate the constant source for cases where fallOff is null\n const constantSrc = ((alpha << 24) | baseColor) >>> 0 as Color32\n\n for (let cy = yStart; cy <= yEnd; cy++) {\n const dy = cy - centerY + centerOffset\n const dySqr = dy * dy\n const rowOffset = cy * targetWidth\n\n for (let cx = xStart; cx <= xEnd; cx++) {\n const dx = cx - centerX + centerOffset\n const dSqr = dx * dx + dySqr\n\n if (dSqr <= rSqr) {\n const idx = rowOffset + cx\n\n if (fallOff) {\n const strength = fallOff(Math.sqrt(dSqr) * invR)\n const fAlpha = (alpha * strength) & 0xFF\n const src = ((fAlpha << 24) | baseColor) >>> 0 as Color32\n data32[idx] = blendFn(src, data32[idx] as Color32)\n } else {\n data32[idx] = blendFn(constantSrc, data32[idx] as Color32)\n }\n }\n }\n }\n}\n","import type { BlendColor32, Color32, Rect } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport { PixelData } from './PixelData'\n\n/**\n * Applies a rectangular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushWidth\n * @param brushHeight\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @default sourceOverPerfect\n */\nexport function applyRectBrushToPixelData(\n target: PixelData,\n color: Color32,\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn: BlendColor32 = sourceOverPerfect,\n): void {\n const targetWidth = target.width\n const targetHeight = target.height\n const data32 = target.data32\n\n const rawStartX = Math.floor(centerX - brushWidth / 2)\n const rawStartY = Math.floor(centerY - brushHeight / 2)\n const endX = Math.min(targetWidth, rawStartX + brushWidth)\n const endY = Math.min(targetHeight, rawStartY + brushHeight)\n const startX = Math.max(0, rawStartX)\n const startY = Math.max(0, rawStartY)\n\n const baseColor = color & 0x00ffffff\n const constantSrc = ((alpha << 24) | baseColor) >>> 0 as Color32\n const invHalfW = 1 / (brushWidth / 2)\n const invHalfH = 1 / (brushHeight / 2)\n\n for (let py = startY; py < endY; py++) {\n const rowOffset = py * targetWidth\n const dy = Math.abs(py + 0.5 - centerY) * invHalfH\n\n for (let px = startX; px < endX; px++) {\n if (fallOff) {\n const dx = Math.abs(px + 0.5 - centerX) * invHalfW\n const dist = dx > dy ? dx : dy\n const fAlpha = (alpha * fallOff(dist)) | 0\n const src = ((fAlpha << 24) | baseColor) >>> 0 as Color32\n data32[rowOffset + px] = blendFn(src, data32[rowOffset + px] as Color32)\n } else {\n data32[rowOffset + px] = blendFn(constantSrc, data32[rowOffset + px] as Color32)\n }\n }\n }\n}\n\nexport function getRectBrushBounds(\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n targetWidth?: number,\n targetHeight?: number,\n): Rect {\n\n const rawStartX = Math.floor(centerX - brushWidth / 2)\n const rawStartY = Math.floor(centerY - brushHeight / 2)\n\n const rawEndX = rawStartX + brushWidth\n const rawEndY = rawStartY + brushHeight\n\n const startX = targetWidth !== undefined\n ? Math.max(0, rawStartX)\n : rawStartX\n\n const startY = targetHeight !== undefined\n ? Math.max(0, rawStartY)\n : rawStartY\n\n const endX = targetWidth !== undefined\n ? Math.min(targetWidth, rawEndX)\n : rawEndX\n\n const endY = targetHeight !== undefined\n ? Math.min(targetHeight, rawEndY)\n : rawEndY\n\n return {\n x: startX,\n y: startY,\n w: endX - startX,\n h: endY - startY,\n }\n}\n","import type { Color32, Rect } from '../_types'\nimport type { PixelData } from './PixelData'\nimport { fillPixelData } from './fillPixelData'\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(\n dst: PixelData,\n rect?: Partial<Rect>,\n): void {\n fillPixelData(dst, 0 as Color32, rect)\n}\n","import type { Rect } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: PixelData, rect: Rect): Uint32Array\nexport function extractPixelDataBuffer(source: PixelData, x: number, y: number, w: number, h: number): Uint32Array\nexport function extractPixelDataBuffer(\n source: PixelData,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): Uint32Array {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const srcW = source.width\n const srcH = source.height\n const srcData = source.data32\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0)\n }\n\n // Create a new ImageData to get a clean, aligned buffer\n const dstImageData = new ImageData(w, h)\n const dstData = new Uint32Array(dstImageData.data.buffer)\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 // Return empty buffer if no intersection\n if (x1 <= x0 || y1 <= y0) {\n return dstData\n }\n\n const copyWidth = x1 - x0\n const copyHeight = y1 - y0\n\n for (let row = 0; row < copyHeight; row++) {\n const srcRow = y0 + row\n const srcStart = srcRow * srcW + x0\n\n const dstRow = (y0 - y) + row\n const dstCol = (x0 - x)\n const dstStart = dstRow * w + dstCol\n\n // Perform the high-speed 32-bit bulk copy\n const chunk = srcData.subarray(srcStart, srcStart + copyWidth)\n dstData.set(chunk, dstStart)\n }\n\n return dstData\n}\n","import type { Rect } from '../_types'\nimport { extractPixelDataBuffer } from './extractPixelDataBuffer'\nimport { PixelData } from './PixelData'\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: PixelData, rect: Rect): PixelData\nexport function extractPixelData(source: PixelData, x: number, y: number, w: number, h: number): PixelData\nexport function extractPixelData(\n source: PixelData,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): PixelData {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const result = new PixelData(new ImageData(w, h))\n\n const buffer = extractPixelDataBuffer(source, x, y, w, h)\n result.data32.set(buffer)\n\n return result\n}\n","import type { PixelData } from './PixelData'\n\nexport function reflectPixelDataHorizontal(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n const halfWidth = Math.floor(width / 2)\n\n for (let y = 0; y < height; y++) {\n const rowOffset = y * width\n\n for (let x = 0; x < halfWidth; x++) {\n const leftIdx = rowOffset + x\n const rightIdx = rowOffset + (width - 1 - x)\n const temp = data[leftIdx]\n\n data[leftIdx] = data[rightIdx]\n data[rightIdx] = temp\n }\n }\n}\n\nexport function reflectPixelDataVertical(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n const halfHeight = Math.floor(height / 2)\n\n for (let y = 0; y < halfHeight; y++) {\n const topRowOffset = y * width\n const bottomRowOffset = (height - 1 - y) * width\n\n for (let x = 0; x < width; x++) {\n const topIdx = topRowOffset + x\n const bottomIdx = bottomRowOffset + x\n const temp = data[topIdx]\n\n data[topIdx] = data[bottomIdx]\n data[bottomIdx] = temp\n }\n }\n}\n","/**\n * Resamples an PixelData by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { PixelData } from '../index'\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(\n pixelData: PixelData,\n factor: number,\n): PixelData {\n const { data, width, height } = resample32(pixelData.data32, pixelData.width, pixelData.height, factor)\n\n return new PixelData(new ImageData(\n new Uint8ClampedArray(data.buffer) as ImageDataArray,\n width,\n height,\n ))\n}\n","import { PixelData } from './PixelData'\n\n/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n\n if (width === height) {\n rotateSquareInPlace(pixelData)\n return\n }\n\n const newWidth = height\n const newHeight = width\n const newData32 = new Uint32Array(data.length)\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const oldIdx = y * width + x\n const newX = height - 1 - y\n const newY = x\n const newIdx = newY * newWidth + newX\n\n newData32[newIdx] = data[oldIdx]\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(\n new Uint8ClampedArray(newData32.buffer),\n newWidth,\n newHeight,\n )\n\n pixelData.set(newImageData)\n}\n\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.width\n const data = pixelData.data32\n\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j\n const right = j * n + (n - 1 - i)\n const bottom = (n - 1 - i) * n + (n - 1 - j)\n const left = (n - 1 - j) * n + i\n\n const temp = data[top]\n data[top] = data[left]\n data[left] = data[bottom]\n data[bottom] = data[right]\n data[right] = temp\n }\n }\n}\n","import type { PixelData } from './PixelData'\nimport { type Rect } from '../_types'\n\n/**\n * Copies a pixel buffer into a specific region of a {@link PixelData} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target {@link PixelData} buffer.\n */\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n rect: Rect,\n): void\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!,\n }\n\n const dstW = target.width\n const dstH = target.height\n const dstData = target.data32\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + w)\n const y1 = Math.min(dstH, y + h)\n\n if (x1 <= x0 || y1 <= y0) {\n return\n }\n\n const rowLen = x1 - x0\n const srcCol = x0 - x\n const srcYOffset = y0 - y\n const actualH = y1 - y0\n\n for (let row = 0; row < actualH; row++) {\n const dstStart = (y0 + row) * dstW + x0\n const srcRow = srcYOffset + row\n const srcStart = srcRow * w + srcCol\n\n dstData.set(data.subarray(srcStart, srcStart + rowLen), dstStart)\n }\n}\n"],"mappings":"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","names":["MaskType","get","buffer","r","g","b","a"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/_types.ts","../src/color.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMask.ts","../src/Rect/trimRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/BlendModes/blend-modes-perfect.ts","../src/Canvas/_constants.ts","../src/Canvas/PixelCanvas.ts","../src/Canvas/ReusableCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/PixelPatchTiles.ts","../src/History/PixelAccumulator.ts","../src/History/HistoryManager.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyMaskToPixelData.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyMask.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorFillPixelData.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/copyImageData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/ImageData/imageDataToAlphaMask.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUInt32Array.ts","../src/ImageData/invertImageData.ts","../src/Internal/resample32.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/copyMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeMasks.ts","../src/PixelData/PixelData.ts","../src/PixelData/applyCircleBrushToPixelData.ts","../src/PixelData/applyRectBrushToPixelData.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/writePixelDataBuffer.ts"],"sourcesContent":["export * from './_types'\nexport * from './color'\n\nexport * from './Algorithm/floodFillSelection'\n\nexport * from './BlendModes/BlendModeRegistry'\nexport * from './BlendModes/blend-modes'\nexport * from './BlendModes/blend-modes-fast'\nexport * from './BlendModes/blend-modes-perfect'\n\nexport * from './Canvas/PixelCanvas'\nexport * from './Canvas/ReusableCanvas'\n\nexport * from './Clipboard/getImageDataFromClipboard'\nexport * from './Clipboard/writeImageDataToClipboard'\nexport * from './Clipboard/writeImgBlobToClipboard'\n\nexport * from './History/PixelAccumulator'\nexport * from './History/HistoryManager'\nexport * from './History/PixelEngineConfig'\nexport * from './History/PixelMutator'\nexport * from './History/PixelPatchTiles'\nexport * from './History/PixelWriter'\n\nexport * from './History/PixelMutator/mutatorApplyMask'\nexport * from './History/PixelMutator/mutatorBlendColor'\nexport * from './History/PixelMutator/mutatorBlendPixel'\nexport * from './History/PixelMutator/mutatorBlendPixelData'\nexport * from './History/PixelMutator/mutatorFillPixelData'\nexport * from './History/PixelMutator/mutatorInvert'\n\nexport * from './ImageData/ReusableImageData'\nexport * from './ImageData/copyImageData'\nexport * from './ImageData/extractImageDataBuffer'\nexport * from './ImageData/imageDataToAlphaMask'\nexport * from './ImageData/imageDataToDataUrl'\nexport * from './ImageData/imageDataToImgBlob'\nexport * from './ImageData/imageDataToUInt32Array'\nexport * from './ImageData/imgBlobToImageData'\nexport * from './ImageData/invertImageData'\nexport * from './ImageData/resampleImageData'\nexport * from './ImageData/resizeImageData'\nexport * from './ImageData/serialization'\nexport * from './ImageData/writeImageData'\nexport * from './ImageData/writeImageDataBuffer'\n\nexport * from './IndexedImage/IndexedImage'\nexport * from './IndexedImage/getIndexedImageColorCounts'\nexport * from './IndexedImage/indexedImageToAverageColor'\nexport * from './IndexedImage/resampleIndexedImage'\nexport * from './IndexedImage/indexedImageToImageData'\n\nexport * from './Input/fileInputChangeToImageData'\nexport * from './Input/fileToImageData'\nexport * from './Input/getSupportedRasterFormats'\n\nexport * from './Mask/copyMask'\nexport * from './Mask/extractMask'\nexport * from './Mask/invertMask'\nexport * from './Mask/mergeMasks'\n\nexport * from './PixelData/PixelData'\nexport * from './PixelData/applyCircleBrushToPixelData'\nexport * from './PixelData/applyMaskToPixelData'\nexport * from './PixelData/applyRectBrushToPixelData'\nexport * from './PixelData/blendColorPixelData'\nexport * from './PixelData/blendPixelData'\nexport * from './PixelData/clearPixelData'\nexport * from './PixelData/extractPixelData'\nexport * from './PixelData/extractPixelDataBuffer'\nexport * from './PixelData/fillPixelData'\nexport * from './PixelData/invertPixelData'\nexport * from './PixelData/pixelDataToAlphaMask'\nexport * from './PixelData/reflectPixelData'\nexport * from './PixelData/resamplePixelData'\nexport * from './PixelData/rotatePixelData'\nexport * from './PixelData/writePixelDataBuffer'\n\nexport * from './Rect/trimRectBounds'\n","import type { BlendColor32 } from '../_types'\n\nexport const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22,\n} as const\n\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\n\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>\n\nexport const overwriteBase: BlendColor32 = (src, _dst) => src\noverwriteBase.isOverwrite = true\n","import type { BlendColor32 } from '../_types'\nimport type { BaseBlendModes } from './blend-modes'\n\nexport type BlendModeRegistry<\n BlendModes extends BaseBlendModes = BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>\n\nexport function makeBlendModeRegistry<\n BlendModes extends BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n\n>(\n blendModes: BlendModes,\n initialEntries: Record<Index, BlendColor32>,\n) {\n\n const blendToName = new Map<BlendColor32, Name>()\n const blendToIndex = new Map<BlendColor32, Index>()\n const indexToName: Name[] = []\n const indexToBlend: BlendColor32[] = []\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 }\n const nameToIndex = {} as Record<Name, Index>\n\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n indexToName[index] = name\n indexToBlend[index] = blendFn\n blendToIndex.set(blendFn, index)\n blendToName.set(blendFn, name)\n nameToBlend[name] = blendFn\n nameToIndex[name] = index\n }\n\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index]\n add(name as Name, index as Index, blend)\n }\n\n return {\n nameToBlend,\n nameToIndex,\n\n blendToIndex,\n blendToName,\n\n indexToBlend,\n indexToName,\n\n indexType: null as unknown as Index,\n nameType: null as unknown as Name,\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwriteFast = overwriteBase\n\nexport const sourceOverFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return src\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 const da = (dst >>> 24) & 0xFF\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (sr * sa + dr * invA) >> 8\n const g = (sg * sa + dg * invA) >> 8\n const b = (sb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\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 const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** (src * dst) / 255 */\nexport const multiplyFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\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 // Consistent floor rounding for all channels\n const br = (sr * dr) >> 8\n const bg = (sg * dg) >> 8\n const bb = (sb * db) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\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 + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnFast: 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 const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / sr) | 0)\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / sg) | 0)\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\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 + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const bgU = dg + sg - 255\n const bbU = db + sb - 255\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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 darkerFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. 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/** Math.max(src, dst) */\nexport const lightenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const br = Math.max(src & 0xFF, dst & 0xFF)\n const bg = Math.max((src >> 8) & 0xFF, (dst >> 8) & 0xFF)\n const bb = Math.max((src >> 16) & 0xFF, (dst >> 16) & 0xFF)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const dr = dst & 0xFF\n const dg = (dst >> 8) & 0xFF\n const db = (dst >> 16) & 0xFF\n\n // 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 * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenFast: 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 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 // 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/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgeFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 255 ? 255 : Math.min(255, ((dr << 8) / (255 - sr)) | 0)\n const bg = sg === 255 ? 255 : Math.min(255, ((dg << 8) / (255 - sg)) | 0)\n const bb = sb === 255 ? 255 : Math.min(255, ((db << 8) / (255 - sb)) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** src + dst */\nexport const linearDodgeFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bbU = ((src >>> 16) & 0xFF) + db\n\n const br = brU > 255 ? 255 : brU\n const bg = bgU > 255 ? 255 : bgU\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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 lighterFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\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/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayFast: 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 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 // 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/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = ((255 - dr) * ((sr * dr) >> 8) + dr * (255 - (((255 - sr) * (255 - dr)) >> 8))) >> 8\n const bg = ((255 - dg) * ((sg * dg) >> 8) + dg * (255 - (((255 - sg) * (255 - dg)) >> 8))) >> 8\n const bb = ((255 - db) * ((sb * db) >> 8) + db * (255 - (((255 - sb) * (255 - db)) >> 8))) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\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 // 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 * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr + 2 * sr - 255\n const bgU = dg + 2 * sg - 255\n const bbU = db + 2 * sb - 255\n\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < 2 * sr ? dr : 2 * sr) : (dr > 2 * sr - 256 ? dr : 2 * sr - 256)\n const bg = sg < 128 ? (dg < 2 * sg ? dg : 2 * sg) : (dg > 2 * sg - 256 ? dg : 2 * sg - 256)\n const bb = sb < 128 ? (db < 2 * sb ? db : 2 * sb) : (db > 2 * sb - 256 ? db : 2 * sb - 256)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))) < 128 ? 0 : 255\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** Math.abs(src - dst) */\nexport const differenceFast: 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 const brD = (src & 0xFF) - dr\n const bgD = ((src >>> 8) & 0xFF) - dg\n const bbD = ((src >>> 16) & 0xFF) - db\n\n const br = brD < 0 ? -brD : brD\n const bg = bgD < 0 ? -bgD : bgD\n const bb = bbD < 0 ? -bbD : bbD\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** dst + src - ((dst * src) >> 7) */\nexport const exclusionFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr + sr - ((dr * sr) >> 7)\n const bg = dg + sg - ((dg * sg) >> 7)\n const bb = db + sb - ((db * sb) >> 7)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** Math.max(0, dst - src) */\nexport const subtractFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr - sr\n const bgU = dg - sg\n const bbU = db - sb\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const divideFast: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 0 ? 255 : Math.min(255, ((dr << 8) / sr) | 0)\n const bg = sg === 0 ? 255 : Math.min(255, ((dg << 8) / sg) | 0)\n const bb = sb === 0 ? 255 : Math.min(255, ((db << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 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 BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast,\n}\n\nexport function makeFastBlendModeRegistry() {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS)\n}\n","import { sourceOverFast } from './BlendModes/blend-modes-fast'\n\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 = {\n (src: Color32, dst: Color32): Color32,\n isOverwrite?: true\n}\n\nexport type ImageDataLike = {\n width: number\n height: number\n data: Uint8ClampedArray<ArrayBufferLike>\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 PixelRectOptions {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number\n\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number\n\n /**\n * The width of the region to process.\n * @default Source width.\n */\n w?: number\n\n /**\n * The height of the region to process.\n * @default Source height.\n */\n h?: number\n}\n\nexport interface PixelMaskRectOptions {\n\n /**\n * Mask width.\n * @default value of `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\nexport interface PixelMaskInvertOptions {\n\n /**\n * If true the inverse of the mask will be applied\n * @default false\n */\n invertMask?: boolean\n}\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 extends PixelRectOptions, PixelMaskRectOptions, PixelMaskInvertOptions {\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: 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.\n * @default {@link MaskType.ALPHA}\n */\n maskType?: MaskType\n}\n\nexport interface PixelMutateOptions extends PixelRectOptions, PixelMaskRectOptions, PixelMaskInvertOptions {\n /** An optional mask to restrict where pixels are mutated. */\n mask?: BinaryMask | null\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 /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverFast}\n */\n blendFn?: BlendColor32\n}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelOptions {\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverFast}\n */\n blendFn?: BlendColor32\n}\n\nexport type ApplyMaskOptions = Omit<PixelOptions, 'mask'>\n\nexport type SelectionRect = Rect & ({\n mask: Uint8Array,\n maskType: MaskType,\n} | {\n mask?: null\n maskType?: null,\n})\n\nexport type Point = {\n x: number,\n y: number,\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, Rect } from '../_types'\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n rect: Rect,\n): Uint8ClampedArray\n/**\n * @param imageData - The source image data to read from.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A {@link Uint8ClampedArray} containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8ClampedArray\nexport function extractImageDataBuffer(\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 { Rect } from '../_types'\n\n/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param rect - A {@link Rect} object defining the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n rect: Rect,\n): Uint8Array\n/**\n * @param mask - The source 1D array representing the full 2D mask.\n * @param maskWidth - The width of the original source mask (stride).\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A new {@link Uint8Array} containing the extracted region.\n */\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8Array\nexport function extractMask(\n mask: Uint8Array,\n maskWidth: number,\n xOrRect: number | Rect,\n y?: number,\n w?: number,\n h?: number,\n): Uint8Array {\n let finalX: number\n let finalY: number\n let finalW: number\n let finalH: number\n\n if (typeof xOrRect === 'object') {\n finalX = xOrRect.x\n finalY = xOrRect.y\n finalW = xOrRect.w\n finalH = xOrRect.h\n } else {\n finalX = xOrRect\n finalY = y!\n finalW = w!\n finalH = h!\n }\n\n const out = new Uint8Array(finalW * finalH)\n const srcH = mask.length / maskWidth\n\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row\n\n if (currentSrcY < 0 || currentSrcY >= srcH) {\n continue\n }\n\n const start = Math.max(0, finalX)\n const end = Math.min(maskWidth, finalX + finalW)\n\n if (start < end) {\n const srcOffset = currentSrcY * maskWidth + start\n const dstOffset = (row * finalW) + (start - finalX)\n const count = end - start\n\n out.set(\n mask.subarray(srcOffset, srcOffset + count),\n dstOffset,\n )\n }\n }\n\n return out\n}\n","import type { Rect, SelectionRect } from '../_types'\nimport { extractMask } from '../Mask/extractMask'\n\n/**\n * Intersects a target rectangle with a boundary, trimming dimensions and masks in-place.\n * This utility calculates the axis-aligned intersection between the `target` and `bounds`.\n * If the `target` includes a `mask` (as in a {@link SelectionRect}), the mask is physically\n * cropped and re-aligned using `extractMask` to match the new dimensions.\n * @param target - The rectangle or selection object to be trimmed. **Note:** This object is mutated in-place.\n * @param bounds - The boundary rectangle defining the maximum allowable area (e.g., canvas dimensions).\n * @example\n * const selection = { x: -10, y: -10, w: 50, h: 50, mask: new Uint8Array(2500) };\n * const canvas = { x: 0, y: 0, w: 100, h: 100 };\n * // Selection will be moved to (0,0) and resized to 40x40.\n * // The mask is cropped by 10 px on the top and left.\n * trimRectBounds(selection, canvas);\n */\nexport function trimRectBounds<T extends Rect | SelectionRect>(\n target: T,\n bounds: Rect,\n): void {\n const originalX = target.x\n const originalY = target.y\n const originalW = target.w\n\n const intersectedX = Math.max(target.x, bounds.x)\n const intersectedY = Math.max(target.y, bounds.y)\n\n const intersectedMaxX = Math.min(\n target.x + target.w,\n bounds.x + bounds.w,\n )\n const intersectedMaxY = Math.min(\n target.y + target.h,\n bounds.y + bounds.h,\n )\n\n // Intersection check\n if (intersectedMaxX <= intersectedX || intersectedMaxY <= intersectedY) {\n target.w = 0\n target.h = 0\n\n if ('mask' in target && target.mask) {\n // This line is now hit by the 'empty intersection' test below\n target.mask = new Uint8Array(0)\n }\n\n return\n }\n\n const intersectedW = intersectedMaxX - intersectedX\n const intersectedH = intersectedMaxY - intersectedY\n const offsetX = intersectedX - originalX\n const offsetY = intersectedY - originalY\n\n target.x = intersectedX\n target.y = intersectedY\n target.w = intersectedW\n target.h = intersectedH\n\n if ('mask' in target && target.mask) {\n const currentMask = extractMask(\n target.mask,\n originalW,\n offsetX,\n offsetY,\n intersectedW,\n intersectedH,\n )\n\n let minX = intersectedW\n let maxX = -1\n let minY = intersectedH\n let maxY = -1\n\n // Scan for content\n for (let y = 0; y < intersectedH; y++) {\n for (let x = 0; x < intersectedW; x++) {\n if (currentMask[y * intersectedW + x] !== 0) {\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n }\n\n // If no content is found (all zeros)\n if (maxX === -1) {\n target.w = 0\n target.h = 0\n // This covers the specific line you mentioned\n target.mask = new Uint8Array(0)\n return\n }\n\n const finalW = maxX - minX + 1\n const finalH = maxY - minY + 1\n\n // Only shift and crop if the content is smaller than the intersection\n if (finalW !== intersectedW || finalH !== intersectedH) {\n target.mask = extractMask(\n currentMask,\n intersectedW,\n minX,\n minY,\n finalW,\n finalH,\n )\n target.x += minX\n target.y += minY\n target.w = finalW\n target.h = finalH\n } else {\n target.mask = currentMask\n }\n }\n}\n","import { type Color32, type ImageDataLike, MaskType, type Rect, type SelectionRect } from '../_types'\nimport { colorDistance } from '../color'\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer'\nimport type { PixelData } from '../PixelData/PixelData'\nimport { trimRectBounds } from '../Rect/trimRectBounds'\n\nexport type FloodFillImageDataOptions = {\n contiguous?: boolean\n tolerance?: number\n bounds?: Rect\n}\n\nexport type FloodFillResult = {\n startX: number\n startY: number\n selectionRect: SelectionRect\n pixels: Uint8ClampedArray\n}\n\n/**\n * Performs a color-based flood fill selection on {@link ImageData} or {@link PixelData}.\n * This utility identifies pixels starting from a specific coordinate that fall within a\n * color tolerance. It can operate in \"contiguous\" mode (classic bucket fill) or\n * \"non-contiguous\" mode (selects all matching pixels in the buffer).\n *\n * @param img - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param options - Configuration for the fill operation.\n * @param options.contiguous - @default true. If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param options.tolerance - @default 0. The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param options.bounds - Optional bounding box to restrict the search area.\n *\n * @returns A {@link FloodFillResult} containing the mask and bounds of the selection,\n * or `null` if the starting coordinates are out of bounds.\n *\n * @example\n * ```typescript\n * const result = floodFillImageDataSelection(\n * ctx.getImageData(0, 0, 100, 100),\n * 50,\n * 50,\n * {\n * tolerance: 20,\n * contiguous: true\n * }\n * );\n * ```\n */\nexport function floodFillSelection(\n img: ImageDataLike | PixelData,\n startX: number,\n startY: number,\n {\n contiguous = true,\n tolerance = 0,\n bounds,\n }: FloodFillImageDataOptions = {},\n): FloodFillResult | null {\n\n let imageData: ImageDataLike\n let data32: Uint32Array\n if ('data32' in img) {\n data32 = img.data32\n imageData = img.imageData\n } else {\n data32 = new Uint32Array(\n img.data.buffer,\n img.data.byteOffset,\n img.data.byteLength >> 2,\n )\n imageData = img\n }\n const {\n width,\n height,\n } = img\n\n const limit = bounds || {\n x: 0,\n y: 0,\n w: width,\n h: height,\n }\n\n const xMin = Math.max(0, limit.x)\n const xMax = Math.min(width - 1, limit.x + limit.w - 1)\n const yMin = Math.max(0, limit.y)\n const yMax = Math.min(height - 1, limit.y + limit.h - 1)\n\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null\n }\n\n const baseColor = data32[startY * width + startX] as Color32\n\n let matchCount = 0\n const matchX = new Uint16Array(width * height)\n const matchY = new Uint16Array(width * height)\n\n let minX = startX\n let maxX = startX\n let minY = startY\n let maxY = startY\n\n if (contiguous) {\n const visited = new Uint8Array(width * height)\n const stack = new Uint32Array(width * height)\n let stackPtr = 0\n\n stack[stackPtr++] = (startY << 16) | startX\n visited[startY * width + startX] = 1\n\n while (stackPtr > 0) {\n const val = stack[--stackPtr]\n const x = val & 0xFFFF\n const y = val >>> 16\n\n matchX[matchCount] = x\n matchY[matchCount] = y\n matchCount++\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n\n // Right\n if (x + 1 <= xMax) {\n const idx = y * width + (x + 1)\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = (y << 16) | (x + 1)\n }\n }\n // Left\n if (x - 1 >= xMin) {\n const idx = y * width + (x - 1)\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = (y << 16) | (x - 1)\n }\n }\n // Down\n if (y + 1 <= yMax) {\n const idx = (y + 1) * width + x\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = ((y + 1) << 16) | x\n }\n }\n // Up\n if (y - 1 >= yMin) {\n const idx = (y - 1) * width + x\n if (!visited[idx] && colorDistance(data32[idx] as Color32, baseColor) <= tolerance) {\n visited[idx] = 1\n stack[stackPtr++] = ((y - 1) << 16) | x\n }\n }\n }\n } else {\n for (let y = yMin; y <= yMax; y++) {\n for (let x = xMin; x <= xMax; x++) {\n const color = data32[y * width + x] as Color32\n if (colorDistance(color, baseColor) <= tolerance) {\n matchX[matchCount] = x\n matchY[matchCount] = y\n matchCount++\n\n if (x < minX) minX = x\n if (x > maxX) maxX = x\n if (y < minY) minY = y\n if (y > maxY) maxY = y\n }\n }\n }\n }\n\n if (matchCount === 0) {\n return null\n }\n const selectionRect: SelectionRect = {\n x: minX,\n y: minY,\n w: maxX - minX + 1,\n h: maxY - minY + 1,\n mask: new Uint8Array((maxX - minX + 1) * (maxY - minY + 1)),\n maskType: MaskType.BINARY,\n }\n\n // REMOVED trimRectBounds from here\n\n const sw = selectionRect.w\n const sh = selectionRect.h\n const finalMask = selectionRect.mask!\n\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - selectionRect.x\n const my = matchY[i] - selectionRect.y\n\n if (mx >= 0 && mx < sw && my >= 0 && my < sh) {\n finalMask[my * sw + mx] = 1\n }\n }\n\n // trimRectBounds can see them and work correctly.\n trimRectBounds(\n selectionRect,\n { x: 0, y: 0, w: width, h: height },\n )\n\n // Use the UPDATED values from the selectionRect after trimming\n const extracted = extractImageDataBuffer(\n imageData,\n selectionRect.x,\n selectionRect.y,\n selectionRect.w,\n selectionRect.h,\n )\n\n return {\n startX,\n startY,\n selectionRect,\n pixels: extracted,\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwritePerfect = overwriteBase\n\nexport const sourceOverPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return src\n if (sa === 0) return dst\n\n const invA = 255 - sa\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 const da = (dst >>> 24) & 0xFF\n\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = (sr * sa + dr * invA)\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = (sg * sa + dg * invA)\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = (sb * sa + db * invA)\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = (255 * sa + da * invA)\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\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 const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (src * dst) / 255 */\nexport const multiplyPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const da = (dst >>> 24) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr\n const br = (mR + 1 + (mR >> 8)) >> 8\n\n const mG = sg * dg\n const bg = (mG + 1 + (mG >> 8)) >> 8\n\n const mB = sb * db\n const bb = (mB + 1 + (mB >> 8)) >> 8\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - (((255 - dr) * 255 / sr) | 0)\n const br = resR < 0 ? 0 : resR\n\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - (((255 - dg) * 255 / sg) | 0)\n const bg = resG < 0 ? 0 : resG\n\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - (((255 - db) * 255 / sb) | 0)\n const bb = resB < 0 ? 0 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const br = brU < 0 ? 0 : brU\n const bgU = dg + sg - 255\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db + sb - 255\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkerPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(src, dst) */\nexport const lightenPerfect: 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 const br = (src & 0xFF) > dr ? (src & 0xFF) : dr\n const bg = ((src >>> 8) & 0xFF) > dg ? ((src >>> 8) & 0xFF) : dg\n const bb = ((src >>> 16) & 0xFF) > db ? ((src >>> 16) & 0xFF) : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenPerfect: 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 const br = 255 - (((255 - (src & 0xFF)) * (255 - dr) / 255) | 0)\n const bg = 255 - (((255 - ((src >>> 8) & 0xFF)) * (255 - dg) / 255) | 0)\n const bb = 255 - (((255 - ((src >>> 16) & 0xFF)) * (255 - db) / 255) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : (dr * 255 / (255 - sr)) | 0\n const br = resR > 255 ? 255 : resR\n\n const resG = sg === 255 ? 255 : (dg * 255 / (255 - sg)) | 0\n const bg = resG > 255 ? 255 : resG\n\n const resB = sb === 255 ? 255 : (db * 255 / (255 - sb)) | 0\n const bb = resB > 255 ? 255 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst */\nexport const linearDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const br = brU > 255 ? 255 : brU\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bg = bgU > 255 ? 255 : bgU\n const bbU = ((src >>> 16) & 0xFF) + db\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const lighterPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayPerfect: 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 const br = dr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = dg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = db < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const mR = (sr * dr)\n const scR = (255 - sr) * (255 - dr)\n const br = ((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8)) + 1 + (((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8))) >> 8)) >> 8\n\n const mG = (sg * dg)\n const scG = (255 - sg) * (255 - dg)\n const bg = ((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8)) + 1 + (((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8))) >> 8)) >> 8\n\n const mB = (sb * db)\n const scB = (255 - sb) * (255 - db)\n const bb = ((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8)) + 1 + (((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8))) >> 8)) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = sg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = sb < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr + 2 * sr - 255\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bgU = dg + 2 * sg - 255\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bbU = db + 2 * sb - 255\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < (sr << 1) ? dr : (sr << 1)) : (dr > ((sr - 128) << 1) ? dr : ((sr - 128) << 1))\n const bg = sg < 128 ? (dg < (sg << 1) ? dg : (sg << 1)) : (dg > ((sg - 128) << 1) ? dg : ((sg - 128) << 1))\n const bb = sb < 128 ? (db < (sb << 1) ? db : (sb << 1)) : (db > ((sb - 128) << 1) ? db : ((sb - 128) << 1))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))) < 128 ? 0 : 255\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.abs(src - dst) */\nexport const differencePerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr > sr ? dr - sr : sr - dr\n const bg = dg > sg ? dg - sg : sg - dg\n const bb = db > sb ? db - sb : sb - db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const r2 = dr * sr\n const br = dr + sr - (((r2 + r2) + 1 + ((r2 + r2) >> 8)) >> 8)\n\n const g2 = dg * sg\n const bg = dg + sg - (((g2 + g2) + 1 + ((g2 + g2) >> 8)) >> 8)\n\n const b2 = db * sb\n const bb = db + sb - (((b2 + b2) + 1 + ((b2 + b2) >> 8)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(0, dst - src) */\nexport const subtractPerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr - sr\n const br = brU < 0 ? 0 : brU\n const bgU = dg - sg\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db - sb\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const dividePerfect: 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 const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr === 0 ? 255 : Math.min(255, ((dr * 255 / sr) | 0))\n const bg = sg === 0 ? 255 : Math.min(255, ((dg * 255 / sg) | 0))\n const bb = sb === 0 ? 255 : Math.min(255, ((db * 255 / sb) | 0))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect,\n}\n\nexport function makePerfectBlendModeRegistry() {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS)\n}\n","export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context'\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context'\n","import { CANVAS_CTX_FAILED } from './_constants'\n\nexport type PixelCanvas = {\n readonly canvas: HTMLCanvasElement,\n readonly ctx: CanvasRenderingContext2D,\n readonly resize: (w: number, h: number) => void\n}\n\n/**\n * Ensures the canvas ctx is always set to imageSmoothingEnabled = false.\n * Intended for canvas elements that are already part of the DOM.\n * @see makeReusableCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makePixelCanvas(\n canvas: HTMLCanvasElement,\n): PixelCanvas {\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error(CANVAS_CTX_FAILED)\n ctx.imageSmoothingEnabled = false\n\n return {\n canvas,\n ctx,\n resize(w: number, h: number) {\n canvas.width = w\n canvas.height = h\n ctx.imageSmoothingEnabled = false\n },\n }\n}\n","import { CANVAS_CTX_FAILED } from './_constants'\n\nexport type ReusableCanvas = {\n readonly canvas: HTMLCanvasElement\n readonly ctx: CanvasRenderingContext2D\n}\n\n/**\n * Creates a reusable canvas and context that are not part of the DOM.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makeReusableCanvas() {\n let canvas: HTMLCanvasElement | null = null\n let ctx: CanvasRenderingContext2D | null = null\n\n function get(width: number, height: number): ReusableCanvas {\n if (canvas === null) {\n canvas = document.createElement('canvas')!\n ctx = canvas.getContext('2d')!\n if (!ctx) throw new Error(CANVAS_CTX_FAILED)\n }\n\n // Resize if needed (resizing auto-clears)\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width\n canvas.height = height\n ctx!.imageSmoothingEnabled = false\n } else {\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height)\n }\n\n return { canvas, ctx: ctx! }\n }\n\n get.reset = () => {\n canvas = null\n ctx = null\n }\n\n return get\n}\n","/**\n * Decodes a {@link Blob} (typically PNG) back into an {@link ImageData} object.\n *\n * This function uses hardware-accelerated decoding via {@link createImageBitmap}\n * and processes the data using an {@link OffscreenCanvas} to ensure\n * compatibility with Web Workers.\n *\n * @param blob - The binary image data to decode.\n *\n * @returns A promise resolving to the decoded {@link ImageData}.\n *\n * @throws {Error}\n * Thrown if the blob is corrupted or the browser cannot decode the format.\n *\n * @example\n * ```typescript\n * const blob = await getBlobFromStorage();\n *\n * const imageData = await pngBlobToImageData(blob);\n * ```\n */\nexport async function imgBlobToImageData(\n blob: Blob,\n): Promise<ImageData> {\n let bitmap: ImageBitmap | null = null\n\n try {\n bitmap = await createImageBitmap(blob)\n\n const canvas = new OffscreenCanvas(\n bitmap.width,\n bitmap.height,\n )\n\n const ctx = canvas.getContext('2d')\n\n if (!ctx) {\n throw new Error('Failed to get 2D context')\n }\n\n ctx.drawImage(bitmap, 0, 0)\n\n return ctx.getImageData(\n 0,\n 0,\n bitmap.width,\n bitmap.height,\n )\n } finally {\n bitmap?.close()\n }\n}\n","import { imgBlobToImageData } from '../ImageData/imgBlobToImageData'\n\n/**\n * Extracts {@link ImageData} from a clipboard event if an image is present.\n *\n * This function iterates through the {@link DataTransferItemList} to find\n * the first item with an image MIME type and decodes it.\n *\n * @param clipboardEvent - The event object from a `paste` listener.\n *\n * @returns A promise resolving to {@link ImageData}, or `null` if no\n * image was found in the clipboard.\n *\n * @example\n * ```typescript\n * window.addEventListener('paste', async (event) => {\n * const data = await getImageDataFromClipboard(event)\n * if (data) {\n * console.log('Pasted image dimensions:', data.width, data.height)\n * }\n * });\n * ```\n */\nexport async function getImageDataFromClipboard(clipboardEvent: ClipboardEvent) {\n const items = clipboardEvent?.clipboardData?.items\n if (!items?.length) return null\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n\n if (item.type.startsWith('image/')) {\n const blob = item.getAsFile()\n\n if (!blob) {\n continue\n }\n\n return imgBlobToImageData(blob)\n }\n }\n return null\n}\n","/**\n * Converts an {@link ImageData} object into a {@link Blob} in PNG format.\n *\n * This operation is asynchronous and uses {@link OffscreenCanvas}\n * to perform the encoding, making it suitable for usage in both the main\n * thread and Web Workers.\n *\n * @param imageData - The pixel data to be encoded.\n *\n * @returns A promise that resolves to a {@link Blob} with the MIME type `image/png`.\n *\n * @throws {Error}\n * Thrown if the {@link OffscreenCanvas} context cannot be initialized or the blob\n * encoding fails.\n *\n * @example\n * ```typescript\n * const blob = await imageDataToImgBlob(imageData);\n * const url = URL.createObjectURL(blob);\n * ```\n */\nexport async function imageDataToImgBlob(imageData: ImageData): Promise<Blob> {\n const canvas = new OffscreenCanvas(imageData.width, imageData.height)\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error('could not create 2d context')\n\n ctx.putImageData(imageData, 0, 0)\n return canvas!.convertToBlob({\n type: 'image/png',\n })\n}\n","/**\n * Writes a {@link Blob} image to the system clipboard.\n *\n * @param blob - The image {@link Blob} (typically `image/png`) to copy.\n * @returns A promise that resolves when the clipboard has been updated.\n */\nexport async function writeImgBlobToClipboard(blob: Blob): Promise<void> {\n const item = new ClipboardItem({\n 'image/png': blob,\n })\n\n await navigator.clipboard.write([item])\n}\n","import { imageDataToImgBlob } from '../ImageData/imageDataToImgBlob'\nimport { writeImgBlobToClipboard } from './writeImgBlobToClipboard'\n\n/**\n * Converts {@link ImageData} to a PNG {@link Blob} and writes it to the system clipboard.\n * This is a high-level utility that combines {@link imageDataToImgBlob} and\n * {@link writeImgBlobToClipboard}.\n * @param imageData - The image data to copy to the clipboard.\n * @returns A promise that resolves when the image has been successfully copied.\n * @throws {Error}\n * If the conversion to blob fails or clipboard permissions are denied.\n *\n * @example\n * ```typescript\n * const canvas = document.querySelector('canvas')\n * const ctx = canvas.getContext('2d')\n * const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height)\n * await writeImageDataToClipboard(imageData)\n * ```\n */\nexport async function writeImageDataToClipboard(imageData: ImageData): Promise<void> {\n const blob = await imageDataToImgBlob(imageData)\n\n return writeImgBlobToClipboard(blob)\n}\n","import type { PixelData } from '../PixelData/PixelData'\n\nexport type PixelPatchTiles = {\n beforeTiles: PixelTile[]\n afterTiles: PixelTile[]\n}\n\nexport class PixelTile {\n public data32: Uint32Array\n\n constructor(\n public id: number,\n public tx: number,\n public ty: number,\n tileArea: number,\n ) {\n this.data32 = new Uint32Array(tileArea)\n }\n}\n\nexport function applyPatchTiles(target: PixelData, tiles: PixelTile[], tileSize: number = 256) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i]\n\n if (!tile) continue\n\n const dst = target.data32\n const src = tile.data32\n const dstWidth = target.width\n const dstHeight = target.height\n const startX = tile.tx * tileSize\n const startY = tile.ty * tileSize\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX))\n\n if (copyWidth <= 0) return\n\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break\n\n const dstIndex = globalY * dstWidth + startX\n const srcIndex = ly * tileSize\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n dst.set(rowData, dstIndex)\n }\n }\n}\n","import type { PixelData } from '../PixelData/PixelData'\nimport type { PixelEngineConfig } from './PixelEngineConfig'\nimport { type PixelPatchTiles, PixelTile } from './PixelPatchTiles'\n\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[]\n public beforeTiles: PixelTile[]\n public pool: PixelTile[]\n\n constructor(\n public target: PixelData,\n readonly config: PixelEngineConfig,\n ) {\n this.lookup = []\n this.beforeTiles = []\n this.pool = []\n }\n\n getTile(\n id: number,\n tx: number,\n ty: number,\n ): PixelTile {\n let tile = this.pool.pop()\n\n if (tile) {\n tile.id = id\n tile.tx = tx\n tile.ty = ty\n\n return tile\n }\n\n return new PixelTile(\n id,\n tx,\n ty,\n this.config.tileArea,\n )\n }\n\n recyclePatch(patch: PixelPatchTiles) {\n const before = patch.beforeTiles\n\n for (let i = 0; i < before.length; i++) {\n let tile = before[i]\n\n if (tile) {\n this.pool.push(tile)\n }\n }\n\n const after = patch.afterTiles\n\n for (let i = 0; i < after.length; i++) {\n let tile = after[i]\n\n if (tile) {\n this.pool.push(tile)\n }\n }\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storeTileBeforeState(x: number, y: number): void {\n let target = this.target\n let shift = this.config.tileShift\n let columns = (target.width + this.config.tileMask) >> shift\n let tx = x >> shift\n let ty = y >> shift\n let id = ty * columns + tx\n\n let tile = this.lookup[id]\n\n if (!tile) {\n tile = this.getTile(\n id,\n tx,\n ty,\n )\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n }\n }\n\n /**\n *\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(\n x: number,\n y: number,\n w: number,\n h: number,\n ) {\n let target = this.target\n let shift = this.config.tileShift\n let columns = (target.width + this.config.tileMask) >> shift\n\n let startX = x >> shift\n let startY = y >> shift\n let endX = (x + w - 1) >> shift\n let endY = (y + h - 1) >> shift\n\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n let id = ty * columns + tx\n let tile = this.lookup[id]\n\n if (!tile) {\n tile = this.getTile(\n id,\n tx,\n ty,\n )\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n }\n }\n }\n }\n\n extractState(tile: PixelTile) {\n let target = this.target\n let TILE_SIZE = this.config.tileSize\n let dst = tile.data32\n let src = target.data32\n let startX = tile.tx * TILE_SIZE\n let startY = tile.ty * TILE_SIZE\n let targetWidth = target.width\n let targetHeight = target.height\n\n let copyWidth = Math.max(0, Math.min(TILE_SIZE, targetWidth - startX))\n\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly\n let dstIndex = ly * TILE_SIZE\n\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE)\n continue\n }\n\n let srcIndex = globalY * targetWidth + startX\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n dst.set(rowData, dstIndex)\n\n if (copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + copyWidth, dstIndex + TILE_SIZE)\n }\n }\n }\n\n extractAfterTiles(): PixelTile[] {\n let afterTiles: PixelTile[] = []\n let length = this.beforeTiles.length\n\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i]\n\n if (beforeTile) {\n let afterTile = this.getTile(\n beforeTile.id,\n beforeTile.tx,\n beforeTile.ty,\n )\n\n this.extractState(afterTile)\n afterTiles.push(afterTile)\n }\n }\n\n return afterTiles\n }\n\n reset() {\n this.lookup = []\n this.beforeTiles = []\n }\n}\n","export interface HistoryAction {\n undo: () => void\n redo: () => void\n dispose?: () => void\n}\n\nexport class HistoryManager {\n public undoStack: HistoryAction[]\n public redoStack: HistoryAction[]\n public listeners: Set<() => void>\n\n constructor(\n public maxSteps = 50,\n ) {\n this.undoStack = []\n this.redoStack = []\n this.listeners = new Set()\n }\n\n get canUndo() {\n return this.undoStack.length > 0\n }\n\n get canRedo() {\n return this.redoStack.length > 0\n }\n\n subscribe(fn: () => void) {\n this.listeners.add(fn)\n return () => this.listeners.delete(fn)\n }\n\n notify() {\n this.listeners.forEach((fn) => fn())\n }\n\n commit(action: HistoryAction) {\n this.undoStack.push(action)\n this.clearRedoStack()\n\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.()\n }\n\n this.notify()\n }\n\n undo() {\n let action = this.undoStack.pop()\n\n if (!action) return\n\n this.redoStack.push(action)\n action.undo()\n\n this.notify()\n }\n\n redo() {\n let action = this.redoStack.pop()\n\n if (!action) return\n\n this.undoStack.push(action)\n action.redo()\n\n this.notify()\n }\n\n clearRedoStack() {\n let length = this.redoStack.length\n\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i]\n\n if (action) {\n action.dispose?.()\n }\n }\n\n this.redoStack.length = 0\n }\n}\n","export class PixelEngineConfig {\n public readonly tileSize: number\n public readonly tileShift: number\n public readonly tileMask: number\n public readonly tileArea: number\n\n constructor(tileSize: number = 256) {\n // Ensure it's a power of 2 to guarantee bitwise math works\n if ((tileSize & (tileSize - 1)) !== 0) {\n throw new Error('tileSize must be a power of 2')\n }\n\n this.tileSize = tileSize\n this.tileShift = Math.log2(tileSize)\n this.tileMask = tileSize - 1\n this.tileArea = tileSize * tileSize\n }\n}\n","import { type AnyMask, type ApplyMaskOptions, MaskType } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n */\nexport function applyMaskToPixelData(\n dst: PixelData,\n mask: AnyMask,\n opts: ApplyMaskOptions = {},\n): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Clipping Logic\n if (x < 0) {\n w += x\n x = 0\n }\n\n if (y < 0) {\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 || globalAlpha === 0) {\n return\n }\n\n const dst32 = dst.data32\n const dw = dst.width\n const mPitch = mw ?? width\n const isAlpha = maskType === MaskType.ALPHA\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - 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 mVal = mask[mIdx]\n let weight = globalAlpha\n\n if (isAlpha) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // Short-circuit: if source is 0, destination alpha becomes 0\n if (effectiveM === 0) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n dIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha === 255\n ? effectiveM\n : (effectiveM * globalAlpha + 128) >> 8\n } else {\n // Strict Binary 1/0 Logic\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n dIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // If calculated weight is 0, clear alpha\n if (weight === 0) {\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0\n } else {\n const d = dst32[dIdx]\n const da = (d >>> 24)\n\n let finalAlpha = da\n\n if (da === 0) {\n // Already transparent\n } else if (weight === 255) {\n // Identity: keep original da\n } else if (da === 255) {\n // Identity: result is just the weight\n finalAlpha = weight\n } else {\n finalAlpha = (da * weight + 128) >> 8\n }\n\n dst32[dIdx] = ((d & 0x00ffffff) | (finalAlpha << 24)) >>> 0\n }\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import type { PixelData } from '../PixelData/PixelData'\nimport { type HistoryAction, HistoryManager } from './HistoryManager'\nimport { PixelAccumulator } from './PixelAccumulator'\nimport { PixelEngineConfig } from './PixelEngineConfig'\nimport { applyPatchTiles, type PixelPatchTiles } from './PixelPatchTiles'\n\nexport interface PixelWriterOptions {\n maxHistorySteps?: number\n tileSize?: number\n historyManager?: HistoryManager\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n public target: PixelData\n public historyManager: HistoryManager\n public accumulator: PixelAccumulator\n protected config: PixelEngineConfig\n readonly mutator: M\n\n constructor(target: PixelData, mutatorFactory: (writer: PixelWriter<any>) => M, {\n tileSize = 256,\n maxHistorySteps = 50,\n historyManager = new HistoryManager(maxHistorySteps),\n }: PixelWriterOptions = {}) {\n this.target = target\n this.config = new PixelEngineConfig(tileSize)\n this.historyManager = historyManager\n this.accumulator = new PixelAccumulator(target, this.config)\n this.mutator = mutatorFactory(this)\n }\n\n withHistory(cb: (mutator: M) => void) {\n cb(this.mutator)\n\n const beforeTiles = this.accumulator.beforeTiles\n if (beforeTiles.length === 0) return\n\n const afterTiles = this.accumulator.extractAfterTiles()\n\n const patch: PixelPatchTiles = {\n beforeTiles: beforeTiles,\n afterTiles: afterTiles,\n }\n\n const target = this.target\n const tileSize = this.config.tileSize\n const accumulator = this.accumulator\n\n const action: HistoryAction = {\n undo: () => applyPatchTiles(target, patch.beforeTiles, tileSize),\n redo: () => applyPatchTiles(target, patch.afterTiles, tileSize),\n dispose: () => accumulator.recyclePatch(patch),\n }\n\n this.historyManager.commit(action)\n this.accumulator.reset()\n }\n}\n","import { type AnyMask, type ApplyMaskOptions } from '../../_types'\nimport { applyMaskToPixelData } from '../../PixelData/applyMaskToPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorApplyMask(writer: PixelWriter<any>) {\n return {\n applyMask: (mask: AnyMask, opts: ApplyMaskOptions = {}) => {\n let target = writer.target\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n applyMaskToPixelData(target, mask, opts)\n },\n }\n}\n","import { type Color32, type ColorBlendOptions, MaskType } from '../_types'\nimport { sourceOverFast } from '../BlendModes/blend-modes-fast'\nimport type { PixelData } from './PixelData'\n\n/**\n * Fills a rectangle in the destination PixelData with a single color,\n * supporting blend modes, global alpha, and masking.\n */\nexport function blendColorPixelData(\n dst: PixelData,\n color: Color32,\n opts: ColorBlendOptions = {},\n) {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = dst.width,\n h: height = dst.height,\n alpha: globalAlpha = 255,\n blendFn = sourceOverFast,\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 const baseSrcAlpha = (color >>> 24)\n const isOverwrite = blendFn.isOverwrite\n if (baseSrcAlpha === 0 && !isOverwrite) return\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\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 dw = dst.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 mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const mStride = mPitch - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\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 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 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 mask or global alpha are 0 we bail even if we are overwriting\n if (weight === 0) {\n dIdx++\n mIdx++\n continue\n }\n }\n\n let currentSrcColor = color\n\n if (weight < 255) {\n let currentSrcAlpha = baseSrcAlpha\n\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (!isOverwrite && currentSrcAlpha === 0) {\n dIdx++\n mIdx++\n continue\n }\n\n currentSrcColor = ((color & 0x00ffffff) | (currentSrcAlpha << 24)) >>> 0 as Color32\n }\n\n dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx] as Color32)\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import type { Color32, ColorBlendOptions } from '../../_types'\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendColor(writer: PixelWriter<any>) {\n return {\n blendColor(\n color: Color32,\n opts: ColorBlendOptions = {},\n ) {\n\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n blendColorPixelData(writer.target, color, opts)\n },\n }\n}\n","import type { BlendColor32, Color32 } from '../../_types'\nimport { overwriteFast } from '../../BlendModes/blend-modes-fast'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendPixel(writer: PixelWriter<any>) {\n return {\n blendPixel(\n x: number,\n y: number,\n color: Color32,\n alpha: number = 255,\n blendFn: BlendColor32 = overwriteFast,\n ) {\n let target = writer.target\n let width = target.width\n let height = target.height\n\n if (x < 0 || x >= width || y < 0 || y >= height) return\n\n writer.accumulator.storeTileBeforeState(x, y)\n\n let index = y * width + x\n let bg = target.data32[index] as Color32\n\n let finalColor = color\n\n if (alpha < 255) {\n let baseSrcAlpha = color >>> 24\n let finalAlpha = (baseSrcAlpha * alpha + 128) >> 8\n\n finalColor = (((color & 0x00ffffff) | (finalAlpha << 24)) >>> 0) as Color32\n }\n\n target.data32[index] = blendFn(finalColor, bg)\n },\n }\n}\n","import { type Color32, MaskType, type PixelBlendOptions } from '../_types'\nimport { sourceOverFast } from '../BlendModes/blend-modes-fast'\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 = sourceOverFast,\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 const isOverwrite = blendFn.isOverwrite\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 // In Overwrite, we process even if baseSrcAlpha is 0\n if (baseSrcAlpha === 0 && !isOverwrite) {\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 mask or global alpha are 0 we bail even if we are overwriting\n if (weight === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n let currentSrcAlpha = baseSrcAlpha\n\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (!isOverwrite && 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","import type { PixelBlendOptions } from '../../_types'\nimport { blendPixelData } from '../../PixelData/blendPixelData'\nimport type { PixelData } from '../../PixelData/PixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorBlendPixelData(writer: PixelWriter<any>) {\n return {\n blendPixelData(\n src: PixelData,\n opts: PixelBlendOptions,\n ) {\n const {\n x = 0,\n y = 0,\n w = src.width,\n h = src.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n\n blendPixelData(writer.target, src, opts)\n },\n }\n}\n\n","import type { Color32, Rect } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Fills a region or the {@link PixelData} buffer with a solid color.\n *\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param rect - A {@link Rect} defining the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n rect?: Partial<Rect>,\n): void\n/**\n * @param dst - The target {@link PixelData} to modify.\n * @param color - The {@link Color32} value to apply.\n * @param x - Starting horizontal coordinate.\n * @param y - Starting vertical coordinate.\n * @param w - Width of the fill area.\n * @param h - Height of the fill area.\n */\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function fillPixelData(\n dst: PixelData,\n color: Color32,\n _x?: Partial<Rect> | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n let x: number\n let y: number\n let w: number\n let h: number\n\n if (typeof _x === 'object') {\n x = _x.x ?? 0\n y = _x.y ?? 0\n w = _x.w ?? dst.width\n h = _x.h ?? dst.height\n } else if (typeof _x === 'number') {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n } else {\n x = 0\n y = 0\n w = dst.width\n h = dst.height\n }\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\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) {\n return\n }\n\n const dst32 = dst.data32\n const dw = dst.width\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.height && x === 0 && y === 0) {\n dst32.fill(color)\n return\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (y + iy) * dw + x\n const end = start + actualW\n dst32.fill(color, start, end)\n }\n}\n","import type { Color32, Rect } from '../../_types'\nimport { fillPixelData } from '../../PixelData/fillPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorFill(writer: PixelWriter<any>) {\n return {\n fill(\n color: Color32,\n rect: Partial<Rect> = {},\n ) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = rect\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n fillPixelData(writer.target, color, x, y, w, h)\n },\n }\n}\n","import { type PixelMutateOptions } from '../_types'\nimport type { PixelData } from './PixelData'\n\nexport function invertPixelData(\n pixelData: PixelData,\n opts: PixelMutateOptions = {},\n): void {\n const dst = pixelData\n const {\n x: targetX = 0,\n y: targetY = 0,\n\n w: width = pixelData.width,\n h: height = pixelData.height,\n mask,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\n // Destination Clipping\n if (x < 0) {\n w += x\n x = 0\n }\n if (y < 0) {\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 dw = dst.width\n const mPitch = mw ?? width\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const mStride = mPitch - actualW\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = mask[mIdx]\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n }\n dIdx++\n mIdx++\n }\n dIdx += dStride\n mIdx += mStride\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n dIdx++\n }\n dIdx += dStride\n }\n }\n}\n","import type { PixelMutateOptions } from '../../_types'\nimport { invertPixelData } from '../../PixelData/invertPixelData'\nimport { PixelWriter } from '../PixelWriter'\n\nexport function mutatorInvert(writer: PixelWriter<any>) {\n return {\n invert(opts: PixelMutateOptions = {}) {\n const {\n x = 0,\n y = 0,\n w = writer.target.width,\n h = writer.target.height,\n } = opts\n writer.accumulator.storeRegionBeforeState(x, y, w, h)\n invertPixelData(writer.target, opts)\n },\n }\n}\n","import { mutatorApplyMask } from './PixelMutator/mutatorApplyMask'\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor'\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel'\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData'\nimport { mutatorFill } from './PixelMutator/mutatorFillPixelData'\nimport { mutatorInvert } from './PixelMutator/mutatorInvert'\nimport type { PixelWriter } from './PixelWriter'\n\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n ...mutatorApplyMask(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorFill(writer),\n ...mutatorInvert(writer),\n }\n}\n","export type ReusableImageData = ReturnType<typeof makeReusableImageData>\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null\n let buffer: Uint8ClampedArray | null = null\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n const hasInstance = !!imageData\n const widthMatches = hasInstance && imageData!.width === width\n const heightMatches = hasInstance && imageData!.height === height\n\n if (!widthMatches || !heightMatches) {\n const buffer = new Uint8ClampedArray(width * height * 4)\n\n imageData = new ImageData(buffer, width, height)\n }\n\n return imageData!\n }\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 { AlphaMask } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(\n pixelData: PixelData,\n): AlphaMask {\n const {\n data32,\n width,\n height,\n } = pixelData\n const len = data32.length\n const mask = new Uint8Array(width * height) as AlphaMask\n\n for (let i = 0; i < len; i++) {\n const val = data32[i]\n\n // Extract the Alpha byte (top 8 bits in ABGR / Little-Endian)\n // Shift right by 24 moves the 4th byte to the 1st position\n mask[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import type { AlphaMask } from '../_types'\nimport { pixelDataToAlphaMask } from '../PixelData/pixelDataToAlphaMask'\n\n/**\n * Extracts the alpha channel from raw ImageData into an AlphaMask.\n * When possible use {@link pixelDataToAlphaMask} instead.\n * Repeat calls to the same data will use less memory.\n */\nexport function imageDataToAlphaMask(\n imageData: ImageData,\n): AlphaMask {\n const {\n width,\n height,\n data,\n } = imageData\n\n // Create a 32-bit view of the existing buffer\n const data32 = new Uint32Array(\n data.buffer,\n data.byteOffset,\n data.byteLength >> 2,\n )\n const len = data32.length\n const mask = new Uint8Array(width * height) as AlphaMask\n\n for (let i = 0; i < len; i++) {\n const val = data32[i]\n\n // Extract Alpha (top 8 bits in Little-Endian/ABGR)\n mask[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import { makeReusableCanvas } from '../Canvas/ReusableCanvas'\n\nconst get = makeReusableCanvas()\n\n/**\n * Converts an {@link ImageData} object into a base64-encoded Data URL string.\n *\n * @param imageData - The pixel data to be converted.\n *\n * @returns A string representing the image in `image/png` format as a\n * [Data URL](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n * @example\n * ```typescript\n * const dataUrl = imageDataToDataUrl(imageData);\n * const img = new Image();\n * img.src = dataUrl;\n * ```\n */\nexport function imageDataToDataUrl(imageData: ImageData): string {\n const { canvas, ctx } = get(imageData.width, imageData.height)\n\n ctx.putImageData(imageData, 0, 0)\n return canvas.toDataURL()\n}\n\nimageDataToDataUrl.reset = get.reset\n","import type { ImageDataLike } from '../_types'\n\n/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUInt32Array(imageData: ImageDataLike): Uint32Array {\n return new Uint32Array(\n imageData.data.buffer,\n imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2,\n )\n}\n","export function invertImageData(imageData: ImageData) {\n const data = imageData.data\n let length = data.length\n for (let i = 0; i < length; i += 4) {\n data[i] = 255 - data[i]!\n data[i + 1] = 255 - data[i + 1]!\n data[i + 2] = 255 - data[i + 2]!\n }\n return imageData\n}\n","const resample32Scratch = {\n data: null as null | Int32Array,\n width: 0,\n height: 0,\n}\n\n/**\n * @internal\n */\ntype Resample32Result = { data: Int32Array; width: number; height: number }\n\n/**\n * @internal\n */\nexport function resample32(\n srcData32: Uint32Array | Int32Array,\n srcW: number,\n srcH: number,\n factor: number,\n): Resample32Result {\n const dstW = Math.max(1, (srcW * factor) | 0)\n const dstH = Math.max(1, (srcH * factor) | 0)\n const dstData = new Int32Array(dstW * dstH)\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW\n const scaleY = srcH / dstH\n\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, (y * scaleY) | 0)\n const srcRowOffset = srcY * srcW\n const dstRowOffset = y * dstW\n\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, (x * scaleX) | 0)\n\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!\n }\n }\n\n resample32Scratch.data = dstData\n resample32Scratch.width = dstW\n resample32Scratch.height = dstH\n\n return resample32Scratch as Resample32Result\n}\n","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer)\n const { data, width, height } = resample32(src32, source.width, source.height, factor)\n\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>\n return new ImageData(uint8ClampedArray, width, height)\n}\n","import type { ImageDataLike } from '../_types'\n\n/**\n * Non destructively resizes the {@link ImageData} buffer to new dimensions, optionally\n * offsetting the original content.\n * This operation creates a new buffer. It does not scale or stretch pixels;\n * instead, it crops or pads the image based on the new dimensions and\n * provides an offset for repositioning.\n *\n * @param current The source {@link ImageDataLike} to resize.\n * @param newWidth The target width in pixels.\n * @param newHeight The target height in pixels.\n * @param offsetX The horizontal offset for placing the\n * original image within the new buffer.\n * @default 0\n * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\n * @default 0\n *\n * @returns A new {@link ImageData} instance with the specified dimensions.\n *\n * @example\n * ```typescript\n * // Centers an 80x80 image in a new 100x100 buffer\n * const resized = resizeImageData(\n * originalData,\n * 100,\n * 100,\n * 10,\n * 10\n * );\n * ```\n */\nexport function resizeImageData(\n current: ImageDataLike,\n newWidth: number,\n newHeight: number,\n offsetX = 0,\n offsetY = 0,\n): ImageData {\n const result = new ImageData(newWidth, newHeight)\n const {\n width: oldW,\n height: oldH,\n data: oldData,\n } = current\n const newData = result.data\n\n // Determine intersection of the old image (at offset) and new canvas bounds\n const x0 = Math.max(0, offsetX)\n const y0 = Math.max(0, offsetY)\n const x1 = Math.min(newWidth, offsetX + oldW)\n const y1 = Math.min(newHeight, offsetY + oldH)\n\n if (x1 <= x0 || y1 <= y0) {\n return result\n }\n\n const rowCount = y1 - y0\n const rowLen = (x1 - x0) * 4\n\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row\n const srcY = dstY - offsetY\n const srcX = x0 - offsetX\n\n const dstStart = (dstY * newWidth + x0) * 4\n const srcStart = (srcY * oldW + srcX) * 4\n\n newData.set(\n oldData.subarray(srcStart, srcStart + rowLen),\n dstStart,\n )\n }\n\n return result\n}\n","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_types'\n\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer);\n const decoder = new TextDecoder('latin1');\n const binary = decoder.decode(uint8);\n\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 { MaskType } from '../_types'\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(\n target: ImageData,\n source: ImageData,\n x: number,\n y: number,\n sx: number = 0,\n sy: number = 0,\n sw: number = source.width,\n sh: number = source.height,\n mask: Uint8Array | null = null,\n maskType: MaskType = MaskType.BINARY,\n): void {\n const dstW = target.width\n const dstH = target.height\n const dstData = target.data\n const srcW = source.width\n const srcData = source.data\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + sw)\n const y1 = Math.min(dstH, y + sh)\n\n if (x1 <= x0 || y1 <= y0) {\n return\n }\n\n const useMask = !!mask\n const rowCount = y1 - y0\n const rowLenPixels = x1 - x0\n\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row\n const srcY = sy + (dstY - y)\n const srcXBase = sx + (x0 - x)\n\n const dstStart = (dstY * dstW + x0) * 4\n const srcStart = (srcY * srcW + srcXBase) * 4\n\n if (useMask && mask) {\n for (let ix = 0; ix < rowLenPixels; ix++) {\n const mi = srcY * srcW + (srcXBase + ix)\n const alpha = mask[mi]\n\n if (alpha === 0) {\n continue\n }\n\n const di = dstStart + (ix * 4)\n const si = srcStart + (ix * 4)\n\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si]\n dstData[di + 1] = srcData[si + 1]\n dstData[di + 2] = srcData[si + 2]\n dstData[di + 3] = srcData[si + 3]\n } else {\n const a = alpha / 255\n const invA = 1 - a\n\n dstData[di] = srcData[si] * a + dstData[di] * invA\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA\n }\n }\n } else {\n const byteLen = rowLenPixels * 4\n const sub = srcData.subarray(srcStart, srcStart + byteLen)\n dstData.set(sub, dstStart)\n }\n }\n}\n","import type { Rect } from '../_types'\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param imageData - The target {@link ImageData} to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A {@link Rect} object defining the destination region.\n */\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n rect: Rect,\n): void\n/**\n * @param imageData - The target {@link ImageData} to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writeImageDataBuffer(\n imageData: ImageData,\n data: Uint8ClampedArray,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const { width: dstW, height: dstH, data: dst } = imageData\n\n // 1. Calculate the intersection of the patch and the canvas\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + w)\n const y1 = Math.min(dstH, y + h)\n\n // If the intersection is empty, do nothing\n if (x1 <= x0 || y1 <= y0) return\n\n const rowLen = (x1 - x0) * 4\n const srcCol = x0 - x\n const srcYOffset = y0 - y\n const actualH = y1 - y0\n\n for (let row = 0; row < actualH; row++) {\n // Target index\n const dstStart = ((y0 + row) * dstW + x0) * 4\n\n // Source data index (must account for the offset if the rect was partially OOB)\n const srcRow = srcYOffset + row\n const o = (srcRow * w + srcCol) * 4\n\n dst.set(data.subarray(o, o + rowLen), dstStart)\n }\n}\n","import type { Color32 } from '../_types'\n\n/**\n * Represents an image using a palette-based indexing system.\n * Instead of storing 4 bytes (RGBA) per pixel, this class stores a single index\n * into a color palette. This format is optimized for memory efficiency and\n * high-speed pattern matching or recoloring operations.\n */\nexport class IndexedImage {\n /** The width of the image in pixels. */\n public readonly width: number\n /** The height of the image in pixels. */\n public readonly height: number\n /** Flat array of palette indices. Index = x + (y * width). */\n public readonly data: Int32Array\n /** The palette of unique 32-bit colors (ABGR/RGBA packed) found in the image. */\n public readonly palette: Uint32Array\n /** The specific index in the palette reserved for fully transparent pixels. */\n public readonly transparentPalletIndex: number\n\n /**\n * @param width - Image width.\n * @param height - Image height.\n * @param data - The indexed pixel data.\n * @param palette - The array of packed colors.\n * @param transparentPalletIndex - The index representing alpha 0.\n */\n constructor(\n width: number,\n height: number,\n data: Int32Array,\n palette: Uint32Array,\n transparentPalletIndex: number,\n ) {\n this.width = width\n this.height = height\n this.data = data\n this.palette = palette\n this.transparentPalletIndex = transparentPalletIndex\n }\n\n /**\n * Creates an IndexedImage from standard browser ImageData.\n * @param imageData - The source ImageData to convert.\n * @returns A new IndexedImage instance.\n */\n static fromImageData(imageData: ImageData): IndexedImage {\n return IndexedImage.fromRaw(imageData.data, imageData.width, imageData.height)\n }\n\n /**\n * Creates an IndexedImage from a raw byte buffer and dimensions.\n * Any pixel with an alpha channel of 0 is normalized to the transparent palette index.\n * @param data - Raw RGBA byte data.\n * @param width - Image width.\n * @param height - Image height.\n * @returns A new IndexedImage instance.\n */\n static fromRaw(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n ): IndexedImage {\n const buffer = data.buffer\n const rawData = new Uint32Array(buffer)\n const indexedData = new Int32Array(rawData.length)\n const colorMap = new Map<number, number>()\n const transparentColor = 0\n const transparentPalletIndex = 0\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex)\n\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number\n const alpha = (pixel >>> 24) & 0xFF\n const isTransparent = alpha === 0\n const colorKey = isTransparent ? transparentColor : (pixel >>> 0)\n\n let id = colorMap.get(colorKey)\n\n if (id === undefined) {\n id = colorMap.size\n colorMap.set(colorKey, id)\n }\n\n indexedData[i] = id\n }\n\n const palette = Uint32Array.from(colorMap.keys())\n\n return new IndexedImage(\n width,\n height,\n indexedData,\n palette,\n transparentPalletIndex,\n )\n }\n\n /**\n * Retrieves the 32-bit packed color value at the given coordinates.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @returns The packed color from the palette.\n */\n public getColorAt(x: number, y: number): Color32 {\n const index = x + y * this.width\n const paletteIndex = this.data[index]\n\n return this.palette[paletteIndex] as Color32\n }\n}\n","import type { IndexedImage } from './IndexedImage.ts'\n\n/**\n * Calculates the frequency of each palette index based on the image data.\n * The index of the returned array maps directly to the index of the palette.\n * @param indexedImage - The source image containing data and palette definitions.\n * @returns A typed array where each entry represents the total count of that palette index.\n */\nexport function getIndexedImageColorCounts(indexedImage: IndexedImage): Int32Array {\n const data = indexedImage.data\n const palette = indexedImage.palette\n const frequencies = new Int32Array(palette.length)\n\n for (let i = 0; i < data.length; i++) {\n const colorIndex = data[i]!\n frequencies[colorIndex]++\n }\n\n return frequencies\n}\n","import type { Color32 } from '../_types'\nimport { packColor } from '../color'\nimport type { IndexedImage } from './IndexedImage'\n\n/**\n * Calculates the area-weighted average color of an IndexedImage.\n * This accounts for how often each palette index appears in the pixel data.\n * @param indexedImage - The IndexedImage containing pixel indices and the palette.\n * @param includeTransparent - Whether to include the transparent pixels in the average.\n * @returns The average RGBA color of the image.\n */\nexport function indexedImageToAverageColor(\n indexedImage: IndexedImage,\n includeTransparent: boolean = false,\n): Color32 {\n const { data, palette, transparentPalletIndex } = indexedImage\n const counts = new Uint32Array(palette.length)\n\n // Tally occurrences of each index\n for (let i = 0; i < data.length; i++) {\n const id = data[i]!\n counts[id]!++\n }\n\n let rSum = 0\n let gSum = 0\n let bSum = 0\n let aSum = 0\n let totalWeight = 0\n\n for (let id = 0; id < counts.length; id++) {\n const weight = counts[id]!\n\n if (weight === 0) {\n continue\n }\n\n if (!includeTransparent && id === transparentPalletIndex) {\n continue\n }\n\n const color = palette[id]! >>> 0;\n\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 rSum += r * weight\n gSum += g * weight\n bSum += b * weight\n aSum += a * weight\n totalWeight += weight\n }\n\n if (totalWeight === 0) {\n return packColor(0, 0, 0, 0)\n }\n\n const r = (rSum / totalWeight) | 0\n const g = (gSum / totalWeight) | 0\n const b = (bSum / totalWeight) | 0\n const a = (aSum / totalWeight) | 0\n\n return packColor(r, g, b, a)\n}\n","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { IndexedImage } from '../index'\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleIndexedImage(\n source: IndexedImage,\n factor: number,\n): IndexedImage {\n\n const { data, width, height } = resample32(\n source.data,\n source.width,\n source.height,\n factor,\n )\n\n return new IndexedImage(\n width,\n height,\n data,\n source.palette,\n source.transparentPalletIndex,\n )\n}\n","import type { IndexedImage } from './IndexedImage'\n\n/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const { width, height, data, palette } = indexedImage\n const result = new ImageData(width, height)\n const data32 = new Uint32Array(result.data.buffer)\n\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i]\n const color = palette[paletteIndex]\n\n data32[i] = color\n }\n\n return result\n}\n","import { fileToImageData } from '../../src'\n\n/**\n * A convenience wrapper that extracts the first {@link File} from an\n * {@link HTMLInputElement} change event and converts it into {@link ImageData}.\n *\n * This function handles the boilerplate of accessing the file list and checking\n * for existence. It is ideal for use directly in an `onchange` event listener.\n *\n * @param event - The change {@link Event} from an `<input type=\"file\">` element.\n *\n * @returns A promise that resolves to {@link ImageData} if a file was successfully\n * processed, or `null` if no file was selected or the input was cleared.\n *\n * @example\n * ```typescript\n * const input = document.querySelector('input[type=\"file\"]');\n *\n * input.addEventListener('change', async (event) => {\n * const imageData = await fileInputChangeToImageData(event);\n *\n * if (imageData) {\n * console.log('Image loaded:', imageData.width, imageData.height);\n * }\n * });\n * ```\n */\nexport async function fileInputChangeToImageData(\n event: Event,\n): Promise<ImageData | null> {\n const target = event.target as HTMLInputElement\n\n const file = target.files?.[0]\n if (!file) return null\n\n return await fileToImageData(file)\n}\n","import { OFFSCREEN_CANVAS_CTX_FAILED } from '../Canvas/_constants'\n\n/**\n * Thrown when the user provides a file that isn't an image.\n */\nexport class UnsupportedFormatError extends Error {\n constructor(mimeType: string) {\n super(`File type ${mimeType} is not a supported image format.`)\n this.name = 'UnsupportedFormatError'\n }\n}\n\n/**\n * Converts a browser {@link File} object into {@link ImageData}.\n * This utility handles the full pipeline of image decoding using hardware-accelerated\n * APIs {@link createImageBitmap} and {@link OffscreenCanvas}. It ensures that underlying\n * resources like `ImageBitmap` are properly closed even if the conversion fails.\n *\n * @param file - The image file to convert. Can be null or undefined.\n * @returns A `Promise` resolving to the pixel data as {@link ImageData},\n * or `null` if no file was provided.\n * @throws {@link UnsupportedFormatError}\n * Thrown if the provided file's MIME type does not start with `image/`.\n * @example\n * ```typescript\n * try {\n * const imageData = await fileToImageData(file);\n * if (imageData) {\n * console.log('Pixels:', imageData.data);\n * }\n * } catch (err) {\n * if (err instanceof UnsupportedFormatError) {\n * // Handle bad file type\n * }\n * }\n * ```\n */\nexport async function fileToImageData(\n file: File | null | undefined,\n): Promise<ImageData | null> {\n if (!file) return null\n\n if (!file.type.startsWith('image/')) {\n throw new UnsupportedFormatError(file.type)\n }\n\n let bitmap: ImageBitmap | null = null\n\n try {\n bitmap = await createImageBitmap(file)\n\n const canvas = new OffscreenCanvas(\n bitmap.width,\n bitmap.height,\n )\n\n const ctx = canvas.getContext('2d')\n if (!ctx) throw new Error(OFFSCREEN_CANVAS_CTX_FAILED)\n\n ctx.drawImage(\n bitmap,\n 0,\n 0,\n )\n\n return ctx.getImageData(\n 0,\n 0,\n bitmap.width,\n bitmap.height,\n )\n } finally {\n bitmap?.close()\n }\n}\n","// Cache the Promise to prevent race conditions during initialization\nlet formatsPromise: Promise<string[]> | null = null\n\nconst defaultRasterMimes = [\n 'image/png',\n 'image/jpeg',\n 'image/webp',\n 'image/avif',\n 'image/gif',\n 'image/bmp',\n]\n\n/**\n * Probes the browser environment to determine which image MIME types are\n * supported for pixel-level operations.\n * This function performs a one-time check by attempting to convert a\n * {@link OffscreenCanvas} to MIME types. The result is\n * cached to prevent redundant hardware-accelerated operations on\n * subsequent calls.\n * @param rasterMimes List of MIME types to check\n * @default ['image/png',\n * 'image/jpeg',\n * 'image/webp',\n * 'image/avif',\n * 'image/gif',\n * 'image/bmp']\n * @returns A `Promise` resolving to an array of supported MIME\n * types from the `rasterMimes` list.\n * @throws {Error} If the {@link OffscreenCanvas} context cannot be initialized.\n * @example\n * ```typescript\n * const supported = await getSupportedPixelFormats();\n * if (supported.includes('image/avif')) {\n * console.log('High-efficiency formats available');\n * }\n * ```\n */\nexport async function getSupportedPixelFormats(rasterMimes = defaultRasterMimes): Promise<string[]> {\n if (formatsPromise) {\n return formatsPromise\n }\n\n const probeCanvas = async () => {\n const canvas = new OffscreenCanvas(1, 1)\n\n const results = await Promise.all(\n rasterMimes.map(async (mime) => {\n try {\n const blob = await canvas.convertToBlob({\n type: mime,\n })\n\n return blob.type === mime ? mime : null\n } catch {\n return null\n }\n }),\n )\n\n return results.filter((type): type is string => {\n return type !== null\n })\n }\n\n // By chaining .catch here, the microtask guarantees formatsPromise\n // is assigned the promise BEFORE the catch block runs to reset it.\n formatsPromise = probeCanvas().catch((error) => {\n formatsPromise = null\n\n throw error\n })\n\n return formatsPromise\n}\n","import type { AnyMask } from '../index'\n\n/**\n * Creates a new copy of a mask.\n * Uses the underlying buffer's slice method for high-performance memory copying.\n */\nexport function copyMask<T extends AnyMask>(src: T): T {\n // Uint8Array.slice() is highly optimized at the engine level\n return src.slice() as T\n}\n","import type { AlphaMask, BinaryMask } from '../index'\n\n/**\n * Inverts a BinaryMask in-place.\n */\nexport function invertBinaryMask(dst: BinaryMask): void {\n const len = dst.length\n\n for (let i = 0; i < len; i++) {\n dst[i] = dst[i] === 0\n ? 1\n : 0\n }\n}\n\n/**\n * Inverts an AlphaMask in-place.\n */\nexport function invertAlphaMask(dst: AlphaMask): void {\n const len = dst.length\n\n for (let i = 0; i < len; i++) {\n dst[i] = 255 - dst[i]\n }\n}\n","import { type AlphaMask, type AnyMask, type ApplyMaskOptions, MaskType } from '../_types'\n\n/**\n * Merges a source mask into a destination AlphaMask.\n */\nexport function mergeMasks(\n dst: AlphaMask,\n dstWidth: number,\n src: AnyMask,\n opts: ApplyMaskOptions,\n): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n alpha: globalAlpha = 255,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (width <= 0 || height <= 0 || globalAlpha === 0) {\n return\n }\n\n const sPitch = mw ?? width\n const isAlpha = maskType === MaskType.ALPHA\n\n for (let iy = 0; iy < height; iy++) {\n const dy = targetY + iy\n const sy = my + iy\n\n if (dy < 0 || sy < 0) {\n continue\n }\n\n for (let ix = 0; ix < width; ix++) {\n const dx = targetX + ix\n const sx = mx + ix\n\n if (dx < 0 || dx >= dstWidth || sx < 0 || sx >= sPitch) {\n continue\n }\n\n const dIdx = dy * dstWidth + dx\n const sIdx = sy * sPitch + sx\n const mVal = src[sIdx]\n let weight = globalAlpha\n\n if (isAlpha) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n if (effectiveM === 0) {\n dst[dIdx] = 0\n continue\n }\n\n weight = globalAlpha === 255\n ? effectiveM\n : (effectiveM * globalAlpha + 128) >> 8\n } else {\n // Strict Binary 1/0 Logic\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dst[dIdx] = 0\n continue\n }\n\n // If binary hit, weight is just the global alpha\n weight = globalAlpha\n }\n\n if (weight === 0) {\n dst[dIdx] = 0\n continue\n }\n\n const da = dst[dIdx]\n\n if (da === 0) {\n // Already transparent\n } else if (weight === 255) {\n // Identity: keep da\n } else if (da === 255) {\n // Identity: result is weight\n dst[dIdx] = weight\n } else {\n dst[dIdx] = (da * weight + 128) >> 8\n }\n }\n }\n}\n","import { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array'\n\nexport class PixelData {\n public data32: Uint32Array\n public imageData!: ImageData\n\n get width(): number {\n return this.imageData.width\n }\n\n get height(): number {\n return this.imageData.height\n }\n\n constructor(imageData: ImageData) {\n this.data32 = imageDataToUInt32Array(imageData)\n this.imageData = imageData\n }\n\n set(imageData: ImageData): void {\n this.imageData = imageData\n this.data32 = imageDataToUInt32Array(imageData)\n }\n\n /**\n * Creates a deep copy of the PixelData using the environment's ImageData constructor.\n */\n copy(): PixelData {\n const buffer = new Uint8ClampedArray(this.imageData.data)\n\n // Fallback to the object's own constructor if the global ImageData is missing (Node tests)\n const ImageConstructor = (typeof ImageData !== 'undefined'\n ? ImageData\n : (this.imageData.constructor as typeof ImageData))\n\n const newImageData = new ImageConstructor(\n buffer,\n this.width,\n this.height,\n )\n\n return new PixelData(newImageData)\n }\n}\n","import type { BlendColor32, Color32 } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { PixelData } from './PixelData'\n\n/**\n * Applies a circular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushSize The diameter of the brush.\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @default sourceOverPerfect\n */\nexport function applyCircleBrushToPixelData(\n target: PixelData,\n color: Color32,\n centerX: number,\n centerY: number,\n brushSize: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn: BlendColor32 = sourceOverPerfect,\n): void {\n const r = brushSize / 2\n const rSqr = r * r\n const centerOffset = (brushSize % 2 === 0) ? 0.5 : 0\n\n const xStart = Math.max(0, Math.ceil(centerX - r))\n const xEnd = Math.min(target.width - 1, Math.floor(centerX + r))\n const yStart = Math.max(0, Math.ceil(centerY - r))\n const yEnd = Math.min(target.height - 1, Math.floor(centerY + r))\n\n const data32 = target.data32\n const targetWidth = target.width\n const baseColor = color & 0x00ffffff\n const invR = 1 / r\n\n // Pre-calculate the constant source for cases where fallOff is null\n const constantSrc = ((alpha << 24) | baseColor) >>> 0 as Color32\n\n for (let cy = yStart; cy <= yEnd; cy++) {\n const dy = cy - centerY + centerOffset\n const dySqr = dy * dy\n const rowOffset = cy * targetWidth\n\n for (let cx = xStart; cx <= xEnd; cx++) {\n const dx = cx - centerX + centerOffset\n const dSqr = dx * dx + dySqr\n\n if (dSqr <= rSqr) {\n const idx = rowOffset + cx\n\n if (fallOff) {\n const strength = fallOff(Math.sqrt(dSqr) * invR)\n const fAlpha = (alpha * strength) & 0xFF\n const src = ((fAlpha << 24) | baseColor) >>> 0 as Color32\n data32[idx] = blendFn(src, data32[idx] as Color32)\n } else {\n data32[idx] = blendFn(constantSrc, data32[idx] as Color32)\n }\n }\n }\n }\n}\n","import type { BlendColor32, Color32, Rect } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport { PixelData } from './PixelData'\n\n/**\n * Applies a rectangular brush to pixel data, blending a color with optional falloff.\n *\n * @param target The PixelData to modify.\n * @param color The brush color.\n * @param centerX The center x-coordinate of the brush.\n * @param centerY The center y-coordinate of the brush.\n * @param brushWidth\n * @param brushHeight\n * @param alpha The overall opacity of the brush (0-255).\n * @default 255\n * @param fallOff A function that returns an alpha multiplier (0-1) based on the normalized distance (0-1) from the circle's center.\n * @param blendFn\n * @default sourceOverPerfect\n */\nexport function applyRectBrushToPixelData(\n target: PixelData,\n color: Color32,\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n alpha = 255,\n fallOff?: (dist: number) => number,\n blendFn: BlendColor32 = sourceOverPerfect,\n): void {\n const targetWidth = target.width\n const targetHeight = target.height\n const data32 = target.data32\n\n const rawStartX = Math.floor(centerX - brushWidth / 2)\n const rawStartY = Math.floor(centerY - brushHeight / 2)\n const endX = Math.min(targetWidth, rawStartX + brushWidth)\n const endY = Math.min(targetHeight, rawStartY + brushHeight)\n const startX = Math.max(0, rawStartX)\n const startY = Math.max(0, rawStartY)\n\n const baseColor = color & 0x00ffffff\n const constantSrc = ((alpha << 24) | baseColor) >>> 0 as Color32\n const invHalfW = 1 / (brushWidth / 2)\n const invHalfH = 1 / (brushHeight / 2)\n\n for (let py = startY; py < endY; py++) {\n const rowOffset = py * targetWidth\n const dy = Math.abs(py + 0.5 - centerY) * invHalfH\n\n for (let px = startX; px < endX; px++) {\n if (fallOff) {\n const dx = Math.abs(px + 0.5 - centerX) * invHalfW\n const dist = dx > dy ? dx : dy\n const fAlpha = (alpha * fallOff(dist)) | 0\n const src = ((fAlpha << 24) | baseColor) >>> 0 as Color32\n data32[rowOffset + px] = blendFn(src, data32[rowOffset + px] as Color32)\n } else {\n data32[rowOffset + px] = blendFn(constantSrc, data32[rowOffset + px] as Color32)\n }\n }\n }\n}\n\nexport function getRectBrushBounds(\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n targetWidth?: number,\n targetHeight?: number,\n): Rect {\n\n const rawStartX = Math.floor(centerX - brushWidth / 2)\n const rawStartY = Math.floor(centerY - brushHeight / 2)\n\n const rawEndX = rawStartX + brushWidth\n const rawEndY = rawStartY + brushHeight\n\n const startX = targetWidth !== undefined\n ? Math.max(0, rawStartX)\n : rawStartX\n\n const startY = targetHeight !== undefined\n ? Math.max(0, rawStartY)\n : rawStartY\n\n const endX = targetWidth !== undefined\n ? Math.min(targetWidth, rawEndX)\n : rawEndX\n\n const endY = targetHeight !== undefined\n ? Math.min(targetHeight, rawEndY)\n : rawEndY\n\n return {\n x: startX,\n y: startY,\n w: endX - startX,\n h: endY - startY,\n }\n}\n","import type { Color32, Rect } from '../_types'\nimport type { PixelData } from './PixelData'\nimport { fillPixelData } from './fillPixelData'\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelData.\n */\nexport function clearPixelData(\n dst: PixelData,\n rect?: Partial<Rect>,\n): void {\n fillPixelData(dst, 0 as Color32, rect)\n}\n","import type { Rect } from '../_types'\nimport type { PixelData } from './PixelData'\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: PixelData, rect: Rect): Uint32Array\nexport function extractPixelDataBuffer(source: PixelData, x: number, y: number, w: number, h: number): Uint32Array\nexport function extractPixelDataBuffer(\n source: PixelData,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): Uint32Array {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const srcW = source.width\n const srcH = source.height\n const srcData = source.data32\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0)\n }\n\n // Create a new ImageData to get a clean, aligned buffer\n const dstImageData = new ImageData(w, h)\n const dstData = new Uint32Array(dstImageData.data.buffer)\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 // Return empty buffer if no intersection\n if (x1 <= x0 || y1 <= y0) {\n return dstData\n }\n\n const copyWidth = x1 - x0\n const copyHeight = y1 - y0\n\n for (let row = 0; row < copyHeight; row++) {\n const srcRow = y0 + row\n const srcStart = srcRow * srcW + x0\n\n const dstRow = (y0 - y) + row\n const dstCol = (x0 - x)\n const dstStart = dstRow * w + dstCol\n\n // Perform the high-speed 32-bit bulk copy\n const chunk = srcData.subarray(srcStart, srcStart + copyWidth)\n dstData.set(chunk, dstStart)\n }\n\n return dstData\n}\n","import type { Rect } from '../_types'\nimport { extractPixelDataBuffer } from './extractPixelDataBuffer'\nimport { PixelData } from './PixelData'\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: PixelData, rect: Rect): PixelData\nexport function extractPixelData(source: PixelData, x: number, y: number, w: number, h: number): PixelData\nexport function extractPixelData(\n source: PixelData,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): PixelData {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const result = new PixelData(new ImageData(w, h))\n\n const buffer = extractPixelDataBuffer(source, x, y, w, h)\n result.data32.set(buffer)\n\n return result\n}\n","import type { PixelData } from './PixelData'\n\nexport function reflectPixelDataHorizontal(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n const halfWidth = Math.floor(width / 2)\n\n for (let y = 0; y < height; y++) {\n const rowOffset = y * width\n\n for (let x = 0; x < halfWidth; x++) {\n const leftIdx = rowOffset + x\n const rightIdx = rowOffset + (width - 1 - x)\n const temp = data[leftIdx]\n\n data[leftIdx] = data[rightIdx]\n data[rightIdx] = temp\n }\n }\n}\n\nexport function reflectPixelDataVertical(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n const halfHeight = Math.floor(height / 2)\n\n for (let y = 0; y < halfHeight; y++) {\n const topRowOffset = y * width\n const bottomRowOffset = (height - 1 - y) * width\n\n for (let x = 0; x < width; x++) {\n const topIdx = topRowOffset + x\n const bottomIdx = bottomRowOffset + x\n const temp = data[topIdx]\n\n data[topIdx] = data[bottomIdx]\n data[bottomIdx] = temp\n }\n }\n}\n","/**\n * Resamples an PixelData by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { PixelData } from '../index'\nimport { resample32 } from '../Internal/resample32'\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(\n pixelData: PixelData,\n factor: number,\n): PixelData {\n const { data, width, height } = resample32(pixelData.data32, pixelData.width, pixelData.height, factor)\n\n return new PixelData(new ImageData(\n new Uint8ClampedArray(data.buffer) as ImageDataArray,\n width,\n height,\n ))\n}\n","import { PixelData } from './PixelData'\n\n/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.width\n const height = pixelData.height\n const data = pixelData.data32\n\n if (width === height) {\n rotateSquareInPlace(pixelData)\n return\n }\n\n const newWidth = height\n const newHeight = width\n const newData32 = new Uint32Array(data.length)\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const oldIdx = y * width + x\n const newX = height - 1 - y\n const newY = x\n const newIdx = newY * newWidth + newX\n\n newData32[newIdx] = data[oldIdx]\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(\n new Uint8ClampedArray(newData32.buffer),\n newWidth,\n newHeight,\n )\n\n pixelData.set(newImageData)\n}\n\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.width\n const data = pixelData.data32\n\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j\n const right = j * n + (n - 1 - i)\n const bottom = (n - 1 - i) * n + (n - 1 - j)\n const left = (n - 1 - j) * n + i\n\n const temp = data[top]\n data[top] = data[left]\n data[left] = data[bottom]\n data[bottom] = data[right]\n data[right] = temp\n }\n }\n}\n","import type { PixelData } from './PixelData'\nimport { type Rect } from '../_types'\n\n/**\n * Copies a pixel buffer into a specific region of a {@link PixelData} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target {@link PixelData} buffer.\n */\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n rect: Rect,\n): void\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writePixelDataBuffer(\n target: PixelData,\n data: Uint32Array,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!,\n }\n\n const dstW = target.width\n const dstH = target.height\n const dstData = target.data32\n\n const x0 = Math.max(0, x)\n const y0 = Math.max(0, y)\n const x1 = Math.min(dstW, x + w)\n const y1 = Math.min(dstH, y + h)\n\n if (x1 <= x0 || y1 <= y0) {\n return\n }\n\n const rowLen = x1 - x0\n const srcCol = x0 - x\n const srcYOffset = y0 - y\n const actualH = y1 - y0\n\n for (let row = 0; row < actualH; row++) {\n const dstStart = (y0 + row) * dstW + x0\n const srcRow = srcYOffset + row\n const srcStart = srcRow * w + srcCol\n\n dstData.set(data.subarray(srcStart, srcStart + rowLen), dstStart)\n }\n}\n"],"mappings":"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","names":["MaskType","get","buffer","r","g","b","a"]}
|