pixel-data-js 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/blend-modes-fast.ts","../src/_types.ts","../src/color.ts","../src/ImageData/extractImageDataPixels.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/ImageData/copyImageData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/ImageData/imageDataToAlphaMask.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/invertImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/writeImageDataPixels.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/getIndexedImageColorCounts.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/applyMaskToPixelData.ts","../src/PixelData/blendColorPixelData.ts","../src/PixelData/blendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/invertPixelData.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/rotatePixelData.ts"],"sourcesContent":["export * from './_types'\nexport * from './color'\n\nexport * from './Algorithm/floodFillSelection'\n\nexport {\n BlendMode,\n type BlendModeIndex,\n} from './BlendModes/blend-modes'\nexport {\n type BlendToIndexGetter,\n type IndexToBlendGetter,\n} from './BlendModes/blend-mode-getters'\n\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 './ImageData/copyImageData'\nexport * from './ImageData/extractImageDataPixels'\nexport * from './ImageData/imageDataToAlphaMask'\nexport * from './ImageData/imageDataToDataUrl'\nexport * from './ImageData/imageDataToImgBlob'\nexport * from './ImageData/imgBlobToImageData'\nexport * from './ImageData/invertImageData'\nexport * from './ImageData/resizeImageData'\nexport * from './ImageData/serialization'\nexport * from './ImageData/writeImageDataPixels'\n\nexport * from './IndexedImage/IndexedImage'\nexport * from './IndexedImage/indexedImageToAverageColor'\nexport * from './IndexedImage/getIndexedImageColorCounts'\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/applyMaskToPixelData'\nexport * from './PixelData/blendColorPixelData'\nexport * from './PixelData/blendPixelData'\nexport * from './PixelData/clearPixelData'\nexport * from './PixelData/fillPixelData'\nexport * from './PixelData/invertPixelData'\nexport * from './PixelData/pixelDataToAlphaMask'\nexport * from './PixelData/reflectPixelData'\nexport * from './PixelData/rotatePixelData'\n\nexport * from './Rect/trimRectBounds'\n","// The enum index IS the permanent ID.\n// do not change the order, Adding to it is ok.\nexport enum BlendMode {\n overwrite,\n sourceOver,\n\n darken,\n multiply,\n colorBurn,\n linearBurn,\n darkerColor,\n\n lighten,\n screen,\n colorDodge,\n linearDodge,\n lighterColor,\n\n overlay,\n softLight,\n hardLight,\n vividLight,\n linearLight,\n pinLight,\n hardMix,\n\n difference,\n exclusion,\n subtract,\n divide,\n}\n\nexport type BlendModeIndex = typeof BlendMode[keyof typeof BlendMode];\n\n","import type { BlendColor32, Color32 } from '../_types'\nimport type { BaseBlendToIndexGetter, BaseIndexToBlendGetter } from './blend-mode-getters'\nimport { BlendMode, type BlendModeIndex } from './blend-modes'\n\nexport const overwriteFast: BlendColor32 = (src, _dst) => src\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 FAST_BLENDER_REGISTRY = [\n [BlendMode.overwrite, overwriteFast],\n [BlendMode.sourceOver, sourceOverFast],\n\n [BlendMode.darken, darkenFast],\n [BlendMode.multiply, multiplyFast],\n [BlendMode.colorBurn, colorBurnFast],\n [BlendMode.linearBurn, linearBurnFast],\n [BlendMode.darkerColor, darkerFast],\n\n [BlendMode.lighten, lightenFast],\n [BlendMode.screen, screenFast],\n [BlendMode.colorDodge, colorDodgeFast],\n [BlendMode.linearDodge, linearDodgeFast],\n [BlendMode.lighterColor, lighterFast],\n\n [BlendMode.overlay, overlayFast],\n [BlendMode.softLight, softLightFast],\n [BlendMode.hardLight, hardLightFast],\n [BlendMode.vividLight, vividLightFast],\n [BlendMode.linearLight, linearLightFast],\n [BlendMode.pinLight, pinLightFast],\n [BlendMode.hardMix, hardMixFast],\n\n [BlendMode.difference, differenceFast],\n [BlendMode.exclusion, exclusionFast],\n [BlendMode.subtract, subtractFast],\n [BlendMode.divide, divideFast],\n] as const\n\nexport type RegisteredFastBlender = typeof FAST_BLENDER_REGISTRY[number][1]\n\nexport const FAST_BLEND_MODES: BlendColor32[] = []\n\nfor (const [index, blend] of FAST_BLENDER_REGISTRY) {\n FAST_BLEND_MODES[index as BlendModeIndex] = blend\n}\n\nexport const FAST_BLEND_TO_INDEX = new Map<RegisteredFastBlender, BlendModeIndex>(\n FAST_BLENDER_REGISTRY.map((entry, index) => {\n return [\n entry[1],\n index as BlendModeIndex,\n ]\n }),\n) as BaseBlendToIndexGetter<RegisteredFastBlender>\n\nexport const INDEX_TO_FAST_BLEND = new Map<BlendModeIndex, RegisteredFastBlender>(\n FAST_BLENDER_REGISTRY.map((entry, index) => {\n return [\n index as BlendModeIndex,\n entry[1],\n ]\n }),\n) as BaseIndexToBlendGetter<RegisteredFastBlender>\n\nexport type FastBlendModes = {\n [K in keyof typeof BlendMode]: RegisteredFastBlender\n}\n\nexport const FAST_BLEND_MODE_BY_NAME: FastBlendModes = {\n overwrite: overwriteFast,\n sourceOver: sourceOverFast,\n darken: darkenFast,\n multiply: multiplyFast,\n colorBurn: colorBurnFast,\n linearBurn: linearBurnFast,\n darkerColor: darkerFast,\n lighten: lightenFast,\n screen: screenFast,\n colorDodge: colorDodgeFast,\n linearDodge: linearDodgeFast,\n lighterColor: lighterFast,\n overlay: overlayFast,\n softLight: softLightFast,\n hardLight: hardLightFast,\n vividLight: vividLightFast,\n linearLight: linearLightFast,\n pinLight: pinLightFast,\n hardMix: hardMixFast,\n difference: differenceFast,\n exclusion: exclusionFast,\n subtract: subtractFast,\n divide: divideFast,\n} as const\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 = (src: Color32, dst: Color32) => Color32\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 PixelOptions {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number\n /**\n * The width of the region to process.\n * @default Source width.\n */\n w?: number\n /**\n * The height of the region to process.\n * @default Source height.\n */\n h?: number\n\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number\n\n /**\n * Mask width.\n * @default 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 /** 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.BINARY}\n */\n maskType?: MaskType\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 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\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 extractImageDataPixels(\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 extractImageDataPixels(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8ClampedArray\nexport function extractImageDataPixels(\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 { extractImageDataPixels } from '../ImageData/extractImageDataPixels'\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 = extractImageDataPixels(\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 type { BaseBlendToIndexGetter, BaseIndexToBlendGetter } from './blend-mode-getters'\nimport { BlendMode, type BlendModeIndex } from './blend-modes'\n\nexport const overwritePerfect: BlendColor32 = (src, _dst) => src\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 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) / 255 | 0\n const g = (sg * sa + dg * invA) / 255 | 0\n const b = (sb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 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 / 255) | 0\n const bg = (sg * dg / 255) | 0\n const bb = (sb * 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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 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 === 255 ? 255 : sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / sr) | 0)))\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / sg) | 0)))\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / sb) | 0)))\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) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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, 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 * 255 / (255 - sr)) | 0))\n const bg = sg === 255 ? 255 : Math.min(255, ((dg * 255 / (255 - sg)) | 0))\n const bb = sb === 255 ? 255 : Math.min(255, ((db * 255 / (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) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 const br = (((255 - dr) * ((sr * dr / 255) | 0) + dr * (255 - (((255 - sr) * (255 - dr) / 255) | 0))) / 255) | 0\n const bg = (((255 - dg) * ((sg * dg / 255) | 0) + dg * (255 - (((255 - sg) * (255 - dg) / 255) | 0))) / 255) | 0\n const bb = (((255 - db) * ((sb * db / 255) | 0) + db * (255 - (((255 - sb) * (255 - db) / 255) | 0))) / 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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 const r = (br * sa + dr * invA + 128) / 255 | 0\n const g = (bg * sa + dg * invA + 128) / 255 | 0\n const b = (bb * sa + db * invA + 128) / 255 | 0\n const a = (255 * sa + da * invA + 128) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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\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 = Math.abs(dr - sr)\n const bg = Math.abs(dg - sg)\n const bb = Math.abs(db - sb)\n\n if (sa === 255) {\n return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n }\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n const r = (br * sa + dr * invA + 128) / 255 | 0\n const g = (bg * sa + dg * invA + 128) / 255 | 0\n const b = (bb * sa + db * invA + 128) / 255 | 0\n const a = (255 * sa + da * invA + 128) / 255 | 0\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 // Using >> 7 (divide by 128) instead of / 255\n // This is equivalent to (2 * s * d) / 256\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) {\n return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n }\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n const r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const PERFECT_BLENDER_REGISTRY = [\n [BlendMode.overwrite, overwritePerfect],\n [BlendMode.sourceOver, sourceOverPerfect],\n\n [BlendMode.darken, darkenPerfect],\n [BlendMode.multiply, multiplyPerfect],\n [BlendMode.colorBurn, colorBurnPerfect],\n [BlendMode.linearBurn, linearBurnPerfect],\n [BlendMode.darkerColor, darkerPerfect],\n\n [BlendMode.lighten, lightenPerfect],\n [BlendMode.screen, screenPerfect],\n [BlendMode.colorDodge, colorDodgePerfect],\n [BlendMode.linearDodge, linearDodgePerfect],\n [BlendMode.lighterColor, lighterPerfect],\n\n [BlendMode.overlay, overlayPerfect],\n [BlendMode.softLight, softLightPerfect],\n [BlendMode.hardLight, hardLightPerfect],\n [BlendMode.vividLight, vividLightPerfect],\n [BlendMode.linearLight, linearLightPerfect],\n [BlendMode.pinLight, pinLightPerfect],\n [BlendMode.hardMix, hardMixPerfect],\n\n [BlendMode.difference, differencePerfect],\n [BlendMode.exclusion, exclusionPerfect],\n [BlendMode.subtract, subtractPerfect],\n [BlendMode.divide, dividePerfect],\n] as const\n\nexport type RegisteredPerfectBlender = typeof PERFECT_BLENDER_REGISTRY[number][1]\n\nexport const PERFECT_BLEND_MODES: BlendColor32[] = []\nfor (const [index, blend] of PERFECT_BLENDER_REGISTRY) {\n PERFECT_BLEND_MODES[index as BlendModeIndex] = blend\n}\n\nexport const PERFECT_BLEND_TO_INDEX = new Map(\n PERFECT_BLENDER_REGISTRY.map((entry, index) => {\n return [\n entry[1],\n index as BlendModeIndex,\n ]\n }),\n) as BaseBlendToIndexGetter<RegisteredPerfectBlender>\n\nexport const INDEX_TO_PERFECT_BLEND = new Map(\n PERFECT_BLENDER_REGISTRY.map((entry, index) => {\n return [\n index as BlendModeIndex,\n entry[1],\n ]\n }),\n) as BaseIndexToBlendGetter<RegisteredPerfectBlender>\n\nexport type PerfectBlendModes = {\n [K in keyof typeof BlendMode]: RegisteredPerfectBlender\n}\n\nexport const PERFECT_BLEND_MODE_BY_NAME: PerfectBlendModes = {\n overwrite: overwritePerfect,\n sourceOver: sourceOverPerfect,\n darken: darkenPerfect,\n multiply: multiplyPerfect,\n colorBurn: colorBurnPerfect,\n linearBurn: linearBurnPerfect,\n darkerColor: darkerPerfect,\n lighten: lightenPerfect,\n screen: screenPerfect,\n colorDodge: colorDodgePerfect,\n linearDodge: linearDodgePerfect,\n lighterColor: lighterPerfect,\n overlay: overlayPerfect,\n softLight: softLightPerfect,\n hardLight: hardLightPerfect,\n vividLight: vividLightPerfect,\n linearLight: linearLightPerfect,\n pinLight: pinLightPerfect,\n hardMix: hardMixPerfect,\n difference: differencePerfect,\n exclusion: exclusionPerfect,\n subtract: subtractPerfect,\n divide: dividePerfect,\n} as const\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 { 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","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","/**\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 ImageData} 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: ImageData,\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 binary = String.fromCharCode(...new Uint8Array(buffer))\n return btoa(binary) as Base64EncodedUInt8Array\n}\n\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded)\n const bytes = new Uint8ClampedArray(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer),\n }\n}\n\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any\n\n return serializeImageData(imageData) as any\n}\n\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array),\n }\n}\n\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any\n}\n\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any\n return deserializeImageData(serialized) as any\n}\n","import type { 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 writeImageDataPixels(\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 writeImageDataPixels(\n imageData: ImageData,\n data: Uint8ClampedArray,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writeImageDataPixels(\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","/**\n * Compressed data format for image processing optimization.\n * Representing an image as a grid of palette indices rather than raw RGBA values\n * significantly reduces memory overhead and optimizes pattern matching logic.\n */\nexport type IndexedImage = {\n /** The width of the image in pixels. */\n width: number;\n /** The height of the image in pixels. */\n height: number;\n /**\n * A flat array of indices where each value points to a color in the palette.\n * Accessible via the formula: `index = x + (y * width)`.\n */\n data: Int32Array;\n /**\n * A palette of packed 32-bit colors (ABGR).\n */\n palette: Int32Array;\n /**\n * The specific index in the palette that represents a fully transparent pixel.\n */\n transparentPalletIndex: number;\n};\n\n/**\n * Converts standard ImageData into an IndexedImage format.\n */\n/**\n * Converts standard ImageData into an IndexedImage format.\n */\nexport function makeIndexedImage(imageData: ImageData): IndexedImage {\n const width = imageData.width\n const height = imageData.height\n\n // Use a 32-bit view to read pixels as packed integers (usually ABGR or RGBA)\n const rawData = new Uint32Array(imageData.data.buffer)\n const indexedData = new Int32Array(rawData.length)\n const colorMap = new Map<number, number>()\n\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]!\n\n // Check if the pixel is fully transparent\n const alpha = (pixel >>> 24) & 0xFF\n const isTransparent = alpha === 0\n const colorKey = isTransparent ? transparentColor : pixel\n\n let id = colorMap.get(colorKey)\n\n if (id === undefined) {\n // Use the current length as the next ID to ensure sequence\n id = colorMap.size\n colorMap.set(colorKey, id)\n }\n\n indexedData[i] = id\n }\n\n const palette = new Int32Array(colorMap.keys())\n return {\n width,\n height,\n data: indexedData,\n transparentPalletIndex,\n palette,\n }\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","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 { 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 type { ImageDataLike } from '../_types'\n\nexport class PixelData {\n public data32: Uint32Array\n public width: number\n public height: number\n\n constructor(public readonly imageData: ImageDataLike) {\n this.width = imageData.width\n this.height = imageData.height\n\n // Create the view once.\n this.data32 = 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\n copy(): PixelData {\n const buffer = new Uint8ClampedArray(this.data32.buffer.slice(0))\n const imageData = {\n data: buffer,\n width: this.width,\n height: this.height,\n }\n\n return new PixelData(imageData)\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 Color32, type ColorBlendOptions, MaskType } from '../_types'\nimport { BlendMode } from '../BlendModes/blend-modes'\nimport { FAST_BLEND_MODES } 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): 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 blendFn = FAST_BLEND_MODES[BlendMode.sourceOver],\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 w = width\n let h = height\n\n // 1. 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 // Pre-calculate the source color with global alpha\n const baseSrcColor = color\n const baseSrcAlpha = (baseSrcColor >>> 24)\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n\n // Early exit if source pixel is already transparent\n if (baseSrcAlpha === 0) {\n dIdx++\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 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 (weight === 0) {\n dIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcAlpha = baseSrcAlpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (currentSrcAlpha === 0) {\n dIdx++\n 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 mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import { type Color32, MaskType, type PixelBlendOptions } from '../_types'\nimport { BlendMode } from '../BlendModes/blend-modes'\nimport { FAST_BLEND_MODES } 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 = FAST_BLEND_MODES[BlendMode.sourceOver],\n mask,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (globalAlpha === 0) return\n\n let x = targetX\n let y = targetY\n let sx = sourceX\n let sy = sourceY\n let w = width\n let h = height\n\n // 1. Source Clipping\n if (sx < 0) {\n x -= sx\n w += sx\n sx = 0\n }\n if (sy < 0) {\n y -= sy\n h += sy\n sy = 0\n }\n w = Math.min(w, src.width - sx)\n h = Math.min(h, src.height - sy)\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x\n w += x\n x = 0\n }\n if (y < 0) {\n sy -= y\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0) return\n\n const dst32 = dst.data32\n const src32 = src.data32\n const dw = dst.width\n const sw = src.width\n const mPitch = mw ?? width\n const isAlphaMask = maskType === MaskType.ALPHA\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let sIdx = sy * sw + sx\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const sStride = sw - actualW\n const mStride = mPitch - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const baseSrcColor = src32[sIdx] as Color32\n const baseSrcAlpha = (baseSrcColor >>> 24)\n\n // Early exit if source pixel is already transparent\n if (baseSrcAlpha === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n let weight = globalAlpha\n\n if (mask) {\n const mVal = mask[mIdx]\n\n if (isAlphaMask) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // If mask is transparent, skip\n if (effectiveM === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n // globalAlpha is not a factor\n if (globalAlpha === 255) {\n weight = effectiveM\n // mask is not a factor\n } else if (effectiveM === 255) {\n weight = globalAlpha\n } else {\n // use rounding-corrected multiplication\n weight = (effectiveM * globalAlpha + 128) >> 8\n }\n } else {\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // Final safety check for weight (can be 0 if globalAlpha or alphaMask rounds down)\n if (weight === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcAlpha = baseSrcAlpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (currentSrcAlpha === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n currentSrcColor = ((baseSrcColor & 0x00ffffff) | (currentSrcAlpha << 24)) >>> 0 as Color32\n }\n\n dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx] as Color32)\n\n dIdx++\n sIdx++\n mIdx++\n }\n\n dIdx += dStride\n sIdx += sStride\n mIdx += mStride\n }\n}\n","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 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 { PixelData } from './PixelData'\n\nexport function invertPixelData(\n pixelData: PixelData,\n): PixelData {\n\n const data32 = pixelData.data32\n const len = data32.length\n\n for (let i = 0; i < len; i++) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n data32[i] = data32[i] ^ 0x00FFFFFF\n }\n\n return pixelData\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","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 returns a new Uint32Array and updates dimensions.\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 newData = 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 newData[newIdx] = data[oldIdx]\n }\n }\n\n pixelData.width = newWidth\n pixelData.height = newHeight\n pixelData.data32 = newData\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 temp = data[i * n + 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 data[top] = data[left]\n data[left] = data[bottom]\n data[bottom] = data[right]\n data[right] = temp\n }\n }\n}\n"],"mappings":"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","names":["BlendMode","MaskType","get","r","g","b","a"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/blend-modes-fast.ts","../src/_types.ts","../src/color.ts","../src/ImageData/extractImageDataPixels.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/ImageData/copyImageData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/ImageData/imageDataToAlphaMask.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/invertImageData.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/resizeImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/writeImageDataPixels.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/resampleIndexedImage.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/applyMaskToPixelData.ts","../src/PixelData/blendColorPixelData.ts","../src/PixelData/blendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/PixelData/clearPixelData.ts","../src/PixelData/invertPixelData.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts"],"sourcesContent":["export * from './_types'\nexport * from './color'\n\nexport * from './Algorithm/floodFillSelection'\n\nexport {\n BlendMode,\n type BlendModeIndex,\n} from './BlendModes/blend-modes'\nexport {\n type BlendToIndexGetter,\n type IndexToBlendGetter,\n} from './BlendModes/blend-mode-getters'\n\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 './ImageData/copyImageData'\nexport * from './ImageData/extractImageDataPixels'\nexport * from './ImageData/imageDataToAlphaMask'\nexport * from './ImageData/imageDataToDataUrl'\nexport * from './ImageData/imageDataToImgBlob'\nexport * from './ImageData/imgBlobToImageData'\nexport * from './ImageData/invertImageData'\nexport * from './ImageData/resampleImageData'\nexport * from './ImageData/resizeImageData'\nexport * from './ImageData/serialization'\nexport * from './ImageData/writeImageDataPixels'\n\nexport * from './IndexedImage/IndexedImage'\nexport * from './IndexedImage/getIndexedImageColorCounts'\nexport * from './IndexedImage/indexedImageToAverageColor'\nexport * from './IndexedImage/resampleIndexedImage'\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/applyMaskToPixelData'\nexport * from './PixelData/blendColorPixelData'\nexport * from './PixelData/blendPixelData'\nexport * from './PixelData/clearPixelData'\nexport * from './PixelData/fillPixelData'\nexport * from './PixelData/invertPixelData'\nexport * from './PixelData/pixelDataToAlphaMask'\nexport * from './PixelData/reflectPixelData'\nexport * from './PixelData/resamplePixelData'\nexport * from './PixelData/rotatePixelData'\n\nexport * from './Rect/trimRectBounds'\n","// The enum index IS the permanent ID.\n// do not change the order, Adding to it is ok.\nexport enum BlendMode {\n overwrite,\n sourceOver,\n\n darken,\n multiply,\n colorBurn,\n linearBurn,\n darkerColor,\n\n lighten,\n screen,\n colorDodge,\n linearDodge,\n lighterColor,\n\n overlay,\n softLight,\n hardLight,\n vividLight,\n linearLight,\n pinLight,\n hardMix,\n\n difference,\n exclusion,\n subtract,\n divide,\n}\n\nexport type BlendModeIndex = typeof BlendMode[keyof typeof BlendMode];\n\n","import type { BlendColor32, Color32 } from '../_types'\nimport type { BaseBlendToIndexGetter, BaseIndexToBlendGetter } from './blend-mode-getters'\nimport { BlendMode, type BlendModeIndex } from './blend-modes'\n\nexport const overwriteFast: BlendColor32 = (src, _dst) => src\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 FAST_BLENDER_REGISTRY = [\n [BlendMode.overwrite, overwriteFast],\n [BlendMode.sourceOver, sourceOverFast],\n\n [BlendMode.darken, darkenFast],\n [BlendMode.multiply, multiplyFast],\n [BlendMode.colorBurn, colorBurnFast],\n [BlendMode.linearBurn, linearBurnFast],\n [BlendMode.darkerColor, darkerFast],\n\n [BlendMode.lighten, lightenFast],\n [BlendMode.screen, screenFast],\n [BlendMode.colorDodge, colorDodgeFast],\n [BlendMode.linearDodge, linearDodgeFast],\n [BlendMode.lighterColor, lighterFast],\n\n [BlendMode.overlay, overlayFast],\n [BlendMode.softLight, softLightFast],\n [BlendMode.hardLight, hardLightFast],\n [BlendMode.vividLight, vividLightFast],\n [BlendMode.linearLight, linearLightFast],\n [BlendMode.pinLight, pinLightFast],\n [BlendMode.hardMix, hardMixFast],\n\n [BlendMode.difference, differenceFast],\n [BlendMode.exclusion, exclusionFast],\n [BlendMode.subtract, subtractFast],\n [BlendMode.divide, divideFast],\n] as const\n\nexport type RegisteredFastBlender = typeof FAST_BLENDER_REGISTRY[number][1]\n\nexport const FAST_BLEND_MODES: BlendColor32[] = []\n\nfor (const [index, blend] of FAST_BLENDER_REGISTRY) {\n FAST_BLEND_MODES[index as BlendModeIndex] = blend\n}\n\nexport const FAST_BLEND_TO_INDEX = new Map<RegisteredFastBlender, BlendModeIndex>(\n FAST_BLENDER_REGISTRY.map((entry, index) => {\n return [\n entry[1],\n index as BlendModeIndex,\n ]\n }),\n) as BaseBlendToIndexGetter<RegisteredFastBlender>\n\nexport const INDEX_TO_FAST_BLEND = new Map<BlendModeIndex, RegisteredFastBlender>(\n FAST_BLENDER_REGISTRY.map((entry, index) => {\n return [\n index as BlendModeIndex,\n entry[1],\n ]\n }),\n) as BaseIndexToBlendGetter<RegisteredFastBlender>\n\nexport type FastBlendModes = {\n [K in keyof typeof BlendMode]: RegisteredFastBlender\n}\n\nexport const FAST_BLEND_MODE_BY_NAME: FastBlendModes = {\n overwrite: overwriteFast,\n sourceOver: sourceOverFast,\n darken: darkenFast,\n multiply: multiplyFast,\n colorBurn: colorBurnFast,\n linearBurn: linearBurnFast,\n darkerColor: darkerFast,\n lighten: lightenFast,\n screen: screenFast,\n colorDodge: colorDodgeFast,\n linearDodge: linearDodgeFast,\n lighterColor: lighterFast,\n overlay: overlayFast,\n softLight: softLightFast,\n hardLight: hardLightFast,\n vividLight: vividLightFast,\n linearLight: linearLightFast,\n pinLight: pinLightFast,\n hardMix: hardMixFast,\n difference: differenceFast,\n exclusion: exclusionFast,\n subtract: subtractFast,\n divide: divideFast,\n} as const\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 = (src: Color32, dst: Color32) => Color32\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 PixelOptions {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number\n /**\n * The width of the region to process.\n * @default Source width.\n */\n w?: number\n /**\n * The height of the region to process.\n * @default Source height.\n */\n h?: number\n\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number\n\n /**\n * Mask width.\n * @default 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 /** 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.BINARY}\n */\n maskType?: MaskType\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 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\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 extractImageDataPixels(\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 extractImageDataPixels(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8ClampedArray\nexport function extractImageDataPixels(\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 { extractImageDataPixels } from '../ImageData/extractImageDataPixels'\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 = extractImageDataPixels(\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 type { BaseBlendToIndexGetter, BaseIndexToBlendGetter } from './blend-mode-getters'\nimport { BlendMode, type BlendModeIndex } from './blend-modes'\n\nexport const overwritePerfect: BlendColor32 = (src, _dst) => src\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 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) / 255 | 0\n const g = (sg * sa + dg * invA) / 255 | 0\n const b = (sb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 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 / 255) | 0\n const bg = (sg * dg / 255) | 0\n const bb = (sb * 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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 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 === 255 ? 255 : sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / sr) | 0)))\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / sg) | 0)))\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / sb) | 0)))\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) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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, 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 * 255 / (255 - sr)) | 0))\n const bg = sg === 255 ? 255 : Math.min(255, ((dg * 255 / (255 - sg)) | 0))\n const bb = sb === 255 ? 255 : Math.min(255, ((db * 255 / (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) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 const br = (((255 - dr) * ((sr * dr / 255) | 0) + dr * (255 - (((255 - sr) * (255 - dr) / 255) | 0))) / 255) | 0\n const bg = (((255 - dg) * ((sg * dg / 255) | 0) + dg * (255 - (((255 - sg) * (255 - dg) / 255) | 0))) / 255) | 0\n const bb = (((255 - db) * ((sb * db / 255) | 0) + db * (255 - (((255 - sb) * (255 - db) / 255) | 0))) / 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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 const r = (br * sa + dr * invA + 128) / 255 | 0\n const g = (bg * sa + dg * invA + 128) / 255 | 0\n const b = (bb * sa + db * invA + 128) / 255 | 0\n const a = (255 * sa + da * invA + 128) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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\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 = Math.abs(dr - sr)\n const bg = Math.abs(dg - sg)\n const bb = Math.abs(db - sb)\n\n if (sa === 255) {\n return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n }\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n const r = (br * sa + dr * invA + 128) / 255 | 0\n const g = (bg * sa + dg * invA + 128) / 255 | 0\n const b = (bb * sa + db * invA + 128) / 255 | 0\n const a = (255 * sa + da * invA + 128) / 255 | 0\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 // Using >> 7 (divide by 128) instead of / 255\n // This is equivalent to (2 * s * d) / 256\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) {\n return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n }\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n const r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + da * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\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 r = (br * sa + dr * invA) / 255 | 0\n const g = (bg * sa + dg * invA) / 255 | 0\n const b = (bb * sa + db * invA) / 255 | 0\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) / 255 | 0\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const PERFECT_BLENDER_REGISTRY = [\n [BlendMode.overwrite, overwritePerfect],\n [BlendMode.sourceOver, sourceOverPerfect],\n\n [BlendMode.darken, darkenPerfect],\n [BlendMode.multiply, multiplyPerfect],\n [BlendMode.colorBurn, colorBurnPerfect],\n [BlendMode.linearBurn, linearBurnPerfect],\n [BlendMode.darkerColor, darkerPerfect],\n\n [BlendMode.lighten, lightenPerfect],\n [BlendMode.screen, screenPerfect],\n [BlendMode.colorDodge, colorDodgePerfect],\n [BlendMode.linearDodge, linearDodgePerfect],\n [BlendMode.lighterColor, lighterPerfect],\n\n [BlendMode.overlay, overlayPerfect],\n [BlendMode.softLight, softLightPerfect],\n [BlendMode.hardLight, hardLightPerfect],\n [BlendMode.vividLight, vividLightPerfect],\n [BlendMode.linearLight, linearLightPerfect],\n [BlendMode.pinLight, pinLightPerfect],\n [BlendMode.hardMix, hardMixPerfect],\n\n [BlendMode.difference, differencePerfect],\n [BlendMode.exclusion, exclusionPerfect],\n [BlendMode.subtract, subtractPerfect],\n [BlendMode.divide, dividePerfect],\n] as const\n\nexport type RegisteredPerfectBlender = typeof PERFECT_BLENDER_REGISTRY[number][1]\n\nexport const PERFECT_BLEND_MODES: BlendColor32[] = []\nfor (const [index, blend] of PERFECT_BLENDER_REGISTRY) {\n PERFECT_BLEND_MODES[index as BlendModeIndex] = blend\n}\n\nexport const PERFECT_BLEND_TO_INDEX = new Map(\n PERFECT_BLENDER_REGISTRY.map((entry, index) => {\n return [\n entry[1],\n index as BlendModeIndex,\n ]\n }),\n) as BaseBlendToIndexGetter<RegisteredPerfectBlender>\n\nexport const INDEX_TO_PERFECT_BLEND = new Map(\n PERFECT_BLENDER_REGISTRY.map((entry, index) => {\n return [\n index as BlendModeIndex,\n entry[1],\n ]\n }),\n) as BaseIndexToBlendGetter<RegisteredPerfectBlender>\n\nexport type PerfectBlendModes = {\n [K in keyof typeof BlendMode]: RegisteredPerfectBlender\n}\n\nexport const PERFECT_BLEND_MODE_BY_NAME: PerfectBlendModes = {\n overwrite: overwritePerfect,\n sourceOver: sourceOverPerfect,\n darken: darkenPerfect,\n multiply: multiplyPerfect,\n colorBurn: colorBurnPerfect,\n linearBurn: linearBurnPerfect,\n darkerColor: darkerPerfect,\n lighten: lightenPerfect,\n screen: screenPerfect,\n colorDodge: colorDodgePerfect,\n linearDodge: linearDodgePerfect,\n lighterColor: lighterPerfect,\n overlay: overlayPerfect,\n softLight: softLightPerfect,\n hardLight: hardLightPerfect,\n vividLight: vividLightPerfect,\n linearLight: linearLightPerfect,\n pinLight: pinLightPerfect,\n hardMix: hardMixPerfect,\n difference: differencePerfect,\n exclusion: exclusionPerfect,\n subtract: subtractPerfect,\n divide: dividePerfect,\n} as const\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 { 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","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","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(\n source: ImageData,\n factor: number,\n): ImageData {\n const srcW = source.width\n const srcH = source.height\n const dstW = Math.max(1, (srcW * factor) | 0)\n const dstH = Math.max(1, (srcH * factor) | 0)\n const srcData = source.data\n const dstData = new Uint8ClampedArray(dstW * dstH * 4)\n\n for (let y = 0; y < dstH; y++) {\n const srcY = (y / factor) | 0\n const srcRowOffset = srcY * srcW * 4\n const dstRowOffset = y * dstW * 4\n\n for (let x = 0; x < dstW; x++) {\n const srcX = (x / factor) | 0\n const srcIdx = srcRowOffset + srcX * 4\n const dstIdx = dstRowOffset + x * 4\n\n // Copy RGBA channels\n dstData[dstIdx] = srcData[srcIdx]!\n dstData[dstIdx + 1] = srcData[srcIdx + 1]!\n dstData[dstIdx + 2] = srcData[srcIdx + 2]!\n dstData[dstIdx + 3] = srcData[srcIdx + 3]!\n }\n }\n\n return new ImageData(dstData, dstW, dstH)\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 ImageData} 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: ImageData,\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 binary = String.fromCharCode(...new Uint8Array(buffer))\n return btoa(binary) as Base64EncodedUInt8Array\n}\n\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded)\n const bytes = new Uint8ClampedArray(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer),\n }\n}\n\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any\n\n return serializeImageData(imageData) as any\n}\n\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array),\n }\n}\n\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any\n}\n\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any\n return deserializeImageData(serialized) as any\n}\n","import type { 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 writeImageDataPixels(\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 writeImageDataPixels(\n imageData: ImageData,\n data: Uint8ClampedArray,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writeImageDataPixels(\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","/**\n * Compressed data format for image processing optimization.\n * Representing an image as a grid of palette indices rather than raw RGBA values\n * significantly reduces memory overhead and optimizes pattern matching logic.\n */\nexport type IndexedImage = {\n /** The width of the image in pixels. */\n width: number;\n /** The height of the image in pixels. */\n height: number;\n /**\n * A flat array of indices where each value points to a color in the palette.\n * Accessible via the formula: `index = x + (y * width)`.\n */\n data: Int32Array;\n /**\n * A palette of packed 32-bit colors (ABGR).\n */\n palette: Uint32Array;\n /**\n * The specific index in the palette that represents a fully transparent pixel.\n */\n transparentPalletIndex: number;\n};\n\n/**\n * Converts standard ImageData into an IndexedImage format.\n */\n/**\n * Converts standard ImageData into an IndexedImage format.\n */\nexport function makeIndexedImage(imageData: ImageData): IndexedImage {\n const width = imageData.width\n const height = imageData.height\n\n // Use a 32-bit view to read pixels as packed integers (usually ABGR or RGBA)\n const rawData = new Uint32Array(imageData.data.buffer)\n const indexedData = new Int32Array(rawData.length)\n const colorMap = new Map<number, number>()\n\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]!\n\n // Check if the pixel is fully transparent\n const alpha = (pixel >>> 24) & 0xFF\n const isTransparent = alpha === 0\n const colorKey = isTransparent ? transparentColor : pixel\n\n let id = colorMap.get(colorKey)\n\n if (id === undefined) {\n // Use the current length as the next ID to ensure sequence\n id = colorMap.size\n colorMap.set(colorKey, id)\n }\n\n indexedData[i] = id\n }\n\n const palette = new Uint32Array(colorMap.keys())\n return {\n width,\n height,\n data: indexedData,\n transparentPalletIndex,\n palette,\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","import type { IndexedImage } from '../index'\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 const srcW = source.width\n const srcH = source.height\n const dstW = srcW * factor\n const dstH = srcH * factor\n const srcData = source.data\n const dstData = new Int32Array(dstW * dstH)\n\n for (let y = 0; y < dstH; y++) {\n const srcY = (y / factor) | 0\n const rowOffset = srcY * srcW\n const dstOffset = y * dstW\n\n for (let x = 0; x < dstW; x++) {\n const srcX = (x / factor) | 0\n dstData[dstOffset + x] = srcData[rowOffset + srcX]!\n }\n }\n\n return {\n width: dstW,\n height: dstH,\n data: dstData,\n palette: source.palette,\n transparentPalletIndex: source.transparentPalletIndex,\n }\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 type { ImageDataLike } from '../_types'\n\nexport class PixelData {\n public data32: Uint32Array\n public width: number\n public height: number\n\n constructor(public readonly imageData: ImageDataLike) {\n this.width = imageData.width\n this.height = imageData.height\n\n // Create the view once.\n this.data32 = 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\n copy(): PixelData {\n const buffer = new Uint8ClampedArray(this.data32.buffer.slice(0))\n const imageData = {\n data: buffer,\n width: this.width,\n height: this.height,\n }\n\n return new PixelData(imageData)\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 Color32, type ColorBlendOptions, MaskType } from '../_types'\nimport { BlendMode } from '../BlendModes/blend-modes'\nimport { FAST_BLEND_MODES } 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): 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 blendFn = FAST_BLEND_MODES[BlendMode.sourceOver],\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 w = width\n let h = height\n\n // 1. 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 // Pre-calculate the source color with global alpha\n const baseSrcColor = color\n const baseSrcAlpha = (baseSrcColor >>> 24)\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n\n // Early exit if source pixel is already transparent\n if (baseSrcAlpha === 0) {\n dIdx++\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 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 (weight === 0) {\n dIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcAlpha = baseSrcAlpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (currentSrcAlpha === 0) {\n dIdx++\n 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 mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n}\n","import { type Color32, MaskType, type PixelBlendOptions } from '../_types'\nimport { BlendMode } from '../BlendModes/blend-modes'\nimport { FAST_BLEND_MODES } 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 = FAST_BLEND_MODES[BlendMode.sourceOver],\n mask,\n maskType = MaskType.ALPHA,\n mw,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (globalAlpha === 0) return\n\n let x = targetX\n let y = targetY\n let sx = sourceX\n let sy = sourceY\n let w = width\n let h = height\n\n // 1. Source Clipping\n if (sx < 0) {\n x -= sx\n w += sx\n sx = 0\n }\n if (sy < 0) {\n y -= sy\n h += sy\n sy = 0\n }\n w = Math.min(w, src.width - sx)\n h = Math.min(h, src.height - sy)\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x\n w += x\n x = 0\n }\n if (y < 0) {\n sy -= y\n h += y\n y = 0\n }\n\n const actualW = Math.min(w, dst.width - x)\n const actualH = Math.min(h, dst.height - y)\n\n if (actualW <= 0 || actualH <= 0) return\n\n const dst32 = dst.data32\n const src32 = src.data32\n const dw = dst.width\n const sw = src.width\n const mPitch = mw ?? width\n const isAlphaMask = maskType === MaskType.ALPHA\n\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n let sIdx = sy * sw + sx\n let mIdx = (my + dy) * mPitch + (mx + dx)\n\n const dStride = dw - actualW\n const sStride = sw - actualW\n const mStride = mPitch - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const baseSrcColor = src32[sIdx] as Color32\n const baseSrcAlpha = (baseSrcColor >>> 24)\n\n // Early exit if source pixel is already transparent\n if (baseSrcAlpha === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n let weight = globalAlpha\n\n if (mask) {\n const mVal = mask[mIdx]\n\n if (isAlphaMask) {\n const effectiveM = invertMask\n ? 255 - mVal\n : mVal\n\n // If mask is transparent, skip\n if (effectiveM === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n // globalAlpha is not a factor\n if (globalAlpha === 255) {\n weight = effectiveM\n // mask is not a factor\n } else if (effectiveM === 255) {\n weight = globalAlpha\n } else {\n // use rounding-corrected multiplication\n weight = (effectiveM * globalAlpha + 128) >> 8\n }\n } else {\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (!isHit) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n weight = globalAlpha\n }\n\n // Final safety check for weight (can be 0 if globalAlpha or alphaMask rounds down)\n if (weight === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n }\n\n // Apply Weight to Source Alpha\n let currentSrcAlpha = baseSrcAlpha\n let currentSrcColor = baseSrcColor\n\n if (weight < 255) {\n if (baseSrcAlpha === 255) {\n currentSrcAlpha = weight\n } else {\n currentSrcAlpha = (baseSrcAlpha * weight + 128) >> 8\n }\n\n if (currentSrcAlpha === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n currentSrcColor = ((baseSrcColor & 0x00ffffff) | (currentSrcAlpha << 24)) >>> 0 as Color32\n }\n\n dst32[dIdx] = blendFn(currentSrcColor, dst32[dIdx] as Color32)\n\n dIdx++\n sIdx++\n mIdx++\n }\n\n dIdx += dStride\n sIdx += sStride\n mIdx += mStride\n }\n}\n","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 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 { PixelData } from './PixelData'\n\nexport function invertPixelData(\n pixelData: PixelData,\n): PixelData {\n\n const data32 = pixelData.data32\n const len = data32.length\n\n for (let i = 0; i < len; i++) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha (the top 8 bits)\n data32[i] = data32[i] ^ 0x00FFFFFF\n }\n\n return pixelData\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","import { PixelData } from '../index'\n\n/**\n * Resamples an PixelData by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(pixelData: PixelData, factor: number): PixelData {\n const dstW = Math.max(1, (pixelData.width * factor) | 0)\n const dstH = Math.max(1, (pixelData.height * factor) | 0)\n const dstBuffer = new Uint8ClampedArray(dstW * dstH * 4)\n const dstData32 = new Uint32Array(dstBuffer.buffer)\n\n for (let y = 0; y < dstH; y++) {\n const srcY = (y / factor) | 0\n const srcRowOffset = srcY * pixelData.width\n const dstRowOffset = y * dstW\n\n for (let x = 0; x < dstW; x++) {\n const srcX = (x / factor) | 0\n dstData32[dstRowOffset + x] = pixelData.data32[srcRowOffset + srcX]!\n }\n }\n\n return new PixelData({\n data: dstBuffer,\n width: dstW,\n height: dstH,\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 returns a new Uint32Array and updates dimensions.\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 newData = 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 newData[newIdx] = data[oldIdx]\n }\n }\n\n pixelData.width = newWidth\n pixelData.height = newHeight\n pixelData.data32 = newData\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 temp = data[i * n + 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 data[top] = data[left]\n data[left] = data[bottom]\n data[bottom] = data[right]\n data[right] = temp\n }\n }\n}\n"],"mappings":"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","names":["BlendMode","MaskType","get","r","g","b","a"]}