pixel-data-js 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.prod.cjs +521 -326
- package/dist/index.prod.cjs.map +1 -1
- package/dist/index.prod.d.ts +132 -78
- package/dist/index.prod.js +513 -324
- package/dist/index.prod.js.map +1 -1
- package/package.json +2 -2
- package/src/Algorithm/floodFillSelection.ts +3 -2
- package/src/BlendModes/blend-modes-fast.ts +2 -1
- package/src/BlendModes/blend-modes-perfect.ts +2 -1
- package/src/Canvas/ReusableCanvas.ts +0 -5
- package/src/Color/_color-types.ts +8 -0
- package/src/Color/colorDistance.ts +9 -0
- package/src/Color/convert-color.ts +43 -0
- package/src/Color/lerpColor32.ts +44 -0
- package/src/Color/pack-color.ts +38 -0
- package/src/History/HistoryAction.ts +2 -2
- package/src/History/PixelAccumulator.ts +32 -13
- package/src/History/PixelMutator/mutatorApplyAlphaMask.ts +2 -0
- package/src/History/PixelMutator/mutatorApplyBinaryMask.ts +5 -1
- package/src/History/PixelMutator/mutatorApplyMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendAlphaMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendBinaryMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendColor.ts +4 -1
- package/src/History/PixelMutator/mutatorBlendColorPaintAlphaMask.ts +2 -1
- package/src/History/PixelMutator/mutatorBlendColorPaintBinaryMask.ts +2 -1
- package/src/History/PixelMutator/mutatorBlendColorPaintMask.ts +24 -8
- package/src/History/PixelMutator/mutatorBlendColorPaintRect.ts +4 -1
- package/src/History/PixelMutator/mutatorBlendMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendPixel.ts +3 -1
- package/src/History/PixelMutator/mutatorBlendPixelData.ts +1 -0
- package/src/History/PixelMutator/mutatorClear.ts +3 -2
- package/src/History/PixelMutator/mutatorFill.ts +54 -38
- package/src/History/PixelMutator/mutatorFillBinaryMask.ts +3 -2
- package/src/History/PixelMutator/mutatorInvert.ts +3 -2
- package/src/History/PixelMutator.ts +1 -2
- package/src/History/PixelWriter.ts +5 -5
- package/src/IndexedImage/IndexedImage.ts +1 -1
- package/src/IndexedImage/indexedImageToAverageColor.ts +3 -2
- package/src/Mask/_mask-types.ts +9 -0
- package/src/Paint/AlphaMaskPaintBuffer.ts +26 -26
- package/src/Paint/BinaryMaskPaintBuffer.ts +19 -19
- package/src/Paint/ColorPaintBuffer.ts +40 -42
- package/src/Paint/Commit/AlphaMaskPaintBufferCommitter.ts +1 -1
- package/src/Paint/Commit/AlphaMaskPaintBufferManager.ts +6 -7
- package/src/Paint/Commit/BinaryMaskPaintBufferCommitter.ts +1 -1
- package/src/Paint/Commit/BinaryMaskPaintBufferManager.ts +6 -7
- package/src/Paint/Commit/ColorPaintBufferManager.ts +6 -7
- package/src/Paint/Commit/commitColorPaintBuffer.ts +2 -6
- package/src/Paint/Commit/commitMaskPaintBuffer.ts +3 -7
- package/src/Paint/Render/AlphaMaskPaintBufferCanvasRenderer.ts +42 -25
- package/src/Paint/Render/BinaryMaskPaintBufferCanvasRenderer.ts +40 -24
- package/src/Paint/Render/ColorPaintBufferCanvasRenderer.ts +21 -21
- package/src/Paint/Render/PaintCursorRenderer.ts +12 -2
- package/src/Paint/eachTileInBounds.ts +9 -10
- package/src/PixelData/_pixelData-types.ts +7 -0
- package/src/PixelData/blendColorPixelData.ts +2 -1
- package/src/PixelData/blendColorPixelDataAlphaMask.ts +2 -1
- package/src/PixelData/blendColorPixelDataBinaryMask.ts +2 -1
- package/src/PixelData/blendColorPixelDataMask.ts +2 -1
- package/src/PixelData/blendColorPixelDataPaintAlphaMask.ts +1 -1
- package/src/PixelData/blendColorPixelDataPaintBinaryMask.ts +1 -1
- package/src/PixelData/blendColorPixelDataPaintMask.ts +19 -8
- package/src/PixelData/blendPixel.ts +2 -1
- package/src/PixelData/blendPixelData.ts +2 -1
- package/src/PixelData/blendPixelDataAlphaMask.ts +2 -1
- package/src/PixelData/blendPixelDataBinaryMask.ts +2 -1
- package/src/PixelData/blendPixelDataPaintBuffer.ts +2 -3
- package/src/PixelData/clearPixelDataFast.ts +1 -1
- package/src/PixelData/cropPixelData.ts +36 -0
- package/src/PixelData/fillPixelData.ts +7 -7
- package/src/PixelData/fillPixelDataBinaryMask.ts +1 -1
- package/src/PixelData/fillPixelDataFast.ts +1 -1
- package/src/PixelData/trimPixelData.ts +49 -0
- package/src/PixelData/writePaintBufferToPixelData.ts +1 -5
- package/src/Tile/MaskTile.ts +4 -0
- package/src/Tile/PixelTile.ts +2 -0
- package/src/Tile/TilePool.ts +9 -8
- package/src/Tile/TileTargetConfig.ts +27 -0
- package/src/Tile/_tile-types.ts +16 -0
- package/src/_types.ts +1 -6
- package/src/index.ts +9 -3
- package/src/History/PixelEngineConfig.ts +0 -28
- package/src/Internal/_constants.ts +0 -3
- package/src/color.ts +0 -112
package/dist/index.prod.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/Internal/_errors.ts","../src/color.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/_mask-types.ts","../src/Mask/extractMaskBuffer.ts","../src/Rect/trimMaskRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/Algorithm/forEachLinePoint.ts","../src/Algorithm/resampleUint32Array.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/BlendModes/blend-modes-perfect.ts","../src/BlendModes/toBlendModeIndexAndName.ts","../src/Canvas/canvas-blend-modes.ts","../src/Canvas/ReusableCanvas.ts","../src/Canvas/CanvasFrameRenderer.ts","../src/Canvas/CanvasPixelDataRenderer.ts","../src/Canvas/PixelCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/Control/BatchedQueue.ts","../src/Control/RenderQueue.ts","../src/History/PixelPatchTiles.ts","../src/History/HistoryAction.ts","../src/History/HistoryManager.ts","../src/History/PixelAccumulator.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/ImageData/resizeImageData.ts","../src/PixelData/PixelData.ts","../src/Tile/_tile-types.ts","../src/Tile/PixelTile.ts","../src/Tile/TilePool.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyAlphaMask.ts","../src/PixelData/applyBinaryMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyBinaryMask.ts","../src/History/PixelMutator/mutatorApplyMask.ts","../src/PixelData/blendPixelDataAlphaMask.ts","../src/History/PixelMutator/mutatorBlendAlphaMask.ts","../src/PixelData/blendPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorBlendBinaryMask.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/PixelData/blendColorPixelDataAlphaMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintAlphaMask.ts","../src/PixelData/blendColorPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintBinaryMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintRect.ts","../src/History/PixelMutator/mutatorBlendMask.ts","../src/PixelData/blendPixel.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorClear.ts","../src/History/PixelMutator/mutatorFill.ts","../src/PixelData/fillPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorFillBinaryMask.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/ImageData/copyImageData.ts","../src/ImageData/extractImageData.ts","../src/ImageData/ImageDataLike.ts","../src/ImageData/imageDataToAlphaMaskBuffer.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUint32Array.ts","../src/ImageData/invertImageData.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/uInt32ArrayToImageData.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/AlphaMask.ts","../src/Mask/applyBinaryMaskToAlphaMask.ts","../src/Mask/BinaryMask.ts","../src/Mask/BinaryMask/makeBinaryMaskFromAlphaMask.ts","../src/Mask/BinaryMask/makeBinaryMaskOutline.ts","../src/Mask/BinaryMask/makeCircleBinaryMaskOutline.ts","../src/Mask/BinaryMask/makeRectBinaryMaskOutline.ts","../src/Mask/copyMask.ts","../src/Mask/extractMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeAlphaMasks.ts","../src/Mask/mergeBinaryMasks.ts","../src/Mask/setMaskData.ts","../src/Rect/getRectsBounds.ts","../src/MaskRect/merge2BinaryMaskRects.ts","../src/MaskRect/mergeBinaryMaskRects.ts","../src/MaskRect/subtractBinaryMaskRects.ts","../src/Paint/_paint-types.ts","../src/Rect/trimRectBounds.ts","../src/Paint/eachTileInBounds.ts","../src/Paint/AlphaMaskPaintBuffer.ts","../src/Paint/BinaryMaskPaintBuffer.ts","../src/Paint/ColorPaintBuffer.ts","../src/Paint/Commit/commitMaskPaintBuffer.ts","../src/Paint/Commit/AlphaMaskPaintBufferCommitter.ts","../src/Internal/_constants.ts","../src/Tile/MaskTile.ts","../src/Paint/Render/AlphaMaskPaintBufferCanvasRenderer.ts","../src/Paint/Commit/AlphaMaskPaintBufferManager.ts","../src/Paint/Commit/BinaryMaskPaintBufferCommitter.ts","../src/Paint/Render/BinaryMaskPaintBufferCanvasRenderer.ts","../src/Paint/Commit/BinaryMaskPaintBufferManager.ts","../src/Paint/Commit/commitColorPaintBuffer.ts","../src/Paint/Commit/ColorPaintBufferCommitter.ts","../src/Paint/Render/ColorPaintBufferCanvasRenderer.ts","../src/Paint/Commit/ColorPaintBufferManager.ts","../src/Paint/makeCirclePaintMask.ts","../src/Paint/makePaintMask.ts","../src/Paint/makeRectFalloffPaintAlphaMask.ts","../src/Paint/PaintRect.ts","../src/PixelData/ReusablePixelData.ts","../src/Paint/Render/PaintCursorRenderer.ts","../src/PixelData/applyMaskToPixelData.ts","../src/PixelData/blendColorPixelDataMask.ts","../src/PixelData/blendColorPixelDataPaintAlphaMask.ts","../src/PixelData/blendColorPixelDataPaintBinaryMask.ts","../src/PixelData/blendColorPixelDataPaintMask.ts","../src/PixelData/blendPixelDataMask.ts","../src/PixelData/blendPixelDataPaintBuffer.ts","../src/PixelData/fillPixelDataFast.ts","../src/PixelData/clearPixelDataFast.ts","../src/PixelData/copyPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/resizePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/uInt32ArrayToPixelData.ts","../src/PixelData/writePixelDataBuffer.ts","../src/PixelData/writePaintBufferToPixelData.ts","../src/PixelData/writePixelData.ts"],"sourcesContent":["export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context';\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEID0gJ0ZhaWxlZCB0byBjcmVhdGUgT2Zmc2NyZWVuQ2FudmFzIGNvbnRleHQnO1xuZXhwb3J0IGNvbnN0IENBTlZBU19DVFhfRkFJTEVEID0gJ0ZhaWxlZCB0byBjcmVhdGUgQ2FudmFzIGNvbnRleHQnOyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } 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}\nexport function packRGBA({\n r,\n g,\n b,\n a\n}: RGBA): Color32 {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\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;\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}\nconst SCRATCH_RGBA: RGBA = {\n r: 0,\n g: 0,\n b: 0,\n a: 0\n};\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}\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 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 */\nexport 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 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 const alpha = Number((a / 255).toFixed(3));\n return `rgba(${r},${g},${b},${alpha})`;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuL190eXBlcyc7XG5cbi8qKlxuICogUGFja3MgUkdCQSBpbnRvIGEgMzItYml0IGludGVnZXIgY29tcGF0aWJsZSB3aXRoXG4gKiBMaXR0bGUtRW5kaWFuIFVpbnQzMkFycmF5IHZpZXdzIG9uIEltYWdlRGF0YS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhY2tDb2xvcihyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyLCBhOiBudW1iZXIpOiBDb2xvcjMyIHtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59XG5leHBvcnQgZnVuY3Rpb24gcGFja1JHQkEoe1xuICByLFxuICBnLFxuICBiLFxuICBhXG59OiBSR0JBKTogQ29sb3IzMiB7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufVxuZXhwb3J0IGNvbnN0IHVucGFja1JlZCA9IChwYWNrZWQ6IENvbG9yMzIpOiBudW1iZXIgPT4gcGFja2VkID4+PiAwICYgMHhGRjtcbmV4cG9ydCBjb25zdCB1bnBhY2tHcmVlbiA9IChwYWNrZWQ6IENvbG9yMzIpOiBudW1iZXIgPT4gcGFja2VkID4+PiA4ICYgMHhGRjtcbmV4cG9ydCBjb25zdCB1bnBhY2tCbHVlID0gKHBhY2tlZDogQ29sb3IzMik6IG51bWJlciA9PiBwYWNrZWQgPj4+IDE2ICYgMHhGRjtcbmV4cG9ydCBjb25zdCB1bnBhY2tBbHBoYSA9IChwYWNrZWQ6IENvbG9yMzIpOiBudW1iZXIgPT4gcGFja2VkID4+PiAyNCAmIDB4RkY7XG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrQ29sb3IocGFja2VkOiBDb2xvcjMyKTogUkdCQSB7XG4gIHJldHVybiB7XG4gICAgcjogcGFja2VkID4+PiAwICYgMHhGRixcbiAgICBnOiBwYWNrZWQgPj4+IDggJiAweEZGLFxuICAgIGI6IHBhY2tlZCA+Pj4gMTYgJiAweEZGLFxuICAgIGE6IHBhY2tlZCA+Pj4gMjQgJiAweEZGXG4gIH07XG59XG5jb25zdCBTQ1JBVENIX1JHQkE6IFJHQkEgPSB7XG4gIHI6IDAsXG4gIGc6IDAsXG4gIGI6IDAsXG4gIGE6IDBcbn07XG5cbi8vIHVzZXMgYSBzY3JhdGNoIGFyZyBmb3IgbWVtb3J5IHBlcmYuIGJlIGNhcmVmdWwgYWJvdXQgcmUtdXNlLlxuZXhwb3J0IGZ1bmN0aW9uIHVucGFja0NvbG9yVG8ocGFja2VkOiBDb2xvcjMyLCBzY3JhdGNoID0gU0NSQVRDSF9SR0JBKTogUkdCQSB7XG4gIHNjcmF0Y2guciA9IHBhY2tlZCA+Pj4gMCAmIDB4RkY7XG4gIHNjcmF0Y2guZyA9IHBhY2tlZCA+Pj4gOCAmIDB4RkY7XG4gIHNjcmF0Y2guYiA9IHBhY2tlZCA+Pj4gMTYgJiAweEZGO1xuICBzY3JhdGNoLmEgPSBwYWNrZWQgPj4+IDI0ICYgMHhGRjtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5leHBvcnQgZnVuY3Rpb24gY29sb3JEaXN0YW5jZShhOiBDb2xvcjMyLCBiOiBDb2xvcjMyKTogbnVtYmVyIHtcbiAgY29uc3QgZHIgPSAoYSAmIDB4RkYpIC0gKGIgJiAweEZGKTtcbiAgY29uc3QgZGcgPSAoYSA+Pj4gOCAmIDB4RkYpIC0gKGIgPj4+IDggJiAweEZGKTtcbiAgY29uc3QgZGIgPSAoYSA+Pj4gMTYgJiAweEZGKSAtIChiID4+PiAxNiAmIDB4RkYpO1xuICBjb25zdCBkYSA9IChhID4+PiAyNCAmIDB4RkYpIC0gKGIgPj4+IDI0ICYgMHhGRik7XG4gIHJldHVybiBkciAqIGRyICsgZGcgKiBkZyArIGRiICogZGIgKyBkYSAqIGRhO1xufVxuXG4vKipcbiAqIExpbmVhcmx5IGludGVycG9sYXRlcyBiZXR3ZWVuIHR3byAzMi1iaXQgY29sb3JzIHVzaW5nIGEgZmxvYXRpbmctcG9pbnQgd2VpZ2h0LlxuICogKiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgbWV0aG9kIGZvciBVSSBhbmltYXRpb25zIG9yIHNjZW5hcmlvcyB3aGVyZSBoaWdoXG4gKiBwcmVjaXNpb24gaXMgcmVxdWlyZWQuIEl0IHVzZXMgdGhlIHN0YW5kYXJkIGBhICsgdCAqIChiIC0gYSlgIGZvcm11bGFcbiAqIGZvciBlYWNoIGNoYW5uZWwuXG4gKiBAcGFyYW0gYSAtIFRoZSBzdGFydGluZyBjb2xvciBhcyBhIDMyLWJpdCBpbnRlZ2VyIChBQUJCR0dSUikuXG4gKiBAcGFyYW0gYiAtIFRoZSB0YXJnZXQgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlciAoQUFCQkdHUlIpLlxuICogQHBhcmFtIHQgLSBUaGUgaW50ZXJwb2xhdGlvbiBmYWN0b3IgYmV0d2VlbiAwLjAgYW5kIDEuMC5cbiAqIEByZXR1cm5zIFRoZSBpbnRlcnBvbGF0ZWQgMzItYml0IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVycENvbG9yMzIoYTogQ29sb3IzMiwgYjogQ29sb3IzMiwgdDogbnVtYmVyKTogQ29sb3IzMiB7XG4gIGNvbnN0IHIgPSAoYSAmIDB4RkYpICsgdCAqICgoYiAmIDB4RkYpIC0gKGEgJiAweEZGKSk7XG4gIGNvbnN0IGcgPSAoYSA+Pj4gOCAmIDB4RkYpICsgdCAqICgoYiA+Pj4gOCAmIDB4RkYpIC0gKGEgPj4+IDggJiAweEZGKSk7XG4gIGNvbnN0IGJfID0gKGEgPj4+IDE2ICYgMHhGRikgKyB0ICogKChiID4+PiAxNiAmIDB4RkYpIC0gKGEgPj4+IDE2ICYgMHhGRikpO1xuICBjb25zdCBhXyA9IChhID4+PiAyNCAmIDB4RkYpICsgdCAqICgoYiA+Pj4gMjQgJiAweEZGKSAtIChhID4+PiAyNCAmIDB4RkYpKTtcbiAgcmV0dXJuIChhXyA8PCAyNCB8IGJfIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn1cblxuLyoqXG4gKiBMaW5lYXJseSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0d28gMzItYml0IGNvbG9ycyB1c2luZyBpbnRlZ2VyIGZpeGVkLXBvaW50IG1hdGguXG4gKiBIaWdobHkgb3B0aW1pemVkIGZvciBpbWFnZSBwcm9jZXNzaW5nIGFuZCByZWFsLXRpbWUgYmxpdHRpbmcuIEl0IHByb2Nlc3Nlc1xuICogY2hhbm5lbHMgaW4gcGFyYWxsZWwgdXNpbmcgYml0bWFza3MgKFJCIGFuZCBHQSBwYWlycykuXG4gKiAqKk5vdGU6KiogU3ViamVjdCB0byBhIDEtYml0IGRyaWZ0IChyb3VuZGluZyBkb3duKSBkdWUgdG8gZmFzdCBiaXQtc2hpZnQgZGl2aXNpb24uXG4gKiBAcGFyYW0gc3JjIC0gVGhlIHNvdXJjZSAoZm9yZWdyb3VuZCkgY29sb3IgYXMgYSAzMi1iaXQgaW50ZWdlci5cbiAqIEBwYXJhbSBkc3QgLSBUaGUgZGVzdGluYXRpb24gKGJhY2tncm91bmQpIGNvbG9yIGFzIGEgMzItYml0IGludGVnZXIuXG4gKiBAcGFyYW0gdyAtIFRoZSBibGVuZCB3ZWlnaHQgYXMgYSBieXRlIHZhbHVlIGZyb20gMCB0byAyNTUuIFdoZXJlIDAgaXMgMTAwJSBkc3QgYW5kIDI1NSBpcyAxMDAlIHNyY1xuICogQHJldHVybnMgVGhlIGJsZW5kZWQgMzItYml0IGNvbG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGVycENvbG9yMzJGYXN0KHNyYzogQ29sb3IzMiwgZHN0OiBDb2xvcjMyLCB3OiBudW1iZXIpOiBDb2xvcjMyIHtcbiAgY29uc3QgaW52QSA9IDI1NSAtIHc7XG5cbiAgLy8gTWFza2luZyBSZWQgYW5kIEJsdWU6IDB4MDBGRjAwRkZcbiAgLy8gV2UgcHJvY2VzcyBSIGFuZCBCIGluIG9uZSBnbywgdGhlbiBzaGlmdCBiYWNrIGRvd25cbiAgY29uc3QgcmIgPSAoc3JjICYgMHgwMEZGMDBGRikgKiB3ICsgKGRzdCAmIDB4MDBGRjAwRkYpICogaW52QSA+Pj4gOCAmIDB4MDBGRjAwRkY7XG5cbiAgLy8gTWFza2luZyBHcmVlbiBhbmQgQWxwaGE6IDB4RkYwMEZGMDBcbiAgLy8gV2Ugc2hpZnQgZG93biBmaXJzdCB0byBhdm9pZCBvdmVyZmxvdywgdGhlbiBzaGlmdCBiYWNrIHVwXG4gIGNvbnN0IGdhID0gKHNyYyA+Pj4gOCAmIDB4MDBGRjAwRkYpICogdyArIChkc3QgPj4+IDggJiAweDAwRkYwMEZGKSAqIGludkEgPj4+IDggJiAweDAwRkYwMEZGO1xuICByZXR1cm4gKHJiIHwgZ2EgPDwgOCkgPj4+IDAgYXMgQ29sb3IzMjtcbn1cblxuLy8gQ29udmVydCAweEFBQkJHR1JSIHRvICNSUkdHQkJBQVxuZXhwb3J0IGZ1bmN0aW9uIGNvbG9yMzJUb0hleChjb2xvcjogQ29sb3IzMik6IHN0cmluZyB7XG4gIGNvbnN0IHIgPSAoY29sb3IgJiAweEZGKS50b1N0cmluZygxNikucGFkU3RhcnQoMiwgJzAnKTtcbiAgY29uc3QgZyA9IChjb2xvciA+Pj4gOCAmIDB4RkYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBiID0gKGNvbG9yID4+PiAxNiAmIDB4RkYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICBjb25zdCBhID0gKGNvbG9yID4+PiAyNCAmIDB4RkYpLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgyLCAnMCcpO1xuICByZXR1cm4gYCMke3J9JHtnfSR7Yn0ke2F9YDtcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIDMyLWJpdCBpbnRlZ2VyICgweEFBQkJHR1JSKSB0byBhIENTUyByZ2JhKCkgc3RyaW5nLlxuICogRXhhbXBsZTogMHhGRjAwMDBGRiAtPiBcInJnYmEoMjU1LDAsMCwxKVwiXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xvcjMyVG9Dc3NSR0JBKGNvbG9yOiBDb2xvcjMyKTogc3RyaW5nIHtcbiAgY29uc3QgciA9IGNvbG9yICYgMHhGRjtcbiAgY29uc3QgZyA9IGNvbG9yID4+PiA4ICYgMHhGRjtcbiAgY29uc3QgYiA9IGNvbG9yID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGEgPSBjb2xvciA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCBhbHBoYSA9IE51bWJlcigoYSAvIDI1NSkudG9GaXhlZCgzKSk7XG4gIHJldHVybiBgcmdiYSgke3J9LCR7Z30sJHtifSwke2FscGhhfSlgO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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 rect defining the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, rect: Rect): 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 buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(imageData: ImageDataLike, x: number, y: number, w: number, h: number): Uint8ClampedArray;\nexport function extractImageDataBuffer(imageData: ImageDataLike, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint8ClampedArray {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0);\n const srcW = imageData.width;\n const srcH = imageData.height;\n const src = imageData.data;\n const outLen = w * h * 4;\n const out = new Uint8ClampedArray(outLen);\n let srcX = x;\n let srcY = y;\n let dstX = 0;\n let dstY = 0;\n let copyW = w;\n let copyH = h;\n if (srcX < 0) {\n dstX = -srcX;\n copyW += srcX;\n srcX = 0;\n }\n if (srcY < 0) {\n dstY = -srcY;\n copyH += srcY;\n srcY = 0;\n }\n copyW = Math.min(copyW, srcW - srcX);\n copyH = Math.min(copyH, srcH - srcY);\n if (copyW <= 0 || copyH <= 0) return out;\n\n // 2. Perform high-speed block copy\n // Attempt to use a 32-bit view if the buffer is memory-aligned.\n // This reduces loop iterations and arithmetic by 4x.\n const isAligned = src.byteOffset % 4 === 0;\n if (isAligned) {\n const srcLen32 = src.byteLength / 4;\n const src32 = new Uint32Array(src.buffer, src.byteOffset, srcLen32);\n const out32 = new Uint32Array(out.buffer);\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX;\n const dstStart = (dstY + row) * w + dstX;\n const chunk = src32.subarray(srcStart, srcStart + copyW);\n out32.set(chunk, dstStart);\n }\n } else {\n // Fallback for unaligned data\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const srcStart = ((srcY + row) * srcW + srcX) * 4;\n const dstStart = ((dstY + row) * w + dstX) * 4;\n const chunk = src.subarray(srcStart, srcStart + rowLen);\n out.set(chunk, dstStart);\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dHJhY3RzIGEgc3BlY2lmaWMgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIGEgbGFyZ2VyIHtAbGluayBJbWFnZURhdGFMaWtlfVxuICogc291cmNlIGludG8gYSBuZXcge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fS5cbiAqXG4gKiBUaGlzIGlzIGEgXCJyZWFkLW9ubHlcIiBvcGVyYXRpb24gdGhhdCByZXR1cm5zIGEgY29weSBvZiB0aGUgcGl4ZWwgZGF0YS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHNvdXJjZSBpbWFnZSBkYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSByZWN0IC0gQSByZWN0IGRlZmluaW5nIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJHQkEgcGl4ZWwgZGF0YSBvZiB0aGUgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihpbWFnZURhdGE6IEltYWdlRGF0YUxpa2UsIHJlY3Q6IFJlY3QpOiBVaW50OENsYW1wZWRBcnJheTtcbi8qKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byByZWFkIGZyb20uXG4gKiBAcGFyYW0geCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHcgLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJHQkEgcGl4ZWwgZGF0YSBvZiB0aGUgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihpbWFnZURhdGE6IEltYWdlRGF0YUxpa2UsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IFVpbnQ4Q2xhbXBlZEFycmF5O1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbWFnZURhdGFCdWZmZXIoaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLCBfeDogUmVjdCB8IG51bWJlciwgX3k/OiBudW1iZXIsIF93PzogbnVtYmVyLCBfaD86IG51bWJlcik6IFVpbnQ4Q2xhbXBlZEFycmF5IHtcbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICB3LFxuICAgIGhcbiAgfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCcgPyBfeCA6IHtcbiAgICB4OiBfeCxcbiAgICB5OiBfeSEsXG4gICAgdzogX3chLFxuICAgIGg6IF9oIVxuICB9O1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuIG5ldyBVaW50OENsYW1wZWRBcnJheSgwKTtcbiAgY29uc3Qgc3JjVyA9IGltYWdlRGF0YS53aWR0aDtcbiAgY29uc3Qgc3JjSCA9IGltYWdlRGF0YS5oZWlnaHQ7XG4gIGNvbnN0IHNyYyA9IGltYWdlRGF0YS5kYXRhO1xuICBjb25zdCBvdXRMZW4gPSB3ICogaCAqIDQ7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShvdXRMZW4pO1xuICBsZXQgc3JjWCA9IHg7XG4gIGxldCBzcmNZID0geTtcbiAgbGV0IGRzdFggPSAwO1xuICBsZXQgZHN0WSA9IDA7XG4gIGxldCBjb3B5VyA9IHc7XG4gIGxldCBjb3B5SCA9IGg7XG4gIGlmIChzcmNYIDwgMCkge1xuICAgIGRzdFggPSAtc3JjWDtcbiAgICBjb3B5VyArPSBzcmNYO1xuICAgIHNyY1ggPSAwO1xuICB9XG4gIGlmIChzcmNZIDwgMCkge1xuICAgIGRzdFkgPSAtc3JjWTtcbiAgICBjb3B5SCArPSBzcmNZO1xuICAgIHNyY1kgPSAwO1xuICB9XG4gIGNvcHlXID0gTWF0aC5taW4oY29weVcsIHNyY1cgLSBzcmNYKTtcbiAgY29weUggPSBNYXRoLm1pbihjb3B5SCwgc3JjSCAtIHNyY1kpO1xuICBpZiAoY29weVcgPD0gMCB8fCBjb3B5SCA8PSAwKSByZXR1cm4gb3V0O1xuXG4gIC8vIDIuIFBlcmZvcm0gaGlnaC1zcGVlZCBibG9jayBjb3B5XG4gIC8vIEF0dGVtcHQgdG8gdXNlIGEgMzItYml0IHZpZXcgaWYgdGhlIGJ1ZmZlciBpcyBtZW1vcnktYWxpZ25lZC5cbiAgLy8gVGhpcyByZWR1Y2VzIGxvb3AgaXRlcmF0aW9ucyBhbmQgYXJpdGhtZXRpYyBieSA0eC5cbiAgY29uc3QgaXNBbGlnbmVkID0gc3JjLmJ5dGVPZmZzZXQgJSA0ID09PSAwO1xuICBpZiAoaXNBbGlnbmVkKSB7XG4gICAgY29uc3Qgc3JjTGVuMzIgPSBzcmMuYnl0ZUxlbmd0aCAvIDQ7XG4gICAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc3JjLmJ1ZmZlciwgc3JjLmJ5dGVPZmZzZXQsIHNyY0xlbjMyKTtcbiAgICBjb25zdCBvdXQzMiA9IG5ldyBVaW50MzJBcnJheShvdXQuYnVmZmVyKTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1g7XG4gICAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICsgcm93KSAqIHcgKyBkc3RYO1xuICAgICAgY29uc3QgY2h1bmsgPSBzcmMzMi5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5Vyk7XG4gICAgICBvdXQzMi5zZXQoY2h1bmssIGRzdFN0YXJ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2sgZm9yIHVuYWxpZ25lZCBkYXRhXG4gICAgY29uc3Qgcm93TGVuID0gY29weVcgKiA0O1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgICAgY29uc3Qgc3JjU3RhcnQgPSAoKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1gpICogNDtcbiAgICAgIGNvbnN0IGRzdFN0YXJ0ID0gKChkc3RZICsgcm93KSAqIHcgKyBkc3RYKSAqIDQ7XG4gICAgICBjb25zdCBjaHVuayA9IHNyYy5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pO1xuICAgICAgb3V0LnNldChjaHVuaywgZHN0U3RhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Rect } from '../Rect/_rect-types';\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}\nexport interface BaseMask {\n readonly type: MaskType;\n readonly data: Uint8Array;\n readonly w: number;\n readonly h: number;\n}\nexport type Mask = BinaryMask | AlphaMask;\n\n/** Strictly 0 or 1 */\nexport interface BinaryMask extends BaseMask {\n readonly type: MaskType.BINARY;\n}\n\n/** Strictly 0-255 */\nexport interface AlphaMask extends BaseMask {\n readonly type: MaskType.ALPHA;\n}\nexport interface MutableMask<T extends MaskType> {\n readonly type: T;\n data: Uint8Array;\n w: number;\n h: number;\n}\nexport interface MutableAlphaMask extends MutableMask<MaskType.ALPHA> {}\nexport interface MutableBinaryMask extends MutableMask<MaskType.BINARY> {}\nexport type MaskRect<T extends MaskType> = Rect & {\n type: T;\n data: Uint8Array;\n};\nexport type BinaryMaskRect = MaskRect<MaskType.BINARY>;\nexport type AlphaMaskRect = MaskRect<MaskType.ALPHA>;\nexport type NullableBinaryMaskRect = Rect & ({\n type: MaskType.BINARY;\n data: Uint8Array;\n} | {\n type?: null;\n data?: null;\n});\nexport type NullableMaskRect = Rect & ({\n type: MaskType;\n data: Uint8Array;\n} | {\n type?: null;\n data?: null;\n});\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlY3QgfSBmcm9tICcuLi9SZWN0L19yZWN0LXR5cGVzJztcblxuLyoqXG4gKiBEZWZpbmVzIGhvdyBtYXNrIHZhbHVlcyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgZHVyaW5nIGEgZHJhdyBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBlbnVtIE1hc2tUeXBlIHtcbiAgLyoqXG4gICAqIFZhbHVlcyBhcmUgdHJlYXRlZCBhcyBhbHBoYSB3ZWlnaHRzLlxuICAgKiAwIGlzIHNraXBwZWQsIHZhbHVlcyA+IDAgYXJlIHByb2Nlc3NlZC5cbiAgICovXG4gIEFMUEhBLFxuICAvKipcbiAgICogIFZhbHVlcyBhcmUgdHJlYXRlZCBhcyBvbi9vZmYuXG4gICAqIDAgaXMgZnVsbHkgdHJhbnNwYXJlbnQgKHNraXBwZWQpLCBhbnkgb3RoZXIgdmFsdWUgaXMgZnVsbHkgb3BhcXVlLlxuICAgKi9cbiAgQklOQVJZLFxufVxuZXhwb3J0IGludGVyZmFjZSBCYXNlTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlO1xuICByZWFkb25seSBkYXRhOiBVaW50OEFycmF5O1xuICByZWFkb25seSB3OiBudW1iZXI7XG4gIHJlYWRvbmx5IGg6IG51bWJlcjtcbn1cbmV4cG9ydCB0eXBlIE1hc2sgPSBCaW5hcnlNYXNrIHwgQWxwaGFNYXNrO1xuXG4vKiogU3RyaWN0bHkgMCBvciAxICovXG5leHBvcnQgaW50ZXJmYWNlIEJpbmFyeU1hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkJJTkFSWTtcbn1cblxuLyoqIFN0cmljdGx5IDAtMjU1ICovXG5leHBvcnQgaW50ZXJmYWNlIEFscGhhTWFzayBleHRlbmRzIEJhc2VNYXNrIHtcbiAgcmVhZG9ubHkgdHlwZTogTWFza1R5cGUuQUxQSEE7XG59XG5leHBvcnQgaW50ZXJmYWNlIE11dGFibGVNYXNrPFQgZXh0ZW5kcyBNYXNrVHlwZT4ge1xuICByZWFkb25seSB0eXBlOiBUO1xuICBkYXRhOiBVaW50OEFycmF5O1xuICB3OiBudW1iZXI7XG4gIGg6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgTXV0YWJsZUFscGhhTWFzayBleHRlbmRzIE11dGFibGVNYXNrPE1hc2tUeXBlLkFMUEhBPiB7fVxuZXhwb3J0IGludGVyZmFjZSBNdXRhYmxlQmluYXJ5TWFzayBleHRlbmRzIE11dGFibGVNYXNrPE1hc2tUeXBlLkJJTkFSWT4ge31cbmV4cG9ydCB0eXBlIE1hc2tSZWN0PFQgZXh0ZW5kcyBNYXNrVHlwZT4gPSBSZWN0ICYge1xuICB0eXBlOiBUO1xuICBkYXRhOiBVaW50OEFycmF5O1xufTtcbmV4cG9ydCB0eXBlIEJpbmFyeU1hc2tSZWN0ID0gTWFza1JlY3Q8TWFza1R5cGUuQklOQVJZPjtcbmV4cG9ydCB0eXBlIEFscGhhTWFza1JlY3QgPSBNYXNrUmVjdDxNYXNrVHlwZS5BTFBIQT47XG5leHBvcnQgdHlwZSBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0ID0gUmVjdCAmICh7XG4gIHR5cGU6IE1hc2tUeXBlLkJJTkFSWTtcbiAgZGF0YTogVWludDhBcnJheTtcbn0gfCB7XG4gIHR5cGU/OiBudWxsO1xuICBkYXRhPzogbnVsbDtcbn0pO1xuZXhwb3J0IHR5cGUgTnVsbGFibGVNYXNrUmVjdCA9IFJlY3QgJiAoe1xuICB0eXBlOiBNYXNrVHlwZTtcbiAgZGF0YTogVWludDhBcnJheTtcbn0gfCB7XG4gIHR5cGU/OiBudWxsO1xuICBkYXRhPzogbnVsbDtcbn0pOyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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 maskBuffer - 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 extractMaskBuffer(maskBuffer: Uint8Array, maskWidth: number, rect: Rect): Uint8Array;\n\n/**\n * @param maskBuffer - 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 extractMaskBuffer(maskBuffer: Uint8Array, maskWidth: number, x: number, y: number, w: number, h: number): Uint8Array;\nexport function extractMaskBuffer(maskBuffer: Uint8Array, maskWidth: number, xOrRect: number | Rect, y?: number, w?: number, h?: number): Uint8Array {\n let finalX: number;\n let finalY: number;\n let finalW: number;\n let finalH: number;\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 const out = new Uint8Array(finalW * finalH);\n const srcH = maskBuffer.length / maskWidth;\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row;\n if (currentSrcY < 0 || currentSrcY >= srcH) {\n continue;\n }\n const start = Math.max(0, finalX);\n const end = Math.min(maskWidth, finalX + finalW);\n if (start < end) {\n const srcOffset = currentSrcY * maskWidth + start;\n const dstOffset = row * finalW + (start - finalX);\n const count = end - start;\n out.set(maskBuffer.subarray(srcOffset, srcOffset + count), dstOffset);\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gYSAxRCB7QGxpbmsgVWludDhBcnJheX0gbWFzay5cbiAqIFRoaXMgdXRpbGl0eSBjYWxjdWxhdGVzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0cyBiYXNlZCBvbiB0aGUgYG1hc2tXaWR0aGAgdG9cbiAqIHNsaWNlIG91dCBhIHNwZWNpZmljIGFyZWEuXG4gKlxuICogQHBhcmFtIG1hc2tCdWZmZXIgLSBUaGUgc291cmNlIDFEIGFycmF5IHJlcHJlc2VudGluZyB0aGUgZnVsbCAyRCBtYXNrLlxuICogQHBhcmFtIG1hc2tXaWR0aCAtIFRoZSB3aWR0aCBvZiB0aGUgb3JpZ2luYWwgc291cmNlIG1hc2sgKHN0cmlkZSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEge0BsaW5rIFJlY3R9IG9iamVjdCBkZWZpbmluZyB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgVWludDhBcnJheX0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNYXNrQnVmZmVyKG1hc2tCdWZmZXI6IFVpbnQ4QXJyYXksIG1hc2tXaWR0aDogbnVtYmVyLCByZWN0OiBSZWN0KTogVWludDhBcnJheTtcblxuLyoqXG4gKiBAcGFyYW0gbWFza0J1ZmZlciAtIFRoZSBzb3VyY2UgMUQgYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBmdWxsIDJEIG1hc2suXG4gKiBAcGFyYW0gbWFza1dpZHRoIC0gVGhlIHdpZHRoIG9mIHRoZSBvcmlnaW5hbCBzb3VyY2UgbWFzayAoc3RyaWRlKS5cbiAqIEBwYXJhbSB4IC0gVGhlIHN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcGFyYW0gaCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHJldHVybnMgQSBuZXcge0BsaW5rIFVpbnQ4QXJyYXl9IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFza0J1ZmZlcihtYXNrQnVmZmVyOiBVaW50OEFycmF5LCBtYXNrV2lkdGg6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDhBcnJheTtcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFza0J1ZmZlcihtYXNrQnVmZmVyOiBVaW50OEFycmF5LCBtYXNrV2lkdGg6IG51bWJlciwgeE9yUmVjdDogbnVtYmVyIHwgUmVjdCwgeT86IG51bWJlciwgdz86IG51bWJlciwgaD86IG51bWJlcik6IFVpbnQ4QXJyYXkge1xuICBsZXQgZmluYWxYOiBudW1iZXI7XG4gIGxldCBmaW5hbFk6IG51bWJlcjtcbiAgbGV0IGZpbmFsVzogbnVtYmVyO1xuICBsZXQgZmluYWxIOiBudW1iZXI7XG4gIGlmICh0eXBlb2YgeE9yUmVjdCA9PT0gJ29iamVjdCcpIHtcbiAgICBmaW5hbFggPSB4T3JSZWN0Lng7XG4gICAgZmluYWxZID0geE9yUmVjdC55O1xuICAgIGZpbmFsVyA9IHhPclJlY3QudztcbiAgICBmaW5hbEggPSB4T3JSZWN0Lmg7XG4gIH0gZWxzZSB7XG4gICAgZmluYWxYID0geE9yUmVjdDtcbiAgICBmaW5hbFkgPSB5ITtcbiAgICBmaW5hbFcgPSB3ITtcbiAgICBmaW5hbEggPSBoITtcbiAgfVxuICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheShmaW5hbFcgKiBmaW5hbEgpO1xuICBjb25zdCBzcmNIID0gbWFza0J1ZmZlci5sZW5ndGggLyBtYXNrV2lkdGg7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGZpbmFsSDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50U3JjWSA9IGZpbmFsWSArIHJvdztcbiAgICBpZiAoY3VycmVudFNyY1kgPCAwIHx8IGN1cnJlbnRTcmNZID49IHNyY0gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGZpbmFsWCk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4obWFza1dpZHRoLCBmaW5hbFggKyBmaW5hbFcpO1xuICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgY29uc3Qgc3JjT2Zmc2V0ID0gY3VycmVudFNyY1kgKiBtYXNrV2lkdGggKyBzdGFydDtcbiAgICAgIGNvbnN0IGRzdE9mZnNldCA9IHJvdyAqIGZpbmFsVyArIChzdGFydCAtIGZpbmFsWCk7XG4gICAgICBjb25zdCBjb3VudCA9IGVuZCAtIHN0YXJ0O1xuICAgICAgb3V0LnNldChtYXNrQnVmZmVyLnN1YmFycmF5KHNyY09mZnNldCwgc3JjT2Zmc2V0ICsgY291bnQpLCBkc3RPZmZzZXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { NullableMaskRect } from '../Mask/_mask-types';\nimport { extractMaskBuffer } from '../Mask/extractMaskBuffer';\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 NullableMaskRect}), the mask is physically\n * cropped and re-aligned using `extractMaskBuffer` 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 trimMaskRectBounds<T extends NullableMaskRect>(target: T, bounds: Rect): void {\n const originalX = target.x;\n const originalY = target.y;\n const originalW = target.w;\n const intersectedX = Math.max(target.x, bounds.x);\n const intersectedY = Math.max(target.y, bounds.y);\n const intersectedMaxX = Math.min(target.x + target.w, bounds.x + bounds.w);\n const intersectedMaxY = Math.min(target.y + target.h, bounds.y + bounds.h);\n\n // Intersection check\n if (intersectedMaxX <= intersectedX || intersectedMaxY <= intersectedY) {\n target.w = 0;\n target.h = 0;\n if ('data' in target && target.data) {\n target.data = new Uint8Array(0);\n }\n return;\n }\n const intersectedW = intersectedMaxX - intersectedX;\n const intersectedH = intersectedMaxY - intersectedY;\n const offsetX = intersectedX - originalX;\n const offsetY = intersectedY - originalY;\n target.x = intersectedX;\n target.y = intersectedY;\n target.w = intersectedW;\n target.h = intersectedH;\n if ('data' in target && target.data) {\n const currentMaskBuffer = extractMaskBuffer(target.data, originalW, offsetX, offsetY, intersectedW, intersectedH);\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 (currentMaskBuffer[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 target.data = new Uint8Array(0);\n return;\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 const newMaskBuffer = extractMaskBuffer(currentMaskBuffer, intersectedW, minX, minY, finalW, finalH);\n target.x += minX;\n target.y += minY;\n target.w = finalW;\n target.h = finalH;\n target.data = newMaskBuffer;\n } else {\n target.w = finalW;\n target.h = finalH;\n target.data = currentMaskBuffer;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE51bGxhYmxlTWFza1JlY3QgfSBmcm9tICcuLi9NYXNrL19tYXNrLXR5cGVzJztcbmltcG9ydCB7IGV4dHJhY3RNYXNrQnVmZmVyIH0gZnJvbSAnLi4vTWFzay9leHRyYWN0TWFza0J1ZmZlcic7XG4vKipcbiAqIEludGVyc2VjdHMgYSB0YXJnZXQgcmVjdGFuZ2xlIHdpdGggYSBib3VuZGFyeSwgdHJpbW1pbmcgZGltZW5zaW9ucyBhbmQgbWFza3MgaW4tcGxhY2UuXG4gKiBUaGlzIHV0aWxpdHkgY2FsY3VsYXRlcyB0aGUgYXhpcy1hbGlnbmVkIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZSBgdGFyZ2V0YCBhbmQgYGJvdW5kc2AuXG4gKiBJZiB0aGUgYHRhcmdldGAgaW5jbHVkZXMgYSBgbWFza2AgKGFzIGluIGEge0BsaW5rIE51bGxhYmxlTWFza1JlY3R9KSwgdGhlIG1hc2sgaXMgcGh5c2ljYWxseVxuICogY3JvcHBlZCBhbmQgcmUtYWxpZ25lZCB1c2luZyBgZXh0cmFjdE1hc2tCdWZmZXJgIHRvIG1hdGNoIHRoZSBuZXcgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgcmVjdGFuZ2xlIG9yIHNlbGVjdGlvbiBvYmplY3QgdG8gYmUgdHJpbW1lZC4gKipOb3RlOioqIFRoaXMgb2JqZWN0IGlzIG11dGF0ZWQgaW4tcGxhY2UuXG4gKiBAcGFyYW0gYm91bmRzIC0gVGhlIGJvdW5kYXJ5IHJlY3RhbmdsZSBkZWZpbmluZyB0aGUgbWF4aW11bSBhbGxvd2FibGUgYXJlYSAoZS5nLiwgY2FudmFzIGRpbWVuc2lvbnMpLlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHNlbGVjdGlvbiA9IHsgeDogLTEwLCB5OiAtMTAsIHc6IDUwLCBoOiA1MCwgbWFzazogbmV3IFVpbnQ4QXJyYXkoMjUwMCkgfTtcbiAqIGNvbnN0IGNhbnZhcyA9IHsgeDogMCwgeTogMCwgdzogMTAwLCBoOiAxMDAgfTtcbiAqIC8vIFNlbGVjdGlvbiB3aWxsIGJlIG1vdmVkIHRvICgwLDApIGFuZCByZXNpemVkIHRvIDQweDQwLlxuICogLy8gVGhlIG1hc2sgaXMgY3JvcHBlZCBieSAxMCBweCBvbiB0aGUgdG9wIGFuZCBsZWZ0LlxuICogdHJpbVJlY3RCb3VuZHMoc2VsZWN0aW9uLCBjYW52YXMpO1xuICovXG5leHBvcnQgZnVuY3Rpb24gdHJpbU1hc2tSZWN0Qm91bmRzPFQgZXh0ZW5kcyBOdWxsYWJsZU1hc2tSZWN0Pih0YXJnZXQ6IFQsIGJvdW5kczogUmVjdCk6IHZvaWQge1xuICBjb25zdCBvcmlnaW5hbFggPSB0YXJnZXQueDtcbiAgY29uc3Qgb3JpZ2luYWxZID0gdGFyZ2V0Lnk7XG4gIGNvbnN0IG9yaWdpbmFsVyA9IHRhcmdldC53O1xuICBjb25zdCBpbnRlcnNlY3RlZFggPSBNYXRoLm1heCh0YXJnZXQueCwgYm91bmRzLngpO1xuICBjb25zdCBpbnRlcnNlY3RlZFkgPSBNYXRoLm1heCh0YXJnZXQueSwgYm91bmRzLnkpO1xuICBjb25zdCBpbnRlcnNlY3RlZE1heFggPSBNYXRoLm1pbih0YXJnZXQueCArIHRhcmdldC53LCBib3VuZHMueCArIGJvdW5kcy53KTtcbiAgY29uc3QgaW50ZXJzZWN0ZWRNYXhZID0gTWF0aC5taW4odGFyZ2V0LnkgKyB0YXJnZXQuaCwgYm91bmRzLnkgKyBib3VuZHMuaCk7XG5cbiAgLy8gSW50ZXJzZWN0aW9uIGNoZWNrXG4gIGlmIChpbnRlcnNlY3RlZE1heFggPD0gaW50ZXJzZWN0ZWRYIHx8IGludGVyc2VjdGVkTWF4WSA8PSBpbnRlcnNlY3RlZFkpIHtcbiAgICB0YXJnZXQudyA9IDA7XG4gICAgdGFyZ2V0LmggPSAwO1xuICAgIGlmICgnZGF0YScgaW4gdGFyZ2V0ICYmIHRhcmdldC5kYXRhKSB7XG4gICAgICB0YXJnZXQuZGF0YSA9IG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaW50ZXJzZWN0ZWRXID0gaW50ZXJzZWN0ZWRNYXhYIC0gaW50ZXJzZWN0ZWRYO1xuICBjb25zdCBpbnRlcnNlY3RlZEggPSBpbnRlcnNlY3RlZE1heFkgLSBpbnRlcnNlY3RlZFk7XG4gIGNvbnN0IG9mZnNldFggPSBpbnRlcnNlY3RlZFggLSBvcmlnaW5hbFg7XG4gIGNvbnN0IG9mZnNldFkgPSBpbnRlcnNlY3RlZFkgLSBvcmlnaW5hbFk7XG4gIHRhcmdldC54ID0gaW50ZXJzZWN0ZWRYO1xuICB0YXJnZXQueSA9IGludGVyc2VjdGVkWTtcbiAgdGFyZ2V0LncgPSBpbnRlcnNlY3RlZFc7XG4gIHRhcmdldC5oID0gaW50ZXJzZWN0ZWRIO1xuICBpZiAoJ2RhdGEnIGluIHRhcmdldCAmJiB0YXJnZXQuZGF0YSkge1xuICAgIGNvbnN0IGN1cnJlbnRNYXNrQnVmZmVyID0gZXh0cmFjdE1hc2tCdWZmZXIodGFyZ2V0LmRhdGEsIG9yaWdpbmFsVywgb2Zmc2V0WCwgb2Zmc2V0WSwgaW50ZXJzZWN0ZWRXLCBpbnRlcnNlY3RlZEgpO1xuICAgIGxldCBtaW5YID0gaW50ZXJzZWN0ZWRXO1xuICAgIGxldCBtYXhYID0gLTE7XG4gICAgbGV0IG1pblkgPSBpbnRlcnNlY3RlZEg7XG4gICAgbGV0IG1heFkgPSAtMTtcblxuICAgIC8vIFNjYW4gZm9yIGNvbnRlbnRcbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IGludGVyc2VjdGVkSDsgeSsrKSB7XG4gICAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGludGVyc2VjdGVkVzsgeCsrKSB7XG4gICAgICAgIGlmIChjdXJyZW50TWFza0J1ZmZlclt5ICogaW50ZXJzZWN0ZWRXICsgeF0gIT09IDApIHtcbiAgICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICAgICAgaWYgKHkgPCBtaW5ZKSBtaW5ZID0geTtcbiAgICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gY29udGVudCBpcyBmb3VuZCAoYWxsIHplcm9zKVxuICAgIGlmIChtYXhYID09PSAtMSkge1xuICAgICAgdGFyZ2V0LncgPSAwO1xuICAgICAgdGFyZ2V0LmggPSAwO1xuICAgICAgdGFyZ2V0LmRhdGEgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZmluYWxXID0gbWF4WCAtIG1pblggKyAxO1xuICAgIGNvbnN0IGZpbmFsSCA9IG1heFkgLSBtaW5ZICsgMTtcblxuICAgIC8vIE9ubHkgc2hpZnQgYW5kIGNyb3AgaWYgdGhlIGNvbnRlbnQgaXMgc21hbGxlciB0aGFuIHRoZSBpbnRlcnNlY3Rpb25cbiAgICBpZiAoZmluYWxXICE9PSBpbnRlcnNlY3RlZFcgfHwgZmluYWxIICE9PSBpbnRlcnNlY3RlZEgpIHtcbiAgICAgIGNvbnN0IG5ld01hc2tCdWZmZXIgPSBleHRyYWN0TWFza0J1ZmZlcihjdXJyZW50TWFza0J1ZmZlciwgaW50ZXJzZWN0ZWRXLCBtaW5YLCBtaW5ZLCBmaW5hbFcsIGZpbmFsSCk7XG4gICAgICB0YXJnZXQueCArPSBtaW5YO1xuICAgICAgdGFyZ2V0LnkgKz0gbWluWTtcbiAgICAgIHRhcmdldC53ID0gZmluYWxXO1xuICAgICAgdGFyZ2V0LmggPSBmaW5hbEg7XG4gICAgICB0YXJnZXQuZGF0YSA9IG5ld01hc2tCdWZmZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldC53ID0gZmluYWxXO1xuICAgICAgdGFyZ2V0LmggPSBmaW5hbEg7XG4gICAgICB0YXJnZXQuZGF0YSA9IGN1cnJlbnRNYXNrQnVmZmVyO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { colorDistance } from '../color';\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer';\nimport { type BinaryMaskRect, MaskType } from '../Mask/_mask-types';\nimport { trimMaskRectBounds } from '../Rect/trimMaskRectBounds';\nexport type FloodFillResult = BinaryMaskRect & {\n startX: number;\n startY: number;\n pixels: Uint8ClampedArray;\n};\n\n/**\n * Performs a color-based flood fill selection {@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 target - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param contiguous - If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param tolerance - The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param bounds - Optional bounding box to restrict the search area.\n * @param out output object\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(target: PixelData, startX: number, startY: number, contiguous = true, tolerance = 0, bounds?: Rect, out?: FloodFillResult): FloodFillResult | null {\n const data32 = target.data;\n const width = target.w;\n const height = target.h;\n const lx = bounds?.x ?? 0;\n const ly = bounds?.y ?? 0;\n const lw = bounds?.w ?? width;\n const lh = bounds?.h ?? height;\n const xMin = Math.max(0, lx);\n const xMax = Math.min(width - 1, lx + lw - 1);\n const yMin = Math.max(0, ly);\n const yMax = Math.min(height - 1, ly + lh - 1);\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null;\n }\n out = out ?? {} as FloodFillResult;\n const baseColor = data32[startY * width + startX] as Color32;\n let matchCount = 0;\n const matchX = new Uint16Array(width * height);\n const matchY = new Uint16Array(width * height);\n let minX = startX;\n let maxX = startX;\n let minY = startY;\n let maxY = startY;\n if (contiguous) {\n const visited = new Uint8Array(width * height);\n const stack = new Uint32Array(width * height);\n let stackPtr = 0;\n stack[stackPtr++] = startY << 16 | startX;\n visited[startY * width + startX] = 1;\n while (stackPtr > 0) {\n const val = stack[--stackPtr];\n const x = val & 0xFFFF;\n const y = val >>> 16;\n matchX[matchCount] = x;\n matchY[matchCount] = y;\n matchCount++;\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 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 (matchCount === 0) return null;\n const w = maxX - minX + 1;\n const h = maxY - minY + 1;\n out.startX = startX;\n out.startY = startY;\n out.x = minX;\n out.y = minY;\n out.w = w;\n out.h = h;\n out.data = new Uint8Array(w * h);\n out.type = MaskType.BINARY;\n const finalMask = out.data;\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - minX;\n const my = matchY[i] - minY;\n if (mx >= 0 && mx < w && my >= 0 && my < h) {\n finalMask[my * w + mx] = 1;\n }\n }\n trimMaskRectBounds(out, {\n x: 0,\n y: 0,\n w: width,\n h: height\n });\n out.pixels = extractImageDataBuffer(target.imageData, out.x, out.y, out.w, out.h);\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgY29sb3JEaXN0YW5jZSB9IGZyb20gJy4uL2NvbG9yJztcbmltcG9ydCB7IGV4dHJhY3RJbWFnZURhdGFCdWZmZXIgfSBmcm9tICcuLi9JbWFnZURhdGEvZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcic7XG5pbXBvcnQgeyB0eXBlIEJpbmFyeU1hc2tSZWN0LCBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgdHJpbU1hc2tSZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltTWFza1JlY3RCb3VuZHMnO1xuZXhwb3J0IHR5cGUgRmxvb2RGaWxsUmVzdWx0ID0gQmluYXJ5TWFza1JlY3QgJiB7XG4gIHN0YXJ0WDogbnVtYmVyO1xuICBzdGFydFk6IG51bWJlcjtcbiAgcGl4ZWxzOiBVaW50OENsYW1wZWRBcnJheTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBjb2xvci1iYXNlZCBmbG9vZCBmaWxsIHNlbGVjdGlvbiB7QGxpbmsgUGl4ZWxEYXRhfS5cbiAqIFRoaXMgdXRpbGl0eSBpZGVudGlmaWVzIHBpeGVscyBzdGFydGluZyBmcm9tIGEgc3BlY2lmaWMgY29vcmRpbmF0ZSB0aGF0IGZhbGwgd2l0aGluIGFcbiAqIGNvbG9yIHRvbGVyYW5jZS4gSXQgY2FuIG9wZXJhdGUgaW4gXCJjb250aWd1b3VzXCIgbW9kZSAoY2xhc3NpYyBidWNrZXQgZmlsbCkgb3JcbiAqIFwibm9uLWNvbnRpZ3VvdXNcIiBtb2RlIChzZWxlY3RzIGFsbCBtYXRjaGluZyBwaXhlbHMgaW4gdGhlIGJ1ZmZlcikuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byBwcm9jZXNzLlxuICogQHBhcmFtIHN0YXJ0WCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gc3RhcnRZIC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gY29udGlndW91cyAtIElmIHRydWUsIG9ubHkgY29ubmVjdGVkIHBpeGVscyBhcmVcbiAqIHNlbGVjdGVkLiBJZiBmYWxzZSwgYWxsIHBpeGVscyB3aXRoaW4gdG9sZXJhbmNlIGFyZSBzZWxlY3RlZCByZWdhcmRsZXNzIG9mIHBvc2l0aW9uLlxuICogQHBhcmFtIHRvbGVyYW5jZSAtIFRoZSBtYXhpbXVtIGFsbG93ZWQgZGlmZmVyZW5jZSBpbiBjb2xvclxuICogZGlzdGFuY2UgKDAtMjU1KSBmb3IgYSBwaXhlbCB0byBiZSBpbmNsdWRlZC5cbiAqIEBwYXJhbSBib3VuZHMgLSBPcHRpb25hbCBib3VuZGluZyBib3ggdG8gcmVzdHJpY3QgdGhlIHNlYXJjaCBhcmVhLlxuICogQHBhcmFtIG91dCBvdXRwdXQgb2JqZWN0XG4gKiBAcmV0dXJucyBBIHtAbGluayBGbG9vZEZpbGxSZXN1bHR9IGNvbnRhaW5pbmcgdGhlIG1hc2sgYW5kIGJvdW5kcyBvZiB0aGUgc2VsZWN0aW9uLFxuICogb3IgYG51bGxgIGlmIHRoZSBzdGFydGluZyBjb29yZGluYXRlcyBhcmUgb3V0IG9mIGJvdW5kcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gZmxvb2RGaWxsSW1hZ2VEYXRhU2VsZWN0aW9uKFxuICogY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMDAsIDEwMCksXG4gKiA1MCxcbiAqIDUwLFxuICoge1xuICogdG9sZXJhbmNlOiAyMCxcbiAqIGNvbnRpZ3VvdXM6IHRydWVcbiAqIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb29kRmlsbFNlbGVjdGlvbih0YXJnZXQ6IFBpeGVsRGF0YSwgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBjb250aWd1b3VzID0gdHJ1ZSwgdG9sZXJhbmNlID0gMCwgYm91bmRzPzogUmVjdCwgb3V0PzogRmxvb2RGaWxsUmVzdWx0KTogRmxvb2RGaWxsUmVzdWx0IHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEzMiA9IHRhcmdldC5kYXRhO1xuICBjb25zdCB3aWR0aCA9IHRhcmdldC53O1xuICBjb25zdCBoZWlnaHQgPSB0YXJnZXQuaDtcbiAgY29uc3QgbHggPSBib3VuZHM/LnggPz8gMDtcbiAgY29uc3QgbHkgPSBib3VuZHM/LnkgPz8gMDtcbiAgY29uc3QgbHcgPSBib3VuZHM/LncgPz8gd2lkdGg7XG4gIGNvbnN0IGxoID0gYm91bmRzPy5oID8/IGhlaWdodDtcbiAgY29uc3QgeE1pbiA9IE1hdGgubWF4KDAsIGx4KTtcbiAgY29uc3QgeE1heCA9IE1hdGgubWluKHdpZHRoIC0gMSwgbHggKyBsdyAtIDEpO1xuICBjb25zdCB5TWluID0gTWF0aC5tYXgoMCwgbHkpO1xuICBjb25zdCB5TWF4ID0gTWF0aC5taW4oaGVpZ2h0IC0gMSwgbHkgKyBsaCAtIDEpO1xuICBpZiAoc3RhcnRYIDwgeE1pbiB8fCBzdGFydFggPiB4TWF4IHx8IHN0YXJ0WSA8IHlNaW4gfHwgc3RhcnRZID4geU1heCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIG91dCA9IG91dCA/PyB7fSBhcyBGbG9vZEZpbGxSZXN1bHQ7XG4gIGNvbnN0IGJhc2VDb2xvciA9IGRhdGEzMltzdGFydFkgKiB3aWR0aCArIHN0YXJ0WF0gYXMgQ29sb3IzMjtcbiAgbGV0IG1hdGNoQ291bnQgPSAwO1xuICBjb25zdCBtYXRjaFggPSBuZXcgVWludDE2QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICBjb25zdCBtYXRjaFkgPSBuZXcgVWludDE2QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICBsZXQgbWluWCA9IHN0YXJ0WDtcbiAgbGV0IG1heFggPSBzdGFydFg7XG4gIGxldCBtaW5ZID0gc3RhcnRZO1xuICBsZXQgbWF4WSA9IHN0YXJ0WTtcbiAgaWYgKGNvbnRpZ3VvdXMpIHtcbiAgICBjb25zdCB2aXNpdGVkID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFVpbnQzMkFycmF5KHdpZHRoICogaGVpZ2h0KTtcbiAgICBsZXQgc3RhY2tQdHIgPSAwO1xuICAgIHN0YWNrW3N0YWNrUHRyKytdID0gc3RhcnRZIDw8IDE2IHwgc3RhcnRYO1xuICAgIHZpc2l0ZWRbc3RhcnRZICogd2lkdGggKyBzdGFydFhdID0gMTtcbiAgICB3aGlsZSAoc3RhY2tQdHIgPiAwKSB7XG4gICAgICBjb25zdCB2YWwgPSBzdGFja1stLXN0YWNrUHRyXTtcbiAgICAgIGNvbnN0IHggPSB2YWwgJiAweEZGRkY7XG4gICAgICBjb25zdCB5ID0gdmFsID4+PiAxNjtcbiAgICAgIG1hdGNoWFttYXRjaENvdW50XSA9IHg7XG4gICAgICBtYXRjaFlbbWF0Y2hDb3VudF0gPSB5O1xuICAgICAgbWF0Y2hDb3VudCsrO1xuICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcbiAgICAgIGlmICh4ID4gbWF4WCkgbWF4WCA9IHg7XG4gICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcblxuICAgICAgLy8gUmlnaHRcbiAgICAgIGlmICh4ICsgMSA8PSB4TWF4KSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiB3aWR0aCArICh4ICsgMSk7XG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxO1xuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0geSA8PCAxNiB8IHggKyAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBMZWZ0XG4gICAgICBpZiAoeCAtIDEgPj0geE1pbikge1xuICAgICAgICBjb25zdCBpZHggPSB5ICogd2lkdGggKyAoeCAtIDEpO1xuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMTtcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9IHkgPDwgMTYgfCB4IC0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gRG93blxuICAgICAgaWYgKHkgKyAxIDw9IHlNYXgpIHtcbiAgICAgICAgY29uc3QgaWR4ID0gKHkgKyAxKSAqIHdpZHRoICsgeDtcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDE7XG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSB5ICsgMSA8PCAxNiB8IHg7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFVwXG4gICAgICBpZiAoeSAtIDEgPj0geU1pbikge1xuICAgICAgICBjb25zdCBpZHggPSAoeSAtIDEpICogd2lkdGggKyB4O1xuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMTtcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9IHkgLSAxIDw8IDE2IHwgeDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCB5ID0geU1pbjsgeSA8PSB5TWF4OyB5KyspIHtcbiAgICAgIGZvciAobGV0IHggPSB4TWluOyB4IDw9IHhNYXg7IHgrKykge1xuICAgICAgICBjb25zdCBjb2xvciA9IGRhdGEzMlt5ICogd2lkdGggKyB4XSBhcyBDb2xvcjMyO1xuICAgICAgICBpZiAoY29sb3JEaXN0YW5jZShjb2xvciwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICBtYXRjaFhbbWF0Y2hDb3VudF0gPSB4O1xuICAgICAgICAgIG1hdGNoWVttYXRjaENvdW50XSA9IHk7XG4gICAgICAgICAgbWF0Y2hDb3VudCsrO1xuICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKG1hdGNoQ291bnQgPT09IDApIHJldHVybiBudWxsO1xuICBjb25zdCB3ID0gbWF4WCAtIG1pblggKyAxO1xuICBjb25zdCBoID0gbWF4WSAtIG1pblkgKyAxO1xuICBvdXQuc3RhcnRYID0gc3RhcnRYO1xuICBvdXQuc3RhcnRZID0gc3RhcnRZO1xuICBvdXQueCA9IG1pblg7XG4gIG91dC55ID0gbWluWTtcbiAgb3V0LncgPSB3O1xuICBvdXQuaCA9IGg7XG4gIG91dC5kYXRhID0gbmV3IFVpbnQ4QXJyYXkodyAqIGgpO1xuICBvdXQudHlwZSA9IE1hc2tUeXBlLkJJTkFSWTtcbiAgY29uc3QgZmluYWxNYXNrID0gb3V0LmRhdGE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbWF0Y2hDb3VudDsgaSsrKSB7XG4gICAgY29uc3QgbXggPSBtYXRjaFhbaV0gLSBtaW5YO1xuICAgIGNvbnN0IG15ID0gbWF0Y2hZW2ldIC0gbWluWTtcbiAgICBpZiAobXggPj0gMCAmJiBteCA8IHcgJiYgbXkgPj0gMCAmJiBteSA8IGgpIHtcbiAgICAgIGZpbmFsTWFza1tteSAqIHcgKyBteF0gPSAxO1xuICAgIH1cbiAgfVxuICB0cmltTWFza1JlY3RCb3VuZHMob3V0LCB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IHdpZHRoLFxuICAgIGg6IGhlaWdodFxuICB9KTtcbiAgb3V0LnBpeGVscyA9IGV4dHJhY3RJbWFnZURhdGFCdWZmZXIodGFyZ2V0LmltYWdlRGF0YSwgb3V0LngsIG91dC55LCBvdXQudywgb3V0LmgpO1xuICByZXR1cm4gb3V0O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Iterates through a line with sub-pixel precision.\n * Guarantees that the first and last points are exactly (x0, y0) and (x1, y1).\n */\nexport function forEachLinePoint(x0: number, y0: number, x1: number, y1: number, callback: (x: number, y: number) => void): void {\n if (x0 === x1 && y0 === y1) {\n callback(x0, y0);\n return;\n }\n const dx = x1 - x0;\n const dy = y1 - y0;\n\n // Determine the number of steps based on the longest axis\n const steps = Math.max(Math.abs(dx), Math.abs(dy));\n const xInc = dx / steps;\n const yInc = dy / steps;\n let curX = x0;\n let curY = y0;\n\n // We add +1 to the loop to ensure we reach the final (x1, y1)\n for (let i = 0; i <= steps; i++) {\n callback(curX, curY);\n curX += xInc;\n curY += yInc;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggYSBsaW5lIHdpdGggc3ViLXBpeGVsIHByZWNpc2lvbi5cbiAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBleGFjdGx5ICh4MCwgeTApIGFuZCAoeDEsIHkxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hMaW5lUG9pbnQoeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgY2FsbGJhY2s6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICBpZiAoeDAgPT09IHgxICYmIHkwID09PSB5MSkge1xuICAgIGNhbGxiYWNrKHgwLCB5MCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGR4ID0geDEgLSB4MDtcbiAgY29uc3QgZHkgPSB5MSAtIHkwO1xuXG4gIC8vIERldGVybWluZSB0aGUgbnVtYmVyIG9mIHN0ZXBzIGJhc2VkIG9uIHRoZSBsb25nZXN0IGF4aXNcbiAgY29uc3Qgc3RlcHMgPSBNYXRoLm1heChNYXRoLmFicyhkeCksIE1hdGguYWJzKGR5KSk7XG4gIGNvbnN0IHhJbmMgPSBkeCAvIHN0ZXBzO1xuICBjb25zdCB5SW5jID0gZHkgLyBzdGVwcztcbiAgbGV0IGN1clggPSB4MDtcbiAgbGV0IGN1clkgPSB5MDtcblxuICAvLyBXZSBhZGQgKzEgdG8gdGhlIGxvb3AgdG8gZW5zdXJlIHdlIHJlYWNoIHRoZSBmaW5hbCAoeDEsIHkxKVxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gICAgY2FsbGJhY2soY3VyWCwgY3VyWSk7XG4gICAgY3VyWCArPSB4SW5jO1xuICAgIGN1clkgKz0geUluYztcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { MutablePixelData32, PixelData32 } from '../PixelData/_pixelData-types';\nexport function resampleUint32Array<T extends PixelData32, M extends MutablePixelData32>(srcData32: Uint32Array, srcW: number, srcH: number, factor: number, out?: M): T {\n const dstW = Math.max(1, srcW * factor | 0);\n const dstH = Math.max(1, srcH * factor | 0);\n const dstData = new Uint32Array(dstW * dstH);\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW;\n const scaleY = srcH / dstH;\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, y * scaleY | 0);\n const srcRowOffset = srcY * srcW;\n const dstRowOffset = y * dstW;\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, x * scaleX | 0);\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!;\n }\n }\n out = out ?? {} as M;\n out.data = dstData;\n out.w = dstW;\n out.h = dstH;\n return out as unknown as T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE11dGFibGVQaXhlbERhdGEzMiwgUGl4ZWxEYXRhMzIgfSBmcm9tICcuLi9QaXhlbERhdGEvX3BpeGVsRGF0YS10eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVVaW50MzJBcnJheTxUIGV4dGVuZHMgUGl4ZWxEYXRhMzIsIE0gZXh0ZW5kcyBNdXRhYmxlUGl4ZWxEYXRhMzI+KHNyY0RhdGEzMjogVWludDMyQXJyYXksIHNyY1c6IG51bWJlciwgc3JjSDogbnVtYmVyLCBmYWN0b3I6IG51bWJlciwgb3V0PzogTSk6IFQge1xuICBjb25zdCBkc3RXID0gTWF0aC5tYXgoMSwgc3JjVyAqIGZhY3RvciB8IDApO1xuICBjb25zdCBkc3RIID0gTWF0aC5tYXgoMSwgc3JjSCAqIGZhY3RvciB8IDApO1xuICBjb25zdCBkc3REYXRhID0gbmV3IFVpbnQzMkFycmF5KGRzdFcgKiBkc3RIKTtcblxuICAvLyBVc2UgdGhlIHJlY2lwcm9jYWwgdG8gbWFwIGJhY2sgcHJlY2lzZWx5XG4gIGNvbnN0IHNjYWxlWCA9IHNyY1cgLyBkc3RXO1xuICBjb25zdCBzY2FsZVkgPSBzcmNIIC8gZHN0SDtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBkc3RIOyB5KyspIHtcbiAgICBjb25zdCBzcmNZID0gTWF0aC5taW4oc3JjSCAtIDEsIHkgKiBzY2FsZVkgfCAwKTtcbiAgICBjb25zdCBzcmNSb3dPZmZzZXQgPSBzcmNZICogc3JjVztcbiAgICBjb25zdCBkc3RSb3dPZmZzZXQgPSB5ICogZHN0VztcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGRzdFc7IHgrKykge1xuICAgICAgY29uc3Qgc3JjWCA9IE1hdGgubWluKHNyY1cgLSAxLCB4ICogc2NhbGVYIHwgMCk7XG4gICAgICBkc3REYXRhW2RzdFJvd09mZnNldCArIHhdID0gc3JjRGF0YTMyW3NyY1Jvd09mZnNldCArIHNyY1hdITtcbiAgICB9XG4gIH1cbiAgb3V0ID0gb3V0ID8/IHt9IGFzIE07XG4gIG91dC5kYXRhID0gZHN0RGF0YTtcbiAgb3V0LncgPSBkc3RXO1xuICBvdXQuaCA9IGRzdEg7XG4gIHJldHVybiBvdXQgYXMgdW5rbm93biBhcyBUO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22,\n sourceIn: 23,\n sourceOut: 24,\n sourceAtop: 25,\n destinationOver: 26,\n destinationIn: 27,\n destinationOut: 28,\n destinationAtop: 29,\n xor: 30\n} as const;\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>;\nexport const overwriteBase: BlendColor32 = (src, _dst) => src;\noverwriteBase.isOverwrite = true;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQmFzZUJsZW5kTW9kZSA9IHtcbiAgb3ZlcndyaXRlOiAwLFxuICBzb3VyY2VPdmVyOiAxLFxuICBkYXJrZW46IDIsXG4gIG11bHRpcGx5OiAzLFxuICBjb2xvckJ1cm46IDQsXG4gIGxpbmVhckJ1cm46IDUsXG4gIGRhcmtlckNvbG9yOiA2LFxuICBsaWdodGVuOiA3LFxuICBzY3JlZW46IDgsXG4gIGNvbG9yRG9kZ2U6IDksXG4gIGxpbmVhckRvZGdlOiAxMCxcbiAgbGlnaHRlckNvbG9yOiAxMSxcbiAgb3ZlcmxheTogMTIsXG4gIHNvZnRMaWdodDogMTMsXG4gIGhhcmRMaWdodDogMTQsXG4gIHZpdmlkTGlnaHQ6IDE1LFxuICBsaW5lYXJMaWdodDogMTYsXG4gIHBpbkxpZ2h0OiAxNyxcbiAgaGFyZE1peDogMTgsXG4gIGRpZmZlcmVuY2U6IDE5LFxuICBleGNsdXNpb246IDIwLFxuICBzdWJ0cmFjdDogMjEsXG4gIGRpdmlkZTogMjIsXG4gIHNvdXJjZUluOiAyMyxcbiAgc291cmNlT3V0OiAyNCxcbiAgc291cmNlQXRvcDogMjUsXG4gIGRlc3RpbmF0aW9uT3ZlcjogMjYsXG4gIGRlc3RpbmF0aW9uSW46IDI3LFxuICBkZXN0aW5hdGlvbk91dDogMjgsXG4gIGRlc3RpbmF0aW9uQXRvcDogMjksXG4gIHhvcjogMzBcbn0gYXMgY29uc3Q7XG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVkQmxlbmRNb2RlcyB7XG4gIG92ZXJ3cml0ZTogMDtcbn1cbmV4cG9ydCB0eXBlIEJhc2VCbGVuZE1vZGVzID0gUmVxdWlyZWRCbGVuZE1vZGVzICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVCYXNlOiBCbGVuZENvbG9yMzIgPSAoc3JjLCBfZHN0KSA9PiBzcmM7XG5vdmVyd3JpdGVCYXNlLmlzT3ZlcndyaXRlID0gdHJ1ZTsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { BlendColor32 } from '../_types';\nimport type { BaseBlendModes } from './blend-modes';\nexport type BlendModeRegistry<BlendModes extends BaseBlendModes = BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>;\nexport function makeBlendModeRegistry<BlendModes extends BaseBlendModes, Name extends keyof BlendModes = keyof BlendModes, Index extends BlendModes[Name] = BlendModes[Name]>(blendModes: BlendModes, initialEntries: Record<Index, BlendColor32>, registryName = 'anonymous') {\n const blendToName = new Map<BlendColor32, Name>();\n const blendToIndex = new Map<BlendColor32, Index>();\n const indexToName: Name[] = [];\n const indexToBlend: BlendColor32[] = [];\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 };\n const nameToIndex = {} as Record<Name, Index>;\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`);\n }\n indexToName[index] = name;\n indexToBlend[index] = blendFn;\n blendToIndex.set(blendFn, index);\n blendToName.set(blendFn, name);\n nameToBlend[name] = blendFn;\n nameToIndex[name] = index;\n };\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index];\n add(name as Name, index as Index, blend);\n }\n return {\n registryName,\n nameToBlend,\n nameToIndex,\n blendToIndex,\n blendToName,\n indexToBlend,\n indexToName,\n indexType: null as unknown as Index,\n nameType: null as unknown as Name\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJsZW5kQ29sb3IzMiB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgdHlwZSB7IEJhc2VCbGVuZE1vZGVzIH0gZnJvbSAnLi9ibGVuZC1tb2Rlcyc7XG5leHBvcnQgdHlwZSBCbGVuZE1vZGVSZWdpc3RyeTxCbGVuZE1vZGVzIGV4dGVuZHMgQmFzZUJsZW5kTW9kZXMgPSBCYXNlQmxlbmRNb2RlcywgTmFtZSBleHRlbmRzIGtleW9mIEJsZW5kTW9kZXMgPSBrZXlvZiBCbGVuZE1vZGVzLCBJbmRleCBleHRlbmRzIEJsZW5kTW9kZXNbTmFtZV0gPSBCbGVuZE1vZGVzW05hbWVdPiA9IFJldHVyblR5cGU8dHlwZW9mIG1ha2VCbGVuZE1vZGVSZWdpc3RyeTxCbGVuZE1vZGVzLCBOYW1lLCBJbmRleD4+O1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VCbGVuZE1vZGVSZWdpc3RyeTxCbGVuZE1vZGVzIGV4dGVuZHMgQmFzZUJsZW5kTW9kZXMsIE5hbWUgZXh0ZW5kcyBrZXlvZiBCbGVuZE1vZGVzID0ga2V5b2YgQmxlbmRNb2RlcywgSW5kZXggZXh0ZW5kcyBCbGVuZE1vZGVzW05hbWVdID0gQmxlbmRNb2Rlc1tOYW1lXT4oYmxlbmRNb2RlczogQmxlbmRNb2RlcywgaW5pdGlhbEVudHJpZXM6IFJlY29yZDxJbmRleCwgQmxlbmRDb2xvcjMyPiwgcmVnaXN0cnlOYW1lID0gJ2Fub255bW91cycpIHtcbiAgY29uc3QgYmxlbmRUb05hbWUgPSBuZXcgTWFwPEJsZW5kQ29sb3IzMiwgTmFtZT4oKTtcbiAgY29uc3QgYmxlbmRUb0luZGV4ID0gbmV3IE1hcDxCbGVuZENvbG9yMzIsIEluZGV4PigpO1xuICBjb25zdCBpbmRleFRvTmFtZTogTmFtZVtdID0gW107XG4gIGNvbnN0IGluZGV4VG9CbGVuZDogQmxlbmRDb2xvcjMyW10gPSBbXTtcbiAgY29uc3QgbmFtZVRvQmxlbmQgPSB7fSBhcyB7IFtLIGluIGtleW9mIEJsZW5kTW9kZXNdOiBCbGVuZENvbG9yMzIgfTtcbiAgY29uc3QgbmFtZVRvSW5kZXggPSB7fSBhcyBSZWNvcmQ8TmFtZSwgSW5kZXg+O1xuICBjb25zdCBhZGQgPSAobmFtZTogTmFtZSwgaW5kZXg6IEluZGV4LCBibGVuZEZuOiBCbGVuZENvbG9yMzIpID0+IHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShpbmRleCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kZXggXCIke2luZGV4fVwiIGlzIG5vdCBhIG51bWJlci4gQXR0ZW1wdGluZyB0byBhZGQgbmFtZTogXCIke25hbWUgYXMgc3RyaW5nfVwiLCBpbmRleDogXCIke2luZGV4fVwiYCk7XG4gICAgfVxuICAgIGlmIChpbmRleFRvQmxlbmRbaW5kZXhdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEJsZW5kIE1vZGUgaW5kZXg6ICR7aW5kZXh9IGlzIGFscmVhZHkgdXNlZC4gQXR0ZW1wdGluZyB0byBhZGQgbmFtZTogXCIke25hbWUgYXMgc3RyaW5nfVwiLCBpbmRleDogXCIke2luZGV4fVwiYCk7XG4gICAgfVxuICAgIGluZGV4VG9OYW1lW2luZGV4XSA9IG5hbWU7XG4gICAgaW5kZXhUb0JsZW5kW2luZGV4XSA9IGJsZW5kRm47XG4gICAgYmxlbmRUb0luZGV4LnNldChibGVuZEZuLCBpbmRleCk7XG4gICAgYmxlbmRUb05hbWUuc2V0KGJsZW5kRm4sIG5hbWUpO1xuICAgIG5hbWVUb0JsZW5kW25hbWVdID0gYmxlbmRGbjtcbiAgICBuYW1lVG9JbmRleFtuYW1lXSA9IGluZGV4O1xuICB9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBpbmRleF0gb2YgT2JqZWN0LmVudHJpZXMoYmxlbmRNb2RlcykpIHtcbiAgICBjb25zdCBibGVuZCA9IGluaXRpYWxFbnRyaWVzW2luZGV4IGFzIEluZGV4XTtcbiAgICBhZGQobmFtZSBhcyBOYW1lLCBpbmRleCBhcyBJbmRleCwgYmxlbmQpO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVnaXN0cnlOYW1lLFxuICAgIG5hbWVUb0JsZW5kLFxuICAgIG5hbWVUb0luZGV4LFxuICAgIGJsZW5kVG9JbmRleCxcbiAgICBibGVuZFRvTmFtZSxcbiAgICBpbmRleFRvQmxlbmQsXG4gICAgaW5kZXhUb05hbWUsXG4gICAgaW5kZXhUeXBlOiBudWxsIGFzIHVua25vd24gYXMgSW5kZXgsXG4gICAgbmFtZVR5cGU6IG51bGwgYXMgdW5rbm93biBhcyBOYW1lXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwriteFast = overwriteBase;\nexport const sourceInFast: BlendColor32 = (src, dst) => {\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return 0 as Color32;\n if (da === 255) return src;\n const sa = src >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const r = sr * da >> 8;\n const g = sg * da >> 8;\n const b = sb * da >> 8;\n const a = sa * da >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const sourceOutFast: BlendColor32 = (src, dst) => {\n const da = dst >>> 24 & 0xFF;\n if (da === 255) return 0 as Color32;\n if (da === 0) return src;\n const sa = src >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const invDa = 255 - da;\n const r = sr * invDa >> 8;\n const g = sg * invDa >> 8;\n const b = sb * invDa >> 8;\n const a = sa * invDa >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const sourceAtopFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return 0 as Color32;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invSa = 255 - sa;\n const r = sr * da + dr * invSa >> 8;\n const g = sg * da + dg * invSa >> 8;\n const b = sb * da + db * invSa >> 8;\n return (da << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationOverFast: BlendColor32 = (src, dst) => {\n const da = dst >>> 24 & 0xFF;\n if (da === 255) return dst;\n if (da === 0) return src;\n const sa = src >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invDa = 255 - da;\n const r = dr * 255 + sr * invDa >> 8;\n const g = dg * 255 + sg * invDa >> 8;\n const b = db * 255 + sb * invDa >> 8;\n const a = da * 255 + sa * invDa >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationInFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return 0 as Color32;\n if (sa === 255) return dst;\n const da = dst >>> 24 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const r = dr * sa >> 8;\n const g = dg * sa >> 8;\n const b = db * sa >> 8;\n const a = da * sa >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationOutFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return 0 as Color32;\n if (sa === 0) return dst;\n const da = dst >>> 24 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invSa = 255 - sa;\n const r = dr * invSa >> 8;\n const g = dg * invSa >> 8;\n const b = db * invSa >> 8;\n const a = da * invSa >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationAtopFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return 0 as Color32; // Rule: Final Alpha = Sa\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return 0 as Color32;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invDa = 255 - da;\n const r = dr * sa + sr * invDa >> 8;\n const g = dg * sa + sg * invDa >> 8;\n const b = db * sa + sb * invDa >> 8;\n return (sa << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const xorFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invDa = 255 - da;\n const invSa = 255 - sa;\n const r = sr * invDa + dr * invSa >> 8;\n const g = sg * invDa + dg * invSa >> 8;\n const b = sb * invDa + db * invSa >> 8;\n const a = sa * invDa + da * invSa >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\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 const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\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 return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\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 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,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n 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 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 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 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 const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\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 if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\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 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,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n 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 const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\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 >> 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 return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n 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 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 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 if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 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,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brU = (src & 0xFF) + dr;\n const bgU = (src >>> 8 & 0xFF) + dg;\n const bbU = (src >>> 16 & 0xFF) + db;\n const br = brU > 255 ? 255 : brU;\n const bg = bgU > 255 ? 255 : bgU;\n const bb = 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 >> 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 return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterFast: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n 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 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 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 const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const bgU = dg + 2 * sg - 255;\n const bbU = db + 2 * sb - 255;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const brD = (src & 0xFF) - dr;\n const bgD = (src >>> 8 & 0xFF) - dg;\n const bbD = (src >>> 16 & 0xFF) - db;\n const br = brD < 0 ? -brD : brD;\n const bg = bgD < 0 ? -bgD : bgD;\n const bb = bbD < 0 ? -bbD : bbD;\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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const bgU = dg - sg;\n const bbU = db - sb;\n const br = brU < 0 ? 0 : brU;\n const bg = bgU < 0 ? 0 : bgU;\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 >> 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 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\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 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 return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n [BaseBlendMode.sourceIn]: sourceInFast,\n [BaseBlendMode.sourceOut]: sourceOutFast,\n [BaseBlendMode.sourceAtop]: sourceAtopFast,\n [BaseBlendMode.destinationOver]: destinationOverFast,\n [BaseBlendMode.destinationIn]: destinationInFast,\n [BaseBlendMode.destinationOut]: destinationOutFast,\n [BaseBlendMode.destinationAtop]: destinationAtopFast,\n [BaseBlendMode.xor]: xorFast,\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast\n};\nexport function makeFastBlendModeRegistry(name = 'fast') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSwgb3ZlcndyaXRlQmFzZSB9IGZyb20gJy4vYmxlbmQtbW9kZXMnO1xuaW1wb3J0IHsgbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5IH0gZnJvbSAnLi9CbGVuZE1vZGVSZWdpc3RyeSc7XG5leHBvcnQgY29uc3Qgb3ZlcndyaXRlRmFzdCA9IG92ZXJ3cml0ZUJhc2U7XG5leHBvcnQgY29uc3Qgc291cmNlSW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKGRhID09PSAwKSByZXR1cm4gMCBhcyBDb2xvcjMyO1xuICBpZiAoZGEgPT09IDI1NSkgcmV0dXJuIHNyYztcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGO1xuICBjb25zdCBzZyA9IHNyYyA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHIgPSBzciAqIGRhID4+IDg7XG4gIGNvbnN0IGcgPSBzZyAqIGRhID4+IDg7XG4gIGNvbnN0IGIgPSBzYiAqIGRhID4+IDg7XG4gIGNvbnN0IGEgPSBzYSAqIGRhID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VPdXRGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKGRhID09PSAyNTUpIHJldHVybiAwIGFzIENvbG9yMzI7XG4gIGlmIChkYSA9PT0gMCkgcmV0dXJuIHNyYztcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGO1xuICBjb25zdCBzZyA9IHNyYyA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGludkRhID0gMjU1IC0gZGE7XG4gIGNvbnN0IHIgPSBzciAqIGludkRhID4+IDg7XG4gIGNvbnN0IGcgPSBzZyAqIGludkRhID4+IDg7XG4gIGNvbnN0IGIgPSBzYiAqIGludkRhID4+IDg7XG4gIGNvbnN0IGEgPSBzYSAqIGludkRhID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VBdG9wRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGlmIChkYSA9PT0gMCkgcmV0dXJuIDAgYXMgQ29sb3IzMjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGO1xuICBjb25zdCBzZyA9IHNyYyA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRjtcbiAgY29uc3QgZGcgPSBkc3QgPj4+IDggJiAweEZGO1xuICBjb25zdCBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBpbnZTYSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gc3IgKiBkYSArIGRyICogaW52U2EgPj4gODtcbiAgY29uc3QgZyA9IHNnICogZGEgKyBkZyAqIGludlNhID4+IDg7XG4gIGNvbnN0IGIgPSBzYiAqIGRhICsgZGIgKiBpbnZTYSA+PiA4O1xuICByZXR1cm4gKGRhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRlc3RpbmF0aW9uT3ZlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBpZiAoZGEgPT09IDI1NSkgcmV0dXJuIGRzdDtcbiAgaWYgKGRhID09PSAwKSByZXR1cm4gc3JjO1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkY7XG4gIGNvbnN0IHNnID0gc3JjID4+PiA4ICYgMHhGRjtcbiAgY29uc3Qgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGludkRhID0gMjU1IC0gZGE7XG4gIGNvbnN0IHIgPSBkciAqIDI1NSArIHNyICogaW52RGEgPj4gODtcbiAgY29uc3QgZyA9IGRnICogMjU1ICsgc2cgKiBpbnZEYSA+PiA4O1xuICBjb25zdCBiID0gZGIgKiAyNTUgKyBzYiAqIGludkRhID4+IDg7XG4gIGNvbnN0IGEgPSBkYSAqIDI1NSArIHNhICogaW52RGEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRlc3RpbmF0aW9uSW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gMCBhcyBDb2xvcjMyO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHIgPSBkciAqIHNhID4+IDg7XG4gIGNvbnN0IGcgPSBkZyAqIHNhID4+IDg7XG4gIGNvbnN0IGIgPSBkYiAqIHNhID4+IDg7XG4gIGNvbnN0IGEgPSBkYSAqIHNhID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBkZXN0aW5hdGlvbk91dEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuIDAgYXMgQ29sb3IzMjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkY7XG4gIGNvbnN0IGRnID0gZHN0ID4+PiA4ICYgMHhGRjtcbiAgY29uc3QgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgaW52U2EgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGRyICogaW52U2EgPj4gODtcbiAgY29uc3QgZyA9IGRnICogaW52U2EgPj4gODtcbiAgY29uc3QgYiA9IGRiICogaW52U2EgPj4gODtcbiAgY29uc3QgYSA9IGRhICogaW52U2EgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRlc3RpbmF0aW9uQXRvcEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiAwIGFzIENvbG9yMzI7IC8vIFJ1bGU6IEZpbmFsIEFscGhhID0gU2FcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKGRhID09PSAwKSByZXR1cm4gMCBhcyBDb2xvcjMyO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkY7XG4gIGNvbnN0IHNnID0gc3JjID4+PiA4ICYgMHhGRjtcbiAgY29uc3Qgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGludkRhID0gMjU1IC0gZGE7XG4gIGNvbnN0IHIgPSBkciAqIHNhICsgc3IgKiBpbnZEYSA+PiA4O1xuICBjb25zdCBnID0gZGcgKiBzYSArIHNnICogaW52RGEgPj4gODtcbiAgY29uc3QgYiA9IGRiICogc2EgKyBzYiAqIGludkRhID4+IDg7XG4gIHJldHVybiAoc2EgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5leHBvcnQgY29uc3QgeG9yRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRjtcbiAgY29uc3Qgc2cgPSBzcmMgPj4+IDggJiAweEZGO1xuICBjb25zdCBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkY7XG4gIGNvbnN0IGRnID0gZHN0ID4+PiA4ICYgMHhGRjtcbiAgY29uc3QgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgaW52RGEgPSAyNTUgLSBkYTtcbiAgY29uc3QgaW52U2EgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IHNyICogaW52RGEgKyBkciAqIGludlNhID4+IDg7XG4gIGNvbnN0IGcgPSBzZyAqIGludkRhICsgZGcgKiBpbnZTYSA+PiA4O1xuICBjb25zdCBiID0gc2IgKiBpbnZEYSArIGRiICogaW52U2EgPj4gODtcbiAgY29uc3QgYSA9IHNhICogaW52RGEgKyBkYSAqIGludlNhID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VPdmVyRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gc3JjO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBzciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBzZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBzYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIGRhICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5leHBvcnQgY29uc3QgZGFya2VuRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gc3IgPCBkciA/IHNyIDogZHI7XG4gIGNvbnN0IGJnID0gc2cgPCBkZyA/IHNnIDogZGc7XG4gIGNvbnN0IGJiID0gc2IgPCBkYiA/IHNiIDogZGI7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG5cbiAgLy8gQ29uc2lzdGVudCBmbG9vciByb3VuZGluZyBmb3IgYWxsIGNoYW5uZWxzXG4gIGNvbnN0IGJyID0gc3IgKiBkciA+PiA4O1xuICBjb25zdCBiZyA9IHNnICogZGcgPj4gODtcbiAgY29uc3QgYmIgPSBzYiAqIGRiID4+IDg7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyBkYSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogMjU1IC0gKDI1NS1zcmMpL2RzdCAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yQnVybkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IGRyID09PSAyNTUgPyAyNTUgOiBzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoMjU1IC0gZHIgPDwgOCkgLyBzciB8IDApO1xuICBjb25zdCBiZyA9IGRnID09PSAyNTUgPyAyNTUgOiBzZyA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoMjU1IC0gZGcgPDwgOCkgLyBzZyB8IDApO1xuICBjb25zdCBiYiA9IGRiID09PSAyNTUgPyAyNTUgOiBzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoMjU1IC0gZGIgPDwgOCkgLyBzYiB8IDApO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIHNyYyArIGRzdCAtIDI1NSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckJ1cm5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcblxuICAvLyBNYXRoOiBCYXNlICsgQmxlbmQgLSAyNTUgKGNsYW1wZWQgdG8gMClcbiAgY29uc3QgYnJVID0gZHIgKyBzciAtIDI1NTtcbiAgY29uc3QgYmdVID0gZGcgKyBzZyAtIDI1NTtcbiAgY29uc3QgYmJVID0gZGIgKyBzYiAtIDI1NTtcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVTtcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVTtcbiAgY29uc3QgYmIgPSBiYlUgPCAwID8gMCA6IGJiVTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBkYXJrZXJGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcblxuICAvLyAxLiBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIFdlaWdodHM6IFI6MC4zLCBHOjAuNTksIEI6MC4xMSlcbiAgLy8gU2NhbGVkIGJ5IDI1NiBmb3IgaW50ZWdlciBtYXRoOiA3NywgMTUxLCAyOFxuICBjb25zdCBsdW1TcmMgPSBzciAqIDc3ICsgc2cgKiAxNTEgKyBzYiAqIDI4O1xuICBjb25zdCBsdW1Ec3QgPSBkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4O1xuXG4gIC8vIDIuIFNlbGVjdGlvbiBMb2dpY1xuICAvLyBQaWNrIHRoZSBwZXJjZXB0dWFsbHkgZGFya2VyIHBpeGVsXG4gIGxldCBiciwgYmcsIGJiO1xuICBpZiAobHVtU3JjIDwgbHVtRHN0KSB7XG4gICAgYnIgPSBzcjtcbiAgICBiZyA9IHNnO1xuICAgIGJiID0gc2I7XG4gIH0gZWxzZSB7XG4gICAgYnIgPSBkcjtcbiAgICBiZyA9IGRnO1xuICAgIGJiID0gZGI7XG4gIH1cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIDMuIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIE1hdGgubWF4KHNyYywgZHN0KSAqL1xuZXhwb3J0IGNvbnN0IGxpZ2h0ZW5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBiciA9IE1hdGgubWF4KHNyYyAmIDB4RkYsIGRzdCAmIDB4RkYpO1xuICBjb25zdCBiZyA9IE1hdGgubWF4KHNyYyA+PiA4ICYgMHhGRiwgZHN0ID4+IDggJiAweEZGKTtcbiAgY29uc3QgYmIgPSBNYXRoLm1heChzcmMgPj4gMTYgJiAweEZGLCBkc3QgPj4gMTYgJiAweEZGKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkY7XG4gIGNvbnN0IGRnID0gZHN0ID4+IDggJiAweEZGO1xuICBjb25zdCBkYiA9IGRzdCA+PiAxNiAmIDB4RkY7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKipcbiAqIDI1NSAtICgoMjU1IC0gc3JjKSAqICgyNTUgLSBkc3QpKVxuICovXG5leHBvcnQgY29uc3Qgc2NyZWVuRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IDI1NSAtICgoMjU1IC0gKHNyYyAmIDB4RkYpKSAqICgyNTUgLSBkcikgPj4gOCk7XG4gIGNvbnN0IGJnID0gMjU1IC0gKCgyNTUgLSAoc3JjID4+PiA4ICYgMHhGRikpICogKDI1NSAtIGRnKSA+PiA4KTtcbiAgY29uc3QgYmIgPSAyNTUgLSAoKDI1NSAtIChzcmMgPj4+IDE2ICYgMHhGRikpICogKDI1NSAtIGRiKSA+PiA4KTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIHNyYyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZHN0IDw8IDgpIC8gKDI1NSAtIHNyYykpICovXG5leHBvcnQgY29uc3QgY29sb3JEb2RnZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvICgyNTUgLSBzcikgfCAwKTtcbiAgY29uc3QgYmcgPSBzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZGcgPDwgOCkgLyAoMjU1IC0gc2cpIHwgMCk7XG4gIGNvbnN0IGJiID0gc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRiIDw8IDgpIC8gKDI1NSAtIHNiKSB8IDApO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogc3JjICsgZHN0ICovXG5leHBvcnQgY29uc3QgbGluZWFyRG9kZ2VGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyVSA9IChzcmMgJiAweEZGKSArIGRyO1xuICBjb25zdCBiZ1UgPSAoc3JjID4+PiA4ICYgMHhGRikgKyBkZztcbiAgY29uc3QgYmJVID0gKHNyYyA+Pj4gMTYgJiAweEZGKSArIGRiO1xuICBjb25zdCBiciA9IGJyVSA+IDI1NSA/IDI1NSA6IGJyVTtcbiAgY29uc3QgYmcgPSBiZ1UgPiAyNTUgPyAyNTUgOiBiZ1U7XG4gIGNvbnN0IGJiID0gYmJVID4gMjU1ID8gMjU1IDogYmJVO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGxpZ2h0ZXJGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcblxuICAvLyBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIHVzZXMgV2VpZ2h0czogUjowLjMsIEc6MC41OSwgQjowLjExKVxuICAvLyBXZSB1c2UgaW50ZWdlciBtYXRoIChzY2FsZWQgYnkgMjU2KSBmb3Igc3BlZWQuXG4gIGNvbnN0IGx1bVNyYyA9IHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjg7XG4gIGNvbnN0IGx1bURzdCA9IGRyICogNzcgKyBkZyAqIDE1MSArIGRiICogMjg7XG5cbiAgLy8gU2VsZWN0aW9uIExvZ2ljIChCYXNlIHJlc3VsdClcbiAgbGV0IGJyLCBiZywgYmI7XG4gIGlmIChsdW1TcmMgPiBsdW1Ec3QpIHtcbiAgICBiciA9IHNyO1xuICAgIGJnID0gc2c7XG4gICAgYmIgPSBzYjtcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyO1xuICAgIGJnID0gZGc7XG4gICAgYmIgPSBkYjtcbiAgfVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIHNyYyA8IDEyOCA/ICgyICogc3JjICogZHN0KSA6ICgyNTUgLSAyICogKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSkgKi9cbmV4cG9ydCBjb25zdCBvdmVybGF5RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gZHIgPCAxMjggPyAyICogc3IgKiBkciA+PiA4IDogMjU1IC0gKDIgKiAoMjU1IC0gc3IpICogKDI1NSAtIGRyKSA+PiA4KTtcbiAgY29uc3QgYmcgPSBkZyA8IDEyOCA/IDIgKiBzZyAqIGRnID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpID4+IDgpO1xuICBjb25zdCBiYiA9IGRiIDwgMTI4ID8gMiAqIHNiICogZGIgPj4gOCA6IDI1NSAtICgyICogKDI1NSAtIHNiKSAqICgyNTUgLSBkYikgPj4gOCk7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiAoKDI1NSAtIGRzdCkgKiAoKHNyYyAqIGRzdCkgPj4gOCkgKyBkc3QgKiAoMjU1IC0gKCgoMjU1IC0gc3JjKSAqICgyNTUgLSBkc3QpKSA+PiA4KSkpID4+IDggKi9cbmV4cG9ydCBjb25zdCBzb2Z0TGlnaHRGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSAoMjU1IC0gZHIpICogKHNyICogZHIgPj4gOCkgKyBkciAqICgyNTUgLSAoKDI1NSAtIHNyKSAqICgyNTUgLSBkcikgPj4gOCkpID4+IDg7XG4gIGNvbnN0IGJnID0gKDI1NSAtIGRnKSAqIChzZyAqIGRnID4+IDgpICsgZGcgKiAoMjU1IC0gKCgyNTUgLSBzZykgKiAoMjU1IC0gZGcpID4+IDgpKSA+PiA4O1xuICBjb25zdCBiYiA9ICgyNTUgLSBkYikgKiAoc2IgKiBkYiA+PiA4KSArIGRiICogKDI1NSAtICgoMjU1IC0gc2IpICogKDI1NSAtIGRiKSA+PiA4KSkgPj4gODtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIElmIHNyYyA8IDEyOCAoNTAlIGdyYXkpLCBNdWx0aXBseTsgb3RoZXJ3aXNlLCBTY3JlZW4gKi9cbmV4cG9ydCBjb25zdCBoYXJkTGlnaHRGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IDIgKiBzciAqIGRyID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzcikgKiAoMjU1IC0gZHIpID4+IDgpO1xuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gMiAqIHNnICogZGcgPj4gOCA6IDI1NSAtICgyICogKDI1NSAtIHNnKSAqICgyNTUgLSBkZykgPj4gOCk7XG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyAyICogc2IgKiBkYiA+PiA4IDogMjU1IC0gKDIgKiAoMjU1IC0gc2IpICogKDI1NSAtIGRiKSA+PiA4KTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqXG4gKiBJZiBzcmMgPCAxMjg6IEJ1cm4oZHN0LCAyICogc3JjKVxuICogSWYgc3JjID49IDEyODogRG9kZ2UoZHN0LCAyICogKHNyYyAtIDEyOCkpXG4gKi9cbmV4cG9ydCBjb25zdCB2aXZpZExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyBzciA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoMjU1IC0gZHIgPDwgOCkgLyAoMiAqIHNyKSB8IDApIDogc3IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRyIDw8IDgpIC8gKDIgKiAoMjU1IC0gc3IpKSB8IDApO1xuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gc2cgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKDI1NSAtIGRnIDw8IDgpIC8gKDIgKiBzZykgfCAwKSA6IHNnID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkZyA8PCA4KSAvICgyICogKDI1NSAtIHNnKSkgfCAwKTtcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IHNiID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgyNTUgLSBkYiA8PCA4KSAvICgyICogc2IpIHwgMCkgOiBzYiA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZGIgPDwgOCkgLyAoMiAqICgyNTUgLSBzYikpIHwgMCk7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBkc3QgKyAyICogc3JjIC0gMjU1IChDbGFtcGVkIHRvIDAtMjU1KSAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckxpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyVSA9IGRyICsgMiAqIHNyIC0gMjU1O1xuICBjb25zdCBiZ1UgPSBkZyArIDIgKiBzZyAtIDI1NTtcbiAgY29uc3QgYmJVID0gZGIgKyAyICogc2IgLSAyNTU7XG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclUgPiAyNTUgPyAyNTUgOiBiclU7XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1UgPiAyNTUgPyAyNTUgOiBiZ1U7XG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlUgPiAyNTUgPyAyNTUgOiBiYlU7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBzcmMgPCAxMjggPyBtaW4oZHN0LCAyICogc3JjKSA6IG1heChkc3QsIDIgKiAoc3JjIC0gMTI4KSkgKi9cbmV4cG9ydCBjb25zdCBwaW5MaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IHNyIDwgMTI4ID8gZHIgPCAyICogc3IgPyBkciA6IDIgKiBzciA6IGRyID4gMiAqIHNyIC0gMjU2ID8gZHIgOiAyICogc3IgLSAyNTY7XG4gIGNvbnN0IGJnID0gc2cgPCAxMjggPyBkZyA8IDIgKiBzZyA/IGRnIDogMiAqIHNnIDogZGcgPiAyICogc2cgLSAyNTYgPyBkZyA6IDIgKiBzZyAtIDI1NjtcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IGRiIDwgMiAqIHNiID8gZGIgOiAyICogc2IgOiBkYiA+IDIgKiBzYiAtIDI1NiA/IGRiIDogMiAqIHNiIC0gMjU2O1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogKFZpdmlkIExpZ2h0IGxvZ2ljIGZvcmNlZCB0byAwIG9yIDI1NSkgKi9cbmV4cG9ydCBjb25zdCBoYXJkTWl4RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gKHNyIDwgMTI4ID8gc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKDI1NSAtIGRyIDw8IDgpIC8gKDIgKiBzcikgfCAwKSA6IHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvICgyICogKDI1NSAtIHNyKSkgfCAwKSkgPCAxMjggPyAwIDogMjU1O1xuICBjb25zdCBiZyA9IChzZyA8IDEyOCA/IHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgyNTUgLSBkZyA8PCA4KSAvICgyICogc2cpIHwgMCkgOiBzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZGcgPDwgOCkgLyAoMiAqICgyNTUgLSBzZykpIHwgMCkpIDwgMTI4ID8gMCA6IDI1NTtcbiAgY29uc3QgYmIgPSAoc2IgPCAxMjggPyBzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoMjU1IC0gZGIgPDwgOCkgLyAoMiAqIHNiKSB8IDApIDogc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRiIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2IpKSB8IDApKSA8IDEyOCA/IDAgOiAyNTU7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBNYXRoLmFicyhzcmMgLSBkc3QpICovXG5leHBvcnQgY29uc3QgZGlmZmVyZW5jZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnJEID0gKHNyYyAmIDB4RkYpIC0gZHI7XG4gIGNvbnN0IGJnRCA9IChzcmMgPj4+IDggJiAweEZGKSAtIGRnO1xuICBjb25zdCBiYkQgPSAoc3JjID4+PiAxNiAmIDB4RkYpIC0gZGI7XG4gIGNvbnN0IGJyID0gYnJEIDwgMCA/IC1ickQgOiBickQ7XG4gIGNvbnN0IGJnID0gYmdEIDwgMCA/IC1iZ0QgOiBiZ0Q7XG4gIGNvbnN0IGJiID0gYmJEIDwgMCA/IC1iYkQgOiBiYkQ7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBkc3QgKyBzcmMgLSAoKGRzdCAqIHNyYykgPj4gNykgKi9cbmV4cG9ydCBjb25zdCBleGNsdXNpb25GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBkciArIHNyIC0gKGRyICogc3IgPj4gNyk7XG4gIGNvbnN0IGJnID0gZGcgKyBzZyAtIChkZyAqIHNnID4+IDcpO1xuICBjb25zdCBiYiA9IGRiICsgc2IgLSAoZGIgKiBzYiA+PiA3KTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIE1hdGgubWF4KDAsIGRzdCAtIHNyYykgKi9cbmV4cG9ydCBjb25zdCBzdWJ0cmFjdEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiclUgPSBkciAtIHNyO1xuICBjb25zdCBiZ1UgPSBkZyAtIHNnO1xuICBjb25zdCBiYlUgPSBkYiAtIHNiO1xuICBjb25zdCBiciA9IGJyVSA8IDAgPyAwIDogYnJVO1xuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVO1xuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogc3IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvIHNyKSAqL1xuZXhwb3J0IGNvbnN0IGRpdmlkZUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IHNyID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZHIgPDwgOCkgLyBzciB8IDApO1xuICBjb25zdCBiZyA9IHNnID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZGcgPDwgOCkgLyBzZyB8IDApO1xuICBjb25zdCBiYiA9IHNiID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZGIgPDwgOCkgLyBzYiB8IDApO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IEJBU0VfRkFTVF9CTEVORF9NT0RFX0ZVTkNUSU9OUzogUmVjb3JkPG51bWJlciwgQmxlbmRDb2xvcjMyPiA9IHtcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcndyaXRlXTogb3ZlcndyaXRlRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlSW5dOiBzb3VyY2VJbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvdXJjZU91dF06IHNvdXJjZU91dEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvdXJjZUF0b3BdOiBzb3VyY2VBdG9wRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGVzdGluYXRpb25PdmVyXTogZGVzdGluYXRpb25PdmVyRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGVzdGluYXRpb25Jbl06IGRlc3RpbmF0aW9uSW5GYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5kZXN0aW5hdGlvbk91dF06IGRlc3RpbmF0aW9uT3V0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGVzdGluYXRpb25BdG9wXTogZGVzdGluYXRpb25BdG9wRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUueG9yXTogeG9yRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlT3Zlcl06IHNvdXJjZU92ZXJGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZW5dOiBkYXJrZW5GYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5tdWx0aXBseV06IG11bHRpcGx5RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JCdXJuXTogY29sb3JCdXJuRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyQnVybl06IGxpbmVhckJ1cm5GYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZXJDb2xvcl06IGRhcmtlckZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpZ2h0ZW5dOiBsaWdodGVuRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc2NyZWVuXTogc2NyZWVuRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JEb2RnZV06IGNvbG9yRG9kZ2VGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJEb2RnZV06IGxpbmVhckRvZGdlRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGlnaHRlckNvbG9yXTogbGlnaHRlckZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJsYXldOiBvdmVybGF5RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc29mdExpZ2h0XTogc29mdExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuaGFyZExpZ2h0XTogaGFyZExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUudml2aWRMaWdodF06IHZpdmlkTGlnaHRGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJMaWdodF06IGxpbmVhckxpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUucGluTGlnaHRdOiBwaW5MaWdodEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRNaXhdOiBoYXJkTWl4RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGlmZmVyZW5jZV06IGRpZmZlcmVuY2VGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5leGNsdXNpb25dOiBleGNsdXNpb25GYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5zdWJ0cmFjdF06IHN1YnRyYWN0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGl2aWRlXTogZGl2aWRlRmFzdFxufTtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlRmFzdEJsZW5kTW9kZVJlZ2lzdHJ5KG5hbWUgPSAnZmFzdCcpIHtcbiAgcmV0dXJuIG1ha2VCbGVuZE1vZGVSZWdpc3RyeShCYXNlQmxlbmRNb2RlLCBCQVNFX0ZBU1RfQkxFTkRfTU9ERV9GVU5DVElPTlMsIG5hbWUpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwritePerfect = overwriteBase;\nexport const sourceInPerfect: BlendColor32 = (src, dst) => {\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return 0 as Color32;\n if (da === 255) return src;\n const sa = src >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Result: [Sa * Da, Sc * Da]\n const tR = sr * da;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * da;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * da;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = sa * da;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const sourceOutPerfect: BlendColor32 = (src, dst) => {\n const da = dst >>> 24 & 0xFF;\n if (da === 255) return 0 as Color32;\n if (da === 0) return src;\n const sa = src >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const invDa = 255 - da;\n // Result: [Sa * (1 - Da), Sc * (1 - Da)]\n const tR = sr * invDa;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * invDa;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * invDa;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = sa * invDa;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const sourceAtopPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return 0 as Color32;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invSa = 255 - sa;\n // Result: [Da, Sc * Da + Dc * (1 - Sa)]\n const tR = sr * da + dr * invSa;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * da + dg * invSa;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * da + db * invSa;\n const b = tB + 1 + (tB >> 8) >> 8;\n return (da << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationOverPerfect: BlendColor32 = (src, dst) => {\n const da = dst >>> 24 & 0xFF;\n if (da === 255) return dst;\n if (da === 0) return src;\n const sa = src >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invDa = 255 - da;\n // Result: [Da + Sa * (1 - Da), Dc + Sc * (1 - Da)]\n const tR = dr * 255 + sr * invDa;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = dg * 255 + sg * invDa;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = db * 255 + sb * invDa;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = da * 255 + sa * invDa;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationInPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return 0 as Color32;\n if (sa === 255) return dst;\n const da = dst >>> 24 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n\n // Result: [Da * Sa, Dc * Sa]\n const tR = dr * sa;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = dg * sa;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = db * sa;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = da * sa;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationOutPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 255) return 0 as Color32;\n if (sa === 0) return dst;\n const da = dst >>> 24 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invSa = 255 - sa;\n // Result: [Da * (1 - Sa), Dc * (1 - Sa)]\n const tR = dr * invSa;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = dg * invSa;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = db * invSa;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = da * invSa;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const destinationAtopPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return 0 as Color32; // Rule: Final Alpha = Sa\n const da = dst >>> 24 & 0xFF;\n if (da === 0) return 0 as Color32;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invDa = 255 - da;\n // Result: [Sa, Dc * Sa + Sc * (1 - Da)]\n const tR = dr * sa + sr * invDa;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = dg * sa + sg * invDa;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = db * sa + sb * invDa;\n const b = tB + 1 + (tB >> 8) >> 8;\n return (sa << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const xorPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const invDa = 255 - da;\n const invSa = 255 - sa;\n\n // Result: [Sa * (1 - Da) + Da * (1 - Sa), Sc * (1 - Da) + Dc * (1 - Sa)]\n const tR = sr * invDa + dr * invSa;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * invDa + dg * invSa;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * invDa + db * invSa;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = sa * invDa + da * invSa;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\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 const da = dst >>> 24 & 0xFF;\n if (da === 0) return src;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const invA = 255 - sa;\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = sr * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = sg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = sb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = sr < dr ? sr : dr;\n const bg = sg < dg ? sg : dg;\n const bb = sb < db ? sb : db;\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 const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 dr = dst & 0xFF;\n const dg = dst >>> 8 & 0xFF;\n const db = dst >>> 16 & 0xFF;\n const da = dst >>> 24 & 0xFF;\n const sr = src & 0xFF;\n const sg = src >>> 8 & 0xFF;\n const sb = src >>> 16 & 0xFF;\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr;\n const br = mR + 1 + (mR >> 8) >> 8;\n const mG = sg * dg;\n const bg = mG + 1 + (mG >> 8) >> 8;\n const mB = sb * db;\n const bb = mB + 1 + (mB >> 8) >> 8;\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 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 // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - ((255 - dr) * 255 / sr | 0);\n const br = resR < 0 ? 0 : resR;\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - ((255 - dg) * 255 / sg | 0);\n const bg = resG < 0 ? 0 : resG;\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - ((255 - db) * 255 / sb | 0);\n const bb = resB < 0 ? 0 : resB;\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 const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg + sg - 255;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db + sb - 255;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const darkerPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n 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 if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n 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 if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\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 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 const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 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 // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : dr * 255 / (255 - sr) | 0;\n const br = resR > 255 ? 255 : resR;\n const resG = sg === 255 ? 255 : dg * 255 / (255 - sg) | 0;\n const bg = resG > 255 ? 255 : resG;\n const resB = sb === 255 ? 255 : db * 255 / (255 - sb) | 0;\n const bb = resB > 255 ? 255 : resB;\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 const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\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 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 const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const lighterPerfect: BlendColor32 = (src, dst) => {\n const sa = src >>> 24 & 0xFF;\n if (sa === 0) return dst;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n 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 if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const br = dr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = dg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = db < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const mR = sr * dr;\n const scR = (255 - sr) * (255 - dr);\n const br = (255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) + 1 + ((255 - dr) * (mR + 1 + (mR >> 8) >> 8) + dr * (255 - (scR + 1 + (scR >> 8) >> 8)) >> 8) >> 8;\n const mG = sg * dg;\n const scG = (255 - sg) * (255 - dg);\n const bg = (255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) + 1 + ((255 - dg) * (mG + 1 + (mG >> 8) >> 8) + dg * (255 - (scG + 1 + (scG >> 8) >> 8)) >> 8) >> 8;\n const mB = sb * db;\n const scB = (255 - sb) * (255 - db);\n const bb = (255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) + 1 + ((255 - db) * (mB + 1 + (mB >> 8) >> 8) + db * (255 - (scB + 1 + (scB >> 8) >> 8)) >> 8) >> 8;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? 2 * sr * dr / 255 | 0 : 255 - (2 * (255 - sr) * (255 - dr) / 255 | 0);\n const bg = sg < 128 ? 2 * sg * dg / 255 | 0 : 255 - (2 * (255 - sg) * (255 - dg) / 255 | 0);\n const bb = sb < 128 ? 2 * sb * db / 255 | 0 : 255 - (2 * (255 - sb) * (255 - db) / 255 | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0);\n const bg = sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0);\n const bb = sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr + 2 * sr - 255;\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU;\n const bgU = dg + 2 * sg - 255;\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU;\n const bbU = db + 2 * sb - 255;\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 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 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 if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = (sr < 128 ? sr === 0 ? 0 : Math.max(0, 255 - ((255 - dr) * 255 / (2 * sr) | 0)) : sr === 255 ? 255 : Math.min(255, dr * 255 / (2 * (255 - sr)) | 0)) < 128 ? 0 : 255;\n const bg = (sg < 128 ? sg === 0 ? 0 : Math.max(0, 255 - ((255 - dg) * 255 / (2 * sg) | 0)) : sg === 255 ? 255 : Math.min(255, dg * 255 / (2 * (255 - sg)) | 0)) < 128 ? 0 : 255;\n const bb = (sb < 128 ? sb === 0 ? 0 : Math.max(0, 255 - ((255 - db) * 255 / (2 * sb) | 0)) : sb === 255 ? 255 : Math.min(255, db * 255 / (2 * (255 - sb)) | 0)) < 128 ? 0 : 255;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = dr > sr ? dr - sr : sr - dr;\n const bg = dg > sg ? dg - sg : sg - dg;\n const bb = db > sb ? db - sb : sb - db;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 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 const r2 = dr * sr;\n const br = dr + sr - (r2 + r2 + 1 + (r2 + r2 >> 8) >> 8);\n const g2 = dg * sg;\n const bg = dg + sg - (g2 + g2 + 1 + (g2 + g2 >> 8) >> 8);\n const b2 = db * sb;\n const bb = db + sb - (b2 + b2 + 1 + (b2 + b2 >> 8) >> 8);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const brU = dr - sr;\n const br = brU < 0 ? 0 : brU;\n const bgU = dg - sg;\n const bg = bgU < 0 ? 0 : bgU;\n const bbU = db - sb;\n const bb = bbU < 0 ? 0 : bbU;\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n 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 const dr = dst & 0xFF,\n dg = dst >>> 8 & 0xFF,\n db = dst >>> 16 & 0xFF;\n const sr = src & 0xFF,\n sg = src >>> 8 & 0xFF,\n sb = src >>> 16 & 0xFF;\n const br = sr === 0 ? 255 : Math.min(255, dr * 255 / sr | 0);\n const bg = sg === 0 ? 255 : Math.min(255, dg * 255 / sg | 0);\n const bb = sb === 0 ? 255 : Math.min(255, db * 255 / sb | 0);\n if (sa === 255) return (0xFF000000 | bb << 16 | bg << 8 | br) >>> 0 as Color32;\n\n // Alpha Lerp inlined\n const invA = 255 - sa;\n const da = dst >>> 24 & 0xFF;\n const tR = br * sa + dr * invA;\n const r = tR + 1 + (tR >> 8) >> 8;\n const tG = bg * sa + dg * invA;\n const g = tG + 1 + (tG >> 8) >> 8;\n const tB = bb * sa + db * invA;\n const b = tB + 1 + (tB >> 8) >> 8;\n const tA = 255 * sa + da * invA;\n const a = tA + 1 + (tA >> 8) >> 8;\n return (a << 24 | b << 16 | g << 8 | r) >>> 0 as Color32;\n};\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n [BaseBlendMode.sourceIn]: sourceInPerfect,\n [BaseBlendMode.sourceOut]: sourceOutPerfect,\n [BaseBlendMode.sourceAtop]: sourceAtopPerfect,\n [BaseBlendMode.destinationOver]: destinationOverPerfect,\n [BaseBlendMode.destinationIn]: destinationInPerfect,\n [BaseBlendMode.destinationOut]: destinationOutPerfect,\n [BaseBlendMode.destinationAtop]: destinationAtopPerfect,\n [BaseBlendMode.xor]: xorPerfect,\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect\n};\nexport function makePerfectBlendModeRegistry(name = 'perfect') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS, name);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSwgb3ZlcndyaXRlQmFzZSB9IGZyb20gJy4vYmxlbmQtbW9kZXMnO1xuaW1wb3J0IHsgbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5IH0gZnJvbSAnLi9CbGVuZE1vZGVSZWdpc3RyeSc7XG5leHBvcnQgY29uc3Qgb3ZlcndyaXRlUGVyZmVjdCA9IG92ZXJ3cml0ZUJhc2U7XG5leHBvcnQgY29uc3Qgc291cmNlSW5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKGRhID09PSAwKSByZXR1cm4gMCBhcyBDb2xvcjMyO1xuICBpZiAoZGEgPT09IDI1NSkgcmV0dXJuIHNyYztcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGO1xuICBjb25zdCBzZyA9IHNyYyA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG5cbiAgLy8gUmVzdWx0OiBbU2EgKiBEYSwgU2MgKiBEYV1cbiAgY29uc3QgdFIgPSBzciAqIGRhO1xuICBjb25zdCByID0gdFIgKyAxICsgKHRSID4+IDgpID4+IDg7XG4gIGNvbnN0IHRHID0gc2cgKiBkYTtcbiAgY29uc3QgZyA9IHRHICsgMSArICh0RyA+PiA4KSA+PiA4O1xuICBjb25zdCB0QiA9IHNiICogZGE7XG4gIGNvbnN0IGIgPSB0QiArIDEgKyAodEIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEEgPSBzYSAqIGRhO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBzb3VyY2VPdXRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKGRhID09PSAyNTUpIHJldHVybiAwIGFzIENvbG9yMzI7XG4gIGlmIChkYSA9PT0gMCkgcmV0dXJuIHNyYztcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGO1xuICBjb25zdCBzZyA9IHNyYyA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGludkRhID0gMjU1IC0gZGE7XG4gIC8vIFJlc3VsdDogW1NhICogKDEgLSBEYSksIFNjICogKDEgLSBEYSldXG4gIGNvbnN0IHRSID0gc3IgKiBpbnZEYTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IHNnICogaW52RGE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBzYiAqIGludkRhO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gc2EgKiBpbnZEYTtcbiAgY29uc3QgYSA9IHRBICsgMSArICh0QSA+PiA4KSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5leHBvcnQgY29uc3Qgc291cmNlQXRvcFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBpZiAoZGEgPT09IDApIHJldHVybiAwIGFzIENvbG9yMzI7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRjtcbiAgY29uc3Qgc2cgPSBzcmMgPj4+IDggJiAweEZGO1xuICBjb25zdCBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkY7XG4gIGNvbnN0IGRnID0gZHN0ID4+PiA4ICYgMHhGRjtcbiAgY29uc3QgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgaW52U2EgPSAyNTUgLSBzYTtcbiAgLy8gUmVzdWx0OiBbRGEsIFNjICogRGEgKyBEYyAqICgxIC0gU2EpXVxuICBjb25zdCB0UiA9IHNyICogZGEgKyBkciAqIGludlNhO1xuICBjb25zdCByID0gdFIgKyAxICsgKHRSID4+IDgpID4+IDg7XG4gIGNvbnN0IHRHID0gc2cgKiBkYSArIGRnICogaW52U2E7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBzYiAqIGRhICsgZGIgKiBpbnZTYTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICByZXR1cm4gKGRhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRlc3RpbmF0aW9uT3ZlclBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBpZiAoZGEgPT09IDI1NSkgcmV0dXJuIGRzdDtcbiAgaWYgKGRhID09PSAwKSByZXR1cm4gc3JjO1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkY7XG4gIGNvbnN0IHNnID0gc3JjID4+PiA4ICYgMHhGRjtcbiAgY29uc3Qgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGludkRhID0gMjU1IC0gZGE7XG4gIC8vIFJlc3VsdDogW0RhICsgU2EgKiAoMSAtIERhKSwgRGMgKyBTYyAqICgxIC0gRGEpXVxuICBjb25zdCB0UiA9IGRyICogMjU1ICsgc3IgKiBpbnZEYTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGRnICogMjU1ICsgc2cgKiBpbnZEYTtcbiAgY29uc3QgZyA9IHRHICsgMSArICh0RyA+PiA4KSA+PiA4O1xuICBjb25zdCB0QiA9IGRiICogMjU1ICsgc2IgKiBpbnZEYTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IGRhICogMjU1ICsgc2EgKiBpbnZEYTtcbiAgY29uc3QgYSA9IHRBICsgMSArICh0QSA+PiA4KSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5leHBvcnQgY29uc3QgZGVzdGluYXRpb25JblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiAwIGFzIENvbG9yMzI7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gZHN0O1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkY7XG4gIGNvbnN0IGRnID0gZHN0ID4+PiA4ICYgMHhGRjtcbiAgY29uc3QgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcblxuICAvLyBSZXN1bHQ6IFtEYSAqIFNhLCBEYyAqIFNhXVxuICBjb25zdCB0UiA9IGRyICogc2E7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBkZyAqIHNhO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gZGIgKiBzYTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IGRhICogc2E7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRlc3RpbmF0aW9uT3V0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gMCBhcyBDb2xvcjMyO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRjtcbiAgY29uc3QgZGcgPSBkc3QgPj4+IDggJiAweEZGO1xuICBjb25zdCBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBpbnZTYSA9IDI1NSAtIHNhO1xuICAvLyBSZXN1bHQ6IFtEYSAqICgxIC0gU2EpLCBEYyAqICgxIC0gU2EpXVxuICBjb25zdCB0UiA9IGRyICogaW52U2E7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBkZyAqIGludlNhO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gZGIgKiBpbnZTYTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IGRhICogaW52U2E7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRlc3RpbmF0aW9uQXRvcFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiAwIGFzIENvbG9yMzI7IC8vIFJ1bGU6IEZpbmFsIEFscGhhID0gU2FcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKGRhID09PSAwKSByZXR1cm4gMCBhcyBDb2xvcjMyO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkY7XG4gIGNvbnN0IHNnID0gc3JjID4+PiA4ICYgMHhGRjtcbiAgY29uc3Qgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGludkRhID0gMjU1IC0gZGE7XG4gIC8vIFJlc3VsdDogW1NhLCBEYyAqIFNhICsgU2MgKiAoMSAtIERhKV1cbiAgY29uc3QgdFIgPSBkciAqIHNhICsgc3IgKiBpbnZEYTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGRnICogc2EgKyBzZyAqIGludkRhO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gZGIgKiBzYSArIHNiICogaW52RGE7XG4gIGNvbnN0IGIgPSB0QiArIDEgKyAodEIgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChzYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCB4b3JQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGO1xuICBjb25zdCBzZyA9IHNyYyA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRjtcbiAgY29uc3QgZGcgPSBkc3QgPj4+IDggJiAweEZGO1xuICBjb25zdCBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBpbnZEYSA9IDI1NSAtIGRhO1xuICBjb25zdCBpbnZTYSA9IDI1NSAtIHNhO1xuXG4gIC8vIFJlc3VsdDogW1NhICogKDEgLSBEYSkgKyBEYSAqICgxIC0gU2EpLCBTYyAqICgxIC0gRGEpICsgRGMgKiAoMSAtIFNhKV1cbiAgY29uc3QgdFIgPSBzciAqIGludkRhICsgZHIgKiBpbnZTYTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IHNnICogaW52RGEgKyBkZyAqIGludlNhO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gc2IgKiBpbnZEYSArIGRiICogaW52U2E7XG4gIGNvbnN0IGIgPSB0QiArIDEgKyAodEIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEEgPSBzYSAqIGludkRhICsgZGEgKiBpbnZTYTtcbiAgY29uc3QgYSA9IHRBICsgMSArICh0QSA+PiA4KSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5leHBvcnQgY29uc3Qgc291cmNlT3ZlclBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuIHNyYztcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBpZiAoZGEgPT09IDApIHJldHVybiBzcmM7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIC8vIEV4YWN0IGRpdmlzaW9uIGJ5IDI1NSB1c2luZyBiaXQtc2hpZnRzXG4gIC8vIEZvcm11bGE6ICh2ICsgMSArICh2ID4+IDgpKSA+PiA4XG4gIGNvbnN0IHRSID0gc3IgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IHNnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBzYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRhcmtlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IHNyIDwgZHIgPyBzciA6IGRyO1xuICBjb25zdCBiZyA9IHNnIDwgZGcgPyBzZyA6IGRnO1xuICBjb25zdCBiYiA9IHNiIDwgZGIgPyBzYiA6IGRiO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBO1xuICBjb25zdCByID0gdFIgKyAxICsgKHRSID4+IDgpID4+IDg7XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QTtcbiAgY29uc3QgZyA9IHRHICsgMSArICh0RyA+PiA4KSA+PiA4O1xuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkE7XG4gIGNvbnN0IGIgPSB0QiArIDEgKyAodEIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QTtcbiAgY29uc3QgYSA9IHRBICsgMSArICh0QSA+PiA4KSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiAoc3JjICogZHN0KSAvIDI1NSAqL1xuZXhwb3J0IGNvbnN0IG11bHRpcGx5UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRjtcbiAgY29uc3Qgc2cgPSBzcmMgPj4+IDggJiAweEZGO1xuICBjb25zdCBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuXG4gIC8vIENhbGN1bGF0ZSBiYXNlIG11bHRpcGx5IHJlc3VsdDogKHNyICogZHIpIC8gMjU1XG4gIGNvbnN0IG1SID0gc3IgKiBkcjtcbiAgY29uc3QgYnIgPSBtUiArIDEgKyAobVIgPj4gOCkgPj4gODtcbiAgY29uc3QgbUcgPSBzZyAqIGRnO1xuICBjb25zdCBiZyA9IG1HICsgMSArIChtRyA+PiA4KSA+PiA4O1xuICBjb25zdCBtQiA9IHNiICogZGI7XG4gIGNvbnN0IGJiID0gbUIgKyAxICsgKG1CID4+IDgpID4+IDg7XG5cbiAgLy8gSWYgZnVsbHkgb3BhcXVlLCByZXR1cm4gd2l0aCBmdWxsIGFscGhhXG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkE7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIDI1NSAtICgyNTUtc3JjKS9kc3QgKi9cbmV4cG9ydCBjb25zdCBjb2xvckJ1cm5QZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkY7XG4gIGNvbnN0IGRnID0gZHN0ID4+PiA4ICYgMHhGRjtcbiAgY29uc3QgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGO1xuICBjb25zdCBzZyA9IHNyYyA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG5cbiAgLy8gQ29sb3IgQnVybiBDb3JlIE1hdGg6IDI1NSAtICgoMjU1IC0gZHN0KSAqIDI1NSAvIHNyYylcbiAgLy8gV2UgdXNlIHwgMCB0byB0cnVuY2F0ZSB0aGUgZGl2aXNpb24gcmVzdWx0IGltbWVkaWF0ZWx5LlxuICBjb25zdCByZXNSID0gZHIgPT09IDI1NSA/IDI1NSA6IHNyID09PSAwID8gMCA6IDI1NSAtICgoMjU1IC0gZHIpICogMjU1IC8gc3IgfCAwKTtcbiAgY29uc3QgYnIgPSByZXNSIDwgMCA/IDAgOiByZXNSO1xuICBjb25zdCByZXNHID0gZGcgPT09IDI1NSA/IDI1NSA6IHNnID09PSAwID8gMCA6IDI1NSAtICgoMjU1IC0gZGcpICogMjU1IC8gc2cgfCAwKTtcbiAgY29uc3QgYmcgPSByZXNHIDwgMCA/IDAgOiByZXNHO1xuICBjb25zdCByZXNCID0gZGIgPT09IDI1NSA/IDI1NSA6IHNiID09PSAwID8gMCA6IDI1NSAtICgoMjU1IC0gZGIpICogMjU1IC8gc2IgfCAwKTtcbiAgY29uc3QgYmIgPSByZXNCIDwgMCA/IDAgOiByZXNCO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBO1xuICBjb25zdCByID0gdFIgKyAxICsgKHRSID4+IDgpID4+IDg7XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QTtcbiAgY29uc3QgZyA9IHRHICsgMSArICh0RyA+PiA4KSA+PiA4O1xuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkE7XG4gIGNvbnN0IGIgPSB0QiArIDEgKyAodEIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QTtcbiAgY29uc3QgYSA9IHRBICsgMSArICh0QSA+PiA4KSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBzcmMgKyBkc3QgLSAyNTUgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJCdXJuUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTU7XG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclU7XG4gIGNvbnN0IGJnVSA9IGRnICsgc2cgLSAyNTU7XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1U7XG4gIGNvbnN0IGJiVSA9IGRiICsgc2IgLSAyNTU7XG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlU7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkE7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBkYXJrZXJQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcblxuICAvLyAxLiBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIFdlaWdodHM6IFI6MC4zLCBHOjAuNTksIEI6MC4xMSlcbiAgLy8gU2NhbGVkIGJ5IDI1NiBmb3IgaW50ZWdlciBtYXRoOiA3NywgMTUxLCAyOFxuICBjb25zdCBsdW1TcmMgPSBzciAqIDc3ICsgc2cgKiAxNTEgKyBzYiAqIDI4O1xuICBjb25zdCBsdW1Ec3QgPSBkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4O1xuXG4gIC8vIDIuIFNlbGVjdGlvbiBMb2dpY1xuICAvLyBQaWNrIHRoZSBwZXJjZXB0dWFsbHkgZGFya2VyIHBpeGVsXG4gIGxldCBiciwgYmcsIGJiO1xuICBpZiAobHVtU3JjIDwgbHVtRHN0KSB7XG4gICAgYnIgPSBzcjtcbiAgICBiZyA9IHNnO1xuICAgIGJiID0gc2I7XG4gIH0gZWxzZSB7XG4gICAgYnIgPSBkcjtcbiAgICBiZyA9IGRnO1xuICAgIGJiID0gZGI7XG4gIH1cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIDMuIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogTWF0aC5tYXgoc3JjLCBkc3QpICovXG5leHBvcnQgY29uc3QgbGlnaHRlblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSAoc3JjICYgMHhGRikgPiBkciA/IHNyYyAmIDB4RkYgOiBkcjtcbiAgY29uc3QgYmcgPSAoc3JjID4+PiA4ICYgMHhGRikgPiBkZyA/IHNyYyA+Pj4gOCAmIDB4RkYgOiBkZztcbiAgY29uc3QgYmIgPSAoc3JjID4+PiAxNiAmIDB4RkYpID4gZGIgPyBzcmMgPj4+IDE2ICYgMHhGRiA6IGRiO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKipcbiAqIDI1NSAtICgoMjU1IC0gc3JjKSAqICgyNTUgLSBkc3QpKVxuICovXG5leHBvcnQgY29uc3Qgc2NyZWVuUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IDI1NSAtICgoMjU1IC0gKHNyYyAmIDB4RkYpKSAqICgyNTUgLSBkcikgLyAyNTUgfCAwKTtcbiAgY29uc3QgYmcgPSAyNTUgLSAoKDI1NSAtIChzcmMgPj4+IDggJiAweEZGKSkgKiAoMjU1IC0gZGcpIC8gMjU1IHwgMCk7XG4gIGNvbnN0IGJiID0gMjU1IC0gKCgyNTUgLSAoc3JjID4+PiAxNiAmIDB4RkYpKSAqICgyNTUgLSBkYikgLyAyNTUgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogc3JjID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkc3QgPDwgOCkgLyAoMjU1IC0gc3JjKSkgKi9cbmV4cG9ydCBjb25zdCBjb2xvckRvZGdlUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+Pj4gOCAmIDB4RkY7XG4gIGNvbnN0IGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRjtcbiAgY29uc3Qgc2cgPSBzcmMgPj4+IDggJiAweEZGO1xuICBjb25zdCBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuXG4gIC8vIENvbG9yIERvZGdlIENvcmUgTWF0aDogKGRzdCAqIDI1NSkgLyAoMjU1IC0gc3JjKVxuICAvLyBXZSB1c2UgdGVybmFyeSBjaGVja3MgdG8gaGFuZGxlIHRoZSBzciA9PT0gMjU1IGRpdmlzaW9uLWJ5LXplcm8gZ3VhcmQuXG4gIGNvbnN0IHJlc1IgPSBzciA9PT0gMjU1ID8gMjU1IDogZHIgKiAyNTUgLyAoMjU1IC0gc3IpIHwgMDtcbiAgY29uc3QgYnIgPSByZXNSID4gMjU1ID8gMjU1IDogcmVzUjtcbiAgY29uc3QgcmVzRyA9IHNnID09PSAyNTUgPyAyNTUgOiBkZyAqIDI1NSAvICgyNTUgLSBzZykgfCAwO1xuICBjb25zdCBiZyA9IHJlc0cgPiAyNTUgPyAyNTUgOiByZXNHO1xuICBjb25zdCByZXNCID0gc2IgPT09IDI1NSA/IDI1NSA6IGRiICogMjU1IC8gKDI1NSAtIHNiKSB8IDA7XG4gIGNvbnN0IGJiID0gcmVzQiA+IDI1NSA/IDI1NSA6IHJlc0I7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkE7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIHNyYyArIGRzdCAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckRvZGdlUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiclUgPSAoc3JjICYgMHhGRikgKyBkcjtcbiAgY29uc3QgYnIgPSBiclUgPiAyNTUgPyAyNTUgOiBiclU7XG4gIGNvbnN0IGJnVSA9IChzcmMgPj4+IDggJiAweEZGKSArIGRnO1xuICBjb25zdCBiZyA9IGJnVSA+IDI1NSA/IDI1NSA6IGJnVTtcbiAgY29uc3QgYmJVID0gKHNyYyA+Pj4gMTYgJiAweEZGKSArIGRiO1xuICBjb25zdCBiYiA9IGJiVSA+IDI1NSA/IDI1NSA6IGJiVTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGxpZ2h0ZXJQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcblxuICAvLyBDYWxjdWxhdGUgTHVtaW5vc2l0eSAoUGhvdG9zaG9wIHVzZXMgV2VpZ2h0czogUjowLjMsIEc6MC41OSwgQjowLjExKVxuICAvLyBXZSB1c2UgaW50ZWdlciBtYXRoIChzY2FsZWQgYnkgMjU2KSBmb3Igc3BlZWQuXG4gIGNvbnN0IGx1bVNyYyA9IHNyICogNzcgKyBzZyAqIDE1MSArIHNiICogMjg7XG4gIGNvbnN0IGx1bURzdCA9IGRyICogNzcgKyBkZyAqIDE1MSArIGRiICogMjg7XG5cbiAgLy8gU2VsZWN0aW9uIExvZ2ljIChCYXNlIHJlc3VsdClcbiAgbGV0IGJyLCBiZywgYmI7XG4gIGlmIChsdW1TcmMgPiBsdW1Ec3QpIHtcbiAgICBiciA9IHNyO1xuICAgIGJnID0gc2c7XG4gICAgYmIgPSBzYjtcbiAgfSBlbHNlIHtcbiAgICBiciA9IGRyO1xuICAgIGJnID0gZGc7XG4gICAgYmIgPSBkYjtcbiAgfVxuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogc3JjIDwgMTI4ID8gKDIgKiBzcmMgKiBkc3QpIDogKDI1NSAtIDIgKiAoMjU1IC0gc3JjKSAqICgyNTUgLSBkc3QpKSAqL1xuZXhwb3J0IGNvbnN0IG92ZXJsYXlQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBkciA8IDEyOCA/IDIgKiBzciAqIGRyIC8gMjU1IHwgMCA6IDI1NSAtICgyICogKDI1NSAtIHNyKSAqICgyNTUgLSBkcikgLyAyNTUgfCAwKTtcbiAgY29uc3QgYmcgPSBkZyA8IDEyOCA/IDIgKiBzZyAqIGRnIC8gMjU1IHwgMCA6IDI1NSAtICgyICogKDI1NSAtIHNnKSAqICgyNTUgLSBkZykgLyAyNTUgfCAwKTtcbiAgY29uc3QgYmIgPSBkYiA8IDEyOCA/IDIgKiBzYiAqIGRiIC8gMjU1IHwgMCA6IDI1NSAtICgyICogKDI1NSAtIHNiKSAqICgyNTUgLSBkYikgLyAyNTUgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogKCgyNTUgLSBkc3QpICogKChzcmMgKiBkc3QpID4+IDgpICsgZHN0ICogKDI1NSAtICgoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSkgPj4gOCkpKSA+PiA4ICovXG5leHBvcnQgY29uc3Qgc29mdExpZ2h0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IG1SID0gc3IgKiBkcjtcbiAgY29uc3Qgc2NSID0gKDI1NSAtIHNyKSAqICgyNTUgLSBkcik7XG4gIGNvbnN0IGJyID0gKDI1NSAtIGRyKSAqIChtUiArIDEgKyAobVIgPj4gOCkgPj4gOCkgKyBkciAqICgyNTUgLSAoc2NSICsgMSArIChzY1IgPj4gOCkgPj4gOCkpICsgMSArICgoMjU1IC0gZHIpICogKG1SICsgMSArIChtUiA+PiA4KSA+PiA4KSArIGRyICogKDI1NSAtIChzY1IgKyAxICsgKHNjUiA+PiA4KSA+PiA4KSkgPj4gOCkgPj4gODtcbiAgY29uc3QgbUcgPSBzZyAqIGRnO1xuICBjb25zdCBzY0cgPSAoMjU1IC0gc2cpICogKDI1NSAtIGRnKTtcbiAgY29uc3QgYmcgPSAoMjU1IC0gZGcpICogKG1HICsgMSArIChtRyA+PiA4KSA+PiA4KSArIGRnICogKDI1NSAtIChzY0cgKyAxICsgKHNjRyA+PiA4KSA+PiA4KSkgKyAxICsgKCgyNTUgLSBkZykgKiAobUcgKyAxICsgKG1HID4+IDgpID4+IDgpICsgZGcgKiAoMjU1IC0gKHNjRyArIDEgKyAoc2NHID4+IDgpID4+IDgpKSA+PiA4KSA+PiA4O1xuICBjb25zdCBtQiA9IHNiICogZGI7XG4gIGNvbnN0IHNjQiA9ICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpO1xuICBjb25zdCBiYiA9ICgyNTUgLSBkYikgKiAobUIgKyAxICsgKG1CID4+IDgpID4+IDgpICsgZGIgKiAoMjU1IC0gKHNjQiArIDEgKyAoc2NCID4+IDgpID4+IDgpKSArIDEgKyAoKDI1NSAtIGRiKSAqIChtQiArIDEgKyAobUIgPj4gOCkgPj4gOCkgKyBkYiAqICgyNTUgLSAoc2NCICsgMSArIChzY0IgPj4gOCkgPj4gOCkpID4+IDgpID4+IDg7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkE7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIElmIHNyYyA8IDEyOCAoNTAlIGdyYXkpLCBNdWx0aXBseTsgb3RoZXJ3aXNlLCBTY3JlZW4gKi9cbmV4cG9ydCBjb25zdCBoYXJkTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IDIgKiBzciAqIGRyIC8gMjU1IHwgMCA6IDI1NSAtICgyICogKDI1NSAtIHNyKSAqICgyNTUgLSBkcikgLyAyNTUgfCAwKTtcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IDIgKiBzZyAqIGRnIC8gMjU1IHwgMCA6IDI1NSAtICgyICogKDI1NSAtIHNnKSAqICgyNTUgLSBkZykgLyAyNTUgfCAwKTtcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IDIgKiBzYiAqIGRiIC8gMjU1IHwgMCA6IDI1NSAtICgyICogKDI1NSAtIHNiKSAqICgyNTUgLSBkYikgLyAyNTUgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKipcbiAqIElmIHNyYyA8IDEyODogQnVybihkc3QsIDIgKiBzcmMpXG4gKiBJZiBzcmMgPj0gMTI4OiBEb2RnZShkc3QsIDIgKiAoc3JjIC0gMTI4KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHZpdmlkTGlnaHRQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IHNyID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoMjU1IC0gZHIpICogMjU1IC8gKDIgKiBzcikgfCAwKSkgOiBzciA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCBkciAqIDI1NSAvICgyICogKDI1NSAtIHNyKSkgfCAwKTtcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoMjU1IC0gZGcpICogMjU1IC8gKDIgKiBzZykgfCAwKSkgOiBzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCBkZyAqIDI1NSAvICgyICogKDI1NSAtIHNnKSkgfCAwKTtcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IHNiID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgoMjU1IC0gZGIpICogMjU1IC8gKDIgKiBzYikgfCAwKSkgOiBzYiA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCBkYiAqIDI1NSAvICgyICogKDI1NSAtIHNiKSkgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogZHN0ICsgMiAqIHNyYyAtIDI1NSAoQ2xhbXBlZCB0byAwLTI1NSkgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJMaWdodFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiclUgPSBkciArIDIgKiBzciAtIDI1NTtcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVSA+IDI1NSA/IDI1NSA6IGJyVTtcbiAgY29uc3QgYmdVID0gZGcgKyAyICogc2cgLSAyNTU7XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1UgPiAyNTUgPyAyNTUgOiBiZ1U7XG4gIGNvbnN0IGJiVSA9IGRiICsgMiAqIHNiIC0gMjU1O1xuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVID4gMjU1ID8gMjU1IDogYmJVO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3QgdFIgPSBiciAqIHNhICsgZHIgKiBpbnZBO1xuICBjb25zdCByID0gdFIgKyAxICsgKHRSID4+IDgpID4+IDg7XG4gIGNvbnN0IHRHID0gYmcgKiBzYSArIGRnICogaW52QTtcbiAgY29uc3QgZyA9IHRHICsgMSArICh0RyA+PiA4KSA+PiA4O1xuICBjb25zdCB0QiA9IGJiICogc2EgKyBkYiAqIGludkE7XG4gIGNvbnN0IGIgPSB0QiArIDEgKyAodEIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEEgPSAyNTUgKiBzYSArIGRhICogaW52QTtcbiAgY29uc3QgYSA9IHRBICsgMSArICh0QSA+PiA4KSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBzcmMgPCAxMjggPyBtaW4oZHN0LCAyICogc3JjKSA6IG1heChkc3QsIDIgKiAoc3JjIC0gMTI4KSkgKi9cbmV4cG9ydCBjb25zdCBwaW5MaWdodFBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRjtcbiAgY29uc3QgZGcgPSBkc3QgPj4+IDggJiAweEZGO1xuICBjb25zdCBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkY7XG4gIGNvbnN0IHNnID0gc3JjID4+PiA4ICYgMHhGRjtcbiAgY29uc3Qgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IGRyIDwgc3IgPDwgMSA/IGRyIDogc3IgPDwgMSA6IGRyID4gc3IgLSAxMjggPDwgMSA/IGRyIDogc3IgLSAxMjggPDwgMTtcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IGRnIDwgc2cgPDwgMSA/IGRnIDogc2cgPDwgMSA6IGRnID4gc2cgLSAxMjggPDwgMSA/IGRnIDogc2cgLSAxMjggPDwgMTtcbiAgY29uc3QgYmIgPSBzYiA8IDEyOCA/IGRiIDwgc2IgPDwgMSA/IGRiIDogc2IgPDwgMSA6IGRiID4gc2IgLSAxMjggPDwgMSA/IGRiIDogc2IgLSAxMjggPDwgMTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogKFZpdmlkIExpZ2h0IGxvZ2ljIGZvcmNlZCB0byAwIG9yIDI1NSkgKi9cbmV4cG9ydCBjb25zdCBoYXJkTWl4UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gKHNyIDwgMTI4ID8gc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgyNTUgLSBkcikgKiAyNTUgLyAoMiAqIHNyKSB8IDApKSA6IHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIGRyICogMjU1IC8gKDIgKiAoMjU1IC0gc3IpKSB8IDApKSA8IDEyOCA/IDAgOiAyNTU7XG4gIGNvbnN0IGJnID0gKHNnIDwgMTI4ID8gc2cgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgyNTUgLSBkZykgKiAyNTUgLyAoMiAqIHNnKSB8IDApKSA6IHNnID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIGRnICogMjU1IC8gKDIgKiAoMjU1IC0gc2cpKSB8IDApKSA8IDEyOCA/IDAgOiAyNTU7XG4gIGNvbnN0IGJiID0gKHNiIDwgMTI4ID8gc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKCgyNTUgLSBkYikgKiAyNTUgLyAoMiAqIHNiKSB8IDApKSA6IHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIGRiICogMjU1IC8gKDIgKiAoMjU1IC0gc2IpKSB8IDApKSA8IDEyOCA/IDAgOiAyNTU7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkE7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIE1hdGguYWJzKHNyYyAtIGRzdCkgKi9cbmV4cG9ydCBjb25zdCBkaWZmZXJlbmNlUGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gZHIgPiBzciA/IGRyIC0gc3IgOiBzciAtIGRyO1xuICBjb25zdCBiZyA9IGRnID4gc2cgPyBkZyAtIHNnIDogc2cgLSBkZztcbiAgY29uc3QgYmIgPSBkYiA+IHNiID8gZGIgLSBzYiA6IHNiIC0gZGI7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkE7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIGRzdCArIHNyYyAtICgoZHN0ICogc3JjKSA+PiA3KSAqL1xuZXhwb3J0IGNvbnN0IGV4Y2x1c2lvblBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRjtcbiAgY29uc3QgZGcgPSBkc3QgPj4+IDggJiAweEZGO1xuICBjb25zdCBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkY7XG4gIGNvbnN0IHNnID0gc3JjID4+PiA4ICYgMHhGRjtcbiAgY29uc3Qgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgcjIgPSBkciAqIHNyO1xuICBjb25zdCBiciA9IGRyICsgc3IgLSAocjIgKyByMiArIDEgKyAocjIgKyByMiA+PiA4KSA+PiA4KTtcbiAgY29uc3QgZzIgPSBkZyAqIHNnO1xuICBjb25zdCBiZyA9IGRnICsgc2cgLSAoZzIgKyBnMiArIDEgKyAoZzIgKyBnMiA+PiA4KSA+PiA4KTtcbiAgY29uc3QgYjIgPSBkYiAqIHNiO1xuICBjb25zdCBiYiA9IGRiICsgc2IgLSAoYjIgKyBiMiArIDEgKyAoYjIgKyBiMiA+PiA4KSA+PiA4KTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogTWF0aC5tYXgoMCwgZHN0IC0gc3JjKSAqL1xuZXhwb3J0IGNvbnN0IHN1YnRyYWN0UGVyZmVjdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyVSA9IGRyIC0gc3I7XG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclU7XG4gIGNvbnN0IGJnVSA9IGRnIC0gc2c7XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1U7XG4gIGNvbnN0IGJiVSA9IGRiIC0gc2I7XG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlU7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCBkYSA9IGRzdCA+Pj4gMjQgJiAweEZGO1xuICBjb25zdCB0UiA9IGJyICogc2EgKyBkciAqIGludkE7XG4gIGNvbnN0IHIgPSB0UiArIDEgKyAodFIgPj4gOCkgPj4gODtcbiAgY29uc3QgdEcgPSBiZyAqIHNhICsgZGcgKiBpbnZBO1xuICBjb25zdCBnID0gdEcgKyAxICsgKHRHID4+IDgpID4+IDg7XG4gIGNvbnN0IHRCID0gYmIgKiBzYSArIGRiICogaW52QTtcbiAgY29uc3QgYiA9IHRCICsgMSArICh0QiA+PiA4KSA+PiA4O1xuICBjb25zdCB0QSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBO1xuICBjb25zdCBhID0gdEEgKyAxICsgKHRBID4+IDgpID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIHNyID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZHIgPDwgOCkgLyBzcikgKi9cbmV4cG9ydCBjb25zdCBkaXZpZGVQZXJmZWN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgZHIgKiAyNTUgLyBzciB8IDApO1xuICBjb25zdCBiZyA9IHNnID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCBkZyAqIDI1NSAvIHNnIHwgMCk7XG4gIGNvbnN0IGJiID0gc2IgPT09IDAgPyAyNTUgOiBNYXRoLm1pbigyNTUsIGRiICogMjU1IC8gc2IgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHRSID0gYnIgKiBzYSArIGRyICogaW52QTtcbiAgY29uc3QgciA9IHRSICsgMSArICh0UiA+PiA4KSA+PiA4O1xuICBjb25zdCB0RyA9IGJnICogc2EgKyBkZyAqIGludkE7XG4gIGNvbnN0IGcgPSB0RyArIDEgKyAodEcgPj4gOCkgPj4gODtcbiAgY29uc3QgdEIgPSBiYiAqIHNhICsgZGIgKiBpbnZBO1xuICBjb25zdCBiID0gdEIgKyAxICsgKHRCID4+IDgpID4+IDg7XG4gIGNvbnN0IHRBID0gMjU1ICogc2EgKyBkYSAqIGludkE7XG4gIGNvbnN0IGEgPSB0QSArIDEgKyAodEEgPj4gOCkgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUzogUmVjb3JkPG51bWJlciwgQmxlbmRDb2xvcjMyPiA9IHtcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcndyaXRlXTogb3ZlcndyaXRlUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlSW5dOiBzb3VyY2VJblBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvdXJjZU91dF06IHNvdXJjZU91dFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvdXJjZUF0b3BdOiBzb3VyY2VBdG9wUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGVzdGluYXRpb25PdmVyXTogZGVzdGluYXRpb25PdmVyUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGVzdGluYXRpb25Jbl06IGRlc3RpbmF0aW9uSW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kZXN0aW5hdGlvbk91dF06IGRlc3RpbmF0aW9uT3V0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGVzdGluYXRpb25BdG9wXTogZGVzdGluYXRpb25BdG9wUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUueG9yXTogeG9yUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlT3Zlcl06IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZW5dOiBkYXJrZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5tdWx0aXBseV06IG11bHRpcGx5UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JCdXJuXTogY29sb3JCdXJuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyQnVybl06IGxpbmVhckJ1cm5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZXJDb2xvcl06IGRhcmtlclBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpZ2h0ZW5dOiBsaWdodGVuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc2NyZWVuXTogc2NyZWVuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JEb2RnZV06IGNvbG9yRG9kZ2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJEb2RnZV06IGxpbmVhckRvZGdlUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGlnaHRlckNvbG9yXTogbGlnaHRlclBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJsYXldOiBvdmVybGF5UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc29mdExpZ2h0XTogc29mdExpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuaGFyZExpZ2h0XTogaGFyZExpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUudml2aWRMaWdodF06IHZpdmlkTGlnaHRQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJMaWdodF06IGxpbmVhckxpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUucGluTGlnaHRdOiBwaW5MaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRNaXhdOiBoYXJkTWl4UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGlmZmVyZW5jZV06IGRpZmZlcmVuY2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5leGNsdXNpb25dOiBleGNsdXNpb25QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zdWJ0cmFjdF06IHN1YnRyYWN0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGl2aWRlXTogZGl2aWRlUGVyZmVjdFxufTtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGVyZmVjdEJsZW5kTW9kZVJlZ2lzdHJ5KG5hbWUgPSAncGVyZmVjdCcpIHtcbiAgcmV0dXJuIG1ha2VCbGVuZE1vZGVSZWdpc3RyeShCYXNlQmxlbmRNb2RlLCBCQVNFX1BFUkZFQ1RfQkxFTkRfTU9ERV9GVU5DVElPTlMsIG5hbWUpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { BaseBlendMode } from './blend-modes';\nexport function toBlendModeIndexAndName(input: string | number) {\n if (typeof input === 'number') {\n const name = getKeyByValue(BaseBlendMode, input);\n if (name === undefined) throw new Error(`Invalid index: ${input}`);\n return {\n blendIndex: input,\n blendName: name\n };\n }\n const trimmed = input.trim();\n const num = Number(trimmed);\n const isNumeric = trimmed !== '' && !Number.isNaN(num);\n if (isNumeric && Number.isInteger(num)) {\n const name = getKeyByValue(BaseBlendMode, num);\n if (name === undefined) throw new Error(`Invalid index: ${num}`);\n return {\n blendIndex: num,\n blendName: name\n };\n }\n if (trimmed in BaseBlendMode) {\n return {\n blendIndex: BaseBlendMode[trimmed as keyof typeof BaseBlendMode],\n blendName: trimmed as keyof typeof BaseBlendMode\n };\n }\n throw new Error(`Invalid blend mode: ${JSON.stringify(input)}`);\n}\nconst getKeyByValue = (obj: any, value: any) => {\n for (const key in obj) {\n if (obj[key] === value) return key;\n }\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQmxlbmRNb2RlIH0gZnJvbSAnLi9ibGVuZC1tb2Rlcyc7XG5leHBvcnQgZnVuY3Rpb24gdG9CbGVuZE1vZGVJbmRleEFuZE5hbWUoaW5wdXQ6IHN0cmluZyB8IG51bWJlcikge1xuICBpZiAodHlwZW9mIGlucHV0ID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IG5hbWUgPSBnZXRLZXlCeVZhbHVlKEJhc2VCbGVuZE1vZGUsIGlucHV0KTtcbiAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW5kZXg6ICR7aW5wdXR9YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJsZW5kSW5kZXg6IGlucHV0LFxuICAgICAgYmxlbmROYW1lOiBuYW1lXG4gICAgfTtcbiAgfVxuICBjb25zdCB0cmltbWVkID0gaW5wdXQudHJpbSgpO1xuICBjb25zdCBudW0gPSBOdW1iZXIodHJpbW1lZCk7XG4gIGNvbnN0IGlzTnVtZXJpYyA9IHRyaW1tZWQgIT09ICcnICYmICFOdW1iZXIuaXNOYU4obnVtKTtcbiAgaWYgKGlzTnVtZXJpYyAmJiBOdW1iZXIuaXNJbnRlZ2VyKG51bSkpIHtcbiAgICBjb25zdCBuYW1lID0gZ2V0S2V5QnlWYWx1ZShCYXNlQmxlbmRNb2RlLCBudW0pO1xuICAgIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbmRleDogJHtudW19YCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJsZW5kSW5kZXg6IG51bSxcbiAgICAgIGJsZW5kTmFtZTogbmFtZVxuICAgIH07XG4gIH1cbiAgaWYgKHRyaW1tZWQgaW4gQmFzZUJsZW5kTW9kZSkge1xuICAgIHJldHVybiB7XG4gICAgICBibGVuZEluZGV4OiBCYXNlQmxlbmRNb2RlW3RyaW1tZWQgYXMga2V5b2YgdHlwZW9mIEJhc2VCbGVuZE1vZGVdLFxuICAgICAgYmxlbmROYW1lOiB0cmltbWVkIGFzIGtleW9mIHR5cGVvZiBCYXNlQmxlbmRNb2RlXG4gICAgfTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgYmxlbmQgbW9kZTogJHtKU09OLnN0cmluZ2lmeShpbnB1dCl9YCk7XG59XG5jb25zdCBnZXRLZXlCeVZhbHVlID0gKG9iajogYW55LCB2YWx1ZTogYW55KSA9PiB7XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmpba2V5XSA9PT0gdmFsdWUpIHJldHVybiBrZXk7XG4gIH1cbn07Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { BaseBlendMode } from '../BlendModes/blend-modes';\nexport const CANVAS_COMPOSITE_MAP = {\n [BaseBlendMode.overwrite]: 'copy',\n [BaseBlendMode.sourceOver]: 'source-over',\n [BaseBlendMode.darken]: 'darken',\n [BaseBlendMode.multiply]: 'multiply',\n [BaseBlendMode.colorBurn]: 'color-burn',\n [BaseBlendMode.lighten]: 'lighten',\n [BaseBlendMode.screen]: 'screen',\n [BaseBlendMode.colorDodge]: 'color-dodge',\n [BaseBlendMode.linearDodge]: 'lighter',\n [BaseBlendMode.overlay]: 'overlay',\n [BaseBlendMode.softLight]: 'soft-light',\n [BaseBlendMode.hardLight]: 'hard-light',\n [BaseBlendMode.difference]: 'difference',\n [BaseBlendMode.exclusion]: 'exclusion'\n} as const;\nexport type CanvasBlendModeIndex = keyof typeof CANVAS_COMPOSITE_MAP;\nexport type CanvasCompositeOperation = typeof CANVAS_COMPOSITE_MAP[CanvasBlendModeIndex];\n\n/**\n * example\n * function getCanvasCompositeOperation(mode: CanvasBlendModeIndex): CanvasCompositeOperation {\n * return CANVAS_COMPOSITE_MAP[mode]\n * }\n */\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQmxlbmRNb2RlIH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcyc7XG5leHBvcnQgY29uc3QgQ0FOVkFTX0NPTVBPU0lURV9NQVAgPSB7XG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJ3cml0ZV06ICdjb3B5JyxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlT3Zlcl06ICdzb3VyY2Utb3ZlcicsXG4gIFtCYXNlQmxlbmRNb2RlLmRhcmtlbl06ICdkYXJrZW4nLFxuICBbQmFzZUJsZW5kTW9kZS5tdWx0aXBseV06ICdtdWx0aXBseScsXG4gIFtCYXNlQmxlbmRNb2RlLmNvbG9yQnVybl06ICdjb2xvci1idXJuJyxcbiAgW0Jhc2VCbGVuZE1vZGUubGlnaHRlbl06ICdsaWdodGVuJyxcbiAgW0Jhc2VCbGVuZE1vZGUuc2NyZWVuXTogJ3NjcmVlbicsXG4gIFtCYXNlQmxlbmRNb2RlLmNvbG9yRG9kZ2VdOiAnY29sb3ItZG9kZ2UnLFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJEb2RnZV06ICdsaWdodGVyJyxcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcmxheV06ICdvdmVybGF5JyxcbiAgW0Jhc2VCbGVuZE1vZGUuc29mdExpZ2h0XTogJ3NvZnQtbGlnaHQnLFxuICBbQmFzZUJsZW5kTW9kZS5oYXJkTGlnaHRdOiAnaGFyZC1saWdodCcsXG4gIFtCYXNlQmxlbmRNb2RlLmRpZmZlcmVuY2VdOiAnZGlmZmVyZW5jZScsXG4gIFtCYXNlQmxlbmRNb2RlLmV4Y2x1c2lvbl06ICdleGNsdXNpb24nXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgQ2FudmFzQmxlbmRNb2RlSW5kZXggPSBrZXlvZiB0eXBlb2YgQ0FOVkFTX0NPTVBPU0lURV9NQVA7XG5leHBvcnQgdHlwZSBDYW52YXNDb21wb3NpdGVPcGVyYXRpb24gPSB0eXBlb2YgQ0FOVkFTX0NPTVBPU0lURV9NQVBbQ2FudmFzQmxlbmRNb2RlSW5kZXhdO1xuXG4vKipcbiAqIGV4YW1wbGVcbiAqIGZ1bmN0aW9uIGdldENhbnZhc0NvbXBvc2l0ZU9wZXJhdGlvbihtb2RlOiBDYW52YXNCbGVuZE1vZGVJbmRleCk6IENhbnZhc0NvbXBvc2l0ZU9wZXJhdGlvbiB7XG4gKiAgIHJldHVybiBDQU5WQVNfQ09NUE9TSVRFX01BUFttb2RlXVxuICogfVxuICovIl0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { CANVAS_CTX_FAILED } from '../Internal/_errors';\nimport type { CanvasContext } from './_canvas-types';\n\n/**\n * Creates a reusable HTMLCanvasElement 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 return makeReusableCanvasMeta<HTMLCanvasElement>((w, h) => {\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n return canvas;\n });\n}\n\n/**\n * Creates a reusable OffscreenCanvas and context.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link OffscreenCanvasRenderingContext2D} context cannot be initialized.\n */\nexport function makeReusableOffscreenCanvas() {\n return makeReusableCanvasMeta<OffscreenCanvas>((w, h) => new OffscreenCanvas(w, h));\n}\nfunction makeReusableCanvasMeta<T extends HTMLCanvasElement | OffscreenCanvas>(factory: CanvasObjectFactory<T>): ReusableCanvasFactory<T> {\n let canvas: T | null = null;\n let ctx: CanvasContext<T> | null = null;\n const result: ReusableCanvas<T> = {\n canvas: null as any,\n ctx: null as any\n };\n function get(width: number, height: number): ReusableCanvas<T> {\n if (canvas === null) {\n canvas = factory(width, height);\n ctx = canvas.getContext('2d') as CanvasContext<T> | null;\n if (!ctx) {\n throw new Error(CANVAS_CTX_FAILED);\n }\n\n // Initialize the fresh context state\n ctx.imageSmoothingEnabled = false;\n (result as any).canvas = canvas;\n (result as any).ctx = ctx;\n\n // Early return to skip resize/clear checks for brand new canvases\n return result;\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 // Always reset transform before clearing to ensure the whole buffer is wiped\n ctx!.setTransform(1, 0, 0, 1, 0, 0);\n // Same size → manually clear\n ctx!.clearRect(0, 0, width, height);\n }\n return result;\n }\n get.reset = () => {\n canvas = null;\n ctx = null;\n (result as any).canvas = null;\n (result as any).ctx = null;\n };\n return get;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uL0ludGVybmFsL19lcnJvcnMnO1xuaW1wb3J0IHR5cGUgeyBDYW52YXNDb250ZXh0IH0gZnJvbSAnLi9fY2FudmFzLXR5cGVzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmV1c2FibGUgSFRNTENhbnZhc0VsZW1lbnQgYW5kIGNvbnRleHQgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIERPTS5cbiAqIEVuc3VyZXMgaXQgaXMgYWx3YXlzIHNldCB0byBgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZWBcbiAqIEBzZWUgbWFrZVBpeGVsQ2FudmFzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHtAbGluayBIVE1MQ2FudmFzRWxlbWVudH0gY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmV1c2FibGVDYW52YXMoKSB7XG4gIHJldHVybiBtYWtlUmV1c2FibGVDYW52YXNNZXRhPEhUTUxDYW52YXNFbGVtZW50PigodywgaCkgPT4ge1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHc7XG4gICAgY2FudmFzLmhlaWdodCA9IGg7XG4gICAgcmV0dXJuIGNhbnZhcztcbiAgfSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJldXNhYmxlIE9mZnNjcmVlbkNhbnZhcyBhbmQgY29udGV4dC5cbiAqIEVuc3VyZXMgaXQgaXMgYWx3YXlzIHNldCB0byBgY29udGV4dC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZWBcbiAqIEBzZWUgbWFrZVBpeGVsQ2FudmFzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHtAbGluayBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkR9IGNvbnRleHQgY2Fubm90IGJlIGluaXRpYWxpemVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlT2Zmc2NyZWVuQ2FudmFzKCkge1xuICByZXR1cm4gbWFrZVJldXNhYmxlQ2FudmFzTWV0YTxPZmZzY3JlZW5DYW52YXM+KCh3LCBoKSA9PiBuZXcgT2Zmc2NyZWVuQ2FudmFzKHcsIGgpKTtcbn1cbmZ1bmN0aW9uIG1ha2VSZXVzYWJsZUNhbnZhc01ldGE8VCBleHRlbmRzIEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzPihmYWN0b3J5OiBDYW52YXNPYmplY3RGYWN0b3J5PFQ+KTogUmV1c2FibGVDYW52YXNGYWN0b3J5PFQ+IHtcbiAgbGV0IGNhbnZhczogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgY3R4OiBDYW52YXNDb250ZXh0PFQ+IHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJlc3VsdDogUmV1c2FibGVDYW52YXM8VD4gPSB7XG4gICAgY2FudmFzOiBudWxsIGFzIGFueSxcbiAgICBjdHg6IG51bGwgYXMgYW55XG4gIH07XG4gIGZ1bmN0aW9uIGdldCh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFJldXNhYmxlQ2FudmFzPFQ+IHtcbiAgICBpZiAoY2FudmFzID09PSBudWxsKSB7XG4gICAgICBjYW52YXMgPSBmYWN0b3J5KHdpZHRoLCBoZWlnaHQpO1xuICAgICAgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykgYXMgQ2FudmFzQ29udGV4dDxUPiB8IG51bGw7XG4gICAgICBpZiAoIWN0eCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHRoZSBmcmVzaCBjb250ZXh0IHN0YXRlXG4gICAgICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAocmVzdWx0IGFzIGFueSkuY2FudmFzID0gY2FudmFzO1xuICAgICAgKHJlc3VsdCBhcyBhbnkpLmN0eCA9IGN0eDtcblxuICAgICAgLy8gRWFybHkgcmV0dXJuIHRvIHNraXAgcmVzaXplL2NsZWFyIGNoZWNrcyBmb3IgYnJhbmQgbmV3IGNhbnZhc2VzXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8vIFJlc2l6ZSBpZiBuZWVkZWQgKHJlc2l6aW5nIGF1dG8tY2xlYXJzKVxuICAgIGlmIChjYW52YXMud2lkdGggIT09IHdpZHRoIHx8IGNhbnZhcy5oZWlnaHQgIT09IGhlaWdodCkge1xuICAgICAgY2FudmFzLndpZHRoID0gd2lkdGg7XG4gICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgY3R4IS5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWx3YXlzIHJlc2V0IHRyYW5zZm9ybSBiZWZvcmUgY2xlYXJpbmcgdG8gZW5zdXJlIHRoZSB3aG9sZSBidWZmZXIgaXMgd2lwZWRcbiAgICAgIGN0eCEuc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgICAgLy8gU2FtZSBzaXplIOKGkiBtYW51YWxseSBjbGVhclxuICAgICAgY3R4IS5jbGVhclJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgZ2V0LnJlc2V0ID0gKCkgPT4ge1xuICAgIGNhbnZhcyA9IG51bGw7XG4gICAgY3R4ID0gbnVsbDtcbiAgICAocmVzdWx0IGFzIGFueSkuY2FudmFzID0gbnVsbDtcbiAgICAocmVzdWx0IGFzIGFueSkuY3R4ID0gbnVsbDtcbiAgfTtcbiAgcmV0dXJuIGdldDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeReusableOffscreenCanvas } from './ReusableCanvas';\nexport type CanvasFrameRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas> = ReturnType<typeof makeCanvasFrameRenderer<T>>;\nexport function makeCanvasFrameRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas>(reusableCanvasFactory: () => ReusableCanvasFactory<T> = makeReusableOffscreenCanvas as unknown as () => ReusableCanvasFactory<T>) {\n const getBuffer = reusableCanvasFactory();\n return function renderCanvasFrame(pixelCanvas: PixelCanvas, scale: number, getImageData: () => ImageData | undefined | null, drawPixelLayer?: DrawPixelLayer<T>, drawScreenLayer?: DrawScreenLayer) {\n const canvas = pixelCanvas.canvas;\n const ctx = pixelCanvas.ctx;\n const w = canvas.width;\n const h = canvas.height;\n\n // 1. Clear pixel buffer\n const buffer = getBuffer(w, h);\n\n // 2. Draw pixel data into pixel buffer\n const img = getImageData();\n if (img) {\n buffer.ctx.putImageData(img, 0, 0);\n }\n\n // draw transient pixel data\n drawPixelLayer?.(buffer.ctx);\n\n // clear target canvas\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n // Draw pixel buffer scaled onto screen\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n ctx.drawImage(buffer.canvas, 0, 0);\n\n // Draw overlays in screen space\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n drawScreenLayer?.(ctx, scale);\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUmV1c2FibGVPZmZzY3JlZW5DYW52YXMgfSBmcm9tICcuL1JldXNhYmxlQ2FudmFzJztcbmV4cG9ydCB0eXBlIENhbnZhc0ZyYW1lUmVuZGVyZXI8VCBleHRlbmRzIEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzID0gT2Zmc2NyZWVuQ2FudmFzPiA9IFJldHVyblR5cGU8dHlwZW9mIG1ha2VDYW52YXNGcmFtZVJlbmRlcmVyPFQ+PjtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2FudmFzRnJhbWVSZW5kZXJlcjxUIGV4dGVuZHMgSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXMgPSBPZmZzY3JlZW5DYW52YXM+KHJldXNhYmxlQ2FudmFzRmFjdG9yeTogKCkgPT4gUmV1c2FibGVDYW52YXNGYWN0b3J5PFQ+ID0gbWFrZVJldXNhYmxlT2Zmc2NyZWVuQ2FudmFzIGFzIHVua25vd24gYXMgKCkgPT4gUmV1c2FibGVDYW52YXNGYWN0b3J5PFQ+KSB7XG4gIGNvbnN0IGdldEJ1ZmZlciA9IHJldXNhYmxlQ2FudmFzRmFjdG9yeSgpO1xuICByZXR1cm4gZnVuY3Rpb24gcmVuZGVyQ2FudmFzRnJhbWUocGl4ZWxDYW52YXM6IFBpeGVsQ2FudmFzLCBzY2FsZTogbnVtYmVyLCBnZXRJbWFnZURhdGE6ICgpID0+IEltYWdlRGF0YSB8IHVuZGVmaW5lZCB8IG51bGwsIGRyYXdQaXhlbExheWVyPzogRHJhd1BpeGVsTGF5ZXI8VD4sIGRyYXdTY3JlZW5MYXllcj86IERyYXdTY3JlZW5MYXllcikge1xuICAgIGNvbnN0IGNhbnZhcyA9IHBpeGVsQ2FudmFzLmNhbnZhcztcbiAgICBjb25zdCBjdHggPSBwaXhlbENhbnZhcy5jdHg7XG4gICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aDtcbiAgICBjb25zdCBoID0gY2FudmFzLmhlaWdodDtcblxuICAgIC8vIDEuIENsZWFyIHBpeGVsIGJ1ZmZlclxuICAgIGNvbnN0IGJ1ZmZlciA9IGdldEJ1ZmZlcih3LCBoKTtcblxuICAgIC8vIDIuIERyYXcgcGl4ZWwgZGF0YSBpbnRvIHBpeGVsIGJ1ZmZlclxuICAgIGNvbnN0IGltZyA9IGdldEltYWdlRGF0YSgpO1xuICAgIGlmIChpbWcpIHtcbiAgICAgIGJ1ZmZlci5jdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0cmFuc2llbnQgcGl4ZWwgZGF0YVxuICAgIGRyYXdQaXhlbExheWVyPy4oYnVmZmVyLmN0eCk7XG5cbiAgICAvLyBjbGVhciB0YXJnZXQgY2FudmFzXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuXG4gICAgLy8gRHJhdyBwaXhlbCBidWZmZXIgc2NhbGVkIG9udG8gc2NyZWVuXG4gICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZSwgMCwgMCwgc2NhbGUsIDAsIDApO1xuICAgIGN0eC5kcmF3SW1hZ2UoYnVmZmVyLmNhbnZhcywgMCwgMCk7XG5cbiAgICAvLyBEcmF3IG92ZXJsYXlzIGluIHNjcmVlbiBzcGFjZVxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgZHJhd1NjcmVlbkxheWVyPy4oY3R4LCBzY2FsZSk7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeReusableOffscreenCanvas } from './ReusableCanvas';\nexport type CanvasPixelDataRenderer = ReturnType<typeof makeCanvasPixelDataRenderer>;\nexport function makeCanvasPixelDataRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas>(reusableCanvasFactory: () => ReusableCanvasFactory<T> = makeReusableOffscreenCanvas as unknown as () => ReusableCanvasFactory<T>) {\n const bufferCanvas = reusableCanvasFactory();\n return function drawPixelData(targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, pixelData: PixelData, x = 0, y = 0): void {\n const buffer = bufferCanvas(pixelData.w, pixelData.h);\n buffer.ctx.putImageData(pixelData.imageData, 0, 0);\n targetCtx.drawImage(buffer.canvas, x, y);\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUmV1c2FibGVPZmZzY3JlZW5DYW52YXMgfSBmcm9tICcuL1JldXNhYmxlQ2FudmFzJztcbmV4cG9ydCB0eXBlIENhbnZhc1BpeGVsRGF0YVJlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUNhbnZhc1BpeGVsRGF0YVJlbmRlcmVyPjtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2FudmFzUGl4ZWxEYXRhUmVuZGVyZXI8VCBleHRlbmRzIEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzID0gT2Zmc2NyZWVuQ2FudmFzPihyZXVzYWJsZUNhbnZhc0ZhY3Rvcnk6ICgpID0+IFJldXNhYmxlQ2FudmFzRmFjdG9yeTxUPiA9IG1ha2VSZXVzYWJsZU9mZnNjcmVlbkNhbnZhcyBhcyB1bmtub3duIGFzICgpID0+IFJldXNhYmxlQ2FudmFzRmFjdG9yeTxUPikge1xuICBjb25zdCBidWZmZXJDYW52YXMgPSByZXVzYWJsZUNhbnZhc0ZhY3RvcnkoKTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRyYXdQaXhlbERhdGEodGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIHBpeGVsRGF0YTogUGl4ZWxEYXRhLCB4ID0gMCwgeSA9IDApOiB2b2lkIHtcbiAgICBjb25zdCBidWZmZXIgPSBidWZmZXJDYW52YXMocGl4ZWxEYXRhLncsIHBpeGVsRGF0YS5oKTtcbiAgICBidWZmZXIuY3R4LnB1dEltYWdlRGF0YShwaXhlbERhdGEuaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICB0YXJnZXRDdHguZHJhd0ltYWdlKGJ1ZmZlci5jYW52YXMsIHgsIHkpO1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { CANVAS_CTX_FAILED } from '../Internal/_errors';\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(canvas: HTMLCanvasElement): PixelCanvas {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uL0ludGVybmFsL19lcnJvcnMnO1xuLyoqXG4gKiBFbnN1cmVzIHRoZSBjYW52YXMgY3R4IGlzIGFsd2F5cyBzZXQgdG8gaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2UuXG4gKiBJbnRlbmRlZCBmb3IgY2FudmFzIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NLlxuICogQHNlZSBtYWtlUmV1c2FibGVDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQaXhlbENhbnZhcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogUGl4ZWxDYW52YXMge1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRCk7XG4gIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBjYW52YXMsXG4gICAgY3R4LFxuICAgIHJlc2l6ZSh3OiBudW1iZXIsIGg6IG51bWJlcikge1xuICAgICAgY2FudmFzLndpZHRoID0gdztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\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(blob: Blob): Promise<ImageData> {\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(blob);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Failed to get 2D context');\n }\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERlY29kZXMgYSB7QGxpbmsgQmxvYn0gKHR5cGljYWxseSBQTkcpIGJhY2sgaW50byBhbiB7QGxpbmsgSW1hZ2VEYXRhfSBvYmplY3QuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB1c2VzIGhhcmR3YXJlLWFjY2VsZXJhdGVkIGRlY29kaW5nIHZpYSB7QGxpbmsgY3JlYXRlSW1hZ2VCaXRtYXB9XG4gKiBhbmQgcHJvY2Vzc2VzIHRoZSBkYXRhIHVzaW5nIGFuIHtAbGluayBPZmZzY3JlZW5DYW52YXN9IHRvIGVuc3VyZVxuICogY29tcGF0aWJpbGl0eSB3aXRoIFdlYiBXb3JrZXJzLlxuICpcbiAqIEBwYXJhbSBibG9iIC0gVGhlIGJpbmFyeSBpbWFnZSBkYXRhIHRvIGRlY29kZS5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZWNvZGVkIHtAbGluayBJbWFnZURhdGF9LlxuICpcbiAqIEB0aHJvd3Mge0Vycm9yfVxuICogVGhyb3duIGlmIHRoZSBibG9iIGlzIGNvcnJ1cHRlZCBvciB0aGUgYnJvd3NlciBjYW5ub3QgZGVjb2RlIHRoZSBmb3JtYXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGJsb2IgPSBhd2FpdCBnZXRCbG9iRnJvbVN0b3JhZ2UoKTtcbiAqXG4gKiBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBwbmdCbG9iVG9JbWFnZURhdGEoYmxvYik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGltZ0Jsb2JUb0ltYWdlRGF0YShibG9iOiBCbG9iKTogUHJvbWlzZTxJbWFnZURhdGE+IHtcbiAgbGV0IGJpdG1hcDogSW1hZ2VCaXRtYXAgfCBudWxsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBiaXRtYXAgPSBhd2FpdCBjcmVhdGVJbWFnZUJpdG1hcChibG9iKTtcbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKGJpdG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCk7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgaWYgKCFjdHgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGdldCAyRCBjb250ZXh0Jyk7XG4gICAgfVxuICAgIGN0eC5kcmF3SW1hZ2UoYml0bWFwLCAwLCAwKTtcbiAgICByZXR1cm4gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBiaXRtYXAud2lkdGgsIGJpdG1hcC5oZWlnaHQpO1xuICB9IGZpbmFsbHkge1xuICAgIGJpdG1hcD8uY2xvc2UoKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 for (let i = 0; i < items.length; i++) {\n const item = items[i];\n if (item.type.startsWith('image/')) {\n const blob = item.getAsFile();\n if (!blob) {\n continue;\n }\n return imgBlobToImageData(blob);\n }\n }\n return null;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbWdCbG9iVG9JbWFnZURhdGEgfSBmcm9tICcuLi9JbWFnZURhdGEvaW1nQmxvYlRvSW1hZ2VEYXRhJztcblxuLyoqXG4gKiBFeHRyYWN0cyB7QGxpbmsgSW1hZ2VEYXRhfSBmcm9tIGEgY2xpcGJvYXJkIGV2ZW50IGlmIGFuIGltYWdlIGlzIHByZXNlbnQuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpdGVyYXRlcyB0aHJvdWdoIHRoZSB7QGxpbmsgRGF0YVRyYW5zZmVySXRlbUxpc3R9IHRvIGZpbmRcbiAqIHRoZSBmaXJzdCBpdGVtIHdpdGggYW4gaW1hZ2UgTUlNRSB0eXBlIGFuZCBkZWNvZGVzIGl0LlxuICpcbiAqIEBwYXJhbSBjbGlwYm9hcmRFdmVudCAtIFRoZSBldmVudCBvYmplY3QgZnJvbSBhIGBwYXN0ZWAgbGlzdGVuZXIuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHJlc29sdmluZyB0byB7QGxpbmsgSW1hZ2VEYXRhfSwgb3IgYG51bGxgIGlmIG5vXG4gKiBpbWFnZSB3YXMgZm91bmQgaW4gdGhlIGNsaXBib2FyZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Bhc3RlJywgYXN5bmMgKGV2ZW50KSA9PiB7XG4gKiAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRJbWFnZURhdGFGcm9tQ2xpcGJvYXJkKGV2ZW50KVxuICogICBpZiAoZGF0YSkge1xuICogICAgIGNvbnNvbGUubG9nKCdQYXN0ZWQgaW1hZ2UgZGltZW5zaW9uczonLCBkYXRhLndpZHRoLCBkYXRhLmhlaWdodClcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEltYWdlRGF0YUZyb21DbGlwYm9hcmQoY2xpcGJvYXJkRXZlbnQ6IENsaXBib2FyZEV2ZW50KSB7XG4gIGNvbnN0IGl0ZW1zID0gY2xpcGJvYXJkRXZlbnQ/LmNsaXBib2FyZERhdGE/Lml0ZW1zO1xuICBpZiAoIWl0ZW1zPy5sZW5ndGgpIHJldHVybiBudWxsO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgIGlmIChpdGVtLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgIGNvbnN0IGJsb2IgPSBpdGVtLmdldEFzRmlsZSgpO1xuICAgICAgaWYgKCFibG9iKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGltZ0Jsb2JUb0ltYWdlRGF0YShibG9iKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 ctx.putImageData(imageData, 0, 0);\n return canvas!.convertToBlob({\n type: 'image/png'\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnZlcnRzIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdCBpbnRvIGEge0BsaW5rIEJsb2J9IGluIFBORyBmb3JtYXQuXG4gKlxuICogVGhpcyBvcGVyYXRpb24gaXMgYXN5bmNocm9ub3VzIGFuZCB1c2VzIHtAbGluayBPZmZzY3JlZW5DYW52YXN9XG4gKiB0byBwZXJmb3JtIHRoZSBlbmNvZGluZywgbWFraW5nIGl0IHN1aXRhYmxlIGZvciB1c2FnZSBpbiBib3RoIHRoZSBtYWluXG4gKiB0aHJlYWQgYW5kIFdlYiBXb3JrZXJzLlxuICpcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgcGl4ZWwgZGF0YSB0byBiZSBlbmNvZGVkLlxuICpcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEge0BsaW5rIEJsb2J9IHdpdGggdGhlIE1JTUUgdHlwZSBgaW1hZ2UvcG5nYC5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqIFRocm93biBpZiB0aGUge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30gY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQgb3IgdGhlIGJsb2JcbiAqIGVuY29kaW5nIGZhaWxzLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBibG9iID0gYXdhaXQgaW1hZ2VEYXRhVG9JbWdCbG9iKGltYWdlRGF0YSk7XG4gKiBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbWFnZURhdGFUb0ltZ0Jsb2IoaW1hZ2VEYXRhOiBJbWFnZURhdGEpOiBQcm9taXNlPEJsb2I+IHtcbiAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcignY291bGQgbm90IGNyZWF0ZSAyZCBjb250ZXh0Jyk7XG4gIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgcmV0dXJuIGNhbnZhcyEuY29udmVydFRvQmxvYih7XG4gICAgdHlwZTogJ2ltYWdlL3BuZydcbiAgfSk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Writes a {@link Blob} image to the system clipboard.\n *\n * @param blob - The image 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 await navigator.clipboard.write([item]);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdyaXRlcyBhIHtAbGluayBCbG9ifSBpbWFnZSB0byB0aGUgc3lzdGVtIGNsaXBib2FyZC5cbiAqXG4gKiBAcGFyYW0gYmxvYiAtIFRoZSBpbWFnZSBibG9iICh0eXBpY2FsbHkgYGltYWdlL3BuZ2ApIHRvIGNvcHkuXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBjbGlwYm9hcmQgaGFzIGJlZW4gdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdyaXRlSW1nQmxvYlRvQ2xpcGJvYXJkKGJsb2I6IEJsb2IpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaXRlbSA9IG5ldyBDbGlwYm9hcmRJdGVtKHtcbiAgICAnaW1hZ2UvcG5nJzogYmxvYlxuICB9KTtcbiAgYXdhaXQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZShbaXRlbV0pO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 return writeImgBlobToClipboard(blob);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbWFnZURhdGFUb0ltZ0Jsb2IgfSBmcm9tICcuLi9JbWFnZURhdGEvaW1hZ2VEYXRhVG9JbWdCbG9iJztcbmltcG9ydCB7IHdyaXRlSW1nQmxvYlRvQ2xpcGJvYXJkIH0gZnJvbSAnLi93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCc7XG5cbi8qKlxuICogQ29udmVydHMge0BsaW5rIEltYWdlRGF0YX0gdG8gYSBQTkcge0BsaW5rIEJsb2J9IGFuZCB3cml0ZXMgaXQgdG8gdGhlIHN5c3RlbSBjbGlwYm9hcmQuXG4gKiBUaGlzIGlzIGEgaGlnaC1sZXZlbCB1dGlsaXR5IHRoYXQgY29tYmluZXMge0BsaW5rIGltYWdlRGF0YVRvSW1nQmxvYn0gYW5kXG4gKiB7QGxpbmsgd3JpdGVJbWdCbG9iVG9DbGlwYm9hcmR9LlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBpbWFnZSBkYXRhIHRvIGNvcHkgdG8gdGhlIGNsaXBib2FyZC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGltYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBjb3BpZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn1cbiAqIElmIHRoZSBjb252ZXJzaW9uIHRvIGJsb2IgZmFpbHMgb3IgY2xpcGJvYXJkIHBlcm1pc3Npb25zIGFyZSBkZW5pZWQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2NhbnZhcycpXG4gKiBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKVxuICogY29uc3QgaW1hZ2VEYXRhID0gY3R4LmdldEltYWdlRGF0YSgwLCAwLCBjYW52YXMud2lkdGgsIGNhbnZhcy5oZWlnaHQpXG4gKiBhd2FpdCB3cml0ZUltYWdlRGF0YVRvQ2xpcGJvYXJkKGltYWdlRGF0YSlcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFUb0NsaXBib2FyZChpbWFnZURhdGE6IEltYWdlRGF0YSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBibG9iID0gYXdhaXQgaW1hZ2VEYXRhVG9JbWdCbG9iKGltYWdlRGF0YSk7XG4gIHJldHVybiB3cml0ZUltZ0Jsb2JUb0NsaXBib2FyZChibG9iKTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export type BatchedQueueFn = (fn: () => void) => void;\nexport type BatchedQueue = ReturnType<typeof makeBatchedQueue>;\n\n/**\n * Creates a high-performance, zero-allocation batching queue.\n * This utility collects items marked as \"dirty\" and flushes them in a single batch.\n * * **⚠️ CRITICAL: Synchronous Processing Required**\n * Because the internal sets are reused, the `Set` passed to the `processor` is instantly\n * cleared the moment the processor function returns. If you need to process the items\n * asynchronously, you **must** manually clone the set inside your processor.\n * @template T - The type of items being batched.\n * @param processor - The callback executed when the batch flushes. Receives a `Set` of all batched items.\n * @param queue - The scheduling function used to defer the flush. Defaults to `queueMicrotask`.\n * @returns An object containing methods to mark items as dirty.\n * @example\n * * @example\n * ```ts\n * import { nextTick } from 'vue'\n * let bq = makeBatchedQueue<string>(\n * (items) => drawSomething(items),\n * nextTick,\n * )\n * ```\n */\nexport function makeBatchedQueue<T>(processor: (items: Set<T>) => void, queue: BatchedQueueFn) {\n let activeSet = new Set<T>();\n let processingSet = new Set<T>();\n let scheduled = false;\n const flush = () => {\n // swap sets\n const current = activeSet;\n activeSet = processingSet;\n processingSet = current;\n scheduled = false;\n try {\n processor(processingSet);\n } finally {\n processingSet.clear();\n }\n };\n function markDirty(item: T) {\n activeSet.add(item);\n if (!scheduled) {\n scheduled = true;\n queue(flush);\n }\n }\n function markMultipleDirty(items: T[]) {\n let len = items.length;\n if (len === 0) return;\n for (let i = 0; i < len; i++) {\n activeSet.add(items[i]);\n }\n if (!scheduled) {\n scheduled = true;\n queue(flush);\n }\n }\n return {\n markDirty,\n markMultipleDirty\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBCYXRjaGVkUXVldWVGbiA9IChmbjogKCkgPT4gdm9pZCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJhdGNoZWRRdWV1ZSA9IFJldHVyblR5cGU8dHlwZW9mIG1ha2VCYXRjaGVkUXVldWU+O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoaWdoLXBlcmZvcm1hbmNlLCB6ZXJvLWFsbG9jYXRpb24gYmF0Y2hpbmcgcXVldWUuXG4gKiBUaGlzIHV0aWxpdHkgY29sbGVjdHMgaXRlbXMgbWFya2VkIGFzIFwiZGlydHlcIiBhbmQgZmx1c2hlcyB0aGVtIGluIGEgc2luZ2xlIGJhdGNoLlxuICogKiAqKuKaoO+4jyBDUklUSUNBTDogU3luY2hyb25vdXMgUHJvY2Vzc2luZyBSZXF1aXJlZCoqXG4gKiBCZWNhdXNlIHRoZSBpbnRlcm5hbCBzZXRzIGFyZSByZXVzZWQsIHRoZSBgU2V0YCBwYXNzZWQgdG8gdGhlIGBwcm9jZXNzb3JgIGlzIGluc3RhbnRseVxuICogY2xlYXJlZCB0aGUgbW9tZW50IHRoZSBwcm9jZXNzb3IgZnVuY3Rpb24gcmV0dXJucy4gSWYgeW91IG5lZWQgdG8gcHJvY2VzcyB0aGUgaXRlbXNcbiAqIGFzeW5jaHJvbm91c2x5LCB5b3UgKiptdXN0KiogbWFudWFsbHkgY2xvbmUgdGhlIHNldCBpbnNpZGUgeW91ciBwcm9jZXNzb3IuXG4gKiBAdGVtcGxhdGUgVCAtIFRoZSB0eXBlIG9mIGl0ZW1zIGJlaW5nIGJhdGNoZWQuXG4gKiBAcGFyYW0gcHJvY2Vzc29yIC0gVGhlIGNhbGxiYWNrIGV4ZWN1dGVkIHdoZW4gdGhlIGJhdGNoIGZsdXNoZXMuIFJlY2VpdmVzIGEgYFNldGAgb2YgYWxsIGJhdGNoZWQgaXRlbXMuXG4gKiBAcGFyYW0gcXVldWUgLSBUaGUgc2NoZWR1bGluZyBmdW5jdGlvbiB1c2VkIHRvIGRlZmVyIHRoZSBmbHVzaC4gRGVmYXVsdHMgdG8gYHF1ZXVlTWljcm90YXNrYC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIG1ldGhvZHMgdG8gbWFyayBpdGVtcyBhcyBkaXJ0eS5cbiAqIEBleGFtcGxlXG4gKiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgbmV4dFRpY2sgfSBmcm9tICd2dWUnXG4gKiBsZXQgYnEgPSBtYWtlQmF0Y2hlZFF1ZXVlPHN0cmluZz4oXG4gKiAgIChpdGVtcykgPT4gZHJhd1NvbWV0aGluZyhpdGVtcyksXG4gKiAgIG5leHRUaWNrLFxuICogKVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQmF0Y2hlZFF1ZXVlPFQ+KHByb2Nlc3NvcjogKGl0ZW1zOiBTZXQ8VD4pID0+IHZvaWQsIHF1ZXVlOiBCYXRjaGVkUXVldWVGbikge1xuICBsZXQgYWN0aXZlU2V0ID0gbmV3IFNldDxUPigpO1xuICBsZXQgcHJvY2Vzc2luZ1NldCA9IG5ldyBTZXQ8VD4oKTtcbiAgbGV0IHNjaGVkdWxlZCA9IGZhbHNlO1xuICBjb25zdCBmbHVzaCA9ICgpID0+IHtcbiAgICAvLyBzd2FwIHNldHNcbiAgICBjb25zdCBjdXJyZW50ID0gYWN0aXZlU2V0O1xuICAgIGFjdGl2ZVNldCA9IHByb2Nlc3NpbmdTZXQ7XG4gICAgcHJvY2Vzc2luZ1NldCA9IGN1cnJlbnQ7XG4gICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Nvcihwcm9jZXNzaW5nU2V0KTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzc2luZ1NldC5jbGVhcigpO1xuICAgIH1cbiAgfTtcbiAgZnVuY3Rpb24gbWFya0RpcnR5KGl0ZW06IFQpIHtcbiAgICBhY3RpdmVTZXQuYWRkKGl0ZW0pO1xuICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcXVldWUoZmx1c2gpO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBtYXJrTXVsdGlwbGVEaXJ0eShpdGVtczogVFtdKSB7XG4gICAgbGV0IGxlbiA9IGl0ZW1zLmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAwKSByZXR1cm47XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgYWN0aXZlU2V0LmFkZChpdGVtc1tpXSk7XG4gICAgfVxuICAgIGlmICghc2NoZWR1bGVkKSB7XG4gICAgICBzY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgcXVldWUoZmx1c2gpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIG1hcmtEaXJ0eSxcbiAgICBtYXJrTXVsdGlwbGVEaXJ0eVxuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Creates a debounced render queue using `requestAnimationFrame`.\n * This utility ensures that a callback is executed exactly once right before\n * the next visual frame, regardless of how many times the trigger is called\n * synchronously. It safely prevents layout thrashing and redundant computations.\n * @param cb - The function to execute on the next animation frame.\n * @returns A trigger function that schedules the callback. It includes a `.cancel()` method to abort the pending frame.\n * * @example\n * ```ts\n * let renderQueue = makeRenderQueue(() => {\n * console.log('DOM updated!')\n * })\n * * // Calling this multiple times synchronously...\n * renderQueue()\n * renderQueue()\n * renderQueue()\n * * // ...will only result in one 'DOM updated!' log on the next frame.\n * ```\n * * @example\n * ```ts\n * // Canceling a scheduled render (e.g., when a component unmounts)\n * let trigger = makeRenderQueue(updateLayout)\n * trigger()\n * trigger.cancel() // The callback will not execute\n * ```\n */\nexport function makeRenderQueue(cb: () => void) {\n let needsRender = false;\n let frameId = 0;\n const trigger = () => {\n if (needsRender) return;\n needsRender = true;\n frameId = requestAnimationFrame(() => {\n needsRender = false;\n cb();\n });\n };\n trigger.cancel = () => {\n if (needsRender) {\n cancelAnimationFrame(frameId);\n needsRender = false;\n }\n };\n return trigger;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENyZWF0ZXMgYSBkZWJvdW5jZWQgcmVuZGVyIHF1ZXVlIHVzaW5nIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLlxuICogVGhpcyB1dGlsaXR5IGVuc3VyZXMgdGhhdCBhIGNhbGxiYWNrIGlzIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSByaWdodCBiZWZvcmVcbiAqIHRoZSBuZXh0IHZpc3VhbCBmcmFtZSwgcmVnYXJkbGVzcyBvZiBob3cgbWFueSB0aW1lcyB0aGUgdHJpZ2dlciBpcyBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkuIEl0IHNhZmVseSBwcmV2ZW50cyBsYXlvdXQgdGhyYXNoaW5nIGFuZCByZWR1bmRhbnQgY29tcHV0YXRpb25zLlxuICogQHBhcmFtIGNiIC0gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgb24gdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lLlxuICogQHJldHVybnMgQSB0cmlnZ2VyIGZ1bmN0aW9uIHRoYXQgc2NoZWR1bGVzIHRoZSBjYWxsYmFjay4gSXQgaW5jbHVkZXMgYSBgLmNhbmNlbCgpYCBtZXRob2QgdG8gYWJvcnQgdGhlIHBlbmRpbmcgZnJhbWUuXG4gKiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogbGV0IHJlbmRlclF1ZXVlID0gbWFrZVJlbmRlclF1ZXVlKCgpID0+IHtcbiAqIGNvbnNvbGUubG9nKCdET00gdXBkYXRlZCEnKVxuICogfSlcbiAqICogLy8gQ2FsbGluZyB0aGlzIG11bHRpcGxlIHRpbWVzIHN5bmNocm9ub3VzbHkuLi5cbiAqIHJlbmRlclF1ZXVlKClcbiAqIHJlbmRlclF1ZXVlKClcbiAqIHJlbmRlclF1ZXVlKClcbiAqICogLy8gLi4ud2lsbCBvbmx5IHJlc3VsdCBpbiBvbmUgJ0RPTSB1cGRhdGVkIScgbG9nIG9uIHRoZSBuZXh0IGZyYW1lLlxuICogYGBgXG4gKiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQ2FuY2VsaW5nIGEgc2NoZWR1bGVkIHJlbmRlciAoZS5nLiwgd2hlbiBhIGNvbXBvbmVudCB1bm1vdW50cylcbiAqIGxldCB0cmlnZ2VyID0gbWFrZVJlbmRlclF1ZXVlKHVwZGF0ZUxheW91dClcbiAqIHRyaWdnZXIoKVxuICogdHJpZ2dlci5jYW5jZWwoKSAvLyBUaGUgY2FsbGJhY2sgd2lsbCBub3QgZXhlY3V0ZVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVuZGVyUXVldWUoY2I6ICgpID0+IHZvaWQpIHtcbiAgbGV0IG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gIGxldCBmcmFtZUlkID0gMDtcbiAgY29uc3QgdHJpZ2dlciA9ICgpID0+IHtcbiAgICBpZiAobmVlZHNSZW5kZXIpIHJldHVybjtcbiAgICBuZWVkc1JlbmRlciA9IHRydWU7XG4gICAgZnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBuZWVkc1JlbmRlciA9IGZhbHNlO1xuICAgICAgY2IoKTtcbiAgICB9KTtcbiAgfTtcbiAgdHJpZ2dlci5jYW5jZWwgPSAoKSA9PiB7XG4gICAgaWYgKG5lZWRzUmVuZGVyKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShmcmFtZUlkKTtcbiAgICAgIG5lZWRzUmVuZGVyID0gZmFsc2U7XG4gICAgfVxuICB9O1xuICByZXR1cm4gdHJpZ2dlcjtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export type PixelPatchTiles = {\n beforeTiles: PixelTile[];\n afterTiles: PixelTile[];\n};\nexport function applyPatchTiles(target: PixelData32, tiles: PixelTile[], tileSize: number) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i];\n if (!tile) continue;\n const dst = target.data;\n const src = tile.data;\n const dstWidth = target.w;\n const dstHeight = target.h;\n const startX = tile.tx * tileSize;\n const startY = tile.ty * tileSize;\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX));\n if (copyWidth <= 0) continue;\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly;\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break;\n const dstIndex = globalY * dstWidth + startX;\n const srcIndex = ly * tileSize;\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n dst.set(rowData, dstIndex);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQaXhlbFBhdGNoVGlsZXMgPSB7XG4gIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXTtcbiAgYWZ0ZXJUaWxlczogUGl4ZWxUaWxlW107XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hUaWxlcyh0YXJnZXQ6IFBpeGVsRGF0YTMyLCB0aWxlczogUGl4ZWxUaWxlW10sIHRpbGVTaXplOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRpbGUgPSB0aWxlc1tpXTtcbiAgICBpZiAoIXRpbGUpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRzdCA9IHRhcmdldC5kYXRhO1xuICAgIGNvbnN0IHNyYyA9IHRpbGUuZGF0YTtcbiAgICBjb25zdCBkc3RXaWR0aCA9IHRhcmdldC53O1xuICAgIGNvbnN0IGRzdEhlaWdodCA9IHRhcmdldC5oO1xuICAgIGNvbnN0IHN0YXJ0WCA9IHRpbGUudHggKiB0aWxlU2l6ZTtcbiAgICBjb25zdCBzdGFydFkgPSB0aWxlLnR5ICogdGlsZVNpemU7XG5cbiAgICAvLyBDYWxjdWxhdGUgY2xhbXBpbmcgdG8gcHJldmVudCB3cmFwcGluZyBhcnRpZmFjdHMgb24gaW1hZ2UgZWRnZXNcbiAgICBjb25zdCBjb3B5V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aWxlU2l6ZSwgZHN0V2lkdGggLSBzdGFydFgpKTtcbiAgICBpZiAoY29weVdpZHRoIDw9IDApIGNvbnRpbnVlO1xuICAgIGZvciAobGV0IGx5ID0gMDsgbHkgPCB0aWxlU2l6ZTsgbHkrKykge1xuICAgICAgY29uc3QgZ2xvYmFsWSA9IHN0YXJ0WSArIGx5O1xuXG4gICAgICAvLyBTdG9wIGlmIHdlIGdvIGJlbG93IHRoZSBpbWFnZVxuICAgICAgaWYgKGdsb2JhbFkgPj0gZHN0SGVpZ2h0KSBicmVhaztcbiAgICAgIGNvbnN0IGRzdEluZGV4ID0gZ2xvYmFsWSAqIGRzdFdpZHRoICsgc3RhcnRYO1xuICAgICAgY29uc3Qgc3JjSW5kZXggPSBseSAqIHRpbGVTaXplO1xuICAgICAgY29uc3Qgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpO1xuICAgICAgZHN0LnNldChyb3dEYXRhLCBkc3RJbmRleCk7XG4gICAgfVxuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { applyPatchTiles } from './PixelPatchTiles';\nexport interface HistoryAction {\n undo: () => void;\n redo: () => void;\n dispose?: () => void;\n}\nexport type HistoryActionFactory = typeof makeHistoryAction;\nexport function makeHistoryAction(config: PixelEngineConfig, accumulator: PixelAccumulator, patch: PixelPatchTiles, afterUndo?: (patch: PixelPatchTiles) => void, afterRedo?: (patch: PixelPatchTiles) => void, applyPatchTilesFn = applyPatchTiles): HistoryAction {\n const target = config.target;\n const tileSize = config.tileSize;\n return {\n undo: () => {\n applyPatchTilesFn(target, patch.beforeTiles, tileSize);\n afterUndo?.(patch);\n },\n redo: () => {\n applyPatchTilesFn(target, patch.afterTiles, tileSize);\n afterRedo?.(patch);\n },\n dispose: () => accumulator.recyclePatch(patch)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHBseVBhdGNoVGlsZXMgfSBmcm9tICcuL1BpeGVsUGF0Y2hUaWxlcyc7XG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBY3Rpb24ge1xuICB1bmRvOiAoKSA9PiB2b2lkO1xuICByZWRvOiAoKSA9PiB2b2lkO1xuICBkaXNwb3NlPzogKCkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIEhpc3RvcnlBY3Rpb25GYWN0b3J5ID0gdHlwZW9mIG1ha2VIaXN0b3J5QWN0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VIaXN0b3J5QWN0aW9uKGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIGFjY3VtdWxhdG9yOiBQaXhlbEFjY3VtdWxhdG9yLCBwYXRjaDogUGl4ZWxQYXRjaFRpbGVzLCBhZnRlclVuZG8/OiAocGF0Y2g6IFBpeGVsUGF0Y2hUaWxlcykgPT4gdm9pZCwgYWZ0ZXJSZWRvPzogKHBhdGNoOiBQaXhlbFBhdGNoVGlsZXMpID0+IHZvaWQsIGFwcGx5UGF0Y2hUaWxlc0ZuID0gYXBwbHlQYXRjaFRpbGVzKTogSGlzdG9yeUFjdGlvbiB7XG4gIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICByZXR1cm4ge1xuICAgIHVuZG86ICgpID0+IHtcbiAgICAgIGFwcGx5UGF0Y2hUaWxlc0ZuKHRhcmdldCwgcGF0Y2guYmVmb3JlVGlsZXMsIHRpbGVTaXplKTtcbiAgICAgIGFmdGVyVW5kbz8uKHBhdGNoKTtcbiAgICB9LFxuICAgIHJlZG86ICgpID0+IHtcbiAgICAgIGFwcGx5UGF0Y2hUaWxlc0ZuKHRhcmdldCwgcGF0Y2guYWZ0ZXJUaWxlcywgdGlsZVNpemUpO1xuICAgICAgYWZ0ZXJSZWRvPy4ocGF0Y2gpO1xuICAgIH0sXG4gICAgZGlzcG9zZTogKCkgPT4gYWNjdW11bGF0b3IucmVjeWNsZVBhdGNoKHBhdGNoKVxuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export class HistoryManager {\n readonly undoStack: HistoryAction[];\n readonly redoStack: HistoryAction[];\n readonly listeners: Set<() => void>;\n constructor(public maxSteps = 50) {\n this.undoStack = [];\n this.redoStack = [];\n this.listeners = new Set();\n }\n get canUndo() {\n return this.undoStack.length > 0;\n }\n get canRedo() {\n return this.redoStack.length > 0;\n }\n subscribe(fn: () => void) {\n this.listeners.add(fn);\n return () => this.listeners.delete(fn);\n }\n notify() {\n this.listeners.forEach(fn => fn());\n }\n commit(action: HistoryAction) {\n this.undoStack.push(action);\n this.clearRedoStack();\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.();\n }\n this.notify();\n }\n undo() {\n let action = this.undoStack.pop();\n if (!action) return;\n this.redoStack.push(action);\n action.undo();\n this.notify();\n }\n redo() {\n let action = this.redoStack.pop();\n if (!action) return;\n this.undoStack.push(action);\n action.redo();\n this.notify();\n }\n clearRedoStack() {\n let length = this.redoStack.length;\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i];\n if (action) {\n action.dispose?.();\n }\n }\n this.redoStack.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgSGlzdG9yeU1hbmFnZXIge1xuICByZWFkb25seSB1bmRvU3RhY2s6IEhpc3RvcnlBY3Rpb25bXTtcbiAgcmVhZG9ubHkgcmVkb1N0YWNrOiBIaXN0b3J5QWN0aW9uW107XG4gIHJlYWRvbmx5IGxpc3RlbmVyczogU2V0PCgpID0+IHZvaWQ+O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWF4U3RlcHMgPSA1MCkge1xuICAgIHRoaXMudW5kb1N0YWNrID0gW107XG4gICAgdGhpcy5yZWRvU3RhY2sgPSBbXTtcbiAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBTZXQoKTtcbiAgfVxuICBnZXQgY2FuVW5kbygpIHtcbiAgICByZXR1cm4gdGhpcy51bmRvU3RhY2subGVuZ3RoID4gMDtcbiAgfVxuICBnZXQgY2FuUmVkbygpIHtcbiAgICByZXR1cm4gdGhpcy5yZWRvU3RhY2subGVuZ3RoID4gMDtcbiAgfVxuICBzdWJzY3JpYmUoZm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLmxpc3RlbmVycy5hZGQoZm4pO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLmxpc3RlbmVycy5kZWxldGUoZm4pO1xuICB9XG4gIG5vdGlmeSgpIHtcbiAgICB0aGlzLmxpc3RlbmVycy5mb3JFYWNoKGZuID0+IGZuKCkpO1xuICB9XG4gIGNvbW1pdChhY3Rpb246IEhpc3RvcnlBY3Rpb24pIHtcbiAgICB0aGlzLnVuZG9TdGFjay5wdXNoKGFjdGlvbik7XG4gICAgdGhpcy5jbGVhclJlZG9TdGFjaygpO1xuICAgIGlmICh0aGlzLnVuZG9TdGFjay5sZW5ndGggPiB0aGlzLm1heFN0ZXBzKSB7XG4gICAgICB0aGlzLnVuZG9TdGFjay5zaGlmdCgpPy5kaXNwb3NlPy4oKTtcbiAgICB9XG4gICAgdGhpcy5ub3RpZnkoKTtcbiAgfVxuICB1bmRvKCkge1xuICAgIGxldCBhY3Rpb24gPSB0aGlzLnVuZG9TdGFjay5wb3AoKTtcbiAgICBpZiAoIWFjdGlvbikgcmV0dXJuO1xuICAgIHRoaXMucmVkb1N0YWNrLnB1c2goYWN0aW9uKTtcbiAgICBhY3Rpb24udW5kbygpO1xuICAgIHRoaXMubm90aWZ5KCk7XG4gIH1cbiAgcmVkbygpIHtcbiAgICBsZXQgYWN0aW9uID0gdGhpcy5yZWRvU3RhY2sucG9wKCk7XG4gICAgaWYgKCFhY3Rpb24pIHJldHVybjtcbiAgICB0aGlzLnVuZG9TdGFjay5wdXNoKGFjdGlvbik7XG4gICAgYWN0aW9uLnJlZG8oKTtcbiAgICB0aGlzLm5vdGlmeSgpO1xuICB9XG4gIGNsZWFyUmVkb1N0YWNrKCkge1xuICAgIGxldCBsZW5ndGggPSB0aGlzLnJlZG9TdGFjay5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGFjdGlvbiA9IHRoaXMucmVkb1N0YWNrW2ldO1xuICAgICAgaWYgKGFjdGlvbikge1xuICAgICAgICBhY3Rpb24uZGlzcG9zZT8uKCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVkb1N0YWNrLmxlbmd0aCA9IDA7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { applyPatchTiles } from './PixelPatchTiles';\nexport type DidChangeFn = (didChange: boolean) => boolean;\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[];\n public beforeTiles: PixelTile[];\n constructor(readonly config: PixelEngineConfig, readonly pixelTilePool: TilePool<PixelTile>) {\n this.lookup = [];\n this.beforeTiles = [];\n }\n recyclePatch(patch: PixelPatchTiles) {\n this.pixelTilePool.releaseTiles(patch.beforeTiles);\n this.pixelTilePool.releaseTiles(patch.afterTiles);\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storePixelBeforeState(x: number, y: number): DidChangeFn {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const tx = x >> shift;\n const ty = y >> shift;\n const id = ty * columns + tx;\n let tile = this.lookup[id];\n let added = false;\n if (!tile) {\n tile = this.pixelTilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n added = true;\n }\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop();\n this.lookup[id] = undefined;\n this.pixelTilePool.releaseTile(tile!);\n }\n return didChange;\n };\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(x: number, y: number, w: number, h: number): DidChangeFn {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const startX = x >> shift;\n const startY = y >> shift;\n const endX = x + w - 1 >> shift;\n const endY = y + h - 1 >> shift;\n const startIndex = this.beforeTiles.length;\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n const id = ty * columns + tx;\n let tile = this.lookup[id];\n if (!tile) {\n tile = this.pixelTilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n }\n }\n }\n return (didChange: boolean) => {\n if (!didChange) {\n const length = this.beforeTiles.length;\n for (let i = startIndex; i < length; i++) {\n let t = this.beforeTiles[i];\n if (t) {\n this.lookup[t.id] = undefined;\n this.pixelTilePool.releaseTile(t);\n }\n }\n this.beforeTiles.length = startIndex;\n }\n return didChange;\n };\n }\n storeTileBeforeState(id: number, tx: number, ty: number): DidChangeFn {\n let tile = this.lookup[id];\n let added = false;\n if (!tile) {\n tile = this.pixelTilePool.getTile(id, tx, ty);\n this.extractState(tile);\n this.lookup[id] = tile;\n this.beforeTiles.push(tile);\n added = true;\n }\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop();\n this.lookup[id] = undefined;\n this.pixelTilePool.releaseTile(tile!);\n }\n return didChange;\n };\n }\n extractState(tile: PixelTile) {\n const target = this.config.target;\n const TILE_SIZE = this.config.tileSize;\n const dst = tile.data;\n const src = target.data;\n const startX = tile.tx * TILE_SIZE;\n const startY = tile.ty * TILE_SIZE;\n const targetWidth = target.w;\n const targetHeight = target.h;\n\n // If the tile is completely outside the canvas, zero it out.\n if (startX >= targetWidth || startX + TILE_SIZE <= 0 || startY >= targetHeight || startY + TILE_SIZE <= 0) {\n dst.fill(0);\n return;\n }\n\n // Calculate offset if tile starts off the left side of the screen\n let srcOffsetX = Math.max(0, -startX);\n let copyWidth = Math.max(0, Math.min(TILE_SIZE - srcOffsetX, targetWidth - Math.max(0, startX)));\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly;\n let dstIndex = ly * TILE_SIZE;\n\n // Check negative bounds accurately\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE);\n continue;\n }\n let srcIndex = globalY * targetWidth + Math.max(0, startX);\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth);\n\n // Shift the paste over by the offset\n dst.set(rowData, dstIndex + srcOffsetX);\n\n // Pad the left edge with 0s if we hung off the left side\n if (srcOffsetX > 0) {\n dst.fill(0, dstIndex, dstIndex + srcOffsetX);\n }\n\n // Pad the right edge with 0s if we hung off the right side\n if (srcOffsetX + copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + srcOffsetX + copyWidth, dstIndex + TILE_SIZE);\n }\n }\n }\n extractPatch(): PixelPatchTiles {\n const afterTiles: PixelTile[] = [];\n const length = this.beforeTiles.length;\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i];\n if (beforeTile) {\n let afterTile = this.pixelTilePool.getTile(beforeTile.id, beforeTile.tx, beforeTile.ty);\n this.extractState(afterTile);\n afterTiles.push(afterTile);\n }\n }\n const beforeTiles = this.beforeTiles;\n this.beforeTiles = [];\n this.lookup.length = 0;\n return {\n beforeTiles,\n afterTiles\n };\n }\n rollbackAfterError() {\n const target = this.config.target;\n const tileSize = this.config.tileSize;\n const length = this.beforeTiles.length;\n applyPatchTiles(target, this.beforeTiles, tileSize);\n for (let i = 0; i < length; i++) {\n let tile = this.beforeTiles[i];\n if (tile) {\n this.lookup[tile.id] = undefined;\n this.pixelTilePool.releaseTile(tile);\n }\n }\n this.beforeTiles.length = 0;\n this.lookup.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHBseVBhdGNoVGlsZXMgfSBmcm9tICcuL1BpeGVsUGF0Y2hUaWxlcyc7XG5leHBvcnQgdHlwZSBEaWRDaGFuZ2VGbiA9IChkaWRDaGFuZ2U6IGJvb2xlYW4pID0+IGJvb2xlYW47XG5leHBvcnQgY2xhc3MgUGl4ZWxBY2N1bXVsYXRvciB7XG4gIHB1YmxpYyBsb29rdXA6IChQaXhlbFRpbGUgfCB1bmRlZmluZWQpW107XG4gIHB1YmxpYyBiZWZvcmVUaWxlczogUGl4ZWxUaWxlW107XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIHJlYWRvbmx5IHBpeGVsVGlsZVBvb2w6IFRpbGVQb29sPFBpeGVsVGlsZT4pIHtcbiAgICB0aGlzLmxvb2t1cCA9IFtdO1xuICAgIHRoaXMuYmVmb3JlVGlsZXMgPSBbXTtcbiAgfVxuICByZWN5Y2xlUGF0Y2gocGF0Y2g6IFBpeGVsUGF0Y2hUaWxlcykge1xuICAgIHRoaXMucGl4ZWxUaWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYmVmb3JlVGlsZXMpO1xuICAgIHRoaXMucGl4ZWxUaWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYWZ0ZXJUaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHggcGl4ZWwgeCBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB5IHBpeGVsIHkgY29vcmRpbmF0ZVxuICAgKi9cbiAgc3RvcmVQaXhlbEJlZm9yZVN0YXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogRGlkQ2hhbmdlRm4ge1xuICAgIGNvbnN0IHNoaWZ0ID0gdGhpcy5jb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbmZpZy50YXJnZXRDb2x1bW5zO1xuICAgIGNvbnN0IHR4ID0geCA+PiBzaGlmdDtcbiAgICBjb25zdCB0eSA9IHkgPj4gc2hpZnQ7XG4gICAgY29uc3QgaWQgPSB0eSAqIGNvbHVtbnMgKyB0eDtcbiAgICBsZXQgdGlsZSA9IHRoaXMubG9va3VwW2lkXTtcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRpbGUpIHtcbiAgICAgIHRpbGUgPSB0aGlzLnBpeGVsVGlsZVBvb2wuZ2V0VGlsZShpZCwgdHgsIHR5KTtcbiAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKHRpbGUpO1xuICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZTtcbiAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKTtcbiAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChkaWRDaGFuZ2U6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghZGlkQ2hhbmdlICYmIGFkZGVkKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGlsZXMucG9wKCk7XG4gICAgICAgIHRoaXMubG9va3VwW2lkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5waXhlbFRpbGVQb29sLnJlbGVhc2VUaWxlKHRpbGUhKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkaWRDaGFuZ2U7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geCBwaXhlbCB4IGNvb3JkaW5hdGVcbiAgICogQHBhcmFtIHkgcGl4ZWwgeSBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB3IHBpeGVsIHdpZHRoXG4gICAqIEBwYXJhbSBoIHBpeGVsIGhlaWdodFxuICAgKi9cbiAgc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiBEaWRDaGFuZ2VGbiB7XG4gICAgY29uc3Qgc2hpZnQgPSB0aGlzLmNvbmZpZy50aWxlU2hpZnQ7XG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMuY29uZmlnLnRhcmdldENvbHVtbnM7XG4gICAgY29uc3Qgc3RhcnRYID0geCA+PiBzaGlmdDtcbiAgICBjb25zdCBzdGFydFkgPSB5ID4+IHNoaWZ0O1xuICAgIGNvbnN0IGVuZFggPSB4ICsgdyAtIDEgPj4gc2hpZnQ7XG4gICAgY29uc3QgZW5kWSA9IHkgKyBoIC0gMSA+PiBzaGlmdDtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5iZWZvcmVUaWxlcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgdHkgPSBzdGFydFk7IHR5IDw9IGVuZFk7IHR5KyspIHtcbiAgICAgIGZvciAobGV0IHR4ID0gc3RhcnRYOyB0eCA8PSBlbmRYOyB0eCsrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gdHkgKiBjb2x1bW5zICsgdHg7XG4gICAgICAgIGxldCB0aWxlID0gdGhpcy5sb29rdXBbaWRdO1xuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICB0aWxlID0gdGhpcy5waXhlbFRpbGVQb29sLmdldFRpbGUoaWQsIHR4LCB0eSk7XG4gICAgICAgICAgdGhpcy5leHRyYWN0U3RhdGUodGlsZSk7XG4gICAgICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZTtcbiAgICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChkaWRDaGFuZ2U6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGV0IHQgPSB0aGlzLmJlZm9yZVRpbGVzW2ldO1xuICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxvb2t1cFt0LmlkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMucGl4ZWxUaWxlUG9vbC5yZWxlYXNlVGlsZSh0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iZWZvcmVUaWxlcy5sZW5ndGggPSBzdGFydEluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRpZENoYW5nZTtcbiAgICB9O1xuICB9XG4gIHN0b3JlVGlsZUJlZm9yZVN0YXRlKGlkOiBudW1iZXIsIHR4OiBudW1iZXIsIHR5OiBudW1iZXIpOiBEaWRDaGFuZ2VGbiB7XG4gICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF07XG4gICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgaWYgKCF0aWxlKSB7XG4gICAgICB0aWxlID0gdGhpcy5waXhlbFRpbGVQb29sLmdldFRpbGUoaWQsIHR4LCB0eSk7XG4gICAgICB0aGlzLmV4dHJhY3RTdGF0ZSh0aWxlKTtcbiAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGU7XG4gICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSk7XG4gICAgICBhZGRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoZGlkQ2hhbmdlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWRpZENoYW5nZSAmJiBhZGRlZCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnBvcCgpO1xuICAgICAgICB0aGlzLmxvb2t1cFtpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGl4ZWxUaWxlUG9vbC5yZWxlYXNlVGlsZSh0aWxlISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlO1xuICAgIH07XG4gIH1cbiAgZXh0cmFjdFN0YXRlKHRpbGU6IFBpeGVsVGlsZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCBUSUxFX1NJWkUgPSB0aGlzLmNvbmZpZy50aWxlU2l6ZTtcbiAgICBjb25zdCBkc3QgPSB0aWxlLmRhdGE7XG4gICAgY29uc3Qgc3JjID0gdGFyZ2V0LmRhdGE7XG4gICAgY29uc3Qgc3RhcnRYID0gdGlsZS50eCAqIFRJTEVfU0laRTtcbiAgICBjb25zdCBzdGFydFkgPSB0aWxlLnR5ICogVElMRV9TSVpFO1xuICAgIGNvbnN0IHRhcmdldFdpZHRoID0gdGFyZ2V0Lnc7XG4gICAgY29uc3QgdGFyZ2V0SGVpZ2h0ID0gdGFyZ2V0Lmg7XG5cbiAgICAvLyBJZiB0aGUgdGlsZSBpcyBjb21wbGV0ZWx5IG91dHNpZGUgdGhlIGNhbnZhcywgemVybyBpdCBvdXQuXG4gICAgaWYgKHN0YXJ0WCA+PSB0YXJnZXRXaWR0aCB8fCBzdGFydFggKyBUSUxFX1NJWkUgPD0gMCB8fCBzdGFydFkgPj0gdGFyZ2V0SGVpZ2h0IHx8IHN0YXJ0WSArIFRJTEVfU0laRSA8PSAwKSB7XG4gICAgICBkc3QuZmlsbCgwKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgb2Zmc2V0IGlmIHRpbGUgc3RhcnRzIG9mZiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBzY3JlZW5cbiAgICBsZXQgc3JjT2Zmc2V0WCA9IE1hdGgubWF4KDAsIC1zdGFydFgpO1xuICAgIGxldCBjb3B5V2lkdGggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihUSUxFX1NJWkUgLSBzcmNPZmZzZXRYLCB0YXJnZXRXaWR0aCAtIE1hdGgubWF4KDAsIHN0YXJ0WCkpKTtcbiAgICBmb3IgKGxldCBseSA9IDA7IGx5IDwgVElMRV9TSVpFOyBseSsrKSB7XG4gICAgICBsZXQgZ2xvYmFsWSA9IHN0YXJ0WSArIGx5O1xuICAgICAgbGV0IGRzdEluZGV4ID0gbHkgKiBUSUxFX1NJWkU7XG5cbiAgICAgIC8vIENoZWNrIG5lZ2F0aXZlIGJvdW5kcyBhY2N1cmF0ZWx5XG4gICAgICBpZiAoZ2xvYmFsWSA8IDAgfHwgZ2xvYmFsWSA+PSB0YXJnZXRIZWlnaHQgfHwgY29weVdpZHRoID09PSAwKSB7XG4gICAgICAgIGRzdC5maWxsKDAsIGRzdEluZGV4LCBkc3RJbmRleCArIFRJTEVfU0laRSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IHNyY0luZGV4ID0gZ2xvYmFsWSAqIHRhcmdldFdpZHRoICsgTWF0aC5tYXgoMCwgc3RhcnRYKTtcbiAgICAgIGxldCByb3dEYXRhID0gc3JjLnN1YmFycmF5KHNyY0luZGV4LCBzcmNJbmRleCArIGNvcHlXaWR0aCk7XG5cbiAgICAgIC8vIFNoaWZ0IHRoZSBwYXN0ZSBvdmVyIGJ5IHRoZSBvZmZzZXRcbiAgICAgIGRzdC5zZXQocm93RGF0YSwgZHN0SW5kZXggKyBzcmNPZmZzZXRYKTtcblxuICAgICAgLy8gUGFkIHRoZSBsZWZ0IGVkZ2Ugd2l0aCAwcyBpZiB3ZSBodW5nIG9mZiB0aGUgbGVmdCBzaWRlXG4gICAgICBpZiAoc3JjT2Zmc2V0WCA+IDApIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXgsIGRzdEluZGV4ICsgc3JjT2Zmc2V0WCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhZCB0aGUgcmlnaHQgZWRnZSB3aXRoIDBzIGlmIHdlIGh1bmcgb2ZmIHRoZSByaWdodCBzaWRlXG4gICAgICBpZiAoc3JjT2Zmc2V0WCArIGNvcHlXaWR0aCA8IFRJTEVfU0laRSkge1xuICAgICAgICBkc3QuZmlsbCgwLCBkc3RJbmRleCArIHNyY09mZnNldFggKyBjb3B5V2lkdGgsIGRzdEluZGV4ICsgVElMRV9TSVpFKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZXh0cmFjdFBhdGNoKCk6IFBpeGVsUGF0Y2hUaWxlcyB7XG4gICAgY29uc3QgYWZ0ZXJUaWxlczogUGl4ZWxUaWxlW10gPSBbXTtcbiAgICBjb25zdCBsZW5ndGggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgYmVmb3JlVGlsZSA9IHRoaXMuYmVmb3JlVGlsZXNbaV07XG4gICAgICBpZiAoYmVmb3JlVGlsZSkge1xuICAgICAgICBsZXQgYWZ0ZXJUaWxlID0gdGhpcy5waXhlbFRpbGVQb29sLmdldFRpbGUoYmVmb3JlVGlsZS5pZCwgYmVmb3JlVGlsZS50eCwgYmVmb3JlVGlsZS50eSk7XG4gICAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKGFmdGVyVGlsZSk7XG4gICAgICAgIGFmdGVyVGlsZXMucHVzaChhZnRlclRpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBiZWZvcmVUaWxlcyA9IHRoaXMuYmVmb3JlVGlsZXM7XG4gICAgdGhpcy5iZWZvcmVUaWxlcyA9IFtdO1xuICAgIHRoaXMubG9va3VwLmxlbmd0aCA9IDA7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJlZm9yZVRpbGVzLFxuICAgICAgYWZ0ZXJUaWxlc1xuICAgIH07XG4gIH1cbiAgcm9sbGJhY2tBZnRlckVycm9yKCkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IHRoaXMuY29uZmlnLnRpbGVTaXplO1xuICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoO1xuICAgIGFwcGx5UGF0Y2hUaWxlcyh0YXJnZXQsIHRoaXMuYmVmb3JlVGlsZXMsIHRpbGVTaXplKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgdGlsZSA9IHRoaXMuYmVmb3JlVGlsZXNbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICB0aGlzLmxvb2t1cFt0aWxlLmlkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5waXhlbFRpbGVQb29sLnJlbGVhc2VUaWxlKHRpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5sb29rdXAubGVuZ3RoID0gMDtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export class PixelEngineConfig {\n readonly tileSize: number;\n // pixelX = tileX << tileShift\n // pixelY = tileY << tileShift\n readonly tileShift: number;\n readonly tileMask: number;\n readonly tileArea: number;\n readonly target!: PixelData;\n readonly targetColumns: number = 0;\n readonly targetRows: number = 0;\n constructor(tileSize: number, target: PixelData) {\n // Ensure it's a power of 2 to guarantee bitwise math works\n if ((tileSize & tileSize - 1) !== 0) {\n throw new Error('tileSize must be a power of 2');\n }\n this.tileSize = tileSize;\n this.tileShift = 31 - Math.clz32(tileSize);\n this.tileMask = tileSize - 1;\n this.tileArea = tileSize * tileSize;\n this.target = target;\n this.targetColumns = target.w + this.tileMask >> this.tileShift;\n this.targetRows = target.h + this.tileMask >> this.tileShift;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgUGl4ZWxFbmdpbmVDb25maWcge1xuICByZWFkb25seSB0aWxlU2l6ZTogbnVtYmVyO1xuICAvLyBwaXhlbFggPSB0aWxlWCA8PCB0aWxlU2hpZnRcbiAgLy8gcGl4ZWxZID0gdGlsZVkgPDwgdGlsZVNoaWZ0XG4gIHJlYWRvbmx5IHRpbGVTaGlmdDogbnVtYmVyO1xuICByZWFkb25seSB0aWxlTWFzazogbnVtYmVyO1xuICByZWFkb25seSB0aWxlQXJlYTogbnVtYmVyO1xuICByZWFkb25seSB0YXJnZXQhOiBQaXhlbERhdGE7XG4gIHJlYWRvbmx5IHRhcmdldENvbHVtbnM6IG51bWJlciA9IDA7XG4gIHJlYWRvbmx5IHRhcmdldFJvd3M6IG51bWJlciA9IDA7XG4gIGNvbnN0cnVjdG9yKHRpbGVTaXplOiBudW1iZXIsIHRhcmdldDogUGl4ZWxEYXRhKSB7XG4gICAgLy8gRW5zdXJlIGl0J3MgYSBwb3dlciBvZiAyIHRvIGd1YXJhbnRlZSBiaXR3aXNlIG1hdGggd29ya3NcbiAgICBpZiAoKHRpbGVTaXplICYgdGlsZVNpemUgLSAxKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlU2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMicpO1xuICAgIH1cbiAgICB0aGlzLnRpbGVTaXplID0gdGlsZVNpemU7XG4gICAgdGhpcy50aWxlU2hpZnQgPSAzMSAtIE1hdGguY2x6MzIodGlsZVNpemUpO1xuICAgIHRoaXMudGlsZU1hc2sgPSB0aWxlU2l6ZSAtIDE7XG4gICAgdGhpcy50aWxlQXJlYSA9IHRpbGVTaXplICogdGlsZVNpemU7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy50YXJnZXRDb2x1bW5zID0gdGFyZ2V0LncgKyB0aGlzLnRpbGVNYXNrID4+IHRoaXMudGlsZVNoaWZ0O1xuICAgIHRoaXMudGFyZ2V0Um93cyA9IHRhcmdldC5oICsgdGhpcy50aWxlTWFzayA+PiB0aGlzLnRpbGVTaGlmdDtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyAlphaMaskToPixelData(target: PixelData32, mask: AlphaMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const width = opts?.w ?? target.w;\n const height = opts?.h ?? target.h;\n const globalAlpha = opts?.alpha ?? 255;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const invertMask = opts?.invertMask ?? false;\n if (globalAlpha === 0) return false;\n\n // 1. Initial Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, target.w - x);\n h = Math.min(h, target.h - y);\n if (w <= 0) return false;\n if (h <= 0) return false;\n\n // 2. Determine Source Dimensions\n const mPitch = mask.w;\n if (mPitch <= 0) return false;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(mask.h, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return false;\n if (finalH <= 0) return false;\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = target.data;\n const dw = target.w;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n const maskData = mask.data;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n let didChange = false;\n if (invertMask) {\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const effectiveM = 255 - maskData[mIdx];\n if (effectiveM === 0) {\n const current = dst32[dIdx];\n const next = (current & 0x00ffffff) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n } else {\n const t1 = effectiveM * globalAlpha + 128;\n const weight = t1 + (t1 >> 8) >> 8;\n if (weight < 255) {\n const current = dst32[dIdx];\n const da = current >>> 24;\n if (da !== 0) {\n const t2 = da * weight + 128;\n const finalAlpha = t2 + (t2 >> 8) >> 8;\n const next = (current & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n }\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n } else {\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const effectiveM = maskData[mIdx];\n if (effectiveM === 0) {\n const current = dst32[dIdx];\n const next = (current & 0x00ffffff) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n } else {\n const t1 = effectiveM * globalAlpha + 128;\n const weight = t1 + (t1 >> 8) >> 8;\n if (weight < 255) {\n const current = dst32[dIdx];\n const da = current >>> 24;\n if (da !== 0) {\n const t2 = da * weight + 128;\n const finalAlpha = t2 + (t2 >> 8) >> 8;\n const next = (current & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n }\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldDogUGl4ZWxEYXRhMzIsIG1hc2s6IEFscGhhTWFzaywgb3B0cz86IEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXJnZXRYID0gb3B0cz8ueCA/PyAwO1xuICBjb25zdCB0YXJnZXRZID0gb3B0cz8ueSA/PyAwO1xuICBjb25zdCB3aWR0aCA9IG9wdHM/LncgPz8gdGFyZ2V0Lnc7XG4gIGNvbnN0IGhlaWdodCA9IG9wdHM/LmggPz8gdGFyZ2V0Lmg7XG4gIGNvbnN0IGdsb2JhbEFscGhhID0gb3B0cz8uYWxwaGEgPz8gMjU1O1xuICBjb25zdCBteCA9IG9wdHM/Lm14ID8/IDA7XG4gIGNvbnN0IG15ID0gb3B0cz8ubXkgPz8gMDtcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHM/LmludmVydE1hc2sgPz8gZmFsc2U7XG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDEuIEluaXRpYWwgRGVzdGluYXRpb24gQ2xpcHBpbmdcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCB3ID0gd2lkdGg7XG4gIGxldCBoID0gaGVpZ2h0O1xuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIHcgPSBNYXRoLm1pbih3LCB0YXJnZXQudyAtIHgpO1xuICBoID0gTWF0aC5taW4oaCwgdGFyZ2V0LmggLSB5KTtcbiAgaWYgKHcgPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoaCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gMi4gRGV0ZXJtaW5lIFNvdXJjZSBEaW1lbnNpb25zXG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sudztcbiAgaWYgKG1QaXRjaCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gMy4gU291cmNlIEJvdW5kcyBDbGlwcGluZ1xuICAvLyBDYWxjdWxhdGUgd2hlcmUgd2Ugd291bGQgc3RhcnQgcmVhZGluZyBpbiB0aGUgbWFza1xuICBjb25zdCBzdGFydFggPSBteCArICh4IC0gdGFyZ2V0WCk7XG4gIGNvbnN0IHN0YXJ0WSA9IG15ICsgKHkgLSB0YXJnZXRZKTtcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WCk7XG4gIGNvbnN0IHNZMCA9IE1hdGgubWF4KDAsIHN0YXJ0WSk7XG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKG1QaXRjaCwgc3RhcnRYICsgdyk7XG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2suaCwgc3RhcnRZICsgaCk7XG4gIGNvbnN0IGZpbmFsVyA9IHNYMSAtIHNYMDtcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwO1xuXG4gIC8vIFRoaXMgaXMgd2hlcmUgeW91ciBmYWlsaW5nIHRlc3RzIGFyZSBub3cgY2F1Z2h0XG4gIGlmIChmaW5hbFcgPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZmluYWxIIDw9IDApIHJldHVybiBmYWxzZTtcblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYO1xuICBjb25zdCB5U2hpZnQgPSBzWTAgLSBzdGFydFk7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0Lnc7XG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGZpbmFsVztcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsVztcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGE7XG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdCk7XG4gIGxldCBtSWR4ID0gc1kwICogbVBpdGNoICsgc1gwO1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGlmIChpbnZlcnRNYXNrKSB7XG4gICAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGZpbmFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGZpbmFsVzsgaXgrKykge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVNID0gMjU1IC0gbWFza0RhdGFbbUlkeF07XG4gICAgICAgIGlmIChlZmZlY3RpdmVNID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSAoY3VycmVudCAmIDB4MDBmZmZmZmYpID4+PiAwO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0MSA9IGVmZmVjdGl2ZU0gKiBnbG9iYWxBbHBoYSArIDEyODtcbiAgICAgICAgICBjb25zdCB3ZWlnaHQgPSB0MSArICh0MSA+PiA4KSA+PiA4O1xuICAgICAgICAgIGlmICh3ZWlnaHQgPCAyNTUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkSWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGRhID0gY3VycmVudCA+Pj4gMjQ7XG4gICAgICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgdDIgPSBkYSAqIHdlaWdodCArIDEyODtcbiAgICAgICAgICAgICAgY29uc3QgZmluYWxBbHBoYSA9IHQyICsgKHQyID4+IDgpID4+IDg7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHQgPSAoY3VycmVudCAmIDB4MDBmZmZmZmYgfCBmaW5hbEFscGhhIDw8IDI0KSA+Pj4gMDtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgIH1cbiAgICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICAgIG1JZHggKz0gbVN0cmlkZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGZpbmFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGZpbmFsVzsgaXgrKykge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVNID0gbWFza0RhdGFbbUlkeF07XG4gICAgICAgIGlmIChlZmZlY3RpdmVNID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdO1xuICAgICAgICAgIGNvbnN0IG5leHQgPSAoY3VycmVudCAmIDB4MDBmZmZmZmYpID4+PiAwO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCB0MSA9IGVmZmVjdGl2ZU0gKiBnbG9iYWxBbHBoYSArIDEyODtcbiAgICAgICAgICBjb25zdCB3ZWlnaHQgPSB0MSArICh0MSA+PiA4KSA+PiA4O1xuICAgICAgICAgIGlmICh3ZWlnaHQgPCAyNTUpIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkSWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGRhID0gY3VycmVudCA+Pj4gMjQ7XG4gICAgICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgdDIgPSBkYSAqIHdlaWdodCArIDEyODtcbiAgICAgICAgICAgICAgY29uc3QgZmluYWxBbHBoYSA9IHQyICsgKHQyID4+IDgpID4+IDg7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHQgPSAoY3VycmVudCAmIDB4MDBmZmZmZmYgfCBmaW5hbEFscGhhIDw8IDI0KSA+Pj4gMDtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBkSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgIH1cbiAgICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICAgIG1JZHggKz0gbVN0cmlkZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\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 target The target 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 * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\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(target: ImageDataLike, newWidth: number, newHeight: number, offsetX = 0, offsetY = 0): ImageData {\n const result = new ImageData(newWidth, newHeight);\n const {\n width: oldW,\n height: oldH,\n data: oldData\n } = target;\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 if (x1 <= x0 || y1 <= y0) {\n return result;\n }\n const rowCount = y1 - y0;\n const rowLen = (x1 - x0) * 4;\n for (let row = 0; row < rowCount; row++) {\n const dstY = y0 + row;\n const srcY = dstY - offsetY;\n const srcX = x0 - offsetX;\n const dstStart = (dstY * newWidth + x0) * 4;\n const srcStart = (srcY * oldW + srcX) * 4;\n newData.set(oldData.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE5vbiBkZXN0cnVjdGl2ZWx5IHJlc2l6ZXMgdGhlIHtAbGluayBJbWFnZURhdGF9IGJ1ZmZlciB0byBuZXcgZGltZW5zaW9ucywgb3B0aW9uYWxseVxuICogb2Zmc2V0dGluZyB0aGUgb3JpZ2luYWwgY29udGVudC5cbiAqIFRoaXMgb3BlcmF0aW9uIGNyZWF0ZXMgYSBuZXcgYnVmZmVyLiBJdCBkb2VzIG5vdCBzY2FsZSBvciBzdHJldGNoIHBpeGVscztcbiAqIGluc3RlYWQsIGl0IGNyb3BzIG9yIHBhZHMgdGhlIGltYWdlIGJhc2VkIG9uIHRoZSBuZXcgZGltZW5zaW9ucyBhbmRcbiAqIHByb3ZpZGVzIGFuIG9mZnNldCBmb3IgcmVwb3NpdGlvbmluZy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gcmVzaXplLlxuICogQHBhcmFtIG5ld1dpZHRoIFRoZSB0YXJnZXQgd2lkdGggaW4gcGl4ZWxzLlxuICogQHBhcmFtIG5ld0hlaWdodCBUaGUgdGFyZ2V0IGhlaWdodCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0gb2Zmc2V0WCBUaGUgaG9yaXpvbnRhbCBvZmZzZXQgZm9yIHBsYWNpbmcgdGhlXG4gKiBvcmlnaW5hbCBpbWFnZSB3aXRoaW4gdGhlIG5ldyBidWZmZXIuXG4gKiBAcGFyYW0gb2Zmc2V0WSBUaGUgdmVydGljYWwgb2Zmc2V0IGZvciBwbGFjaW5nIHRoZVxuICogb3JpZ2luYWwgaW1hZ2Ugd2l0aGluIHRoZSBuZXcgYnVmZmVyLlxuICpcbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBJbWFnZURhdGF9IGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDZW50ZXJzIGFuIDgweDgwIGltYWdlIGluIGEgbmV3IDEwMHgxMDAgYnVmZmVyXG4gKiBjb25zdCByZXNpemVkID0gcmVzaXplSW1hZ2VEYXRhKFxuICogICBvcmlnaW5hbERhdGEsXG4gKiAgIDEwMCxcbiAqICAgMTAwLFxuICogICAxMCxcbiAqICAgMTBcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUltYWdlRGF0YSh0YXJnZXQ6IEltYWdlRGF0YUxpa2UsIG5ld1dpZHRoOiBudW1iZXIsIG5ld0hlaWdodDogbnVtYmVyLCBvZmZzZXRYID0gMCwgb2Zmc2V0WSA9IDApOiBJbWFnZURhdGEge1xuICBjb25zdCByZXN1bHQgPSBuZXcgSW1hZ2VEYXRhKG5ld1dpZHRoLCBuZXdIZWlnaHQpO1xuICBjb25zdCB7XG4gICAgd2lkdGg6IG9sZFcsXG4gICAgaGVpZ2h0OiBvbGRILFxuICAgIGRhdGE6IG9sZERhdGFcbiAgfSA9IHRhcmdldDtcbiAgY29uc3QgbmV3RGF0YSA9IHJlc3VsdC5kYXRhO1xuXG4gIC8vIERldGVybWluZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9sZCBpbWFnZSAoYXQgb2Zmc2V0KSBhbmQgbmV3IGNhbnZhcyBib3VuZHNcbiAgY29uc3QgeDAgPSBNYXRoLm1heCgwLCBvZmZzZXRYKTtcbiAgY29uc3QgeTAgPSBNYXRoLm1heCgwLCBvZmZzZXRZKTtcbiAgY29uc3QgeDEgPSBNYXRoLm1pbihuZXdXaWR0aCwgb2Zmc2V0WCArIG9sZFcpO1xuICBjb25zdCB5MSA9IE1hdGgubWluKG5ld0hlaWdodCwgb2Zmc2V0WSArIG9sZEgpO1xuICBpZiAoeDEgPD0geDAgfHwgeTEgPD0geTApIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IHJvd0NvdW50ID0geTEgLSB5MDtcbiAgY29uc3Qgcm93TGVuID0gKHgxIC0geDApICogNDtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgcm93Q291bnQ7IHJvdysrKSB7XG4gICAgY29uc3QgZHN0WSA9IHkwICsgcm93O1xuICAgIGNvbnN0IHNyY1kgPSBkc3RZIC0gb2Zmc2V0WTtcbiAgICBjb25zdCBzcmNYID0geDAgLSBvZmZzZXRYO1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKiBuZXdXaWR0aCArIHgwKSAqIDQ7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSAqIG9sZFcgKyBzcmNYKSAqIDQ7XG4gICAgbmV3RGF0YS5zZXQob2xkRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pLCBkc3RTdGFydCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { ImageDataLike } from '../ImageData/_ImageData-types';\nexport function makePixelData<T extends ImageDataLike = ImageData>(imageData: T): PixelData<T> {\n return {\n data: (new Uint32Array(imageData.data.buffer, imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2)),\n imageData,\n w: imageData.width,\n h: imageData.height\n };\n}\nexport function setPixelData(target: PixelData, imageData: ImageData) {\n ;\n (target as any).data = (new Uint32Array(imageData.data.buffer, imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2));\n (target as any).imageData = imageData;\n (target as any).w = imageData.width;\n (target as any).h = imageData.height;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEltYWdlRGF0YUxpa2UgfSBmcm9tICcuLi9JbWFnZURhdGEvX0ltYWdlRGF0YS10eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gbWFrZVBpeGVsRGF0YTxUIGV4dGVuZHMgSW1hZ2VEYXRhTGlrZSA9IEltYWdlRGF0YT4oaW1hZ2VEYXRhOiBUKTogUGl4ZWxEYXRhPFQ+IHtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiAobmV3IFVpbnQzMkFycmF5KGltYWdlRGF0YS5kYXRhLmJ1ZmZlciwgaW1hZ2VEYXRhLmRhdGEuYnl0ZU9mZnNldCxcbiAgICAvLyBTaGlmdCByaWdodCBieSAyIGlzIGEgZmFzdCBiaXR3aXNlIGRpdmlzaW9uIGJ5IDQuXG4gICAgaW1hZ2VEYXRhLmRhdGEuYnl0ZUxlbmd0aCA+PiAyKSksXG4gICAgaW1hZ2VEYXRhLFxuICAgIHc6IGltYWdlRGF0YS53aWR0aCxcbiAgICBoOiBpbWFnZURhdGEuaGVpZ2h0XG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2V0UGl4ZWxEYXRhKHRhcmdldDogUGl4ZWxEYXRhLCBpbWFnZURhdGE6IEltYWdlRGF0YSkge1xuICA7XG4gICh0YXJnZXQgYXMgYW55KS5kYXRhID0gKG5ldyBVaW50MzJBcnJheShpbWFnZURhdGEuZGF0YS5idWZmZXIsIGltYWdlRGF0YS5kYXRhLmJ5dGVPZmZzZXQsXG4gIC8vIFNoaWZ0IHJpZ2h0IGJ5IDIgaXMgYSBmYXN0IGJpdHdpc2UgZGl2aXNpb24gYnkgNC5cbiAgaW1hZ2VEYXRhLmRhdGEuYnl0ZUxlbmd0aCA+PiAyKSk7XG4gICh0YXJnZXQgYXMgYW55KS5pbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICh0YXJnZXQgYXMgYW55KS53ID0gaW1hZ2VEYXRhLndpZHRoO1xuICAodGFyZ2V0IGFzIGFueSkuaCA9IGltYWdlRGF0YS5oZWlnaHQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { AlphaMask, BinaryMask } from '../Mask/_mask-types';\nimport type { PixelData } from '../PixelData/_pixelData-types';\nexport const enum TileType {\n PIXEL,\n MASK,\n}\ninterface BaseTile {\n tileType: TileType;\n id: number;\n tx: number;\n ty: number;\n}\nexport interface PixelTile extends PixelData, BaseTile {}\nexport interface AlphaMaskTile extends AlphaMask, BaseTile {}\nexport interface BinaryMaskTile extends BinaryMask, BaseTile {}\nexport type Tile = PixelTile | AlphaMaskTile | BinaryMaskTile;\nexport type TileFactory<T extends Tile> = (id: number, tx: number, ty: number, tileSize: number, tileArea: number) => T;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFscGhhTWFzaywgQmluYXJ5TWFzayB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHR5cGUgeyBQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvX3BpeGVsRGF0YS10eXBlcyc7XG5leHBvcnQgY29uc3QgZW51bSBUaWxlVHlwZSB7XG4gIFBJWEVMLFxuICBNQVNLLFxufVxuaW50ZXJmYWNlIEJhc2VUaWxlIHtcbiAgdGlsZVR5cGU6IFRpbGVUeXBlO1xuICBpZDogbnVtYmVyO1xuICB0eDogbnVtYmVyO1xuICB0eTogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBQaXhlbFRpbGUgZXh0ZW5kcyBQaXhlbERhdGEsIEJhc2VUaWxlIHt9XG5leHBvcnQgaW50ZXJmYWNlIEFscGhhTWFza1RpbGUgZXh0ZW5kcyBBbHBoYU1hc2ssIEJhc2VUaWxlIHt9XG5leHBvcnQgaW50ZXJmYWNlIEJpbmFyeU1hc2tUaWxlIGV4dGVuZHMgQmluYXJ5TWFzaywgQmFzZVRpbGUge31cbmV4cG9ydCB0eXBlIFRpbGUgPSBQaXhlbFRpbGUgfCBBbHBoYU1hc2tUaWxlIHwgQmluYXJ5TWFza1RpbGU7XG5leHBvcnQgdHlwZSBUaWxlRmFjdG9yeTxUIGV4dGVuZHMgVGlsZT4gPSAoaWQ6IG51bWJlciwgdHg6IG51bWJlciwgdHk6IG51bWJlciwgdGlsZVNpemU6IG51bWJlciwgdGlsZUFyZWE6IG51bWJlcikgPT4gVDsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { TileType } from './_tile-types';\nexport function makePixelTile(id: number, tx: number, ty: number, tileSize: number, tileArea: number): PixelTile {\n const data32 = new Uint32Array(tileArea);\n const data8 = new Uint8ClampedArray(data32.buffer) as Uint8ClampedArray<ArrayBuffer>;\n return {\n tileType: TileType.PIXEL,\n id,\n tx,\n ty,\n w: tileSize,\n h: tileSize,\n data: data32,\n imageData: new ImageData(data8, tileSize, tileSize)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUaWxlVHlwZSB9IGZyb20gJy4vX3RpbGUtdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQaXhlbFRpbGUoaWQ6IG51bWJlciwgdHg6IG51bWJlciwgdHk6IG51bWJlciwgdGlsZVNpemU6IG51bWJlciwgdGlsZUFyZWE6IG51bWJlcik6IFBpeGVsVGlsZSB7XG4gIGNvbnN0IGRhdGEzMiA9IG5ldyBVaW50MzJBcnJheSh0aWxlQXJlYSk7XG4gIGNvbnN0IGRhdGE4ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEzMi5idWZmZXIpIGFzIFVpbnQ4Q2xhbXBlZEFycmF5PEFycmF5QnVmZmVyPjtcbiAgcmV0dXJuIHtcbiAgICB0aWxlVHlwZTogVGlsZVR5cGUuUElYRUwsXG4gICAgaWQsXG4gICAgdHgsXG4gICAgdHksXG4gICAgdzogdGlsZVNpemUsXG4gICAgaDogdGlsZVNpemUsXG4gICAgZGF0YTogZGF0YTMyLFxuICAgIGltYWdlRGF0YTogbmV3IEltYWdlRGF0YShkYXRhOCwgdGlsZVNpemUsIHRpbGVTaXplKVxuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Tile } from './_tile-types';\nexport class TilePool<T extends Tile> {\n public pool: T[];\n private tileSize: number;\n private tileArea: number;\n constructor(config: PixelEngineConfig, private tileFactory: TileFactory<T>) {\n this.pool = [];\n this.tileSize = config.tileSize;\n this.tileArea = config.tileArea;\n }\n getTile(id: number, tx: number, ty: number): T {\n let tile = this.pool.pop();\n if (tile) {\n tile.id = id;\n tile.tx = tx;\n tile.ty = ty;\n\n // Wipe dirty memory from previous uses before handing it out\n tile.data.fill(0);\n return tile;\n }\n return this.tileFactory(id, tx, ty, this.tileSize, this.tileArea);\n }\n releaseTile(tile: T): void {\n this.pool.push(tile);\n }\n releaseTiles(tiles: (T | undefined)[]): void {\n let length = tiles.length;\n for (let i = 0; i < length; i++) {\n let tile = tiles[i];\n if (tile) {\n this.pool.push(tile);\n }\n }\n tiles.length = 0;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRpbGUgfSBmcm9tICcuL190aWxlLXR5cGVzJztcbmV4cG9ydCBjbGFzcyBUaWxlUG9vbDxUIGV4dGVuZHMgVGlsZT4ge1xuICBwdWJsaWMgcG9vbDogVFtdO1xuICBwcml2YXRlIHRpbGVTaXplOiBudW1iZXI7XG4gIHByaXZhdGUgdGlsZUFyZWE6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoY29uZmlnOiBQaXhlbEVuZ2luZUNvbmZpZywgcHJpdmF0ZSB0aWxlRmFjdG9yeTogVGlsZUZhY3Rvcnk8VD4pIHtcbiAgICB0aGlzLnBvb2wgPSBbXTtcbiAgICB0aGlzLnRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICAgIHRoaXMudGlsZUFyZWEgPSBjb25maWcudGlsZUFyZWE7XG4gIH1cbiAgZ2V0VGlsZShpZDogbnVtYmVyLCB0eDogbnVtYmVyLCB0eTogbnVtYmVyKTogVCB7XG4gICAgbGV0IHRpbGUgPSB0aGlzLnBvb2wucG9wKCk7XG4gICAgaWYgKHRpbGUpIHtcbiAgICAgIHRpbGUuaWQgPSBpZDtcbiAgICAgIHRpbGUudHggPSB0eDtcbiAgICAgIHRpbGUudHkgPSB0eTtcblxuICAgICAgLy8gV2lwZSBkaXJ0eSBtZW1vcnkgZnJvbSBwcmV2aW91cyB1c2VzIGJlZm9yZSBoYW5kaW5nIGl0IG91dFxuICAgICAgdGlsZS5kYXRhLmZpbGwoMCk7XG4gICAgICByZXR1cm4gdGlsZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGlsZUZhY3RvcnkoaWQsIHR4LCB0eSwgdGhpcy50aWxlU2l6ZSwgdGhpcy50aWxlQXJlYSk7XG4gIH1cbiAgcmVsZWFzZVRpbGUodGlsZTogVCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpO1xuICB9XG4gIHJlbGVhc2VUaWxlcyh0aWxlczogKFQgfCB1bmRlZmluZWQpW10pOiB2b2lkIHtcbiAgICBsZXQgbGVuZ3RoID0gdGlsZXMubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB0aWxlID0gdGlsZXNbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICB0aGlzLnBvb2wucHVzaCh0aWxlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGlsZXMubGVuZ3RoID0gMDtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { resizeImageData } from '../ImageData/resizeImageData';\nimport { setPixelData } from '../PixelData/PixelData';\nimport { makePixelTile } from '../Tile/PixelTile';\nimport { TilePool } from '../Tile/TilePool';\nimport { makeHistoryAction } from './HistoryAction';\nimport { HistoryManager } from './HistoryManager';\nimport { PixelAccumulator } from './PixelAccumulator';\nimport { PixelEngineConfig } from './PixelEngineConfig';\nexport interface PixelWriterOptions {\n maxHistorySteps?: number;\n tileSize?: number;\n historyManager?: HistoryManager;\n historyActionFactory?: HistoryActionFactory;\n pixelTilePool?: TilePool<PixelTile>;\n accumulator?: PixelAccumulator;\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n readonly historyManager: HistoryManager;\n readonly accumulator: PixelAccumulator;\n readonly historyActionFactory: HistoryActionFactory;\n readonly config: PixelEngineConfig;\n readonly pixelTilePool: TilePool<PixelTile>;\n readonly mutator: M;\n private _inProgress = false;\n constructor(target: PixelData, mutatorFactory: (writer: PixelWriter<any>) => M, options?: PixelWriterOptions) {\n const tileSize = options?.tileSize ?? 256;\n const maxHistorySteps = options?.maxHistorySteps ?? 50;\n this.config = new PixelEngineConfig(tileSize, target);\n this.historyManager = options?.historyManager ?? new HistoryManager(maxHistorySteps);\n this.historyActionFactory = options?.historyActionFactory ?? makeHistoryAction;\n this.pixelTilePool = options?.pixelTilePool ?? new TilePool(this.config, makePixelTile);\n this.accumulator = options?.accumulator ?? new PixelAccumulator(this.config, this.pixelTilePool);\n this.mutator = mutatorFactory(this);\n }\n\n /**\n * Executes `transaction` and commits the resulting pixel changes as a single\n * undoable history action.\n *\n * - If `transaction` throws, all accumulated changes are rolled back and the error\n * is re-thrown. No action is committed.\n * - If `transaction` completes without modifying any pixels, no action is committed.\n * - `withHistory` is not re-entrant. Calling it again from inside `transaction` will\n * throw immediately to prevent silent data loss from a nested extractPatch.\n *\n * @param transaction Callback to be executed inside the transaction.\n * @param afterUndo Called after undo only.\n * @param afterRedo Called after redo only.\n */\n withHistory(transaction: (mutator: M) => void, afterUndo?: (patch: PixelPatchTiles) => void, afterRedo?: (patch: PixelPatchTiles) => void): void {\n if (this._inProgress) {\n throw new Error('withHistory is not re-entrant — commit or rollback the current operation first');\n }\n this._inProgress = true;\n try {\n transaction(this.mutator);\n } catch (e) {\n this.accumulator.rollbackAfterError();\n throw e;\n } finally {\n this._inProgress = false;\n }\n if (this.accumulator.beforeTiles.length === 0) return;\n const patch = this.accumulator.extractPatch();\n const action = this.historyActionFactory(this.config, this.accumulator, patch, afterUndo, afterRedo);\n this.historyManager.commit(action);\n }\n resize(newWidth: number, newHeight: number, offsetX = 0, offsetY = 0, afterUndo?: (target: ImageData) => void, afterRedo?: (target: ImageData) => void, resizeImageDataFn = resizeImageData): void {\n if (this._inProgress) {\n throw new Error('Cannot resize inside a withHistory callback');\n }\n if (this.accumulator.beforeTiles.length > 0) {\n throw new Error('Cannot resize with an open accumulator — commit or rollback first');\n }\n const config = this.config;\n const target = config.target;\n const beforeImageData = target.imageData;\n const afterImageData = resizeImageDataFn(beforeImageData, newWidth, newHeight, offsetX, offsetY);\n setPixelData(target, afterImageData);\n this.historyManager.commit({\n undo: () => {\n setPixelData(target, beforeImageData);\n afterUndo?.(beforeImageData);\n },\n redo: () => {\n setPixelData(target, afterImageData);\n afterRedo?.(afterImageData);\n }\n });\n }\n}\nexport type HistoryMutator<T extends {}, D extends {}> = (writer: PixelWriter<any>, deps?: Partial<D>) => T;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNpemVJbWFnZURhdGEgfSBmcm9tICcuLi9JbWFnZURhdGEvcmVzaXplSW1hZ2VEYXRhJztcbmltcG9ydCB7IHNldFBpeGVsRGF0YSB9IGZyb20gJy4uL1BpeGVsRGF0YS9QaXhlbERhdGEnO1xuaW1wb3J0IHsgbWFrZVBpeGVsVGlsZSB9IGZyb20gJy4uL1RpbGUvUGl4ZWxUaWxlJztcbmltcG9ydCB7IFRpbGVQb29sIH0gZnJvbSAnLi4vVGlsZS9UaWxlUG9vbCc7XG5pbXBvcnQgeyBtYWtlSGlzdG9yeUFjdGlvbiB9IGZyb20gJy4vSGlzdG9yeUFjdGlvbic7XG5pbXBvcnQgeyBIaXN0b3J5TWFuYWdlciB9IGZyb20gJy4vSGlzdG9yeU1hbmFnZXInO1xuaW1wb3J0IHsgUGl4ZWxBY2N1bXVsYXRvciB9IGZyb20gJy4vUGl4ZWxBY2N1bXVsYXRvcic7XG5pbXBvcnQgeyBQaXhlbEVuZ2luZUNvbmZpZyB9IGZyb20gJy4vUGl4ZWxFbmdpbmVDb25maWcnO1xuZXhwb3J0IGludGVyZmFjZSBQaXhlbFdyaXRlck9wdGlvbnMge1xuICBtYXhIaXN0b3J5U3RlcHM/OiBudW1iZXI7XG4gIHRpbGVTaXplPzogbnVtYmVyO1xuICBoaXN0b3J5TWFuYWdlcj86IEhpc3RvcnlNYW5hZ2VyO1xuICBoaXN0b3J5QWN0aW9uRmFjdG9yeT86IEhpc3RvcnlBY3Rpb25GYWN0b3J5O1xuICBwaXhlbFRpbGVQb29sPzogVGlsZVBvb2w8UGl4ZWxUaWxlPjtcbiAgYWNjdW11bGF0b3I/OiBQaXhlbEFjY3VtdWxhdG9yO1xufVxuXG4vKipcbiAqIEBleGFtcGxlXG4gKiBjb25zdCB0YXJnID0gbmV3IFBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKDEwLCAxMCkpXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgUGl4ZWxXcml0ZXIodGFyZywgKHdyaXRlcikgPT4ge1xuICogICByZXR1cm4ge1xuICogICAgIC4uLm11dGF0b3JBcHBseU1hc2sod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbERhdGEod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yQmxlbmRDb2xvcih3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsKHdyaXRlciksXG4gKiAgICAgLi4ubXV0YXRvckZpbGwod3JpdGVyKSxcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyB0byBpbXBvcnQgYWxsIG11dGF0b3IgZnVuY3Rpb25zXG4gKiBjb25zdCB3cml0ZXIgPSBuZXcgUGl4ZWxXcml0ZXIodGFyZywgbWFrZUZ1bGxQaXhlbE11dGF0b3IpXG4gKlxuICogd3JpdGVyLndpdGhIaXN0b3J5KChtdXRhdG9yKSA9PiB7XG4gKiAgIG11dGF0b3IuYXBwbHlNYXNrKClcbiAqICAgbXV0YXRvci5ibGVuZFBpeGVsRGF0YSgpXG4gKiB9KVxuICovXG5leHBvcnQgY2xhc3MgUGl4ZWxXcml0ZXI8TT4ge1xuICByZWFkb25seSBoaXN0b3J5TWFuYWdlcjogSGlzdG9yeU1hbmFnZXI7XG4gIHJlYWRvbmx5IGFjY3VtdWxhdG9yOiBQaXhlbEFjY3VtdWxhdG9yO1xuICByZWFkb25seSBoaXN0b3J5QWN0aW9uRmFjdG9yeTogSGlzdG9yeUFjdGlvbkZhY3Rvcnk7XG4gIHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWc7XG4gIHJlYWRvbmx5IHBpeGVsVGlsZVBvb2w6IFRpbGVQb29sPFBpeGVsVGlsZT47XG4gIHJlYWRvbmx5IG11dGF0b3I6IE07XG4gIHByaXZhdGUgX2luUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgY29uc3RydWN0b3IodGFyZ2V0OiBQaXhlbERhdGEsIG11dGF0b3JGYWN0b3J5OiAod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+KSA9PiBNLCBvcHRpb25zPzogUGl4ZWxXcml0ZXJPcHRpb25zKSB7XG4gICAgY29uc3QgdGlsZVNpemUgPSBvcHRpb25zPy50aWxlU2l6ZSA/PyAyNTY7XG4gICAgY29uc3QgbWF4SGlzdG9yeVN0ZXBzID0gb3B0aW9ucz8ubWF4SGlzdG9yeVN0ZXBzID8/IDUwO1xuICAgIHRoaXMuY29uZmlnID0gbmV3IFBpeGVsRW5naW5lQ29uZmlnKHRpbGVTaXplLCB0YXJnZXQpO1xuICAgIHRoaXMuaGlzdG9yeU1hbmFnZXIgPSBvcHRpb25zPy5oaXN0b3J5TWFuYWdlciA/PyBuZXcgSGlzdG9yeU1hbmFnZXIobWF4SGlzdG9yeVN0ZXBzKTtcbiAgICB0aGlzLmhpc3RvcnlBY3Rpb25GYWN0b3J5ID0gb3B0aW9ucz8uaGlzdG9yeUFjdGlvbkZhY3RvcnkgPz8gbWFrZUhpc3RvcnlBY3Rpb247XG4gICAgdGhpcy5waXhlbFRpbGVQb29sID0gb3B0aW9ucz8ucGl4ZWxUaWxlUG9vbCA/PyBuZXcgVGlsZVBvb2wodGhpcy5jb25maWcsIG1ha2VQaXhlbFRpbGUpO1xuICAgIHRoaXMuYWNjdW11bGF0b3IgPSBvcHRpb25zPy5hY2N1bXVsYXRvciA/PyBuZXcgUGl4ZWxBY2N1bXVsYXRvcih0aGlzLmNvbmZpZywgdGhpcy5waXhlbFRpbGVQb29sKTtcbiAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yRmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgdHJhbnNhY3Rpb25gIGFuZCBjb21taXRzIHRoZSByZXN1bHRpbmcgcGl4ZWwgY2hhbmdlcyBhcyBhIHNpbmdsZVxuICAgKiB1bmRvYWJsZSBoaXN0b3J5IGFjdGlvbi5cbiAgICpcbiAgICogLSBJZiBgdHJhbnNhY3Rpb25gIHRocm93cywgYWxsIGFjY3VtdWxhdGVkIGNoYW5nZXMgYXJlIHJvbGxlZCBiYWNrIGFuZCB0aGUgZXJyb3JcbiAgICogICBpcyByZS10aHJvd24uIE5vIGFjdGlvbiBpcyBjb21taXR0ZWQuXG4gICAqIC0gSWYgYHRyYW5zYWN0aW9uYCBjb21wbGV0ZXMgd2l0aG91dCBtb2RpZnlpbmcgYW55IHBpeGVscywgbm8gYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICogLSBgd2l0aEhpc3RvcnlgIGlzIG5vdCByZS1lbnRyYW50LiBDYWxsaW5nIGl0IGFnYWluIGZyb20gaW5zaWRlIGB0cmFuc2FjdGlvbmAgd2lsbFxuICAgKiAgIHRocm93IGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgc2lsZW50IGRhdGEgbG9zcyBmcm9tIGEgbmVzdGVkIGV4dHJhY3RQYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIENhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBhZnRlclVuZG8gQ2FsbGVkIGFmdGVyIHVuZG8gb25seS5cbiAgICogQHBhcmFtIGFmdGVyUmVkbyBDYWxsZWQgYWZ0ZXIgcmVkbyBvbmx5LlxuICAgKi9cbiAgd2l0aEhpc3RvcnkodHJhbnNhY3Rpb246IChtdXRhdG9yOiBNKSA9PiB2b2lkLCBhZnRlclVuZG8/OiAocGF0Y2g6IFBpeGVsUGF0Y2hUaWxlcykgPT4gdm9pZCwgYWZ0ZXJSZWRvPzogKHBhdGNoOiBQaXhlbFBhdGNoVGlsZXMpID0+IHZvaWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd3aXRoSGlzdG9yeSBpcyBub3QgcmUtZW50cmFudCDigJQgY29tbWl0IG9yIHJvbGxiYWNrIHRoZSBjdXJyZW50IG9wZXJhdGlvbiBmaXJzdCcpO1xuICAgIH1cbiAgICB0aGlzLl9pblByb2dyZXNzID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgdHJhbnNhY3Rpb24odGhpcy5tdXRhdG9yKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLmFjY3VtdWxhdG9yLnJvbGxiYWNrQWZ0ZXJFcnJvcigpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY2N1bXVsYXRvci5iZWZvcmVUaWxlcy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCBwYXRjaCA9IHRoaXMuYWNjdW11bGF0b3IuZXh0cmFjdFBhdGNoKCk7XG4gICAgY29uc3QgYWN0aW9uID0gdGhpcy5oaXN0b3J5QWN0aW9uRmFjdG9yeSh0aGlzLmNvbmZpZywgdGhpcy5hY2N1bXVsYXRvciwgcGF0Y2gsIGFmdGVyVW5kbywgYWZ0ZXJSZWRvKTtcbiAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLmNvbW1pdChhY3Rpb24pO1xuICB9XG4gIHJlc2l6ZShuZXdXaWR0aDogbnVtYmVyLCBuZXdIZWlnaHQ6IG51bWJlciwgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwLCBhZnRlclVuZG8/OiAodGFyZ2V0OiBJbWFnZURhdGEpID0+IHZvaWQsIGFmdGVyUmVkbz86ICh0YXJnZXQ6IEltYWdlRGF0YSkgPT4gdm9pZCwgcmVzaXplSW1hZ2VEYXRhRm4gPSByZXNpemVJbWFnZURhdGEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVzaXplIGluc2lkZSBhIHdpdGhIaXN0b3J5IGNhbGxiYWNrJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlc2l6ZSB3aXRoIGFuIG9wZW4gYWNjdW11bGF0b3Ig4oCUIGNvbW1pdCBvciByb2xsYmFjayBmaXJzdCcpO1xuICAgIH1cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IGJlZm9yZUltYWdlRGF0YSA9IHRhcmdldC5pbWFnZURhdGE7XG4gICAgY29uc3QgYWZ0ZXJJbWFnZURhdGEgPSByZXNpemVJbWFnZURhdGFGbihiZWZvcmVJbWFnZURhdGEsIG5ld1dpZHRoLCBuZXdIZWlnaHQsIG9mZnNldFgsIG9mZnNldFkpO1xuICAgIHNldFBpeGVsRGF0YSh0YXJnZXQsIGFmdGVySW1hZ2VEYXRhKTtcbiAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLmNvbW1pdCh7XG4gICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgIHNldFBpeGVsRGF0YSh0YXJnZXQsIGJlZm9yZUltYWdlRGF0YSk7XG4gICAgICAgIGFmdGVyVW5kbz8uKGJlZm9yZUltYWdlRGF0YSk7XG4gICAgICB9LFxuICAgICAgcmVkbzogKCkgPT4ge1xuICAgICAgICBzZXRQaXhlbERhdGEodGFyZ2V0LCBhZnRlckltYWdlRGF0YSk7XG4gICAgICAgIGFmdGVyUmVkbz8uKGFmdGVySW1hZ2VEYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuZXhwb3J0IHR5cGUgSGlzdG9yeU11dGF0b3I8VCBleHRlbmRzIHt9LCBEIGV4dGVuZHMge30+ID0gKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwcz86IFBhcnRpYWw8RD4pID0+IFQ7Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { applyAlphaMaskToPixelData } from '../../PixelData/applyAlphaMaskToPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n applyAlphaMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyAlphaMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyAlphaMaskToPixelData = defaults.applyAlphaMaskToPixelData\n } = deps;\n return {\n applyAlphaMask(mask: AlphaMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const target = writer.config.target;\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? target.w;\n const h = opts?.h ?? target.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(applyAlphaMaskToPixelData(target, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGFcbiAgfSA9IGRlcHM7XG4gIHJldHVybiB7XG4gICAgYXBwbHlBbHBoYU1hc2sobWFzazogQWxwaGFNYXNrLCBvcHRzPzogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldDtcbiAgICAgIGNvbnN0IHggPSBvcHRzPy54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3B0cz8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IG9wdHM/LncgPz8gdGFyZ2V0Lnc7XG4gICAgICBjb25zdCBoID0gb3B0cz8uaCA/PyB0YXJnZXQuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyBinaryMaskToPixelData(target: PixelData32, mask: BinaryMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const width = opts?.w ?? target.w;\n const height = opts?.h ?? target.h;\n const globalAlpha = opts?.alpha ?? 255;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const invertMask = opts?.invertMask ?? false;\n if (globalAlpha === 0) return false;\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, target.w - x);\n h = Math.min(h, target.h - y);\n if (w <= 0 || h <= 0) return false;\n const mPitch = mask.w;\n if (mPitch <= 0) return false;\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(mPitch, startX + w);\n const sY1 = Math.min(mask.h, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n if (finalW <= 0 || finalH <= 0) {\n return false;\n }\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dst32 = target.data;\n const dw = target.w;\n const dStride = dw - finalW;\n const mStride = mPitch - finalW;\n const maskData = mask.data;\n let dIdx = (y + yShift) * dw + (x + xShift);\n let mIdx = sY0 * mPitch + sX0;\n let didChange = false;\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = maskData[mIdx];\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n const current = dst32[dIdx];\n const next = (current & 0x00ffffff) >>> 0;\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n } else if (globalAlpha !== 255) {\n const d = dst32[dIdx];\n const da = d >>> 24;\n if (da !== 0) {\n const finalAlpha = da === 255 ? globalAlpha : da * globalAlpha + 128 >> 8;\n const next = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (d !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQ6IFBpeGVsRGF0YTMyLCBtYXNrOiBCaW5hcnlNYXNrLCBvcHRzPzogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGNvbnN0IHdpZHRoID0gb3B0cz8udyA/PyB0YXJnZXQudztcbiAgY29uc3QgaGVpZ2h0ID0gb3B0cz8uaCA/PyB0YXJnZXQuaDtcbiAgY29uc3QgZ2xvYmFsQWxwaGEgPSBvcHRzPy5hbHBoYSA/PyAyNTU7XG4gIGNvbnN0IG14ID0gb3B0cz8ubXggPz8gMDtcbiAgY29uc3QgbXkgPSBvcHRzPy5teSA/PyAwO1xuICBjb25zdCBpbnZlcnRNYXNrID0gb3B0cz8uaW52ZXJ0TWFzayA/PyBmYWxzZTtcbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGxldCB4ID0gdGFyZ2V0WDtcbiAgbGV0IHkgPSB0YXJnZXRZO1xuICBsZXQgdyA9IHdpZHRoO1xuICBsZXQgaCA9IGhlaWdodDtcbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4O1xuICAgIHggPSAwO1xuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geTtcbiAgICB5ID0gMDtcbiAgfVxuICB3ID0gTWF0aC5taW4odywgdGFyZ2V0LncgLSB4KTtcbiAgaCA9IE1hdGgubWluKGgsIHRhcmdldC5oIC0geSk7XG4gIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sudztcbiAgaWYgKG1QaXRjaCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gMy4gU291cmNlIEJvdW5kcyBDbGlwcGluZ1xuICAvLyBDYWxjdWxhdGUgd2hlcmUgd2Ugd291bGQgc3RhcnQgcmVhZGluZyBpbiB0aGUgbWFza1xuICBjb25zdCBzdGFydFggPSBteCArICh4IC0gdGFyZ2V0WCk7XG4gIGNvbnN0IHN0YXJ0WSA9IG15ICsgKHkgLSB0YXJnZXRZKTtcblxuICAvLyBGaW5kIHRoZSBzYWZlIG92ZXJsYXAgYmV0d2VlbiB0aGUgcmVxdWVzdGVkIHJlZ2lvbiBhbmQgdGhlIG1hc2sgYm91bmRzXG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WCk7XG4gIGNvbnN0IHNZMCA9IE1hdGgubWF4KDAsIHN0YXJ0WSk7XG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKG1QaXRjaCwgc3RhcnRYICsgdyk7XG4gIGNvbnN0IHNZMSA9IE1hdGgubWluKG1hc2suaCwgc3RhcnRZICsgaCk7XG4gIGNvbnN0IGZpbmFsVyA9IHNYMSAtIHNYMDtcbiAgY29uc3QgZmluYWxIID0gc1kxIC0gc1kwO1xuICBpZiAoZmluYWxXIDw9IDAgfHwgZmluYWxIIDw9IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyA0LiBBbGlnbiBEZXN0aW5hdGlvbiB3aXRoIFNvdXJjZSBDbGlwcGluZ1xuICAvLyBJZiB0aGUgc291cmNlIHdhcyBjbGlwcGVkIG9uIHRoZSB0b3AvbGVmdCwgd2UgbXVzdCBzaGlmdCB0aGUgZGVzdGluYXRpb24gc3RhcnRcbiAgY29uc3QgeFNoaWZ0ID0gc1gwIC0gc3RhcnRYO1xuICBjb25zdCB5U2hpZnQgPSBzWTAgLSBzdGFydFk7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0Lnc7XG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGZpbmFsVztcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGZpbmFsVztcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGE7XG4gIGxldCBkSWR4ID0gKHkgKyB5U2hpZnQpICogZHcgKyAoeCArIHhTaGlmdCk7XG4gIGxldCBtSWR4ID0gc1kwICogbVBpdGNoICsgc1gwO1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBmaW5hbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgZmluYWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF07XG4gICAgICBjb25zdCBpc01hc2tlZE91dCA9IGludmVydE1hc2sgPyBtVmFsICE9PSAwIDogbVZhbCA9PT0gMDtcbiAgICAgIGlmIChpc01hc2tlZE91dCkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF07XG4gICAgICAgIGNvbnN0IG5leHQgPSAoY3VycmVudCAmIDB4MDBmZmZmZmYpID4+PiAwO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dDtcbiAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGdsb2JhbEFscGhhICE9PSAyNTUpIHtcbiAgICAgICAgY29uc3QgZCA9IGRzdDMyW2RJZHhdO1xuICAgICAgICBjb25zdCBkYSA9IGQgPj4+IDI0O1xuICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBmaW5hbEFscGhhID0gZGEgPT09IDI1NSA/IGdsb2JhbEFscGhhIDogZGEgKiBnbG9iYWxBbHBoYSArIDEyOCA+PiA4O1xuICAgICAgICAgIGNvbnN0IG5leHQgPSAoZCAmIDB4MDBmZmZmZmYgfCBmaW5hbEFscGhhIDw8IDI0KSA+Pj4gMDtcbiAgICAgICAgICBpZiAoZCAhPT0gbmV4dCkge1xuICAgICAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0O1xuICAgICAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRJZHgrKztcbiAgICAgIG1JZHgrKztcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlO1xuICAgIG1JZHggKz0gbVN0cmlkZTtcbiAgfVxuICByZXR1cm4gZGlkQ2hhbmdlO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { applyBinaryMaskToPixelData } from '../../PixelData/applyBinaryMaskToPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n applyBinaryMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyBinaryMaskToPixelData = defaults.applyBinaryMaskToPixelData\n } = deps;\n return {\n applyBinaryMask(mask: BinaryMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const target = writer.config.target;\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? target.w;\n const h = opts?.h ?? target.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(applyBinaryMaskToPixelData(target, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSc7XG5pbXBvcnQgeyB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QmluYXJ5TWFzayA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGFcbiAgfSA9IGRlcHM7XG4gIHJldHVybiB7XG4gICAgYXBwbHlCaW5hcnlNYXNrKG1hc2s6IEJpbmFyeU1hc2ssIG9wdHM/OiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHdyaXRlci5jb25maWcudGFyZ2V0O1xuICAgICAgY29uc3QgeCA9IG9wdHM/LnggPz8gMDtcbiAgICAgIGNvbnN0IHkgPSBvcHRzPy55ID8/IDA7XG4gICAgICBjb25zdCB3ID0gb3B0cz8udyA/PyB0YXJnZXQudztcbiAgICAgIGNvbnN0IGggPSBvcHRzPy5oID8/IHRhcmdldC5oO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../../Mask/_mask-types';\nimport { applyAlphaMaskToPixelData } from '../../PixelData/applyAlphaMaskToPixelData';\nimport { applyBinaryMaskToPixelData } from '../../PixelData/applyBinaryMaskToPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n applyBinaryMaskToPixelData,\n applyAlphaMaskToPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyBinaryMaskToPixelData = defaults.applyBinaryMaskToPixelData,\n applyAlphaMaskToPixelData = defaults.applyAlphaMaskToPixelData\n } = deps;\n return {\n applyMask(mask: Mask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const target = writer.config.target;\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? target.w;\n const h = opts?.h ?? target.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n if (mask.type === MaskType.BINARY) {\n return didChange(applyBinaryMaskToPixelData(target, mask, opts));\n } else {\n return didChange(applyAlphaMaskToPixelData(target, mask, opts));\n }\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uLy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJztcbmltcG9ydCB7IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhJztcbmltcG9ydCB7IHR5cGUgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi9QaXhlbFdyaXRlcic7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEsXG4gIGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGFcbn07XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz47XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQXBwbHlNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEgPSBkZWZhdWx0cy5hcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSxcbiAgICBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBhcHBseU1hc2sobWFzazogTWFzaywgb3B0cz86IEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQ7XG4gICAgICBjb25zdCB4ID0gb3B0cz8ueCA/PyAwO1xuICAgICAgY29uc3QgeSA9IG9wdHM/LnkgPz8gMDtcbiAgICAgIGNvbnN0IHcgPSBvcHRzPy53ID8/IHRhcmdldC53O1xuICAgICAgY29uc3QgaCA9IG9wdHM/LmggPz8gdGFyZ2V0Lmg7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIGlmIChtYXNrLnR5cGUgPT09IE1hc2tUeXBlLkJJTkFSWSkge1xuICAgICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRpZENoYW5nZShhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataAlphaMask(target: PixelData32, src: PixelData32, alphaMask: AlphaMask, opts?: PixelBlendMaskOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const sourceX = opts?.sx ?? 0;\n const sourceY = opts?.sy ?? 0;\n const width = opts?.w ?? src.w;\n const height = opts?.h ?? src.h;\n const globalAlpha = opts?.alpha ?? 255;\n const blendFn = opts?.blendFn ?? sourceOverPerfect;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const invertMask = opts?.invertMask ?? false;\n if (globalAlpha === 0) return false;\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. Clipping (Matches main branch behavior)\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.w - sx);\n h = Math.min(h, src.h - sy);\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 const actualW = Math.min(w, target.w - x);\n const actualH = Math.min(h, target.h - y);\n if (actualW <= 0 || actualH <= 0) return false;\n\n // 2. Index Setup\n const dw = target.w;\n const sw = src.w;\n const mPitch = alphaMask.w;\n const maskData = alphaMask.data;\n\n // dx/dy is the displacement from requested start to clipped start.\n // This keeps the mask locked to the source content during cross-clipping.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = target.data;\n const src32 = src.data;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n\n // Early exit if mask is fully transparent\n if (effM === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Early exit if source is fully transparent (unless overwriting)\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n\n // Calculate weight using linear logic (Easier for JIT than nested ternaries)\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n\n // Zero-weight safety check\n if (weight === 0) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (weight < 255) {\n const a = srcAlpha * weight + 128 >> 8;\n // Final check: weight might have resulted in a transparent pixel\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKHRhcmdldDogUGl4ZWxEYXRhMzIsIHNyYzogUGl4ZWxEYXRhMzIsIGFscGhhTWFzazogQWxwaGFNYXNrLCBvcHRzPzogUGl4ZWxCbGVuZE1hc2tPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGNvbnN0IHNvdXJjZVggPSBvcHRzPy5zeCA/PyAwO1xuICBjb25zdCBzb3VyY2VZID0gb3B0cz8uc3kgPz8gMDtcbiAgY29uc3Qgd2lkdGggPSBvcHRzPy53ID8/IHNyYy53O1xuICBjb25zdCBoZWlnaHQgPSBvcHRzPy5oID8/IHNyYy5oO1xuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHM/LmFscGhhID8/IDI1NTtcbiAgY29uc3QgYmxlbmRGbiA9IG9wdHM/LmJsZW5kRm4gPz8gc291cmNlT3ZlclBlcmZlY3Q7XG4gIGNvbnN0IG14ID0gb3B0cz8ubXggPz8gMDtcbiAgY29uc3QgbXkgPSBvcHRzPy5teSA/PyAwO1xuICBjb25zdCBpbnZlcnRNYXNrID0gb3B0cz8uaW52ZXJ0TWFzayA/PyBmYWxzZTtcbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGxldCB4ID0gdGFyZ2V0WDtcbiAgbGV0IHkgPSB0YXJnZXRZO1xuICBsZXQgc3ggPSBzb3VyY2VYO1xuICBsZXQgc3kgPSBzb3VyY2VZO1xuICBsZXQgdyA9IHdpZHRoO1xuICBsZXQgaCA9IGhlaWdodDtcblxuICAvLyAxLiBDbGlwcGluZyAoTWF0Y2hlcyBtYWluIGJyYW5jaCBiZWhhdmlvcilcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3g7XG4gICAgdyArPSBzeDtcbiAgICBzeCA9IDA7XG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3k7XG4gICAgaCArPSBzeTtcbiAgICBzeSA9IDA7XG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyYy53IC0gc3gpO1xuICBoID0gTWF0aC5taW4oaCwgc3JjLmggLSBzeSk7XG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHg7XG4gICAgdyArPSB4O1xuICAgIHggPSAwO1xuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHk7XG4gICAgaCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCB0YXJnZXQudyAtIHgpO1xuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgdGFyZ2V0LmggLSB5KTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZTtcblxuICAvLyAyLiBJbmRleCBTZXR1cFxuICBjb25zdCBkdyA9IHRhcmdldC53O1xuICBjb25zdCBzdyA9IHNyYy53O1xuICBjb25zdCBtUGl0Y2ggPSBhbHBoYU1hc2sudztcbiAgY29uc3QgbWFza0RhdGEgPSBhbHBoYU1hc2suZGF0YTtcblxuICAvLyBkeC9keSBpcyB0aGUgZGlzcGxhY2VtZW50IGZyb20gcmVxdWVzdGVkIHN0YXJ0IHRvIGNsaXBwZWQgc3RhcnQuXG4gIC8vIFRoaXMga2VlcHMgdGhlIG1hc2sgbG9ja2VkIHRvIHRoZSBzb3VyY2UgY29udGVudCBkdXJpbmcgY3Jvc3MtY2xpcHBpbmcuXG4gIGNvbnN0IGR4ID0geCAtIHRhcmdldFggfCAwO1xuICBjb25zdCBkeSA9IHkgLSB0YXJnZXRZIHwgMDtcbiAgY29uc3QgZHN0MzIgPSB0YXJnZXQuZGF0YTtcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTtcbiAgbGV0IGRJZHggPSB5ICogZHcgKyB4IHwgMDtcbiAgbGV0IHNJZHggPSBzeSAqIHN3ICsgc3ggfCAwO1xuICBsZXQgbUlkeCA9IChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KSB8IDA7XG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBzU3RyaWRlID0gc3cgLSBhY3R1YWxXIHwgMDtcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBpc09wYXF1ZSA9IGdsb2JhbEFscGhhID09PSAyNTU7XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZSB8fCBmYWxzZTtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF07XG4gICAgICBjb25zdCBlZmZNID0gaW52ZXJ0TWFzayA/IDI1NSAtIG1WYWwgOiBtVmFsO1xuXG4gICAgICAvLyBFYXJseSBleGl0IGlmIG1hc2sgaXMgZnVsbHkgdHJhbnNwYXJlbnRcbiAgICAgIGlmIChlZmZNID09PSAwKSB7XG4gICAgICAgIGRJZHgrKztcbiAgICAgICAgc0lkeCsrO1xuICAgICAgICBtSWR4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3JjQ29sID0gc3JjMzJbc0lkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IHNyY0FscGhhID0gc3JjQ29sID4+PiAyNDtcblxuICAgICAgLy8gRWFybHkgZXhpdCBpZiBzb3VyY2UgaXMgZnVsbHkgdHJhbnNwYXJlbnQgKHVubGVzcyBvdmVyd3JpdGluZylcbiAgICAgIGlmIChzcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBzSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGN1bGF0ZSB3ZWlnaHQgdXNpbmcgbGluZWFyIGxvZ2ljIChFYXNpZXIgZm9yIEpJVCB0aGFuIG5lc3RlZCB0ZXJuYXJpZXMpXG4gICAgICBsZXQgd2VpZ2h0ID0gZ2xvYmFsQWxwaGE7XG4gICAgICBpZiAoaXNPcGFxdWUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmTTtcbiAgICAgIH0gZWxzZSBpZiAoZWZmTSAhPT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IGVmZk0gKiBnbG9iYWxBbHBoYSArIDEyOCA+PiA4O1xuICAgICAgfVxuXG4gICAgICAvLyBaZXJvLXdlaWdodCBzYWZldHkgY2hlY2tcbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBzSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgZmluYWxDb2wgPSBzcmNDb2w7XG4gICAgICBpZiAod2VpZ2h0IDwgMjU1KSB7XG4gICAgICAgIGNvbnN0IGEgPSBzcmNBbHBoYSAqIHdlaWdodCArIDEyOCA+PiA4O1xuICAgICAgICAvLyBGaW5hbCBjaGVjazogd2VpZ2h0IG1pZ2h0IGhhdmUgcmVzdWx0ZWQgaW4gYSB0cmFuc3BhcmVudCBwaXhlbFxuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4Kys7XG4gICAgICAgICAgc0lkeCsrO1xuICAgICAgICAgIG1JZHgrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9IChzcmNDb2wgJiAweDAwZmZmZmZmIHwgYSA8PCAyNCkgPj4+IDAgYXMgQ29sb3IzMjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGN1cnJlbnQgPSBkc3QzMltkSWR4XSBhcyBDb2xvcjMyO1xuICAgICAgY29uc3QgbmV4dCA9IGJsZW5kRm4oZmluYWxDb2wsIGRzdDMyW2RJZHhdIGFzIENvbG9yMzIpO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0O1xuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZElkeCsrO1xuICAgICAgc0lkeCsrO1xuICAgICAgbUlkeCsrO1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGU7XG4gICAgc0lkeCArPSBzU3RyaWRlO1xuICAgIG1JZHggKz0gbVN0cmlkZTtcbiAgfVxuICByZXR1cm4gZGlkQ2hhbmdlO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { blendPixelDataAlphaMask } from '../../PixelData/blendPixelDataAlphaMask';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendPixelDataAlphaMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendAlphaMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataAlphaMask = defaults.blendPixelDataAlphaMask\n } = deps;\n return {\n blendAlphaMask(src: PixelData32, mask: AlphaMask, opts?: PixelBlendMaskOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.w;\n const h = opts?.h ?? src.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelDataAlphaMask(writer.config.target, src, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibGVuZFBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YUFscGhhTWFzayc7XG5pbXBvcnQgeyB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUFscGhhTWFza1xuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZEFscGhhTWFzayhzcmM6IFBpeGVsRGF0YTMyLCBtYXNrOiBBbHBoYU1hc2ssIG9wdHM/OiBQaXhlbEJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzPy54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3B0cz8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IG9wdHM/LncgPz8gc3JjLnc7XG4gICAgICBjb25zdCBoID0gb3B0cz8uaCA/PyBzcmMuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZFBpeGVsRGF0YUFscGhhTWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgc3JjLCBtYXNrLCBvcHRzKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataBinaryMask(target: PixelData32, src: PixelData32, binaryMask: BinaryMask, opts?: PixelBlendMaskOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const sourceX = opts?.sx ?? 0;\n const sourceY = opts?.sy ?? 0;\n const width = opts?.w ?? src.w;\n const height = opts?.h ?? src.h;\n const globalAlpha = opts?.alpha ?? 255;\n const blendFn = opts?.blendFn ?? sourceOverPerfect;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const invertMask = opts?.invertMask ?? false;\n if (globalAlpha === 0) return false;\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.w - sx);\n h = Math.min(h, src.h - 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 const actualW = Math.min(w, target.w - x);\n const actualH = Math.min(h, target.h - y);\n if (actualW <= 0 || actualH <= 0) return false;\n\n // 3. Coordinate Displacement for Mask Sync\n // dx/dy represents how far the clipped start is from the requested start.\n // This is the stable way to align the mask across all clipping permutations.\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = target.data;\n const src32 = src.data;\n const dw = target.w;\n const sw = src.w;\n const mPitch = binaryMask.w;\n const maskData = binaryMask.data;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite || false;\n let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n // Binary Mask Check (Earliest exit)\n if (maskData[mIdx] === skipVal) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n\n // Source Alpha Check\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n // Rounding-corrected global alpha application\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n mIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n mIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayh0YXJnZXQ6IFBpeGVsRGF0YTMyLCBzcmM6IFBpeGVsRGF0YTMyLCBiaW5hcnlNYXNrOiBCaW5hcnlNYXNrLCBvcHRzPzogUGl4ZWxCbGVuZE1hc2tPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGNvbnN0IHNvdXJjZVggPSBvcHRzPy5zeCA/PyAwO1xuICBjb25zdCBzb3VyY2VZID0gb3B0cz8uc3kgPz8gMDtcbiAgY29uc3Qgd2lkdGggPSBvcHRzPy53ID8/IHNyYy53O1xuICBjb25zdCBoZWlnaHQgPSBvcHRzPy5oID8/IHNyYy5oO1xuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHM/LmFscGhhID8/IDI1NTtcbiAgY29uc3QgYmxlbmRGbiA9IG9wdHM/LmJsZW5kRm4gPz8gc291cmNlT3ZlclBlcmZlY3Q7XG4gIGNvbnN0IG14ID0gb3B0cz8ubXggPz8gMDtcbiAgY29uc3QgbXkgPSBvcHRzPy5teSA/PyAwO1xuICBjb25zdCBpbnZlcnRNYXNrID0gb3B0cz8uaW52ZXJ0TWFzayA/PyBmYWxzZTtcbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGxldCB4ID0gdGFyZ2V0WDtcbiAgbGV0IHkgPSB0YXJnZXRZO1xuICBsZXQgc3ggPSBzb3VyY2VYO1xuICBsZXQgc3kgPSBzb3VyY2VZO1xuICBsZXQgdyA9IHdpZHRoO1xuICBsZXQgaCA9IGhlaWdodDtcblxuICAvLyAxLiBTb3VyY2UgQ2xpcHBpbmdcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3g7XG4gICAgdyArPSBzeDtcbiAgICBzeCA9IDA7XG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3k7XG4gICAgaCArPSBzeTtcbiAgICBzeSA9IDA7XG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyYy53IC0gc3gpO1xuICBoID0gTWF0aC5taW4oaCwgc3JjLmggLSBzeSk7XG5cbiAgLy8gMi4gRGVzdGluYXRpb24gQ2xpcHBpbmdcbiAgaWYgKHggPCAwKSB7XG4gICAgc3ggLT0geDtcbiAgICB3ICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgc3kgLT0geTtcbiAgICBoICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIHRhcmdldC53IC0geCk7XG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCB0YXJnZXQuaCAtIHkpO1xuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDMuIENvb3JkaW5hdGUgRGlzcGxhY2VtZW50IGZvciBNYXNrIFN5bmNcbiAgLy8gZHgvZHkgcmVwcmVzZW50cyBob3cgZmFyIHRoZSBjbGlwcGVkIHN0YXJ0IGlzIGZyb20gdGhlIHJlcXVlc3RlZCBzdGFydC5cbiAgLy8gVGhpcyBpcyB0aGUgc3RhYmxlIHdheSB0byBhbGlnbiB0aGUgbWFzayBhY3Jvc3MgYWxsIGNsaXBwaW5nIHBlcm11dGF0aW9ucy5cbiAgY29uc3QgZHggPSB4IC0gdGFyZ2V0WCB8IDA7XG4gIGNvbnN0IGR5ID0geSAtIHRhcmdldFkgfCAwO1xuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhO1xuICBjb25zdCBzcmMzMiA9IHNyYy5kYXRhO1xuICBjb25zdCBkdyA9IHRhcmdldC53O1xuICBjb25zdCBzdyA9IHNyYy53O1xuICBjb25zdCBtUGl0Y2ggPSBiaW5hcnlNYXNrLnc7XG4gIGNvbnN0IG1hc2tEYXRhID0gYmluYXJ5TWFzay5kYXRhO1xuICBsZXQgZElkeCA9IHkgKiBkdyArIHggfCAwO1xuICBsZXQgc0lkeCA9IHN5ICogc3cgKyBzeCB8IDA7XG4gIGxldCBtSWR4ID0gKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpIHwgMDtcbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IHNTdHJpZGUgPSBzdyAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IHNraXBWYWwgPSBpbnZlcnRNYXNrID8gMSA6IDA7XG4gIGNvbnN0IGlzT3BhcXVlID0gZ2xvYmFsQWxwaGEgPT09IDI1NTtcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSBibGVuZEZuLmlzT3ZlcndyaXRlIHx8IGZhbHNlO1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIC8vIEJpbmFyeSBNYXNrIENoZWNrIChFYXJsaWVzdCBleGl0KVxuICAgICAgaWYgKG1hc2tEYXRhW21JZHhdID09PSBza2lwVmFsKSB7XG4gICAgICAgIGRJZHgrKztcbiAgICAgICAgc0lkeCsrO1xuICAgICAgICBtSWR4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3JjQ29sID0gc3JjMzJbc0lkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IHNyY0FscGhhID0gc3JjQ29sID4+PiAyNDtcblxuICAgICAgLy8gU291cmNlIEFscGhhIENoZWNrXG4gICAgICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgIGRJZHgrKztcbiAgICAgICAgc0lkeCsrO1xuICAgICAgICBtSWR4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sO1xuICAgICAgaWYgKCFpc09wYXF1ZSkge1xuICAgICAgICAvLyBSb3VuZGluZy1jb3JyZWN0ZWQgZ2xvYmFsIGFscGhhIGFwcGxpY2F0aW9uXG4gICAgICAgIGNvbnN0IGEgPSBzcmNBbHBoYSAqIGdsb2JhbEFscGhhICsgMTI4ID4+IDg7XG4gICAgICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICAgIGRJZHgrKztcbiAgICAgICAgICBzSWR4Kys7XG4gICAgICAgICAgbUlkeCsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKHNyY0NvbCAmIDB4MDBmZmZmZmYgfCBhIDw8IDI0KSA+Pj4gMCBhcyBDb2xvcjMyO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzI7XG4gICAgICBjb25zdCBuZXh0ID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMik7XG4gICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBkSWR4Kys7XG4gICAgICBzSWR4Kys7XG4gICAgICBtSWR4Kys7XG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICBzSWR4ICs9IHNTdHJpZGU7XG4gICAgbUlkeCArPSBtU3RyaWRlO1xuICB9XG4gIHJldHVybiBkaWRDaGFuZ2U7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { blendPixelDataBinaryMask } from '../../PixelData/blendPixelDataBinaryMask';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendBinaryMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataBinaryMask = defaults.blendPixelDataBinaryMask\n } = deps;\n return {\n blendBinaryMask(src: PixelData32, mask: BinaryMask, opts?: PixelBlendMaskOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.w;\n const h = opts?.h ?? src.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelDataBinaryMask(writer.config.target, src, mask, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrJztcbmltcG9ydCB7IHR5cGUgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi9QaXhlbFdyaXRlcic7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQmluYXJ5TWFzayA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBQYXJ0aWFsPERlcHM+ID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayA9IGRlZmF1bHRzLmJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFza1xuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZEJpbmFyeU1hc2soc3JjOiBQaXhlbERhdGEzMiwgbWFzazogQmluYXJ5TWFzaywgb3B0cz86IFBpeGVsQmxlbmRNYXNrT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgeCA9IG9wdHM/LnggPz8gMDtcbiAgICAgIGNvbnN0IHkgPSBvcHRzPy55ID8/IDA7XG4gICAgICBjb25zdCB3ID0gb3B0cz8udyA/PyBzcmMudztcbiAgICAgIGNvbnN0IGggPSBvcHRzPy5oID8/IHNyYy5oO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgc3JjLCBtYXNrLCBvcHRzKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n/**\n * Blends a solid color into a target pixel buffer.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelData(target: PixelData32, color: Color32, opts?: ColorBlendOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const width = opts?.w ?? target.w;\n const height = opts?.h ?? target.h;\n const globalAlpha = opts?.alpha ?? 255;\n const blendFn = opts?.blendFn ?? sourceOverPerfect;\n if (globalAlpha === 0) return false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\n\n // Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, target.w - x);\n const actualH = Math.min(h, target.h - y);\n if (actualW <= 0 || actualH <= 0) return false;\n\n // Single-color fills can pre-calculate the source color once\n let finalSrcColor = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return false;\n finalSrcColor = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dst32 = target.data;\n const dw = target.w;\n let dIdx = y * dw + x | 0;\n const dStride = dw - actualW | 0;\n let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const current = dst32[dIdx] as Color32;\n const next = blendFn(finalSrcColor, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n }\n dIdx += dStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuLyoqXG4gKiBCbGVuZHMgYSBzb2xpZCBjb2xvciBpbnRvIGEgdGFyZ2V0IHBpeGVsIGJ1ZmZlci5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YSh0YXJnZXQ6IFBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgb3B0cz86IENvbG9yQmxlbmRPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGNvbnN0IHdpZHRoID0gb3B0cz8udyA/PyB0YXJnZXQudztcbiAgY29uc3QgaGVpZ2h0ID0gb3B0cz8uaCA/PyB0YXJnZXQuaDtcbiAgY29uc3QgZ2xvYmFsQWxwaGEgPSBvcHRzPy5hbHBoYSA/PyAyNTU7XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzPy5ibGVuZEZuID8/IHNvdXJjZU92ZXJQZXJmZWN0O1xuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0O1xuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2U7XG4gIGlmIChiYXNlU3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ2xpcHBpbmdcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCB3ID0gd2lkdGg7XG4gIGxldCBoID0gaGVpZ2h0O1xuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCB0YXJnZXQudyAtIHgpO1xuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgdGFyZ2V0LmggLSB5KTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZTtcblxuICAvLyBTaW5nbGUtY29sb3IgZmlsbHMgY2FuIHByZS1jYWxjdWxhdGUgdGhlIHNvdXJjZSBjb2xvciBvbmNlXG4gIGxldCBmaW5hbFNyY0NvbG9yID0gY29sb3I7XG4gIGlmIChnbG9iYWxBbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGEgPSBiYXNlU3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCA+PiA4O1xuICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZpbmFsU3JjQ29sb3IgPSAoY29sb3IgJiAweDAwZmZmZmZmIHwgYSA8PCAyNCkgPj4+IDAgYXMgQ29sb3IzMjtcbiAgfVxuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhO1xuICBjb25zdCBkdyA9IHRhcmdldC53O1xuICBsZXQgZElkeCA9IHkgKiBkdyArIHggfCAwO1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBhY3R1YWxXIHwgMDtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGZpbmFsU3JjQ29sb3IsIGN1cnJlbnQpO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0O1xuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZElkeCsrO1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGU7XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { blendColorPixelData } from '../../PixelData/blendColorPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendColorPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColor = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n blendColorPixelData = defaults.blendColorPixelData\n } = deps;\n return {\n blendColor(color: Color32, opts?: ColorBlendOptions): boolean {\n const target = writer.config.target;\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? target.w;\n const h = opts?.h ?? target.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendColorPixelData(target, color, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBibGVuZENvbG9yUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQ29sb3IgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yKGNvbG9yOiBDb2xvcjMyLCBvcHRzPzogQ29sb3JCbGVuZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHdyaXRlci5jb25maWcudGFyZ2V0O1xuICAgICAgY29uc3QgeCA9IG9wdHM/LnggPz8gMDtcbiAgICAgIGNvbnN0IHkgPSBvcHRzPy55ID8/IDA7XG4gICAgICBjb25zdCB3ID0gb3B0cz8udyA/PyB0YXJnZXQudztcbiAgICAgIGNvbnN0IGggPSBvcHRzPy5oID8/IHRhcmdldC5oO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGEodGFyZ2V0LCBjb2xvciwgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n/**\n * Blends a solid color into a target pixel buffer using an alpha mask.\n *\n * @remarks\n * If the width (`w`) or height (`h`) are omitted from the options, they will safely\n * default to the dimensions of the provided mask to prevent out-of-bounds memory access.\n *\n * @param target - The destination {@link PixelData32} buffer to modify.\n * @param color - The solid color to apply.\n * @param mask - The mask defining the per-pixel opacity of the target area.\n * @param opts - Configuration options including placement coordinates, bounds, global alpha, and mask offsets.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataAlphaMask(target: PixelData32, color: Color32, mask: AlphaMask, opts?: ColorBlendMaskOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const w = opts?.w ?? mask.w;\n const h = opts?.h ?? mask.h;\n const globalAlpha = opts?.alpha ?? 255;\n const blendFn = opts?.blendFn ?? sourceOverPerfect;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const invertMask = opts?.invertMask ?? false;\n if (globalAlpha === 0) return false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\n let x = targetX;\n let y = targetY;\n let actualW = w;\n let actualH = h;\n if (x < 0) {\n actualW += x;\n x = 0;\n }\n if (y < 0) {\n actualH += y;\n y = 0;\n }\n actualW = Math.min(actualW, target.w - x);\n actualH = Math.min(actualH, target.h - y);\n if (actualW <= 0 || actualH <= 0) return false;\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = target.data;\n const dw = target.w;\n const mPitch = mask.w;\n const maskData = mask.data;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const colorRGB = color & 0x00ffffff;\n let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx];\n const effM = invertMask ? 255 - mVal : mVal;\n if (effM === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let weight = globalAlpha;\n if (isOpaque) {\n weight = effM;\n } else if (effM !== 255) {\n weight = effM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n dIdx++;\n mIdx++;\n continue;\n }\n let finalCol = color;\n if (weight < 255) {\n const a = baseSrcAlpha * weight + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n mIdx++;\n continue;\n }\n finalCol = (colorRGB | a << 24) >>> 0 as Color32;\n }\n const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuLyoqXG4gKiBCbGVuZHMgYSBzb2xpZCBjb2xvciBpbnRvIGEgdGFyZ2V0IHBpeGVsIGJ1ZmZlciB1c2luZyBhbiBhbHBoYSBtYXNrLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGUgd2lkdGggKGB3YCkgb3IgaGVpZ2h0IChgaGApIGFyZSBvbWl0dGVkIGZyb20gdGhlIG9wdGlvbnMsIHRoZXkgd2lsbCBzYWZlbHlcbiAqIGRlZmF1bHQgdG8gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHByb3ZpZGVkIG1hc2sgdG8gcHJldmVudCBvdXQtb2YtYm91bmRzIG1lbW9yeSBhY2Nlc3MuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBkZXN0aW5hdGlvbiB7QGxpbmsgUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgc29saWQgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gbWFzayAtIFRoZSBtYXNrIGRlZmluaW5nIHRoZSBwZXItcGl4ZWwgb3BhY2l0eSBvZiB0aGUgdGFyZ2V0IGFyZWEuXG4gKiBAcGFyYW0gb3B0cyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgcGxhY2VtZW50IGNvb3JkaW5hdGVzLCBib3VuZHMsIGdsb2JhbCBhbHBoYSwgYW5kIG1hc2sgb2Zmc2V0cy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayh0YXJnZXQ6IFBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgbWFzazogQWxwaGFNYXNrLCBvcHRzPzogQ29sb3JCbGVuZE1hc2tPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGNvbnN0IHcgPSBvcHRzPy53ID8/IG1hc2sudztcbiAgY29uc3QgaCA9IG9wdHM/LmggPz8gbWFzay5oO1xuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHM/LmFscGhhID8/IDI1NTtcbiAgY29uc3QgYmxlbmRGbiA9IG9wdHM/LmJsZW5kRm4gPz8gc291cmNlT3ZlclBlcmZlY3Q7XG4gIGNvbnN0IG14ID0gb3B0cz8ubXggPz8gMDtcbiAgY29uc3QgbXkgPSBvcHRzPy5teSA/PyAwO1xuICBjb25zdCBpbnZlcnRNYXNrID0gb3B0cz8uaW52ZXJ0TWFzayA/PyBmYWxzZTtcbiAgaWYgKGdsb2JhbEFscGhhID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNDtcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSAoYmxlbmRGbiBhcyBhbnkpLmlzT3ZlcndyaXRlIHx8IGZhbHNlO1xuICBpZiAoYmFzZVNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlO1xuICBsZXQgeCA9IHRhcmdldFg7XG4gIGxldCB5ID0gdGFyZ2V0WTtcbiAgbGV0IGFjdHVhbFcgPSB3O1xuICBsZXQgYWN0dWFsSCA9IGg7XG4gIGlmICh4IDwgMCkge1xuICAgIGFjdHVhbFcgKz0geDtcbiAgICB4ID0gMDtcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBhY3R1YWxIICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cbiAgYWN0dWFsVyA9IE1hdGgubWluKGFjdHVhbFcsIHRhcmdldC53IC0geCk7XG4gIGFjdHVhbEggPSBNYXRoLm1pbihhY3R1YWxILCB0YXJnZXQuaCAtIHkpO1xuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkeCA9IHggLSB0YXJnZXRYIHwgMDtcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WSB8IDA7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0Lnc7XG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sudztcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGE7XG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeCB8IDA7XG4gIGxldCBtSWR4ID0gKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpIHwgMDtcbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBhY3R1YWxXIHwgMDtcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1O1xuICBjb25zdCBjb2xvclJHQiA9IGNvbG9yICYgMHgwMGZmZmZmZjtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF07XG4gICAgICBjb25zdCBlZmZNID0gaW52ZXJ0TWFzayA/IDI1NSAtIG1WYWwgOiBtVmFsO1xuICAgICAgaWYgKGVmZk0gPT09IDApIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBtSWR4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IHdlaWdodCA9IGdsb2JhbEFscGhhO1xuICAgICAgaWYgKGlzT3BhcXVlKSB7XG4gICAgICAgIHdlaWdodCA9IGVmZk07XG4gICAgICB9IGVsc2UgaWYgKGVmZk0gIT09IDI1NSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZNICogZ2xvYmFsQWxwaGEgKyAxMjggPj4gODtcbiAgICAgIH1cbiAgICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBtSWR4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGZpbmFsQ29sID0gY29sb3I7XG4gICAgICBpZiAod2VpZ2h0IDwgMjU1KSB7XG4gICAgICAgIGNvbnN0IGEgPSBiYXNlU3JjQWxwaGEgKiB3ZWlnaHQgKyAxMjggPj4gODtcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrO1xuICAgICAgICAgIG1JZHgrKztcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbENvbCA9IChjb2xvclJHQiB8IGEgPDwgMjQpID4+PiAwIGFzIENvbG9yMzI7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGZpbmFsQ29sLCBjdXJyZW50KTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dDtcbiAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGRJZHgrKztcbiAgICAgIG1JZHgrKztcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlO1xuICAgIG1JZHggKz0gbVN0cmlkZTtcbiAgfVxuICByZXR1cm4gZGlkQ2hhbmdlO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendColorPixelDataAlphaMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintAlphaMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask\n } = deps;\n const OPTS = {\n x: 0,\n y: 0,\n blendFn: sourceOverPerfect,\n alpha: 255\n };\n return {\n blendColorPaintAlphaMask(color: Color32, mask: PaintAlphaMask, x: number, y: number, alpha = 255, blendFn = sourceOverPerfect): boolean {\n const tx = x + mask.centerOffsetX;\n const ty = y + mask.centerOffsetY;\n const didChange = writer.accumulator.storeRegionBeforeState(tx, ty, mask.w, mask.h);\n OPTS.x = tx;\n OPTS.y = ty;\n OPTS.alpha = alpha;\n OPTS.blendFn = blendFn;\n return didChange(blendColorPixelDataAlphaMask(writer.config.target, color, mask, OPTS));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQ29sb3JQYWludEFscGhhTWFzayA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBQYXJ0aWFsPERlcHM+ID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrXG4gIH0gPSBkZXBzO1xuICBjb25zdCBPUFRTID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBhbHBoYTogMjU1XG4gIH07XG4gIHJldHVybiB7XG4gICAgYmxlbmRDb2xvclBhaW50QWxwaGFNYXNrKGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludEFscGhhTWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIsIGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHR4ID0geCArIG1hc2suY2VudGVyT2Zmc2V0WDtcbiAgICAgIGNvbnN0IHR5ID0geSArIG1hc2suY2VudGVyT2Zmc2V0WTtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHR4LCB0eSwgbWFzay53LCBtYXNrLmgpO1xuICAgICAgT1BUUy54ID0gdHg7XG4gICAgICBPUFRTLnkgPSB0eTtcbiAgICAgIE9QVFMuYWxwaGEgPSBhbHBoYTtcbiAgICAgIE9QVFMuYmxlbmRGbiA9IGJsZW5kRm47XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIGNvbG9yLCBtYXNrLCBPUFRTKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n/**\n * Blends a solid color into a target pixel buffer using a binary mask.\n *\n * @remarks\n * If the width (`w`) or height (`h`) are omitted from the options, they will safely\n * default to the dimensions of the provided mask to prevent out-of-bounds memory access.\n *\n * @param target - The destination {@link PixelData32} buffer to modify.\n * @param color - The solid color to apply.\n * @param mask - The mask defining the per-pixel opacity of the target area.\n * @param opts - Configuration options including placement coordinates, bounds, global alpha, and mask offsets.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataBinaryMask(target: PixelData32, color: Color32, mask: BinaryMask, opts?: ColorBlendMaskOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n let w = opts?.w ?? mask.w;\n let h = opts?.h ?? mask.h;\n const globalAlpha = opts?.alpha ?? 255;\n const blendFn = opts?.blendFn ?? sourceOverPerfect;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const invertMask = opts?.invertMask ?? false;\n if (globalAlpha === 0) return false;\n const baseSrcAlpha = color >>> 24;\n const isOverwrite = (blendFn as any).isOverwrite || false;\n if (baseSrcAlpha === 0 && !isOverwrite) return false;\n let x = targetX;\n let y = targetY;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, target.w - x);\n const actualH = Math.min(h, target.h - y);\n if (actualW <= 0 || actualH <= 0) return false;\n let baseColorWithGlobalAlpha = color;\n if (globalAlpha < 255) {\n const a = baseSrcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) return false;\n baseColorWithGlobalAlpha = (color & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const dx = x - targetX | 0;\n const dy = y - targetY | 0;\n const dst32 = target.data;\n const dw = target.w;\n const mPitch = mask.w;\n const maskData = mask.data;\n let dIdx = y * dw + x | 0;\n let mIdx = (my + dy) * mPitch + (mx + dx) | 0;\n const dStride = dw - actualW | 0;\n const mStride = mPitch - actualW | 0;\n const skipVal = invertMask ? 1 : 0;\n let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n if (maskData[mIdx] === skipVal) {\n dIdx++;\n mIdx++;\n continue;\n }\n const current = dst32[dIdx] as Color32;\n const next = blendFn(baseColorWithGlobalAlpha, current);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuLyoqXG4gKiBCbGVuZHMgYSBzb2xpZCBjb2xvciBpbnRvIGEgdGFyZ2V0IHBpeGVsIGJ1ZmZlciB1c2luZyBhIGJpbmFyeSBtYXNrLlxuICpcbiAqIEByZW1hcmtzXG4gKiBJZiB0aGUgd2lkdGggKGB3YCkgb3IgaGVpZ2h0IChgaGApIGFyZSBvbWl0dGVkIGZyb20gdGhlIG9wdGlvbnMsIHRoZXkgd2lsbCBzYWZlbHlcbiAqIGRlZmF1bHQgdG8gdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHByb3ZpZGVkIG1hc2sgdG8gcHJldmVudCBvdXQtb2YtYm91bmRzIG1lbW9yeSBhY2Nlc3MuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBkZXN0aW5hdGlvbiB7QGxpbmsgUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgc29saWQgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gbWFzayAtIFRoZSBtYXNrIGRlZmluaW5nIHRoZSBwZXItcGl4ZWwgb3BhY2l0eSBvZiB0aGUgdGFyZ2V0IGFyZWEuXG4gKiBAcGFyYW0gb3B0cyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgcGxhY2VtZW50IGNvb3JkaW5hdGVzLCBib3VuZHMsIGdsb2JhbCBhbHBoYSwgYW5kIG1hc2sgb2Zmc2V0cy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sodGFyZ2V0OiBQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIG1hc2s6IEJpbmFyeU1hc2ssIG9wdHM/OiBDb2xvckJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHM/LnggPz8gMDtcbiAgY29uc3QgdGFyZ2V0WSA9IG9wdHM/LnkgPz8gMDtcbiAgbGV0IHcgPSBvcHRzPy53ID8/IG1hc2sudztcbiAgbGV0IGggPSBvcHRzPy5oID8/IG1hc2suaDtcbiAgY29uc3QgZ2xvYmFsQWxwaGEgPSBvcHRzPy5hbHBoYSA/PyAyNTU7XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzPy5ibGVuZEZuID8/IHNvdXJjZU92ZXJQZXJmZWN0O1xuICBjb25zdCBteCA9IG9wdHM/Lm14ID8/IDA7XG4gIGNvbnN0IG15ID0gb3B0cz8ubXkgPz8gMDtcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHM/LmludmVydE1hc2sgPz8gZmFsc2U7XG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBiYXNlU3JjQWxwaGEgPSBjb2xvciA+Pj4gMjQ7XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gKGJsZW5kRm4gYXMgYW55KS5pc092ZXJ3cml0ZSB8fCBmYWxzZTtcbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZTtcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geDtcbiAgICB4ID0gMDtcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIHRhcmdldC53IC0geCk7XG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCB0YXJnZXQuaCAtIHkpO1xuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBsZXQgYmFzZUNvbG9yV2l0aEdsb2JhbEFscGhhID0gY29sb3I7XG4gIGlmIChnbG9iYWxBbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGEgPSBiYXNlU3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCA+PiA4O1xuICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSA9IChjb2xvciAmIDB4MDBmZmZmZmYgfCBhIDw8IDI0KSA+Pj4gMCBhcyBDb2xvcjMyO1xuICB9XG4gIGNvbnN0IGR4ID0geCAtIHRhcmdldFggfCAwO1xuICBjb25zdCBkeSA9IHkgLSB0YXJnZXRZIHwgMDtcbiAgY29uc3QgZHN0MzIgPSB0YXJnZXQuZGF0YTtcbiAgY29uc3QgZHcgPSB0YXJnZXQudztcbiAgY29uc3QgbVBpdGNoID0gbWFzay53O1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YTtcbiAgbGV0IGRJZHggPSB5ICogZHcgKyB4IHwgMDtcbiAgbGV0IG1JZHggPSAobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkgfCAwO1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBhY3R1YWxXIHwgMDtcbiAgY29uc3QgbVN0cmlkZSA9IG1QaXRjaCAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBza2lwVmFsID0gaW52ZXJ0TWFzayA/IDEgOiAwO1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGlmIChtYXNrRGF0YVttSWR4XSA9PT0gc2tpcFZhbCkge1xuICAgICAgICBkSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSwgY3VycmVudCk7XG4gICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBkSWR4Kys7XG4gICAgICBtSWR4Kys7XG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICBtSWR4ICs9IG1TdHJpZGU7XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendColorPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintBinaryMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask\n } = deps;\n const OPTS = {\n x: 0,\n y: 0,\n blendFn: sourceOverPerfect,\n alpha: 255\n };\n return {\n blendColorPaintBinaryMask(color: Color32, mask: PaintBinaryMask, x: number, y: number, alpha = 255, blendFn = sourceOverPerfect): boolean {\n const tx = x + mask.centerOffsetX;\n const ty = y + mask.centerOffsetY;\n const didChange = writer.accumulator.storeRegionBeforeState(tx, ty, mask.w, mask.h);\n OPTS.x = tx;\n OPTS.y = ty;\n OPTS.alpha = alpha;\n OPTS.blendFn = blendFn;\n return didChange(blendColorPixelDataBinaryMask(writer.config.target, color, mask, OPTS));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQ29sb3JQYWludEJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrXG4gIH0gPSBkZXBzO1xuICBjb25zdCBPUFRTID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBhbHBoYTogMjU1XG4gIH07XG4gIHJldHVybiB7XG4gICAgYmxlbmRDb2xvclBhaW50QmluYXJ5TWFzayhjb2xvcjogQ29sb3IzMiwgbWFzazogUGFpbnRCaW5hcnlNYXNrLCB4OiBudW1iZXIsIHk6IG51bWJlciwgYWxwaGEgPSAyNTUsIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdHggPSB4ICsgbWFzay5jZW50ZXJPZmZzZXRYO1xuICAgICAgY29uc3QgdHkgPSB5ICsgbWFzay5jZW50ZXJPZmZzZXRZO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUodHgsIHR5LCBtYXNrLncsIG1hc2suaCk7XG4gICAgICBPUFRTLnggPSB0eDtcbiAgICAgIE9QVFMueSA9IHR5O1xuICAgICAgT1BUUy5hbHBoYSA9IGFscGhhO1xuICAgICAgT1BUUy5ibGVuZEZuID0gYmxlbmRGbjtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIGNvbG9yLCBtYXNrLCBPUFRTKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { MaskType } from '../../Mask/_mask-types';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendColorPixelDataAlphaMask,\n blendColorPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask\n } = deps;\n const OPTS = {\n x: 0,\n y: 0,\n blendFn: sourceOverPerfect,\n alpha: 255\n };\n return {\n blendColorPaintMask(color: Color32, mask: PaintMask, x: number, y: number, alpha = 255, blendFn = sourceOverPerfect): boolean {\n const tx = x + mask.centerOffsetX;\n const ty = y + mask.centerOffsetY;\n const didChange = writer.accumulator.storeRegionBeforeState(tx, ty, mask.w, mask.h);\n OPTS.x = tx;\n OPTS.y = ty;\n OPTS.alpha = alpha;\n OPTS.blendFn = blendFn;\n if (mask.type === MaskType.BINARY) {\n return didChange(blendColorPixelDataBinaryMask(writer.config.target, color, mask, OPTS));\n } else {\n return didChange(blendColorPixelDataAlphaMask(writer.config.target, color, mask, OPTS));\n }\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uLy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrJztcbmltcG9ydCB7IHR5cGUgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi9QaXhlbFdyaXRlcic7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayxcbiAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2tcbn07XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz47XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRDb2xvclBhaW50TWFzayA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBQYXJ0aWFsPERlcHM+ID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2tcbiAgfSA9IGRlcHM7XG4gIGNvbnN0IE9QVFMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIGFscGhhOiAyNTVcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yUGFpbnRNYXNrKGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludE1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0KTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB0eCA9IHggKyBtYXNrLmNlbnRlck9mZnNldFg7XG4gICAgICBjb25zdCB0eSA9IHkgKyBtYXNrLmNlbnRlck9mZnNldFk7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh0eCwgdHksIG1hc2sudywgbWFzay5oKTtcbiAgICAgIE9QVFMueCA9IHR4O1xuICAgICAgT1BUUy55ID0gdHk7XG4gICAgICBPUFRTLmFscGhhID0gYWxwaGE7XG4gICAgICBPUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICAgICAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIGNvbG9yLCBtYXNrLCBPUFRTKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIGNvbG9yLCBtYXNrLCBPUFRTKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendColorPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintRect = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n blendColorPixelData = defaults.blendColorPixelData\n } = deps;\n const OPTS = {\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n blendFn: sourceOverPerfect,\n alpha: 255\n };\n return {\n blendColorPaintRect(color: Color32, centerX: number, centerY: number, brushWidth: number, brushHeight: number, alpha = 255, blendFn: BlendColor32 = sourceOverPerfect): boolean {\n const target = writer.config.target;\n const topLeftX = centerX + (-(brushWidth - 1 >> 1));\n const topLeftY = centerY + (-(brushHeight - 1 >> 1));\n OPTS.x = topLeftX;\n OPTS.y = topLeftY;\n OPTS.w = brushWidth;\n OPTS.h = brushHeight;\n OPTS.blendFn = blendFn;\n OPTS.alpha = alpha;\n const didChange = writer.accumulator.storeRegionBeforeState(topLeftX, topLeftY, brushWidth, brushHeight);\n return didChange(blendColorPixelData(target, color, OPTS));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBibGVuZENvbG9yUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQ29sb3JQYWludFJlY3QgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgY29uc3QgT1BUUyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIGFscGhhOiAyNTVcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yUGFpbnRSZWN0KGNvbG9yOiBDb2xvcjMyLCBjZW50ZXJYOiBudW1iZXIsIGNlbnRlclk6IG51bWJlciwgYnJ1c2hXaWR0aDogbnVtYmVyLCBicnVzaEhlaWdodDogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHdyaXRlci5jb25maWcudGFyZ2V0O1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBjZW50ZXJYICsgKC0oYnJ1c2hXaWR0aCAtIDEgPj4gMSkpO1xuICAgICAgY29uc3QgdG9wTGVmdFkgPSBjZW50ZXJZICsgKC0oYnJ1c2hIZWlnaHQgLSAxID4+IDEpKTtcbiAgICAgIE9QVFMueCA9IHRvcExlZnRYO1xuICAgICAgT1BUUy55ID0gdG9wTGVmdFk7XG4gICAgICBPUFRTLncgPSBicnVzaFdpZHRoO1xuICAgICAgT1BUUy5oID0gYnJ1c2hIZWlnaHQ7XG4gICAgICBPUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICAgICAgT1BUUy5hbHBoYSA9IGFscGhhO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUodG9wTGVmdFgsIHRvcExlZnRZLCBicnVzaFdpZHRoLCBicnVzaEhlaWdodCk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGEodGFyZ2V0LCBjb2xvciwgT1BUUykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../../Mask/_mask-types';\nimport { blendPixelDataAlphaMask } from '../../PixelData/blendPixelDataAlphaMask';\nimport { blendPixelDataBinaryMask } from '../../PixelData/blendPixelDataBinaryMask';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendPixelDataAlphaMask,\n blendPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataAlphaMask = defaults.blendPixelDataAlphaMask,\n blendPixelDataBinaryMask = defaults.blendPixelDataBinaryMask\n } = deps;\n return {\n blendMask(src: PixelData32, mask: Mask, opts?: PixelBlendMaskOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.w;\n const h = opts?.h ?? src.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n if (mask.type === MaskType.BINARY) {\n return didChange(blendPixelDataBinaryMask(writer.config.target, src, mask, opts));\n } else {\n return didChange(blendPixelDataAlphaMask(writer.config.target, src, mask, opts));\n }\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uLy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFBbHBoYU1hc2snO1xuaW1wb3J0IHsgYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2tcbn07XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz47XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yQmxlbmRNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUFscGhhTWFzayxcbiAgICBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2tcbiAgfSA9IGRlcHM7XG4gIHJldHVybiB7XG4gICAgYmxlbmRNYXNrKHNyYzogUGl4ZWxEYXRhMzIsIG1hc2s6IE1hc2ssIG9wdHM/OiBQaXhlbEJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzPy54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3B0cz8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IG9wdHM/LncgPz8gc3JjLnc7XG4gICAgICBjb25zdCBoID0gb3B0cz8uaCA/PyBzcmMuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBzcmMsIG1hc2ssIG9wdHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgbWFzaywgb3B0cykpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixel(target: PixelData32, x: number, y: number, color: Color32, alpha: number = 255, blendFn: BlendColor32 = sourceOverPerfect): boolean {\n if (alpha === 0) return false;\n let width = target.w;\n let height = target.h;\n if (x < 0 || x >= width || y < 0 || y >= height) return false;\n let srcAlpha = color >>> 24;\n let isOverwrite = blendFn.isOverwrite;\n\n // Early exit for transparent source unless we are in an overwrite mode\n if (srcAlpha === 0 && !isOverwrite) return false;\n let dst32 = target.data;\n let index = y * width + x;\n let finalColor = color;\n if (alpha !== 255) {\n let finalAlpha = srcAlpha * alpha + 128 >> 8;\n if (finalAlpha === 0 && !isOverwrite) return false;\n finalColor = (color & 0x00ffffff | finalAlpha << 24) >>> 0 as Color32;\n }\n let current = dst32[index] as Color32;\n let next = blendFn(finalColor, current);\n if (current !== next) {\n dst32[index] = next;\n return true;\n }\n return false;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWwodGFyZ2V0OiBQaXhlbERhdGEzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIGNvbG9yOiBDb2xvcjMyLCBhbHBoYTogbnVtYmVyID0gMjU1LCBibGVuZEZuOiBCbGVuZENvbG9yMzIgPSBzb3VyY2VPdmVyUGVyZmVjdCk6IGJvb2xlYW4ge1xuICBpZiAoYWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgbGV0IHdpZHRoID0gdGFyZ2V0Lnc7XG4gIGxldCBoZWlnaHQgPSB0YXJnZXQuaDtcbiAgaWYgKHggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA8IDAgfHwgeSA+PSBoZWlnaHQpIHJldHVybiBmYWxzZTtcbiAgbGV0IHNyY0FscGhhID0gY29sb3IgPj4+IDI0O1xuICBsZXQgaXNPdmVyd3JpdGUgPSBibGVuZEZuLmlzT3ZlcndyaXRlO1xuXG4gIC8vIEVhcmx5IGV4aXQgZm9yIHRyYW5zcGFyZW50IHNvdXJjZSB1bmxlc3Mgd2UgYXJlIGluIGFuIG92ZXJ3cml0ZSBtb2RlXG4gIGlmIChzcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZTtcbiAgbGV0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG4gIGxldCBpbmRleCA9IHkgKiB3aWR0aCArIHg7XG4gIGxldCBmaW5hbENvbG9yID0gY29sb3I7XG4gIGlmIChhbHBoYSAhPT0gMjU1KSB7XG4gICAgbGV0IGZpbmFsQWxwaGEgPSBzcmNBbHBoYSAqIGFscGhhICsgMTI4ID4+IDg7XG4gICAgaWYgKGZpbmFsQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2U7XG4gICAgZmluYWxDb2xvciA9IChjb2xvciAmIDB4MDBmZmZmZmYgfCBmaW5hbEFscGhhIDw8IDI0KSA+Pj4gMCBhcyBDb2xvcjMyO1xuICB9XG4gIGxldCBjdXJyZW50ID0gZHN0MzJbaW5kZXhdIGFzIENvbG9yMzI7XG4gIGxldCBuZXh0ID0gYmxlbmRGbihmaW5hbENvbG9yLCBjdXJyZW50KTtcbiAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICBkc3QzMltpbmRleF0gPSBuZXh0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { blendPixel } from '../../PixelData/blendPixel';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendPixel\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixel = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixel = defaults.blendPixel\n } = deps;\n return {\n blendPixel(x: number, y: number, color: Color32, alpha?: number, blendFn?: BlendColor32): boolean {\n const didChange = writer.accumulator.storePixelBeforeState(x, y);\n return didChange(blendPixel(writer.config.target, x, y, color, alpha, blendFn));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibGVuZFBpeGVsIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWwnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBibGVuZFBpeGVsXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kUGl4ZWwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZFBpeGVsID0gZGVmYXVsdHMuYmxlbmRQaXhlbFxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZFBpeGVsKHg6IG51bWJlciwgeTogbnVtYmVyLCBjb2xvcjogQ29sb3IzMiwgYWxwaGE/OiBudW1iZXIsIGJsZW5kRm4/OiBCbGVuZENvbG9yMzIpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVBpeGVsQmVmb3JlU3RhdGUoeCwgeSk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kUGl4ZWwod3JpdGVyLmNvbmZpZy50YXJnZXQsIHgsIHksIGNvbG9yLCBhbHBoYSwgYmxlbmRGbikpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\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(target: PixelData32, src: PixelData32, opts?: PixelBlendOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const sourceX = opts?.sx ?? 0;\n const sourceY = opts?.sy ?? 0;\n const width = opts?.w ?? src.w;\n const height = opts?.h ?? src.h;\n const globalAlpha = opts?.alpha ?? 255;\n const blendFn = opts?.blendFn ?? sourceOverPerfect;\n if (globalAlpha === 0) return false;\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 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.w - sx);\n h = Math.min(h, src.h - sy);\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 const actualW = Math.min(w, target.w - x);\n const actualH = Math.min(h, target.h - y);\n if (actualW <= 0 || actualH <= 0) return false;\n const dst32 = target.data;\n const src32 = src.data;\n const dw = target.w;\n const sw = src.w;\n let dIdx = y * dw + x | 0;\n let sIdx = sy * sw + sx | 0;\n const dStride = dw - actualW | 0;\n const sStride = sw - actualW | 0;\n const isOpaque = globalAlpha === 255;\n const isOverwrite = blendFn.isOverwrite;\n let didChange = false;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const srcCol = src32[sIdx] as Color32;\n const srcAlpha = srcCol >>> 24;\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n let finalCol = srcCol;\n if (!isOpaque) {\n const a = srcAlpha * globalAlpha + 128 >> 8;\n if (a === 0 && !isOverwrite) {\n dIdx++;\n sIdx++;\n continue;\n }\n finalCol = (srcCol & 0x00ffffff | a << 24) >>> 0 as Color32;\n }\n const current = dst32[dIdx] as Color32;\n const next = blendFn(finalCol, dst32[dIdx] as Color32);\n if (current !== next) {\n dst32[dIdx] = next;\n didChange = true;\n }\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n return didChange;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuLyoqXG4gKiBCbGl0cyBzb3VyY2UgUGl4ZWxEYXRhIGludG8gYSBkZXN0aW5hdGlvbiBQaXhlbERhdGEgdXNpbmcgMzItYml0IGludGVnZXIgYml0d2lzZSBibGVuZGluZy5cbiAqIFRoaXMgZnVuY3Rpb24gYnlwYXNzZXMgc3RhbmRhcmQgSW1hZ2VEYXRhIGxpbWl0YXRpb25zIGJ5IG9wZXJhdGluZyBkaXJlY3RseSBvblxuICogVWludDMyQXJyYXkgdmlld3MuIEl0IHN1cHBvcnRzIHZhcmlvdXMgYmxlbmQgbW9kZXMsIGJpbmFyeS9hbHBoYSBtYXNraW5nLCBhbmRcbiAqIGF1dG9tYXRpYyBjbGlwcGluZyBvZiBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYm91bmRzLlxuICogQGV4YW1wbGVcbiAqXG4gKiBjb25zdCBkc3QgPSBuZXcgUGl4ZWxEYXRhKGN0eC5nZXRJbWFnZURhdGEoMCwwLDEwMCwxMDApKVxuICogYmxlbmRJbWFnZURhdGEzMihkc3QsIHNwcml0ZSwge1xuICogICBibGVuZEZuOiBDT0xPUl8zMl9CTEVORF9NT0RFUy5tdWx0aXBseSxcbiAqICAgbWFzazogYnJ1c2hNYXNrLFxuICogICBtYXNrVHlwZTogTWFza1R5cGUuQUxQSEFcbiAqIH0pO1xuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRQaXhlbERhdGEodGFyZ2V0OiBQaXhlbERhdGEzMiwgc3JjOiBQaXhlbERhdGEzMiwgb3B0cz86IFBpeGVsQmxlbmRPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGNvbnN0IHNvdXJjZVggPSBvcHRzPy5zeCA/PyAwO1xuICBjb25zdCBzb3VyY2VZID0gb3B0cz8uc3kgPz8gMDtcbiAgY29uc3Qgd2lkdGggPSBvcHRzPy53ID8/IHNyYy53O1xuICBjb25zdCBoZWlnaHQgPSBvcHRzPy5oID8/IHNyYy5oO1xuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHM/LmFscGhhID8/IDI1NTtcbiAgY29uc3QgYmxlbmRGbiA9IG9wdHM/LmJsZW5kRm4gPz8gc291cmNlT3ZlclBlcmZlY3Q7XG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBsZXQgeCA9IHRhcmdldFg7XG4gIGxldCB5ID0gdGFyZ2V0WTtcbiAgbGV0IHN4ID0gc291cmNlWDtcbiAgbGV0IHN5ID0gc291cmNlWTtcbiAgbGV0IHcgPSB3aWR0aDtcbiAgbGV0IGggPSBoZWlnaHQ7XG4gIGlmIChzeCA8IDApIHtcbiAgICB4IC09IHN4O1xuICAgIHcgKz0gc3g7XG4gICAgc3ggPSAwO1xuICB9XG4gIGlmIChzeSA8IDApIHtcbiAgICB5IC09IHN5O1xuICAgIGggKz0gc3k7XG4gICAgc3kgPSAwO1xuICB9XG4gIHcgPSBNYXRoLm1pbih3LCBzcmMudyAtIHN4KTtcbiAgaCA9IE1hdGgubWluKGgsIHNyYy5oIC0gc3kpO1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4O1xuICAgIHcgKz0geDtcbiAgICB4ID0gMDtcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5O1xuICAgIGggKz0geTtcbiAgICB5ID0gMDtcbiAgfVxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgdGFyZ2V0LncgLSB4KTtcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIHRhcmdldC5oIC0geSk7XG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IHNyYzMyID0gc3JjLmRhdGE7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0Lnc7XG4gIGNvbnN0IHN3ID0gc3JjLnc7XG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeCB8IDA7XG4gIGxldCBzSWR4ID0gc3kgKiBzdyArIHN4IHwgMDtcbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IHNTdHJpZGUgPSBzdyAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBpc09wYXF1ZSA9IGdsb2JhbEFscGhhID09PSAyNTU7XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZTtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyO1xuICAgICAgY29uc3Qgc3JjQWxwaGEgPSBzcmNDb2wgPj4+IDI0O1xuICAgICAgaWYgKHNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICBkSWR4Kys7XG4gICAgICAgIHNJZHgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgZmluYWxDb2wgPSBzcmNDb2w7XG4gICAgICBpZiAoIWlzT3BhcXVlKSB7XG4gICAgICAgIGNvbnN0IGEgPSBzcmNBbHBoYSAqIGdsb2JhbEFscGhhICsgMTI4ID4+IDg7XG4gICAgICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICAgIGRJZHgrKztcbiAgICAgICAgICBzSWR4Kys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxDb2wgPSAoc3JjQ29sICYgMHgwMGZmZmZmZiB8IGEgPDwgMjQpID4+PiAwIGFzIENvbG9yMzI7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGZpbmFsQ29sLCBkc3QzMltkSWR4XSBhcyBDb2xvcjMyKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dDtcbiAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGRJZHgrKztcbiAgICAgIHNJZHgrKztcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlO1xuICAgIHNJZHggKz0gc1N0cmlkZTtcbiAgfVxuICByZXR1cm4gZGlkQ2hhbmdlO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { blendPixelData } from '../../PixelData/blendPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n blendPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixelData = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelData = defaults.blendPixelData\n } = deps;\n return {\n blendPixelData(src: PixelData32, opts?: PixelBlendOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.w;\n const h = opts?.h ?? src.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(blendPixelData(writer.config.target, src, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSc7XG5pbXBvcnQgeyB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGJsZW5kUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kUGl4ZWxEYXRhID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGEgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZFBpeGVsRGF0YShzcmM6IFBpeGVsRGF0YTMyLCBvcHRzPzogUGl4ZWxCbGVuZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzPy54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3B0cz8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IG9wdHM/LncgPz8gc3JjLnc7XG4gICAgICBjb25zdCBoID0gb3B0cz8uaCA/PyBzcmMuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZFBpeGVsRGF0YSh3cml0ZXIuY29uZmlnLnRhcmdldCwgc3JjLCBvcHRzKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Fills a region or the {@link PixelData32} buffer with a solid color.\n *\n * @param dst - The target to modify.\n * @param color - The color to apply.\n * @param rect - Defines the area to fill. If omitted, the entire\n * @returns true if any pixels were actually modified.\n */\nexport function fillPixelData(dst: PixelData32, color: Color32, rect?: Partial<Rect>): boolean;\n/**\n * @param dst - The target to modify.\n * @param color - The color 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(dst: PixelData32, color: Color32, x: number, y: number, w: number, h: number): boolean;\nexport function fillPixelData(dst: PixelData32, color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): boolean {\n const dstW = dst.w;\n const dstH = dst.h;\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n if (typeof _x === 'object') {\n x = _x.x ?? 0;\n y = _x.y ?? 0;\n w = _x.w ?? dstW;\n h = _x.h ?? dstH;\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 = dstW;\n h = dstH;\n }\n\n // Inline bounds clipping\n let dstX = x;\n let dstY = y;\n let fillW = w;\n let fillH = h;\n if (dstX < 0) {\n fillW += dstX;\n dstX = 0;\n }\n if (dstY < 0) {\n fillH += dstY;\n dstY = 0;\n }\n fillW = Math.min(fillW, dstW - dstX);\n fillH = Math.min(fillH, dstH - dstY);\n if (fillW <= 0 || fillH <= 0) return false;\n const dst32 = dst.data;\n let hasChanged = false;\n\n // Fast-path: If the area spans the full width, we can treat it as a contiguous 1D array\n if (dstX === 0 && fillW === dstW) {\n const start = dstY * dstW;\n const end = start + fillW * fillH;\n for (let i = start; i < end; i++) {\n if (dst32[i] !== color) {\n dst32[i] = color;\n hasChanged = true;\n }\n }\n return hasChanged;\n }\n\n // Standard path: row-by-row\n for (let iy = 0; iy < fillH; iy++) {\n const rowOffset = (dstY + iy) * dstW;\n const start = rowOffset + dstX;\n const end = start + fillW;\n for (let i = start; i < end; i++) {\n if (dst32[i] !== color) {\n dst32[i] = color;\n hasChanged = true;\n }\n }\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGxzIGEgcmVnaW9uIG9yIHRoZSB7QGxpbmsgUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHJlY3QgLSBEZWZpbmVzIHRoZSBhcmVhIHRvIGZpbGwuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmVcbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShkc3Q6IFBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgcmVjdD86IFBhcnRpYWw8UmVjdD4pOiBib29sZWFuO1xuLyoqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhKGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiBib29sZWFuO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGEoZHN0OiBQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIF94PzogUGFydGlhbDxSZWN0PiB8IG51bWJlciwgX3k/OiBudW1iZXIsIF93PzogbnVtYmVyLCBfaD86IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBkc3RXID0gZHN0Lnc7XG4gIGNvbnN0IGRzdEggPSBkc3QuaDtcbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcbiAgbGV0IHc6IG51bWJlcjtcbiAgbGV0IGg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBfeCA9PT0gJ29iamVjdCcpIHtcbiAgICB4ID0gX3gueCA/PyAwO1xuICAgIHkgPSBfeC55ID8/IDA7XG4gICAgdyA9IF94LncgPz8gZHN0VztcbiAgICBoID0gX3guaCA/PyBkc3RIO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3g7XG4gICAgeSA9IF95ITtcbiAgICB3ID0gX3chO1xuICAgIGggPSBfaCE7XG4gIH0gZWxzZSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gICAgdyA9IGRzdFc7XG4gICAgaCA9IGRzdEg7XG4gIH1cblxuICAvLyBJbmxpbmUgYm91bmRzIGNsaXBwaW5nXG4gIGxldCBkc3RYID0geDtcbiAgbGV0IGRzdFkgPSB5O1xuICBsZXQgZmlsbFcgPSB3O1xuICBsZXQgZmlsbEggPSBoO1xuICBpZiAoZHN0WCA8IDApIHtcbiAgICBmaWxsVyArPSBkc3RYO1xuICAgIGRzdFggPSAwO1xuICB9XG4gIGlmIChkc3RZIDwgMCkge1xuICAgIGZpbGxIICs9IGRzdFk7XG4gICAgZHN0WSA9IDA7XG4gIH1cbiAgZmlsbFcgPSBNYXRoLm1pbihmaWxsVywgZHN0VyAtIGRzdFgpO1xuICBmaWxsSCA9IE1hdGgubWluKGZpbGxILCBkc3RIIC0gZHN0WSk7XG4gIGlmIChmaWxsVyA8PSAwIHx8IGZpbGxIIDw9IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTtcbiAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcblxuICAvLyBGYXN0LXBhdGg6IElmIHRoZSBhcmVhIHNwYW5zIHRoZSBmdWxsIHdpZHRoLCB3ZSBjYW4gdHJlYXQgaXQgYXMgYSBjb250aWd1b3VzIDFEIGFycmF5XG4gIGlmIChkc3RYID09PSAwICYmIGZpbGxXID09PSBkc3RXKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBkc3RZICogZHN0VztcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGZpbGxXICogZmlsbEg7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIGlmIChkc3QzMltpXSAhPT0gY29sb3IpIHtcbiAgICAgICAgZHN0MzJbaV0gPSBjb2xvcjtcbiAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VkO1xuICB9XG5cbiAgLy8gU3RhbmRhcmQgcGF0aDogcm93LWJ5LXJvd1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgZmlsbEg7IGl5KyspIHtcbiAgICBjb25zdCByb3dPZmZzZXQgPSAoZHN0WSArIGl5KSAqIGRzdFc7XG4gICAgY29uc3Qgc3RhcnQgPSByb3dPZmZzZXQgKyBkc3RYO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgZmlsbFc7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIGlmIChkc3QzMltpXSAhPT0gY29sb3IpIHtcbiAgICAgICAgZHN0MzJbaV0gPSBjb2xvcjtcbiAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNDaGFuZ2VkO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../../_types';\nimport { fillPixelData } from '../../PixelData/fillPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorClear = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n clear(rect?: Partial<Rect>) {\n const target = writer.config.target;\n const x = rect?.x ?? 0;\n const y = rect?.y ?? 0;\n const w = rect?.w ?? target.w;\n const h = rect?.h ?? target.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(fillPixelData(target, 0 as Color32, x, y, w, h));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi8uLi9fdHlwZXMnO1xuaW1wb3J0IHsgZmlsbFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhJztcbmltcG9ydCB7IHR5cGUgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi9QaXhlbFdyaXRlcic7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgZmlsbFBpeGVsRGF0YVxufTtcbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPjtcblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JDbGVhciA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGZpbGxQaXhlbERhdGEgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhXG4gIH0gPSBkZXBzO1xuICByZXR1cm4ge1xuICAgIGNsZWFyKHJlY3Q/OiBQYXJ0aWFsPFJlY3Q+KSB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldDtcbiAgICAgIGNvbnN0IHggPSByZWN0Py54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gcmVjdD8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IHJlY3Q/LncgPz8gdGFyZ2V0Lnc7XG4gICAgICBjb25zdCBoID0gcmVjdD8uaCA/PyB0YXJnZXQuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShmaWxsUGl4ZWxEYXRhKHRhcmdldCwgMCBhcyBDb2xvcjMyLCB4LCB5LCB3LCBoKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { fillPixelData } from '../../PixelData/fillPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n fillPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFill = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n fill(color: Color32, x = 0, y = 0, w = writer.config.target.w, h = writer.config.target.h) {\n const target = writer.config.target;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(fillPixelData(target, color, x, y, w, h));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFillRect = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData\n } = deps;\n return {\n fillRect(color: Color32, rect: Rect) {\n const target = writer.config.target;\n const didChange = writer.accumulator.storeRegionBeforeState(rect.x, rect.y, rect.w, rect.h);\n return didChange(fillPixelData(target, color, rect.x, rect.y, rect.w, rect.h));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaWxsUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBmaWxsUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBmaWxsKGNvbG9yOiBDb2xvcjMyLCB4ID0gMCwgeSA9IDAsIHcgPSB3cml0ZXIuY29uZmlnLnRhcmdldC53LCBoID0gd3JpdGVyLmNvbmZpZy50YXJnZXQuaCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQ7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoZmlsbFBpeGVsRGF0YSh0YXJnZXQsIGNvbG9yLCB4LCB5LCB3LCBoKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yRmlsbFJlY3QgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBmaWxsUmVjdChjb2xvcjogQ29sb3IzMiwgcmVjdDogUmVjdCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQ7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZShyZWN0LngsIHJlY3QueSwgcmVjdC53LCByZWN0LmgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShmaWxsUGl4ZWxEYXRhKHRhcmdldCwgY29sb3IsIHJlY3QueCwgcmVjdC55LCByZWN0LncsIHJlY3QuaCkpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Fills the target PixelData with a color based on a binary mask.\n *\n * @param target - The target to modify.\n * @param color - The color to apply.\n * @param mask - The binary mask determining where to fill.\n * @param x - Horizontal offset to place the mask.\n * @param y - Vertical offset to place the mask.\n * @returns true if any pixels were actually modified.\n */\nexport function fillPixelDataBinaryMask(target: PixelData32, color: Color32, mask: BinaryMask, x = 0, y = 0): boolean {\n const targetW = target.w;\n const targetH = target.h;\n const maskW = mask.w;\n const maskH = mask.h;\n\n // Inline clipping logic\n let dstX = x;\n let dstY = y;\n let actualW = maskW;\n let actualH = maskH;\n if (dstX < 0) {\n actualW += dstX;\n dstX = 0;\n }\n if (dstY < 0) {\n actualH += dstY;\n dstY = 0;\n }\n actualW = Math.min(actualW, targetW - dstX);\n actualH = Math.min(actualH, targetH - dstY);\n if (actualW <= 0 || actualH <= 0) return false;\n const maskData = mask.data;\n const dst32 = target.data;\n\n // Calculate offsets for the mask based on clipping\n const mx = dstX - x;\n const my = dstY - y;\n let hasChanged = false;\n\n // Stride-based loop for performance\n let dIdx = dstY * targetW + dstX;\n let mIdx = my * maskW + mx;\n const dStride = targetW - actualW;\n const mStride = maskW - actualW;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n if (maskData[mIdx]) {\n if (dst32[dIdx] !== color) {\n dst32[dIdx] = color;\n hasChanged = true;\n }\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGxzIHRoZSB0YXJnZXQgUGl4ZWxEYXRhIHdpdGggYSBjb2xvciBiYXNlZCBvbiBhIGJpbmFyeSBtYXNrLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBjb2xvciB0byBhcHBseS5cbiAqIEBwYXJhbSBtYXNrIC0gVGhlIGJpbmFyeSBtYXNrIGRldGVybWluaW5nIHdoZXJlIHRvIGZpbGwuXG4gKiBAcGFyYW0geCAtIEhvcml6b250YWwgb2Zmc2V0IHRvIHBsYWNlIHRoZSBtYXNrLlxuICogQHBhcmFtIHkgLSBWZXJ0aWNhbCBvZmZzZXQgdG8gcGxhY2UgdGhlIG1hc2suXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFueSBwaXhlbHMgd2VyZSBhY3R1YWxseSBtb2RpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrKHRhcmdldDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBCaW5hcnlNYXNrLCB4ID0gMCwgeSA9IDApOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0VyA9IHRhcmdldC53O1xuICBjb25zdCB0YXJnZXRIID0gdGFyZ2V0Lmg7XG4gIGNvbnN0IG1hc2tXID0gbWFzay53O1xuICBjb25zdCBtYXNrSCA9IG1hc2suaDtcblxuICAvLyBJbmxpbmUgY2xpcHBpbmcgbG9naWNcbiAgbGV0IGRzdFggPSB4O1xuICBsZXQgZHN0WSA9IHk7XG4gIGxldCBhY3R1YWxXID0gbWFza1c7XG4gIGxldCBhY3R1YWxIID0gbWFza0g7XG4gIGlmIChkc3RYIDwgMCkge1xuICAgIGFjdHVhbFcgKz0gZHN0WDtcbiAgICBkc3RYID0gMDtcbiAgfVxuICBpZiAoZHN0WSA8IDApIHtcbiAgICBhY3R1YWxIICs9IGRzdFk7XG4gICAgZHN0WSA9IDA7XG4gIH1cbiAgYWN0dWFsVyA9IE1hdGgubWluKGFjdHVhbFcsIHRhcmdldFcgLSBkc3RYKTtcbiAgYWN0dWFsSCA9IE1hdGgubWluKGFjdHVhbEgsIHRhcmdldEggLSBkc3RZKTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGE7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG5cbiAgLy8gQ2FsY3VsYXRlIG9mZnNldHMgZm9yIHRoZSBtYXNrIGJhc2VkIG9uIGNsaXBwaW5nXG4gIGNvbnN0IG14ID0gZHN0WCAtIHg7XG4gIGNvbnN0IG15ID0gZHN0WSAtIHk7XG4gIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG5cbiAgLy8gU3RyaWRlLWJhc2VkIGxvb3AgZm9yIHBlcmZvcm1hbmNlXG4gIGxldCBkSWR4ID0gZHN0WSAqIHRhcmdldFcgKyBkc3RYO1xuICBsZXQgbUlkeCA9IG15ICogbWFza1cgKyBteDtcbiAgY29uc3QgZFN0cmlkZSA9IHRhcmdldFcgLSBhY3R1YWxXO1xuICBjb25zdCBtU3RyaWRlID0gbWFza1cgLSBhY3R1YWxXO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBpZiAobWFza0RhdGFbbUlkeF0pIHtcbiAgICAgICAgaWYgKGRzdDMyW2RJZHhdICE9PSBjb2xvcikge1xuICAgICAgICAgIGRzdDMyW2RJZHhdID0gY29sb3I7XG4gICAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRJZHgrKztcbiAgICAgIG1JZHgrKztcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlO1xuICAgIG1JZHggKz0gbVN0cmlkZTtcbiAgfVxuICByZXR1cm4gaGFzQ2hhbmdlZDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { fillPixelDataBinaryMask } from '../../PixelData/fillPixelDataBinaryMask';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n fillPixelDataBinaryMask\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFillBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelDataBinaryMask = defaults.fillPixelDataBinaryMask\n } = deps;\n return {\n fillBinaryMask(color: Color32, mask: BinaryMask, x = 0, y = 0) {\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, mask.w, mask.h);\n return didChange(fillPixelDataBinaryMask(writer.config.target, color, mask, x, y));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGxCaW5hcnlNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhQmluYXJ5TWFza1xuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBmaWxsQmluYXJ5TWFzayhjb2xvcjogQ29sb3IzMiwgbWFzazogQmluYXJ5TWFzaywgeCA9IDAsIHkgPSAwKSB7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCBtYXNrLncsIG1hc2suaCk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBjb2xvciwgbWFzaywgeCwgeSkpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Inverts the RGB color data of the target PixelData, optionally controlled by a mask.\n * @param target - The target to modify.\n * @param opts - Options defining the area, mask, and offsets.\n * @returns true if the operation was performed within bounds.\n */\nexport function invertPixelData(target: PixelData32, opts?: PixelMutateOptions): boolean {\n const targetW = target.w;\n const targetH = target.h;\n const mask = opts?.mask;\n const invertMask = opts?.invertMask ?? false;\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const w = opts?.w ?? targetW;\n const h = opts?.h ?? targetH;\n\n // Inline clipping logic\n let x = targetX;\n let y = targetY;\n let actualW = w;\n let actualH = h;\n if (x < 0) {\n actualW += x;\n x = 0;\n }\n if (y < 0) {\n actualH += y;\n y = 0;\n }\n actualW = Math.min(actualW, targetW - x);\n actualH = Math.min(actualH, targetH - y);\n if (actualW <= 0 || actualH <= 0) return false;\n const dst32 = target.data;\n const dw = targetW;\n\n // Calculate relative movement for the mask coordinate\n const dx = x - targetX;\n const dy = y - targetY;\n let dIdx = y * dw + x;\n const dStride = dw - actualW;\n if (mask) {\n const maskData = mask.data;\n const mPitch = mask.w;\n let mIdx = (my + dy) * mPitch + (mx + dx);\n const mStride = mPitch - actualW;\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx];\n const isHit = invertMask ? mVal === 0 : mVal === 1;\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n dIdx++;\n }\n dIdx += dStride;\n }\n }\n return true;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludmVydHMgdGhlIFJHQiBjb2xvciBkYXRhIG9mIHRoZSB0YXJnZXQgUGl4ZWxEYXRhLCBvcHRpb25hbGx5IGNvbnRyb2xsZWQgYnkgYSBtYXNrLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIG9wdHMgLSBPcHRpb25zIGRlZmluaW5nIHRoZSBhcmVhLCBtYXNrLCBhbmQgb2Zmc2V0cy5cbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG9wZXJhdGlvbiB3YXMgcGVyZm9ybWVkIHdpdGhpbiBib3VuZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnRQaXhlbERhdGEodGFyZ2V0OiBQaXhlbERhdGEzMiwgb3B0cz86IFBpeGVsTXV0YXRlT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXJnZXRXID0gdGFyZ2V0Lnc7XG4gIGNvbnN0IHRhcmdldEggPSB0YXJnZXQuaDtcbiAgY29uc3QgbWFzayA9IG9wdHM/Lm1hc2s7XG4gIGNvbnN0IGludmVydE1hc2sgPSBvcHRzPy5pbnZlcnRNYXNrID8/IGZhbHNlO1xuICBjb25zdCB0YXJnZXRYID0gb3B0cz8ueCA/PyAwO1xuICBjb25zdCB0YXJnZXRZID0gb3B0cz8ueSA/PyAwO1xuICBjb25zdCBteCA9IG9wdHM/Lm14ID8/IDA7XG4gIGNvbnN0IG15ID0gb3B0cz8ubXkgPz8gMDtcbiAgY29uc3QgdyA9IG9wdHM/LncgPz8gdGFyZ2V0VztcbiAgY29uc3QgaCA9IG9wdHM/LmggPz8gdGFyZ2V0SDtcblxuICAvLyBJbmxpbmUgY2xpcHBpbmcgbG9naWNcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCBhY3R1YWxXID0gdztcbiAgbGV0IGFjdHVhbEggPSBoO1xuICBpZiAoeCA8IDApIHtcbiAgICBhY3R1YWxXICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgYWN0dWFsSCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGFjdHVhbFcgPSBNYXRoLm1pbihhY3R1YWxXLCB0YXJnZXRXIC0geCk7XG4gIGFjdHVhbEggPSBNYXRoLm1pbihhY3R1YWxILCB0YXJnZXRIIC0geSk7XG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0VztcblxuICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgbW92ZW1lbnQgZm9yIHRoZSBtYXNrIGNvb3JkaW5hdGVcbiAgY29uc3QgZHggPSB4IC0gdGFyZ2V0WDtcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WTtcbiAgbGV0IGRJZHggPSB5ICogZHcgKyB4O1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBhY3R1YWxXO1xuICBpZiAobWFzaykge1xuICAgIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhO1xuICAgIGNvbnN0IG1QaXRjaCA9IG1hc2sudztcbiAgICBsZXQgbUlkeCA9IChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KTtcbiAgICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gYWN0dWFsVztcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgY29uc3QgbVZhbCA9IG1hc2tEYXRhW21JZHhdO1xuICAgICAgICBjb25zdCBpc0hpdCA9IGludmVydE1hc2sgPyBtVmFsID09PSAwIDogbVZhbCA9PT0gMTtcbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgLy8gWE9SIHdpdGggMHgwMEZGRkZGRiBmbGlwcyBSR0IgYml0cyBhbmQgaWdub3JlcyBBbHBoYVxuICAgICAgICAgIGRzdDMyW2RJZHhdID0gZHN0MzJbZElkeF0gXiAweDAwRkZGRkZGO1xuICAgICAgICB9XG4gICAgICAgIGRJZHgrKztcbiAgICAgICAgbUlkeCsrO1xuICAgICAgfVxuICAgICAgZElkeCArPSBkU3RyaWRlO1xuICAgICAgbUlkeCArPSBtU3RyaWRlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkY7XG4gICAgICAgIGRJZHgrKztcbiAgICAgIH1cbiAgICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { invertPixelData } from '../../PixelData/invertPixelData';\nimport { type HistoryMutator } from '../PixelWriter';\nconst defaults = {\n invertPixelData\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorInvert = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n invertPixelData = defaults.invertPixelData\n } = deps;\n return {\n invert(opts?: PixelMutateOptions) {\n const target = writer.config.target;\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? target.w;\n const h = opts?.h ?? target.h;\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n return didChange(invertPixelData(target, opts));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbnZlcnRQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvaW52ZXJ0UGl4ZWxEYXRhJztcbmltcG9ydCB7IHR5cGUgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi9QaXhlbFdyaXRlcic7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgaW52ZXJ0UGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckludmVydCA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGludmVydFBpeGVsRGF0YSA9IGRlZmF1bHRzLmludmVydFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBpbnZlcnQob3B0cz86IFBpeGVsTXV0YXRlT3B0aW9ucykge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQ7XG4gICAgICBjb25zdCB4ID0gb3B0cz8ueCA/PyAwO1xuICAgICAgY29uc3QgeSA9IG9wdHM/LnkgPz8gMDtcbiAgICAgIGNvbnN0IHcgPSBvcHRzPy53ID8/IHRhcmdldC53O1xuICAgICAgY29uc3QgaCA9IG9wdHM/LmggPz8gdGFyZ2V0Lmg7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoaW52ZXJ0UGl4ZWxEYXRhKHRhcmdldCwgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { mutatorApplyAlphaMask } from './PixelMutator/mutatorApplyAlphaMask';\nimport { mutatorApplyBinaryMask } from './PixelMutator/mutatorApplyBinaryMask';\nimport { mutatorApplyMask } from './PixelMutator/mutatorApplyMask';\nimport { mutatorBlendAlphaMask } from './PixelMutator/mutatorBlendAlphaMask';\nimport { mutatorBlendBinaryMask } from './PixelMutator/mutatorBlendBinaryMask';\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor';\nimport { mutatorBlendColorPaintAlphaMask } from './PixelMutator/mutatorBlendColorPaintAlphaMask';\nimport { mutatorBlendColorPaintBinaryMask } from './PixelMutator/mutatorBlendColorPaintBinaryMask';\nimport { mutatorBlendColorPaintMask } from './PixelMutator/mutatorBlendColorPaintMask';\nimport { mutatorBlendColorPaintRect } from './PixelMutator/mutatorBlendColorPaintRect';\nimport { mutatorBlendMask } from './PixelMutator/mutatorBlendMask';\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel';\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData';\nimport { mutatorClear } from './PixelMutator/mutatorClear';\nimport { mutatorFill, mutatorFillRect } from './PixelMutator/mutatorFill';\nimport { mutatorFillBinaryMask } from './PixelMutator/mutatorFillBinaryMask';\nimport { mutatorInvert } from './PixelMutator/mutatorInvert';\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n // @sort\n ...mutatorApplyAlphaMask(writer),\n ...mutatorApplyBinaryMask(writer),\n ...mutatorApplyMask(writer),\n ...mutatorBlendAlphaMask(writer),\n ...mutatorBlendBinaryMask(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendColorPaintAlphaMask(writer),\n ...mutatorBlendColorPaintBinaryMask(writer),\n ...mutatorBlendColorPaintMask(writer),\n ...mutatorBlendColorPaintRect(writer),\n ...mutatorBlendMask(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorClear(writer),\n ...mutatorFill(writer),\n ...mutatorFillBinaryMask(writer),\n ...mutatorFillRect(writer),\n ...mutatorInvert(writer)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtdXRhdG9yQXBwbHlBbHBoYU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlBbHBoYU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5QmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUJpbmFyeU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQWxwaGFNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQWxwaGFNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRCaW5hcnlNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZENvbG9yIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3InO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3JQYWludEFscGhhTWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRBbHBoYU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3JQYWludEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvclBhaW50QmluYXJ5TWFzayc7XG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRDb2xvclBhaW50TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZENvbG9yUGFpbnRSZWN0IH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3JQYWludFJlY3QnO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kTWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZE1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kUGl4ZWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCc7XG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGEnO1xuaW1wb3J0IHsgbXV0YXRvckNsZWFyIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckNsZWFyJztcbmltcG9ydCB7IG11dGF0b3JGaWxsLCBtdXRhdG9yRmlsbFJlY3QgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbCc7XG5pbXBvcnQgeyBtdXRhdG9yRmlsbEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbEJpbmFyeU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckludmVydCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JJbnZlcnQnO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VGdWxsUGl4ZWxNdXRhdG9yKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55Pikge1xuICByZXR1cm4ge1xuICAgIC8vIEBzb3J0XG4gICAgLi4ubXV0YXRvckFwcGx5QWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckFwcGx5QmluYXJ5TWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JBcHBseU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRBbHBoYU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRCaW5hcnlNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3Iod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRDb2xvclBhaW50QWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3JQYWludEJpbmFyeU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRDb2xvclBhaW50TWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZENvbG9yUGFpbnRSZWN0KHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kTWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kUGl4ZWxEYXRhKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckNsZWFyKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckZpbGwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbEJpbmFyeU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbFJlY3Qod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9ySW52ZXJ0KHdyaXRlcilcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function copyImageData(source: ImageDataLike): ImageData {\n const dataCopy = new Uint8ClampedArray(source.data);\n return new ImageData(dataCopy, source.width, source.height);\n}\nexport function copyImageDataLike({\n data,\n width,\n height\n}: ImageDataLike): ImageDataLike {\n return {\n data: data.slice(),\n width,\n height\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY29weUltYWdlRGF0YShzb3VyY2U6IEltYWdlRGF0YUxpa2UpOiBJbWFnZURhdGEge1xuICBjb25zdCBkYXRhQ29weSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzb3VyY2UuZGF0YSk7XG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGRhdGFDb3B5LCBzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJbWFnZURhdGFMaWtlKHtcbiAgZGF0YSxcbiAgd2lkdGgsXG4gIGhlaWdodFxufTogSW1hZ2VEYXRhTGlrZSk6IEltYWdlRGF0YUxpa2Uge1xuICByZXR1cm4ge1xuICAgIGRhdGE6IGRhdGEuc2xpY2UoKSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { extractImageDataBuffer } from './extractImageDataBuffer';\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 rect defining the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageData(imageData: ImageDataLike, rect: Rect): ImageData | null;\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 buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageData(imageData: ImageDataLike, x: number, y: number, w: number, h: number): ImageData | null;\nexport function extractImageData(imageData: ImageDataLike, _x: Rect | number, _y?: number, _w?: number, _h?: number): ImageData | null {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n if (w <= 0 || h <= 0) return null;\n const result = new ImageData(w, h);\n const buffer = extractImageDataBuffer(imageData, x, y, w, h);\n result.data.set(buffer);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyIH0gZnJvbSAnLi9leHRyYWN0SW1hZ2VEYXRhQnVmZmVyJztcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHNwZWNpZmljIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiBwaXhlbHMgZnJvbSBhIGxhcmdlciB7QGxpbmsgSW1hZ2VEYXRhTGlrZX1cbiAqIHNvdXJjZSBpbnRvIGEgbmV3IHtAbGluayBVaW50OENsYW1wZWRBcnJheX0uXG4gKlxuICogVGhpcyBpcyBhIFwicmVhZC1vbmx5XCIgb3BlcmF0aW9uIHRoYXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHBpeGVsIGRhdGEuXG4gKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byByZWFkIGZyb20uXG4gKiBAcGFyYW0gcmVjdCAtIEEgcmVjdCBkZWZpbmluZyB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIGJ1ZmZlciBjb250YWluaW5nIHRoZSBSR0JBIHBpeGVsIGRhdGEgb2YgdGhlIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbWFnZURhdGEoaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLCByZWN0OiBSZWN0KTogSW1hZ2VEYXRhIHwgbnVsbDtcbi8qKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byByZWFkIGZyb20uXG4gKiBAcGFyYW0geCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHcgLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIFJHQkEgcGl4ZWwgZGF0YSBvZiB0aGUgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YShpbWFnZURhdGE6IEltYWdlRGF0YUxpa2UsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IEltYWdlRGF0YSB8IG51bGw7XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YShpbWFnZURhdGE6IEltYWdlRGF0YUxpa2UsIF94OiBSZWN0IHwgbnVtYmVyLCBfeT86IG51bWJlciwgX3c/OiBudW1iZXIsIF9oPzogbnVtYmVyKTogSW1hZ2VEYXRhIHwgbnVsbCB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoXG4gIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnID8gX3ggOiB7XG4gICAgeDogX3gsXG4gICAgeTogX3khLFxuICAgIHc6IF93ISxcbiAgICBoOiBfaCFcbiAgfTtcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybiBudWxsO1xuICBjb25zdCByZXN1bHQgPSBuZXcgSW1hZ2VEYXRhKHcsIGgpO1xuICBjb25zdCBidWZmZXIgPSBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKGltYWdlRGF0YSwgeCwgeSwgdywgaCk7XG4gIHJlc3VsdC5kYXRhLnNldChidWZmZXIpO1xuICByZXR1cm4gcmVzdWx0O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function makeImageDataLike(width: number, height: number, data?: Buffer): ImageDataLike {\n const size = width * height * 4;\n const buffer = data ? new Uint8ClampedArray(data.buffer, data.byteOffset, size) : new Uint8ClampedArray(size);\n return {\n width,\n height,\n data: buffer\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gbWFrZUltYWdlRGF0YUxpa2Uod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE/OiBCdWZmZXIpOiBJbWFnZURhdGFMaWtlIHtcbiAgY29uc3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogNDtcbiAgY29uc3QgYnVmZmVyID0gZGF0YSA/IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBzaXplKSA6IG5ldyBVaW50OENsYW1wZWRBcnJheShzaXplKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZGF0YTogYnVmZmVyXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 imageDataToAlphaMaskBuffer(imageData: ImageData): Uint8Array {\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(data.buffer, data.byteOffset, data.byteLength >> 2);\n const len = data32.length;\n const mask = new Uint8Array(width * height);\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 return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dHJhY3RzIHRoZSBhbHBoYSBjaGFubmVsIGZyb20gcmF3IEltYWdlRGF0YSBpbnRvIGFuIEFscGhhTWFzay5cbiAqIFdoZW4gcG9zc2libGUgdXNlIHtAbGluayBwaXhlbERhdGFUb0FscGhhTWFza30gaW5zdGVhZC5cbiAqIFJlcGVhdCBjYWxscyB0byB0aGUgc2FtZSBkYXRhIHdpbGwgdXNlIGxlc3MgbWVtb3J5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VEYXRhVG9BbHBoYU1hc2tCdWZmZXIoaW1hZ2VEYXRhOiBJbWFnZURhdGEpOiBVaW50OEFycmF5IHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBkYXRhXG4gIH0gPSBpbWFnZURhdGE7XG5cbiAgLy8gQ3JlYXRlIGEgMzItYml0IHZpZXcgb2YgdGhlIGV4aXN0aW5nIGJ1ZmZlclxuICBjb25zdCBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgZGF0YS5ieXRlTGVuZ3RoID4+IDIpO1xuICBjb25zdCBsZW4gPSBkYXRhMzIubGVuZ3RoO1xuICBjb25zdCBtYXNrID0gbmV3IFVpbnQ4QXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YTMyW2ldO1xuXG4gICAgLy8gRXh0cmFjdCBBbHBoYSAodG9wIDggYml0cyBpbiBMaXR0bGUtRW5kaWFuL0FCR1IpXG4gICAgbWFza1tpXSA9IHZhbCA+Pj4gMjQgJiAweGZmO1xuICB9XG4gIHJldHVybiBtYXNrO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeReusableCanvas } from '../Canvas/ReusableCanvas';\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 {\n canvas,\n ctx\n } = get(imageData.width, imageData.height);\n ctx.putImageData(imageData, 0, 0);\n return canvas.toDataURL();\n}\nimageDataToDataUrl.reset = get.reset;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUmV1c2FibGVDYW52YXMgfSBmcm9tICcuLi9DYW52YXMvUmV1c2FibGVDYW52YXMnO1xuY29uc3QgZ2V0ID0gbWFrZVJldXNhYmxlQ2FudmFzKCk7XG5cbi8qKlxuICogQ29udmVydHMgYW4ge0BsaW5rIEltYWdlRGF0YX0gb2JqZWN0IGludG8gYSBiYXNlNjQtZW5jb2RlZCBEYXRhIFVSTCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBwaXhlbCBkYXRhIHRvIGJlIGNvbnZlcnRlZC5cbiAqXG4gKiBAcmV0dXJucyBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGltYWdlIGluIGBpbWFnZS9wbmdgIGZvcm1hdCBhcyBhXG4gKiBbRGF0YSBVUkxdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL1VSSS9SZWZlcmVuY2UvU2NoZW1lcy9kYXRhKS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBkYXRhVXJsID0gaW1hZ2VEYXRhVG9EYXRhVXJsKGltYWdlRGF0YSk7XG4gKiBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcbiAqIGltZy5zcmMgPSBkYXRhVXJsO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZURhdGFUb0RhdGFVcmwoaW1hZ2VEYXRhOiBJbWFnZURhdGEpOiBzdHJpbmcge1xuICBjb25zdCB7XG4gICAgY2FudmFzLFxuICAgIGN0eFxuICB9ID0gZ2V0KGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7XG4gIGN0eC5wdXRJbWFnZURhdGEoaW1hZ2VEYXRhLCAwLCAwKTtcbiAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoKTtcbn1cbmltYWdlRGF0YVRvRGF0YVVybC5yZXNldCA9IGdldC5yZXNldDsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUint32Array(imageData: ImageDataLike): Uint32Array {\n return (new Uint32Array(imageData.data.buffer, imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2));\n}\n\n// @__INLINE_MACRO__\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGNvbnZlcnRzIHtAbGluayBJbWFnZURhdGF9IHRvIGEgZmFzdGVyIFVpbnQzMkFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZURhdGFUb1VpbnQzMkFycmF5KGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSk6IFVpbnQzMkFycmF5IHtcbiAgcmV0dXJuIChuZXcgVWludDMyQXJyYXkoaW1hZ2VEYXRhLmRhdGEuYnVmZmVyLCBpbWFnZURhdGEuZGF0YS5ieXRlT2Zmc2V0LFxuICAvLyBTaGlmdCByaWdodCBieSAyIGlzIGEgZmFzdCBiaXR3aXNlIGRpdmlzaW9uIGJ5IDQuXG4gIGltYWdlRGF0YS5kYXRhLmJ5dGVMZW5ndGggPj4gMikpO1xufVxuXG4vLyBAX19JTkxJTkVfTUFDUk9fXyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gaW52ZXJ0SW1hZ2VEYXRhKGltYWdlRGF0YTogSW1hZ2VEYXRhKSB7XG4gIGNvbnN0IGRhdGEgPSBpbWFnZURhdGEuZGF0YTtcbiAgbGV0IGxlbmd0aCA9IGRhdGEubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSA0KSB7XG4gICAgZGF0YVtpXSA9IDI1NSAtIGRhdGFbaV0hO1xuICAgIGRhdGFbaSArIDFdID0gMjU1IC0gZGF0YVtpICsgMV0hO1xuICAgIGRhdGFbaSArIDJdID0gMjU1IC0gZGF0YVtpICsgMl0hO1xuICB9XG4gIHJldHVybiBpbWFnZURhdGE7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resampleUint32Array } from '../Algorithm/resampleUint32Array';\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer);\n const {\n data,\n w,\n h\n } = resampleUint32Array(src32, source.width, source.height, factor);\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>;\n return new ImageData(uint8ClampedArray, w, h);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc2FtcGxlcyBJbWFnZURhdGEgYnkgYSBzcGVjaWZpYyBmYWN0b3IuXG4gKiBGYWN0b3IgPiAxIHVwc2NhbGVzLCBGYWN0b3IgPCAxIGRvd25zY2FsZXMuXG4gKi9cbmltcG9ydCB7IHJlc2FtcGxlVWludDMyQXJyYXkgfSBmcm9tICcuLi9BbGdvcml0aG0vcmVzYW1wbGVVaW50MzJBcnJheSc7XG5cbi8qKlxuICogUmVzYW1wbGVzIEltYWdlRGF0YSBieSBhIHNwZWNpZmljIGZhY3Rvci5cbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlSW1hZ2VEYXRhKHNvdXJjZTogSW1hZ2VEYXRhLCBmYWN0b3I6IG51bWJlcik6IEltYWdlRGF0YSB7XG4gIGNvbnN0IHNyYzMyID0gbmV3IFVpbnQzMkFycmF5KHNvdXJjZS5kYXRhLmJ1ZmZlcik7XG4gIGNvbnN0IHtcbiAgICBkYXRhLFxuICAgIHcsXG4gICAgaFxuICB9ID0gcmVzYW1wbGVVaW50MzJBcnJheShzcmMzMiwgc291cmNlLndpZHRoLCBzb3VyY2UuaGVpZ2h0LCBmYWN0b3IpO1xuICBjb25zdCB1aW50OENsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkYXRhLmJ1ZmZlcikgYXMgVWludDhDbGFtcGVkQXJyYXk8QXJyYXlCdWZmZXI+O1xuICByZXR1cm4gbmV3IEltYWdlRGF0YSh1aW50OENsYW1wZWRBcnJheSwgdywgaCk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export type ReusableImageData = ReturnType<typeof makeReusableImageData>;\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null;\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n if (imageData === null || imageData.width !== width || imageData.height !== height) {\n imageData = new ImageData(width, height);\n } else {\n imageData.data.fill(0);\n }\n return imageData!;\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBSZXVzYWJsZUltYWdlRGF0YSA9IFJldHVyblR5cGU8dHlwZW9mIG1ha2VSZXVzYWJsZUltYWdlRGF0YT47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIGEgc2luZ2xlLCByZXVzYWJsZSBJbWFnZURhdGEgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHVzZWQgdG8gbWluaW1pemUgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIGJ5IHJlY3ljbGluZyB0aGVcbiAqIHVuZGVybHlpbmcgcGl4ZWwgYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJldHVybnMgYSBwb29sZWQgSW1hZ2VEYXRhIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlSW1hZ2VEYXRhKCkge1xuICBsZXQgaW1hZ2VEYXRhOiBJbWFnZURhdGEgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogUmV0cmlldmVzIGFuIEltYWdlRGF0YSBpbnN0YW5jZSBvZiB0aGUgcmVxdWVzdGVkIGRpbWVuc2lvbnMuXG4gICAqIElmIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucyBkaWZmZXIgZnJvbSB0aGUgY2FjaGVkIGluc3RhbmNlLCBhIG5ldyBvbmUgaXMgYWxsb2NhdGVkLlxuICAgKiBAcGFyYW0gd2lkdGggLSBUaGUgZGVzaXJlZCB3aWR0aCBpbiBwaXhlbHMuXG4gICAqIEBwYXJhbSBoZWlnaHQgLSBUaGUgZGVzaXJlZCBoZWlnaHQgaW4gcGl4ZWxzLlxuICAgKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGFsbG9jYXRlZCBJbWFnZURhdGEgb2JqZWN0LlxuICAgKi9cbiAgcmV0dXJuIGZ1bmN0aW9uIGdldFJldXNhYmxlSW1hZ2VEYXRhKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gICAgaWYgKGltYWdlRGF0YSA9PT0gbnVsbCB8fCBpbWFnZURhdGEud2lkdGggIT09IHdpZHRoIHx8IGltYWdlRGF0YS5oZWlnaHQgIT09IGhlaWdodCkge1xuICAgICAgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YSh3aWR0aCwgaGVpZ2h0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW1hZ2VEYXRhLmRhdGEuZmlsbCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIGltYWdlRGF0YSE7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from './_ImageData-types';\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer);\n const decoder = new TextDecoder('latin1');\n const binary = decoder.decode(uint8);\n return btoa(binary) as Base64EncodedUInt8Array;\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}\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any;\n return serializeImageData(imageData) as any;\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}\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array);\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any;\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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJhc2U2NEVuY29kZWRVSW50OEFycmF5LCBJbWFnZURhdGFMaWtlLCBTZXJpYWxpemVkSW1hZ2VEYXRhIH0gZnJvbSAnLi9fSW1hZ2VEYXRhLXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRFbmNvZGVBcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyTGlrZSk6IEJhc2U2NEVuY29kZWRVSW50OEFycmF5IHtcbiAgY29uc3QgdWludDggPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCdsYXRpbjEnKTtcbiAgY29uc3QgYmluYXJ5ID0gZGVjb2Rlci5kZWNvZGUodWludDgpO1xuICByZXR1cm4gYnRvYShiaW5hcnkpIGFzIEJhc2U2NEVuY29kZWRVSW50OEFycmF5O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NERlY29kZUFycmF5QnVmZmVyKGVuY29kZWQ6IEJhc2U2NEVuY29kZWRVSW50OEFycmF5KTogVWludDhDbGFtcGVkQXJyYXk8QXJyYXlCdWZmZXI+IHtcbiAgY29uc3QgYmluYXJ5ID0gYXRvYihlbmNvZGVkKTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoYmluYXJ5Lmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmluYXJ5Lmxlbmd0aDsgaSsrKSB7XG4gICAgYnl0ZXNbaV0gPSBiaW5hcnkuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKlxuICogU2VyaWFsaXplIGZvciB1c2UgaW4gSlNPTi4gUGl4ZWwgZGF0YSBpcyBzdG9yZWQgYXMgYmFzZTY0IGVuY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplSW1hZ2VEYXRhPFQgZXh0ZW5kcyBJbWFnZURhdGFMaWtlPihpbWFnZURhdGE6IFQpOiBTZXJpYWxpemVkSW1hZ2VEYXRhIHtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogaW1hZ2VEYXRhLndpZHRoLFxuICAgIGhlaWdodDogaW1hZ2VEYXRhLmhlaWdodCxcbiAgICBkYXRhOiBiYXNlNjRFbmNvZGVBcnJheUJ1ZmZlcihpbWFnZURhdGEuZGF0YS5idWZmZXIpXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplTnVsbGFibGVJbWFnZURhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgfCBudWxsPihpbWFnZURhdGE6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBTZXJpYWxpemVkSW1hZ2VEYXRhIHtcbiAgaWYgKCFpbWFnZURhdGEpIHJldHVybiBudWxsIGFzIGFueTtcbiAgcmV0dXJuIHNlcmlhbGl6ZUltYWdlRGF0YShpbWFnZURhdGEpIGFzIGFueTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVJhd0ltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YT4oc2VyaWFsaXplZDogVCk6IEltYWdlRGF0YUxpa2Uge1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBzZXJpYWxpemVkLndpZHRoLFxuICAgIGhlaWdodDogc2VyaWFsaXplZC5oZWlnaHQsXG4gICAgZGF0YTogYmFzZTY0RGVjb2RlQXJyYXlCdWZmZXIoc2VyaWFsaXplZC5kYXRhIGFzIEJhc2U2NEVuY29kZWRVSW50OEFycmF5KVxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplSW1hZ2VEYXRhPFQgZXh0ZW5kcyBTZXJpYWxpemVkSW1hZ2VEYXRhPihzZXJpYWxpemVkOiBUKTogSW1hZ2VEYXRhIHtcbiAgY29uc3QgZGF0YSA9IGJhc2U2NERlY29kZUFycmF5QnVmZmVyKHNlcmlhbGl6ZWQuZGF0YSBhcyBCYXNlNjRFbmNvZGVkVUludDhBcnJheSk7XG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGRhdGEgYXMgSW1hZ2VEYXRhQXJyYXksIHNlcmlhbGl6ZWQud2lkdGgsIHNlcmlhbGl6ZWQuaGVpZ2h0KSBhcyBhbnk7XG59XG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVOdWxsYWJsZUltYWdlRGF0YTxUIGV4dGVuZHMgU2VyaWFsaXplZEltYWdlRGF0YSB8IG51bGw+KHNlcmlhbGl6ZWQ6IFQpOiBUIGV4dGVuZHMgbnVsbCA/IG51bGwgOiBJbWFnZURhdGEge1xuICBpZiAoIXNlcmlhbGl6ZWQpIHJldHVybiBudWxsIGFzIGFueTtcbiAgcmV0dXJuIGRlc2VyaWFsaXplSW1hZ2VEYXRhKHNlcmlhbGl6ZWQpIGFzIGFueTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function uInt32ArrayToImageData(data: Uint32Array, width: number, height: number): ImageData {\n const buffer = data.buffer as ArrayBuffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return new ImageData(clampedArray, width, height);\n}\nexport function uInt32ArrayToImageDataLike(data: Uint32Array, width: number, height: number): ImageDataLike {\n const buffer = data.buffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n return {\n width,\n height,\n data: clampedArray\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gdUludDMyQXJyYXlUb0ltYWdlRGF0YShkYXRhOiBVaW50MzJBcnJheSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJbWFnZURhdGEge1xuICBjb25zdCBidWZmZXIgPSBkYXRhLmJ1ZmZlciBhcyBBcnJheUJ1ZmZlcjtcbiAgY29uc3QgYnl0ZU9mZnNldCA9IGRhdGEuYnl0ZU9mZnNldDtcbiAgY29uc3QgYnl0ZUxlbmd0aCA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgY29uc3QgY2xhbXBlZEFycmF5ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGJ1ZmZlciwgYnl0ZU9mZnNldCwgYnl0ZUxlbmd0aCk7XG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKGNsYW1wZWRBcnJheSwgd2lkdGgsIGhlaWdodCk7XG59XG5leHBvcnQgZnVuY3Rpb24gdUludDMyQXJyYXlUb0ltYWdlRGF0YUxpa2UoZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSW1hZ2VEYXRhTGlrZSB7XG4gIGNvbnN0IGJ1ZmZlciA9IGRhdGEuYnVmZmVyO1xuICBjb25zdCBieXRlT2Zmc2V0ID0gZGF0YS5ieXRlT2Zmc2V0O1xuICBjb25zdCBieXRlTGVuZ3RoID0gZGF0YS5ieXRlTGVuZ3RoO1xuICBjb25zdCBjbGFtcGVkQXJyYXkgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKTtcbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgZGF0YTogY2xhbXBlZEFycmF5XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Writes image data from a source to a target.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n */\nexport function writeImageData(target: ImageData, source: ImageData, x = 0, y = 0): void {\n const dstW = target.width;\n const dstH = target.height;\n const dst = target.data;\n const srcW = source.width;\n const srcH = source.height;\n const src = source.data;\n let dstX = x;\n let dstY = y;\n let srcX = 0;\n let srcY = 0;\n let copyW = srcW;\n let copyH = srcH;\n if (dstX < 0) {\n srcX = -dstX;\n copyW += dstX;\n dstX = 0;\n }\n if (dstY < 0) {\n srcY = -dstY;\n copyH += dstY;\n dstY = 0;\n }\n copyW = Math.min(copyW, dstW - dstX);\n copyH = Math.min(copyH, dstH - dstY);\n if (copyW <= 0 || copyH <= 0) return;\n const isDstAligned = dst.byteOffset % 4 === 0;\n const isSrcAligned = src.byteOffset % 4 === 0;\n if (isDstAligned && isSrcAligned) {\n const dstLen32 = dst.byteLength / 4;\n const dst32 = new Uint32Array(dst.buffer, dst.byteOffset, dstLen32);\n const srcLen32 = src.byteLength / 4;\n const src32 = new Uint32Array(src.buffer, src.byteOffset, srcLen32);\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * srcW + srcX;\n const chunk = src32.subarray(srcStart, srcStart + copyW);\n dst32.set(chunk, dstStart);\n }\n } else {\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const dstStart = ((dstY + row) * dstW + dstX) * 4;\n const srcStart = ((srcY + row) * srcW + srcX) * 4;\n const chunk = src.subarray(srcStart, srcStart + rowLen);\n dst.set(chunk, dstStart);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdyaXRlcyBpbWFnZSBkYXRhIGZyb20gYSBzb3VyY2UgdG8gYSB0YXJnZXQuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBkZXN0aW5hdGlvbiBJbWFnZURhdGEgdG8gd3JpdGUgdG8uXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIHNvdXJjZSBJbWFnZURhdGEgdG8gcmVhZCBmcm9tLlxuICogQHBhcmFtIHggLSBUaGUgeC1jb29yZGluYXRlIGluIHRoZSB0YXJnZXQgd2hlcmUgZHJhd2luZyBzdGFydHMuXG4gKiBAcGFyYW0geSAtIFRoZSB5LWNvb3JkaW5hdGUgaW4gdGhlIHRhcmdldCB3aGVyZSBkcmF3aW5nIHN0YXJ0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhKHRhcmdldDogSW1hZ2VEYXRhLCBzb3VyY2U6IEltYWdlRGF0YSwgeCA9IDAsIHkgPSAwKTogdm9pZCB7XG4gIGNvbnN0IGRzdFcgPSB0YXJnZXQud2lkdGg7XG4gIGNvbnN0IGRzdEggPSB0YXJnZXQuaGVpZ2h0O1xuICBjb25zdCBkc3QgPSB0YXJnZXQuZGF0YTtcbiAgY29uc3Qgc3JjVyA9IHNvdXJjZS53aWR0aDtcbiAgY29uc3Qgc3JjSCA9IHNvdXJjZS5oZWlnaHQ7XG4gIGNvbnN0IHNyYyA9IHNvdXJjZS5kYXRhO1xuICBsZXQgZHN0WCA9IHg7XG4gIGxldCBkc3RZID0geTtcbiAgbGV0IHNyY1ggPSAwO1xuICBsZXQgc3JjWSA9IDA7XG4gIGxldCBjb3B5VyA9IHNyY1c7XG4gIGxldCBjb3B5SCA9IHNyY0g7XG4gIGlmIChkc3RYIDwgMCkge1xuICAgIHNyY1ggPSAtZHN0WDtcbiAgICBjb3B5VyArPSBkc3RYO1xuICAgIGRzdFggPSAwO1xuICB9XG4gIGlmIChkc3RZIDwgMCkge1xuICAgIHNyY1kgPSAtZHN0WTtcbiAgICBjb3B5SCArPSBkc3RZO1xuICAgIGRzdFkgPSAwO1xuICB9XG4gIGNvcHlXID0gTWF0aC5taW4oY29weVcsIGRzdFcgLSBkc3RYKTtcbiAgY29weUggPSBNYXRoLm1pbihjb3B5SCwgZHN0SCAtIGRzdFkpO1xuICBpZiAoY29weVcgPD0gMCB8fCBjb3B5SCA8PSAwKSByZXR1cm47XG4gIGNvbnN0IGlzRHN0QWxpZ25lZCA9IGRzdC5ieXRlT2Zmc2V0ICUgNCA9PT0gMDtcbiAgY29uc3QgaXNTcmNBbGlnbmVkID0gc3JjLmJ5dGVPZmZzZXQgJSA0ID09PSAwO1xuICBpZiAoaXNEc3RBbGlnbmVkICYmIGlzU3JjQWxpZ25lZCkge1xuICAgIGNvbnN0IGRzdExlbjMyID0gZHN0LmJ5dGVMZW5ndGggLyA0O1xuICAgIGNvbnN0IGRzdDMyID0gbmV3IFVpbnQzMkFycmF5KGRzdC5idWZmZXIsIGRzdC5ieXRlT2Zmc2V0LCBkc3RMZW4zMik7XG4gICAgY29uc3Qgc3JjTGVuMzIgPSBzcmMuYnl0ZUxlbmd0aCAvIDQ7XG4gICAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc3JjLmJ1ZmZlciwgc3JjLmJ5dGVPZmZzZXQsIHNyY0xlbjMyKTtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFg7XG4gICAgICBjb25zdCBzcmNTdGFydCA9IChzcmNZICsgcm93KSAqIHNyY1cgKyBzcmNYO1xuICAgICAgY29uc3QgY2h1bmsgPSBzcmMzMi5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5Vyk7XG4gICAgICBkc3QzMi5zZXQoY2h1bmssIGRzdFN0YXJ0KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgcm93TGVuID0gY29weVcgKiA0O1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgICAgY29uc3QgZHN0U3RhcnQgPSAoKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFgpICogNDtcbiAgICAgIGNvbnN0IHNyY1N0YXJ0ID0gKChzcmNZICsgcm93KSAqIHNyY1cgKyBzcmNYKSAqIDQ7XG4gICAgICBjb25zdCBjaHVuayA9IHNyYy5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pO1xuICAgICAgZHN0LnNldChjaHVuaywgZHN0U3RhcnQpO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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 target - The target to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A rect defining the destination region.\n */\nexport function writeImageDataBuffer(target: ImageData, data: Uint8ClampedArray, rect: Rect): void;\n/**\n * @param target - The target to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(target: ImageData, data: Uint8ClampedArray, x: number, y: number, w: number, h: number): void;\nexport function writeImageDataBuffer(target: ImageData, data: Uint8ClampedArray, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n if (typeof _x === 'object') {\n x = _x.x;\n y = _x.y;\n w = _x.w;\n h = _x.h;\n } else {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n }\n if (w <= 0 || h <= 0) return;\n const dstW = target.width;\n const dstH = target.height;\n const dst = target.data;\n\n // Inline clipping logic for destination boundaries\n let dstX = x;\n let dstY = y;\n let srcX = 0;\n let srcY = 0;\n let copyW = w;\n let copyH = h;\n if (dstX < 0) {\n srcX = -dstX;\n copyW += dstX;\n dstX = 0;\n }\n if (dstY < 0) {\n srcY = -dstY;\n copyH += dstY;\n dstY = 0;\n }\n copyW = Math.min(copyW, dstW - dstX);\n copyH = Math.min(copyH, dstH - dstY);\n if (copyW <= 0 || copyH <= 0) return;\n\n // Fast-path: Both arrays must be 4-byte aligned to use Uint32Array safely\n const isDstAligned = dst.byteOffset % 4 === 0;\n const isSrcAligned = data.byteOffset % 4 === 0;\n if (isDstAligned && isSrcAligned) {\n const dstLen32 = dst.byteLength / 4;\n const dst32 = new Uint32Array(dst.buffer, dst.byteOffset, dstLen32);\n const srcLen32 = data.byteLength / 4;\n const src32 = new Uint32Array(data.buffer, data.byteOffset, srcLen32);\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * w + srcX;\n const chunk = src32.subarray(srcStart, srcStart + copyW);\n dst32.set(chunk, dstStart);\n }\n } else {\n // Fallback for unaligned data arrays\n const rowLen = copyW * 4;\n for (let row = 0; row < copyH; row++) {\n const dstStart = ((dstY + row) * dstW + dstX) * 4;\n const srcStart = ((srcY + row) * w + srcX) * 4;\n const chunk = data.subarray(srcStart, srcStart + rowLen);\n dst.set(chunk, dstStart);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcGllcyBhIHBpeGVsIGJ1ZmZlciBpbnRvIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGFuIHtAbGluayBJbWFnZURhdGF9IG9iamVjdC5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgZGlyZWN0IG1lbW9yeSBjb3B5IGZyb20gYSB7QGxpbmsgVWludDhDbGFtcGVkQXJyYXl9XG4gKiBpbnRvIHRoZSB0YXJnZXQge0BsaW5rIEltYWdlRGF0YX0gYnVmZmVyLiBJdCBzdXBwb3J0cyBib3RoIHtAbGluayBSZWN0fVxuICogb2JqZWN0cyBhbmQgZGlzY3JldGUgY29vcmRpbmF0ZXMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gd3JpdGUgaW50by4gTXVzdCBtYXRjaCB0aGUgcmVjdCB3aWR0aC9oZWlnaHQuXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBzb3VyY2UgcGl4ZWwgZGF0YSAoUkdCQSkuXG4gKiBAcGFyYW0gcmVjdCAtIEEgcmVjdCBkZWZpbmluZyB0aGUgZGVzdGluYXRpb24gcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIodGFyZ2V0OiBJbWFnZURhdGEsIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LCByZWN0OiBSZWN0KTogdm9pZDtcbi8qKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gd3JpdGUgaW50by5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHNvdXJjZSBwaXhlbCBkYXRhIChSR0JBKS4gTXVzdCBtYXRjaCB0aGUgd2lkdGgvaGVpZ2h0LlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIHdyaXRlLlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gd3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YUJ1ZmZlcih0YXJnZXQ6IEltYWdlRGF0YSwgZGF0YTogVWludDhDbGFtcGVkQXJyYXksIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIodGFyZ2V0OiBJbWFnZURhdGEsIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LCBfeDogUmVjdCB8IG51bWJlciwgX3k/OiBudW1iZXIsIF93PzogbnVtYmVyLCBfaD86IG51bWJlcik6IHZvaWQge1xuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuICBsZXQgdzogbnVtYmVyO1xuICBsZXQgaDogbnVtYmVyO1xuICBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgIHggPSBfeC54O1xuICAgIHkgPSBfeC55O1xuICAgIHcgPSBfeC53O1xuICAgIGggPSBfeC5oO1xuICB9IGVsc2Uge1xuICAgIHggPSBfeDtcbiAgICB5ID0gX3khO1xuICAgIHcgPSBfdyE7XG4gICAgaCA9IF9oITtcbiAgfVxuICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuO1xuICBjb25zdCBkc3RXID0gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBkc3RIID0gdGFyZ2V0LmhlaWdodDtcbiAgY29uc3QgZHN0ID0gdGFyZ2V0LmRhdGE7XG5cbiAgLy8gSW5saW5lIGNsaXBwaW5nIGxvZ2ljIGZvciBkZXN0aW5hdGlvbiBib3VuZGFyaWVzXG4gIGxldCBkc3RYID0geDtcbiAgbGV0IGRzdFkgPSB5O1xuICBsZXQgc3JjWCA9IDA7XG4gIGxldCBzcmNZID0gMDtcbiAgbGV0IGNvcHlXID0gdztcbiAgbGV0IGNvcHlIID0gaDtcbiAgaWYgKGRzdFggPCAwKSB7XG4gICAgc3JjWCA9IC1kc3RYO1xuICAgIGNvcHlXICs9IGRzdFg7XG4gICAgZHN0WCA9IDA7XG4gIH1cbiAgaWYgKGRzdFkgPCAwKSB7XG4gICAgc3JjWSA9IC1kc3RZO1xuICAgIGNvcHlIICs9IGRzdFk7XG4gICAgZHN0WSA9IDA7XG4gIH1cbiAgY29weVcgPSBNYXRoLm1pbihjb3B5VywgZHN0VyAtIGRzdFgpO1xuICBjb3B5SCA9IE1hdGgubWluKGNvcHlILCBkc3RIIC0gZHN0WSk7XG4gIGlmIChjb3B5VyA8PSAwIHx8IGNvcHlIIDw9IDApIHJldHVybjtcblxuICAvLyBGYXN0LXBhdGg6IEJvdGggYXJyYXlzIG11c3QgYmUgNC1ieXRlIGFsaWduZWQgdG8gdXNlIFVpbnQzMkFycmF5IHNhZmVseVxuICBjb25zdCBpc0RzdEFsaWduZWQgPSBkc3QuYnl0ZU9mZnNldCAlIDQgPT09IDA7XG4gIGNvbnN0IGlzU3JjQWxpZ25lZCA9IGRhdGEuYnl0ZU9mZnNldCAlIDQgPT09IDA7XG4gIGlmIChpc0RzdEFsaWduZWQgJiYgaXNTcmNBbGlnbmVkKSB7XG4gICAgY29uc3QgZHN0TGVuMzIgPSBkc3QuYnl0ZUxlbmd0aCAvIDQ7XG4gICAgY29uc3QgZHN0MzIgPSBuZXcgVWludDMyQXJyYXkoZHN0LmJ1ZmZlciwgZHN0LmJ5dGVPZmZzZXQsIGRzdExlbjMyKTtcbiAgICBjb25zdCBzcmNMZW4zMiA9IGRhdGEuYnl0ZUxlbmd0aCAvIDQ7XG4gICAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoZGF0YS5idWZmZXIsIGRhdGEuYnl0ZU9mZnNldCwgc3JjTGVuMzIpO1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgICAgY29uc3QgZHN0U3RhcnQgPSAoZHN0WSArIHJvdykgKiBkc3RXICsgZHN0WDtcbiAgICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogdyArIHNyY1g7XG4gICAgICBjb25zdCBjaHVuayA9IHNyYzMyLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIGNvcHlXKTtcbiAgICAgIGRzdDMyLnNldChjaHVuaywgZHN0U3RhcnQpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjayBmb3IgdW5hbGlnbmVkIGRhdGEgYXJyYXlzXG4gICAgY29uc3Qgcm93TGVuID0gY29weVcgKiA0O1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgICAgY29uc3QgZHN0U3RhcnQgPSAoKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFgpICogNDtcbiAgICAgIGNvbnN0IHNyY1N0YXJ0ID0gKChzcmNZICsgcm93KSAqIHcgKyBzcmNYKSAqIDQ7XG4gICAgICBjb25zdCBjaHVuayA9IGRhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgcm93TGVuKTtcbiAgICAgIGRzdC5zZXQoY2h1bmssIGRzdFN0YXJ0KTtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\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): Uint32Array {\n const data = indexedImage.data;\n const palette = indexedImage.palette;\n const frequencies = new Uint32Array(palette.length);\n for (let i = 0; i < data.length; i++) {\n const colorIndex = data[i]!;\n frequencies[colorIndex]++;\n }\n return frequencies;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhbGN1bGF0ZXMgdGhlIGZyZXF1ZW5jeSBvZiBlYWNoIHBhbGV0dGUgaW5kZXggYmFzZWQgb24gdGhlIGltYWdlIGRhdGEuXG4gKiBUaGUgaW5kZXggb2YgdGhlIHJldHVybmVkIGFycmF5IG1hcHMgZGlyZWN0bHkgdG8gdGhlIGluZGV4IG9mIHRoZSBwYWxldHRlLlxuICogQHBhcmFtIGluZGV4ZWRJbWFnZSAtIFRoZSBzb3VyY2UgaW1hZ2UgY29udGFpbmluZyBkYXRhIGFuZCBwYWxldHRlIGRlZmluaXRpb25zLlxuICogQHJldHVybnMgQSB0eXBlZCBhcnJheSB3aGVyZSBlYWNoIGVudHJ5IHJlcHJlc2VudHMgdGhlIHRvdGFsIGNvdW50IG9mIHRoYXQgcGFsZXR0ZSBpbmRleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4ZWRJbWFnZUNvbG9yQ291bnRzKGluZGV4ZWRJbWFnZTogSW5kZXhlZEltYWdlKTogVWludDMyQXJyYXkge1xuICBjb25zdCBkYXRhID0gaW5kZXhlZEltYWdlLmRhdGE7XG4gIGNvbnN0IHBhbGV0dGUgPSBpbmRleGVkSW1hZ2UucGFsZXR0ZTtcbiAgY29uc3QgZnJlcXVlbmNpZXMgPSBuZXcgVWludDMyQXJyYXkocGFsZXR0ZS5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBjb2xvckluZGV4ID0gZGF0YVtpXSE7XG4gICAgZnJlcXVlbmNpZXNbY29sb3JJbmRleF0rKztcbiAgfVxuICByZXR1cm4gZnJlcXVlbmNpZXM7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nexport function makeIndexedImage(width: number, height: number, data: Uint32Array, palette: Uint32Array, transparentPalletIndex: number): IndexedImage {\n return {\n w: width,\n h: height,\n data,\n palette,\n transparentPalletIndex\n };\n}\nexport function makeIndexedImageFromImageDataRaw(data: Uint8ClampedArray, width: number, height: number): IndexedImage {\n const buffer = data.buffer;\n const rawData = new Uint32Array(buffer);\n const indexedData = new Uint32Array(rawData.length);\n const colorMap = new Map<number, number>();\n const transparentColor = 0;\n const transparentPalletIndex = 0;\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex);\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number;\n const alpha = pixel >>> 24 & 0xFF;\n const isTransparent = alpha === 0;\n const colorKey = isTransparent ? transparentColor : pixel >>> 0;\n let id = colorMap.get(colorKey);\n if (id === undefined) {\n id = colorMap.size;\n colorMap.set(colorKey, id);\n }\n indexedData[i] = id;\n }\n const palette = Uint32Array.from(colorMap.keys());\n return makeIndexedImage(width, height, indexedData, palette, transparentPalletIndex);\n}\nexport function makeIndexedImageFromImageData(imageData: ImageData): IndexedImage {\n return makeIndexedImageFromImageDataRaw(imageData.data, imageData.width, imageData.height);\n}\nexport function getIndexedImageColor(target: IndexedImage, x: number, y: number): Color32 {\n const index = x + y * target.w;\n const paletteIndex = target.data[index];\n return target.palette[paletteIndex] as Color32;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VJbmRleGVkSW1hZ2Uod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IFVpbnQzMkFycmF5LCBwYWxldHRlOiBVaW50MzJBcnJheSwgdHJhbnNwYXJlbnRQYWxsZXRJbmRleDogbnVtYmVyKTogSW5kZXhlZEltYWdlIHtcbiAgcmV0dXJuIHtcbiAgICB3OiB3aWR0aCxcbiAgICBoOiBoZWlnaHQsXG4gICAgZGF0YSxcbiAgICBwYWxldHRlLFxuICAgIHRyYW5zcGFyZW50UGFsbGV0SW5kZXhcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSW5kZXhlZEltYWdlRnJvbUltYWdlRGF0YVJhdyhkYXRhOiBVaW50OENsYW1wZWRBcnJheSwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpOiBJbmRleGVkSW1hZ2Uge1xuICBjb25zdCBidWZmZXIgPSBkYXRhLmJ1ZmZlcjtcbiAgY29uc3QgcmF3RGF0YSA9IG5ldyBVaW50MzJBcnJheShidWZmZXIpO1xuICBjb25zdCBpbmRleGVkRGF0YSA9IG5ldyBVaW50MzJBcnJheShyYXdEYXRhLmxlbmd0aCk7XG4gIGNvbnN0IGNvbG9yTWFwID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgY29uc3QgdHJhbnNwYXJlbnRDb2xvciA9IDA7XG4gIGNvbnN0IHRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSAwO1xuXG4gIC8vIEluaXRpYWxpemUgcGFsZXR0ZSB3aXRoIG5vcm1hbGl6ZWQgdHJhbnNwYXJlbnQgY29sb3JcbiAgY29sb3JNYXAuc2V0KHRyYW5zcGFyZW50Q29sb3IsIHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBwaXhlbCA9IHJhd0RhdGFbaV0gYXMgbnVtYmVyO1xuICAgIGNvbnN0IGFscGhhID0gcGl4ZWwgPj4+IDI0ICYgMHhGRjtcbiAgICBjb25zdCBpc1RyYW5zcGFyZW50ID0gYWxwaGEgPT09IDA7XG4gICAgY29uc3QgY29sb3JLZXkgPSBpc1RyYW5zcGFyZW50ID8gdHJhbnNwYXJlbnRDb2xvciA6IHBpeGVsID4+PiAwO1xuICAgIGxldCBpZCA9IGNvbG9yTWFwLmdldChjb2xvcktleSk7XG4gICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGlkID0gY29sb3JNYXAuc2l6ZTtcbiAgICAgIGNvbG9yTWFwLnNldChjb2xvcktleSwgaWQpO1xuICAgIH1cbiAgICBpbmRleGVkRGF0YVtpXSA9IGlkO1xuICB9XG4gIGNvbnN0IHBhbGV0dGUgPSBVaW50MzJBcnJheS5mcm9tKGNvbG9yTWFwLmtleXMoKSk7XG4gIHJldHVybiBtYWtlSW5kZXhlZEltYWdlKHdpZHRoLCBoZWlnaHQsIGluZGV4ZWREYXRhLCBwYWxldHRlLCB0cmFuc3BhcmVudFBhbGxldEluZGV4KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlSW5kZXhlZEltYWdlRnJvbUltYWdlRGF0YShpbWFnZURhdGE6IEltYWdlRGF0YSk6IEluZGV4ZWRJbWFnZSB7XG4gIHJldHVybiBtYWtlSW5kZXhlZEltYWdlRnJvbUltYWdlRGF0YVJhdyhpbWFnZURhdGEuZGF0YSwgaW1hZ2VEYXRhLndpZHRoLCBpbWFnZURhdGEuaGVpZ2h0KTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbmRleGVkSW1hZ2VDb2xvcih0YXJnZXQ6IEluZGV4ZWRJbWFnZSwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBDb2xvcjMyIHtcbiAgY29uc3QgaW5kZXggPSB4ICsgeSAqIHRhcmdldC53O1xuICBjb25zdCBwYWxldHRlSW5kZXggPSB0YXJnZXQuZGF0YVtpbmRleF07XG4gIHJldHVybiB0YXJnZXQucGFsZXR0ZVtwYWxldHRlSW5kZXhdIGFzIENvbG9yMzI7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { packColor } from '../color';\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(indexedImage: IndexedImage, includeTransparent: boolean = false): Color32 {\n const {\n data,\n palette,\n transparentPalletIndex\n } = 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 let rSum = 0;\n let gSum = 0;\n let bSum = 0;\n let aSum = 0;\n let totalWeight = 0;\n for (let id = 0; id < counts.length; id++) {\n const weight = counts[id]!;\n if (weight === 0) {\n continue;\n }\n if (!includeTransparent && id === transparentPalletIndex) {\n continue;\n }\n const color = palette[id]! >>> 0;\n const r = color & 0xFF;\n const g = color >> 8 & 0xFF;\n const b = color >> 16 & 0xFF;\n const a = color >> 24 & 0xFF;\n rSum += r * weight;\n gSum += g * weight;\n bSum += b * weight;\n aSum += a * weight;\n totalWeight += weight;\n }\n if (totalWeight === 0) {\n return packColor(0, 0, 0, 0);\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 return packColor(r, g, b, a);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYWNrQ29sb3IgfSBmcm9tICcuLi9jb2xvcic7XG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFyZWEtd2VpZ2h0ZWQgYXZlcmFnZSBjb2xvciBvZiBhbiBJbmRleGVkSW1hZ2UuXG4gKiBUaGlzIGFjY291bnRzIGZvciBob3cgb2Z0ZW4gZWFjaCBwYWxldHRlIGluZGV4IGFwcGVhcnMgaW4gdGhlIHBpeGVsIGRhdGEuXG4gKiBAcGFyYW0gaW5kZXhlZEltYWdlIC0gVGhlIEluZGV4ZWRJbWFnZSBjb250YWluaW5nIHBpeGVsIGluZGljZXMgYW5kIHRoZSBwYWxldHRlLlxuICogQHBhcmFtIGluY2x1ZGVUcmFuc3BhcmVudCAtIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgdHJhbnNwYXJlbnQgcGl4ZWxzIGluIHRoZSBhdmVyYWdlLlxuICogQHJldHVybnMgVGhlIGF2ZXJhZ2UgUkdCQSBjb2xvciBvZiB0aGUgaW1hZ2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmRleGVkSW1hZ2VUb0F2ZXJhZ2VDb2xvcihpbmRleGVkSW1hZ2U6IEluZGV4ZWRJbWFnZSwgaW5jbHVkZVRyYW5zcGFyZW50OiBib29sZWFuID0gZmFsc2UpOiBDb2xvcjMyIHtcbiAgY29uc3Qge1xuICAgIGRhdGEsXG4gICAgcGFsZXR0ZSxcbiAgICB0cmFuc3BhcmVudFBhbGxldEluZGV4XG4gIH0gPSBpbmRleGVkSW1hZ2U7XG4gIGNvbnN0IGNvdW50cyA9IG5ldyBVaW50MzJBcnJheShwYWxldHRlLmxlbmd0aCk7XG5cbiAgLy8gVGFsbHkgb2NjdXJyZW5jZXMgb2YgZWFjaCBpbmRleFxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBpZCA9IGRhdGFbaV0hO1xuICAgIGNvdW50c1tpZF0hKys7XG4gIH1cbiAgbGV0IHJTdW0gPSAwO1xuICBsZXQgZ1N1bSA9IDA7XG4gIGxldCBiU3VtID0gMDtcbiAgbGV0IGFTdW0gPSAwO1xuICBsZXQgdG90YWxXZWlnaHQgPSAwO1xuICBmb3IgKGxldCBpZCA9IDA7IGlkIDwgY291bnRzLmxlbmd0aDsgaWQrKykge1xuICAgIGNvbnN0IHdlaWdodCA9IGNvdW50c1tpZF0hO1xuICAgIGlmICh3ZWlnaHQgPT09IDApIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoIWluY2x1ZGVUcmFuc3BhcmVudCAmJiBpZCA9PT0gdHJhbnNwYXJlbnRQYWxsZXRJbmRleCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNvbG9yID0gcGFsZXR0ZVtpZF0hID4+PiAwO1xuICAgIGNvbnN0IHIgPSBjb2xvciAmIDB4RkY7XG4gICAgY29uc3QgZyA9IGNvbG9yID4+IDggJiAweEZGO1xuICAgIGNvbnN0IGIgPSBjb2xvciA+PiAxNiAmIDB4RkY7XG4gICAgY29uc3QgYSA9IGNvbG9yID4+IDI0ICYgMHhGRjtcbiAgICByU3VtICs9IHIgKiB3ZWlnaHQ7XG4gICAgZ1N1bSArPSBnICogd2VpZ2h0O1xuICAgIGJTdW0gKz0gYiAqIHdlaWdodDtcbiAgICBhU3VtICs9IGEgKiB3ZWlnaHQ7XG4gICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0O1xuICB9XG4gIGlmICh0b3RhbFdlaWdodCA9PT0gMCkge1xuICAgIHJldHVybiBwYWNrQ29sb3IoMCwgMCwgMCwgMCk7XG4gIH1cbiAgY29uc3QgciA9IHJTdW0gLyB0b3RhbFdlaWdodCB8IDA7XG4gIGNvbnN0IGcgPSBnU3VtIC8gdG90YWxXZWlnaHQgfCAwO1xuICBjb25zdCBiID0gYlN1bSAvIHRvdGFsV2VpZ2h0IHwgMDtcbiAgY29uc3QgYSA9IGFTdW0gLyB0b3RhbFdlaWdodCB8IDA7XG4gIHJldHVybiBwYWNrQ29sb3IociwgZywgYiwgYSk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const {\n w,\n h,\n data,\n palette\n } = indexedImage;\n const result = new ImageData(w, h);\n const data32 = new Uint32Array(result.data.buffer);\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i];\n data32[i] = palette[paletteIndex];\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnZlcnRzIGFuIEluZGV4ZWRJbWFnZSBiYWNrIGludG8gc3RhbmRhcmQgSW1hZ2VEYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhlZEltYWdlVG9JbWFnZURhdGEoaW5kZXhlZEltYWdlOiBJbmRleGVkSW1hZ2UpOiBJbWFnZURhdGEge1xuICBjb25zdCB7XG4gICAgdyxcbiAgICBoLFxuICAgIGRhdGEsXG4gICAgcGFsZXR0ZVxuICB9ID0gaW5kZXhlZEltYWdlO1xuICBjb25zdCByZXN1bHQgPSBuZXcgSW1hZ2VEYXRhKHcsIGgpO1xuICBjb25zdCBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEuYnVmZmVyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFsZXR0ZUluZGV4ID0gZGF0YVtpXTtcbiAgICBkYXRhMzJbaV0gPSBwYWxldHRlW3BhbGV0dGVJbmRleF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resampleUint32Array } from '../Algorithm/resampleUint32Array';\nimport { 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(source: IndexedImage, factor: number): IndexedImage {\n const output = {\n palette: source.palette,\n transparentPalletIndex: source.transparentPalletIndex\n } as IndexedImage;\n return resampleUint32Array(source.data, source.w, source.h, factor, output) as IndexedImage;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc2FtcGxlcyBhbiBJbmRleGVkSW1hZ2UgYnkgYSBzcGVjaWZpYyBmYWN0b3IgdXNpbmcgbmVhcmVzdCBuZWlnaGJvclxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5pbXBvcnQgeyByZXNhbXBsZVVpbnQzMkFycmF5IH0gZnJvbSAnLi4vQWxnb3JpdGhtL3Jlc2FtcGxlVWludDMyQXJyYXknO1xuaW1wb3J0IHsgdHlwZSBJbmRleGVkSW1hZ2UgfSBmcm9tICcuLi9pbmRleCc7XG5cbi8qKlxuICogUmVzYW1wbGVzIGFuIEluZGV4ZWRJbWFnZSBieSBhIHNwZWNpZmljIGZhY3RvciB1c2luZyBuZWFyZXN0IG5laWdoYm9yXG4gKiBGYWN0b3IgPiAxIHVwc2NhbGVzLCBGYWN0b3IgPCAxIGRvd25zY2FsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNhbXBsZUluZGV4ZWRJbWFnZShzb3VyY2U6IEluZGV4ZWRJbWFnZSwgZmFjdG9yOiBudW1iZXIpOiBJbmRleGVkSW1hZ2Uge1xuICBjb25zdCBvdXRwdXQgPSB7XG4gICAgcGFsZXR0ZTogc291cmNlLnBhbGV0dGUsXG4gICAgdHJhbnNwYXJlbnRQYWxsZXRJbmRleDogc291cmNlLnRyYW5zcGFyZW50UGFsbGV0SW5kZXhcbiAgfSBhcyBJbmRleGVkSW1hZ2U7XG4gIHJldHVybiByZXNhbXBsZVVpbnQzMkFycmF5KHNvdXJjZS5kYXRhLCBzb3VyY2Uudywgc291cmNlLmgsIGZhY3Rvciwgb3V0cHV0KSBhcyBJbmRleGVkSW1hZ2U7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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(event: Event): Promise<ImageData | null> {\n const target = event.target as HTMLInputElement;\n const file = target.files?.[0];\n if (!file) return null;\n return await fileToImageData(file);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaWxlVG9JbWFnZURhdGEgfSBmcm9tICcuLi8uLi9zcmMnO1xuXG4vKipcbiAqIEEgY29udmVuaWVuY2Ugd3JhcHBlciB0aGF0IGV4dHJhY3RzIHRoZSBmaXJzdCB7QGxpbmsgRmlsZX0gZnJvbSBhblxuICoge0BsaW5rIEhUTUxJbnB1dEVsZW1lbnR9IGNoYW5nZSBldmVudCBhbmQgY29udmVydHMgaXQgaW50byB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgdGhlIGJvaWxlcnBsYXRlIG9mIGFjY2Vzc2luZyB0aGUgZmlsZSBsaXN0IGFuZCBjaGVja2luZ1xuICogZm9yIGV4aXN0ZW5jZS4gSXQgaXMgaWRlYWwgZm9yIHVzZSBkaXJlY3RseSBpbiBhbiBgb25jaGFuZ2VgIGV2ZW50IGxpc3RlbmVyLlxuICpcbiAqIEBwYXJhbSBldmVudCAtIFRoZSBjaGFuZ2Uge0BsaW5rIEV2ZW50fSBmcm9tIGFuIGA8aW5wdXQgdHlwZT1cImZpbGVcIj5gIGVsZW1lbnQuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8ge0BsaW5rIEltYWdlRGF0YX0gaWYgYSBmaWxlIHdhcyBzdWNjZXNzZnVsbHlcbiAqIHByb2Nlc3NlZCwgb3IgYG51bGxgIGlmIG5vIGZpbGUgd2FzIHNlbGVjdGVkIG9yIHRoZSBpbnB1dCB3YXMgY2xlYXJlZC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPVwiZmlsZVwiXScpO1xuICpcbiAqIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFzeW5jIChldmVudCkgPT4ge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YShldmVudCk7XG4gKlxuICogICBpZiAoaW1hZ2VEYXRhKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ0ltYWdlIGxvYWRlZDonLCBpbWFnZURhdGEud2lkdGgsIGltYWdlRGF0YS5oZWlnaHQpO1xuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZUlucHV0Q2hhbmdlVG9JbWFnZURhdGEoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxJbWFnZURhdGEgfCBudWxsPiB7XG4gIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICBjb25zdCBmaWxlID0gdGFyZ2V0LmZpbGVzPy5bMF07XG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XG4gIHJldHVybiBhd2FpdCBmaWxlVG9JbWFnZURhdGEoZmlsZSk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { OFFSCREEN_CANVAS_CTX_FAILED } from '../Internal/_errors';\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(file: File | null | undefined): Promise<ImageData | null> {\n if (!file) return null;\n if (!file.type.startsWith('image/')) {\n throw new UnsupportedFormatError(file.type);\n }\n let bitmap: ImageBitmap | null = null;\n try {\n bitmap = await createImageBitmap(file);\n const canvas = new OffscreenCanvas(bitmap.width, bitmap.height);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(OFFSCREEN_CANVAS_CTX_FAILED);\n ctx.drawImage(bitmap, 0, 0);\n return ctx.getImageData(0, 0, bitmap.width, bitmap.height);\n } finally {\n bitmap?.close();\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRkZTQ1JFRU5fQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuLi9JbnRlcm5hbC9fZXJyb3JzJztcblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgdXNlciBwcm92aWRlcyBhIGZpbGUgdGhhdCBpc24ndCBhbiBpbWFnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVuc3VwcG9ydGVkRm9ybWF0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1pbWVUeXBlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgRmlsZSB0eXBlICR7bWltZVR5cGV9IGlzIG5vdCBhIHN1cHBvcnRlZCBpbWFnZSBmb3JtYXQuYCk7XG4gICAgdGhpcy5uYW1lID0gJ1Vuc3VwcG9ydGVkRm9ybWF0RXJyb3InO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBicm93c2VyIHtAbGluayBGaWxlfSBvYmplY3QgaW50byB7QGxpbmsgSW1hZ2VEYXRhfS5cbiAqIFRoaXMgdXRpbGl0eSBoYW5kbGVzIHRoZSBmdWxsIHBpcGVsaW5lIG9mIGltYWdlIGRlY29kaW5nIHVzaW5nIGhhcmR3YXJlLWFjY2VsZXJhdGVkXG4gKiBBUElzIHtAbGluayBjcmVhdGVJbWFnZUJpdG1hcH0gYW5kIHtAbGluayBPZmZzY3JlZW5DYW52YXN9LiBJdCBlbnN1cmVzIHRoYXQgdW5kZXJseWluZ1xuICogcmVzb3VyY2VzIGxpa2UgYEltYWdlQml0bWFwYCBhcmUgcHJvcGVybHkgY2xvc2VkIGV2ZW4gaWYgdGhlIGNvbnZlcnNpb24gZmFpbHMuXG4gKlxuICogQHBhcmFtIGZpbGUgLSBUaGUgaW1hZ2UgZmlsZSB0byBjb252ZXJ0LiBDYW4gYmUgbnVsbCBvciB1bmRlZmluZWQuXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCByZXNvbHZpbmcgdG8gdGhlIHBpeGVsIGRhdGEgYXMge0BsaW5rIEltYWdlRGF0YX0sXG4gKiBvciBgbnVsbGAgaWYgbm8gZmlsZSB3YXMgcHJvdmlkZWQuXG4gKiBAdGhyb3dzIHtAbGluayBVbnN1cHBvcnRlZEZvcm1hdEVycm9yfVxuICogVGhyb3duIGlmIHRoZSBwcm92aWRlZCBmaWxlJ3MgTUlNRSB0eXBlIGRvZXMgbm90IHN0YXJ0IHdpdGggYGltYWdlL2AuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogdHJ5IHtcbiAqICAgY29uc3QgaW1hZ2VEYXRhID0gYXdhaXQgZmlsZVRvSW1hZ2VEYXRhKGZpbGUpO1xuICogICBpZiAoaW1hZ2VEYXRhKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ1BpeGVsczonLCBpbWFnZURhdGEuZGF0YSk7XG4gKiAgIH1cbiAqIH0gY2F0Y2ggKGVycikge1xuICogICBpZiAoZXJyIGluc3RhbmNlb2YgVW5zdXBwb3J0ZWRGb3JtYXRFcnJvcikge1xuICogICAgIC8vIEhhbmRsZSBiYWQgZmlsZSB0eXBlXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsZVRvSW1hZ2VEYXRhKGZpbGU6IEZpbGUgfCBudWxsIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxJbWFnZURhdGEgfCBudWxsPiB7XG4gIGlmICghZmlsZSkgcmV0dXJuIG51bGw7XG4gIGlmICghZmlsZS50eXBlLnN0YXJ0c1dpdGgoJ2ltYWdlLycpKSB7XG4gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkRm9ybWF0RXJyb3IoZmlsZS50eXBlKTtcbiAgfVxuICBsZXQgYml0bWFwOiBJbWFnZUJpdG1hcCB8IG51bGwgPSBudWxsO1xuICB0cnkge1xuICAgIGJpdG1hcCA9IGF3YWl0IGNyZWF0ZUltYWdlQml0bWFwKGZpbGUpO1xuICAgIGNvbnN0IGNhbnZhcyA9IG5ldyBPZmZzY3JlZW5DYW52YXMoYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KTtcbiAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICBpZiAoIWN0eCkgdGhyb3cgbmV3IEVycm9yKE9GRlNDUkVFTl9DQU5WQVNfQ1RYX0ZBSUxFRCk7XG4gICAgY3R4LmRyYXdJbWFnZShiaXRtYXAsIDAsIDApO1xuICAgIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKDAsIDAsIGJpdG1hcC53aWR0aCwgYml0bWFwLmhlaWdodCk7XG4gIH0gZmluYWxseSB7XG4gICAgYml0bWFwPy5jbG9zZSgpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","// Cache the Promise to prevent race conditions during initialization\nlet formatsPromise: Promise<string[]> | null = null;\nconst defaultRasterMimes = ['image/png', 'image/jpeg', 'image/webp', 'image/avif', 'image/gif', 'image/bmp'];\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 const probeCanvas = async () => {\n const canvas = new OffscreenCanvas(1, 1);\n const results = await Promise.all(rasterMimes.map(async mime => {\n try {\n const blob = await canvas.convertToBlob({\n type: mime\n });\n return blob.type === mime ? mime : null;\n } catch {\n return null;\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 throw error;\n });\n return formatsPromise;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBDYWNoZSB0aGUgUHJvbWlzZSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyBkdXJpbmcgaW5pdGlhbGl6YXRpb25cbmxldCBmb3JtYXRzUHJvbWlzZTogUHJvbWlzZTxzdHJpbmdbXT4gfCBudWxsID0gbnVsbDtcbmNvbnN0IGRlZmF1bHRSYXN0ZXJNaW1lcyA9IFsnaW1hZ2UvcG5nJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2Uvd2VicCcsICdpbWFnZS9hdmlmJywgJ2ltYWdlL2dpZicsICdpbWFnZS9ibXAnXTtcblxuLyoqXG4gKiBQcm9iZXMgdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIGltYWdlIE1JTUUgdHlwZXMgYXJlXG4gKiBzdXBwb3J0ZWQgZm9yIHBpeGVsLWxldmVsIG9wZXJhdGlvbnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIGEgb25lLXRpbWUgY2hlY2sgYnkgYXR0ZW1wdGluZyB0byBjb252ZXJ0IGFcbiAqIHtAbGluayBPZmZzY3JlZW5DYW52YXN9IHRvIE1JTUUgdHlwZXMuIFRoZSByZXN1bHQgaXNcbiAqIGNhY2hlZCB0byBwcmV2ZW50IHJlZHVuZGFudCBoYXJkd2FyZS1hY2NlbGVyYXRlZCBvcGVyYXRpb25zIG9uXG4gKiBzdWJzZXF1ZW50IGNhbGxzLlxuICogQHBhcmFtIHJhc3Rlck1pbWVzIExpc3Qgb2YgTUlNRSB0eXBlcyB0byBjaGVja1xuICogQGRlZmF1bHQgWydpbWFnZS9wbmcnLFxuICogICAnaW1hZ2UvanBlZycsXG4gKiAgICdpbWFnZS93ZWJwJyxcbiAqICAgJ2ltYWdlL2F2aWYnLFxuICogICAnaW1hZ2UvZ2lmJyxcbiAqICAgJ2ltYWdlL2JtcCddXG4gKiBAcmV0dXJucyBBIGBQcm9taXNlYCByZXNvbHZpbmcgdG8gYW4gYXJyYXkgb2Ygc3VwcG9ydGVkIE1JTUVcbiAqIHR5cGVzIGZyb20gdGhlIGByYXN0ZXJNaW1lc2AgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30gY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3Qgc3VwcG9ydGVkID0gYXdhaXQgZ2V0U3VwcG9ydGVkUGl4ZWxGb3JtYXRzKCk7XG4gKiBpZiAoc3VwcG9ydGVkLmluY2x1ZGVzKCdpbWFnZS9hdmlmJykpIHtcbiAqICAgY29uc29sZS5sb2coJ0hpZ2gtZWZmaWNpZW5jeSBmb3JtYXRzIGF2YWlsYWJsZScpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRQaXhlbEZvcm1hdHMocmFzdGVyTWltZXMgPSBkZWZhdWx0UmFzdGVyTWltZXMpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gIGlmIChmb3JtYXRzUHJvbWlzZSkge1xuICAgIHJldHVybiBmb3JtYXRzUHJvbWlzZTtcbiAgfVxuICBjb25zdCBwcm9iZUNhbnZhcyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpO1xuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChyYXN0ZXJNaW1lcy5tYXAoYXN5bmMgbWltZSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBibG9iID0gYXdhaXQgY2FudmFzLmNvbnZlcnRUb0Jsb2Ioe1xuICAgICAgICAgIHR5cGU6IG1pbWVcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBibG9iLnR5cGUgPT09IG1pbWUgPyBtaW1lIDogbnVsbDtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9KSk7XG4gICAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKCh0eXBlKTogdHlwZSBpcyBzdHJpbmcgPT4ge1xuICAgICAgcmV0dXJuIHR5cGUgIT09IG51bGw7XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gQnkgY2hhaW5pbmcgLmNhdGNoIGhlcmUsIHRoZSBtaWNyb3Rhc2sgZ3VhcmFudGVlcyBmb3JtYXRzUHJvbWlzZVxuICAvLyBpcyBhc3NpZ25lZCB0aGUgcHJvbWlzZSBCRUZPUkUgdGhlIGNhdGNoIGJsb2NrIHJ1bnMgdG8gcmVzZXQgaXQuXG4gIGZvcm1hdHNQcm9taXNlID0gcHJvYmVDYW52YXMoKS5jYXRjaChlcnJvciA9PiB7XG4gICAgZm9ybWF0c1Byb21pc2UgPSBudWxsO1xuICAgIHRocm93IGVycm9yO1xuICB9KTtcbiAgcmV0dXJuIGZvcm1hdHNQcm9taXNlO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from './_mask-types';\n\n/**\n * Creates an Alpha Mask\n * @param w - width\n * @param h - height\n * @param data - values 0-255\n */\nexport function makeAlphaMask(w: number, h: number, data?: Uint8Array): AlphaMask {\n return {\n type: MaskType.ALPHA,\n data: data ?? new Uint8Array(w * h),\n w,\n h\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4vX21hc2stdHlwZXMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gQWxwaGEgTWFza1xuICogQHBhcmFtIHcgLSB3aWR0aFxuICogQHBhcmFtIGggLSBoZWlnaHRcbiAqIEBwYXJhbSBkYXRhIC0gdmFsdWVzIDAtMjU1XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQWxwaGFNYXNrKHc6IG51bWJlciwgaDogbnVtYmVyLCBkYXRhPzogVWludDhBcnJheSk6IEFscGhhTWFzayB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQUxQSEEsXG4gICAgZGF0YTogZGF0YSA/PyBuZXcgVWludDhBcnJheSh3ICogaCksXG4gICAgdyxcbiAgICBoXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function applyBinaryMaskToAlphaMask(alphaMaskDst: AlphaMask, binaryMaskSrc: BinaryMask, opts?: ApplyMaskToPixelDataOptions): void {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const reqWidth = opts?.w ?? 0;\n const reqHeight = opts?.h ?? 0;\n const mx = opts?.mx ?? 0;\n const my = opts?.my ?? 0;\n const invertMask = opts?.invertMask ?? false;\n const dstWidth = alphaMaskDst.w;\n if (dstWidth <= 0) return;\n if (binaryMaskSrc.data.length === 0) return;\n const srcWidth = binaryMaskSrc.w;\n if (srcWidth <= 0) return;\n const dstHeight = alphaMaskDst.data.length / dstWidth | 0;\n const srcHeight = binaryMaskSrc.data.length / srcWidth | 0;\n if (dstHeight <= 0) return;\n if (srcHeight <= 0) return;\n const dstX0 = Math.max(0, targetX);\n const dstY0 = Math.max(0, targetY);\n const dstX1 = reqWidth > 0 ? Math.min(dstWidth, targetX + reqWidth) : dstWidth;\n const dstY1 = reqHeight > 0 ? Math.min(dstHeight, targetY + reqHeight) : dstHeight;\n if (dstX0 >= dstX1) return;\n if (dstY0 >= dstY1) return;\n const srcX0 = mx + (dstX0 - targetX);\n const srcY0 = my + (dstY0 - targetY);\n if (srcX0 >= srcWidth) return;\n if (srcY0 >= srcHeight) return;\n if (srcX0 + (dstX1 - dstX0) <= 0) return;\n if (srcY0 + (dstY1 - dstY0) <= 0) return;\n const iterW = Math.min(dstX1 - dstX0, srcWidth - srcX0);\n const iterH = Math.min(dstY1 - dstY0, srcHeight - srcY0);\n const srcData = binaryMaskSrc.data;\n const dstData = alphaMaskDst.data;\n let dstIdx = dstY0 * dstWidth + dstX0;\n let srcIdx = srcY0 * srcWidth + srcX0;\n if (invertMask) {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // inverted\n if (srcData[s] !== 0) {\n dstData[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n } else {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW;\n let d = dstIdx;\n let s = srcIdx;\n while (d < dstEnd) {\n // If binary mask is empty, clear the alpha pixel.\n if (srcData[s] === 0) {\n dstData[d] = 0;\n }\n d++;\n s++;\n }\n dstIdx += dstWidth;\n srcIdx += srcWidth;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gYXBwbHlCaW5hcnlNYXNrVG9BbHBoYU1hc2soYWxwaGFNYXNrRHN0OiBBbHBoYU1hc2ssIGJpbmFyeU1hc2tTcmM6IEJpbmFyeU1hc2ssIG9wdHM/OiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHM/LnggPz8gMDtcbiAgY29uc3QgdGFyZ2V0WSA9IG9wdHM/LnkgPz8gMDtcbiAgY29uc3QgcmVxV2lkdGggPSBvcHRzPy53ID8/IDA7XG4gIGNvbnN0IHJlcUhlaWdodCA9IG9wdHM/LmggPz8gMDtcbiAgY29uc3QgbXggPSBvcHRzPy5teCA/PyAwO1xuICBjb25zdCBteSA9IG9wdHM/Lm15ID8/IDA7XG4gIGNvbnN0IGludmVydE1hc2sgPSBvcHRzPy5pbnZlcnRNYXNrID8/IGZhbHNlO1xuICBjb25zdCBkc3RXaWR0aCA9IGFscGhhTWFza0RzdC53O1xuICBpZiAoZHN0V2lkdGggPD0gMCkgcmV0dXJuO1xuICBpZiAoYmluYXJ5TWFza1NyYy5kYXRhLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBzcmNXaWR0aCA9IGJpbmFyeU1hc2tTcmMudztcbiAgaWYgKHNyY1dpZHRoIDw9IDApIHJldHVybjtcbiAgY29uc3QgZHN0SGVpZ2h0ID0gYWxwaGFNYXNrRHN0LmRhdGEubGVuZ3RoIC8gZHN0V2lkdGggfCAwO1xuICBjb25zdCBzcmNIZWlnaHQgPSBiaW5hcnlNYXNrU3JjLmRhdGEubGVuZ3RoIC8gc3JjV2lkdGggfCAwO1xuICBpZiAoZHN0SGVpZ2h0IDw9IDApIHJldHVybjtcbiAgaWYgKHNyY0hlaWdodCA8PSAwKSByZXR1cm47XG4gIGNvbnN0IGRzdFgwID0gTWF0aC5tYXgoMCwgdGFyZ2V0WCk7XG4gIGNvbnN0IGRzdFkwID0gTWF0aC5tYXgoMCwgdGFyZ2V0WSk7XG4gIGNvbnN0IGRzdFgxID0gcmVxV2lkdGggPiAwID8gTWF0aC5taW4oZHN0V2lkdGgsIHRhcmdldFggKyByZXFXaWR0aCkgOiBkc3RXaWR0aDtcbiAgY29uc3QgZHN0WTEgPSByZXFIZWlnaHQgPiAwID8gTWF0aC5taW4oZHN0SGVpZ2h0LCB0YXJnZXRZICsgcmVxSGVpZ2h0KSA6IGRzdEhlaWdodDtcbiAgaWYgKGRzdFgwID49IGRzdFgxKSByZXR1cm47XG4gIGlmIChkc3RZMCA+PSBkc3RZMSkgcmV0dXJuO1xuICBjb25zdCBzcmNYMCA9IG14ICsgKGRzdFgwIC0gdGFyZ2V0WCk7XG4gIGNvbnN0IHNyY1kwID0gbXkgKyAoZHN0WTAgLSB0YXJnZXRZKTtcbiAgaWYgKHNyY1gwID49IHNyY1dpZHRoKSByZXR1cm47XG4gIGlmIChzcmNZMCA+PSBzcmNIZWlnaHQpIHJldHVybjtcbiAgaWYgKHNyY1gwICsgKGRzdFgxIC0gZHN0WDApIDw9IDApIHJldHVybjtcbiAgaWYgKHNyY1kwICsgKGRzdFkxIC0gZHN0WTApIDw9IDApIHJldHVybjtcbiAgY29uc3QgaXRlclcgPSBNYXRoLm1pbihkc3RYMSAtIGRzdFgwLCBzcmNXaWR0aCAtIHNyY1gwKTtcbiAgY29uc3QgaXRlckggPSBNYXRoLm1pbihkc3RZMSAtIGRzdFkwLCBzcmNIZWlnaHQgLSBzcmNZMCk7XG4gIGNvbnN0IHNyY0RhdGEgPSBiaW5hcnlNYXNrU3JjLmRhdGE7XG4gIGNvbnN0IGRzdERhdGEgPSBhbHBoYU1hc2tEc3QuZGF0YTtcbiAgbGV0IGRzdElkeCA9IGRzdFkwICogZHN0V2lkdGggKyBkc3RYMDtcbiAgbGV0IHNyY0lkeCA9IHNyY1kwICogc3JjV2lkdGggKyBzcmNYMDtcbiAgaWYgKGludmVydE1hc2spIHtcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpdGVySDsgcm93KyspIHtcbiAgICAgIGNvbnN0IGRzdEVuZCA9IGRzdElkeCArIGl0ZXJXO1xuICAgICAgbGV0IGQgPSBkc3RJZHg7XG4gICAgICBsZXQgcyA9IHNyY0lkeDtcbiAgICAgIHdoaWxlIChkIDwgZHN0RW5kKSB7XG4gICAgICAgIC8vIGludmVydGVkXG4gICAgICAgIGlmIChzcmNEYXRhW3NdICE9PSAwKSB7XG4gICAgICAgICAgZHN0RGF0YVtkXSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgZCsrO1xuICAgICAgICBzKys7XG4gICAgICB9XG4gICAgICBkc3RJZHggKz0gZHN0V2lkdGg7XG4gICAgICBzcmNJZHggKz0gc3JjV2lkdGg7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGl0ZXJIOyByb3crKykge1xuICAgICAgY29uc3QgZHN0RW5kID0gZHN0SWR4ICsgaXRlclc7XG4gICAgICBsZXQgZCA9IGRzdElkeDtcbiAgICAgIGxldCBzID0gc3JjSWR4O1xuICAgICAgd2hpbGUgKGQgPCBkc3RFbmQpIHtcbiAgICAgICAgLy8gSWYgYmluYXJ5IG1hc2sgaXMgZW1wdHksIGNsZWFyIHRoZSBhbHBoYSBwaXhlbC5cbiAgICAgICAgaWYgKHNyY0RhdGFbc10gPT09IDApIHtcbiAgICAgICAgICBkc3REYXRhW2RdID0gMDtcbiAgICAgICAgfVxuICAgICAgICBkKys7XG4gICAgICAgIHMrKztcbiAgICAgIH1cbiAgICAgIGRzdElkeCArPSBkc3RXaWR0aDtcbiAgICAgIHNyY0lkeCArPSBzcmNXaWR0aDtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from './_mask-types';\n\n/**\n * Creates a Binary Mask\n * @param w - width\n * @param h - height\n * @param data - values 0-1\n */\nexport function makeBinaryMask(w: number, h: number, data?: Uint8Array): BinaryMask {\n return {\n type: MaskType.BINARY,\n data: data ?? new Uint8Array(w * h),\n w,\n h\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4vX21hc2stdHlwZXMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBCaW5hcnkgTWFza1xuICogQHBhcmFtIHcgLSB3aWR0aFxuICogQHBhcmFtIGggLSBoZWlnaHRcbiAqIEBwYXJhbSBkYXRhIC0gdmFsdWVzIDAtMVxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZUJpbmFyeU1hc2sodzogbnVtYmVyLCBoOiBudW1iZXIsIGRhdGE/OiBVaW50OEFycmF5KTogQmluYXJ5TWFzayB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIGRhdGE6IGRhdGEgPz8gbmV3IFVpbnQ4QXJyYXkodyAqIGgpLFxuICAgIHcsXG4gICAgaFxuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType, type MutableBinaryMask } from '../_mask-types';\nexport function makeBinaryMaskFromAlphaMask(mask: AlphaMask, threshold: number, out?: MutableBinaryMask): BinaryMask {\n const w = mask.w;\n const h = mask.h;\n const alphaData = mask.data;\n const area = w * h;\n const binaryData = new Uint8Array(area);\n for (let i = 0; i < area; i++) {\n if (alphaData[i] >= threshold) {\n binaryData[i] = 1;\n }\n }\n out = out ?? {\n type: MaskType.BINARY\n } as MutableBinaryMask;\n out.data = binaryData;\n out.w = w;\n out.h = h;\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSwgdHlwZSBNdXRhYmxlQmluYXJ5TWFzayB9IGZyb20gJy4uL19tYXNrLXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQmluYXJ5TWFza0Zyb21BbHBoYU1hc2sobWFzazogQWxwaGFNYXNrLCB0aHJlc2hvbGQ6IG51bWJlciwgb3V0PzogTXV0YWJsZUJpbmFyeU1hc2spOiBCaW5hcnlNYXNrIHtcbiAgY29uc3QgdyA9IG1hc2sudztcbiAgY29uc3QgaCA9IG1hc2suaDtcbiAgY29uc3QgYWxwaGFEYXRhID0gbWFzay5kYXRhO1xuICBjb25zdCBhcmVhID0gdyAqIGg7XG4gIGNvbnN0IGJpbmFyeURhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmVhOyBpKyspIHtcbiAgICBpZiAoYWxwaGFEYXRhW2ldID49IHRocmVzaG9sZCkge1xuICAgICAgYmluYXJ5RGF0YVtpXSA9IDE7XG4gICAgfVxuICB9XG4gIG91dCA9IG91dCA/PyB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZXG4gIH0gYXMgTXV0YWJsZUJpbmFyeU1hc2s7XG4gIG91dC5kYXRhID0gYmluYXJ5RGF0YTtcbiAgb3V0LncgPSB3O1xuICBvdXQuaCA9IGg7XG4gIHJldHVybiBvdXQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_mask-types';\nexport function makeBinaryMaskOutline(mask: BinaryMask, scale = 1): BinaryMask {\n const w = mask.w;\n const h = mask.h;\n const maskData = mask.data;\n const size = w * scale + 2;\n const outData = new Uint8Array(size * size);\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const i = iy * w + ix;\n if (maskData[i] === 0) continue;\n const lx = ix * scale + 1;\n const ly = iy * scale + 1;\n const top = iy === 0 || maskData[i - w] === 0;\n const bottom = iy === h - 1 || maskData[i + w] === 0;\n const left = ix === 0 || maskData[i - 1] === 0;\n const right = ix === w - 1 || maskData[i + 1] === 0;\n const topLeft = iy === 0 || ix === 0 || maskData[i - w - 1] === 0;\n const topRight = iy === 0 || ix === w - 1 || maskData[i - w + 1] === 0;\n const bottomLeft = iy === h - 1 || ix === 0 || maskData[i + w - 1] === 0;\n const bottomRight = iy === h - 1 || ix === w - 1 || maskData[i + w + 1] === 0;\n if (top) {\n for (let sx = 0; sx < scale; sx++) {\n const outIdx = (ly - 1) * size + (lx + sx);\n outData[outIdx] = 1;\n }\n }\n if (bottom) {\n for (let sx = 0; sx < scale; sx++) {\n const outIdx = (ly + scale) * size + (lx + sx);\n outData[outIdx] = 1;\n }\n }\n if (left) {\n for (let sy = 0; sy < scale; sy++) {\n const outIdx = (ly + sy) * size + (lx - 1);\n outData[outIdx] = 1;\n }\n }\n if (right) {\n for (let sy = 0; sy < scale; sy++) {\n const outIdx = (ly + sy) * size + (lx + scale);\n outData[outIdx] = 1;\n }\n }\n if (topLeft) {\n const outIdx = (ly - 1) * size + (lx - 1);\n outData[outIdx] = 1;\n }\n if (topRight) {\n const outIdx = (ly - 1) * size + (lx + scale);\n outData[outIdx] = 1;\n }\n if (bottomLeft) {\n const outIdx = (ly + scale) * size + (lx - 1);\n outData[outIdx] = 1;\n }\n if (bottomRight) {\n const outIdx = (ly + scale) * size + (lx + scale);\n outData[outIdx] = 1;\n }\n }\n }\n return {\n type: MaskType.BINARY,\n w: size,\n h: size,\n data: outData\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL19tYXNrLXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQmluYXJ5TWFza091dGxpbmUobWFzazogQmluYXJ5TWFzaywgc2NhbGUgPSAxKTogQmluYXJ5TWFzayB7XG4gIGNvbnN0IHcgPSBtYXNrLnc7XG4gIGNvbnN0IGggPSBtYXNrLmg7XG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhO1xuICBjb25zdCBzaXplID0gdyAqIHNjYWxlICsgMjtcbiAgY29uc3Qgb3V0RGF0YSA9IG5ldyBVaW50OEFycmF5KHNpemUgKiBzaXplKTtcbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgdzsgaXgrKykge1xuICAgICAgY29uc3QgaSA9IGl5ICogdyArIGl4O1xuICAgICAgaWYgKG1hc2tEYXRhW2ldID09PSAwKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IGx4ID0gaXggKiBzY2FsZSArIDE7XG4gICAgICBjb25zdCBseSA9IGl5ICogc2NhbGUgKyAxO1xuICAgICAgY29uc3QgdG9wID0gaXkgPT09IDAgfHwgbWFza0RhdGFbaSAtIHddID09PSAwO1xuICAgICAgY29uc3QgYm90dG9tID0gaXkgPT09IGggLSAxIHx8IG1hc2tEYXRhW2kgKyB3XSA9PT0gMDtcbiAgICAgIGNvbnN0IGxlZnQgPSBpeCA9PT0gMCB8fCBtYXNrRGF0YVtpIC0gMV0gPT09IDA7XG4gICAgICBjb25zdCByaWdodCA9IGl4ID09PSB3IC0gMSB8fCBtYXNrRGF0YVtpICsgMV0gPT09IDA7XG4gICAgICBjb25zdCB0b3BMZWZ0ID0gaXkgPT09IDAgfHwgaXggPT09IDAgfHwgbWFza0RhdGFbaSAtIHcgLSAxXSA9PT0gMDtcbiAgICAgIGNvbnN0IHRvcFJpZ2h0ID0gaXkgPT09IDAgfHwgaXggPT09IHcgLSAxIHx8IG1hc2tEYXRhW2kgLSB3ICsgMV0gPT09IDA7XG4gICAgICBjb25zdCBib3R0b21MZWZ0ID0gaXkgPT09IGggLSAxIHx8IGl4ID09PSAwIHx8IG1hc2tEYXRhW2kgKyB3IC0gMV0gPT09IDA7XG4gICAgICBjb25zdCBib3R0b21SaWdodCA9IGl5ID09PSBoIC0gMSB8fCBpeCA9PT0gdyAtIDEgfHwgbWFza0RhdGFbaSArIHcgKyAxXSA9PT0gMDtcbiAgICAgIGlmICh0b3ApIHtcbiAgICAgICAgZm9yIChsZXQgc3ggPSAwOyBzeCA8IHNjYWxlOyBzeCsrKSB7XG4gICAgICAgICAgY29uc3Qgb3V0SWR4ID0gKGx5IC0gMSkgKiBzaXplICsgKGx4ICsgc3gpO1xuICAgICAgICAgIG91dERhdGFbb3V0SWR4XSA9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChib3R0b20pIHtcbiAgICAgICAgZm9yIChsZXQgc3ggPSAwOyBzeCA8IHNjYWxlOyBzeCsrKSB7XG4gICAgICAgICAgY29uc3Qgb3V0SWR4ID0gKGx5ICsgc2NhbGUpICogc2l6ZSArIChseCArIHN4KTtcbiAgICAgICAgICBvdXREYXRhW291dElkeF0gPSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAobGVmdCkge1xuICAgICAgICBmb3IgKGxldCBzeSA9IDA7IHN5IDwgc2NhbGU7IHN5KyspIHtcbiAgICAgICAgICBjb25zdCBvdXRJZHggPSAobHkgKyBzeSkgKiBzaXplICsgKGx4IC0gMSk7XG4gICAgICAgICAgb3V0RGF0YVtvdXRJZHhdID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJpZ2h0KSB7XG4gICAgICAgIGZvciAobGV0IHN5ID0gMDsgc3kgPCBzY2FsZTsgc3krKykge1xuICAgICAgICAgIGNvbnN0IG91dElkeCA9IChseSArIHN5KSAqIHNpemUgKyAobHggKyBzY2FsZSk7XG4gICAgICAgICAgb3V0RGF0YVtvdXRJZHhdID0gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRvcExlZnQpIHtcbiAgICAgICAgY29uc3Qgb3V0SWR4ID0gKGx5IC0gMSkgKiBzaXplICsgKGx4IC0gMSk7XG4gICAgICAgIG91dERhdGFbb3V0SWR4XSA9IDE7XG4gICAgICB9XG4gICAgICBpZiAodG9wUmlnaHQpIHtcbiAgICAgICAgY29uc3Qgb3V0SWR4ID0gKGx5IC0gMSkgKiBzaXplICsgKGx4ICsgc2NhbGUpO1xuICAgICAgICBvdXREYXRhW291dElkeF0gPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGJvdHRvbUxlZnQpIHtcbiAgICAgICAgY29uc3Qgb3V0SWR4ID0gKGx5ICsgc2NhbGUpICogc2l6ZSArIChseCAtIDEpO1xuICAgICAgICBvdXREYXRhW291dElkeF0gPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGJvdHRvbVJpZ2h0KSB7XG4gICAgICAgIGNvbnN0IG91dElkeCA9IChseSArIHNjYWxlKSAqIHNpemUgKyAobHggKyBzY2FsZSk7XG4gICAgICAgIG91dERhdGFbb3V0SWR4XSA9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIHc6IHNpemUsXG4gICAgaDogc2l6ZSxcbiAgICBkYXRhOiBvdXREYXRhXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_mask-types';\nexport function makeCircleBinaryMaskOutline(size: number, scale: number): BinaryMask {\n const outSize = size * scale + 2;\n const outArea = outSize * outSize;\n const data = new Uint8Array(outArea);\n const radius = size / 2;\n const r2 = radius * radius;\n let prevMinX = -1;\n let prevMaxX = -1;\n let currMinX = -1;\n let currMaxX = -1;\n const initialDy = 0 - radius + 0.5;\n const initialDy2 = initialDy * initialDy;\n if (initialDy2 <= r2) {\n const dx = Math.sqrt(r2 - initialDy2);\n currMinX = Math.ceil(radius - 0.5 - dx);\n currMaxX = Math.floor(radius - 0.5 + dx);\n }\n for (let iy = 0; iy < size; iy++) {\n let nextMinX = -1;\n let nextMaxX = -1;\n if (iy + 1 < size) {\n const ny = iy + 1 - radius + 0.5;\n const ny2 = ny * ny;\n if (ny2 <= r2) {\n const dx = Math.sqrt(r2 - ny2);\n nextMinX = Math.ceil(radius - 0.5 - dx);\n nextMaxX = Math.floor(radius - 0.5 + dx);\n }\n }\n if (currMinX !== -1) {\n for (let ix = currMinX; ix <= currMaxX; ix++) {\n // Offset by 1 to leave room for the top/left outline edges\n const sx = ix * scale + 1;\n const sy = iy * scale + 1;\n const isTop = prevMinX === -1 || ix < prevMinX || ix > prevMaxX;\n const isBottom = nextMinX === -1 || ix < nextMinX || ix > nextMaxX;\n const isLeft = ix === currMinX;\n const isRight = ix === currMaxX;\n if (isTop) {\n const leftOut = prevMinX === -1 || ix - 1 < prevMinX || ix - 1 > prevMaxX;\n const rightOut = prevMinX === -1 || ix + 1 < prevMinX || ix + 1 > prevMaxX;\n const startX = leftOut ? sx - 1 : sx;\n const endX = rightOut ? sx + scale : sx + scale - 1;\n for (let x = startX; x <= endX; x++) {\n const index = (sy - 1) * outSize + x;\n data[index] = 1;\n }\n }\n if (isBottom) {\n const leftOut = nextMinX === -1 || ix - 1 < nextMinX || ix - 1 > nextMaxX;\n const rightOut = nextMinX === -1 || ix + 1 < nextMinX || ix + 1 > nextMaxX;\n const startX = leftOut ? sx - 1 : sx;\n const endX = rightOut ? sx + scale : sx + scale - 1;\n for (let x = startX; x <= endX; x++) {\n const index = (sy + scale) * outSize + x;\n data[index] = 1;\n }\n }\n if (isLeft) {\n for (let y = sy; y < sy + scale; y++) {\n const index = y * outSize + (sx - 1);\n data[index] = 1;\n }\n }\n if (isRight) {\n for (let y = sy; y < sy + scale; y++) {\n const index = y * outSize + (sx + scale);\n data[index] = 1;\n }\n }\n }\n }\n prevMinX = currMinX;\n prevMaxX = currMaxX;\n currMinX = nextMinX;\n currMaxX = nextMaxX;\n }\n return {\n type: MaskType.BINARY,\n w: outSize,\n h: outSize,\n data\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL19tYXNrLXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2lyY2xlQmluYXJ5TWFza091dGxpbmUoc2l6ZTogbnVtYmVyLCBzY2FsZTogbnVtYmVyKTogQmluYXJ5TWFzayB7XG4gIGNvbnN0IG91dFNpemUgPSBzaXplICogc2NhbGUgKyAyO1xuICBjb25zdCBvdXRBcmVhID0gb3V0U2l6ZSAqIG91dFNpemU7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShvdXRBcmVhKTtcbiAgY29uc3QgcmFkaXVzID0gc2l6ZSAvIDI7XG4gIGNvbnN0IHIyID0gcmFkaXVzICogcmFkaXVzO1xuICBsZXQgcHJldk1pblggPSAtMTtcbiAgbGV0IHByZXZNYXhYID0gLTE7XG4gIGxldCBjdXJyTWluWCA9IC0xO1xuICBsZXQgY3Vyck1heFggPSAtMTtcbiAgY29uc3QgaW5pdGlhbER5ID0gMCAtIHJhZGl1cyArIDAuNTtcbiAgY29uc3QgaW5pdGlhbER5MiA9IGluaXRpYWxEeSAqIGluaXRpYWxEeTtcbiAgaWYgKGluaXRpYWxEeTIgPD0gcjIpIHtcbiAgICBjb25zdCBkeCA9IE1hdGguc3FydChyMiAtIGluaXRpYWxEeTIpO1xuICAgIGN1cnJNaW5YID0gTWF0aC5jZWlsKHJhZGl1cyAtIDAuNSAtIGR4KTtcbiAgICBjdXJyTWF4WCA9IE1hdGguZmxvb3IocmFkaXVzIC0gMC41ICsgZHgpO1xuICB9XG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBzaXplOyBpeSsrKSB7XG4gICAgbGV0IG5leHRNaW5YID0gLTE7XG4gICAgbGV0IG5leHRNYXhYID0gLTE7XG4gICAgaWYgKGl5ICsgMSA8IHNpemUpIHtcbiAgICAgIGNvbnN0IG55ID0gaXkgKyAxIC0gcmFkaXVzICsgMC41O1xuICAgICAgY29uc3QgbnkyID0gbnkgKiBueTtcbiAgICAgIGlmIChueTIgPD0gcjIpIHtcbiAgICAgICAgY29uc3QgZHggPSBNYXRoLnNxcnQocjIgLSBueTIpO1xuICAgICAgICBuZXh0TWluWCA9IE1hdGguY2VpbChyYWRpdXMgLSAwLjUgLSBkeCk7XG4gICAgICAgIG5leHRNYXhYID0gTWF0aC5mbG9vcihyYWRpdXMgLSAwLjUgKyBkeCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyTWluWCAhPT0gLTEpIHtcbiAgICAgIGZvciAobGV0IGl4ID0gY3Vyck1pblg7IGl4IDw9IGN1cnJNYXhYOyBpeCsrKSB7XG4gICAgICAgIC8vIE9mZnNldCBieSAxIHRvIGxlYXZlIHJvb20gZm9yIHRoZSB0b3AvbGVmdCBvdXRsaW5lIGVkZ2VzXG4gICAgICAgIGNvbnN0IHN4ID0gaXggKiBzY2FsZSArIDE7XG4gICAgICAgIGNvbnN0IHN5ID0gaXkgKiBzY2FsZSArIDE7XG4gICAgICAgIGNvbnN0IGlzVG9wID0gcHJldk1pblggPT09IC0xIHx8IGl4IDwgcHJldk1pblggfHwgaXggPiBwcmV2TWF4WDtcbiAgICAgICAgY29uc3QgaXNCb3R0b20gPSBuZXh0TWluWCA9PT0gLTEgfHwgaXggPCBuZXh0TWluWCB8fCBpeCA+IG5leHRNYXhYO1xuICAgICAgICBjb25zdCBpc0xlZnQgPSBpeCA9PT0gY3Vyck1pblg7XG4gICAgICAgIGNvbnN0IGlzUmlnaHQgPSBpeCA9PT0gY3Vyck1heFg7XG4gICAgICAgIGlmIChpc1RvcCkge1xuICAgICAgICAgIGNvbnN0IGxlZnRPdXQgPSBwcmV2TWluWCA9PT0gLTEgfHwgaXggLSAxIDwgcHJldk1pblggfHwgaXggLSAxID4gcHJldk1heFg7XG4gICAgICAgICAgY29uc3QgcmlnaHRPdXQgPSBwcmV2TWluWCA9PT0gLTEgfHwgaXggKyAxIDwgcHJldk1pblggfHwgaXggKyAxID4gcHJldk1heFg7XG4gICAgICAgICAgY29uc3Qgc3RhcnRYID0gbGVmdE91dCA/IHN4IC0gMSA6IHN4O1xuICAgICAgICAgIGNvbnN0IGVuZFggPSByaWdodE91dCA/IHN4ICsgc2NhbGUgOiBzeCArIHNjYWxlIC0gMTtcbiAgICAgICAgICBmb3IgKGxldCB4ID0gc3RhcnRYOyB4IDw9IGVuZFg7IHgrKykge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSAoc3kgLSAxKSAqIG91dFNpemUgKyB4O1xuICAgICAgICAgICAgZGF0YVtpbmRleF0gPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNCb3R0b20pIHtcbiAgICAgICAgICBjb25zdCBsZWZ0T3V0ID0gbmV4dE1pblggPT09IC0xIHx8IGl4IC0gMSA8IG5leHRNaW5YIHx8IGl4IC0gMSA+IG5leHRNYXhYO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0T3V0ID0gbmV4dE1pblggPT09IC0xIHx8IGl4ICsgMSA8IG5leHRNaW5YIHx8IGl4ICsgMSA+IG5leHRNYXhYO1xuICAgICAgICAgIGNvbnN0IHN0YXJ0WCA9IGxlZnRPdXQgPyBzeCAtIDEgOiBzeDtcbiAgICAgICAgICBjb25zdCBlbmRYID0gcmlnaHRPdXQgPyBzeCArIHNjYWxlIDogc3ggKyBzY2FsZSAtIDE7XG4gICAgICAgICAgZm9yIChsZXQgeCA9IHN0YXJ0WDsgeCA8PSBlbmRYOyB4KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKHN5ICsgc2NhbGUpICogb3V0U2l6ZSArIHg7XG4gICAgICAgICAgICBkYXRhW2luZGV4XSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpc0xlZnQpIHtcbiAgICAgICAgICBmb3IgKGxldCB5ID0gc3k7IHkgPCBzeSArIHNjYWxlOyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0geSAqIG91dFNpemUgKyAoc3ggLSAxKTtcbiAgICAgICAgICAgIGRhdGFbaW5kZXhdID0gMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzUmlnaHQpIHtcbiAgICAgICAgICBmb3IgKGxldCB5ID0gc3k7IHkgPCBzeSArIHNjYWxlOyB5KyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0geSAqIG91dFNpemUgKyAoc3ggKyBzY2FsZSk7XG4gICAgICAgICAgICBkYXRhW2luZGV4XSA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXZNaW5YID0gY3Vyck1pblg7XG4gICAgcHJldk1heFggPSBjdXJyTWF4WDtcbiAgICBjdXJyTWluWCA9IG5leHRNaW5YO1xuICAgIGN1cnJNYXhYID0gbmV4dE1heFg7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUlksXG4gICAgdzogb3V0U2l6ZSxcbiAgICBoOiBvdXRTaXplLFxuICAgIGRhdGFcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_mask-types';\nexport function makeRectBinaryMaskOutline(w: number, h: number, scale = 1): BinaryMask {\n const rw = w * scale;\n const rh = h * scale;\n const outW = rw + 2;\n const outH = rh + 2;\n const outData = new Uint8Array(outW * outH);\n\n // Top edge\n outData.fill(1, 0, outW);\n\n // Bottom edge\n outData.fill(1, (outH - 1) * outW, outH * outW);\n\n // Left and Right edges\n for (let iy = 1; iy < outH - 1; iy++) {\n const rowStart = iy * outW;\n outData[rowStart] = 1;\n outData[rowStart + outW - 1] = 1;\n }\n return {\n type: MaskType.BINARY,\n w: outW,\n h: outH,\n data: outData\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL19tYXNrLXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVjdEJpbmFyeU1hc2tPdXRsaW5lKHc6IG51bWJlciwgaDogbnVtYmVyLCBzY2FsZSA9IDEpOiBCaW5hcnlNYXNrIHtcbiAgY29uc3QgcncgPSB3ICogc2NhbGU7XG4gIGNvbnN0IHJoID0gaCAqIHNjYWxlO1xuICBjb25zdCBvdXRXID0gcncgKyAyO1xuICBjb25zdCBvdXRIID0gcmggKyAyO1xuICBjb25zdCBvdXREYXRhID0gbmV3IFVpbnQ4QXJyYXkob3V0VyAqIG91dEgpO1xuXG4gIC8vIFRvcCBlZGdlXG4gIG91dERhdGEuZmlsbCgxLCAwLCBvdXRXKTtcblxuICAvLyBCb3R0b20gZWRnZVxuICBvdXREYXRhLmZpbGwoMSwgKG91dEggLSAxKSAqIG91dFcsIG91dEggKiBvdXRXKTtcblxuICAvLyBMZWZ0IGFuZCBSaWdodCBlZGdlc1xuICBmb3IgKGxldCBpeSA9IDE7IGl5IDwgb3V0SCAtIDE7IGl5KyspIHtcbiAgICBjb25zdCByb3dTdGFydCA9IGl5ICogb3V0VztcbiAgICBvdXREYXRhW3Jvd1N0YXJ0XSA9IDE7XG4gICAgb3V0RGF0YVtyb3dTdGFydCArIG91dFcgLSAxXSA9IDE7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUlksXG4gICAgdzogb3V0VyxcbiAgICBoOiBvdXRILFxuICAgIGRhdGE6IG91dERhdGFcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Mask } from './_mask-types';\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 Mask>(src: T): T {\n return {\n type: src.type,\n data: src.data.slice(),\n w: src.w,\n h: src.h\n } as T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1hc2sgfSBmcm9tICcuL19tYXNrLXR5cGVzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IGNvcHkgb2YgYSBtYXNrLlxuICogVXNlcyB0aGUgdW5kZXJseWluZyBidWZmZXIncyBzbGljZSBtZXRob2QgZm9yIGhpZ2gtcGVyZm9ybWFuY2UgbWVtb3J5IGNvcHlpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5TWFzazxUIGV4dGVuZHMgTWFzaz4oc3JjOiBUKTogVCB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogc3JjLnR5cGUsXG4gICAgZGF0YTogc3JjLmRhdGEuc2xpY2UoKSxcbiAgICB3OiBzcmMudyxcbiAgICBoOiBzcmMuaFxuICB9IGFzIFQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Mask } from './_mask-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 target mask.\n * @param rect - A rect defining the region to extract.\n * @returns A new mask containing the extracted region.\n */\nexport function extractMask<T extends Mask>(mask: T, rect: Rect): T;\n\n/**\n * @param mask - The target mask.\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<T extends Mask>(mask: T, x: number, y: number, w: number, h: number): T;\nexport function extractMask<T extends Mask>(mask: T, xOrRect: number | Rect, y?: number, w?: number, h?: number): T {\n let finalX: number;\n let finalY: number;\n let finalW: number;\n let finalH: number;\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 const out = {\n type: mask.type,\n w: finalW,\n h: finalH,\n data: new Uint8Array(finalW * finalH)\n } as T;\n\n // Calculate the total height of the source mask based on the buffer size\n const srcH = mask.h;\n const stride = mask.w;\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row;\n\n // Safety Check: If the requested row is outside the source mask, skip it (leave as 0)\n if (currentSrcY < 0 || currentSrcY >= srcH) continue;\n\n // Calculate valid horizontal range within the source stride\n // We only copy if srcX is within the actual bounds of the source width\n const start = Math.max(0, finalX);\n const end = Math.min(stride, finalX + finalW);\n if (start < end) {\n const srcOffset = currentSrcY * stride + start;\n const dstOffset = row * finalW + (start - finalX);\n const count = end - start;\n out.data.set(mask.data.subarray(srcOffset, srcOffset + count), dstOffset);\n }\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE1hc2sgfSBmcm9tICcuL19tYXNrLXR5cGVzJztcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBmcm9tIGEgMUQge0BsaW5rIFVpbnQ4QXJyYXl9IG1hc2suXG4gKiBUaGlzIHV0aWxpdHkgY2FsY3VsYXRlcyB0aGUgbmVjZXNzYXJ5IG9mZnNldHMgYmFzZWQgb24gdGhlIGBtYXNrV2lkdGhgIHRvXG4gKiBzbGljZSBvdXQgYSBzcGVjaWZpYyBhcmVhLlxuICpcbiAqIEBwYXJhbSBtYXNrIC0gVGhlIHRhcmdldCBtYXNrLlxuICogQHBhcmFtIHJlY3QgLSBBIHJlY3QgZGVmaW5pbmcgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHJldHVybnMgQSBuZXcgbWFzayBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hc2s8VCBleHRlbmRzIE1hc2s+KG1hc2s6IFQsIHJlY3Q6IFJlY3QpOiBUO1xuXG4vKipcbiAqIEBwYXJhbSBtYXNrIC0gVGhlIHRhcmdldCBtYXNrLlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHkgLSBUaGUgc3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBoIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIG5ldyB7QGxpbmsgVWludDhBcnJheX0gY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNYXNrPFQgZXh0ZW5kcyBNYXNrPihtYXNrOiBULCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiBUO1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RNYXNrPFQgZXh0ZW5kcyBNYXNrPihtYXNrOiBULCB4T3JSZWN0OiBudW1iZXIgfCBSZWN0LCB5PzogbnVtYmVyLCB3PzogbnVtYmVyLCBoPzogbnVtYmVyKTogVCB7XG4gIGxldCBmaW5hbFg6IG51bWJlcjtcbiAgbGV0IGZpbmFsWTogbnVtYmVyO1xuICBsZXQgZmluYWxXOiBudW1iZXI7XG4gIGxldCBmaW5hbEg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiB4T3JSZWN0ID09PSAnb2JqZWN0Jykge1xuICAgIGZpbmFsWCA9IHhPclJlY3QueDtcbiAgICBmaW5hbFkgPSB4T3JSZWN0Lnk7XG4gICAgZmluYWxXID0geE9yUmVjdC53O1xuICAgIGZpbmFsSCA9IHhPclJlY3QuaDtcbiAgfSBlbHNlIHtcbiAgICBmaW5hbFggPSB4T3JSZWN0O1xuICAgIGZpbmFsWSA9IHkhO1xuICAgIGZpbmFsVyA9IHchO1xuICAgIGZpbmFsSCA9IGghO1xuICB9XG4gIGNvbnN0IG91dCA9IHtcbiAgICB0eXBlOiBtYXNrLnR5cGUsXG4gICAgdzogZmluYWxXLFxuICAgIGg6IGZpbmFsSCxcbiAgICBkYXRhOiBuZXcgVWludDhBcnJheShmaW5hbFcgKiBmaW5hbEgpXG4gIH0gYXMgVDtcblxuICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgc291cmNlIG1hc2sgYmFzZWQgb24gdGhlIGJ1ZmZlciBzaXplXG4gIGNvbnN0IHNyY0ggPSBtYXNrLmg7XG4gIGNvbnN0IHN0cmlkZSA9IG1hc2sudztcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZmluYWxIOyByb3crKykge1xuICAgIGNvbnN0IGN1cnJlbnRTcmNZID0gZmluYWxZICsgcm93O1xuXG4gICAgLy8gU2FmZXR5IENoZWNrOiBJZiB0aGUgcmVxdWVzdGVkIHJvdyBpcyBvdXRzaWRlIHRoZSBzb3VyY2UgbWFzaywgc2tpcCBpdCAobGVhdmUgYXMgMClcbiAgICBpZiAoY3VycmVudFNyY1kgPCAwIHx8IGN1cnJlbnRTcmNZID49IHNyY0gpIGNvbnRpbnVlO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHZhbGlkIGhvcml6b250YWwgcmFuZ2Ugd2l0aGluIHRoZSBzb3VyY2Ugc3RyaWRlXG4gICAgLy8gV2Ugb25seSBjb3B5IGlmIHNyY1ggaXMgd2l0aGluIHRoZSBhY3R1YWwgYm91bmRzIG9mIHRoZSBzb3VyY2Ugd2lkdGhcbiAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGZpbmFsWCk7XG4gICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RyaWRlLCBmaW5hbFggKyBmaW5hbFcpO1xuICAgIGlmIChzdGFydCA8IGVuZCkge1xuICAgICAgY29uc3Qgc3JjT2Zmc2V0ID0gY3VycmVudFNyY1kgKiBzdHJpZGUgKyBzdGFydDtcbiAgICAgIGNvbnN0IGRzdE9mZnNldCA9IHJvdyAqIGZpbmFsVyArIChzdGFydCAtIGZpbmFsWCk7XG4gICAgICBjb25zdCBjb3VudCA9IGVuZCAtIHN0YXJ0O1xuICAgICAgb3V0LmRhdGEuc2V0KG1hc2suZGF0YS5zdWJhcnJheShzcmNPZmZzZXQsIHNyY09mZnNldCArIGNvdW50KSwgZHN0T2Zmc2V0KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Inverts a BinaryMask in-place.\n */\nexport function invertBinaryMask(dst: BinaryMask): void {\n const data = dst.data;\n const len = data.length;\n for (let i = 0; i < len; i++) {\n data[i] = data[i] === 0 ? 1 : 0;\n }\n}\n\n/**\n * Inverts an AlphaMask in-place.\n */\nexport function invertAlphaMask(dst: AlphaMask): void {\n const data = dst.data;\n const len = data.length;\n for (let i = 0; i < len; i++) {\n data[i] = 255 - data[i];\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludmVydHMgYSBCaW5hcnlNYXNrIGluLXBsYWNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0QmluYXJ5TWFzayhkc3Q6IEJpbmFyeU1hc2spOiB2b2lkIHtcbiAgY29uc3QgZGF0YSA9IGRzdC5kYXRhO1xuICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGRhdGFbaV0gPSBkYXRhW2ldID09PSAwID8gMSA6IDA7XG4gIH1cbn1cblxuLyoqXG4gKiBJbnZlcnRzIGFuIEFscGhhTWFzayBpbi1wbGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludmVydEFscGhhTWFzayhkc3Q6IEFscGhhTWFzayk6IHZvaWQge1xuICBjb25zdCBkYXRhID0gZHN0LmRhdGE7XG4gIGNvbnN0IGxlbiA9IGRhdGEubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgZGF0YVtpXSA9IDI1NSAtIGRhdGFbaV07XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Merges 2 alpha masks values are 0-255\n */\nexport function mergeAlphaMasks(dst: AlphaMask, src: AlphaMask, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n alpha: globalAlpha = 255,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n if (width <= 0) return;\n if (height <= 0) return;\n if (globalAlpha === 0) return;\n const dstData = dst.data;\n const srcData = src.data;\n const srcWidth = src.w;\n const dstWidth = dst.w;\n const startX = Math.max(0, -targetX, -mx);\n const startY = Math.max(0, -targetY, -my);\n const endX = Math.min(width, dstWidth - targetX, srcWidth - mx);\n const endY = Math.min(height, dst.h - targetY, src.h - my);\n if (startX >= endX) return;\n if (startY >= endY) return;\n for (let iy = startY; iy < endY; iy++) {\n const dy = targetY + iy;\n const sy = my + iy;\n let dIdx = dy * dstWidth + targetX + startX;\n let sIdx = sy * srcWidth + mx + startX;\n for (let ix = startX; ix < endX; ix++) {\n const rawM = srcData[sIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - rawM : rawM;\n let weight = 0;\n if (effectiveM === 0) {\n weight = 0;\n } else if (effectiveM === 255) {\n weight = globalAlpha;\n } else if (globalAlpha === 255) {\n weight = effectiveM;\n } else {\n const t = effectiveM * globalAlpha + 128;\n weight = t + (t >> 8) >> 8;\n }\n if (weight !== 255) {\n if (weight === 0) {\n dstData[dIdx] = 0;\n } else {\n const da = dstData[dIdx];\n if (da === 255) {\n dstData[dIdx] = weight;\n } else if (da !== 0) {\n const t = da * weight + 128;\n dstData[dIdx] = t + (t >> 8) >> 8;\n }\n }\n }\n sIdx++;\n dIdx++;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lcmdlcyAyIGFscGhhIG1hc2tzIHZhbHVlcyBhcmUgMC0yNTVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQWxwaGFNYXNrcyhkc3Q6IEFscGhhTWFzaywgc3JjOiBBbHBoYU1hc2ssIG9wdHM6IE1lcmdlQWxwaGFNYXNrc09wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gMCxcbiAgICBoOiBoZWlnaHQgPSAwLFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBteCA9IDAsXG4gICAgbXkgPSAwLFxuICAgIGludmVydE1hc2sgPSBmYWxzZVxuICB9ID0gb3B0cztcbiAgaWYgKHdpZHRoIDw9IDApIHJldHVybjtcbiAgaWYgKGhlaWdodCA8PSAwKSByZXR1cm47XG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBkc3REYXRhID0gZHN0LmRhdGE7XG4gIGNvbnN0IHNyY0RhdGEgPSBzcmMuZGF0YTtcbiAgY29uc3Qgc3JjV2lkdGggPSBzcmMudztcbiAgY29uc3QgZHN0V2lkdGggPSBkc3QudztcbiAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoMCwgLXRhcmdldFgsIC1teCk7XG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KDAsIC10YXJnZXRZLCAtbXkpO1xuICBjb25zdCBlbmRYID0gTWF0aC5taW4od2lkdGgsIGRzdFdpZHRoIC0gdGFyZ2V0WCwgc3JjV2lkdGggLSBteCk7XG4gIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihoZWlnaHQsIGRzdC5oIC0gdGFyZ2V0WSwgc3JjLmggLSBteSk7XG4gIGlmIChzdGFydFggPj0gZW5kWCkgcmV0dXJuO1xuICBpZiAoc3RhcnRZID49IGVuZFkpIHJldHVybjtcbiAgZm9yIChsZXQgaXkgPSBzdGFydFk7IGl5IDwgZW5kWTsgaXkrKykge1xuICAgIGNvbnN0IGR5ID0gdGFyZ2V0WSArIGl5O1xuICAgIGNvbnN0IHN5ID0gbXkgKyBpeTtcbiAgICBsZXQgZElkeCA9IGR5ICogZHN0V2lkdGggKyB0YXJnZXRYICsgc3RhcnRYO1xuICAgIGxldCBzSWR4ID0gc3kgKiBzcmNXaWR0aCArIG14ICsgc3RhcnRYO1xuICAgIGZvciAobGV0IGl4ID0gc3RhcnRYOyBpeCA8IGVuZFg7IGl4KyspIHtcbiAgICAgIGNvbnN0IHJhd00gPSBzcmNEYXRhW3NJZHhdO1xuICAgICAgLy8gVW5pZmllZCBsb2dpYyBicmFuY2ggaW5zaWRlIHRoZSBob3QgcGF0aFxuICAgICAgY29uc3QgZWZmZWN0aXZlTSA9IGludmVydE1hc2sgPyAyNTUgLSByYXdNIDogcmF3TTtcbiAgICAgIGxldCB3ZWlnaHQgPSAwO1xuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoZWZmZWN0aXZlTSA9PT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IGdsb2JhbEFscGhhO1xuICAgICAgfSBlbHNlIGlmIChnbG9iYWxBbHBoYSA9PT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IGVmZmVjdGl2ZU07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB0ID0gZWZmZWN0aXZlTSAqIGdsb2JhbEFscGhhICsgMTI4O1xuICAgICAgICB3ZWlnaHQgPSB0ICsgKHQgPj4gOCkgPj4gODtcbiAgICAgIH1cbiAgICAgIGlmICh3ZWlnaHQgIT09IDI1NSkge1xuICAgICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgZHN0RGF0YVtkSWR4XSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGEgPSBkc3REYXRhW2RJZHhdO1xuICAgICAgICAgIGlmIChkYSA9PT0gMjU1KSB7XG4gICAgICAgICAgICBkc3REYXRhW2RJZHhdID0gd2VpZ2h0O1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBkYSAqIHdlaWdodCArIDEyODtcbiAgICAgICAgICAgIGRzdERhdGFbZElkeF0gPSB0ICsgKHQgPj4gOCkgPj4gODtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNJZHgrKztcbiAgICAgIGRJZHgrKztcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function mergeBinaryMasks(dst: BinaryMask, src: BinaryMask, opts: MergeAlphaMasksOptions): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n mx = 0,\n my = 0,\n invertMask = false\n } = opts;\n const dstData = dst.data;\n const srcData = src.data;\n const srcWidth = src.w;\n const dstWidth = dst.w;\n if (dstWidth <= 0) return;\n if (srcWidth <= 0) return;\n\n // 1. Destination Clipping\n let x = targetX;\n let y = targetY;\n let w = width;\n let h = height;\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n w = Math.min(w, dstWidth - x);\n h = Math.min(h, dst.h - y);\n if (w <= 0) return;\n if (h <= 0) return;\n\n // 2. Source Bounds Clipping (Double Clipping)\n const startX = mx + (x - targetX);\n const startY = my + (y - targetY);\n const sX0 = Math.max(0, startX);\n const sY0 = Math.max(0, startY);\n const sX1 = Math.min(srcWidth, startX + w);\n const sY1 = Math.min(src.h, startY + h);\n const finalW = sX1 - sX0;\n const finalH = sY1 - sY0;\n if (finalW <= 0) return;\n if (finalH <= 0) return;\n\n // 3. Coordinate Alignment\n const xShift = sX0 - startX;\n const yShift = sY0 - startY;\n const dStride = dstWidth - finalW;\n const sStride = srcWidth - finalW;\n let dIdx = (y + yShift) * dstWidth + (x + xShift);\n let sIdx = sY0 * srcWidth + sX0;\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = srcData[sIdx];\n // Determine if the source pixel effectively \"clears\" the destination\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0;\n if (isMaskedOut) {\n dstData[dIdx] = 0;\n }\n dIdx++;\n sIdx++;\n }\n dIdx += dStride;\n sIdx += sStride;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlNYXNrcyhkc3Q6IEJpbmFyeU1hc2ssIHNyYzogQmluYXJ5TWFzaywgb3B0czogTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyk6IHZvaWQge1xuICBjb25zdCB7XG4gICAgeDogdGFyZ2V0WCA9IDAsXG4gICAgeTogdGFyZ2V0WSA9IDAsXG4gICAgdzogd2lkdGggPSAwLFxuICAgIGg6IGhlaWdodCA9IDAsXG4gICAgbXggPSAwLFxuICAgIG15ID0gMCxcbiAgICBpbnZlcnRNYXNrID0gZmFsc2VcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGRzdERhdGEgPSBkc3QuZGF0YTtcbiAgY29uc3Qgc3JjRGF0YSA9IHNyYy5kYXRhO1xuICBjb25zdCBzcmNXaWR0aCA9IHNyYy53O1xuICBjb25zdCBkc3RXaWR0aCA9IGRzdC53O1xuICBpZiAoZHN0V2lkdGggPD0gMCkgcmV0dXJuO1xuICBpZiAoc3JjV2lkdGggPD0gMCkgcmV0dXJuO1xuXG4gIC8vIDEuIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WDtcbiAgbGV0IHkgPSB0YXJnZXRZO1xuICBsZXQgdyA9IHdpZHRoO1xuICBsZXQgaCA9IGhlaWdodDtcbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4O1xuICAgIHggPSAwO1xuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geTtcbiAgICB5ID0gMDtcbiAgfVxuICB3ID0gTWF0aC5taW4odywgZHN0V2lkdGggLSB4KTtcbiAgaCA9IE1hdGgubWluKGgsIGRzdC5oIC0geSk7XG4gIGlmICh3IDw9IDApIHJldHVybjtcbiAgaWYgKGggPD0gMCkgcmV0dXJuO1xuXG4gIC8vIDIuIFNvdXJjZSBCb3VuZHMgQ2xpcHBpbmcgKERvdWJsZSBDbGlwcGluZylcbiAgY29uc3Qgc3RhcnRYID0gbXggKyAoeCAtIHRhcmdldFgpO1xuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSk7XG4gIGNvbnN0IHNYMCA9IE1hdGgubWF4KDAsIHN0YXJ0WCk7XG4gIGNvbnN0IHNZMCA9IE1hdGgubWF4KDAsIHN0YXJ0WSk7XG4gIGNvbnN0IHNYMSA9IE1hdGgubWluKHNyY1dpZHRoLCBzdGFydFggKyB3KTtcbiAgY29uc3Qgc1kxID0gTWF0aC5taW4oc3JjLmgsIHN0YXJ0WSArIGgpO1xuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDA7XG4gIGNvbnN0IGZpbmFsSCA9IHNZMSAtIHNZMDtcbiAgaWYgKGZpbmFsVyA8PSAwKSByZXR1cm47XG4gIGlmIChmaW5hbEggPD0gMCkgcmV0dXJuO1xuXG4gIC8vIDMuIENvb3JkaW5hdGUgQWxpZ25tZW50XG4gIGNvbnN0IHhTaGlmdCA9IHNYMCAtIHN0YXJ0WDtcbiAgY29uc3QgeVNoaWZ0ID0gc1kwIC0gc3RhcnRZO1xuICBjb25zdCBkU3RyaWRlID0gZHN0V2lkdGggLSBmaW5hbFc7XG4gIGNvbnN0IHNTdHJpZGUgPSBzcmNXaWR0aCAtIGZpbmFsVztcbiAgbGV0IGRJZHggPSAoeSArIHlTaGlmdCkgKiBkc3RXaWR0aCArICh4ICsgeFNoaWZ0KTtcbiAgbGV0IHNJZHggPSBzWTAgKiBzcmNXaWR0aCArIHNYMDtcbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGZpbmFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBmaW5hbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBzcmNEYXRhW3NJZHhdO1xuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBzb3VyY2UgcGl4ZWwgZWZmZWN0aXZlbHkgXCJjbGVhcnNcIiB0aGUgZGVzdGluYXRpb25cbiAgICAgIGNvbnN0IGlzTWFza2VkT3V0ID0gaW52ZXJ0TWFzayA/IG1WYWwgIT09IDAgOiBtVmFsID09PSAwO1xuICAgICAgaWYgKGlzTWFza2VkT3V0KSB7XG4gICAgICAgIGRzdERhdGFbZElkeF0gPSAwO1xuICAgICAgfVxuICAgICAgZElkeCsrO1xuICAgICAgc0lkeCsrO1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGU7XG4gICAgc0lkeCArPSBzU3RyaWRlO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","export function setMaskData(mask: Mask, width: number, height: number, data: Uint8Array): void {\n ;\n (mask as any).w = width;\n (mask as any).h = height;\n (mask as any).data = data;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gc2V0TWFza0RhdGEobWFzazogTWFzaywgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IFVpbnQ4QXJyYXkpOiB2b2lkIHtcbiAgO1xuICAobWFzayBhcyBhbnkpLncgPSB3aWR0aDtcbiAgKG1hc2sgYXMgYW55KS5oID0gaGVpZ2h0O1xuICAobWFzayBhcyBhbnkpLmRhdGEgPSBkYXRhO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Rect } from './_rect-types';\nexport function getRectsBounds<T extends Rect>(rects: T[]): T {\n if (rects.length === 1) return {\n ...rects[0]\n };\n let minX = Infinity,\n minY = Infinity;\n let maxX = -Infinity,\n maxY = -Infinity;\n for (let i = 0; i < rects.length; i++) {\n const r = rects[i];\n const x1 = r.x;\n const y1 = r.y;\n const x2 = x1 + r.w;\n const y2 = y1 + r.h;\n if (x1 < minX) minX = x1;\n if (y1 < minY) minY = y1;\n if (x2 > maxX) maxX = x2;\n if (y2 > maxY) maxY = y2;\n }\n return {\n x: minX,\n y: minY,\n w: maxX - minX,\n h: maxY - minY\n } as T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlY3QgfSBmcm9tICcuL19yZWN0LXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWN0c0JvdW5kczxUIGV4dGVuZHMgUmVjdD4ocmVjdHM6IFRbXSk6IFQge1xuICBpZiAocmVjdHMubGVuZ3RoID09PSAxKSByZXR1cm4ge1xuICAgIC4uLnJlY3RzWzBdXG4gIH07XG4gIGxldCBtaW5YID0gSW5maW5pdHksXG4gICAgbWluWSA9IEluZmluaXR5O1xuICBsZXQgbWF4WCA9IC1JbmZpbml0eSxcbiAgICBtYXhZID0gLUluZmluaXR5O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgciA9IHJlY3RzW2ldO1xuICAgIGNvbnN0IHgxID0gci54O1xuICAgIGNvbnN0IHkxID0gci55O1xuICAgIGNvbnN0IHgyID0geDEgKyByLnc7XG4gICAgY29uc3QgeTIgPSB5MSArIHIuaDtcbiAgICBpZiAoeDEgPCBtaW5YKSBtaW5YID0geDE7XG4gICAgaWYgKHkxIDwgbWluWSkgbWluWSA9IHkxO1xuICAgIGlmICh4MiA+IG1heFgpIG1heFggPSB4MjtcbiAgICBpZiAoeTIgPiBtYXhZKSBtYXhZID0geTI7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiBtaW5YLFxuICAgIHk6IG1pblksXG4gICAgdzogbWF4WCAtIG1pblgsXG4gICAgaDogbWF4WSAtIG1pbllcbiAgfSBhcyBUO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../Mask/_mask-types';\nimport { getRectsBounds } from '../Rect/getRectsBounds';\nexport function merge2BinaryMaskRects(a: NullableBinaryMaskRect, b: NullableBinaryMaskRect): NullableBinaryMaskRect {\n const bounds = getRectsBounds([a, b]);\n\n // If both are fully selected, check if they form a perfect, gapless rectangle\n if ((a.data === null || a.data === undefined) && (b.data === null || b.data === undefined)) {\n const ix = Math.max(a.x, b.x);\n const iy = Math.max(a.y, b.y);\n const ir = Math.min(a.x + a.w, b.x + b.w);\n const ib = Math.min(a.y + a.h, b.y + b.h);\n const iw = Math.max(0, ir - ix);\n const ih = Math.max(0, ib - iy);\n const intersectionArea = iw * ih;\n const areaA = a.w * a.h;\n const areaB = b.w * b.h;\n const boundsArea = bounds.w * bounds.h;\n if (boundsArea === areaA + areaB - intersectionArea) {\n return {\n ...bounds,\n data: null,\n type: null\n };\n }\n }\n const maskData = new Uint8Array(bounds.w * bounds.h);\n\n // --- Write A's contribution ---\n const aOffY = a.y - bounds.y;\n const aOffX = a.x - bounds.x;\n if (a.data === undefined || a.data === null) {\n for (let ay = 0; ay < a.h; ay++) {\n const destRow = (aOffY + ay) * bounds.w + aOffX;\n maskData.fill(1, destRow, destRow + a.w);\n }\n } else {\n for (let ay = 0; ay < a.h; ay++) {\n const srcRow = ay * a.w;\n const destRow = (aOffY + ay) * bounds.w + aOffX;\n maskData.set(a.data.subarray(srcRow, srcRow + a.w), destRow);\n }\n }\n\n // --- OR B's contribution ---\n const bOffY = b.y - bounds.y;\n const bOffX = b.x - bounds.x;\n if (b.data === undefined || b.data === null) {\n for (let by = 0; by < b.h; by++) {\n const destRow = (bOffY + by) * bounds.w + bOffX;\n maskData.fill(1, destRow, destRow + b.w);\n }\n } else {\n for (let by = 0; by < b.h; by++) {\n const srcRow = by * b.w;\n const destRow = (bOffY + by) * bounds.w + bOffX;\n for (let bx = 0; bx < b.w; bx++) {\n maskData[destRow + bx] |= b.data[srcRow + bx];\n }\n }\n }\n return {\n ...bounds,\n data: maskData,\n type: MaskType.BINARY\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgZ2V0UmVjdHNCb3VuZHMgfSBmcm9tICcuLi9SZWN0L2dldFJlY3RzQm91bmRzJztcbmV4cG9ydCBmdW5jdGlvbiBtZXJnZTJCaW5hcnlNYXNrUmVjdHMoYTogTnVsbGFibGVCaW5hcnlNYXNrUmVjdCwgYjogTnVsbGFibGVCaW5hcnlNYXNrUmVjdCk6IE51bGxhYmxlQmluYXJ5TWFza1JlY3Qge1xuICBjb25zdCBib3VuZHMgPSBnZXRSZWN0c0JvdW5kcyhbYSwgYl0pO1xuXG4gIC8vIElmIGJvdGggYXJlIGZ1bGx5IHNlbGVjdGVkLCBjaGVjayBpZiB0aGV5IGZvcm0gYSBwZXJmZWN0LCBnYXBsZXNzIHJlY3RhbmdsZVxuICBpZiAoKGEuZGF0YSA9PT0gbnVsbCB8fCBhLmRhdGEgPT09IHVuZGVmaW5lZCkgJiYgKGIuZGF0YSA9PT0gbnVsbCB8fCBiLmRhdGEgPT09IHVuZGVmaW5lZCkpIHtcbiAgICBjb25zdCBpeCA9IE1hdGgubWF4KGEueCwgYi54KTtcbiAgICBjb25zdCBpeSA9IE1hdGgubWF4KGEueSwgYi55KTtcbiAgICBjb25zdCBpciA9IE1hdGgubWluKGEueCArIGEudywgYi54ICsgYi53KTtcbiAgICBjb25zdCBpYiA9IE1hdGgubWluKGEueSArIGEuaCwgYi55ICsgYi5oKTtcbiAgICBjb25zdCBpdyA9IE1hdGgubWF4KDAsIGlyIC0gaXgpO1xuICAgIGNvbnN0IGloID0gTWF0aC5tYXgoMCwgaWIgLSBpeSk7XG4gICAgY29uc3QgaW50ZXJzZWN0aW9uQXJlYSA9IGl3ICogaWg7XG4gICAgY29uc3QgYXJlYUEgPSBhLncgKiBhLmg7XG4gICAgY29uc3QgYXJlYUIgPSBiLncgKiBiLmg7XG4gICAgY29uc3QgYm91bmRzQXJlYSA9IGJvdW5kcy53ICogYm91bmRzLmg7XG4gICAgaWYgKGJvdW5kc0FyZWEgPT09IGFyZWFBICsgYXJlYUIgLSBpbnRlcnNlY3Rpb25BcmVhKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5ib3VuZHMsXG4gICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgIHR5cGU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIGNvbnN0IG1hc2tEYXRhID0gbmV3IFVpbnQ4QXJyYXkoYm91bmRzLncgKiBib3VuZHMuaCk7XG5cbiAgLy8gLS0tIFdyaXRlIEEncyBjb250cmlidXRpb24gLS0tXG4gIGNvbnN0IGFPZmZZID0gYS55IC0gYm91bmRzLnk7XG4gIGNvbnN0IGFPZmZYID0gYS54IC0gYm91bmRzLng7XG4gIGlmIChhLmRhdGEgPT09IHVuZGVmaW5lZCB8fCBhLmRhdGEgPT09IG51bGwpIHtcbiAgICBmb3IgKGxldCBheSA9IDA7IGF5IDwgYS5oOyBheSsrKSB7XG4gICAgICBjb25zdCBkZXN0Um93ID0gKGFPZmZZICsgYXkpICogYm91bmRzLncgKyBhT2ZmWDtcbiAgICAgIG1hc2tEYXRhLmZpbGwoMSwgZGVzdFJvdywgZGVzdFJvdyArIGEudyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGF5ID0gMDsgYXkgPCBhLmg7IGF5KyspIHtcbiAgICAgIGNvbnN0IHNyY1JvdyA9IGF5ICogYS53O1xuICAgICAgY29uc3QgZGVzdFJvdyA9IChhT2ZmWSArIGF5KSAqIGJvdW5kcy53ICsgYU9mZlg7XG4gICAgICBtYXNrRGF0YS5zZXQoYS5kYXRhLnN1YmFycmF5KHNyY1Jvdywgc3JjUm93ICsgYS53KSwgZGVzdFJvdyk7XG4gICAgfVxuICB9XG5cbiAgLy8gLS0tIE9SIEIncyBjb250cmlidXRpb24gLS0tXG4gIGNvbnN0IGJPZmZZID0gYi55IC0gYm91bmRzLnk7XG4gIGNvbnN0IGJPZmZYID0gYi54IC0gYm91bmRzLng7XG4gIGlmIChiLmRhdGEgPT09IHVuZGVmaW5lZCB8fCBiLmRhdGEgPT09IG51bGwpIHtcbiAgICBmb3IgKGxldCBieSA9IDA7IGJ5IDwgYi5oOyBieSsrKSB7XG4gICAgICBjb25zdCBkZXN0Um93ID0gKGJPZmZZICsgYnkpICogYm91bmRzLncgKyBiT2ZmWDtcbiAgICAgIG1hc2tEYXRhLmZpbGwoMSwgZGVzdFJvdywgZGVzdFJvdyArIGIudyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGJ5ID0gMDsgYnkgPCBiLmg7IGJ5KyspIHtcbiAgICAgIGNvbnN0IHNyY1JvdyA9IGJ5ICogYi53O1xuICAgICAgY29uc3QgZGVzdFJvdyA9IChiT2ZmWSArIGJ5KSAqIGJvdW5kcy53ICsgYk9mZlg7XG4gICAgICBmb3IgKGxldCBieCA9IDA7IGJ4IDwgYi53OyBieCsrKSB7XG4gICAgICAgIG1hc2tEYXRhW2Rlc3RSb3cgKyBieF0gfD0gYi5kYXRhW3NyY1JvdyArIGJ4XTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5ib3VuZHMsXG4gICAgZGF0YTogbWFza0RhdGEsXG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { merge2BinaryMaskRects } from './merge2BinaryMaskRects';\nexport function mergeBinaryMaskRects(current: NullableBinaryMaskRect[], adding: NullableBinaryMaskRect[]): NullableBinaryMaskRect[] {\n const rects = [...current, ...adding];\n let changed = true;\n while (changed) {\n changed = false;\n const next: NullableBinaryMaskRect[] = [];\n for (const r of rects) {\n let merged = false;\n for (let i = 0; i < next.length; i++) {\n const n = next[i];\n const overlap = r.x <= n.x + n.w && r.x + r.w >= n.x && r.y <= n.y + n.h && r.y + r.h >= n.y;\n if (overlap) {\n next[i] = merge2BinaryMaskRects(n, r);\n merged = true;\n changed = true;\n break;\n }\n }\n if (!merged) next.push(r);\n }\n rects.splice(0, rects.length, ...next);\n }\n return rects;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtZXJnZTJCaW5hcnlNYXNrUmVjdHMgfSBmcm9tICcuL21lcmdlMkJpbmFyeU1hc2tSZWN0cyc7XG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VCaW5hcnlNYXNrUmVjdHMoY3VycmVudDogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdLCBhZGRpbmc6IE51bGxhYmxlQmluYXJ5TWFza1JlY3RbXSk6IE51bGxhYmxlQmluYXJ5TWFza1JlY3RbXSB7XG4gIGNvbnN0IHJlY3RzID0gWy4uLmN1cnJlbnQsIC4uLmFkZGluZ107XG4gIGxldCBjaGFuZ2VkID0gdHJ1ZTtcbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgbmV4dDogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHJlY3RzKSB7XG4gICAgICBsZXQgbWVyZ2VkID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5leHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgbiA9IG5leHRbaV07XG4gICAgICAgIGNvbnN0IG92ZXJsYXAgPSByLnggPD0gbi54ICsgbi53ICYmIHIueCArIHIudyA+PSBuLnggJiYgci55IDw9IG4ueSArIG4uaCAmJiByLnkgKyByLmggPj0gbi55O1xuICAgICAgICBpZiAob3ZlcmxhcCkge1xuICAgICAgICAgIG5leHRbaV0gPSBtZXJnZTJCaW5hcnlNYXNrUmVjdHMobiwgcik7XG4gICAgICAgICAgbWVyZ2VkID0gdHJ1ZTtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFtZXJnZWQpIG5leHQucHVzaChyKTtcbiAgICB9XG4gICAgcmVjdHMuc3BsaWNlKDAsIHJlY3RzLmxlbmd0aCwgLi4ubmV4dCk7XG4gIH1cbiAgcmV0dXJuIHJlY3RzO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../Mask/_mask-types';\nexport function subtractBinaryMaskRects(current: NullableBinaryMaskRect[], subtracting: NullableBinaryMaskRect[]): NullableBinaryMaskRect[] {\n let result = [...current];\n for (const sub of subtracting) {\n const next: NullableBinaryMaskRect[] = [];\n for (const r of result) {\n const ix = Math.max(r.x, sub.x);\n const iy = Math.max(r.y, sub.y);\n const ix2 = Math.min(r.x + r.w, sub.x + sub.w);\n const iy2 = Math.min(r.y + r.h, sub.y + sub.h);\n if (ix >= ix2 || iy >= iy2) {\n next.push(r);\n continue;\n }\n\n // Split r into up to 4 pieces around the intersection.\n // Extract directly from r.mask — no intermediate copy, no mutation.\n //\n // ┌──────────────┐\n // │ TOP │ r.y .. iy (full width)\n // ├────┬─────┬───┤\n // │LEFT│ sub │RGT│ iy .. iy2 (side strips)\n // ├────┴─────┴───┤\n // │ BOTTOM │ iy2 .. r.y+r.h (full width)\n // └──────────────┘\n\n if (r.y < iy) pushPiece(next, r, r.x, r.y, r.w, iy - r.y);\n if (iy2 < r.y + r.h) pushPiece(next, r, r.x, iy2, r.w, r.y + r.h - iy2);\n if (r.x < ix) pushPiece(next, r, r.x, iy, ix - r.x, iy2 - iy);\n if (ix2 < r.x + r.w) pushPiece(next, r, ix2, iy, r.x + r.w - ix2, iy2 - iy);\n }\n result = next;\n }\n return result;\n}\n\n/**\n * Extract sub-region (x, y, w, h) in global coords from r's mask and push\n * onto dest. If r.mask is null (fully selected) the piece is also null —\n * zero allocations on the happy path.\n */\nfunction pushPiece(dest: NullableBinaryMaskRect[], r: NullableBinaryMaskRect, x: number, y: number, w: number, h: number): void {\n if (r.data === null || r.data === undefined) {\n dest.push({\n x,\n y,\n w,\n h,\n data: null,\n type: null\n });\n return;\n }\n\n // Coords local to r.mask\n const lx = x - r.x;\n const ly = y - r.y;\n const data = new Uint8Array(w * h);\n for (let row = 0; row < h; row++) {\n data.set(r.data.subarray((ly + row) * r.w + lx, (ly + row) * r.w + lx + w), row * w);\n }\n dest.push({\n x,\n y,\n w,\n h,\n data,\n type: MaskType.BINARY\n });\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIHN1YnRyYWN0QmluYXJ5TWFza1JlY3RzKGN1cnJlbnQ6IE51bGxhYmxlQmluYXJ5TWFza1JlY3RbXSwgc3VidHJhY3Rpbmc6IE51bGxhYmxlQmluYXJ5TWFza1JlY3RbXSk6IE51bGxhYmxlQmluYXJ5TWFza1JlY3RbXSB7XG4gIGxldCByZXN1bHQgPSBbLi4uY3VycmVudF07XG4gIGZvciAoY29uc3Qgc3ViIG9mIHN1YnRyYWN0aW5nKSB7XG4gICAgY29uc3QgbmV4dDogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHJlc3VsdCkge1xuICAgICAgY29uc3QgaXggPSBNYXRoLm1heChyLngsIHN1Yi54KTtcbiAgICAgIGNvbnN0IGl5ID0gTWF0aC5tYXgoci55LCBzdWIueSk7XG4gICAgICBjb25zdCBpeDIgPSBNYXRoLm1pbihyLnggKyByLncsIHN1Yi54ICsgc3ViLncpO1xuICAgICAgY29uc3QgaXkyID0gTWF0aC5taW4oci55ICsgci5oLCBzdWIueSArIHN1Yi5oKTtcbiAgICAgIGlmIChpeCA+PSBpeDIgfHwgaXkgPj0gaXkyKSB7XG4gICAgICAgIG5leHQucHVzaChyKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFNwbGl0IHIgaW50byB1cCB0byA0IHBpZWNlcyBhcm91bmQgdGhlIGludGVyc2VjdGlvbi5cbiAgICAgIC8vIEV4dHJhY3QgZGlyZWN0bHkgZnJvbSByLm1hc2sg4oCUIG5vIGludGVybWVkaWF0ZSBjb3B5LCBubyBtdXRhdGlvbi5cbiAgICAgIC8vXG4gICAgICAvLyAgIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgICAgLy8gICDilIIgICAgIFRPUCAgICAgIOKUgiAgci55IC4uIGl5ICAgICAgKGZ1bGwgd2lkdGgpXG4gICAgICAvLyAgIOKUnOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUgOKUgOKUrOKUgOKUgOKUgOKUpFxuICAgICAgLy8gICDilIJMRUZU4pSCIHN1YiDilIJSR1TilIIgIGl5IC4uIGl5MiAgICAgIChzaWRlIHN0cmlwcylcbiAgICAgIC8vICAg4pSc4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSA4pSA4pS04pSA4pSA4pSA4pSkXG4gICAgICAvLyAgIOKUgiAgICBCT1RUT00gICAg4pSCICBpeTIgLi4gci55K3IuaCAoZnVsbCB3aWR0aClcbiAgICAgIC8vICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG5cbiAgICAgIGlmIChyLnkgPCBpeSkgcHVzaFBpZWNlKG5leHQsIHIsIHIueCwgci55LCByLncsIGl5IC0gci55KTtcbiAgICAgIGlmIChpeTIgPCByLnkgKyByLmgpIHB1c2hQaWVjZShuZXh0LCByLCByLngsIGl5Miwgci53LCByLnkgKyByLmggLSBpeTIpO1xuICAgICAgaWYgKHIueCA8IGl4KSBwdXNoUGllY2UobmV4dCwgciwgci54LCBpeSwgaXggLSByLngsIGl5MiAtIGl5KTtcbiAgICAgIGlmIChpeDIgPCByLnggKyByLncpIHB1c2hQaWVjZShuZXh0LCByLCBpeDIsIGl5LCByLnggKyByLncgLSBpeDIsIGl5MiAtIGl5KTtcbiAgICB9XG4gICAgcmVzdWx0ID0gbmV4dDtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgc3ViLXJlZ2lvbiAoeCwgeSwgdywgaCkgaW4gZ2xvYmFsIGNvb3JkcyBmcm9tIHIncyBtYXNrIGFuZCBwdXNoXG4gKiBvbnRvIGRlc3QuIElmIHIubWFzayBpcyBudWxsIChmdWxseSBzZWxlY3RlZCkgdGhlIHBpZWNlIGlzIGFsc28gbnVsbCDigJRcbiAqIHplcm8gYWxsb2NhdGlvbnMgb24gdGhlIGhhcHB5IHBhdGguXG4gKi9cbmZ1bmN0aW9uIHB1c2hQaWVjZShkZXN0OiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0W10sIHI6IE51bGxhYmxlQmluYXJ5TWFza1JlY3QsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQge1xuICBpZiAoci5kYXRhID09PSBudWxsIHx8IHIuZGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZGVzdC5wdXNoKHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgdyxcbiAgICAgIGgsXG4gICAgICBkYXRhOiBudWxsLFxuICAgICAgdHlwZTogbnVsbFxuICAgIH0pO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENvb3JkcyBsb2NhbCB0byByLm1hc2tcbiAgY29uc3QgbHggPSB4IC0gci54O1xuICBjb25zdCBseSA9IHkgLSByLnk7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheSh3ICogaCk7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGg7IHJvdysrKSB7XG4gICAgZGF0YS5zZXQoci5kYXRhLnN1YmFycmF5KChseSArIHJvdykgKiByLncgKyBseCwgKGx5ICsgcm93KSAqIHIudyArIGx4ICsgdyksIHJvdyAqIHcpO1xuICB9XG4gIGRlc3QucHVzaCh7XG4gICAgeCxcbiAgICB5LFxuICAgIHcsXG4gICAgaCxcbiAgICBkYXRhLFxuICAgIHR5cGU6IE1hc2tUeXBlLkJJTkFSWVxuICB9KTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { AlphaMask, BinaryMask } from '../Mask/_mask-types';\nexport enum PaintMaskOutline {\n MASKED,\n CIRCLE,\n RECT,\n}\ninterface BasePaintMask<T extends PaintMaskOutline = PaintMaskOutline> {\n readonly outlineType: T;\n readonly centerOffsetX: number;\n readonly centerOffsetY: number;\n}\nexport interface PaintAlphaMask<T extends PaintMaskOutline = PaintMaskOutline> extends BasePaintMask<T>, AlphaMask {}\nexport interface PaintBinaryMask<T extends PaintMaskOutline = PaintMaskOutline> extends BasePaintMask<T>, BinaryMask {}\nexport type PaintMask = PaintAlphaMask<any> | PaintBinaryMask<any>;\nexport type PaintBrush = PaintMask | PaintRect;\nexport interface PaintRect {\n type: null;\n readonly outlineType: PaintMaskOutline.RECT;\n w: number;\n h: number;\n centerOffsetX: number;\n centerOffsetY: number;\n data: null;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFscGhhTWFzaywgQmluYXJ5TWFzayB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuZXhwb3J0IGVudW0gUGFpbnRNYXNrT3V0bGluZSB7XG4gIE1BU0tFRCxcbiAgQ0lSQ0xFLFxuICBSRUNULFxufVxuaW50ZXJmYWNlIEJhc2VQYWludE1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiB7XG4gIHJlYWRvbmx5IG91dGxpbmVUeXBlOiBUO1xuICByZWFkb25seSBjZW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNlbnRlck9mZnNldFk6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGFpbnRBbHBoYU1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiBleHRlbmRzIEJhc2VQYWludE1hc2s8VD4sIEFscGhhTWFzayB7fVxuZXhwb3J0IGludGVyZmFjZSBQYWludEJpbmFyeU1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiBleHRlbmRzIEJhc2VQYWludE1hc2s8VD4sIEJpbmFyeU1hc2sge31cbmV4cG9ydCB0eXBlIFBhaW50TWFzayA9IFBhaW50QWxwaGFNYXNrPGFueT4gfCBQYWludEJpbmFyeU1hc2s8YW55PjtcbmV4cG9ydCB0eXBlIFBhaW50QnJ1c2ggPSBQYWludE1hc2sgfCBQYWludFJlY3Q7XG5leHBvcnQgaW50ZXJmYWNlIFBhaW50UmVjdCB7XG4gIHR5cGU6IG51bGw7XG4gIHJlYWRvbmx5IG91dGxpbmVUeXBlOiBQYWludE1hc2tPdXRsaW5lLlJFQ1Q7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xuICBjZW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gIGNlbnRlck9mZnNldFk6IG51bWJlcjtcbiAgZGF0YTogbnVsbDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export function trimRectBounds(x: number, y: number, w: number, h: number, targetWidth: number, targetHeight: number, out?: Rect): Rect {\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n const left = Math.max(0, x);\n const top = Math.max(0, y);\n const right = Math.min(targetWidth, x + w);\n const bottom = Math.min(targetHeight, y + h);\n res.x = left;\n res.y = top;\n res.w = Math.max(0, right - left);\n res.h = Math.max(0, bottom - top);\n return res;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gdHJpbVJlY3RCb3VuZHMoeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLCB0YXJnZXRXaWR0aDogbnVtYmVyLCB0YXJnZXRIZWlnaHQ6IG51bWJlciwgb3V0PzogUmVjdCk6IFJlY3Qge1xuICBjb25zdCByZXMgPSBvdXQgPz8ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgY29uc3QgbGVmdCA9IE1hdGgubWF4KDAsIHgpO1xuICBjb25zdCB0b3AgPSBNYXRoLm1heCgwLCB5KTtcbiAgY29uc3QgcmlnaHQgPSBNYXRoLm1pbih0YXJnZXRXaWR0aCwgeCArIHcpO1xuICBjb25zdCBib3R0b20gPSBNYXRoLm1pbih0YXJnZXRIZWlnaHQsIHkgKyBoKTtcbiAgcmVzLnggPSBsZWZ0O1xuICByZXMueSA9IHRvcDtcbiAgcmVzLncgPSBNYXRoLm1heCgwLCByaWdodCAtIGxlZnQpO1xuICByZXMuaCA9IE1hdGgubWF4KDAsIGJvdHRvbSAtIHRvcCk7XG4gIHJldHVybiByZXM7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Tile } from '../Tile/_tile-types';\nexport function eachTileInBounds<T extends Tile>(config: PixelEngineConfig, lookup: (T | undefined)[], tilePool: TilePool<T>, bounds: Rect, callback: (tile: T, bX: number, bY: number, bW: number, bH: number) => void): void {\n const {\n tileShift,\n targetColumns,\n targetRows,\n tileSize\n } = config;\n const x1 = Math.max(0, bounds.x >> tileShift);\n const y1 = Math.max(0, bounds.y >> tileShift);\n const x2 = Math.min(targetColumns - 1, bounds.x + bounds.w - 1 >> tileShift);\n const y2 = Math.min(targetRows - 1, bounds.y + bounds.h - 1 >> tileShift);\n if (x1 > x2 || y1 > y2) return;\n for (let ty = y1; ty <= y2; ty++) {\n const rowOffset = ty * targetColumns;\n const tileTop = ty << tileShift;\n for (let tx = x1; tx <= x2; tx++) {\n const id = rowOffset + tx;\n const tile = lookup[id] ?? (lookup[id] = tilePool.getTile(id, tx, ty));\n const tileLeft = tx << tileShift;\n const startX = bounds.x > tileLeft ? bounds.x : tileLeft;\n const startY = bounds.y > tileTop ? bounds.y : tileTop;\n const maskEndX = bounds.x + bounds.w;\n const tileEndX = tileLeft + tileSize;\n const endX = maskEndX < tileEndX ? maskEndX : tileEndX;\n const maskEndY = bounds.y + bounds.h;\n const tileEndY = tileTop + tileSize;\n const endY = maskEndY < tileEndY ? maskEndY : tileEndY;\n callback(tile, startX, startY, endX - startX, endY - startY);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFRpbGUgfSBmcm9tICcuLi9UaWxlL190aWxlLXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBlYWNoVGlsZUluQm91bmRzPFQgZXh0ZW5kcyBUaWxlPihjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLCBsb29rdXA6IChUIHwgdW5kZWZpbmVkKVtdLCB0aWxlUG9vbDogVGlsZVBvb2w8VD4sIGJvdW5kczogUmVjdCwgY2FsbGJhY2s6ICh0aWxlOiBULCBiWDogbnVtYmVyLCBiWTogbnVtYmVyLCBiVzogbnVtYmVyLCBiSDogbnVtYmVyKSA9PiB2b2lkKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICB0aWxlU2hpZnQsXG4gICAgdGFyZ2V0Q29sdW1ucyxcbiAgICB0YXJnZXRSb3dzLFxuICAgIHRpbGVTaXplXG4gIH0gPSBjb25maWc7XG4gIGNvbnN0IHgxID0gTWF0aC5tYXgoMCwgYm91bmRzLnggPj4gdGlsZVNoaWZ0KTtcbiAgY29uc3QgeTEgPSBNYXRoLm1heCgwLCBib3VuZHMueSA+PiB0aWxlU2hpZnQpO1xuICBjb25zdCB4MiA9IE1hdGgubWluKHRhcmdldENvbHVtbnMgLSAxLCBib3VuZHMueCArIGJvdW5kcy53IC0gMSA+PiB0aWxlU2hpZnQpO1xuICBjb25zdCB5MiA9IE1hdGgubWluKHRhcmdldFJvd3MgLSAxLCBib3VuZHMueSArIGJvdW5kcy5oIC0gMSA+PiB0aWxlU2hpZnQpO1xuICBpZiAoeDEgPiB4MiB8fCB5MSA+IHkyKSByZXR1cm47XG4gIGZvciAobGV0IHR5ID0geTE7IHR5IDw9IHkyOyB0eSsrKSB7XG4gICAgY29uc3Qgcm93T2Zmc2V0ID0gdHkgKiB0YXJnZXRDb2x1bW5zO1xuICAgIGNvbnN0IHRpbGVUb3AgPSB0eSA8PCB0aWxlU2hpZnQ7XG4gICAgZm9yIChsZXQgdHggPSB4MTsgdHggPD0geDI7IHR4KyspIHtcbiAgICAgIGNvbnN0IGlkID0gcm93T2Zmc2V0ICsgdHg7XG4gICAgICBjb25zdCB0aWxlID0gbG9va3VwW2lkXSA/PyAobG9va3VwW2lkXSA9IHRpbGVQb29sLmdldFRpbGUoaWQsIHR4LCB0eSkpO1xuICAgICAgY29uc3QgdGlsZUxlZnQgPSB0eCA8PCB0aWxlU2hpZnQ7XG4gICAgICBjb25zdCBzdGFydFggPSBib3VuZHMueCA+IHRpbGVMZWZ0ID8gYm91bmRzLnggOiB0aWxlTGVmdDtcbiAgICAgIGNvbnN0IHN0YXJ0WSA9IGJvdW5kcy55ID4gdGlsZVRvcCA/IGJvdW5kcy55IDogdGlsZVRvcDtcbiAgICAgIGNvbnN0IG1hc2tFbmRYID0gYm91bmRzLnggKyBib3VuZHMudztcbiAgICAgIGNvbnN0IHRpbGVFbmRYID0gdGlsZUxlZnQgKyB0aWxlU2l6ZTtcbiAgICAgIGNvbnN0IGVuZFggPSBtYXNrRW5kWCA8IHRpbGVFbmRYID8gbWFza0VuZFggOiB0aWxlRW5kWDtcbiAgICAgIGNvbnN0IG1hc2tFbmRZID0gYm91bmRzLnkgKyBib3VuZHMuaDtcbiAgICAgIGNvbnN0IHRpbGVFbmRZID0gdGlsZVRvcCArIHRpbGVTaXplO1xuICAgICAgY29uc3QgZW5kWSA9IG1hc2tFbmRZIDwgdGlsZUVuZFkgPyBtYXNrRW5kWSA6IHRpbGVFbmRZO1xuICAgICAgY2FsbGJhY2sodGlsZSwgc3RhcnRYLCBzdGFydFksIGVuZFggLSBzdGFydFgsIGVuZFkgLSBzdGFydFkpO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nimport { eachTileInBounds } from './eachTileInBounds';\nexport class AlphaMaskPaintBuffer {\n readonly lookup: (AlphaMaskTile | undefined)[];\n private readonly scratchBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n private forEachLinePointFn = forEachLinePoint;\n private trimRectBoundsFn = trimRectBounds;\n private eachTileInBoundsFn = eachTileInBounds;\n constructor(readonly config: PixelEngineConfig, readonly tilePool: TilePool<AlphaMaskTile>) {\n this.lookup = [];\n }\n paintAlphaMask(brush: PaintAlphaMask, x: number, y: number): boolean;\n paintAlphaMask(brush: PaintAlphaMask, startX: number, startY: number, endX: number, endY: number): boolean;\n paintAlphaMask(brush: PaintAlphaMask, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n let changed = false;\n const eachTileInBoundsFn = this.eachTileInBoundsFn;\n const trimRectBoundsFn = this.trimRectBoundsFn;\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBoundsFn(topLeftX, topLeftY, bW, bH, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n const brushA = bD[bOff + (canvasX - topLeftX)];\n if (brushA === 0) continue;\n const idx = dS + j;\n\n // Only overwrite if the brush stroke is stronger than the existing mask pixel\n if (brushA > data[idx]) {\n data[idx] = brushA;\n tileChanged = true;\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n paintBinaryMask(brush: PaintBinaryMask, alpha: number, x: number, y: number): boolean;\n paintBinaryMask(brush: PaintBinaryMask, alpha: number, startX: number, startY: number, endX: number, endY: number): boolean;\n paintBinaryMask(brush: PaintBinaryMask, alpha: number, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n if (alpha === 0) return false;\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n let changed = false;\n const trimRectBoundsFn = this.trimRectBoundsFn;\n const eachTileInBoundsFn = this.eachTileInBoundsFn;\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBoundsFn(topLeftX, topLeftY, bW, bH, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j;\n if (data[idx] < alpha) {\n data[idx] = alpha;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n paintRect(alpha: number, brush: PaintRect, x: number, y: number): boolean;\n paintRect(alpha: number, brush: PaintRect, startX: number, startY: number, endX: number, endY: number): boolean;\n paintRect(alpha: number, brush: PaintRect, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const brushWidth = brush.w;\n const brushHeight = brush.h;\n const centerOffsetX = brush.centerOffsetX;\n const centerOffsetY = brush.centerOffsetY;\n const trimRectBoundsFn = this.trimRectBoundsFn;\n const eachTileInBoundsFn = this.eachTileInBoundsFn;\n let changed = false;\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBoundsFn(topLeftX, topLeftY, brushWidth, brushHeight, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j;\n\n // If the new alpha is stronger than the current alpha, overwrite it\n if (alpha > data[idx]) {\n data[idx] = alpha;\n tileChanged = true;\n }\n }\n }\n if (tileChanged) {\n changed = true;\n }\n });\n });\n return changed;\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnO1xuaW1wb3J0IHsgdHJpbVJlY3RCb3VuZHMgfSBmcm9tICcuLi9SZWN0L3RyaW1SZWN0Qm91bmRzJztcbmltcG9ydCB7IGVhY2hUaWxlSW5Cb3VuZHMgfSBmcm9tICcuL2VhY2hUaWxlSW5Cb3VuZHMnO1xuZXhwb3J0IGNsYXNzIEFscGhhTWFza1BhaW50QnVmZmVyIHtcbiAgcmVhZG9ubHkgbG9va3VwOiAoQWxwaGFNYXNrVGlsZSB8IHVuZGVmaW5lZClbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBzY3JhdGNoQm91bmRzOiBSZWN0ID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgcHJpdmF0ZSBmb3JFYWNoTGluZVBvaW50Rm4gPSBmb3JFYWNoTGluZVBvaW50O1xuICBwcml2YXRlIHRyaW1SZWN0Qm91bmRzRm4gPSB0cmltUmVjdEJvdW5kcztcbiAgcHJpdmF0ZSBlYWNoVGlsZUluQm91bmRzRm4gPSBlYWNoVGlsZUluQm91bmRzO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLCByZWFkb25seSB0aWxlUG9vbDogVGlsZVBvb2w8QWxwaGFNYXNrVGlsZT4pIHtcbiAgICB0aGlzLmxvb2t1cCA9IFtdO1xuICB9XG4gIHBhaW50QWxwaGFNYXNrKGJydXNoOiBQYWludEFscGhhTWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEFscGhhTWFzayhicnVzaDogUGFpbnRBbHBoYU1hc2ssIHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEFscGhhTWFzayhicnVzaDogUGFpbnRBbHBoYU1hc2ssIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IHtcbiAgICAgIHc6IGJXLFxuICAgICAgaDogYkgsXG4gICAgICBkYXRhOiBiRCxcbiAgICAgIGNlbnRlck9mZnNldFgsXG4gICAgICBjZW50ZXJPZmZzZXRZXG4gICAgfSA9IGJydXNoO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgZWFjaFRpbGVJbkJvdW5kc0ZuID0gdGhpcy5lYWNoVGlsZUluQm91bmRzRm47XG4gICAgY29uc3QgdHJpbVJlY3RCb3VuZHNGbiA9IHRoaXMudHJpbVJlY3RCb3VuZHNGbjtcbiAgICB0aGlzLmZvckVhY2hMaW5lUG9pbnRGbih4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WCk7XG4gICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKTtcbiAgICAgIHRyaW1SZWN0Qm91bmRzRm4odG9wTGVmdFgsIHRvcExlZnRZLCBiVywgYkgsIHRhcmdldC53LCB0YXJnZXQuaCwgc2NyYXRjaCk7XG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVybjtcbiAgICAgIGVhY2hUaWxlSW5Cb3VuZHNGbihjb25maWcsIGxvb2t1cCwgdGlsZVBvb2wsIHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRpbGUuZGF0YTtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiVztcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzWCA9IGJYICsgajtcbiAgICAgICAgICAgIGNvbnN0IGJydXNoQSA9IGJEW2JPZmYgKyAoY2FudmFzWCAtIHRvcExlZnRYKV07XG4gICAgICAgICAgICBpZiAoYnJ1c2hBID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcblxuICAgICAgICAgICAgLy8gT25seSBvdmVyd3JpdGUgaWYgdGhlIGJydXNoIHN0cm9rZSBpcyBzdHJvbmdlciB0aGFuIHRoZSBleGlzdGluZyBtYXNrIHBpeGVsXG4gICAgICAgICAgICBpZiAoYnJ1c2hBID4gZGF0YVtpZHhdKSB7XG4gICAgICAgICAgICAgIGRhdGFbaWR4XSA9IGJydXNoQTtcbiAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgcGFpbnRCaW5hcnlNYXNrKGJydXNoOiBQYWludEJpbmFyeU1hc2ssIGFscGhhOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRCaW5hcnlNYXNrKGJydXNoOiBQYWludEJpbmFyeU1hc2ssIGFscGhhOiBudW1iZXIsIHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEJpbmFyeU1hc2soYnJ1c2g6IFBhaW50QmluYXJ5TWFzaywgYWxwaGE6IG51bWJlciwgeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciA9IHgwLCB5MTogbnVtYmVyID0geTApOiBib29sZWFuIHtcbiAgICBpZiAoYWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbDtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IHRpbGVNYXNrID0gY29uZmlnLnRpbGVNYXNrO1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gICAgY29uc3Qge1xuICAgICAgdzogYlcsXG4gICAgICBoOiBiSCxcbiAgICAgIGRhdGE6IGJELFxuICAgICAgY2VudGVyT2Zmc2V0WCxcbiAgICAgIGNlbnRlck9mZnNldFlcbiAgICB9ID0gYnJ1c2g7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCB0cmltUmVjdEJvdW5kc0ZuID0gdGhpcy50cmltUmVjdEJvdW5kc0ZuO1xuICAgIGNvbnN0IGVhY2hUaWxlSW5Cb3VuZHNGbiA9IHRoaXMuZWFjaFRpbGVJbkJvdW5kc0ZuO1xuICAgIHRoaXMuZm9yRWFjaExpbmVQb2ludEZuKHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKTtcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpO1xuICAgICAgdHJpbVJlY3RCb3VuZHNGbih0b3BMZWZ0WCwgdG9wTGVmdFksIGJXLCBiSCwgdGFyZ2V0LncsIHRhcmdldC5oLCBzY3JhdGNoKTtcbiAgICAgIGlmIChzY3JhdGNoLncgPD0gMCB8fCBzY3JhdGNoLmggPD0gMCkgcmV0dXJuO1xuICAgICAgZWFjaFRpbGVJbkJvdW5kc0ZuKGNvbmZpZywgbG9va3VwLCB0aWxlUG9vbCwgc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGlsZS5kYXRhO1xuICAgICAgICBsZXQgdGlsZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiSF90OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjYW52YXNZID0gYlkgKyBpO1xuICAgICAgICAgIGNvbnN0IGJPZmYgPSAoY2FudmFzWSAtIHRvcExlZnRZKSAqIGJXO1xuICAgICAgICAgIGNvbnN0IHRPZmYgPSAoY2FudmFzWSAmIHRpbGVNYXNrKSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgICAgY29uc3QgZFMgPSB0T2ZmICsgKGJYICYgdGlsZU1hc2spO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYldfdDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNYID0gYlggKyBqO1xuICAgICAgICAgICAgaWYgKGJEW2JPZmYgKyAoY2FudmFzWCAtIHRvcExlZnRYKV0pIHtcbiAgICAgICAgICAgICAgY29uc3QgaWR4ID0gZFMgKyBqO1xuICAgICAgICAgICAgICBpZiAoZGF0YVtpZHhdIDwgYWxwaGEpIHtcbiAgICAgICAgICAgICAgICBkYXRhW2lkeF0gPSBhbHBoYTtcbiAgICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGVDaGFuZ2VkKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG4gIHBhaW50UmVjdChhbHBoYTogbnVtYmVyLCBicnVzaDogUGFpbnRSZWN0LCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50UmVjdChhbHBoYTogbnVtYmVyLCBicnVzaDogUGFpbnRSZWN0LCBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGVuZFg6IG51bWJlciwgZW5kWTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRSZWN0KGFscGhhOiBudW1iZXIsIGJydXNoOiBQYWludFJlY3QsIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IGJydXNoV2lkdGggPSBicnVzaC53O1xuICAgIGNvbnN0IGJydXNoSGVpZ2h0ID0gYnJ1c2guaDtcbiAgICBjb25zdCBjZW50ZXJPZmZzZXRYID0gYnJ1c2guY2VudGVyT2Zmc2V0WDtcbiAgICBjb25zdCBjZW50ZXJPZmZzZXRZID0gYnJ1c2guY2VudGVyT2Zmc2V0WTtcbiAgICBjb25zdCB0cmltUmVjdEJvdW5kc0ZuID0gdGhpcy50cmltUmVjdEJvdW5kc0ZuO1xuICAgIGNvbnN0IGVhY2hUaWxlSW5Cb3VuZHNGbiA9IHRoaXMuZWFjaFRpbGVJbkJvdW5kc0ZuO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgdGhpcy5mb3JFYWNoTGluZVBvaW50Rm4oeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgIGNvbnN0IHRvcExlZnRYID0gTWF0aC5mbG9vcihweCArIGNlbnRlck9mZnNldFgpO1xuICAgICAgY29uc3QgdG9wTGVmdFkgPSBNYXRoLmZsb29yKHB5ICsgY2VudGVyT2Zmc2V0WSk7XG4gICAgICB0cmltUmVjdEJvdW5kc0ZuKHRvcExlZnRYLCB0b3BMZWZ0WSwgYnJ1c2hXaWR0aCwgYnJ1c2hIZWlnaHQsIHRhcmdldC53LCB0YXJnZXQuaCwgc2NyYXRjaCk7XG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVybjtcbiAgICAgIGVhY2hUaWxlSW5Cb3VuZHNGbihjb25maWcsIGxvb2t1cCwgdGlsZVBvb2wsIHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRpbGUuZGF0YTtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gZFMgKyBqO1xuXG4gICAgICAgICAgICAvLyBJZiB0aGUgbmV3IGFscGhhIGlzIHN0cm9uZ2VyIHRoYW4gdGhlIGN1cnJlbnQgYWxwaGEsIG92ZXJ3cml0ZSBpdFxuICAgICAgICAgICAgaWYgKGFscGhhID4gZGF0YVtpZHhdKSB7XG4gICAgICAgICAgICAgIGRhdGFbaWR4XSA9IGFscGhhO1xuICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlcyh0aGlzLmxvb2t1cCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nimport { eachTileInBounds } from './eachTileInBounds';\nexport class BinaryMaskPaintBuffer {\n readonly lookup: (BinaryMaskTile | undefined)[];\n private readonly scratchBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n private forEachLinePointFn = forEachLinePoint;\n private trimRectBoundsFn = trimRectBounds;\n private eachTileInBoundsFn = eachTileInBounds;\n constructor(readonly config: PixelEngineConfig, readonly tilePool: TilePool<BinaryMaskTile>) {\n this.lookup = [];\n }\n paintBinaryMask(brush: PaintBinaryMask, x: number, y: number): boolean;\n paintBinaryMask(brush: PaintBinaryMask, startX: number, startY: number, endX: number, endY: number): boolean;\n paintBinaryMask(brush: PaintBinaryMask, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n let changed = false;\n const trimRectBoundsFn = this.trimRectBoundsFn;\n const eachTileInBoundsFn = this.eachTileInBoundsFn;\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBoundsFn(topLeftX, topLeftY, bW, bH, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j;\n\n // Only write if it's not already \"on\"\n if (data[idx] === 0) {\n data[idx] = 1;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n paintRect(brush: PaintRect, x: number, y: number): boolean;\n paintRect(brush: PaintRect, startX: number, startY: number, endX: number, endY: number): boolean;\n paintRect(brush: PaintRect, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const brushWidth = brush.w;\n const brushHeight = brush.h;\n const centerOffsetX = brush.centerOffsetX;\n const centerOffsetY = brush.centerOffsetY;\n const trimRectBoundsFn = this.trimRectBoundsFn;\n const eachTileInBoundsFn = this.eachTileInBoundsFn;\n let changed = false;\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBoundsFn(topLeftX, topLeftY, brushWidth, brushHeight, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j;\n\n // Only write if it's not already \"on\"\n if (data[idx] === 0) {\n data[idx] = 1;\n tileChanged = true;\n }\n }\n }\n if (tileChanged) {\n changed = true;\n }\n });\n });\n return changed;\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnO1xuaW1wb3J0IHsgdHJpbVJlY3RCb3VuZHMgfSBmcm9tICcuLi9SZWN0L3RyaW1SZWN0Qm91bmRzJztcbmltcG9ydCB7IGVhY2hUaWxlSW5Cb3VuZHMgfSBmcm9tICcuL2VhY2hUaWxlSW5Cb3VuZHMnO1xuZXhwb3J0IGNsYXNzIEJpbmFyeU1hc2tQYWludEJ1ZmZlciB7XG4gIHJlYWRvbmx5IGxvb2t1cDogKEJpbmFyeU1hc2tUaWxlIHwgdW5kZWZpbmVkKVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcmF0Y2hCb3VuZHM6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMFxuICB9O1xuICBwcml2YXRlIGZvckVhY2hMaW5lUG9pbnRGbiA9IGZvckVhY2hMaW5lUG9pbnQ7XG4gIHByaXZhdGUgdHJpbVJlY3RCb3VuZHNGbiA9IHRyaW1SZWN0Qm91bmRzO1xuICBwcml2YXRlIGVhY2hUaWxlSW5Cb3VuZHNGbiA9IGVhY2hUaWxlSW5Cb3VuZHM7XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIHJlYWRvbmx5IHRpbGVQb29sOiBUaWxlUG9vbDxCaW5hcnlNYXNrVGlsZT4pIHtcbiAgICB0aGlzLmxvb2t1cCA9IFtdO1xuICB9XG4gIHBhaW50QmluYXJ5TWFzayhicnVzaDogUGFpbnRCaW5hcnlNYXNrLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50QmluYXJ5TWFzayhicnVzaDogUGFpbnRCaW5hcnlNYXNrLCBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGVuZFg6IG51bWJlciwgZW5kWTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRCaW5hcnlNYXNrKGJydXNoOiBQYWludEJpbmFyeU1hc2ssIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IHtcbiAgICAgIHc6IGJXLFxuICAgICAgaDogYkgsXG4gICAgICBkYXRhOiBiRCxcbiAgICAgIGNlbnRlck9mZnNldFgsXG4gICAgICBjZW50ZXJPZmZzZXRZXG4gICAgfSA9IGJydXNoO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgdHJpbVJlY3RCb3VuZHNGbiA9IHRoaXMudHJpbVJlY3RCb3VuZHNGbjtcbiAgICBjb25zdCBlYWNoVGlsZUluQm91bmRzRm4gPSB0aGlzLmVhY2hUaWxlSW5Cb3VuZHNGbjtcbiAgICB0aGlzLmZvckVhY2hMaW5lUG9pbnRGbih4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WCk7XG4gICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKTtcbiAgICAgIHRyaW1SZWN0Qm91bmRzRm4odG9wTGVmdFgsIHRvcExlZnRZLCBiVywgYkgsIHRhcmdldC53LCB0YXJnZXQuaCwgc2NyYXRjaCk7XG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVybjtcbiAgICAgIGVhY2hUaWxlSW5Cb3VuZHNGbihjb25maWcsIGxvb2t1cCwgdGlsZVBvb2wsIHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRpbGUuZGF0YTtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiVztcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzWCA9IGJYICsgajtcbiAgICAgICAgICAgIGlmIChiRFtiT2ZmICsgKGNhbnZhc1ggLSB0b3BMZWZ0WCldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcblxuICAgICAgICAgICAgICAvLyBPbmx5IHdyaXRlIGlmIGl0J3Mgbm90IGFscmVhZHkgXCJvblwiXG4gICAgICAgICAgICAgIGlmIChkYXRhW2lkeF0gPT09IDApIHtcbiAgICAgICAgICAgICAgICBkYXRhW2lkeF0gPSAxO1xuICAgICAgICAgICAgICAgIHRpbGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgcGFpbnRSZWN0KGJydXNoOiBQYWludFJlY3QsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRSZWN0KGJydXNoOiBQYWludFJlY3QsIHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludFJlY3QoYnJ1c2g6IFBhaW50UmVjdCwgeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciA9IHgwLCB5MTogbnVtYmVyID0geTApOiBib29sZWFuIHtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbDtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IHRpbGVNYXNrID0gY29uZmlnLnRpbGVNYXNrO1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gICAgY29uc3QgYnJ1c2hXaWR0aCA9IGJydXNoLnc7XG4gICAgY29uc3QgYnJ1c2hIZWlnaHQgPSBicnVzaC5oO1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSBicnVzaC5jZW50ZXJPZmZzZXRYO1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFkgPSBicnVzaC5jZW50ZXJPZmZzZXRZO1xuICAgIGNvbnN0IHRyaW1SZWN0Qm91bmRzRm4gPSB0aGlzLnRyaW1SZWN0Qm91bmRzRm47XG4gICAgY29uc3QgZWFjaFRpbGVJbkJvdW5kc0ZuID0gdGhpcy5lYWNoVGlsZUluQm91bmRzRm47XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICB0aGlzLmZvckVhY2hMaW5lUG9pbnRGbih4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WCk7XG4gICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKTtcbiAgICAgIHRyaW1SZWN0Qm91bmRzRm4odG9wTGVmdFgsIHRvcExlZnRZLCBicnVzaFdpZHRoLCBicnVzaEhlaWdodCwgdGFyZ2V0LncsIHRhcmdldC5oLCBzY3JhdGNoKTtcbiAgICAgIGlmIChzY3JhdGNoLncgPD0gMCB8fCBzY3JhdGNoLmggPD0gMCkgcmV0dXJuO1xuICAgICAgZWFjaFRpbGVJbkJvdW5kc0ZuKGNvbmZpZywgbG9va3VwLCB0aWxlUG9vbCwgc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGlsZS5kYXRhO1xuICAgICAgICBsZXQgdGlsZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiSF90OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjYW52YXNZID0gYlkgKyBpO1xuICAgICAgICAgIGNvbnN0IHRPZmYgPSAoY2FudmFzWSAmIHRpbGVNYXNrKSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgICAgY29uc3QgZFMgPSB0T2ZmICsgKGJYICYgdGlsZU1hc2spO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYldfdDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBkUyArIGo7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgd3JpdGUgaWYgaXQncyBub3QgYWxyZWFkeSBcIm9uXCJcbiAgICAgICAgICAgIGlmIChkYXRhW2lkeF0gPT09IDApIHtcbiAgICAgICAgICAgICAgZGF0YVtpZHhdID0gMTtcbiAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZXModGhpcy5sb29rdXApO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nimport { eachTileInBounds } from './eachTileInBounds';\nexport class ColorPaintBuffer {\n readonly lookup: (PixelTile | undefined)[];\n private readonly scratchBounds: Rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n constructor(readonly config: PixelEngineConfig, readonly tilePool: TilePool<PixelTile>) {\n this.lookup = [];\n }\n paintAlphaMask(color: Color32, brush: PaintAlphaMask, x: number, y: number): boolean;\n paintAlphaMask(color: Color32, brush: PaintAlphaMask, startX: number, startY: number, endX: number, endY: number): boolean;\n paintAlphaMask(color: Color32, brush: PaintAlphaMask, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n const cA = color >>> 24;\n if (cA === 0) return false;\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n const cRGB = color & 0x00ffffff;\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, bW, bH, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBounds(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n const brushA = bD[bOff + (canvasX - topLeftX)];\n if (brushA === 0) continue;\n const t = cA * brushA + 128;\n const blendedA = t + (t >> 8) >> 8;\n const idx = dS + j;\n const cur = d32[idx];\n if (brushA > cur >>> 24) {\n const next = (cRGB | blendedA << 24) >>> 0;\n if (cur !== next) {\n d32[idx] = next as Color32;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n paintBinaryMask(color: Color32, brush: PaintBinaryMask, x: number, y: number): boolean;\n paintBinaryMask(color: Color32, brush: PaintBinaryMask, startX: number, startY: number, endX: number, endY: number): boolean;\n paintBinaryMask(color: Color32, brush: PaintBinaryMask, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, bW, bH, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBounds(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const bOff = (canvasY - topLeftY) * bW;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j;\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j;\n if (d32[idx] !== color) {\n d32[idx] = color;\n tileChanged = true;\n }\n }\n }\n }\n if (tileChanged) changed = true;\n });\n });\n return changed;\n }\n paintRect(color: Color32, brush: PaintRect, x: number, y: number): boolean;\n paintRect(color: Color32, brush: PaintRect, startX: number, startY: number, endX: number, endY: number): boolean;\n paintRect(color: Color32, brush: PaintRect, x0: number, y0: number, x1: number = x0, y1: number = y0): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const scratch = this.scratchBounds;\n const lookup = this.lookup;\n const tilePool = this.tilePool;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const brushWidth = brush.w;\n const brushHeight = brush.h;\n const centerOffsetX = brush.centerOffsetX;\n const centerOffsetY = brush.centerOffsetY;\n let changed = false;\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX);\n const topLeftY = Math.floor(py + centerOffsetY);\n trimRectBounds(topLeftX, topLeftY, brushWidth, brushHeight, target.w, target.h, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n eachTileInBounds(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data;\n let tileChanged = false;\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i;\n const tOff = (canvasY & tileMask) << tileShift;\n const dS = tOff + (bX & tileMask);\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j;\n if (d32[idx] !== color) {\n d32[idx] = color;\n tileChanged = true;\n }\n }\n }\n if (tileChanged) {\n changed = true;\n }\n });\n });\n return changed;\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgZm9yRWFjaExpbmVQb2ludCB9IGZyb20gJy4uL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50JztcbmltcG9ydCB7IHRyaW1SZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltUmVjdEJvdW5kcyc7XG5pbXBvcnQgeyBlYWNoVGlsZUluQm91bmRzIH0gZnJvbSAnLi9lYWNoVGlsZUluQm91bmRzJztcbmV4cG9ydCBjbGFzcyBDb2xvclBhaW50QnVmZmVyIHtcbiAgcmVhZG9ubHkgbG9va3VwOiAoUGl4ZWxUaWxlIHwgdW5kZWZpbmVkKVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcmF0Y2hCb3VuZHM6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMFxuICB9O1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLCByZWFkb25seSB0aWxlUG9vbDogVGlsZVBvb2w8UGl4ZWxUaWxlPikge1xuICAgIHRoaXMubG9va3VwID0gW107XG4gIH1cbiAgcGFpbnRBbHBoYU1hc2soY29sb3I6IENvbG9yMzIsIGJydXNoOiBQYWludEFscGhhTWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEFscGhhTWFzayhjb2xvcjogQ29sb3IzMiwgYnJ1c2g6IFBhaW50QWxwaGFNYXNrLCBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGVuZFg6IG51bWJlciwgZW5kWTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRBbHBoYU1hc2soY29sb3I6IENvbG9yMzIsIGJydXNoOiBQYWludEFscGhhTWFzaywgeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciA9IHgwLCB5MTogbnVtYmVyID0geTApOiBib29sZWFuIHtcbiAgICBjb25zdCBjQSA9IGNvbG9yID4+PiAyNDtcbiAgICBpZiAoY0EgPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbDtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IHRpbGVNYXNrID0gY29uZmlnLnRpbGVNYXNrO1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gICAgY29uc3Qge1xuICAgICAgdzogYlcsXG4gICAgICBoOiBiSCxcbiAgICAgIGRhdGE6IGJELFxuICAgICAgY2VudGVyT2Zmc2V0WCxcbiAgICAgIGNlbnRlck9mZnNldFlcbiAgICB9ID0gYnJ1c2g7XG4gICAgY29uc3QgY1JHQiA9IGNvbG9yICYgMHgwMGZmZmZmZjtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgIGNvbnN0IHRvcExlZnRYID0gTWF0aC5mbG9vcihweCArIGNlbnRlck9mZnNldFgpO1xuICAgICAgY29uc3QgdG9wTGVmdFkgPSBNYXRoLmZsb29yKHB5ICsgY2VudGVyT2Zmc2V0WSk7XG4gICAgICB0cmltUmVjdEJvdW5kcyh0b3BMZWZ0WCwgdG9wTGVmdFksIGJXLCBiSCwgdGFyZ2V0LncsIHRhcmdldC5oLCBzY3JhdGNoKTtcbiAgICAgIGlmIChzY3JhdGNoLncgPD0gMCB8fCBzY3JhdGNoLmggPD0gMCkgcmV0dXJuO1xuICAgICAgZWFjaFRpbGVJbkJvdW5kcyhjb25maWcsIGxvb2t1cCwgdGlsZVBvb2wsIHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZDMyID0gdGlsZS5kYXRhO1xuICAgICAgICBsZXQgdGlsZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiSF90OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjYW52YXNZID0gYlkgKyBpO1xuICAgICAgICAgIGNvbnN0IGJPZmYgPSAoY2FudmFzWSAtIHRvcExlZnRZKSAqIGJXO1xuICAgICAgICAgIGNvbnN0IHRPZmYgPSAoY2FudmFzWSAmIHRpbGVNYXNrKSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgICAgY29uc3QgZFMgPSB0T2ZmICsgKGJYICYgdGlsZU1hc2spO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYldfdDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNYID0gYlggKyBqO1xuICAgICAgICAgICAgY29uc3QgYnJ1c2hBID0gYkRbYk9mZiArIChjYW52YXNYIC0gdG9wTGVmdFgpXTtcbiAgICAgICAgICAgIGlmIChicnVzaEEgPT09IDApIGNvbnRpbnVlO1xuICAgICAgICAgICAgY29uc3QgdCA9IGNBICogYnJ1c2hBICsgMTI4O1xuICAgICAgICAgICAgY29uc3QgYmxlbmRlZEEgPSB0ICsgKHQgPj4gOCkgPj4gODtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcbiAgICAgICAgICAgIGNvbnN0IGN1ciA9IGQzMltpZHhdO1xuICAgICAgICAgICAgaWYgKGJydXNoQSA+IGN1ciA+Pj4gMjQpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IChjUkdCIHwgYmxlbmRlZEEgPDwgMjQpID4+PiAwO1xuICAgICAgICAgICAgICBpZiAoY3VyICE9PSBuZXh0KSB7XG4gICAgICAgICAgICAgICAgZDMyW2lkeF0gPSBuZXh0IGFzIENvbG9yMzI7XG4gICAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuICBwYWludEJpbmFyeU1hc2soY29sb3I6IENvbG9yMzIsIGJydXNoOiBQYWludEJpbmFyeU1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRCaW5hcnlNYXNrKGNvbG9yOiBDb2xvcjMyLCBicnVzaDogUGFpbnRCaW5hcnlNYXNrLCBzdGFydFg6IG51bWJlciwgc3RhcnRZOiBudW1iZXIsIGVuZFg6IG51bWJlciwgZW5kWTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRCaW5hcnlNYXNrKGNvbG9yOiBDb2xvcjMyLCBicnVzaDogUGFpbnRCaW5hcnlNYXNrLCB4MDogbnVtYmVyLCB5MDogbnVtYmVyLCB4MTogbnVtYmVyID0geDAsIHkxOiBudW1iZXIgPSB5MCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFscGhhSXNaZXJvID0gY29sb3IgPj4+IDI0ID09PSAwO1xuICAgIGlmIChhbHBoYUlzWmVybykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLnNjcmF0Y2hCb3VuZHM7XG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5sb29rdXA7XG4gICAgY29uc3QgdGlsZVBvb2wgPSB0aGlzLnRpbGVQb29sO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnQ7XG4gICAgY29uc3QgdGlsZU1hc2sgPSBjb25maWcudGlsZU1hc2s7XG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCB7XG4gICAgICB3OiBiVyxcbiAgICAgIGg6IGJILFxuICAgICAgZGF0YTogYkQsXG4gICAgICBjZW50ZXJPZmZzZXRYLFxuICAgICAgY2VudGVyT2Zmc2V0WVxuICAgIH0gPSBicnVzaDtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgIGNvbnN0IHRvcExlZnRYID0gTWF0aC5mbG9vcihweCArIGNlbnRlck9mZnNldFgpO1xuICAgICAgY29uc3QgdG9wTGVmdFkgPSBNYXRoLmZsb29yKHB5ICsgY2VudGVyT2Zmc2V0WSk7XG4gICAgICB0cmltUmVjdEJvdW5kcyh0b3BMZWZ0WCwgdG9wTGVmdFksIGJXLCBiSCwgdGFyZ2V0LncsIHRhcmdldC5oLCBzY3JhdGNoKTtcbiAgICAgIGlmIChzY3JhdGNoLncgPD0gMCB8fCBzY3JhdGNoLmggPD0gMCkgcmV0dXJuO1xuICAgICAgZWFjaFRpbGVJbkJvdW5kcyhjb25maWcsIGxvb2t1cCwgdGlsZVBvb2wsIHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZDMyID0gdGlsZS5kYXRhO1xuICAgICAgICBsZXQgdGlsZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiSF90OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjYW52YXNZID0gYlkgKyBpO1xuICAgICAgICAgIGNvbnN0IGJPZmYgPSAoY2FudmFzWSAtIHRvcExlZnRZKSAqIGJXO1xuICAgICAgICAgIGNvbnN0IHRPZmYgPSAoY2FudmFzWSAmIHRpbGVNYXNrKSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgICAgY29uc3QgZFMgPSB0T2ZmICsgKGJYICYgdGlsZU1hc2spO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYldfdDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNYID0gYlggKyBqO1xuICAgICAgICAgICAgaWYgKGJEW2JPZmYgKyAoY2FudmFzWCAtIHRvcExlZnRYKV0pIHtcbiAgICAgICAgICAgICAgY29uc3QgaWR4ID0gZFMgKyBqO1xuICAgICAgICAgICAgICBpZiAoZDMyW2lkeF0gIT09IGNvbG9yKSB7XG4gICAgICAgICAgICAgICAgZDMyW2lkeF0gPSBjb2xvcjtcbiAgICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGVDaGFuZ2VkKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG4gIHBhaW50UmVjdChjb2xvcjogQ29sb3IzMiwgYnJ1c2g6IFBhaW50UmVjdCwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludFJlY3QoY29sb3I6IENvbG9yMzIsIGJydXNoOiBQYWludFJlY3QsIHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludFJlY3QoY29sb3I6IENvbG9yMzIsIGJydXNoOiBQYWludFJlY3QsIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWxwaGFJc1plcm8gPSBjb2xvciA+Pj4gMjQgPT09IDA7XG4gICAgaWYgKGFscGhhSXNaZXJvKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IGJydXNoV2lkdGggPSBicnVzaC53O1xuICAgIGNvbnN0IGJydXNoSGVpZ2h0ID0gYnJ1c2guaDtcbiAgICBjb25zdCBjZW50ZXJPZmZzZXRYID0gYnJ1c2guY2VudGVyT2Zmc2V0WDtcbiAgICBjb25zdCBjZW50ZXJPZmZzZXRZID0gYnJ1c2guY2VudGVyT2Zmc2V0WTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgIGNvbnN0IHRvcExlZnRYID0gTWF0aC5mbG9vcihweCArIGNlbnRlck9mZnNldFgpO1xuICAgICAgY29uc3QgdG9wTGVmdFkgPSBNYXRoLmZsb29yKHB5ICsgY2VudGVyT2Zmc2V0WSk7XG4gICAgICB0cmltUmVjdEJvdW5kcyh0b3BMZWZ0WCwgdG9wTGVmdFksIGJydXNoV2lkdGgsIGJydXNoSGVpZ2h0LCB0YXJnZXQudywgdGFyZ2V0LmgsIHNjcmF0Y2gpO1xuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm47XG4gICAgICBlYWNoVGlsZUluQm91bmRzKGNvbmZpZywgbG9va3VwLCB0aWxlUG9vbCwgc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkMzIgPSB0aWxlLmRhdGE7XG4gICAgICAgIGxldCB0aWxlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJIX3Q7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGk7XG4gICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdDtcbiAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzayk7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBiV190OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcbiAgICAgICAgICAgIGlmIChkMzJbaWR4XSAhPT0gY29sb3IpIHtcbiAgICAgICAgICAgICAgZDMyW2lkeF0gPSBjb2xvcjtcbiAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZXModGhpcy5sb29rdXApO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nconst SCRATCH_OPTS = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n};\nexport function commitMaskPaintBuffer(accumulator: PixelAccumulator, paintBuffer: BinaryMaskPaintBuffer, color: Color32, alpha: number | undefined, blendFn: typeof sourceOverPerfect | undefined, blendColorPixelDataMaskFn: typeof blendColorPixelDataBinaryMask): void;\nexport function commitMaskPaintBuffer(accumulator: PixelAccumulator, paintBuffer: AlphaMaskPaintBuffer, color: Color32, alpha: number | undefined, blendFn: typeof sourceOverPerfect | undefined, blendColorPixelDataMaskFn: typeof blendColorPixelDataAlphaMask): void;\nexport function commitMaskPaintBuffer(accumulator: PixelAccumulator, paintBuffer: any, color: Color32, alpha = 255, blendFn = sourceOverPerfect, blendColorPixelDataMaskFn: any) {\n const config = accumulator.config;\n const tileShift = config.tileShift;\n const lookup = paintBuffer.lookup;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const didChange = accumulator.storeTileBeforeState(tile.id, tile.tx, tile.ty);\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n SCRATCH_OPTS.x = dx;\n SCRATCH_OPTS.y = dy;\n SCRATCH_OPTS.w = tile.w;\n SCRATCH_OPTS.h = tile.h;\n didChange(blendColorPixelDataMaskFn(config.target, color, tile, SCRATCH_OPTS));\n }\n }\n paintBuffer.clear();\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5jb25zdCBTQ1JBVENIX09QVFMgPSB7XG4gIGFscGhhOiAyNTUsXG4gIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICB4OiAwLFxuICB5OiAwLFxuICB3OiAwLFxuICBoOiAwXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdE1hc2tQYWludEJ1ZmZlcihhY2N1bXVsYXRvcjogUGl4ZWxBY2N1bXVsYXRvciwgcGFpbnRCdWZmZXI6IEJpbmFyeU1hc2tQYWludEJ1ZmZlciwgY29sb3I6IENvbG9yMzIsIGFscGhhOiBudW1iZXIgfCB1bmRlZmluZWQsIGJsZW5kRm46IHR5cGVvZiBzb3VyY2VPdmVyUGVyZmVjdCB8IHVuZGVmaW5lZCwgYmxlbmRDb2xvclBpeGVsRGF0YU1hc2tGbjogdHlwZW9mIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBjb21taXRNYXNrUGFpbnRCdWZmZXIoYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3IsIHBhaW50QnVmZmVyOiBBbHBoYU1hc2tQYWludEJ1ZmZlciwgY29sb3I6IENvbG9yMzIsIGFscGhhOiBudW1iZXIgfCB1bmRlZmluZWQsIGJsZW5kRm46IHR5cGVvZiBzb3VyY2VPdmVyUGVyZmVjdCB8IHVuZGVmaW5lZCwgYmxlbmRDb2xvclBpeGVsRGF0YU1hc2tGbjogdHlwZW9mIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2spOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdE1hc2tQYWludEJ1ZmZlcihhY2N1bXVsYXRvcjogUGl4ZWxBY2N1bXVsYXRvciwgcGFpbnRCdWZmZXI6IGFueSwgY29sb3I6IENvbG9yMzIsIGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QsIGJsZW5kQ29sb3JQaXhlbERhdGFNYXNrRm46IGFueSkge1xuICBjb25zdCBjb25maWcgPSBhY2N1bXVsYXRvci5jb25maWc7XG4gIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnQ7XG4gIGNvbnN0IGxvb2t1cCA9IHBhaW50QnVmZmVyLmxvb2t1cDtcbiAgU0NSQVRDSF9PUFRTLmFscGhhID0gYWxwaGE7XG4gIFNDUkFUQ0hfT1BUUy5ibGVuZEZuID0gYmxlbmRGbjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gbG9va3VwW2ldO1xuICAgIGlmICh0aWxlKSB7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSBhY2N1bXVsYXRvci5zdG9yZVRpbGVCZWZvcmVTdGF0ZSh0aWxlLmlkLCB0aWxlLnR4LCB0aWxlLnR5KTtcbiAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnQ7XG4gICAgICBjb25zdCBkeSA9IHRpbGUudHkgPDwgdGlsZVNoaWZ0O1xuICAgICAgU0NSQVRDSF9PUFRTLnggPSBkeDtcbiAgICAgIFNDUkFUQ0hfT1BUUy55ID0gZHk7XG4gICAgICBTQ1JBVENIX09QVFMudyA9IHRpbGUudztcbiAgICAgIFNDUkFUQ0hfT1BUUy5oID0gdGlsZS5oO1xuICAgICAgZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGFNYXNrRm4oY29uZmlnLnRhcmdldCwgY29sb3IsIHRpbGUsIFNDUkFUQ0hfT1BUUykpO1xuICAgIH1cbiAgfVxuICBwYWludEJ1ZmZlci5jbGVhcigpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask';\nimport { commitMaskPaintBuffer } from './commitMaskPaintBuffer';\nexport function makeAlphaMaskPaintBufferCommitter(accumulator: PixelAccumulator, paintBuffer: AlphaMaskPaintBuffer) {\n return function commitAlphaMaskPaintBufferToAccumulator(color: Color32, alpha = 255, blendFn = sourceOverPerfect) {\n return commitMaskPaintBuffer(accumulator, paintBuffer, color, alpha, blendFn, blendColorPixelDataAlphaMask);\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snO1xuaW1wb3J0IHsgY29tbWl0TWFza1BhaW50QnVmZmVyIH0gZnJvbSAnLi9jb21taXRNYXNrUGFpbnRCdWZmZXInO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VBbHBoYU1hc2tQYWludEJ1ZmZlckNvbW1pdHRlcihhY2N1bXVsYXRvcjogUGl4ZWxBY2N1bXVsYXRvciwgcGFpbnRCdWZmZXI6IEFscGhhTWFza1BhaW50QnVmZmVyKSB7XG4gIHJldHVybiBmdW5jdGlvbiBjb21taXRBbHBoYU1hc2tQYWludEJ1ZmZlclRvQWNjdW11bGF0b3IoY29sb3I6IENvbG9yMzIsIGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QpIHtcbiAgICByZXR1cm4gY29tbWl0TWFza1BhaW50QnVmZmVyKGFjY3VtdWxhdG9yLCBwYWludEJ1ZmZlciwgY29sb3IsIGFscGhhLCBibGVuZEZuLCBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKTtcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","export const DEFAULT_CANVAS_FACTORY: CanvasObjectFactory<any> = (w, h) => new OffscreenCanvas(w, h);\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgREVGQVVMVF9DQU5WQVNfRkFDVE9SWTogQ2FudmFzT2JqZWN0RmFjdG9yeTxhbnk+ID0gKHcsIGgpID0+IG5ldyBPZmZzY3JlZW5DYW52YXModywgaCk7Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../Mask/_mask-types';\nimport { TileType } from './_tile-types';\nexport const makeAlphaMaskTile: TileFactory<AlphaMaskTile> = (id: number, tx: number, ty: number, tileSize: number, tileArea: number) => {\n return {\n tileType: TileType.MASK,\n type: MaskType.ALPHA,\n data: new Uint8Array(tileArea),\n w: tileSize,\n h: tileSize,\n id,\n tx,\n ty\n };\n};\nexport const makeBinaryMaskTile: TileFactory<BinaryMaskTile> = (id: number, tx: number, ty: number, tileSize: number, tileArea: number) => {\n return {\n tileType: TileType.MASK,\n type: MaskType.BINARY,\n data: new Uint8Array(tileArea),\n w: tileSize,\n h: tileSize,\n id,\n tx,\n ty\n };\n};\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgVGlsZVR5cGUgfSBmcm9tICcuL190aWxlLXR5cGVzJztcbmV4cG9ydCBjb25zdCBtYWtlQWxwaGFNYXNrVGlsZTogVGlsZUZhY3Rvcnk8QWxwaGFNYXNrVGlsZT4gPSAoaWQ6IG51bWJlciwgdHg6IG51bWJlciwgdHk6IG51bWJlciwgdGlsZVNpemU6IG51bWJlciwgdGlsZUFyZWE6IG51bWJlcikgPT4ge1xuICByZXR1cm4ge1xuICAgIHRpbGVUeXBlOiBUaWxlVHlwZS5NQVNLLFxuICAgIHR5cGU6IE1hc2tUeXBlLkFMUEhBLFxuICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KHRpbGVBcmVhKSxcbiAgICB3OiB0aWxlU2l6ZSxcbiAgICBoOiB0aWxlU2l6ZSxcbiAgICBpZCxcbiAgICB0eCxcbiAgICB0eVxuICB9O1xufTtcbmV4cG9ydCBjb25zdCBtYWtlQmluYXJ5TWFza1RpbGU6IFRpbGVGYWN0b3J5PEJpbmFyeU1hc2tUaWxlPiA9IChpZDogbnVtYmVyLCB0eDogbnVtYmVyLCB0eTogbnVtYmVyLCB0aWxlU2l6ZTogbnVtYmVyLCB0aWxlQXJlYTogbnVtYmVyKSA9PiB7XG4gIHJldHVybiB7XG4gICAgdGlsZVR5cGU6IFRpbGVUeXBlLk1BU0ssXG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KHRpbGVBcmVhKSxcbiAgICB3OiB0aWxlU2l6ZSxcbiAgICBoOiB0aWxlU2l6ZSxcbiAgICBpZCxcbiAgICB0eCxcbiAgICB0eVxuICB9O1xufTsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../../_types';\nimport { DEFAULT_CANVAS_FACTORY } from '../../Internal/_constants';\nimport { CANVAS_CTX_FAILED } from '../../Internal/_errors';\nimport { makePixelData } from '../../PixelData/PixelData';\nexport type AlphaMaskPaintBufferCanvasRenderer = ReturnType<typeof makeAlphaMaskPaintBufferCanvasRenderer>;\nexport function makeAlphaMaskPaintBufferCanvasRenderer(paintBuffer: AlphaMaskPaintBuffer, canvasFactory: CanvasObjectFactory<any> = DEFAULT_CANVAS_FACTORY) {\n const config = paintBuffer.config;\n const tileSize = config.tileSize;\n const tileShift = config.tileShift;\n const tileArea = config.tileArea;\n const lookup = paintBuffer.lookup;\n const canvas = canvasFactory(tileSize, tileSize);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n const bridge = makePixelData(new ImageData(tileSize, tileSize));\n const view32 = bridge.data;\n return function drawPaintBuffer(targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, color: Color32, alpha = 255, compOperation: GlobalCompositeOperation = 'source-over'): void {\n if (alpha === 0) return;\n const baseSrcAlpha = color >>> 24;\n const colorRGB = color & 0x00ffffff;\n if (baseSrcAlpha === 0) return;\n targetCtx.globalAlpha = alpha / 255;\n targetCtx.globalCompositeOperation = compOperation;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const data8 = tile.data;\n view32.fill(0);\n for (let p = 0; p < tileArea; p++) {\n const maskA = data8[p];\n if (maskA === 0) continue;\n\n // If mask is solid, the final pixel is just the unmodified color\n if (maskA === 255) {\n view32[p] = color;\n } else {\n // Otherwise, blend the color's inherent alpha with the mask's alpha\n const t = baseSrcAlpha * maskA + 128;\n const finalA = t + (t >> 8) >> 8;\n view32[p] = (colorRGB | finalA << 24) >>> 0 as Color32;\n }\n }\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n ctx.putImageData(bridge.imageData, 0, 0);\n targetCtx.drawImage(canvas, dx, dy);\n }\n }\n targetCtx.globalAlpha = 1;\n targetCtx.globalCompositeOperation = 'source-over';\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi8uLi9fdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9DQU5WQVNfRkFDVE9SWSB9IGZyb20gJy4uLy4uL0ludGVybmFsL19jb25zdGFudHMnO1xuaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuLi8uLi9JbnRlcm5hbC9fZXJyb3JzJztcbmltcG9ydCB7IG1ha2VQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvUGl4ZWxEYXRhJztcbmV4cG9ydCB0eXBlIEFscGhhTWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQWxwaGFNYXNrUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcj47XG5leHBvcnQgZnVuY3Rpb24gbWFrZUFscGhhTWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIocGFpbnRCdWZmZXI6IEFscGhhTWFza1BhaW50QnVmZmVyLCBjYW52YXNGYWN0b3J5OiBDYW52YXNPYmplY3RGYWN0b3J5PGFueT4gPSBERUZBVUxUX0NBTlZBU19GQUNUT1JZKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHBhaW50QnVmZmVyLmNvbmZpZztcbiAgY29uc3QgdGlsZVNpemUgPSBjb25maWcudGlsZVNpemU7XG4gIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnQ7XG4gIGNvbnN0IHRpbGVBcmVhID0gY29uZmlnLnRpbGVBcmVhO1xuICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXA7XG4gIGNvbnN0IGNhbnZhcyA9IGNhbnZhc0ZhY3RvcnkodGlsZVNpemUsIHRpbGVTaXplKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGNvbnN0IGJyaWRnZSA9IG1ha2VQaXhlbERhdGEobmV3IEltYWdlRGF0YSh0aWxlU2l6ZSwgdGlsZVNpemUpKTtcbiAgY29uc3QgdmlldzMyID0gYnJpZGdlLmRhdGE7XG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIodGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGNvbG9yOiBDb2xvcjMyLCBhbHBoYSA9IDI1NSwgY29tcE9wZXJhdGlvbjogR2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJyk6IHZvaWQge1xuICAgIGlmIChhbHBoYSA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNDtcbiAgICBjb25zdCBjb2xvclJHQiA9IGNvbG9yICYgMHgwMGZmZmZmZjtcbiAgICBpZiAoYmFzZVNyY0FscGhhID09PSAwKSByZXR1cm47XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gYWxwaGEgLyAyNTU7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBPcGVyYXRpb247XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkYXRhOCA9IHRpbGUuZGF0YTtcbiAgICAgICAgdmlldzMyLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgdGlsZUFyZWE7IHArKykge1xuICAgICAgICAgIGNvbnN0IG1hc2tBID0gZGF0YThbcF07XG4gICAgICAgICAgaWYgKG1hc2tBID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIElmIG1hc2sgaXMgc29saWQsIHRoZSBmaW5hbCBwaXhlbCBpcyBqdXN0IHRoZSB1bm1vZGlmaWVkIGNvbG9yXG4gICAgICAgICAgaWYgKG1hc2tBID09PSAyNTUpIHtcbiAgICAgICAgICAgIHZpZXczMltwXSA9IGNvbG9yO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGJsZW5kIHRoZSBjb2xvcidzIGluaGVyZW50IGFscGhhIHdpdGggdGhlIG1hc2sncyBhbHBoYVxuICAgICAgICAgICAgY29uc3QgdCA9IGJhc2VTcmNBbHBoYSAqIG1hc2tBICsgMTI4O1xuICAgICAgICAgICAgY29uc3QgZmluYWxBID0gdCArICh0ID4+IDgpID4+IDg7XG4gICAgICAgICAgICB2aWV3MzJbcF0gPSAoY29sb3JSR0IgfCBmaW5hbEEgPDwgMjQpID4+PiAwIGFzIENvbG9yMzI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGNvbnN0IGR5ID0gdGlsZS50eSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoYnJpZGdlLmltYWdlRGF0YSwgMCwgMCk7XG4gICAgICAgIHRhcmdldEN0eC5kcmF3SW1hZ2UoY2FudmFzLCBkeCwgZHkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0YXJnZXRDdHguZ2xvYmFsQWxwaGEgPSAxO1xuICAgIHRhcmdldEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { DEFAULT_CANVAS_FACTORY } from '../../Internal/_constants';\nimport { makeAlphaMaskTile } from '../../Tile/MaskTile';\nimport { TilePool } from '../../Tile/TilePool';\nimport { AlphaMaskPaintBuffer } from '../AlphaMaskPaintBuffer';\nimport { makeAlphaMaskPaintBufferCanvasRenderer } from '../Render/AlphaMaskPaintBufferCanvasRenderer';\nimport { makeAlphaMaskPaintBufferCommitter } from './AlphaMaskPaintBufferCommitter';\nexport type AlphaMaskPaintBufferManager = Pick<AlphaMaskPaintBuffer, 'paintAlphaMask' | 'paintBinaryMask' | 'paintRect'> & {\n commit: ReturnType<typeof makeAlphaMaskPaintBufferCommitter>;\n draw: ReturnType<typeof makeAlphaMaskPaintBufferCanvasRenderer>;\n clear: () => void;\n};\nexport function makeAlphaMaskPaintBufferManager(writer: Pick<PixelWriter<any>, 'accumulator' | 'config'>, canvasFactory: CanvasObjectFactory<any> = DEFAULT_CANVAS_FACTORY): AlphaMaskPaintBufferManager {\n const pool = new TilePool(writer.config, makeAlphaMaskTile);\n const buffer = new AlphaMaskPaintBuffer(writer.config, pool);\n const draw = makeAlphaMaskPaintBufferCanvasRenderer(buffer, canvasFactory);\n return {\n clear: buffer.clear.bind(buffer),\n paintRect: buffer.paintRect.bind(buffer),\n paintAlphaMask: buffer.paintAlphaMask.bind(buffer),\n paintBinaryMask: buffer.paintBinaryMask.bind(buffer),\n commit: makeAlphaMaskPaintBufferCommitter(writer.accumulator, buffer),\n draw\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX0NBTlZBU19GQUNUT1JZIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWwvX2NvbnN0YW50cyc7XG5pbXBvcnQgeyBtYWtlQWxwaGFNYXNrVGlsZSB9IGZyb20gJy4uLy4uL1RpbGUvTWFza1RpbGUnO1xuaW1wb3J0IHsgVGlsZVBvb2wgfSBmcm9tICcuLi8uLi9UaWxlL1RpbGVQb29sJztcbmltcG9ydCB7IEFscGhhTWFza1BhaW50QnVmZmVyIH0gZnJvbSAnLi4vQWxwaGFNYXNrUGFpbnRCdWZmZXInO1xuaW1wb3J0IHsgbWFrZUFscGhhTWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIgfSBmcm9tICcuLi9SZW5kZXIvQWxwaGFNYXNrUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcic7XG5pbXBvcnQgeyBtYWtlQWxwaGFNYXNrUGFpbnRCdWZmZXJDb21taXR0ZXIgfSBmcm9tICcuL0FscGhhTWFza1BhaW50QnVmZmVyQ29tbWl0dGVyJztcbmV4cG9ydCB0eXBlIEFscGhhTWFza1BhaW50QnVmZmVyTWFuYWdlciA9IFBpY2s8QWxwaGFNYXNrUGFpbnRCdWZmZXIsICdwYWludEFscGhhTWFzaycgfCAncGFpbnRCaW5hcnlNYXNrJyB8ICdwYWludFJlY3QnPiAmIHtcbiAgY29tbWl0OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQWxwaGFNYXNrUGFpbnRCdWZmZXJDb21taXR0ZXI+O1xuICBkcmF3OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQWxwaGFNYXNrUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcj47XG4gIGNsZWFyOiAoKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQWxwaGFNYXNrUGFpbnRCdWZmZXJNYW5hZ2VyKHdyaXRlcjogUGljazxQaXhlbFdyaXRlcjxhbnk+LCAnYWNjdW11bGF0b3InIHwgJ2NvbmZpZyc+LCBjYW52YXNGYWN0b3J5OiBDYW52YXNPYmplY3RGYWN0b3J5PGFueT4gPSBERUZBVUxUX0NBTlZBU19GQUNUT1JZKTogQWxwaGFNYXNrUGFpbnRCdWZmZXJNYW5hZ2VyIHtcbiAgY29uc3QgcG9vbCA9IG5ldyBUaWxlUG9vbCh3cml0ZXIuY29uZmlnLCBtYWtlQWxwaGFNYXNrVGlsZSk7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBBbHBoYU1hc2tQYWludEJ1ZmZlcih3cml0ZXIuY29uZmlnLCBwb29sKTtcbiAgY29uc3QgZHJhdyA9IG1ha2VBbHBoYU1hc2tQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyKGJ1ZmZlciwgY2FudmFzRmFjdG9yeSk7XG4gIHJldHVybiB7XG4gICAgY2xlYXI6IGJ1ZmZlci5jbGVhci5iaW5kKGJ1ZmZlciksXG4gICAgcGFpbnRSZWN0OiBidWZmZXIucGFpbnRSZWN0LmJpbmQoYnVmZmVyKSxcbiAgICBwYWludEFscGhhTWFzazogYnVmZmVyLnBhaW50QWxwaGFNYXNrLmJpbmQoYnVmZmVyKSxcbiAgICBwYWludEJpbmFyeU1hc2s6IGJ1ZmZlci5wYWludEJpbmFyeU1hc2suYmluZChidWZmZXIpLFxuICAgIGNvbW1pdDogbWFrZUFscGhhTWFza1BhaW50QnVmZmVyQ29tbWl0dGVyKHdyaXRlci5hY2N1bXVsYXRvciwgYnVmZmVyKSxcbiAgICBkcmF3XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask';\nimport { commitMaskPaintBuffer } from './commitMaskPaintBuffer';\nexport function makeBinaryMaskPaintBufferCommitter(accumulator: PixelAccumulator, paintBuffer: BinaryMaskPaintBuffer) {\n return function commitBinaryMaskPaintBufferToAccumulator(color: Color32, alpha = 255, blendFn = sourceOverPerfect) {\n return commitMaskPaintBuffer(accumulator, paintBuffer, color, alpha, blendFn, blendColorPixelDataBinaryMask);\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyBjb21taXRNYXNrUGFpbnRCdWZmZXIgfSBmcm9tICcuL2NvbW1pdE1hc2tQYWludEJ1ZmZlcic7XG5leHBvcnQgZnVuY3Rpb24gbWFrZUJpbmFyeU1hc2tQYWludEJ1ZmZlckNvbW1pdHRlcihhY2N1bXVsYXRvcjogUGl4ZWxBY2N1bXVsYXRvciwgcGFpbnRCdWZmZXI6IEJpbmFyeU1hc2tQYWludEJ1ZmZlcikge1xuICByZXR1cm4gZnVuY3Rpb24gY29tbWl0QmluYXJ5TWFza1BhaW50QnVmZmVyVG9BY2N1bXVsYXRvcihjb2xvcjogQ29sb3IzMiwgYWxwaGEgPSAyNTUsIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCkge1xuICAgIHJldHVybiBjb21taXRNYXNrUGFpbnRCdWZmZXIoYWNjdW11bGF0b3IsIHBhaW50QnVmZmVyLCBjb2xvciwgYWxwaGEsIGJsZW5kRm4sIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKTtcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { DEFAULT_CANVAS_FACTORY } from '../../Internal/_constants';\nimport { CANVAS_CTX_FAILED } from '../../Internal/_errors';\nimport { makePixelData } from '../../PixelData/PixelData';\nexport type BinaryMaskPaintBufferCanvasRenderer = ReturnType<typeof makeBinaryMaskPaintBufferCanvasRenderer>;\nexport function makeBinaryMaskPaintBufferCanvasRenderer(paintBuffer: BinaryMaskPaintBuffer, canvasFactory: CanvasObjectFactory<any> = DEFAULT_CANVAS_FACTORY) {\n const config = paintBuffer.config;\n const tileSize = config.tileSize;\n const tileShift = config.tileShift;\n const tileArea = config.tileArea;\n const lookup = paintBuffer.lookup;\n const canvas = canvasFactory(tileSize, tileSize);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n const bridge = makePixelData(new ImageData(tileSize, tileSize));\n const view32 = bridge.data;\n return function drawPaintBuffer(targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, color: Color32, alpha = 255, compOperation: GlobalCompositeOperation = 'source-over'): void {\n if (alpha === 0) return;\n const baseSrcAlpha = color >>> 24;\n if (baseSrcAlpha === 0) return;\n targetCtx.globalAlpha = alpha / 255;\n targetCtx.globalCompositeOperation = compOperation;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const data8 = tile.data;\n view32.fill(0);\n for (let p = 0; p < tileArea; p++) {\n // If mask is solid, the final pixel is just the unmodified color\n if (data8[p] === 1) {\n view32[p] = color;\n }\n }\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n ctx.putImageData(bridge.imageData, 0, 0);\n targetCtx.drawImage(canvas, dx, dy);\n }\n }\n targetCtx.globalAlpha = 1;\n targetCtx.globalCompositeOperation = 'source-over';\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX0NBTlZBU19GQUNUT1JZIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWwvX2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uLy4uL0ludGVybmFsL19lcnJvcnMnO1xuaW1wb3J0IHsgbWFrZVBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9QaXhlbERhdGEnO1xuZXhwb3J0IHR5cGUgQmluYXJ5TWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQmluYXJ5TWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXI+O1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VCaW5hcnlNYXNrUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcihwYWludEJ1ZmZlcjogQmluYXJ5TWFza1BhaW50QnVmZmVyLCBjYW52YXNGYWN0b3J5OiBDYW52YXNPYmplY3RGYWN0b3J5PGFueT4gPSBERUZBVUxUX0NBTlZBU19GQUNUT1JZKSB7XG4gIGNvbnN0IGNvbmZpZyA9IHBhaW50QnVmZmVyLmNvbmZpZztcbiAgY29uc3QgdGlsZVNpemUgPSBjb25maWcudGlsZVNpemU7XG4gIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnQ7XG4gIGNvbnN0IHRpbGVBcmVhID0gY29uZmlnLnRpbGVBcmVhO1xuICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXA7XG4gIGNvbnN0IGNhbnZhcyA9IGNhbnZhc0ZhY3RvcnkodGlsZVNpemUsIHRpbGVTaXplKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGNvbnN0IGJyaWRnZSA9IG1ha2VQaXhlbERhdGEobmV3IEltYWdlRGF0YSh0aWxlU2l6ZSwgdGlsZVNpemUpKTtcbiAgY29uc3QgdmlldzMyID0gYnJpZGdlLmRhdGE7XG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIodGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGNvbG9yOiBDb2xvcjMyLCBhbHBoYSA9IDI1NSwgY29tcE9wZXJhdGlvbjogR2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJyk6IHZvaWQge1xuICAgIGlmIChhbHBoYSA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNDtcbiAgICBpZiAoYmFzZVNyY0FscGhhID09PSAwKSByZXR1cm47XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gYWxwaGEgLyAyNTU7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBPcGVyYXRpb247XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkYXRhOCA9IHRpbGUuZGF0YTtcbiAgICAgICAgdmlldzMyLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgdGlsZUFyZWE7IHArKykge1xuICAgICAgICAgIC8vIElmIG1hc2sgaXMgc29saWQsIHRoZSBmaW5hbCBwaXhlbCBpcyBqdXN0IHRoZSB1bm1vZGlmaWVkIGNvbG9yXG4gICAgICAgICAgaWYgKGRhdGE4W3BdID09PSAxKSB7XG4gICAgICAgICAgICB2aWV3MzJbcF0gPSBjb2xvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZHggPSB0aWxlLnR4IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShicmlkZ2UuaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICAgICAgdGFyZ2V0Q3R4LmRyYXdJbWFnZShjYW52YXMsIGR4LCBkeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldEN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { DEFAULT_CANVAS_FACTORY } from '../../Internal/_constants';\nimport { makeBinaryMaskTile } from '../../Tile/MaskTile';\nimport { TilePool } from '../../Tile/TilePool';\nimport { BinaryMaskPaintBuffer } from '../BinaryMaskPaintBuffer';\nimport { makeBinaryMaskPaintBufferCanvasRenderer } from '../Render/BinaryMaskPaintBufferCanvasRenderer';\nimport { makeBinaryMaskPaintBufferCommitter } from './BinaryMaskPaintBufferCommitter';\nexport type BinaryMaskPaintBufferManager = Pick<BinaryMaskPaintBuffer, 'paintBinaryMask' | 'paintRect'> & {\n commit: ReturnType<typeof makeBinaryMaskPaintBufferCommitter>;\n draw: ReturnType<typeof makeBinaryMaskPaintBufferCanvasRenderer>;\n clear: () => void;\n};\nexport function makeBinaryMaskPaintBufferManager(writer: Pick<PixelWriter<any>, 'accumulator' | 'config'>, canvasFactory: CanvasObjectFactory<any> = DEFAULT_CANVAS_FACTORY): BinaryMaskPaintBufferManager {\n const pool = new TilePool(writer.config, makeBinaryMaskTile);\n const buffer = new BinaryMaskPaintBuffer(writer.config, pool);\n const draw = makeBinaryMaskPaintBufferCanvasRenderer(buffer, canvasFactory);\n return {\n clear: buffer.clear.bind(buffer),\n paintRect: buffer.paintRect.bind(buffer),\n paintBinaryMask: buffer.paintBinaryMask.bind(buffer),\n commit: makeBinaryMaskPaintBufferCommitter(writer.accumulator, buffer),\n draw\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX0NBTlZBU19GQUNUT1JZIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWwvX2NvbnN0YW50cyc7XG5pbXBvcnQgeyBtYWtlQmluYXJ5TWFza1RpbGUgfSBmcm9tICcuLi8uLi9UaWxlL01hc2tUaWxlJztcbmltcG9ydCB7IFRpbGVQb29sIH0gZnJvbSAnLi4vLi4vVGlsZS9UaWxlUG9vbCc7XG5pbXBvcnQgeyBCaW5hcnlNYXNrUGFpbnRCdWZmZXIgfSBmcm9tICcuLi9CaW5hcnlNYXNrUGFpbnRCdWZmZXInO1xuaW1wb3J0IHsgbWFrZUJpbmFyeU1hc2tQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyIH0gZnJvbSAnLi4vUmVuZGVyL0JpbmFyeU1hc2tQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyJztcbmltcG9ydCB7IG1ha2VCaW5hcnlNYXNrUGFpbnRCdWZmZXJDb21taXR0ZXIgfSBmcm9tICcuL0JpbmFyeU1hc2tQYWludEJ1ZmZlckNvbW1pdHRlcic7XG5leHBvcnQgdHlwZSBCaW5hcnlNYXNrUGFpbnRCdWZmZXJNYW5hZ2VyID0gUGljazxCaW5hcnlNYXNrUGFpbnRCdWZmZXIsICdwYWludEJpbmFyeU1hc2snIHwgJ3BhaW50UmVjdCc+ICYge1xuICBjb21taXQ6IFJldHVyblR5cGU8dHlwZW9mIG1ha2VCaW5hcnlNYXNrUGFpbnRCdWZmZXJDb21taXR0ZXI+O1xuICBkcmF3OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQmluYXJ5TWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXI+O1xuICBjbGVhcjogKCkgPT4gdm9pZDtcbn07XG5leHBvcnQgZnVuY3Rpb24gbWFrZUJpbmFyeU1hc2tQYWludEJ1ZmZlck1hbmFnZXIod3JpdGVyOiBQaWNrPFBpeGVsV3JpdGVyPGFueT4sICdhY2N1bXVsYXRvcicgfCAnY29uZmlnJz4sIGNhbnZhc0ZhY3Rvcnk6IENhbnZhc09iamVjdEZhY3Rvcnk8YW55PiA9IERFRkFVTFRfQ0FOVkFTX0ZBQ1RPUlkpOiBCaW5hcnlNYXNrUGFpbnRCdWZmZXJNYW5hZ2VyIHtcbiAgY29uc3QgcG9vbCA9IG5ldyBUaWxlUG9vbCh3cml0ZXIuY29uZmlnLCBtYWtlQmluYXJ5TWFza1RpbGUpO1xuICBjb25zdCBidWZmZXIgPSBuZXcgQmluYXJ5TWFza1BhaW50QnVmZmVyKHdyaXRlci5jb25maWcsIHBvb2wpO1xuICBjb25zdCBkcmF3ID0gbWFrZUJpbmFyeU1hc2tQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyKGJ1ZmZlciwgY2FudmFzRmFjdG9yeSk7XG4gIHJldHVybiB7XG4gICAgY2xlYXI6IGJ1ZmZlci5jbGVhci5iaW5kKGJ1ZmZlciksXG4gICAgcGFpbnRSZWN0OiBidWZmZXIucGFpbnRSZWN0LmJpbmQoYnVmZmVyKSxcbiAgICBwYWludEJpbmFyeU1hc2s6IGJ1ZmZlci5wYWludEJpbmFyeU1hc2suYmluZChidWZmZXIpLFxuICAgIGNvbW1pdDogbWFrZUJpbmFyeU1hc2tQYWludEJ1ZmZlckNvbW1pdHRlcih3cml0ZXIuYWNjdW11bGF0b3IsIGJ1ZmZlciksXG4gICAgZHJhd1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendPixelData } from '../../PixelData/blendPixelData';\nconst SCRATCH_OPTS = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n};\nexport function commitColorPaintBuffer(accumulator: PixelAccumulator, paintBuffer: ColorPaintBuffer, alpha = 255, blendFn = sourceOverPerfect, blendPixelDataFn = blendPixelData) {\n const config = accumulator.config;\n const tileShift = config.tileShift;\n const lookup = paintBuffer.lookup;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const didChange = accumulator.storeTileBeforeState(tile.id, tile.tx, tile.ty);\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n SCRATCH_OPTS.x = dx;\n SCRATCH_OPTS.y = dy;\n SCRATCH_OPTS.w = tile.w;\n SCRATCH_OPTS.h = tile.h;\n didChange(blendPixelDataFn(config.target, tile, SCRATCH_OPTS));\n }\n }\n paintBuffer.clear();\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSc7XG5jb25zdCBTQ1JBVENIX09QVFMgPSB7XG4gIGFscGhhOiAyNTUsXG4gIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICB4OiAwLFxuICB5OiAwLFxuICB3OiAwLFxuICBoOiAwXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGNvbW1pdENvbG9yUGFpbnRCdWZmZXIoYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3IsIHBhaW50QnVmZmVyOiBDb2xvclBhaW50QnVmZmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0LCBibGVuZFBpeGVsRGF0YUZuID0gYmxlbmRQaXhlbERhdGEpIHtcbiAgY29uc3QgY29uZmlnID0gYWNjdW11bGF0b3IuY29uZmlnO1xuICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXA7XG4gIFNDUkFUQ0hfT1BUUy5hbHBoYSA9IGFscGhhO1xuICBTQ1JBVENIX09QVFMuYmxlbmRGbiA9IGJsZW5kRm47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdGlsZSA9IGxvb2t1cFtpXTtcbiAgICBpZiAodGlsZSkge1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gYWNjdW11bGF0b3Iuc3RvcmVUaWxlQmVmb3JlU3RhdGUodGlsZS5pZCwgdGlsZS50eCwgdGlsZS50eSk7XG4gICAgICBjb25zdCBkeCA9IHRpbGUudHggPDwgdGlsZVNoaWZ0O1xuICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdDtcbiAgICAgIFNDUkFUQ0hfT1BUUy54ID0gZHg7XG4gICAgICBTQ1JBVENIX09QVFMueSA9IGR5O1xuICAgICAgU0NSQVRDSF9PUFRTLncgPSB0aWxlLnc7XG4gICAgICBTQ1JBVENIX09QVFMuaCA9IHRpbGUuaDtcbiAgICAgIGRpZENoYW5nZShibGVuZFBpeGVsRGF0YUZuKGNvbmZpZy50YXJnZXQsIHRpbGUsIFNDUkFUQ0hfT1BUUykpO1xuICAgIH1cbiAgfVxuICBwYWludEJ1ZmZlci5jbGVhcigpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\nimport { blendPixelData } from '../../PixelData/blendPixelData';\nimport { commitColorPaintBuffer } from './commitColorPaintBuffer';\nexport function makeColorPaintBufferCommitter(accumulator: PixelAccumulator, paintBuffer: ColorPaintBuffer) {\n return function commitColorPaintBufferToAccumulator(alpha = 255, blendFn = sourceOverPerfect) {\n return commitColorPaintBuffer(accumulator, paintBuffer, alpha, blendFn, blendPixelData);\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSc7XG5pbXBvcnQgeyBjb21taXRDb2xvclBhaW50QnVmZmVyIH0gZnJvbSAnLi9jb21taXRDb2xvclBhaW50QnVmZmVyJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29sb3JQYWludEJ1ZmZlckNvbW1pdHRlcihhY2N1bXVsYXRvcjogUGl4ZWxBY2N1bXVsYXRvciwgcGFpbnRCdWZmZXI6IENvbG9yUGFpbnRCdWZmZXIpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGNvbW1pdENvbG9yUGFpbnRCdWZmZXJUb0FjY3VtdWxhdG9yKGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QpIHtcbiAgICByZXR1cm4gY29tbWl0Q29sb3JQYWludEJ1ZmZlcihhY2N1bXVsYXRvciwgcGFpbnRCdWZmZXIsIGFscGhhLCBibGVuZEZuLCBibGVuZFBpeGVsRGF0YSk7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { DEFAULT_CANVAS_FACTORY } from '../../Internal/_constants';\nimport { CANVAS_CTX_FAILED } from '../../Internal/_errors';\nexport type ColorPaintBufferCanvasRenderer = ReturnType<typeof makeColorPaintBufferCanvasRenderer>;\nexport function makeColorPaintBufferCanvasRenderer(paintBuffer: ColorPaintBuffer, canvasFactory: CanvasObjectFactory<any> = DEFAULT_CANVAS_FACTORY) {\n const config = paintBuffer.config;\n const tileSize = config.tileSize;\n const tileShift = config.tileShift;\n const lookup = paintBuffer.lookup;\n const canvas = canvasFactory(tileSize, tileSize);\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\n return function drawPaintBuffer(targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, alpha = 255, compOperation: GlobalCompositeOperation = 'source-over'): void {\n targetCtx.globalAlpha = alpha / 255;\n targetCtx.globalCompositeOperation = compOperation;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n ctx.putImageData(tile.imageData, 0, 0);\n targetCtx.drawImage(canvas, dx, dy);\n }\n }\n targetCtx.globalAlpha = 1;\n targetCtx.globalCompositeOperation = 'source-over';\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX0NBTlZBU19GQUNUT1JZIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWwvX2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uLy4uL0ludGVybmFsL19lcnJvcnMnO1xuZXhwb3J0IHR5cGUgQ29sb3JQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUNvbG9yUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcj47XG5leHBvcnQgZnVuY3Rpb24gbWFrZUNvbG9yUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcihwYWludEJ1ZmZlcjogQ29sb3JQYWludEJ1ZmZlciwgY2FudmFzRmFjdG9yeTogQ2FudmFzT2JqZWN0RmFjdG9yeTxhbnk+ID0gREVGQVVMVF9DQU5WQVNfRkFDVE9SWSkge1xuICBjb25zdCBjb25maWcgPSBwYWludEJ1ZmZlci5jb25maWc7XG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXA7XG4gIGNvbnN0IGNhbnZhcyA9IGNhbnZhc0ZhY3RvcnkodGlsZVNpemUsIHRpbGVTaXplKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIodGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgfCBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFscGhhID0gMjU1LCBjb21wT3BlcmF0aW9uOiBHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInKTogdm9pZCB7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gYWxwaGEgLyAyNTU7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBPcGVyYXRpb247XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkeCA9IHRpbGUudHggPDwgdGlsZVNoaWZ0O1xuICAgICAgICBjb25zdCBkeSA9IHRpbGUudHkgPDwgdGlsZVNoaWZ0O1xuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKHRpbGUuaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICAgICAgdGFyZ2V0Q3R4LmRyYXdJbWFnZShjYW52YXMsIGR4LCBkeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldEN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { DEFAULT_CANVAS_FACTORY } from '../../Internal/_constants';\nimport { makePixelTile } from '../../Tile/PixelTile';\nimport { TilePool } from '../../Tile/TilePool';\nimport { ColorPaintBuffer } from '../ColorPaintBuffer';\nimport { makeColorPaintBufferCanvasRenderer } from '../Render/ColorPaintBufferCanvasRenderer';\nimport { makeColorPaintBufferCommitter } from './ColorPaintBufferCommitter';\nexport type ColorPaintBufferManager = Pick<ColorPaintBuffer, 'paintAlphaMask' | 'paintBinaryMask' | 'paintRect'> & {\n commit: ReturnType<typeof makeColorPaintBufferCommitter>;\n draw: ReturnType<typeof makeColorPaintBufferCanvasRenderer>;\n clear: () => void;\n};\nexport function makeColorPaintBufferManager(writer: Pick<PixelWriter<any>, 'accumulator' | 'config'>, canvasFactory: CanvasObjectFactory<any> = DEFAULT_CANVAS_FACTORY): ColorPaintBufferManager {\n const pool = new TilePool(writer.config, makePixelTile);\n const buffer = new ColorPaintBuffer(writer.config, pool);\n const draw = makeColorPaintBufferCanvasRenderer(buffer, canvasFactory);\n return {\n clear: buffer.clear.bind(buffer),\n paintRect: buffer.paintRect.bind(buffer),\n paintAlphaMask: buffer.paintAlphaMask.bind(buffer),\n paintBinaryMask: buffer.paintBinaryMask.bind(buffer),\n commit: makeColorPaintBufferCommitter(writer.accumulator, buffer),\n draw\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBERUZBVUxUX0NBTlZBU19GQUNUT1JZIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWwvX2NvbnN0YW50cyc7XG5pbXBvcnQgeyBtYWtlUGl4ZWxUaWxlIH0gZnJvbSAnLi4vLi4vVGlsZS9QaXhlbFRpbGUnO1xuaW1wb3J0IHsgVGlsZVBvb2wgfSBmcm9tICcuLi8uLi9UaWxlL1RpbGVQb29sJztcbmltcG9ydCB7IENvbG9yUGFpbnRCdWZmZXIgfSBmcm9tICcuLi9Db2xvclBhaW50QnVmZmVyJztcbmltcG9ydCB7IG1ha2VDb2xvclBhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIgfSBmcm9tICcuLi9SZW5kZXIvQ29sb3JQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyJztcbmltcG9ydCB7IG1ha2VDb2xvclBhaW50QnVmZmVyQ29tbWl0dGVyIH0gZnJvbSAnLi9Db2xvclBhaW50QnVmZmVyQ29tbWl0dGVyJztcbmV4cG9ydCB0eXBlIENvbG9yUGFpbnRCdWZmZXJNYW5hZ2VyID0gUGljazxDb2xvclBhaW50QnVmZmVyLCAncGFpbnRBbHBoYU1hc2snIHwgJ3BhaW50QmluYXJ5TWFzaycgfCAncGFpbnRSZWN0Jz4gJiB7XG4gIGNvbW1pdDogUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUNvbG9yUGFpbnRCdWZmZXJDb21taXR0ZXI+O1xuICBkcmF3OiBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQ29sb3JQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyPjtcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XG59O1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VDb2xvclBhaW50QnVmZmVyTWFuYWdlcih3cml0ZXI6IFBpY2s8UGl4ZWxXcml0ZXI8YW55PiwgJ2FjY3VtdWxhdG9yJyB8ICdjb25maWcnPiwgY2FudmFzRmFjdG9yeTogQ2FudmFzT2JqZWN0RmFjdG9yeTxhbnk+ID0gREVGQVVMVF9DQU5WQVNfRkFDVE9SWSk6IENvbG9yUGFpbnRCdWZmZXJNYW5hZ2VyIHtcbiAgY29uc3QgcG9vbCA9IG5ldyBUaWxlUG9vbCh3cml0ZXIuY29uZmlnLCBtYWtlUGl4ZWxUaWxlKTtcbiAgY29uc3QgYnVmZmVyID0gbmV3IENvbG9yUGFpbnRCdWZmZXIod3JpdGVyLmNvbmZpZywgcG9vbCk7XG4gIGNvbnN0IGRyYXcgPSBtYWtlQ29sb3JQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyKGJ1ZmZlciwgY2FudmFzRmFjdG9yeSk7XG4gIHJldHVybiB7XG4gICAgY2xlYXI6IGJ1ZmZlci5jbGVhci5iaW5kKGJ1ZmZlciksXG4gICAgcGFpbnRSZWN0OiBidWZmZXIucGFpbnRSZWN0LmJpbmQoYnVmZmVyKSxcbiAgICBwYWludEFscGhhTWFzazogYnVmZmVyLnBhaW50QWxwaGFNYXNrLmJpbmQoYnVmZmVyKSxcbiAgICBwYWludEJpbmFyeU1hc2s6IGJ1ZmZlci5wYWludEJpbmFyeU1hc2suYmluZChidWZmZXIpLFxuICAgIGNvbW1pdDogbWFrZUNvbG9yUGFpbnRCdWZmZXJDb21taXR0ZXIod3JpdGVyLmFjY3VtdWxhdG9yLCBidWZmZXIpLFxuICAgIGRyYXdcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../Mask/_mask-types';\nimport { PaintMaskOutline } from './_paint-types';\nexport function makeCirclePaintAlphaMask(size: number, fallOff: (d: number) => number = d => d): PaintAlphaMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const invR = 1 / radius;\n const centerOffset = (-Math.ceil(radius - 0.5));\n for (let y = 0; y < size; y++) {\n const rowOffset = y * size;\n const dy = y - radius + 0.5;\n const dy2 = dy * dy;\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5;\n const distSqr = dx * dx + dy2;\n if (distSqr <= radius * radius) {\n const dist = Math.sqrt(distSqr) * invR;\n\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity));\n }\n }\n }\n }\n return {\n type: MaskType.ALPHA,\n outlineType: PaintMaskOutline.CIRCLE,\n data,\n w: size,\n h: size,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\nexport function makeCirclePaintBinaryMask(size: number): PaintBinaryMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const r2 = radius * radius;\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5;\n const dy = y - radius + 0.5;\n const distSqr = dx * dx + dy * dy;\n if (distSqr <= r2) {\n data[y * size + x] = 1;\n }\n }\n }\n const centerOffset = (-Math.ceil(radius - 0.5));\n return {\n type: MaskType.BINARY,\n outlineType: PaintMaskOutline.CIRCLE,\n w: size,\n h: size,\n data,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgUGFpbnRNYXNrT3V0bGluZSB9IGZyb20gJy4vX3BhaW50LXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2lyY2xlUGFpbnRBbHBoYU1hc2soc2l6ZTogbnVtYmVyLCBmYWxsT2ZmOiAoZDogbnVtYmVyKSA9PiBudW1iZXIgPSBkID0+IGQpOiBQYWludEFscGhhTWFzayB7XG4gIGNvbnN0IGFyZWEgPSBzaXplICogc2l6ZTtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFyZWEpO1xuICBjb25zdCByYWRpdXMgPSBzaXplIC8gMjtcbiAgY29uc3QgaW52UiA9IDEgLyByYWRpdXM7XG4gIGNvbnN0IGNlbnRlck9mZnNldCA9ICgtTWF0aC5jZWlsKHJhZGl1cyAtIDAuNSkpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IHNpemU7IHkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IHkgKiBzaXplO1xuICAgIGNvbnN0IGR5ID0geSAtIHJhZGl1cyArIDAuNTtcbiAgICBjb25zdCBkeTIgPSBkeSAqIGR5O1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgc2l6ZTsgeCsrKSB7XG4gICAgICBjb25zdCBkeCA9IHggLSByYWRpdXMgKyAwLjU7XG4gICAgICBjb25zdCBkaXN0U3FyID0gZHggKiBkeCArIGR5MjtcbiAgICAgIGlmIChkaXN0U3FyIDw9IHJhZGl1cyAqIHJhZGl1cykge1xuICAgICAgICBjb25zdCBkaXN0ID0gTWF0aC5zcXJ0KGRpc3RTcXIpICogaW52UjtcblxuICAgICAgICAvLyBQYXNzIDEuMCBhdCBjZW50ZXIsIDAuMCBhdCBlZGdlXG4gICAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZigxIC0gZGlzdCk7XG4gICAgICAgIGlmIChzdHJlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBpbnRlbnNpdHkgPSBzdHJlbmd0aCAqIDI1NSB8IDA7XG4gICAgICAgICAgZGF0YVtyb3dPZmZzZXQgKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgaW50ZW5zaXR5KSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBvdXRsaW5lVHlwZTogUGFpbnRNYXNrT3V0bGluZS5DSVJDTEUsXG4gICAgZGF0YSxcbiAgICB3OiBzaXplLFxuICAgIGg6IHNpemUsXG4gICAgY2VudGVyT2Zmc2V0WDogY2VudGVyT2Zmc2V0LFxuICAgIGNlbnRlck9mZnNldFk6IGNlbnRlck9mZnNldFxuICB9O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VDaXJjbGVQYWludEJpbmFyeU1hc2soc2l6ZTogbnVtYmVyKTogUGFpbnRCaW5hcnlNYXNrIHtcbiAgY29uc3QgYXJlYSA9IHNpemUgKiBzaXplO1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoYXJlYSk7XG4gIGNvbnN0IHJhZGl1cyA9IHNpemUgLyAyO1xuICBjb25zdCByMiA9IHJhZGl1cyAqIHJhZGl1cztcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41O1xuICAgICAgY29uc3QgZHkgPSB5IC0gcmFkaXVzICsgMC41O1xuICAgICAgY29uc3QgZGlzdFNxciA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgaWYgKGRpc3RTcXIgPD0gcjIpIHtcbiAgICAgICAgZGF0YVt5ICogc2l6ZSArIHhdID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY29uc3QgY2VudGVyT2Zmc2V0ID0gKC1NYXRoLmNlaWwocmFkaXVzIC0gMC41KSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIG91dGxpbmVUeXBlOiBQYWludE1hc2tPdXRsaW5lLkNJUkNMRSxcbiAgICB3OiBzaXplLFxuICAgIGg6IHNpemUsXG4gICAgZGF0YSxcbiAgICBjZW50ZXJPZmZzZXRYOiBjZW50ZXJPZmZzZXQsXG4gICAgY2VudGVyT2Zmc2V0WTogY2VudGVyT2Zmc2V0XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../Mask/_mask-types';\nimport { PaintMaskOutline } from './_paint-types';\nexport function makePaintBinaryMask(mask: BinaryMask): PaintBinaryMask {\n return {\n type: MaskType.BINARY,\n outlineType: PaintMaskOutline.MASKED,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -(mask.w >> 1),\n centerOffsetY: -(mask.h >> 1)\n };\n}\nexport function makePaintAlphaMask(mask: AlphaMask): PaintAlphaMask {\n return {\n type: MaskType.ALPHA,\n outlineType: PaintMaskOutline.MASKED,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -(mask.w >> 1),\n centerOffsetY: -(mask.h >> 1)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgUGFpbnRNYXNrT3V0bGluZSB9IGZyb20gJy4vX3BhaW50LXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFpbnRCaW5hcnlNYXNrKG1hc2s6IEJpbmFyeU1hc2spOiBQYWludEJpbmFyeU1hc2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkJJTkFSWSxcbiAgICBvdXRsaW5lVHlwZTogUGFpbnRNYXNrT3V0bGluZS5NQVNLRUQsXG4gICAgZGF0YTogbWFzay5kYXRhLFxuICAgIHc6IG1hc2sudyxcbiAgICBoOiBtYXNrLmgsXG4gICAgY2VudGVyT2Zmc2V0WDogLShtYXNrLncgPj4gMSksXG4gICAgY2VudGVyT2Zmc2V0WTogLShtYXNrLmggPj4gMSlcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFpbnRBbHBoYU1hc2sobWFzazogQWxwaGFNYXNrKTogUGFpbnRBbHBoYU1hc2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkFMUEhBLFxuICAgIG91dGxpbmVUeXBlOiBQYWludE1hc2tPdXRsaW5lLk1BU0tFRCxcbiAgICBkYXRhOiBtYXNrLmRhdGEsXG4gICAgdzogbWFzay53LFxuICAgIGg6IG1hc2suaCxcbiAgICBjZW50ZXJPZmZzZXRYOiAtKG1hc2sudyA+PiAxKSxcbiAgICBjZW50ZXJPZmZzZXRZOiAtKG1hc2suaCA+PiAxKVxuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../Mask/_mask-types';\nimport { PaintMaskOutline } from './_paint-types';\nexport function makeRectFalloffPaintAlphaMask(width: number, height: number, fallOff: (d: number) => number = d => d): PaintAlphaMask {\n const fPx = Math.floor(width / 2);\n const fPy = Math.floor(height / 2);\n const invHalfW = 2 / width;\n const invHalfH = 2 / height;\n const offX = width % 2 === 0 ? 0.5 : 0;\n const offY = height % 2 === 0 ? 0.5 : 0;\n const area = width * height;\n const data = new Uint8Array(area);\n for (let y = 0; y < height; y++) {\n const dy = Math.abs(y - fPy + offY) * invHalfH;\n const rowOffset = y * width;\n for (let x = 0; x < width; x++) {\n const dx = Math.abs(x - fPx + offX) * invHalfW;\n\n // Chebyshev distance (square/rect shape)\n const dist = dx > dy ? dx : dy;\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist);\n if (strength > 0) {\n const intensity = strength * 255 | 0;\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity));\n }\n }\n }\n return {\n type: MaskType.ALPHA,\n outlineType: PaintMaskOutline.RECT,\n data: data,\n w: width,\n h: height,\n centerOffsetX: -(width >> 1),\n centerOffsetY: -(height >> 1)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgUGFpbnRNYXNrT3V0bGluZSB9IGZyb20gJy4vX3BhaW50LXR5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmVjdEZhbGxvZmZQYWludEFscGhhTWFzayh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZmFsbE9mZjogKGQ6IG51bWJlcikgPT4gbnVtYmVyID0gZCA9PiBkKTogUGFpbnRBbHBoYU1hc2sge1xuICBjb25zdCBmUHggPSBNYXRoLmZsb29yKHdpZHRoIC8gMik7XG4gIGNvbnN0IGZQeSA9IE1hdGguZmxvb3IoaGVpZ2h0IC8gMik7XG4gIGNvbnN0IGludkhhbGZXID0gMiAvIHdpZHRoO1xuICBjb25zdCBpbnZIYWxmSCA9IDIgLyBoZWlnaHQ7XG4gIGNvbnN0IG9mZlggPSB3aWR0aCAlIDIgPT09IDAgPyAwLjUgOiAwO1xuICBjb25zdCBvZmZZID0gaGVpZ2h0ICUgMiA9PT0gMCA/IDAuNSA6IDA7XG4gIGNvbnN0IGFyZWEgPSB3aWR0aCAqIGhlaWdodDtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KGFyZWEpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7XG4gICAgY29uc3QgZHkgPSBNYXRoLmFicyh5IC0gZlB5ICsgb2ZmWSkgKiBpbnZIYWxmSDtcbiAgICBjb25zdCByb3dPZmZzZXQgPSB5ICogd2lkdGg7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICBjb25zdCBkeCA9IE1hdGguYWJzKHggLSBmUHggKyBvZmZYKSAqIGludkhhbGZXO1xuXG4gICAgICAvLyBDaGVieXNoZXYgZGlzdGFuY2UgKHNxdWFyZS9yZWN0IHNoYXBlKVxuICAgICAgY29uc3QgZGlzdCA9IGR4ID4gZHkgPyBkeCA6IGR5O1xuICAgICAgLy8gUGFzcyAxLjAgYXQgY2VudGVyLCAwLjAgYXQgZWRnZVxuICAgICAgY29uc3Qgc3RyZW5ndGggPSBmYWxsT2ZmKDEgLSBkaXN0KTtcbiAgICAgIGlmIChzdHJlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgaW50ZW5zaXR5ID0gc3RyZW5ndGggKiAyNTUgfCAwO1xuICAgICAgICBkYXRhW3Jvd09mZnNldCArIHhdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBpbnRlbnNpdHkpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBvdXRsaW5lVHlwZTogUGFpbnRNYXNrT3V0bGluZS5SRUNULFxuICAgIGRhdGE6IGRhdGEsXG4gICAgdzogd2lkdGgsXG4gICAgaDogaGVpZ2h0LFxuICAgIGNlbnRlck9mZnNldFg6IC0od2lkdGggPj4gMSksXG4gICAgY2VudGVyT2Zmc2V0WTogLShoZWlnaHQgPj4gMSlcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { PaintMaskOutline } from './_paint-types';\nexport function makePaintRect(w: number, h: number): PaintRect {\n return {\n type: null,\n outlineType: PaintMaskOutline.RECT,\n data: null,\n w,\n h,\n centerOffsetX: (-(w - 1 >> 1)),\n centerOffsetY: (-(h - 1 >> 1))\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQYWludE1hc2tPdXRsaW5lIH0gZnJvbSAnLi9fcGFpbnQtdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWludFJlY3QodzogbnVtYmVyLCBoOiBudW1iZXIpOiBQYWludFJlY3Qge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IG51bGwsXG4gICAgb3V0bGluZVR5cGU6IFBhaW50TWFza091dGxpbmUuUkVDVCxcbiAgICBkYXRhOiBudWxsLFxuICAgIHcsXG4gICAgaCxcbiAgICBjZW50ZXJPZmZzZXRYOiAoLSh3IC0gMSA+PiAxKSksXG4gICAgY2VudGVyT2Zmc2V0WTogKC0oaCAtIDEgPj4gMSkpXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { setPixelData } from './PixelData';\nexport type ReusablePixelData = ReturnType<typeof makeReusablePixelData>;\n\n/**\n * Creates a factory function that manages a single, reusable PixelData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled PixelData instance.\n */\nexport function makeReusablePixelData() {\n const pixelData = {\n w: 0,\n h: 0,\n data: null as unknown as Uint32Array,\n imageData: null as unknown as ImageData\n };\n\n /**\n * Retrieves a PixelData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached PixelData object.\n */\n return function getReusablePixelData(width: number, height: number): PixelData {\n if (pixelData.w !== width || pixelData.h !== height) {\n setPixelData(pixelData, new ImageData(width, height));\n } else {\n pixelData.data.fill(0);\n }\n return pixelData;\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzZXRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsRGF0YSc7XG5leHBvcnQgdHlwZSBSZXVzYWJsZVBpeGVsRGF0YSA9IFJldHVyblR5cGU8dHlwZW9mIG1ha2VSZXVzYWJsZVBpeGVsRGF0YT47XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBtYW5hZ2VzIGEgc2luZ2xlLCByZXVzYWJsZSBQaXhlbERhdGEgaW5zdGFuY2UuXG4gKiBUaGlzIGlzIHVzZWQgdG8gbWluaW1pemUgZ2FyYmFnZSBjb2xsZWN0aW9uIG92ZXJoZWFkIGJ5IHJlY3ljbGluZyB0aGVcbiAqIHVuZGVybHlpbmcgcGl4ZWwgYnVmZmVyIGFjcm9zcyBtdWx0aXBsZSBvcGVyYXRpb25zLlxuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIHdpZHRoIGFuZCBoZWlnaHQgYW5kIHJldHVybnMgYSBwb29sZWQgUGl4ZWxEYXRhIGluc3RhbmNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFrZVJldXNhYmxlUGl4ZWxEYXRhKCkge1xuICBjb25zdCBwaXhlbERhdGEgPSB7XG4gICAgdzogMCxcbiAgICBoOiAwLFxuICAgIGRhdGE6IG51bGwgYXMgdW5rbm93biBhcyBVaW50MzJBcnJheSxcbiAgICBpbWFnZURhdGE6IG51bGwgYXMgdW5rbm93biBhcyBJbWFnZURhdGFcbiAgfTtcblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgUGl4ZWxEYXRhIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgZGltZW5zaW9ucy5cbiAgICogSWYgdGhlIHJlcXVlc3RlZCBkaW1lbnNpb25zIGRpZmZlciBmcm9tIHRoZSBjYWNoZWQgaW5zdGFuY2UsIGEgbmV3IG9uZSBpcyBhbGxvY2F0ZWQuXG4gICAqIEBwYXJhbSB3aWR0aCAtIFRoZSBkZXNpcmVkIHdpZHRoIGluIHBpeGVscy5cbiAgICogQHBhcmFtIGhlaWdodCAtIFRoZSBkZXNpcmVkIGhlaWdodCBpbiBwaXhlbHMuXG4gICAqIEByZXR1cm5zIFRoZSBjYWNoZWQgUGl4ZWxEYXRhIG9iamVjdC5cbiAgICovXG4gIHJldHVybiBmdW5jdGlvbiBnZXRSZXVzYWJsZVBpeGVsRGF0YSh3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFBpeGVsRGF0YSB7XG4gICAgaWYgKHBpeGVsRGF0YS53ICE9PSB3aWR0aCB8fCBwaXhlbERhdGEuaCAhPT0gaGVpZ2h0KSB7XG4gICAgICBzZXRQaXhlbERhdGEocGl4ZWxEYXRhLCBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGl4ZWxEYXRhLmRhdGEuZmlsbCgwKTtcbiAgICB9XG4gICAgcmV0dXJuIHBpeGVsRGF0YTtcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeReusableOffscreenCanvas } from '../../Canvas/ReusableCanvas';\nimport { packColor } from '../../color';\nimport { MaskType } from '../../Mask/_mask-types';\nimport { makeBinaryMaskFromAlphaMask } from '../../Mask/BinaryMask/makeBinaryMaskFromAlphaMask';\nimport { makeBinaryMaskOutline } from '../../Mask/BinaryMask/makeBinaryMaskOutline';\nimport { makeCircleBinaryMaskOutline } from '../../Mask/BinaryMask/makeCircleBinaryMaskOutline';\nimport { makeRectBinaryMaskOutline } from '../../Mask/BinaryMask/makeRectBinaryMaskOutline';\nimport { fillPixelDataBinaryMask } from '../../PixelData/fillPixelDataBinaryMask';\nimport { makeReusablePixelData } from '../../PixelData/ReusablePixelData';\nimport { PaintMaskOutline } from '../_paint-types';\nexport type PaintCursorRenderer = ReturnType<typeof makePaintCursorRenderer>;\nexport function makePaintCursorRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas>(reusableCanvasFactory?: () => ReusableCanvasFactory<T>) {\n const factory = (reusableCanvasFactory ?? makeReusableOffscreenCanvas) as unknown as () => ReusableCanvasFactory<T>;\n const updateBuffer = factory();\n const {\n canvas,\n ctx\n } = updateBuffer(1, 1);\n const getPixelData = makeReusablePixelData();\n let _color = packColor(0, 255, 255, 255);\n let _scale = 1;\n let currentBrush: PaintBrush = {\n type: null,\n outlineType: PaintMaskOutline.RECT,\n w: 1,\n h: 1,\n centerOffsetX: (-(10 - 1 >> 1)),\n centerOffsetY: (-(10 - 1 >> 1)),\n data: null\n };\n let outline: BinaryMask;\n function update(paintMask?: PaintBrush, scale?: number, color?: Color32, alphaThreshold = 127) {\n currentBrush = paintMask ?? currentBrush;\n _scale = scale ?? _scale;\n _color = color ?? _color;\n updateBuffer(currentBrush.w * _scale + 2 * _scale, currentBrush.h * _scale + 2 * _scale);\n if (currentBrush.type === MaskType.BINARY) {\n if (currentBrush.outlineType === PaintMaskOutline.CIRCLE) {\n outline = makeCircleBinaryMaskOutline(currentBrush.w, _scale);\n } else if (currentBrush.outlineType === PaintMaskOutline.RECT) {\n outline = makeRectBinaryMaskOutline(currentBrush.w, currentBrush.h, _scale);\n } else if (currentBrush.outlineType === PaintMaskOutline.MASKED) {\n outline = makeBinaryMaskOutline(currentBrush, _scale);\n }\n } else if (currentBrush.type === MaskType.ALPHA) {\n const mask = makeBinaryMaskFromAlphaMask(currentBrush, alphaThreshold);\n outline = makeBinaryMaskOutline(mask, _scale);\n } else {\n outline = makeRectBinaryMaskOutline(currentBrush.w, currentBrush.h, _scale);\n }\n const pixelData = getPixelData(outline.w, outline.h);\n fillPixelDataBinaryMask(pixelData, _color, outline);\n ctx.putImageData(pixelData.imageData, 0, 0);\n }\n const boundsScratch = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n function getBounds(centerX: number, centerY: number): Rect {\n boundsScratch.x = centerX + currentBrush.centerOffsetX;\n boundsScratch.y = centerY + currentBrush.centerOffsetY;\n boundsScratch.w = currentBrush.w;\n boundsScratch.h = currentBrush.h;\n return boundsScratch;\n }\n const boundsScaledScratch = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n function getOutlineBoundsScaled(centerX: number, centerY: number): Rect {\n boundsScaledScratch.x = centerX * _scale + currentBrush.centerOffsetX * _scale - 1;\n boundsScaledScratch.y = centerY * _scale + currentBrush.centerOffsetY * _scale - 1;\n boundsScaledScratch.w = currentBrush.w * _scale;\n boundsScaledScratch.h = currentBrush.h * _scale;\n return boundsScaledScratch;\n }\n function draw(drawCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, centerX: number, centerY: number) {\n const dx = centerX * _scale + currentBrush.centerOffsetX * _scale - 1;\n const dy = centerY * _scale + currentBrush.centerOffsetY * _scale - 1;\n drawCtx.drawImage(canvas, Math.floor(dx), Math.floor(dy));\n }\n function getSettings() {\n return {\n color: _color,\n scale: _scale,\n currentBrush\n };\n }\n return {\n update,\n getBounds,\n getBoundsScaled: getOutlineBoundsScaled,\n draw,\n getSettings\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUmV1c2FibGVPZmZzY3JlZW5DYW52YXMgfSBmcm9tICcuLi8uLi9DYW52YXMvUmV1c2FibGVDYW52YXMnO1xuaW1wb3J0IHsgcGFja0NvbG9yIH0gZnJvbSAnLi4vLi4vY29sb3InO1xuaW1wb3J0IHsgTWFza1R5cGUgfSBmcm9tICcuLi8uLi9NYXNrL19tYXNrLXR5cGVzJztcbmltcG9ydCB7IG1ha2VCaW5hcnlNYXNrRnJvbUFscGhhTWFzayB9IGZyb20gJy4uLy4uL01hc2svQmluYXJ5TWFzay9tYWtlQmluYXJ5TWFza0Zyb21BbHBoYU1hc2snO1xuaW1wb3J0IHsgbWFrZUJpbmFyeU1hc2tPdXRsaW5lIH0gZnJvbSAnLi4vLi4vTWFzay9CaW5hcnlNYXNrL21ha2VCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBtYWtlQ2lyY2xlQmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi8uLi9NYXNrL0JpbmFyeU1hc2svbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lJztcbmltcG9ydCB7IG1ha2VSZWN0QmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi8uLi9NYXNrL0JpbmFyeU1hc2svbWFrZVJlY3RCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyBtYWtlUmV1c2FibGVQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvUmV1c2FibGVQaXhlbERhdGEnO1xuaW1wb3J0IHsgUGFpbnRNYXNrT3V0bGluZSB9IGZyb20gJy4uL19wYWludC10eXBlcyc7XG5leHBvcnQgdHlwZSBQYWludEN1cnNvclJlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZVBhaW50Q3Vyc29yUmVuZGVyZXI+O1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWludEN1cnNvclJlbmRlcmVyPFQgZXh0ZW5kcyBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcyA9IE9mZnNjcmVlbkNhbnZhcz4ocmV1c2FibGVDYW52YXNGYWN0b3J5PzogKCkgPT4gUmV1c2FibGVDYW52YXNGYWN0b3J5PFQ+KSB7XG4gIGNvbnN0IGZhY3RvcnkgPSAocmV1c2FibGVDYW52YXNGYWN0b3J5ID8/IG1ha2VSZXVzYWJsZU9mZnNjcmVlbkNhbnZhcykgYXMgdW5rbm93biBhcyAoKSA9PiBSZXVzYWJsZUNhbnZhc0ZhY3Rvcnk8VD47XG4gIGNvbnN0IHVwZGF0ZUJ1ZmZlciA9IGZhY3RvcnkoKTtcbiAgY29uc3Qge1xuICAgIGNhbnZhcyxcbiAgICBjdHhcbiAgfSA9IHVwZGF0ZUJ1ZmZlcigxLCAxKTtcbiAgY29uc3QgZ2V0UGl4ZWxEYXRhID0gbWFrZVJldXNhYmxlUGl4ZWxEYXRhKCk7XG4gIGxldCBfY29sb3IgPSBwYWNrQ29sb3IoMCwgMjU1LCAyNTUsIDI1NSk7XG4gIGxldCBfc2NhbGUgPSAxO1xuICBsZXQgY3VycmVudEJydXNoOiBQYWludEJydXNoID0ge1xuICAgIHR5cGU6IG51bGwsXG4gICAgb3V0bGluZVR5cGU6IFBhaW50TWFza091dGxpbmUuUkVDVCxcbiAgICB3OiAxLFxuICAgIGg6IDEsXG4gICAgY2VudGVyT2Zmc2V0WDogKC0oMTAgLSAxID4+IDEpKSxcbiAgICBjZW50ZXJPZmZzZXRZOiAoLSgxMCAtIDEgPj4gMSkpLFxuICAgIGRhdGE6IG51bGxcbiAgfTtcbiAgbGV0IG91dGxpbmU6IEJpbmFyeU1hc2s7XG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWludE1hc2s/OiBQYWludEJydXNoLCBzY2FsZT86IG51bWJlciwgY29sb3I/OiBDb2xvcjMyLCBhbHBoYVRocmVzaG9sZCA9IDEyNykge1xuICAgIGN1cnJlbnRCcnVzaCA9IHBhaW50TWFzayA/PyBjdXJyZW50QnJ1c2g7XG4gICAgX3NjYWxlID0gc2NhbGUgPz8gX3NjYWxlO1xuICAgIF9jb2xvciA9IGNvbG9yID8/IF9jb2xvcjtcbiAgICB1cGRhdGVCdWZmZXIoY3VycmVudEJydXNoLncgKiBfc2NhbGUgKyAyICogX3NjYWxlLCBjdXJyZW50QnJ1c2guaCAqIF9zY2FsZSArIDIgKiBfc2NhbGUpO1xuICAgIGlmIChjdXJyZW50QnJ1c2gudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICBpZiAoY3VycmVudEJydXNoLm91dGxpbmVUeXBlID09PSBQYWludE1hc2tPdXRsaW5lLkNJUkNMRSkge1xuICAgICAgICBvdXRsaW5lID0gbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lKGN1cnJlbnRCcnVzaC53LCBfc2NhbGUpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50QnJ1c2gub3V0bGluZVR5cGUgPT09IFBhaW50TWFza091dGxpbmUuUkVDVCkge1xuICAgICAgICBvdXRsaW5lID0gbWFrZVJlY3RCaW5hcnlNYXNrT3V0bGluZShjdXJyZW50QnJ1c2gudywgY3VycmVudEJydXNoLmgsIF9zY2FsZSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCcnVzaC5vdXRsaW5lVHlwZSA9PT0gUGFpbnRNYXNrT3V0bGluZS5NQVNLRUQpIHtcbiAgICAgICAgb3V0bGluZSA9IG1ha2VCaW5hcnlNYXNrT3V0bGluZShjdXJyZW50QnJ1c2gsIF9zY2FsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjdXJyZW50QnJ1c2gudHlwZSA9PT0gTWFza1R5cGUuQUxQSEEpIHtcbiAgICAgIGNvbnN0IG1hc2sgPSBtYWtlQmluYXJ5TWFza0Zyb21BbHBoYU1hc2soY3VycmVudEJydXNoLCBhbHBoYVRocmVzaG9sZCk7XG4gICAgICBvdXRsaW5lID0gbWFrZUJpbmFyeU1hc2tPdXRsaW5lKG1hc2ssIF9zY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dGxpbmUgPSBtYWtlUmVjdEJpbmFyeU1hc2tPdXRsaW5lKGN1cnJlbnRCcnVzaC53LCBjdXJyZW50QnJ1c2guaCwgX3NjYWxlKTtcbiAgICB9XG4gICAgY29uc3QgcGl4ZWxEYXRhID0gZ2V0UGl4ZWxEYXRhKG91dGxpbmUudywgb3V0bGluZS5oKTtcbiAgICBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayhwaXhlbERhdGEsIF9jb2xvciwgb3V0bGluZSk7XG4gICAgY3R4LnB1dEltYWdlRGF0YShwaXhlbERhdGEuaW1hZ2VEYXRhLCAwLCAwKTtcbiAgfVxuICBjb25zdCBib3VuZHNTY3JhdGNoID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0Qm91bmRzKGNlbnRlclg6IG51bWJlciwgY2VudGVyWTogbnVtYmVyKTogUmVjdCB7XG4gICAgYm91bmRzU2NyYXRjaC54ID0gY2VudGVyWCArIGN1cnJlbnRCcnVzaC5jZW50ZXJPZmZzZXRYO1xuICAgIGJvdW5kc1NjcmF0Y2gueSA9IGNlbnRlclkgKyBjdXJyZW50QnJ1c2guY2VudGVyT2Zmc2V0WTtcbiAgICBib3VuZHNTY3JhdGNoLncgPSBjdXJyZW50QnJ1c2gudztcbiAgICBib3VuZHNTY3JhdGNoLmggPSBjdXJyZW50QnJ1c2guaDtcbiAgICByZXR1cm4gYm91bmRzU2NyYXRjaDtcbiAgfVxuICBjb25zdCBib3VuZHNTY2FsZWRTY3JhdGNoID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0T3V0bGluZUJvdW5kc1NjYWxlZChjZW50ZXJYOiBudW1iZXIsIGNlbnRlclk6IG51bWJlcik6IFJlY3Qge1xuICAgIGJvdW5kc1NjYWxlZFNjcmF0Y2gueCA9IGNlbnRlclggKiBfc2NhbGUgKyBjdXJyZW50QnJ1c2guY2VudGVyT2Zmc2V0WCAqIF9zY2FsZSAtIDE7XG4gICAgYm91bmRzU2NhbGVkU2NyYXRjaC55ID0gY2VudGVyWSAqIF9zY2FsZSArIGN1cnJlbnRCcnVzaC5jZW50ZXJPZmZzZXRZICogX3NjYWxlIC0gMTtcbiAgICBib3VuZHNTY2FsZWRTY3JhdGNoLncgPSBjdXJyZW50QnJ1c2gudyAqIF9zY2FsZTtcbiAgICBib3VuZHNTY2FsZWRTY3JhdGNoLmggPSBjdXJyZW50QnJ1c2guaCAqIF9zY2FsZTtcbiAgICByZXR1cm4gYm91bmRzU2NhbGVkU2NyYXRjaDtcbiAgfVxuICBmdW5jdGlvbiBkcmF3KGRyYXdDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIpIHtcbiAgICBjb25zdCBkeCA9IGNlbnRlclggKiBfc2NhbGUgKyBjdXJyZW50QnJ1c2guY2VudGVyT2Zmc2V0WCAqIF9zY2FsZSAtIDE7XG4gICAgY29uc3QgZHkgPSBjZW50ZXJZICogX3NjYWxlICsgY3VycmVudEJydXNoLmNlbnRlck9mZnNldFkgKiBfc2NhbGUgLSAxO1xuICAgIGRyYXdDdHguZHJhd0ltYWdlKGNhbnZhcywgTWF0aC5mbG9vcihkeCksIE1hdGguZmxvb3IoZHkpKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRTZXR0aW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IF9jb2xvcixcbiAgICAgIHNjYWxlOiBfc2NhbGUsXG4gICAgICBjdXJyZW50QnJ1c2hcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgdXBkYXRlLFxuICAgIGdldEJvdW5kcyxcbiAgICBnZXRCb3VuZHNTY2FsZWQ6IGdldE91dGxpbmVCb3VuZHNTY2FsZWQsXG4gICAgZHJhdyxcbiAgICBnZXRTZXR0aW5nc1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type AlphaMask, type BinaryMask, MaskType } from '../Mask/_mask-types';\nimport { applyAlphaMaskToPixelData } from './applyAlphaMaskToPixelData';\nimport { applyBinaryMaskToPixelData } from './applyBinaryMaskToPixelData';\nexport function applyMaskToPixelData(dst: PixelData32, mask: Mask, opts?: ApplyMaskToPixelDataOptions): boolean {\n if (mask.type === MaskType.BINARY) {\n return applyBinaryMaskToPixelData(dst, mask as BinaryMask, opts);\n } else {\n return applyAlphaMaskToPixelData(dst, mask as AlphaMask, opts);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEFscGhhTWFzaywgdHlwZSBCaW5hcnlNYXNrLCBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4vYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSc7XG5pbXBvcnQgeyBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4vYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEnO1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWFza1RvUGl4ZWxEYXRhKGRzdDogUGl4ZWxEYXRhMzIsIG1hc2s6IE1hc2ssIG9wdHM/OiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgcmV0dXJuIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKGRzdCwgbWFzayBhcyBCaW5hcnlNYXNrLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YShkc3QsIG1hc2sgYXMgQWxwaGFNYXNrLCBvcHRzKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../Mask/_mask-types';\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask';\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask';\nexport function blendColorPixelDataMask(dst: PixelData32, color: Color32, mask: Mask, opts?: ColorBlendMaskOptions): boolean {\n if (mask.type === MaskType.BINARY) {\n return blendColorPixelDataBinaryMask(dst, color, mask, opts);\n } else {\n return blendColorPixelDataAlphaMask(dst, color, mask, opts);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4vYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4vYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kQ29sb3JQaXhlbERhdGFNYXNrKGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBNYXNrLCBvcHRzPzogQ29sb3JCbGVuZE1hc2tPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChtYXNrLnR5cGUgPT09IE1hc2tUeXBlLkJJTkFSWSkge1xuICAgIHJldHVybiBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayhkc3QsIGNvbG9yLCBtYXNrLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhkc3QsIGNvbG9yLCBtYXNrLCBvcHRzKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask';\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: sourceOverPerfect\n};\nexport function blendColorPixelDataPaintAlphaMask(dst: PixelData32, color: Color32, mask: PaintAlphaMask, x: number, y: number, alpha = 255, blendFn = sourceOverPerfect): boolean {\n const tx = x + mask.centerOffsetX;\n const ty = y + mask.centerOffsetY;\n SCRATCH_OPTS.x = tx;\n SCRATCH_OPTS.y = ty;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n return blendColorPixelDataAlphaMask(dst, color, mask, SCRATCH_OPTS);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmNvbnN0IFNDUkFUQ0hfT1BUUyA9IHtcbiAgeDogMCxcbiAgeTogMCxcbiAgYWxwaGE6IDI1NSxcbiAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3Rcbn07XG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YVBhaW50QWxwaGFNYXNrKGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludEFscGhhTWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIsIGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QpOiBib29sZWFuIHtcbiAgY29uc3QgdHggPSB4ICsgbWFzay5jZW50ZXJPZmZzZXRYO1xuICBjb25zdCB0eSA9IHkgKyBtYXNrLmNlbnRlck9mZnNldFk7XG4gIFNDUkFUQ0hfT1BUUy54ID0gdHg7XG4gIFNDUkFUQ0hfT1BUUy55ID0gdHk7XG4gIFNDUkFUQ0hfT1BUUy5hbHBoYSA9IGFscGhhO1xuICBTQ1JBVENIX09QVFMuYmxlbmRGbiA9IGJsZW5kRm47XG4gIHJldHVybiBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKGRzdCwgY29sb3IsIG1hc2ssIFNDUkFUQ0hfT1BUUyk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask';\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: sourceOverPerfect\n};\nexport function blendColorPixelDataPaintBinaryMask(dst: PixelData32, color: Color32, mask: PaintBinaryMask, x: number, y: number, alpha = 255, blendFn = sourceOverPerfect): boolean {\n const tx = x + mask.centerOffsetX;\n const ty = y + mask.centerOffsetY;\n SCRATCH_OPTS.x = tx;\n SCRATCH_OPTS.y = ty;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n return blendColorPixelDataBinaryMask(dst, color, mask, SCRATCH_OPTS);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4vYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snO1xuY29uc3QgU0NSQVRDSF9PUFRTID0ge1xuICB4OiAwLFxuICB5OiAwLFxuICBhbHBoYTogMjU1LFxuICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdFxufTtcbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhUGFpbnRCaW5hcnlNYXNrKGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludEJpbmFyeU1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHR4ID0geCArIG1hc2suY2VudGVyT2Zmc2V0WDtcbiAgY29uc3QgdHkgPSB5ICsgbWFzay5jZW50ZXJPZmZzZXRZO1xuICBTQ1JBVENIX09QVFMueCA9IHR4O1xuICBTQ1JBVENIX09QVFMueSA9IHR5O1xuICBTQ1JBVENIX09QVFMuYWxwaGEgPSBhbHBoYTtcbiAgU0NSQVRDSF9PUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2soZHN0LCBjb2xvciwgbWFzaywgU0NSQVRDSF9PUFRTKTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { MaskType } from '../Mask/_mask-types';\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask';\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask';\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: sourceOverPerfect\n};\nexport function blendColorPixelDataPaintMask(dst: PixelData32, color: Color32, mask: PaintMask, x: number, y: number, alpha = 255, blendFn = sourceOverPerfect): boolean {\n const tx = x + mask.centerOffsetX;\n const ty = y + mask.centerOffsetY;\n SCRATCH_OPTS.x = tx;\n SCRATCH_OPTS.y = ty;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n if (mask.type === MaskType.BINARY) {\n return blendColorPixelDataBinaryMask(dst, color, mask, SCRATCH_OPTS);\n } else {\n return blendColorPixelDataAlphaMask(dst, color, mask, SCRATCH_OPTS);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4vYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4vYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snO1xuY29uc3QgU0NSQVRDSF9PUFRTID0ge1xuICB4OiAwLFxuICB5OiAwLFxuICBhbHBoYTogMjU1LFxuICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdFxufTtcbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhUGFpbnRNYXNrKGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludE1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHR4ID0geCArIG1hc2suY2VudGVyT2Zmc2V0WDtcbiAgY29uc3QgdHkgPSB5ICsgbWFzay5jZW50ZXJPZmZzZXRZO1xuICBTQ1JBVENIX09QVFMueCA9IHR4O1xuICBTQ1JBVENIX09QVFMueSA9IHR5O1xuICBTQ1JBVENIX09QVFMuYWxwaGEgPSBhbHBoYTtcbiAgU0NSQVRDSF9PUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICBpZiAobWFzay50eXBlID09PSBNYXNrVHlwZS5CSU5BUlkpIHtcbiAgICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2soZHN0LCBjb2xvciwgbWFzaywgU0NSQVRDSF9PUFRTKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhkc3QsIGNvbG9yLCBtYXNrLCBTQ1JBVENIX09QVFMpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../Mask/_mask-types';\nimport { blendPixelDataAlphaMask } from './blendPixelDataAlphaMask';\nimport { blendPixelDataBinaryMask } from './blendPixelDataBinaryMask';\nexport function blendPixelDataMask(target: PixelData32, src: PixelData32, mask: Mask, opts?: PixelBlendMaskOptions): boolean {\n if (mask.type === MaskType.BINARY) {\n return blendPixelDataBinaryMask(target, src, mask, opts);\n } else {\n return blendPixelDataAlphaMask(target, src, mask, opts);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgfSBmcm9tICcuL2JsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4vYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrJztcbmV4cG9ydCBmdW5jdGlvbiBibGVuZFBpeGVsRGF0YU1hc2sodGFyZ2V0OiBQaXhlbERhdGEzMiwgc3JjOiBQaXhlbERhdGEzMiwgbWFzazogTWFzaywgb3B0cz86IFBpeGVsQmxlbmRNYXNrT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBpZiAobWFzay50eXBlID09PSBNYXNrVHlwZS5CSU5BUlkpIHtcbiAgICByZXR1cm4gYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrKHRhcmdldCwgc3JjLCBtYXNrLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sodGFyZ2V0LCBzcmMsIG1hc2ssIG9wdHMpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { BlendColor32 } from '../_types';\nimport { blendPixelData } from './blendPixelData';\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: undefined as BlendColor32 | undefined\n};\nexport function blendPixelDataPaintBuffer(target: PixelData32, paintBuffer: ColorPaintBuffer, alpha = 255, blendFn?: BlendColor32, blendPixelDataFn = blendPixelData): void {\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const x = tile.tx << tileShift;\n const y = tile.ty << tileShift;\n SCRATCH_OPTS.x = x;\n SCRATCH_OPTS.y = y;\n SCRATCH_OPTS.alpha = alpha;\n SCRATCH_OPTS.blendFn = blendFn;\n blendPixelDataFn(target, tile, SCRATCH_OPTS);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJsZW5kQ29sb3IzMiB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4vYmxlbmRQaXhlbERhdGEnO1xuY29uc3QgU0NSQVRDSF9PUFRTID0ge1xuICB4OiAwLFxuICB5OiAwLFxuICBhbHBoYTogMjU1LFxuICBibGVuZEZuOiB1bmRlZmluZWQgYXMgQmxlbmRDb2xvcjMyIHwgdW5kZWZpbmVkXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhUGFpbnRCdWZmZXIodGFyZ2V0OiBQaXhlbERhdGEzMiwgcGFpbnRCdWZmZXI6IENvbG9yUGFpbnRCdWZmZXIsIGFscGhhID0gMjU1LCBibGVuZEZuPzogQmxlbmRDb2xvcjMyLCBibGVuZFBpeGVsRGF0YUZuID0gYmxlbmRQaXhlbERhdGEpOiB2b2lkIHtcbiAgY29uc3QgdGlsZVNoaWZ0ID0gcGFpbnRCdWZmZXIuY29uZmlnLnRpbGVTaGlmdDtcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgaWYgKHRpbGUpIHtcbiAgICAgIGNvbnN0IHggPSB0aWxlLnR4IDw8IHRpbGVTaGlmdDtcbiAgICAgIGNvbnN0IHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdDtcbiAgICAgIFNDUkFUQ0hfT1BUUy54ID0geDtcbiAgICAgIFNDUkFUQ0hfT1BUUy55ID0geTtcbiAgICAgIFNDUkFUQ0hfT1BUUy5hbHBoYSA9IGFscGhhO1xuICAgICAgU0NSQVRDSF9PUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICAgICAgYmxlbmRQaXhlbERhdGFGbih0YXJnZXQsIHRpbGUsIFNDUkFUQ0hfT1BUUyk7XG4gICAgfVxuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Fills a region or the {@link PixelData32} buffer with a solid color.\n * This function is faster than {@link fillPixelData} but does not\n * return a boolean value indicating changes were made.\n *\n * @param target - The target to modify.\n * @param color - The color to apply.\n * @param rect - Defines the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelDataFast(target: PixelData32, color: Color32, rect?: Partial<Rect>): void;\n/**\n * @param dst - The target to modify.\n * @param color - The color 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 fillPixelDataFast(dst: PixelData32, color: Color32, x: number, y: number, w: number, h: number): void;\nexport function fillPixelDataFast(dst: PixelData32, color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): void {\n const dstW = dst.w;\n const dstH = dst.h;\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n if (typeof _x === 'object') {\n x = _x.x ?? 0;\n y = _x.y ?? 0;\n w = _x.w ?? dst.w;\n h = _x.h ?? dst.h;\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.w;\n h = dst.h;\n }\n\n // Inline bounds clipping\n let dstX = x;\n let dstY = y;\n let fillW = w;\n let fillH = h;\n if (dstX < 0) {\n fillW += dstX;\n dstX = 0;\n }\n if (dstY < 0) {\n fillH += dstY;\n dstY = 0;\n }\n fillW = Math.min(fillW, dstW - dstX);\n fillH = Math.min(fillH, dstH - dstY);\n if (fillW <= 0 || fillH <= 0) return;\n const dst32 = dst.data;\n const dw = dst.w;\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (fillW === dw && fillH === dst.h && dstX === 0 && dstY === 0) {\n dst32.fill(color);\n return;\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < fillH; iy++) {\n const start = (dstY + iy) * dw + dstX;\n const end = start + fillW;\n dst32.fill(color, start, end);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEZpbGxzIGEgcmVnaW9uIG9yIHRoZSB7QGxpbmsgUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHtAbGluayBmaWxsUGl4ZWxEYXRhfSBidXQgZG9lcyBub3RcbiAqIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBjaGFuZ2VzIHdlcmUgbWFkZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcmVjdCAtIERlZmluZXMgdGhlIGFyZWEgdG8gZmlsbC4gSWYgb21pdHRlZCwgdGhlIGVudGlyZVxuICogYnVmZmVyIGlzIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFGYXN0KHRhcmdldDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCByZWN0PzogUGFydGlhbDxSZWN0Pik6IHZvaWQ7XG4vKipcbiAqIEBwYXJhbSBkc3QgLSBUaGUgdGFyZ2V0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBjb2xvciB0byBhcHBseS5cbiAqIEBwYXJhbSB4IC0gU3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHkgLSBTdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHcgLSBXaWR0aCBvZiB0aGUgZmlsbCBhcmVhLlxuICogQHBhcmFtIGggLSBIZWlnaHQgb2YgdGhlIGZpbGwgYXJlYS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFGYXN0KGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFGYXN0KGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBfeD86IFBhcnRpYWw8UmVjdD4gfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3QgZHN0VyA9IGRzdC53O1xuICBjb25zdCBkc3RIID0gZHN0Lmg7XG4gIGxldCB4OiBudW1iZXI7XG4gIGxldCB5OiBudW1iZXI7XG4gIGxldCB3OiBudW1iZXI7XG4gIGxldCBoOiBudW1iZXI7XG4gIGlmICh0eXBlb2YgX3ggPT09ICdvYmplY3QnKSB7XG4gICAgeCA9IF94LnggPz8gMDtcbiAgICB5ID0gX3gueSA/PyAwO1xuICAgIHcgPSBfeC53ID8/IGRzdC53O1xuICAgIGggPSBfeC5oID8/IGRzdC5oO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3g7XG4gICAgeSA9IF95ITtcbiAgICB3ID0gX3chO1xuICAgIGggPSBfaCE7XG4gIH0gZWxzZSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gICAgdyA9IGRzdC53O1xuICAgIGggPSBkc3QuaDtcbiAgfVxuXG4gIC8vIElubGluZSBib3VuZHMgY2xpcHBpbmdcbiAgbGV0IGRzdFggPSB4O1xuICBsZXQgZHN0WSA9IHk7XG4gIGxldCBmaWxsVyA9IHc7XG4gIGxldCBmaWxsSCA9IGg7XG4gIGlmIChkc3RYIDwgMCkge1xuICAgIGZpbGxXICs9IGRzdFg7XG4gICAgZHN0WCA9IDA7XG4gIH1cbiAgaWYgKGRzdFkgPCAwKSB7XG4gICAgZmlsbEggKz0gZHN0WTtcbiAgICBkc3RZID0gMDtcbiAgfVxuICBmaWxsVyA9IE1hdGgubWluKGZpbGxXLCBkc3RXIC0gZHN0WCk7XG4gIGZpbGxIID0gTWF0aC5taW4oZmlsbEgsIGRzdEggLSBkc3RZKTtcbiAgaWYgKGZpbGxXIDw9IDAgfHwgZmlsbEggPD0gMCkgcmV0dXJuO1xuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhO1xuICBjb25zdCBkdyA9IGRzdC53O1xuXG4gIC8vIE9wdGltaXphdGlvbjogSWYgZmlsbGluZyB0aGUgZW50aXJlIGJ1ZmZlciwgdXNlIHRoZSBuYXRpdmUgLmZpbGwoKVxuICBpZiAoZmlsbFcgPT09IGR3ICYmIGZpbGxIID09PSBkc3QuaCAmJiBkc3RYID09PSAwICYmIGRzdFkgPT09IDApIHtcbiAgICBkc3QzMi5maWxsKGNvbG9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSb3ctYnktcm93IGZpbGwgZm9yIHBhcnRpYWwgcmVjdGFuZ2xlc1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgZmlsbEg7IGl5KyspIHtcbiAgICBjb25zdCBzdGFydCA9IChkc3RZICsgaXkpICogZHcgKyBkc3RYO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgZmlsbFc7XG4gICAgZHN0MzIuZmlsbChjb2xvciwgc3RhcnQsIGVuZCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { fillPixelDataFast } from './fillPixelDataFast';\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelDataFast.\n */\nexport function clearPixelDataFast(dst: PixelData32, rect?: Partial<BinaryMaskRect>): void {\n fillPixelDataFast(dst, 0 as Color32, rect);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgZmlsbFBpeGVsRGF0YUZhc3QgfSBmcm9tICcuL2ZpbGxQaXhlbERhdGFGYXN0JztcblxuLyoqXG4gKiBDbGVhcnMgYSByZWdpb24gb2YgdGhlIFBpeGVsRGF0YSB0byB0cmFuc3BhcmVudCAoMHgwMDAwMDAwMCkuXG4gKiBJbnRlcm5hbGx5IHVzZXMgdGhlIG9wdGltaXplZCBmaWxsUGl4ZWxEYXRhRmFzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyUGl4ZWxEYXRhRmFzdChkc3Q6IFBpeGVsRGF0YTMyLCByZWN0PzogUGFydGlhbDxCaW5hcnlNYXNrUmVjdD4pOiB2b2lkIHtcbiAgZmlsbFBpeGVsRGF0YUZhc3QoZHN0LCAwIGFzIENvbG9yMzIsIHJlY3QpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { ImageDataLike } from '../ImageData/_ImageData-types';\nimport { makePixelData } from './PixelData';\nexport function copyPixelData<T extends ImageDataLike = ImageData>(target: PixelData<T>): PixelData {\n const data = target.imageData.data;\n const buffer = new Uint8ClampedArray(data);\n return makePixelData(new ImageData(buffer, target.w, target.h));\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEltYWdlRGF0YUxpa2UgfSBmcm9tICcuLi9JbWFnZURhdGEvX0ltYWdlRGF0YS10eXBlcyc7XG5pbXBvcnQgeyBtYWtlUGl4ZWxEYXRhIH0gZnJvbSAnLi9QaXhlbERhdGEnO1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlQaXhlbERhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgPSBJbWFnZURhdGE+KHRhcmdldDogUGl4ZWxEYXRhPFQ+KTogUGl4ZWxEYXRhIHtcbiAgY29uc3QgZGF0YSA9IHRhcmdldC5pbWFnZURhdGEuZGF0YTtcbiAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEpO1xuICByZXR1cm4gbWFrZVBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKGJ1ZmZlciwgdGFyZ2V0LncsIHRhcmdldC5oKSk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: PixelData32, rect: Rect): Uint32Array;\nexport function extractPixelDataBuffer(source: PixelData32, x: number, y: number, w: number, h: number): Uint32Array;\nexport function extractPixelDataBuffer(source: PixelData32, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint32Array {\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n if (typeof _x === 'object') {\n x = _x.x;\n y = _x.y;\n w = _x.w;\n h = _x.h;\n } else {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n }\n const srcW = source.w;\n const srcH = source.h;\n const srcData = source.data;\n if (w <= 0 || h <= 0) return new Uint32Array(0);\n const dstData = new Uint32Array(w * h);\n\n // Inline clipping logic to avoid object allocations\n let srcX = x;\n let srcY = y;\n let dstX = 0;\n let dstY = 0;\n let copyW = w;\n let copyH = h;\n if (srcX < 0) {\n dstX = -srcX;\n copyW += srcX;\n srcX = 0;\n }\n if (srcY < 0) {\n dstY = -srcY;\n copyH += srcY;\n srcY = 0;\n }\n copyW = Math.min(copyW, srcW - srcX);\n copyH = Math.min(copyH, srcH - srcY);\n if (copyW <= 0 || copyH <= 0) return dstData;\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX;\n const dstStart = (dstY + row) * w + dstX;\n const chunk = srcData.subarray(srcStart, srcStart + copyW);\n dstData.set(chunk, dstStart);\n }\n return dstData;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIG9mIHBpeGVscyBmcm9tIFBpeGVsRGF0YS5cbiAqIFJldHVybnMgYSBuZXcgVWludDMyQXJyYXkgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIHBpeGVscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBQaXhlbERhdGEzMiwgcmVjdDogUmVjdCk6IFVpbnQzMkFycmF5O1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBQaXhlbERhdGEzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDMyQXJyYXk7XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcihzb3VyY2U6IFBpeGVsRGF0YTMyLCBfeDogUmVjdCB8IG51bWJlciwgX3k/OiBudW1iZXIsIF93PzogbnVtYmVyLCBfaD86IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcbiAgbGV0IHc6IG51bWJlcjtcbiAgbGV0IGg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBfeCA9PT0gJ29iamVjdCcpIHtcbiAgICB4ID0gX3gueDtcbiAgICB5ID0gX3gueTtcbiAgICB3ID0gX3gudztcbiAgICBoID0gX3guaDtcbiAgfSBlbHNlIHtcbiAgICB4ID0gX3g7XG4gICAgeSA9IF95ITtcbiAgICB3ID0gX3chO1xuICAgIGggPSBfaCE7XG4gIH1cbiAgY29uc3Qgc3JjVyA9IHNvdXJjZS53O1xuICBjb25zdCBzcmNIID0gc291cmNlLmg7XG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YTtcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybiBuZXcgVWludDMyQXJyYXkoMCk7XG4gIGNvbnN0IGRzdERhdGEgPSBuZXcgVWludDMyQXJyYXkodyAqIGgpO1xuXG4gIC8vIElubGluZSBjbGlwcGluZyBsb2dpYyB0byBhdm9pZCBvYmplY3QgYWxsb2NhdGlvbnNcbiAgbGV0IHNyY1ggPSB4O1xuICBsZXQgc3JjWSA9IHk7XG4gIGxldCBkc3RYID0gMDtcbiAgbGV0IGRzdFkgPSAwO1xuICBsZXQgY29weVcgPSB3O1xuICBsZXQgY29weUggPSBoO1xuICBpZiAoc3JjWCA8IDApIHtcbiAgICBkc3RYID0gLXNyY1g7XG4gICAgY29weVcgKz0gc3JjWDtcbiAgICBzcmNYID0gMDtcbiAgfVxuICBpZiAoc3JjWSA8IDApIHtcbiAgICBkc3RZID0gLXNyY1k7XG4gICAgY29weUggKz0gc3JjWTtcbiAgICBzcmNZID0gMDtcbiAgfVxuICBjb3B5VyA9IE1hdGgubWluKGNvcHlXLCBzcmNXIC0gc3JjWCk7XG4gIGNvcHlIID0gTWF0aC5taW4oY29weUgsIHNyY0ggLSBzcmNZKTtcbiAgaWYgKGNvcHlXIDw9IDAgfHwgY29weUggPD0gMCkgcmV0dXJuIGRzdERhdGE7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1g7XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoZHN0WSArIHJvdykgKiB3ICsgZHN0WDtcbiAgICBjb25zdCBjaHVuayA9IHNyY0RhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgY29weVcpO1xuICAgIGRzdERhdGEuc2V0KGNodW5rLCBkc3RTdGFydCk7XG4gIH1cbiAgcmV0dXJuIGRzdERhdGE7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { extractPixelDataBuffer } from './extractPixelDataBuffer';\nimport { makePixelData } from './PixelData';\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: PixelData32, rect: Rect): PixelData;\nexport function extractPixelData(source: PixelData32, x: number, y: number, w: number, h: number): PixelData;\nexport function extractPixelData(source: PixelData32, _x: Rect | number, _y?: number, _w?: number, _h?: number): PixelData {\n const {\n x,\n y,\n w,\n h\n } = typeof _x === 'object' ? _x : {\n x: _x,\n y: _y!,\n w: _w!,\n h: _h!\n };\n const result = makePixelData(new ImageData(w, h));\n const buffer = extractPixelDataBuffer(source, x, y, w, h);\n result.data.set(buffer);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyIH0gZnJvbSAnLi9leHRyYWN0UGl4ZWxEYXRhQnVmZmVyJztcbmltcG9ydCB7IG1ha2VQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsRGF0YSc7XG5cbi8qKlxuICogSGlnaC1sZXZlbCBleHRyYWN0aW9uIHRoYXQgcmV0dXJucyBhIG5ldyBQaXhlbERhdGEgaW5zdGFuY2UuXG4gKiBMZXZlcmFnZXMgZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlciBmb3Igb3B0aW1pemVkIDMyLWJpdCBtZW1vcnkgbW92ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhKHNvdXJjZTogUGl4ZWxEYXRhMzIsIHJlY3Q6IFJlY3QpOiBQaXhlbERhdGE7XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IFBpeGVsRGF0YTMyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiBQaXhlbERhdGE7XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IFBpeGVsRGF0YTMyLCBfeDogUmVjdCB8IG51bWJlciwgX3k/OiBudW1iZXIsIF93PzogbnVtYmVyLCBfaD86IG51bWJlcik6IFBpeGVsRGF0YSB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoXG4gIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnID8gX3ggOiB7XG4gICAgeDogX3gsXG4gICAgeTogX3khLFxuICAgIHc6IF93ISxcbiAgICBoOiBfaCFcbiAgfTtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVBpeGVsRGF0YShuZXcgSW1hZ2VEYXRhKHcsIGgpKTtcbiAgY29uc3QgYnVmZmVyID0gZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcihzb3VyY2UsIHgsIHksIHcsIGgpO1xuICByZXN1bHQuZGF0YS5zZXQoYnVmZmVyKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeAlphaMask } from '../Mask/AlphaMask';\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(pixelData: PixelData32): AlphaMask {\n const {\n data,\n w,\n h\n } = pixelData;\n const len = data.length;\n const mask = makeAlphaMask(w, h);\n const maskData = mask.data;\n for (let i = 0; i < len; i++) {\n const val = data[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 maskData[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQWxwaGFNYXNrIH0gZnJvbSAnLi4vTWFzay9BbHBoYU1hc2snO1xuLyoqXG4gKiBFeHRyYWN0cyB0aGUgYWxwaGEgY2hhbm5lbCBmcm9tIFBpeGVsRGF0YSBpbnRvIGEgc2luZ2xlLWNoYW5uZWwgbWFzay5cbiAqIFJldHVybnMgYSBVaW50OEFycmF5IGJyYW5kZWQgYXMgQWxwaGFNYXNrLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGl4ZWxEYXRhVG9BbHBoYU1hc2socGl4ZWxEYXRhOiBQaXhlbERhdGEzMik6IEFscGhhTWFzayB7XG4gIGNvbnN0IHtcbiAgICBkYXRhLFxuICAgIHcsXG4gICAgaFxuICB9ID0gcGl4ZWxEYXRhO1xuICBjb25zdCBsZW4gPSBkYXRhLmxlbmd0aDtcbiAgY29uc3QgbWFzayA9IG1ha2VBbHBoYU1hc2sodywgaCk7XG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgY29uc3QgdmFsID0gZGF0YVtpXTtcblxuICAgIC8vIEV4dHJhY3QgdGhlIEFscGhhIGJ5dGUgKHRvcCA4IGJpdHMgaW4gQUJHUiAvIExpdHRsZS1FbmRpYW4pXG4gICAgLy8gU2hpZnQgcmlnaHQgYnkgMjQgbW92ZXMgdGhlIDR0aCBieXRlIHRvIHRoZSAxc3QgcG9zaXRpb25cbiAgICBtYXNrRGF0YVtpXSA9IHZhbCA+Pj4gMjQgJiAweGZmO1xuICB9XG4gIHJldHVybiBtYXNrO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function reflectPixelDataHorizontal(pixelData: PixelData32): void {\n const width = pixelData.w;\n const height = pixelData.h;\n const data = pixelData.data;\n const halfWidth = Math.floor(width / 2);\n for (let y = 0; y < height; y++) {\n const rowOffset = y * width;\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 data[leftIdx] = data[rightIdx];\n data[rightIdx] = temp;\n }\n }\n}\nexport function reflectPixelDataVertical(pixelData: PixelData32): void {\n const width = pixelData.w;\n const height = pixelData.h;\n const data = pixelData.data;\n const halfHeight = Math.floor(height / 2);\n for (let y = 0; y < halfHeight; y++) {\n const topRowOffset = y * width;\n const bottomRowOffset = (height - 1 - y) * width;\n for (let x = 0; x < width; x++) {\n const topIdx = topRowOffset + x;\n const bottomIdx = bottomRowOffset + x;\n const temp = data[topIdx];\n data[topIdx] = data[bottomIdx];\n data[bottomIdx] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YUhvcml6b250YWwocGl4ZWxEYXRhOiBQaXhlbERhdGEzMik6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53O1xuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaDtcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhO1xuICBjb25zdCBoYWxmV2lkdGggPSBNYXRoLmZsb29yKHdpZHRoIC8gMik7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCByb3dPZmZzZXQgPSB5ICogd2lkdGg7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBoYWxmV2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgbGVmdElkeCA9IHJvd09mZnNldCArIHg7XG4gICAgICBjb25zdCByaWdodElkeCA9IHJvd09mZnNldCArICh3aWR0aCAtIDEgLSB4KTtcbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW2xlZnRJZHhdO1xuICAgICAgZGF0YVtsZWZ0SWR4XSA9IGRhdGFbcmlnaHRJZHhdO1xuICAgICAgZGF0YVtyaWdodElkeF0gPSB0ZW1wO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3RQaXhlbERhdGFWZXJ0aWNhbChwaXhlbERhdGE6IFBpeGVsRGF0YTMyKTogdm9pZCB7XG4gIGNvbnN0IHdpZHRoID0gcGl4ZWxEYXRhLnc7XG4gIGNvbnN0IGhlaWdodCA9IHBpeGVsRGF0YS5oO1xuICBjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGE7XG4gIGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IGhhbGZIZWlnaHQ7IHkrKykge1xuICAgIGNvbnN0IHRvcFJvd09mZnNldCA9IHkgKiB3aWR0aDtcbiAgICBjb25zdCBib3R0b21Sb3dPZmZzZXQgPSAoaGVpZ2h0IC0gMSAtIHkpICogd2lkdGg7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICBjb25zdCB0b3BJZHggPSB0b3BSb3dPZmZzZXQgKyB4O1xuICAgICAgY29uc3QgYm90dG9tSWR4ID0gYm90dG9tUm93T2Zmc2V0ICsgeDtcbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW3RvcElkeF07XG4gICAgICBkYXRhW3RvcElkeF0gPSBkYXRhW2JvdHRvbUlkeF07XG4gICAgICBkYXRhW2JvdHRvbUlkeF0gPSB0ZW1wO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { resampleUint32Array } from '../Algorithm/resampleUint32Array';\nimport { type MutablePixelData32, type PixelData, uInt32ArrayToImageData } from '../index';\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(pixelData: PixelData32, factor: number): PixelData {\n const output = {} as MutablePixelData32;\n const resampled = resampleUint32Array(pixelData.data, pixelData.w, pixelData.h, factor, output) as PixelData;\n (resampled as any).imageData = uInt32ArrayToImageData(resampled.data, resampled.w, resampled.h);\n return resampled;\n}\nexport function resamplePixelDataInPlace(pixelData: PixelData32, factor: number): void {\n const resampled = resampleUint32Array(pixelData.data, pixelData.w, pixelData.h, factor, pixelData) as PixelData;\n (resampled as any).imageData = uInt32ArrayToImageData(resampled.data, resampled.w, resampled.h);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZXNhbXBsZVVpbnQzMkFycmF5IH0gZnJvbSAnLi4vQWxnb3JpdGhtL3Jlc2FtcGxlVWludDMyQXJyYXknO1xuaW1wb3J0IHsgdHlwZSBNdXRhYmxlUGl4ZWxEYXRhMzIsIHR5cGUgUGl4ZWxEYXRhLCB1SW50MzJBcnJheVRvSW1hZ2VEYXRhIH0gZnJvbSAnLi4vaW5kZXgnO1xuXG4vKipcbiAqIFJlc2FtcGxlcyBQaXhlbERhdGEgYnkgYSBzcGVjaWZpYyBmYWN0b3IgdXNpbmcgbmVhcmVzdCBuZWlnaGJvci5cbiAqIEZhY3RvciA+IDEgdXBzY2FsZXMsIEZhY3RvciA8IDEgZG93bnNjYWxlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlUGl4ZWxEYXRhKHBpeGVsRGF0YTogUGl4ZWxEYXRhMzIsIGZhY3RvcjogbnVtYmVyKTogUGl4ZWxEYXRhIHtcbiAgY29uc3Qgb3V0cHV0ID0ge30gYXMgTXV0YWJsZVBpeGVsRGF0YTMyO1xuICBjb25zdCByZXNhbXBsZWQgPSByZXNhbXBsZVVpbnQzMkFycmF5KHBpeGVsRGF0YS5kYXRhLCBwaXhlbERhdGEudywgcGl4ZWxEYXRhLmgsIGZhY3Rvciwgb3V0cHV0KSBhcyBQaXhlbERhdGE7XG4gIChyZXNhbXBsZWQgYXMgYW55KS5pbWFnZURhdGEgPSB1SW50MzJBcnJheVRvSW1hZ2VEYXRhKHJlc2FtcGxlZC5kYXRhLCByZXNhbXBsZWQudywgcmVzYW1wbGVkLmgpO1xuICByZXR1cm4gcmVzYW1wbGVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlUGl4ZWxEYXRhSW5QbGFjZShwaXhlbERhdGE6IFBpeGVsRGF0YTMyLCBmYWN0b3I6IG51bWJlcik6IHZvaWQge1xuICBjb25zdCByZXNhbXBsZWQgPSByZXNhbXBsZVVpbnQzMkFycmF5KHBpeGVsRGF0YS5kYXRhLCBwaXhlbERhdGEudywgcGl4ZWxEYXRhLmgsIGZhY3RvciwgcGl4ZWxEYXRhKSBhcyBQaXhlbERhdGE7XG4gIChyZXNhbXBsZWQgYXMgYW55KS5pbWFnZURhdGEgPSB1SW50MzJBcnJheVRvSW1hZ2VEYXRhKHJlc2FtcGxlZC5kYXRhLCByZXNhbXBsZWQudywgcmVzYW1wbGVkLmgpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { MutablePixelData32 } from './_pixelData-types';\n\n/**\n * Non-destructively resizes the {@link PixelData32} 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.\n *\n * @param target - The source pixel data 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 original image.\n * @param offsetY - The vertical offset for placing the original image.\n * @param out - output object\n * @returns A new {@link PixelData32} object with the specified dimensions.\n */\nexport function resizePixelData(target: PixelData32, newWidth: number, newHeight: number, offsetX = 0, offsetY = 0, out?: MutablePixelData32): PixelData32 {\n const newData = new Uint32Array(newWidth * newHeight);\n const {\n w: oldW,\n h: oldH,\n data: oldData\n } = target;\n const result = out ?? {} as MutablePixelData32;\n result.w = newWidth;\n result.h = newHeight;\n result.data = newData;\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 if (x1 <= x0 || y1 <= y0) {\n return result;\n }\n const copyW = x1 - x0;\n const copyH = y1 - y0;\n\n // Optimization: If we are copying the full width of both buffers,\n // we can perform a single bulk 1D copy.\n if (copyW === oldW && copyW === newWidth && offsetX === 0) {\n const srcStart = (y0 - offsetY) * oldW;\n const dstStart = y0 * newWidth;\n const len = copyW * copyH;\n newData.set(oldData.subarray(srcStart, srcStart + len), dstStart);\n return result;\n }\n\n // Standard row-by-row copy\n for (let row = 0; row < copyH; row++) {\n const dstY = y0 + row;\n const srcY = dstY - offsetY;\n const srcX = x0 - offsetX;\n const dstStart = dstY * newWidth + x0;\n const srcStart = srcY * oldW + srcX;\n const chunk = oldData.subarray(srcStart, srcStart + copyW);\n newData.set(chunk, dstStart);\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE11dGFibGVQaXhlbERhdGEzMiB9IGZyb20gJy4vX3BpeGVsRGF0YS10eXBlcyc7XG5cbi8qKlxuICogTm9uLWRlc3RydWN0aXZlbHkgcmVzaXplcyB0aGUge0BsaW5rIFBpeGVsRGF0YTMyfSBidWZmZXIgdG8gbmV3IGRpbWVuc2lvbnMsIG9wdGlvbmFsbHlcbiAqIG9mZnNldHRpbmcgdGhlIG9yaWdpbmFsIGNvbnRlbnQuXG4gKiBUaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IGJ1ZmZlci4gSXQgZG9lcyBub3Qgc2NhbGUgb3Igc3RyZXRjaCBwaXhlbHM7XG4gKiBpbnN0ZWFkLCBpdCBjcm9wcyBvciBwYWRzIHRoZSBpbWFnZSBiYXNlZCBvbiB0aGUgbmV3IGRpbWVuc2lvbnMuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBzb3VyY2UgcGl4ZWwgZGF0YSB0byByZXNpemUuXG4gKiBAcGFyYW0gbmV3V2lkdGggLSBUaGUgdGFyZ2V0IHdpZHRoIGluIHBpeGVscy5cbiAqIEBwYXJhbSBuZXdIZWlnaHQgLSBUaGUgdGFyZ2V0IGhlaWdodCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0gb2Zmc2V0WCAtIFRoZSBob3Jpem9udGFsIG9mZnNldCBmb3IgcGxhY2luZyB0aGUgb3JpZ2luYWwgaW1hZ2UuXG4gKiBAcGFyYW0gb2Zmc2V0WSAtIFRoZSB2ZXJ0aWNhbCBvZmZzZXQgZm9yIHBsYWNpbmcgdGhlIG9yaWdpbmFsIGltYWdlLlxuICogQHBhcmFtIG91dCAtIG91dHB1dCBvYmplY3RcbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBQaXhlbERhdGEzMn0gb2JqZWN0IHdpdGggdGhlIHNwZWNpZmllZCBkaW1lbnNpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplUGl4ZWxEYXRhKHRhcmdldDogUGl4ZWxEYXRhMzIsIG5ld1dpZHRoOiBudW1iZXIsIG5ld0hlaWdodDogbnVtYmVyLCBvZmZzZXRYID0gMCwgb2Zmc2V0WSA9IDAsIG91dD86IE11dGFibGVQaXhlbERhdGEzMik6IFBpeGVsRGF0YTMyIHtcbiAgY29uc3QgbmV3RGF0YSA9IG5ldyBVaW50MzJBcnJheShuZXdXaWR0aCAqIG5ld0hlaWdodCk7XG4gIGNvbnN0IHtcbiAgICB3OiBvbGRXLFxuICAgIGg6IG9sZEgsXG4gICAgZGF0YTogb2xkRGF0YVxuICB9ID0gdGFyZ2V0O1xuICBjb25zdCByZXN1bHQgPSBvdXQgPz8ge30gYXMgTXV0YWJsZVBpeGVsRGF0YTMyO1xuICByZXN1bHQudyA9IG5ld1dpZHRoO1xuICByZXN1bHQuaCA9IG5ld0hlaWdodDtcbiAgcmVzdWx0LmRhdGEgPSBuZXdEYXRhO1xuXG4gIC8vIERldGVybWluZSBpbnRlcnNlY3Rpb24gb2YgdGhlIG9sZCBpbWFnZSAoYXQgb2Zmc2V0KSBhbmQgbmV3IGNhbnZhcyBib3VuZHNcbiAgY29uc3QgeDAgPSBNYXRoLm1heCgwLCBvZmZzZXRYKTtcbiAgY29uc3QgeTAgPSBNYXRoLm1heCgwLCBvZmZzZXRZKTtcbiAgY29uc3QgeDEgPSBNYXRoLm1pbihuZXdXaWR0aCwgb2Zmc2V0WCArIG9sZFcpO1xuICBjb25zdCB5MSA9IE1hdGgubWluKG5ld0hlaWdodCwgb2Zmc2V0WSArIG9sZEgpO1xuICBpZiAoeDEgPD0geDAgfHwgeTEgPD0geTApIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGNvbnN0IGNvcHlXID0geDEgLSB4MDtcbiAgY29uc3QgY29weUggPSB5MSAtIHkwO1xuXG4gIC8vIE9wdGltaXphdGlvbjogSWYgd2UgYXJlIGNvcHlpbmcgdGhlIGZ1bGwgd2lkdGggb2YgYm90aCBidWZmZXJzLFxuICAvLyB3ZSBjYW4gcGVyZm9ybSBhIHNpbmdsZSBidWxrIDFEIGNvcHkuXG4gIGlmIChjb3B5VyA9PT0gb2xkVyAmJiBjb3B5VyA9PT0gbmV3V2lkdGggJiYgb2Zmc2V0WCA9PT0gMCkge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHkwIC0gb2Zmc2V0WSkgKiBvbGRXO1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0geTAgKiBuZXdXaWR0aDtcbiAgICBjb25zdCBsZW4gPSBjb3B5VyAqIGNvcHlIO1xuICAgIG5ld0RhdGEuc2V0KG9sZERhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgbGVuKSwgZHN0U3RhcnQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBTdGFuZGFyZCByb3ctYnktcm93IGNvcHlcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weUg7IHJvdysrKSB7XG4gICAgY29uc3QgZHN0WSA9IHkwICsgcm93O1xuICAgIGNvbnN0IHNyY1kgPSBkc3RZIC0gb2Zmc2V0WTtcbiAgICBjb25zdCBzcmNYID0geDAgLSBvZmZzZXRYO1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gZHN0WSAqIG5ld1dpZHRoICsgeDA7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSBzcmNZICogb2xkVyArIHNyY1g7XG4gICAgY29uc3QgY2h1bmsgPSBvbGREYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIGNvcHlXKTtcbiAgICBuZXdEYXRhLnNldChjaHVuaywgZHN0U3RhcnQpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { setPixelData } from './PixelData';\n\n/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.w;\n const height = pixelData.h;\n const data = pixelData.data;\n if (width === height) {\n rotateSquareInPlace(pixelData);\n return;\n }\n const newWidth = height;\n const newHeight = width;\n const newData32 = new Uint32Array(data.length);\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 newData32[newIdx] = data[oldIdx];\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(new Uint8ClampedArray(newData32.buffer), newWidth, newHeight);\n setPixelData(pixelData, newImageData);\n}\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.w;\n const data = pixelData.data;\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j;\n const right = j * n + (n - 1 - i);\n const bottom = (n - 1 - i) * n + (n - 1 - j);\n const left = (n - 1 - j) * n + i;\n const temp = data[top];\n data[top] = data[left];\n data[left] = data[bottom];\n data[bottom] = data[right];\n data[right] = temp;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzZXRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsRGF0YSc7XG5cbi8qKlxuICogUm90YXRlcyBwaXhlbCBkYXRhIDkwIGRlZ3JlZXMgY2xvY2t3aXNlLlxuICogSWYgdGhlIGltYWdlIGlzIHNxdWFyZSwgaXQgcGVyZm9ybXMgdGhlIHJvdGF0aW9uIGluLXBsYWNlLlxuICogSWYgcmVjdGFuZ3VsYXIsIGl0IHJlcGxhY2VzIHRoZSBpbnRlcm5hbCBJbWFnZURhdGEgd2l0aCBhIG5ldyByb3RhdGVkIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByb3RhdGVQaXhlbERhdGEocGl4ZWxEYXRhOiBQaXhlbERhdGEpOiB2b2lkIHtcbiAgY29uc3Qgd2lkdGggPSBwaXhlbERhdGEudztcbiAgY29uc3QgaGVpZ2h0ID0gcGl4ZWxEYXRhLmg7XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTtcbiAgaWYgKHdpZHRoID09PSBoZWlnaHQpIHtcbiAgICByb3RhdGVTcXVhcmVJblBsYWNlKHBpeGVsRGF0YSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5ld1dpZHRoID0gaGVpZ2h0O1xuICBjb25zdCBuZXdIZWlnaHQgPSB3aWR0aDtcbiAgY29uc3QgbmV3RGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEubGVuZ3RoKTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3Qgb2xkSWR4ID0geSAqIHdpZHRoICsgeDtcbiAgICAgIGNvbnN0IG5ld1ggPSBoZWlnaHQgLSAxIC0geTtcbiAgICAgIGNvbnN0IG5ld1kgPSB4O1xuICAgICAgY29uc3QgbmV3SWR4ID0gbmV3WSAqIG5ld1dpZHRoICsgbmV3WDtcbiAgICAgIG5ld0RhdGEzMltuZXdJZHhdID0gZGF0YVtvbGRJZHhdO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRvIHVwZGF0ZSBhIHJlY3Rhbmd1bGFyIFBpeGVsRGF0YSwgd2UgbXVzdCBjcmVhdGUgYSBuZXcgSW1hZ2VEYXRhXG4gIC8vIHNpbmNlIHdpZHRoL2hlaWdodCBhcmUgcmVhZC1vbmx5IHByb3BlcnRpZXMgb2YgdGhlIG5hdGl2ZSBvYmplY3QuXG4gIGNvbnN0IG5ld0ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG5ld0RhdGEzMi5idWZmZXIpLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgc2V0UGl4ZWxEYXRhKHBpeGVsRGF0YSwgbmV3SW1hZ2VEYXRhKTtcbn1cbmZ1bmN0aW9uIHJvdGF0ZVNxdWFyZUluUGxhY2UocGl4ZWxEYXRhOiBQaXhlbERhdGEpOiB2b2lkIHtcbiAgY29uc3QgbiA9IHBpeGVsRGF0YS53O1xuICBjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbiAvIDI7IGkrKykge1xuICAgIGZvciAobGV0IGogPSBpOyBqIDwgbiAtIGkgLSAxOyBqKyspIHtcbiAgICAgIGNvbnN0IHRvcCA9IGkgKiBuICsgajtcbiAgICAgIGNvbnN0IHJpZ2h0ID0gaiAqIG4gKyAobiAtIDEgLSBpKTtcbiAgICAgIGNvbnN0IGJvdHRvbSA9IChuIC0gMSAtIGkpICogbiArIChuIC0gMSAtIGopO1xuICAgICAgY29uc3QgbGVmdCA9IChuIC0gMSAtIGopICogbiArIGk7XG4gICAgICBjb25zdCB0ZW1wID0gZGF0YVt0b3BdO1xuICAgICAgZGF0YVt0b3BdID0gZGF0YVtsZWZ0XTtcbiAgICAgIGRhdGFbbGVmdF0gPSBkYXRhW2JvdHRvbV07XG4gICAgICBkYXRhW2JvdHRvbV0gPSBkYXRhW3JpZ2h0XTtcbiAgICAgIGRhdGFbcmlnaHRdID0gdGVtcDtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makePixelData } from '../index';\nexport function uInt32ArrayToPixelData(data: Uint32Array, width: number, height: number): PixelData {\n const buffer = data.buffer as ArrayBuffer;\n const byteOffset = data.byteOffset;\n const byteLength = data.byteLength;\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength);\n const imageData = new ImageData(clampedArray, width, height);\n return makePixelData(imageData);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUGl4ZWxEYXRhIH0gZnJvbSAnLi4vaW5kZXgnO1xuZXhwb3J0IGZ1bmN0aW9uIHVJbnQzMkFycmF5VG9QaXhlbERhdGEoZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUGl4ZWxEYXRhIHtcbiAgY29uc3QgYnVmZmVyID0gZGF0YS5idWZmZXIgYXMgQXJyYXlCdWZmZXI7XG4gIGNvbnN0IGJ5dGVPZmZzZXQgPSBkYXRhLmJ5dGVPZmZzZXQ7XG4gIGNvbnN0IGJ5dGVMZW5ndGggPSBkYXRhLmJ5dGVMZW5ndGg7XG4gIGNvbnN0IGNsYW1wZWRBcnJheSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShidWZmZXIsIGJ5dGVPZmZzZXQsIGJ5dGVMZW5ndGgpO1xuICBjb25zdCBpbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGNsYW1wZWRBcnJheSwgd2lkdGgsIGhlaWdodCk7XG4gIHJldHVybiBtYWtlUGl4ZWxEYXRhKGltYWdlRGF0YSk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Copies a pixel buffer into a specific region of a {@link PixelData32} object.\n * @param target - The target to write into.\n * @param data - The source pixel data (Uint32Array).\n * @param rect - A rect defining the destination region.\n */\nexport function writePixelDataBuffer(target: PixelData32, data: Uint32Array, rect: Rect): void;\n/**\n * @param target - The target to write into.\n * @param data - The source pixel data (Uint32Array).\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 writePixelDataBuffer(target: PixelData32, data: Uint32Array, x: number, y: number, w: number, h: number): void;\nexport function writePixelDataBuffer(target: PixelData32, data: Uint32Array, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\n let x: number;\n let y: number;\n let w: number;\n let h: number;\n if (typeof _x === 'object') {\n x = _x.x;\n y = _x.y;\n w = _x.w;\n h = _x.h;\n } else {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n }\n if (w <= 0 || h <= 0) return;\n const dstW = target.w;\n const dstH = target.h;\n const dstData = target.data;\n\n // Inline clipping logic\n let dstX = x;\n let dstY = y;\n let srcX = 0;\n let srcY = 0;\n let copyW = w;\n let copyH = h;\n if (dstX < 0) {\n srcX = -dstX;\n copyW += dstX;\n dstX = 0;\n }\n if (dstY < 0) {\n srcY = -dstY;\n copyH += dstY;\n dstY = 0;\n }\n copyW = Math.min(copyW, dstW - dstX);\n copyH = Math.min(copyH, dstH - dstY);\n if (copyW <= 0 || copyH <= 0) return;\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * w + srcX;\n const chunk = data.subarray(srcStart, srcStart + copyW);\n dstData.set(chunk, dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvcGllcyBhIHBpeGVsIGJ1ZmZlciBpbnRvIGEgc3BlY2lmaWMgcmVnaW9uIG9mIGEge0BsaW5rIFBpeGVsRGF0YTMyfSBvYmplY3QuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCB0byB3cml0ZSBpbnRvLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgc291cmNlIHBpeGVsIGRhdGEgKFVpbnQzMkFycmF5KS5cbiAqIEBwYXJhbSByZWN0IC0gQSByZWN0IGRlZmluaW5nIHRoZSBkZXN0aW5hdGlvbiByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcih0YXJnZXQ6IFBpeGVsRGF0YTMyLCBkYXRhOiBVaW50MzJBcnJheSwgcmVjdDogUmVjdCk6IHZvaWQ7XG4vKipcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHRvIHdyaXRlIGludG8uXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBzb3VyY2UgcGl4ZWwgZGF0YSAoVWludDMyQXJyYXkpLlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlIGluIHRoZSB0YXJnZXQuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIHdyaXRlLlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gd3JpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcih0YXJnZXQ6IFBpeGVsRGF0YTMyLCBkYXRhOiBVaW50MzJBcnJheSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcih0YXJnZXQ6IFBpeGVsRGF0YTMyLCBkYXRhOiBVaW50MzJBcnJheSwgX3g6IFJlY3QgfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiB2b2lkIHtcbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcbiAgbGV0IHc6IG51bWJlcjtcbiAgbGV0IGg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBfeCA9PT0gJ29iamVjdCcpIHtcbiAgICB4ID0gX3gueDtcbiAgICB5ID0gX3gueTtcbiAgICB3ID0gX3gudztcbiAgICBoID0gX3guaDtcbiAgfSBlbHNlIHtcbiAgICB4ID0gX3g7XG4gICAgeSA9IF95ITtcbiAgICB3ID0gX3chO1xuICAgIGggPSBfaCE7XG4gIH1cbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybjtcbiAgY29uc3QgZHN0VyA9IHRhcmdldC53O1xuICBjb25zdCBkc3RIID0gdGFyZ2V0Lmg7XG4gIGNvbnN0IGRzdERhdGEgPSB0YXJnZXQuZGF0YTtcblxuICAvLyBJbmxpbmUgY2xpcHBpbmcgbG9naWNcbiAgbGV0IGRzdFggPSB4O1xuICBsZXQgZHN0WSA9IHk7XG4gIGxldCBzcmNYID0gMDtcbiAgbGV0IHNyY1kgPSAwO1xuICBsZXQgY29weVcgPSB3O1xuICBsZXQgY29weUggPSBoO1xuICBpZiAoZHN0WCA8IDApIHtcbiAgICBzcmNYID0gLWRzdFg7XG4gICAgY29weVcgKz0gZHN0WDtcbiAgICBkc3RYID0gMDtcbiAgfVxuICBpZiAoZHN0WSA8IDApIHtcbiAgICBzcmNZID0gLWRzdFk7XG4gICAgY29weUggKz0gZHN0WTtcbiAgICBkc3RZID0gMDtcbiAgfVxuICBjb3B5VyA9IE1hdGgubWluKGNvcHlXLCBkc3RXIC0gZHN0WCk7XG4gIGNvcHlIID0gTWF0aC5taW4oY29weUgsIGRzdEggLSBkc3RZKTtcbiAgaWYgKGNvcHlXIDw9IDAgfHwgY29weUggPD0gMCkgcmV0dXJuO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBkc3RTdGFydCA9IChkc3RZICsgcm93KSAqIGRzdFcgKyBkc3RYO1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogdyArIHNyY1g7XG4gICAgY29uc3QgY2h1bmsgPSBkYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIGNvcHlXKTtcbiAgICBkc3REYXRhLnNldChjaHVuaywgZHN0U3RhcnQpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { writePixelDataBuffer } from './writePixelDataBuffer';\n\n/**\n * @param writePixelDataBufferFn - @hidden\n */\nexport function writePaintBufferToPixelData(target: PixelData, paintBuffer: ColorPaintBuffer, writePixelDataBufferFn = writePixelDataBuffer) {\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n writePixelDataBufferFn(target, tile.data, dx, dy, tile.w, tile.h);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB3cml0ZVBpeGVsRGF0YUJ1ZmZlciB9IGZyb20gJy4vd3JpdGVQaXhlbERhdGFCdWZmZXInO1xuXG4vKipcbiAqIEBwYXJhbSB3cml0ZVBpeGVsRGF0YUJ1ZmZlckZuIC0gQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQYWludEJ1ZmZlclRvUGl4ZWxEYXRhKHRhcmdldDogUGl4ZWxEYXRhLCBwYWludEJ1ZmZlcjogQ29sb3JQYWludEJ1ZmZlciwgd3JpdGVQaXhlbERhdGFCdWZmZXJGbiA9IHdyaXRlUGl4ZWxEYXRhQnVmZmVyKSB7XG4gIGNvbnN0IHRpbGVTaGlmdCA9IHBhaW50QnVmZmVyLmNvbmZpZy50aWxlU2hpZnQ7XG4gIGNvbnN0IGxvb2t1cCA9IHBhaW50QnVmZmVyLmxvb2t1cDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gbG9va3VwW2ldO1xuICAgIGlmICh0aWxlKSB7XG4gICAgICBjb25zdCBkeCA9IHRpbGUudHggPDwgdGlsZVNoaWZ0O1xuICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdDtcbiAgICAgIHdyaXRlUGl4ZWxEYXRhQnVmZmVyRm4odGFyZ2V0LCB0aWxlLmRhdGEsIGR4LCBkeSwgdGlsZS53LCB0aWxlLmgpO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Writes PixelData from a source to a target.\n * @param target - The destination to write to.\n * @param source - The source to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n */\nexport function writePixelData(target: PixelData32, source: PixelData32, x = 0, y = 0): void {\n const dstW = target.w;\n const dstH = target.h;\n const dst = target.data;\n const srcW = source.w;\n const srcH = source.h;\n const src = source.data;\n let dstX = x;\n let dstY = y;\n let srcX = 0;\n let srcY = 0;\n let copyW = srcW;\n let copyH = srcH;\n if (dstX < 0) {\n srcX = -dstX;\n copyW += dstX;\n dstX = 0;\n }\n if (dstY < 0) {\n srcY = -dstY;\n copyH += dstY;\n dstY = 0;\n }\n copyW = Math.min(copyW, dstW - dstX);\n copyH = Math.min(copyH, dstH - dstY);\n if (copyW <= 0 || copyH <= 0) return;\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * srcW + srcX;\n const chunk = src.subarray(srcStart, srcStart + copyW);\n dst.set(chunk, dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdyaXRlcyBQaXhlbERhdGEgZnJvbSBhIHNvdXJjZSB0byBhIHRhcmdldC5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZGVzdGluYXRpb24gdG8gd3JpdGUgdG8uXG4gKiBAcGFyYW0gc291cmNlIC0gVGhlIHNvdXJjZSB0byByZWFkIGZyb20uXG4gKiBAcGFyYW0geCAtIFRoZSB4LWNvb3JkaW5hdGUgaW4gdGhlIHRhcmdldCB3aGVyZSBkcmF3aW5nIHN0YXJ0cy5cbiAqIEBwYXJhbSB5IC0gVGhlIHktY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0IHdoZXJlIGRyYXdpbmcgc3RhcnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGEodGFyZ2V0OiBQaXhlbERhdGEzMiwgc291cmNlOiBQaXhlbERhdGEzMiwgeCA9IDAsIHkgPSAwKTogdm9pZCB7XG4gIGNvbnN0IGRzdFcgPSB0YXJnZXQudztcbiAgY29uc3QgZHN0SCA9IHRhcmdldC5oO1xuICBjb25zdCBkc3QgPSB0YXJnZXQuZGF0YTtcbiAgY29uc3Qgc3JjVyA9IHNvdXJjZS53O1xuICBjb25zdCBzcmNIID0gc291cmNlLmg7XG4gIGNvbnN0IHNyYyA9IHNvdXJjZS5kYXRhO1xuICBsZXQgZHN0WCA9IHg7XG4gIGxldCBkc3RZID0geTtcbiAgbGV0IHNyY1ggPSAwO1xuICBsZXQgc3JjWSA9IDA7XG4gIGxldCBjb3B5VyA9IHNyY1c7XG4gIGxldCBjb3B5SCA9IHNyY0g7XG4gIGlmIChkc3RYIDwgMCkge1xuICAgIHNyY1ggPSAtZHN0WDtcbiAgICBjb3B5VyArPSBkc3RYO1xuICAgIGRzdFggPSAwO1xuICB9XG4gIGlmIChkc3RZIDwgMCkge1xuICAgIHNyY1kgPSAtZHN0WTtcbiAgICBjb3B5SCArPSBkc3RZO1xuICAgIGRzdFkgPSAwO1xuICB9XG4gIGNvcHlXID0gTWF0aC5taW4oY29weVcsIGRzdFcgLSBkc3RYKTtcbiAgY29weUggPSBNYXRoLm1pbihjb3B5SCwgZHN0SCAtIGRzdFkpO1xuICBpZiAoY29weVcgPD0gMCB8fCBjb3B5SCA8PSAwKSByZXR1cm47XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFg7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSArIHJvdykgKiBzcmNXICsgc3JjWDtcbiAgICBjb25zdCBjaHVuayA9IHNyYy5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5Vyk7XG4gICAgZHN0LnNldChjaHVuaywgZHN0U3RhcnQpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119"],"mappings":"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","names":["MaskType","get","TileType","applyAlphaMaskToPixelData","defaults","applyBinaryMaskToPixelData","defaults","applyBinaryMaskToPixelData","applyAlphaMaskToPixelData","defaults","blendPixelDataAlphaMask","defaults","blendPixelDataBinaryMask","defaults","blendColorPixelData","defaults","blendColorPixelDataAlphaMask","defaults","blendColorPixelDataBinaryMask","defaults","blendColorPixelDataBinaryMask","blendColorPixelDataAlphaMask","defaults","blendColorPixelData","defaults","blendPixelDataAlphaMask","blendPixelDataBinaryMask","defaults","blendPixel","defaults","blendPixelData","defaults","fillPixelData","defaults","fillPixelData","defaults","fillPixelDataBinaryMask","defaults","invertPixelData","r","g","b","a","PaintMaskOutline","SCRATCH_OPTS","SCRATCH_OPTS","SCRATCH_OPTS","SCRATCH_OPTS","SCRATCH_OPTS"]}
|
|
1
|
+
{"version":3,"sources":["../src/Internal/_errors.ts","../src/Color/colorDistance.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/_mask-types.ts","../src/Mask/extractMaskBuffer.ts","../src/Rect/trimMaskRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/Algorithm/forEachLinePoint.ts","../src/Algorithm/resampleUint32Array.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes-fast.ts","../src/BlendModes/blend-modes-perfect.ts","../src/BlendModes/toBlendModeIndexAndName.ts","../src/Canvas/canvas-blend-modes.ts","../src/Canvas/ReusableCanvas.ts","../src/Canvas/CanvasFrameRenderer.ts","../src/Canvas/CanvasPixelDataRenderer.ts","../src/Canvas/PixelCanvas.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/Color/lerpColor32.ts","../src/Color/convert-color.ts","../src/Color/pack-color.ts","../src/Control/BatchedQueue.ts","../src/Control/RenderQueue.ts","../src/History/PixelPatchTiles.ts","../src/History/HistoryAction.ts","../src/History/HistoryManager.ts","../src/History/PixelAccumulator.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/ImageData/resizeImageData.ts","../src/PixelData/PixelData.ts","../src/Tile/_tile-types.ts","../src/Tile/PixelTile.ts","../src/Tile/TilePool.ts","../src/Tile/TileTargetConfig.ts","../src/History/PixelWriter.ts","../src/History/PixelMutator/mutatorApplyAlphaMask.ts","../src/PixelData/applyBinaryMaskToPixelData.ts","../src/History/PixelMutator/mutatorApplyBinaryMask.ts","../src/History/PixelMutator/mutatorApplyMask.ts","../src/PixelData/blendPixelDataAlphaMask.ts","../src/History/PixelMutator/mutatorBlendAlphaMask.ts","../src/PixelData/blendPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorBlendBinaryMask.ts","../src/PixelData/blendColorPixelData.ts","../src/History/PixelMutator/mutatorBlendColor.ts","../src/PixelData/blendColorPixelDataAlphaMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintAlphaMask.ts","../src/PixelData/blendColorPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintBinaryMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintRect.ts","../src/History/PixelMutator/mutatorBlendMask.ts","../src/PixelData/blendPixel.ts","../src/History/PixelMutator/mutatorBlendPixel.ts","../src/PixelData/blendPixelData.ts","../src/History/PixelMutator/mutatorBlendPixelData.ts","../src/PixelData/fillPixelData.ts","../src/History/PixelMutator/mutatorClear.ts","../src/History/PixelMutator/mutatorFill.ts","../src/PixelData/fillPixelDataBinaryMask.ts","../src/History/PixelMutator/mutatorFillBinaryMask.ts","../src/PixelData/invertPixelData.ts","../src/History/PixelMutator/mutatorInvert.ts","../src/History/PixelMutator.ts","../src/ImageData/copyImageData.ts","../src/ImageData/extractImageData.ts","../src/ImageData/ImageDataLike.ts","../src/ImageData/imageDataToAlphaMaskBuffer.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUint32Array.ts","../src/ImageData/invertImageData.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/uInt32ArrayToImageData.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/getIndexedImageColorCounts.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/indexedImageToAverageColor.ts","../src/IndexedImage/indexedImageToImageData.ts","../src/IndexedImage/resampleIndexedImage.ts","../src/Input/fileInputChangeToImageData.ts","../src/Input/fileToImageData.ts","../src/Input/getSupportedRasterFormats.ts","../src/Mask/AlphaMask.ts","../src/Mask/applyBinaryMaskToAlphaMask.ts","../src/Mask/BinaryMask.ts","../src/Mask/BinaryMask/makeBinaryMaskFromAlphaMask.ts","../src/Mask/BinaryMask/makeBinaryMaskOutline.ts","../src/Mask/BinaryMask/makeCircleBinaryMaskOutline.ts","../src/Mask/BinaryMask/makeRectBinaryMaskOutline.ts","../src/Mask/copyMask.ts","../src/Mask/extractMask.ts","../src/Mask/invertMask.ts","../src/Mask/mergeAlphaMasks.ts","../src/Mask/mergeBinaryMasks.ts","../src/Mask/setMaskData.ts","../src/Rect/getRectsBounds.ts","../src/MaskRect/merge2BinaryMaskRects.ts","../src/MaskRect/mergeBinaryMaskRects.ts","../src/MaskRect/subtractBinaryMaskRects.ts","../src/Paint/_paint-types.ts","../src/Rect/trimRectBounds.ts","../src/Tile/MaskTile.ts","../src/Paint/eachTileInBounds.ts","../src/Paint/AlphaMaskPaintBuffer.ts","../src/Paint/BinaryMaskPaintBuffer.ts","../src/Paint/ColorPaintBuffer.ts","../src/Paint/Commit/commitMaskPaintBuffer.ts","../src/Paint/Commit/AlphaMaskPaintBufferCommitter.ts","../src/PixelData/ReusablePixelData.ts","../src/Paint/Render/AlphaMaskPaintBufferCanvasRenderer.ts","../src/Paint/Commit/AlphaMaskPaintBufferManager.ts","../src/Paint/Commit/BinaryMaskPaintBufferCommitter.ts","../src/Paint/Render/BinaryMaskPaintBufferCanvasRenderer.ts","../src/Paint/Commit/BinaryMaskPaintBufferManager.ts","../src/Paint/Commit/commitColorPaintBuffer.ts","../src/Paint/Commit/ColorPaintBufferCommitter.ts","../src/Paint/Render/ColorPaintBufferCanvasRenderer.ts","../src/Paint/Commit/ColorPaintBufferManager.ts","../src/Paint/makeCirclePaintMask.ts","../src/Paint/makePaintMask.ts","../src/Paint/makeRectFalloffPaintAlphaMask.ts","../src/Paint/PaintRect.ts","../src/Paint/Render/PaintCursorRenderer.ts","../src/PixelData/applyMaskToPixelData.ts","../src/PixelData/blendColorPixelDataMask.ts","../src/PixelData/blendColorPixelDataPaintAlphaMask.ts","../src/PixelData/blendColorPixelDataPaintBinaryMask.ts","../src/PixelData/blendColorPixelDataPaintMask.ts","../src/PixelData/blendPixelDataMask.ts","../src/PixelData/blendPixelDataPaintBuffer.ts","../src/PixelData/fillPixelDataFast.ts","../src/PixelData/clearPixelDataFast.ts","../src/PixelData/copyPixelData.ts","../src/PixelData/cropPixelData.ts","../src/PixelData/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/resizePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/trimPixelData.ts","../src/PixelData/uInt32ArrayToPixelData.ts","../src/PixelData/writePixelDataBuffer.ts","../src/PixelData/writePaintBufferToPixelData.ts","../src/PixelData/writePixelData.ts"],"sourcesContent":["export const OFFSCREEN_CANVAS_CTX_FAILED = 'Failed to create OffscreenCanvas context'\nexport const CANVAS_CTX_FAILED = 'Failed to create Canvas context'\n","import type { Color32 } from './_color-types'\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","import type { Rect } from '../Rect/_rect-types'\nimport type { ImageDataLike } from './_ImageData-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 rect defining the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n rect: Rect,\n): Uint8ClampedArray\n/**\n * @param imageData - The source image data to read from.\n * @param x - The starting horizontal coordinate.\n * @param y - The starting vertical coordinate.\n * @param w - The width of the region to extract.\n * @param h - The height of the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8ClampedArray\nexport function extractImageDataBuffer(\n imageData: ImageDataLike,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): Uint8ClampedArray {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0)\n\n const srcW = imageData.width\n const srcH = imageData.height\n const src = imageData.data\n\n const outLen = w * h * 4\n const out = new Uint8ClampedArray(outLen)\n\n let srcX = x\n let srcY = y\n let dstX = 0\n let dstY = 0\n let copyW = w\n let copyH = h\n\n if (srcX < 0) {\n dstX = -srcX\n copyW += srcX\n srcX = 0\n }\n\n if (srcY < 0) {\n dstY = -srcY\n copyH += srcY\n srcY = 0\n }\n\n copyW = Math.min(copyW, srcW - srcX)\n copyH = Math.min(copyH, srcH - srcY)\n\n if (copyW <= 0 || copyH <= 0) return out\n\n // 2. Perform high-speed block copy\n // Attempt to use a 32-bit view if the buffer is memory-aligned.\n // This reduces loop iterations and arithmetic by 4x.\n const isAligned = src.byteOffset % 4 === 0\n\n if (isAligned) {\n const srcLen32 = src.byteLength / 4\n const src32 = new Uint32Array(src.buffer, src.byteOffset, srcLen32)\n const out32 = new Uint32Array(out.buffer)\n\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX\n const dstStart = (dstY + row) * w + dstX\n const chunk = src32.subarray(srcStart, srcStart + copyW)\n\n out32.set(chunk, dstStart)\n }\n } else {\n // Fallback for unaligned data\n const rowLen = copyW * 4\n\n for (let row = 0; row < copyH; row++) {\n const srcStart = ((srcY + row) * srcW + srcX) * 4\n const dstStart = ((dstY + row) * w + dstX) * 4\n const chunk = src.subarray(srcStart, srcStart + rowLen)\n\n out.set(chunk, dstStart)\n }\n }\n\n return out\n}\n","import type { Rect } from '../Rect/_rect-types'\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\nexport interface BaseMask {\n readonly type: MaskType\n readonly data: Uint8Array\n readonly w: number\n readonly h: number\n}\n\nexport type Mask = BinaryMask | AlphaMask\n\n/** Strictly 0 or 1 */\nexport interface BinaryMask extends BaseMask {\n readonly type: MaskType.BINARY\n}\n\n/** Strictly 0-255 */\nexport interface AlphaMask extends BaseMask {\n readonly type: MaskType.ALPHA\n}\n\nexport interface MutableMask<T extends MaskType> {\n readonly type: T\n data: Uint8Array\n w: number\n h: number\n}\n\nexport interface MutableAlphaMask extends MutableMask<MaskType.ALPHA> {\n}\n\nexport interface MutableBinaryMask extends MutableMask<MaskType.BINARY> {\n}\n\nexport type MaskRect<T extends MaskType> = Rect & {\n type: T\n data: Uint8Array\n}\n\nexport type BinaryMaskRect = MaskRect<MaskType.BINARY>\n\nexport type AlphaMaskRect = MaskRect<MaskType.ALPHA>\n\nexport type NullableBinaryMaskRect = Rect & ({\n type: MaskType.BINARY\n data: Uint8Array\n} | {\n type?: null\n data?: null\n})\n\nexport type NullableAlphaMaskRect = Rect & ({\n type: MaskType.ALPHA\n data: Uint8Array\n} | {\n type?: null\n data?: null\n})\n\nexport type NullableMaskRect = Rect & ({\n type: MaskType\n data: Uint8Array\n} | {\n type?: null\n data?: null\n})\n","import type { Rect } from '../Rect/_rect-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 maskBuffer - 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 extractMaskBuffer(\n maskBuffer: Uint8Array,\n maskWidth: number,\n rect: Rect,\n): Uint8Array\n\n/**\n * @param maskBuffer - 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 extractMaskBuffer(\n maskBuffer: Uint8Array,\n maskWidth: number,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint8Array\nexport function extractMaskBuffer(\n maskBuffer: 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 = maskBuffer.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 maskBuffer.subarray(srcOffset, srcOffset + count),\n dstOffset,\n )\n }\n }\n\n return out\n}\n","import type { NullableMaskRect } from '../Mask/_mask-types'\nimport { extractMaskBuffer } from '../Mask/extractMaskBuffer'\nimport type { Rect } from './_rect-types'\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 NullableMaskRect}), the mask is physically\n * cropped and re-aligned using `extractMaskBuffer` 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 trimMaskRectBounds<T extends NullableMaskRect>(\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 ('data' in target && target.data) {\n target.data = 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 ('data' in target && target.data) {\n const currentMaskBuffer = extractMaskBuffer(\n target.data,\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 (currentMaskBuffer[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 target.data = new Uint8Array(0)\n\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 const newMaskBuffer = extractMaskBuffer(\n currentMaskBuffer,\n intersectedW,\n minX,\n minY,\n finalW,\n finalH,\n )\n\n target.x += minX\n target.y += minY\n target.w = finalW\n target.h = finalH\n target.data = newMaskBuffer\n } else {\n target.w = finalW\n target.h = finalH\n target.data = currentMaskBuffer\n }\n }\n}\n","import type { Color32 } from '../Color/_color-types'\n\nimport { colorDistance } from '../Color/colorDistance'\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer'\nimport { type BinaryMaskRect, MaskType } from '../Mask/_mask-types'\nimport type { PixelData } from '../PixelData/_pixelData-types'\nimport type { Rect } from '../Rect/_rect-types'\nimport { trimMaskRectBounds } from '../Rect/trimMaskRectBounds'\n\nexport type FloodFillResult = BinaryMaskRect & {\n startX: number\n startY: number\n pixels: Uint8ClampedArray\n}\n\n/**\n * Performs a color-based flood fill selection {@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 target - The source image data to process.\n * @param startX - The starting horizontal coordinate.\n * @param startY - The starting vertical coordinate.\n * @param contiguous - If true, only connected pixels are\n * selected. If false, all pixels within tolerance are selected regardless of position.\n * @param tolerance - The maximum allowed difference in color\n * distance (0-255) for a pixel to be included.\n * @param bounds - Optional bounding box to restrict the search area.\n * @param out output object\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 target: PixelData,\n startX: number,\n startY: number,\n contiguous = true,\n tolerance = 0,\n bounds?: Rect,\n out?: FloodFillResult,\n): FloodFillResult | null {\n\n const data32 = target.data\n const width = target.w\n const height = target.h\n\n const lx = bounds?.x ?? 0\n const ly = bounds?.y ?? 0\n const lw = bounds?.w ?? width\n const lh = bounds?.h ?? height\n\n const xMin = Math.max(0, lx)\n const xMax = Math.min(width - 1, lx + lw - 1)\n const yMin = Math.max(0, ly)\n const yMax = Math.min(height - 1, ly + lh - 1)\n\n if (startX < xMin || startX > xMax || startY < yMin || startY > yMax) {\n return null\n }\n out = out ?? {} as FloodFillResult\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) return null\n\n const w = maxX - minX + 1\n const h = maxY - minY + 1\n\n out.startX = startX\n out.startY = startY\n out.x = minX\n out.y = minY\n out.w = w\n out.h = h\n out.data = new Uint8Array(w * h)\n out.type = MaskType.BINARY\n\n const finalMask = out.data\n\n for (let i = 0; i < matchCount; i++) {\n const mx = matchX[i] - minX\n const my = matchY[i] - minY\n\n if (mx >= 0 && mx < w && my >= 0 && my < h) {\n finalMask[my * w + mx] = 1\n }\n }\n\n trimMaskRectBounds(\n out,\n { x: 0, y: 0, w: width, h: height },\n )\n\n out.pixels = extractImageDataBuffer(\n target.imageData,\n out.x,\n out.y,\n out.w,\n out.h,\n )\n\n return out\n}\n","/**\n * Iterates through a line with sub-pixel precision.\n * Guarantees that the first and last points are exactly (x0, y0) and (x1, y1).\n */\nexport function forEachLinePoint(\n x0: number,\n y0: number,\n x1: number,\n y1: number,\n callback: (x: number, y: number) => void,\n): void {\n\n if (x0 === x1 && y0 === y1) {\n callback(x0, y0)\n return\n }\n\n const dx = x1 - x0\n const dy = y1 - y0\n\n // Determine the number of steps based on the longest axis\n const steps = Math.max(Math.abs(dx), Math.abs(dy))\n\n const xInc = dx / steps\n const yInc = dy / steps\n\n let curX = x0\n let curY = y0\n\n // We add +1 to the loop to ensure we reach the final (x1, y1)\n for (let i = 0; i <= steps; i++) {\n callback(curX, curY)\n curX += xInc\n curY += yInc\n }\n}\n","import type { MutablePixelData32, PixelData32 } from '../PixelData/_pixelData-types'\n\nexport function resampleUint32Array<T extends PixelData32, M extends MutablePixelData32>(\n srcData32: Uint32Array,\n srcW: number,\n srcH: number,\n factor: number,\n out?: M,\n): T {\n const dstW = Math.max(1, (srcW * factor) | 0)\n const dstH = Math.max(1, (srcH * factor) | 0)\n const dstData = new Uint32Array(dstW * dstH)\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW\n const scaleY = srcH / dstH\n\n for (let y = 0; y < dstH; y++) {\n const srcY = Math.min(srcH - 1, (y * scaleY) | 0)\n const srcRowOffset = srcY * srcW\n const dstRowOffset = y * dstW\n\n for (let x = 0; x < dstW; x++) {\n const srcX = Math.min(srcW - 1, (x * scaleX) | 0)\n\n dstData[dstRowOffset + x] = srcData32[srcRowOffset + srcX]!\n }\n }\n\n out = out ?? {} as M\n out.data = dstData\n out.w = dstW\n out.h = dstH\n\n return out as unknown as T\n}\n","import type { BlendColor32 } from '../_types'\n\nexport const BaseBlendMode = {\n overwrite: 0,\n sourceOver: 1,\n darken: 2,\n multiply: 3,\n colorBurn: 4,\n linearBurn: 5,\n darkerColor: 6,\n lighten: 7,\n screen: 8,\n colorDodge: 9,\n linearDodge: 10,\n lighterColor: 11,\n overlay: 12,\n softLight: 13,\n hardLight: 14,\n vividLight: 15,\n linearLight: 16,\n pinLight: 17,\n hardMix: 18,\n difference: 19,\n exclusion: 20,\n subtract: 21,\n divide: 22,\n\n sourceIn: 23,\n sourceOut: 24,\n sourceAtop: 25,\n destinationOver: 26,\n destinationIn: 27,\n destinationOut: 28,\n destinationAtop: 29,\n xor: 30,\n} as const\n\nexport interface RequiredBlendModes {\n overwrite: 0;\n}\n\nexport type BaseBlendModes = RequiredBlendModes & Record<string, number>\n\nexport const overwriteBase: BlendColor32 = (src, _dst) => src\noverwriteBase.isOverwrite = true\n","import type { BlendColor32 } from '../_types'\nimport type { BaseBlendModes } from './blend-modes'\n\nexport type BlendModeRegistry<\n BlendModes extends BaseBlendModes = BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n> = ReturnType<typeof makeBlendModeRegistry<BlendModes, Name, Index>>\n\nexport function makeBlendModeRegistry<\n BlendModes extends BaseBlendModes,\n Name extends keyof BlendModes = keyof BlendModes,\n Index extends BlendModes[Name] = BlendModes[Name]\n\n>(\n blendModes: BlendModes,\n initialEntries: Record<Index, BlendColor32>,\n registryName = 'anonymous',\n) {\n\n const blendToName = new Map<BlendColor32, Name>()\n const blendToIndex = new Map<BlendColor32, Index>()\n const indexToName: Name[] = []\n const indexToBlend: BlendColor32[] = []\n const nameToBlend = {} as { [K in keyof BlendModes]: BlendColor32 }\n const nameToIndex = {} as Record<Name, Index>\n\n const add = (name: Name, index: Index, blendFn: BlendColor32) => {\n if (!Number.isFinite(index)) {\n throw new Error(`Index \"${index}\" is not a number. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n if (indexToBlend[index]) {\n throw new Error(`Blend Mode index: ${index} is already used. Attempting to add name: \"${name as string}\", index: \"${index}\"`)\n }\n\n indexToName[index] = name\n indexToBlend[index] = blendFn\n blendToIndex.set(blendFn, index)\n blendToName.set(blendFn, name)\n nameToBlend[name] = blendFn\n nameToIndex[name] = index\n }\n\n for (const [name, index] of Object.entries(blendModes)) {\n const blend = initialEntries[index as Index]\n add(name as Name, index as Index, blend)\n }\n\n return {\n registryName,\n nameToBlend,\n nameToIndex,\n\n blendToIndex,\n blendToName,\n\n indexToBlend,\n indexToName,\n\n indexType: null as unknown as Index,\n nameType: null as unknown as Name,\n }\n}\n","import type { BlendColor32 } from '../_types'\nimport type { Color32 } from '../Color/_color-types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwriteFast = overwriteBase\n\nexport const sourceInFast: BlendColor32 = (src, dst) => {\n const da = (dst >>> 24) & 0xFF\n if (da === 0) return 0 as Color32\n if (da === 255) return src\n\n const sa = (src >>> 24) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const r = (sr * da) >> 8\n const g = (sg * da) >> 8\n const b = (sb * da) >> 8\n const a = (sa * da) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const sourceOutFast: BlendColor32 = (src, dst) => {\n const da = (dst >>> 24) & 0xFF\n if (da === 255) return 0 as Color32\n if (da === 0) return src\n\n const sa = (src >>> 24) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const invDa = 255 - da\n const r = (sr * invDa) >> 8\n const g = (sg * invDa) >> 8\n const b = (sb * invDa) >> 8\n const a = (sa * invDa) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const sourceAtopFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n const da = (dst >>> 24) & 0xFF\n if (da === 0) return 0 as Color32\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invSa = 255 - sa\n const r = (sr * da + dr * invSa) >> 8\n const g = (sg * da + dg * invSa) >> 8\n const b = (sb * da + db * invSa) >> 8\n\n return ((da << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationOverFast: BlendColor32 = (src, dst) => {\n const da = (dst >>> 24) & 0xFF\n if (da === 255) return dst\n if (da === 0) return src\n\n const sa = (src >>> 24) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invDa = 255 - da\n const r = (dr * 255 + sr * invDa) >> 8\n const g = (dg * 255 + sg * invDa) >> 8\n const b = (db * 255 + sb * invDa) >> 8\n const a = (da * 255 + sa * invDa) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationInFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return 0 as Color32\n if (sa === 255) return dst\n\n const da = (dst >>> 24) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const r = (dr * sa) >> 8\n const g = (dg * sa) >> 8\n const b = (db * sa) >> 8\n const a = (da * sa) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationOutFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return 0 as Color32\n if (sa === 0) return dst\n\n const da = (dst >>> 24) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invSa = 255 - sa\n const r = (dr * invSa) >> 8\n const g = (dg * invSa) >> 8\n const b = (db * invSa) >> 8\n const a = (da * invSa) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationAtopFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return 0 as Color32 // Rule: Final Alpha = Sa\n const da = (dst >>> 24) & 0xFF\n if (da === 0) return 0 as Color32\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invDa = 255 - da\n const r = (dr * sa + sr * invDa) >> 8\n const g = (dg * sa + sg * invDa) >> 8\n const b = (db * sa + sb * invDa) >> 8\n\n return ((sa << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const xorFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n const da = (dst >>> 24) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invDa = 255 - da\n const invSa = 255 - sa\n\n const r = (sr * invDa + dr * invSa) >> 8\n const g = (sg * invDa + dg * invSa) >> 8\n const b = (sb * invDa + db * invSa) >> 8\n const a = (sa * invDa + da * invSa) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const sourceOverFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return src\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const da = (dst >>> 24) & 0xFF\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (sr * sa + dr * invA) >> 8\n const g = (sg * sa + dg * invA) >> 8\n const b = (sb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (src * dst) / 255 */\nexport const multiplyFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n // Consistent floor rounding for all channels\n const br = (sr * dr) >> 8\n const bg = (sg * dg) >> 8\n const bb = (sb * db) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = dr === 255 ? 255 : sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / sr) | 0)\n const bg = dg === 255 ? 255 : sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / sg) | 0)\n const bb = db === 255 ? 255 : sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + da * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const bgU = dg + sg - 255\n const bbU = db + sb - 255\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkerFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(src, dst) */\nexport const lightenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const br = Math.max(src & 0xFF, dst & 0xFF)\n const bg = Math.max((src >> 8) & 0xFF, (dst >> 8) & 0xFF)\n const bb = Math.max((src >> 16) & 0xFF, (dst >> 16) & 0xFF)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const dr = dst & 0xFF\n const dg = (dst >> 8) & 0xFF\n const db = (dst >> 16) & 0xFF\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = 255 - (((255 - (src & 0xFF)) * (255 - dr)) >> 8)\n const bg = 255 - (((255 - ((src >>> 8) & 0xFF)) * (255 - dg)) >> 8)\n const bb = 255 - (((255 - ((src >>> 16) & 0xFF)) * (255 - db)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgeFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 255 ? 255 : Math.min(255, ((dr << 8) / (255 - sr)) | 0)\n const bg = sg === 255 ? 255 : Math.min(255, ((dg << 8) / (255 - sg)) | 0)\n const bb = sb === 255 ? 255 : Math.min(255, ((db << 8) / (255 - sb)) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst */\nexport const linearDodgeFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bbU = ((src >>> 16) & 0xFF) + db\n\n const br = brU > 255 ? 255 : brU\n const bg = bgU > 255 ? 255 : bgU\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const lighterFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = dr < 128 ? (2 * sr * dr) >> 8 : 255 - (2 * (255 - sr) * (255 - dr) >> 8)\n const bg = dg < 128 ? (2 * sg * dg) >> 8 : 255 - (2 * (255 - sg) * (255 - dg) >> 8)\n const bb = db < 128 ? (2 * sb * db) >> 8 : 255 - (2 * (255 - sb) * (255 - db) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = ((255 - dr) * ((sr * dr) >> 8) + dr * (255 - (((255 - sr) * (255 - dr)) >> 8))) >> 8\n const bg = ((255 - dg) * ((sg * dg) >> 8) + dg * (255 - (((255 - sg) * (255 - dg)) >> 8))) >> 8\n const bb = ((255 - db) * ((sb * db) >> 8) + db * (255 - (((255 - sb) * (255 - db)) >> 8))) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (2 * sr * dr) >> 8 : 255 - ((2 * (255 - sr) * (255 - dr)) >> 8)\n const bg = sg < 128 ? (2 * sg * dg) >> 8 : 255 - ((2 * (255 - sg) * (255 - dg)) >> 8)\n const bb = sb < 128 ? (2 * sb * db) >> 8 : 255 - ((2 * (255 - sb) * (255 - db)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr + 2 * sr - 255\n const bgU = dg + 2 * sg - 255\n const bbU = db + 2 * sb - 255\n\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < 2 * sr ? dr : 2 * sr) : (dr > 2 * sr - 256 ? dr : 2 * sr - 256)\n const bg = sg < 128 ? (dg < 2 * sg ? dg : 2 * sg) : (dg > 2 * sg - 256 ? dg : 2 * sg - 256)\n const bb = sb < 128 ? (db < 2 * sb ? db : 2 * sb) : (db > 2 * sb - 256 ? db : 2 * sb - 256)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, 255 - (((255 - dr) << 8) / (2 * sr)) | 0)) : (sr === 255 ? 255 : Math.min(255, ((dr << 8) / (2 * (255 - sr))) | 0))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, 255 - (((255 - dg) << 8) / (2 * sg)) | 0)) : (sg === 255 ? 255 : Math.min(255, ((dg << 8) / (2 * (255 - sg))) | 0))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, 255 - (((255 - db) << 8) / (2 * sb)) | 0)) : (sb === 255 ? 255 : Math.min(255, ((db << 8) / (2 * (255 - sb))) | 0))) < 128 ? 0 : 255\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.abs(src - dst) */\nexport const differenceFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brD = (src & 0xFF) - dr\n const bgD = ((src >>> 8) & 0xFF) - dg\n const bbD = ((src >>> 16) & 0xFF) - db\n\n const br = brD < 0 ? -brD : brD\n const bg = bgD < 0 ? -bgD : bgD\n const bb = bbD < 0 ? -bbD : bbD\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr + sr - ((dr * sr) >> 7)\n const bg = dg + sg - ((dg * sg) >> 7)\n const bb = db + sb - ((db * sb) >> 7)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(0, dst - src) */\nexport const subtractFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const brU = dr - sr\n const bgU = dg - sg\n const bbU = db - sb\n\n const br = brU < 0 ? 0 : brU\n const bg = bgU < 0 ? 0 : bgU\n const bb = bbU < 0 ? 0 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const divideFast: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = sr === 0 ? 255 : Math.min(255, ((dr << 8) / sr) | 0)\n const bg = sg === 0 ? 255 : Math.min(255, ((dg << 8) / sg) | 0)\n const bb = sb === 0 ? 255 : Math.min(255, ((db << 8) / sb) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const r = (br * sa + dr * invA) >> 8\n const g = (bg * sa + dg * invA) >> 8\n const b = (bb * sa + db * invA) >> 8\n const a = (255 * sa + ((dst >>> 24) & 0xFF) * invA) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const BASE_FAST_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwriteFast,\n\n [BaseBlendMode.sourceIn]: sourceInFast,\n [BaseBlendMode.sourceOut]: sourceOutFast,\n [BaseBlendMode.sourceAtop]: sourceAtopFast,\n [BaseBlendMode.destinationOver]: destinationOverFast,\n [BaseBlendMode.destinationIn]: destinationInFast,\n [BaseBlendMode.destinationOut]: destinationOutFast,\n [BaseBlendMode.destinationAtop]: destinationAtopFast,\n [BaseBlendMode.xor]: xorFast,\n\n [BaseBlendMode.sourceOver]: sourceOverFast,\n [BaseBlendMode.darken]: darkenFast,\n [BaseBlendMode.multiply]: multiplyFast,\n [BaseBlendMode.colorBurn]: colorBurnFast,\n [BaseBlendMode.linearBurn]: linearBurnFast,\n [BaseBlendMode.darkerColor]: darkerFast,\n\n [BaseBlendMode.lighten]: lightenFast,\n [BaseBlendMode.screen]: screenFast,\n [BaseBlendMode.colorDodge]: colorDodgeFast,\n [BaseBlendMode.linearDodge]: linearDodgeFast,\n [BaseBlendMode.lighterColor]: lighterFast,\n\n [BaseBlendMode.overlay]: overlayFast,\n [BaseBlendMode.softLight]: softLightFast,\n [BaseBlendMode.hardLight]: hardLightFast,\n [BaseBlendMode.vividLight]: vividLightFast,\n [BaseBlendMode.linearLight]: linearLightFast,\n [BaseBlendMode.pinLight]: pinLightFast,\n [BaseBlendMode.hardMix]: hardMixFast,\n\n [BaseBlendMode.difference]: differenceFast,\n [BaseBlendMode.exclusion]: exclusionFast,\n [BaseBlendMode.subtract]: subtractFast,\n [BaseBlendMode.divide]: divideFast,\n}\n\nexport function makeFastBlendModeRegistry(name = 'fast') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_FAST_BLEND_MODE_FUNCTIONS, name)\n}\n","import type { BlendColor32 } from '../_types'\nimport type { Color32 } from '../Color/_color-types'\nimport { BaseBlendMode, overwriteBase } from './blend-modes'\nimport { makeBlendModeRegistry } from './BlendModeRegistry'\n\nexport const overwritePerfect = overwriteBase\n\nexport const sourceInPerfect: BlendColor32 = (src, dst) => {\n const da = (dst >>> 24) & 0xFF\n if (da === 0) return 0 as Color32\n if (da === 255) return src\n\n const sa = (src >>> 24) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Result: [Sa * Da, Sc * Da]\n const tR = sr * da\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = sg * da\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = sb * da\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = sa * da\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const sourceOutPerfect: BlendColor32 = (src, dst) => {\n const da = (dst >>> 24) & 0xFF\n if (da === 255) return 0 as Color32\n if (da === 0) return src\n\n const sa = (src >>> 24) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const invDa = 255 - da\n // Result: [Sa * (1 - Da), Sc * (1 - Da)]\n const tR = sr * invDa\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = sg * invDa\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = sb * invDa\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = sa * invDa\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const sourceAtopPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n const da = (dst >>> 24) & 0xFF\n if (da === 0) return 0 as Color32\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invSa = 255 - sa\n // Result: [Da, Sc * Da + Dc * (1 - Sa)]\n const tR = sr * da + dr * invSa\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = sg * da + dg * invSa\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = sb * da + db * invSa\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n return ((da << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationOverPerfect: BlendColor32 = (src, dst) => {\n const da = (dst >>> 24) & 0xFF\n if (da === 255) return dst\n if (da === 0) return src\n\n const sa = (src >>> 24) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invDa = 255 - da\n // Result: [Da + Sa * (1 - Da), Dc + Sc * (1 - Da)]\n const tR = dr * 255 + sr * invDa\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = dg * 255 + sg * invDa\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = db * 255 + sb * invDa\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = da * 255 + sa * invDa\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationInPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return 0 as Color32\n if (sa === 255) return dst\n\n const da = (dst >>> 24) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n // Result: [Da * Sa, Dc * Sa]\n const tR = dr * sa\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = dg * sa\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = db * sa\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = da * sa\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationOutPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 255) return 0 as Color32\n if (sa === 0) return dst\n\n const da = (dst >>> 24) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invSa = 255 - sa\n // Result: [Da * (1 - Sa), Dc * (1 - Sa)]\n const tR = dr * invSa\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = dg * invSa\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = db * invSa\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = da * invSa\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const destinationAtopPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return 0 as Color32 // Rule: Final Alpha = Sa\n const da = (dst >>> 24) & 0xFF\n if (da === 0) return 0 as Color32\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invDa = 255 - da\n // Result: [Sa, Dc * Sa + Sc * (1 - Da)]\n const tR = dr * sa + sr * invDa\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = dg * sa + sg * invDa\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = db * sa + sb * invDa\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n return ((sa << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const xorPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n const da = (dst >>> 24) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const invDa = 255 - da\n const invSa = 255 - sa\n\n // Result: [Sa * (1 - Da) + Da * (1 - Sa), Sc * (1 - Da) + Dc * (1 - Sa)]\n const tR = sr * invDa + dr * invSa\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = sg * invDa + dg * invSa\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = sb * invDa + db * invSa\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = sa * invDa + da * invSa\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const 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 da = (dst >>> 24) & 0xFF\n if (da === 0) return src\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 invA = 255 - sa\n // Exact division by 255 using bit-shifts\n // Formula: (v + 1 + (v >> 8)) >> 8\n const tR = (sr * sa + dr * invA)\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = (sg * sa + dg * invA)\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = (sb * sa + db * invA)\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = (255 * sa + da * invA)\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = sr < dr ? sr : dr\n const bg = sg < dg ? sg : dg\n const bb = sb < db ? sb : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (src * dst) / 255 */\nexport const multiplyPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const da = (dst >>> 24) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Calculate base multiply result: (sr * dr) / 255\n const mR = sr * dr\n const br = (mR + 1 + (mR >> 8)) >> 8\n\n const mG = sg * dg\n const bg = (mG + 1 + (mG >> 8)) >> 8\n\n const mB = sb * db\n const bb = (mB + 1 + (mB >> 8)) >> 8\n\n // If fully opaque, return with full alpha\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** 255 - (255-src)/dst */\nexport const colorBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Burn Core Math: 255 - ((255 - dst) * 255 / src)\n // We use | 0 to truncate the division result immediately.\n const resR = dr === 255 ? 255 : sr === 0 ? 0 : 255 - (((255 - dr) * 255 / sr) | 0)\n const br = resR < 0 ? 0 : resR\n\n const resG = dg === 255 ? 255 : sg === 0 ? 0 : 255 - (((255 - dg) * 255 / sg) | 0)\n const bg = resG < 0 ? 0 : resG\n\n const resB = db === 255 ? 255 : sb === 0 ? 0 : 255 - (((255 - db) * 255 / sb) | 0)\n const bb = resB < 0 ? 0 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst - 255 */\nexport const linearBurnPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Math: Base + Blend - 255 (clamped to 0)\n const brU = dr + sr - 255\n const br = brU < 0 ? 0 : brU\n const bgU = dg + sg - 255\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db + sb - 255\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const darkerPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // 1. Calculate Luminosity (Photoshop Weights: R:0.3, G:0.59, B:0.11)\n // Scaled by 256 for integer math: 77, 151, 28\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // 2. Selection Logic\n // Pick the perceptually darker pixel\n let br, bg, bb\n if (lumSrc < lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // 3. Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(src, dst) */\nexport const lightenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const br = (src & 0xFF) > dr ? (src & 0xFF) : dr\n const bg = ((src >>> 8) & 0xFF) > dg ? ((src >>> 8) & 0xFF) : dg\n const bb = ((src >>> 16) & 0xFF) > db ? ((src >>> 16) & 0xFF) : db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * 255 - ((255 - src) * (255 - dst))\n */\nexport const screenPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const br = 255 - (((255 - (src & 0xFF)) * (255 - dr) / 255) | 0)\n const bg = 255 - (((255 - ((src >>> 8) & 0xFF)) * (255 - dg) / 255) | 0)\n const bb = 255 - (((255 - ((src >>> 16) & 0xFF)) * (255 - db) / 255) | 0)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src === 255 ? 255 : Math.min(255, (dst << 8) / (255 - src)) */\nexport const colorDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n // Color Dodge Core Math: (dst * 255) / (255 - src)\n // We use ternary checks to handle the sr === 255 division-by-zero guard.\n const resR = sr === 255 ? 255 : (dr * 255 / (255 - sr)) | 0\n const br = resR > 255 ? 255 : resR\n\n const resG = sg === 255 ? 255 : (dg * 255 / (255 - sg)) | 0\n const bg = resG > 255 ? 255 : resG\n\n const resB = sb === 255 ? 255 : (db * 255 / (255 - sb)) | 0\n const bb = resB > 255 ? 255 : resB\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src + dst */\nexport const linearDodgePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n\n const brU = (src & 0xFF) + dr\n const br = brU > 255 ? 255 : brU\n const bgU = ((src >>> 8) & 0xFF) + dg\n const bg = bgU > 255 ? 255 : bgU\n const bbU = ((src >>> 16) & 0xFF) + db\n const bb = bbU > 255 ? 255 : bbU\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const lighterPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n // Calculate Luminosity (Photoshop uses Weights: R:0.3, G:0.59, B:0.11)\n // We use integer math (scaled by 256) for speed.\n const lumSrc = (sr * 77 + sg * 151 + sb * 28)\n const lumDst = (dr * 77 + dg * 151 + db * 28)\n\n // Selection Logic (Base result)\n let br, bg, bb\n if (lumSrc > lumDst) {\n br = sr\n bg = sg\n bb = sb\n } else {\n br = dr\n bg = dg\n bb = db\n }\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? (2 * src * dst) : (255 - 2 * (255 - src) * (255 - dst)) */\nexport const overlayPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const br = dr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = dg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = db < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** ((255 - dst) * ((src * dst) >> 8) + dst * (255 - (((255 - src) * (255 - dst)) >> 8))) >> 8 */\nexport const softLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const mR = (sr * dr)\n const scR = (255 - sr) * (255 - dr)\n const br = ((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8)) + 1 + (((255 - dr) * ((mR + 1 + (mR >> 8)) >> 8) + dr * (255 - ((scR + 1 + (scR >> 8)) >> 8))) >> 8)) >> 8\n\n const mG = (sg * dg)\n const scG = (255 - sg) * (255 - dg)\n const bg = ((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8)) + 1 + (((255 - dg) * ((mG + 1 + (mG >> 8)) >> 8) + dg * (255 - ((scG + 1 + (scG >> 8)) >> 8))) >> 8)) >> 8\n\n const mB = (sb * db)\n const scB = (255 - sb) * (255 - db)\n const bb = ((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8)) + 1 + (((255 - db) * ((mB + 1 + (mB >> 8)) >> 8) + db * (255 - ((scB + 1 + (scB >> 8)) >> 8))) >> 8)) >> 8\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** If src < 128 (50% gray), Multiply; otherwise, Screen */\nexport const hardLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (2 * sr * dr / 255) | 0 : 255 - ((2 * (255 - sr) * (255 - dr) / 255) | 0)\n const bg = sg < 128 ? (2 * sg * dg / 255) | 0 : 255 - ((2 * (255 - sg) * (255 - dg) / 255) | 0)\n const bb = sb < 128 ? (2 * sb * db / 255) | 0 : 255 - ((2 * (255 - sb) * (255 - db) / 255) | 0)\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/**\n * If src < 128: Burn(dst, 2 * src)\n * If src >= 128: Dodge(dst, 2 * (src - 128))\n */\nexport const vividLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))\n const bg = sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))\n const bb = sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + 2 * src - 255 (Clamped to 0-255) */\nexport const linearLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr + 2 * sr - 255\n const br = brU < 0 ? 0 : brU > 255 ? 255 : brU\n const bgU = dg + 2 * sg - 255\n const bg = bgU < 0 ? 0 : bgU > 255 ? 255 : bgU\n const bbU = db + 2 * sb - 255\n const bb = bbU < 0 ? 0 : bbU > 255 ? 255 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** src < 128 ? min(dst, 2 * src) : max(dst, 2 * (src - 128)) */\nexport const pinLightPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const br = sr < 128 ? (dr < (sr << 1) ? dr : (sr << 1)) : (dr > ((sr - 128) << 1) ? dr : ((sr - 128) << 1))\n const bg = sg < 128 ? (dg < (sg << 1) ? dg : (sg << 1)) : (dg > ((sg - 128) << 1) ? dg : ((sg - 128) << 1))\n const bb = sb < 128 ? (db < (sb << 1) ? db : (sb << 1)) : (db > ((sb - 128) << 1) ? db : ((sb - 128) << 1))\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** (Vivid Light logic forced to 0 or 255) */\nexport const hardMixPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = (sr < 128 ? (sr === 0 ? 0 : Math.max(0, (255 - (((255 - dr) * 255 / (2 * sr)) | 0)))) : (sr === 255 ? 255 : Math.min(255, ((dr * 255 / (2 * (255 - sr))) | 0)))) < 128 ? 0 : 255\n const bg = (sg < 128 ? (sg === 0 ? 0 : Math.max(0, (255 - (((255 - dg) * 255 / (2 * sg)) | 0)))) : (sg === 255 ? 255 : Math.min(255, ((dg * 255 / (2 * (255 - sg))) | 0)))) < 128 ? 0 : 255\n const bb = (sb < 128 ? (sb === 0 ? 0 : Math.max(0, (255 - (((255 - db) * 255 / (2 * sb)) | 0)))) : (sb === 255 ? 255 : Math.min(255, ((db * 255 / (2 * (255 - sb))) | 0)))) < 128 ? 0 : 255\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.abs(src - dst) */\nexport const differencePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n\n const br = dr > sr ? dr - sr : sr - dr\n const bg = dg > sg ? dg - sg : sg - dg\n const bb = db > sb ? db - sb : sb - db\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** dst + src - ((dst * src) >> 7) */\nexport const exclusionPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF\n const dg = (dst >>> 8) & 0xFF\n const db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF\n const sg = (src >>> 8) & 0xFF\n const sb = (src >>> 16) & 0xFF\n\n const r2 = dr * sr\n const br = dr + sr - (((r2 + r2) + 1 + ((r2 + r2) >> 8)) >> 8)\n\n const g2 = dg * sg\n const bg = dg + sg - (((g2 + g2) + 1 + ((g2 + g2) >> 8)) >> 8)\n\n const b2 = db * sb\n const bb = db + sb - (((b2 + b2) + 1 + ((b2 + b2) >> 8)) >> 8)\n\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** Math.max(0, dst - src) */\nexport const subtractPerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const brU = dr - sr\n const br = brU < 0 ? 0 : brU\n const bgU = dg - sg\n const bg = bgU < 0 ? 0 : bgU\n const bbU = db - sb\n const bb = bbU < 0 ? 0 : bbU\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\n/** sr === 0 ? 255 : Math.min(255, (dr << 8) / sr) */\nexport const dividePerfect: BlendColor32 = (src, dst) => {\n const sa = (src >>> 24) & 0xFF\n if (sa === 0) return dst\n\n const dr = dst & 0xFF, dg = (dst >>> 8) & 0xFF, db = (dst >>> 16) & 0xFF\n const sr = src & 0xFF, sg = (src >>> 8) & 0xFF, sb = (src >>> 16) & 0xFF\n const br = sr === 0 ? 255 : Math.min(255, ((dr * 255 / sr) | 0))\n const bg = sg === 0 ? 255 : Math.min(255, ((dg * 255 / sg) | 0))\n const bb = sb === 0 ? 255 : Math.min(255, ((db * 255 / sb) | 0))\n if (sa === 255) return (0xFF000000 | (bb << 16) | (bg << 8) | br) >>> 0 as Color32\n\n // Alpha Lerp inlined\n const invA = 255 - sa\n const da = (dst >>> 24) & 0xFF\n\n const tR = br * sa + dr * invA\n const r = (tR + 1 + (tR >> 8)) >> 8\n const tG = bg * sa + dg * invA\n const g = (tG + 1 + (tG >> 8)) >> 8\n const tB = bb * sa + db * invA\n const b = (tB + 1 + (tB >> 8)) >> 8\n const tA = 255 * sa + da * invA\n const a = (tA + 1 + (tA >> 8)) >> 8\n\n return ((a << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n\nexport const BASE_PERFECT_BLEND_MODE_FUNCTIONS: Record<number, BlendColor32> = {\n [BaseBlendMode.overwrite]: overwritePerfect,\n\n [BaseBlendMode.sourceIn]: sourceInPerfect,\n [BaseBlendMode.sourceOut]: sourceOutPerfect,\n [BaseBlendMode.sourceAtop]: sourceAtopPerfect,\n [BaseBlendMode.destinationOver]: destinationOverPerfect,\n [BaseBlendMode.destinationIn]: destinationInPerfect,\n [BaseBlendMode.destinationOut]: destinationOutPerfect,\n [BaseBlendMode.destinationAtop]: destinationAtopPerfect,\n [BaseBlendMode.xor]: xorPerfect,\n\n [BaseBlendMode.sourceOver]: sourceOverPerfect,\n [BaseBlendMode.darken]: darkenPerfect,\n [BaseBlendMode.multiply]: multiplyPerfect,\n [BaseBlendMode.colorBurn]: colorBurnPerfect,\n [BaseBlendMode.linearBurn]: linearBurnPerfect,\n [BaseBlendMode.darkerColor]: darkerPerfect,\n\n [BaseBlendMode.lighten]: lightenPerfect,\n [BaseBlendMode.screen]: screenPerfect,\n [BaseBlendMode.colorDodge]: colorDodgePerfect,\n [BaseBlendMode.linearDodge]: linearDodgePerfect,\n [BaseBlendMode.lighterColor]: lighterPerfect,\n\n [BaseBlendMode.overlay]: overlayPerfect,\n [BaseBlendMode.softLight]: softLightPerfect,\n [BaseBlendMode.hardLight]: hardLightPerfect,\n [BaseBlendMode.vividLight]: vividLightPerfect,\n [BaseBlendMode.linearLight]: linearLightPerfect,\n [BaseBlendMode.pinLight]: pinLightPerfect,\n [BaseBlendMode.hardMix]: hardMixPerfect,\n\n [BaseBlendMode.difference]: differencePerfect,\n [BaseBlendMode.exclusion]: exclusionPerfect,\n [BaseBlendMode.subtract]: subtractPerfect,\n [BaseBlendMode.divide]: dividePerfect,\n}\n\nexport function makePerfectBlendModeRegistry(name = 'perfect') {\n return makeBlendModeRegistry(BaseBlendMode, BASE_PERFECT_BLEND_MODE_FUNCTIONS, name)\n}\n","import { BaseBlendMode } from './blend-modes'\n\nexport function toBlendModeIndexAndName(input: string | number) {\n if (typeof input === 'number') {\n const name = getKeyByValue(BaseBlendMode, input)\n if (name === undefined) throw new Error(`Invalid index: ${input}`)\n return { blendIndex: input, blendName: name }\n }\n\n const trimmed = input.trim()\n const num = Number(trimmed)\n const isNumeric = trimmed !== '' && !Number.isNaN(num)\n\n if (isNumeric && Number.isInteger(num)) {\n const name = getKeyByValue(BaseBlendMode, num)\n if (name === undefined) throw new Error(`Invalid index: ${num}`)\n return { blendIndex: num, blendName: name }\n }\n\n if (trimmed in BaseBlendMode) {\n return {\n blendIndex: BaseBlendMode[trimmed as keyof typeof BaseBlendMode],\n blendName: trimmed as keyof typeof BaseBlendMode,\n }\n }\n\n throw new Error(`Invalid blend mode: ${JSON.stringify(input)}`)\n}\n\nconst getKeyByValue = (obj: any, value: any) => {\n for (const key in obj) {\n if (obj[key] === value) return key\n }\n}\n","import { BaseBlendMode } from '../BlendModes/blend-modes'\n\nexport const CANVAS_COMPOSITE_MAP = {\n [BaseBlendMode.overwrite]: 'copy',\n [BaseBlendMode.sourceOver]: 'source-over',\n [BaseBlendMode.darken]: 'darken',\n [BaseBlendMode.multiply]: 'multiply',\n [BaseBlendMode.colorBurn]: 'color-burn',\n [BaseBlendMode.lighten]: 'lighten',\n [BaseBlendMode.screen]: 'screen',\n [BaseBlendMode.colorDodge]: 'color-dodge',\n [BaseBlendMode.linearDodge]: 'lighter',\n [BaseBlendMode.overlay]: 'overlay',\n [BaseBlendMode.softLight]: 'soft-light',\n [BaseBlendMode.hardLight]: 'hard-light',\n [BaseBlendMode.difference]: 'difference',\n [BaseBlendMode.exclusion]: 'exclusion',\n} as const\n\nexport type CanvasBlendModeIndex = keyof typeof CANVAS_COMPOSITE_MAP\nexport type CanvasCompositeOperation = typeof CANVAS_COMPOSITE_MAP[CanvasBlendModeIndex]\n\n/**\n * example\n * function getCanvasCompositeOperation(mode: CanvasBlendModeIndex): CanvasCompositeOperation {\n * return CANVAS_COMPOSITE_MAP[mode]\n * }\n */\n","import { CANVAS_CTX_FAILED } from '../Internal/_errors'\nimport type { CanvasContext, CanvasObjectFactory, ReusableCanvas, ReusableCanvasFactory } from './_canvas-types'\n\n/**\n * Creates a reusable HTMLCanvasElement 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 return makeReusableCanvasMeta<HTMLCanvasElement>((w, h) => {\n const canvas = document.createElement('canvas')\n\n canvas.width = w\n canvas.height = h\n\n return canvas\n })\n}\n\n/**\n * Creates a reusable OffscreenCanvas and context.\n * Ensures it is always set to `context.imageSmoothingEnabled = false`\n * @see makePixelCanvas\n * @throws {Error} If the {@link OffscreenCanvasRenderingContext2D} context cannot be initialized.\n */\nexport function makeReusableOffscreenCanvas() {\n return makeReusableCanvasMeta<OffscreenCanvas>((w, h) => new OffscreenCanvas(w, h))\n}\n\nfunction makeReusableCanvasMeta<T extends HTMLCanvasElement | OffscreenCanvas>(\n factory: CanvasObjectFactory<T>,\n): ReusableCanvasFactory<T> {\n let canvas: T | null = null\n let ctx: CanvasContext<T> | null = null\n\n const result: ReusableCanvas<T> = {\n canvas: null as any,\n ctx: null as any,\n }\n\n function get(width: number, height: number): ReusableCanvas<T> {\n if (canvas === null) {\n canvas = factory(width, height)\n ctx = canvas.getContext('2d') as CanvasContext<T> | null\n\n if (!ctx) {\n throw new Error(CANVAS_CTX_FAILED)\n }\n\n // Initialize the fresh context state\n ctx.imageSmoothingEnabled = false\n\n ;(result as any).canvas = canvas\n ;(result as any).ctx = ctx\n\n // Early return to skip resize/clear checks for brand new canvases\n return result\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 }\n\n return result\n }\n\n get.reset = () => {\n canvas = null\n ctx = null\n\n ;(result as any).canvas = null\n ;(result as any).ctx = null\n }\n\n return get\n}\n","import type { DrawPixelLayer, DrawScreenLayer, PixelCanvas, ReusableCanvasFactory } from './_canvas-types'\nimport { makeReusableOffscreenCanvas } from './ReusableCanvas'\n\nexport type CanvasFrameRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas> =\n ReturnType<typeof makeCanvasFrameRenderer<T>>\n\nexport function makeCanvasFrameRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas>(\n reusableCanvasFactory: () => ReusableCanvasFactory<T> = makeReusableOffscreenCanvas as unknown as () => ReusableCanvasFactory<T>,\n) {\n const getBuffer = reusableCanvasFactory()\n\n return function renderCanvasFrame(\n pixelCanvas: PixelCanvas,\n scale: number,\n getImageData: () => ImageData | undefined | null,\n drawPixelLayer?: DrawPixelLayer<T>,\n drawScreenLayer?: DrawScreenLayer,\n ) {\n\n const canvas = pixelCanvas.canvas\n const ctx = pixelCanvas.ctx\n const w = canvas.width\n const h = canvas.height\n\n // 1. Clear pixel buffer\n const buffer = getBuffer(w, h)\n\n // 2. Draw pixel data into pixel buffer\n const img = getImageData()\n if (img) {\n buffer.ctx.putImageData(img, 0, 0)\n }\n\n // draw transient pixel data\n drawPixelLayer?.(buffer.ctx)\n\n // clear target canvas\n ctx.setTransform(1, 0, 0, 1, 0, 0)\n ctx.clearRect(0, 0, w, h)\n\n // Draw pixel buffer scaled onto screen\n ctx.setTransform(scale, 0, 0, scale, 0, 0)\n ctx.drawImage(buffer.canvas, 0, 0)\n\n // Draw overlays in screen space\n ctx.setTransform(1, 0, 0, 1, 0, 0)\n drawScreenLayer?.(ctx, scale)\n }\n}\n","import type { PixelData } from '../PixelData/_pixelData-types'\nimport type { ReusableCanvasFactory } from './_canvas-types'\nimport { makeReusableOffscreenCanvas } from './ReusableCanvas'\n\nexport type CanvasPixelDataRenderer = ReturnType<typeof makeCanvasPixelDataRenderer>\n\nexport function makeCanvasPixelDataRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas>(\n reusableCanvasFactory: () => ReusableCanvasFactory<T> = makeReusableOffscreenCanvas as unknown as () => ReusableCanvasFactory<T>,\n) {\n const bufferCanvas = reusableCanvasFactory()\n\n return function drawPixelData(\n targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n pixelData: PixelData,\n x = 0,\n y = 0,\n ): void {\n const buffer = bufferCanvas(pixelData.w, pixelData.h)\n\n buffer.ctx.putImageData(pixelData.imageData, 0, 0)\n targetCtx.drawImage(buffer.canvas, x, y)\n }\n}\n","import { CANVAS_CTX_FAILED } from '../Internal/_errors'\nimport type { PixelCanvas } from './_canvas-types'\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","/**\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 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 { Color32 } from './_color-types'\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 */\nexport 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","// Convert 0xAABBGGRR to #RRGGBBAA\nimport type { Color32, CssRGBA } from './_color-types'\n\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 color32ToCssRGBAString(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\nexport function color32ToCssRGBA(color: Color32): CssRGBA {\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 return {\n r,\n g,\n b,\n a: a / 255,\n } as CssRGBA\n}\n\nexport function cssRGBAToColor32({ r, g, b, a }: CssRGBA): Color32 {\n return (((a * 255) << 24) | (b << 16) | (g << 8) | r) >>> 0 as Color32\n}\n","import type { Color32, RGBA } from './_color-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","export type BatchedQueueFn = (fn: () => void) => void\n\nexport type BatchedQueue = ReturnType<typeof makeBatchedQueue>\n\n/**\n * Creates a high-performance, zero-allocation batching queue.\n * This utility collects items marked as \"dirty\" and flushes them in a single batch.\n * * **⚠️ CRITICAL: Synchronous Processing Required**\n * Because the internal sets are reused, the `Set` passed to the `processor` is instantly\n * cleared the moment the processor function returns. If you need to process the items\n * asynchronously, you **must** manually clone the set inside your processor.\n * @template T - The type of items being batched.\n * @param processor - The callback executed when the batch flushes. Receives a `Set` of all batched items.\n * @param queue - The scheduling function used to defer the flush. Defaults to `queueMicrotask`.\n * @returns An object containing methods to mark items as dirty.\n * @example\n * * @example\n * ```ts\n * import { nextTick } from 'vue'\n * let bq = makeBatchedQueue<string>(\n * (items) => drawSomething(items),\n * nextTick,\n * )\n * ```\n */\nexport function makeBatchedQueue<T>(\n processor: (items: Set<T>) => void,\n queue: BatchedQueueFn,\n) {\n let activeSet = new Set<T>()\n let processingSet = new Set<T>()\n let scheduled = false\n\n const flush = () => {\n // swap sets\n const current = activeSet\n activeSet = processingSet\n processingSet = current\n\n scheduled = false\n\n try {\n processor(processingSet)\n } finally {\n processingSet.clear()\n }\n }\n\n function markDirty(item: T) {\n activeSet.add(item)\n\n if (!scheduled) {\n scheduled = true\n queue(flush)\n }\n }\n\n function markMultipleDirty(items: T[]) {\n let len = items.length\n if (len === 0) return\n\n for (let i = 0; i < len; i++) {\n activeSet.add(items[i])\n }\n\n if (!scheduled) {\n scheduled = true\n queue(flush)\n }\n }\n\n return {\n markDirty,\n markMultipleDirty,\n }\n}\n","/**\n * Creates a debounced render queue using `requestAnimationFrame`.\n * This utility ensures that a callback is executed exactly once right before\n * the next visual frame, regardless of how many times the trigger is called\n * synchronously. It safely prevents layout thrashing and redundant computations.\n * @param cb - The function to execute on the next animation frame.\n * @returns A trigger function that schedules the callback. It includes a `.cancel()` method to abort the pending frame.\n * * @example\n * ```ts\n * let renderQueue = makeRenderQueue(() => {\n * console.log('DOM updated!')\n * })\n * * // Calling this multiple times synchronously...\n * renderQueue()\n * renderQueue()\n * renderQueue()\n * * // ...will only result in one 'DOM updated!' log on the next frame.\n * ```\n * * @example\n * ```ts\n * // Canceling a scheduled render (e.g., when a component unmounts)\n * let trigger = makeRenderQueue(updateLayout)\n * trigger()\n * trigger.cancel() // The callback will not execute\n * ```\n */\nexport function makeRenderQueue(cb: () => void) {\n let needsRender = false\n let frameId = 0\n\n const trigger = () => {\n if (needsRender) return\n needsRender = true\n\n frameId = requestAnimationFrame(() => {\n needsRender = false\n cb()\n })\n }\n\n trigger.cancel = () => {\n if (needsRender) {\n cancelAnimationFrame(frameId)\n needsRender = false\n }\n }\n\n return trigger\n}\n","import type { PixelData32 } from '../PixelData/_pixelData-types'\nimport type { PixelTile } from '../Tile/_tile-types'\n\nexport type PixelPatchTiles = {\n beforeTiles: PixelTile[]\n afterTiles: PixelTile[]\n}\n\nexport function applyPatchTiles(target: PixelData32, tiles: PixelTile[], tileSize: number) {\n for (let i = 0; i < tiles.length; i++) {\n const tile = tiles[i]\n\n if (!tile) continue\n\n const dst = target.data\n const src = tile.data\n const dstWidth = target.w\n const dstHeight = target.h\n const startX = tile.tx * tileSize\n const startY = tile.ty * tileSize\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX))\n\n if (copyWidth <= 0) continue\n\n for (let ly = 0; ly < tileSize; ly++) {\n const globalY = startY + ly\n\n // Stop if we go below the image\n if (globalY >= dstHeight) break\n\n const dstIndex = globalY * dstWidth + startX\n const srcIndex = ly * tileSize\n const rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n dst.set(rowData, dstIndex)\n }\n }\n}\n","import type { TileTargetConfig } from '../Tile/_tile-types'\nimport type { PixelAccumulator } from './PixelAccumulator'\nimport { applyPatchTiles, type PixelPatchTiles } from './PixelPatchTiles'\n\nexport interface HistoryAction {\n undo: () => void\n redo: () => void\n dispose?: () => void\n}\n\nexport type HistoryActionFactory = typeof makeHistoryAction\n\nexport function makeHistoryAction(\n config: TileTargetConfig,\n accumulator: PixelAccumulator,\n patch: PixelPatchTiles,\n afterUndo?: (patch: PixelPatchTiles) => void,\n afterRedo?: (patch: PixelPatchTiles) => void,\n applyPatchTilesFn = applyPatchTiles,\n): HistoryAction {\n\n const target = config.target\n const tileSize = config.tileSize\n\n return {\n undo: () => {\n applyPatchTilesFn(target, patch.beforeTiles, tileSize)\n afterUndo?.(patch)\n },\n redo: () => {\n applyPatchTilesFn(target, patch.afterTiles, tileSize)\n afterRedo?.(patch)\n },\n dispose: () => accumulator.recyclePatch(patch),\n }\n}\n","import type { HistoryAction } from './HistoryAction'\n\nexport class HistoryManager {\n readonly undoStack: HistoryAction[]\n readonly redoStack: HistoryAction[]\n readonly listeners: Set<() => void>\n\n constructor(\n public maxSteps = 50,\n ) {\n this.undoStack = []\n this.redoStack = []\n this.listeners = new Set()\n }\n\n get canUndo() {\n return this.undoStack.length > 0\n }\n\n get canRedo() {\n return this.redoStack.length > 0\n }\n\n subscribe(fn: () => void) {\n this.listeners.add(fn)\n return () => this.listeners.delete(fn)\n }\n\n notify() {\n this.listeners.forEach((fn) => fn())\n }\n\n commit(action: HistoryAction) {\n this.undoStack.push(action)\n this.clearRedoStack()\n\n if (this.undoStack.length > this.maxSteps) {\n this.undoStack.shift()?.dispose?.()\n }\n\n this.notify()\n }\n\n undo() {\n let action = this.undoStack.pop()\n\n if (!action) return\n\n this.redoStack.push(action)\n action.undo()\n\n this.notify()\n }\n\n redo() {\n let action = this.redoStack.pop()\n\n if (!action) return\n\n this.undoStack.push(action)\n action.redo()\n\n this.notify()\n }\n\n clearRedoStack() {\n let length = this.redoStack.length\n\n for (let i = 0; i < length; i++) {\n let action = this.redoStack[i]\n\n if (action) {\n action.dispose?.()\n }\n }\n\n this.redoStack.length = 0\n }\n}\n","import type { PixelTile, TileTargetConfig } from '../Tile/_tile-types'\nimport type { TilePool } from '../Tile/TilePool'\nimport { applyPatchTiles, type PixelPatchTiles } from './PixelPatchTiles'\n\nexport type DidChangeFn = (didChange: boolean) => boolean\n\nexport class PixelAccumulator {\n public lookup: (PixelTile | undefined)[]\n public beforeTiles: PixelTile[]\n\n constructor(\n readonly config: TileTargetConfig,\n readonly pixelTilePool: TilePool<PixelTile>,\n ) {\n this.lookup = []\n this.beforeTiles = []\n }\n\n recyclePatch(patch: PixelPatchTiles) {\n this.pixelTilePool.releaseTiles(patch.beforeTiles)\n this.pixelTilePool.releaseTiles(patch.afterTiles)\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n */\n storePixelBeforeState(x: number, y: number): DidChangeFn | null {\n const columns = this.config.targetColumns\n const targetWidth = this.config.targetWidth\n const targetHeight = this.config.targetHeight\n\n // Return a no-op if the pixel is outside the target boundaries\n if (x < 0 || x >= targetWidth || y < 0 || y >= targetHeight) {\n return null\n }\n\n const tx = (x * this.config.invTileSize) | 0\n const ty = (y * this.config.invTileSize) | 0\n const id = ty * columns + tx\n\n let tile = this.lookup[id]\n let added = false\n\n if (!tile) {\n tile = this.pixelTilePool.getTile(id, tx, ty)\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n added = true\n }\n\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop()\n this.lookup[id] = undefined\n this.pixelTilePool.releaseTile(tile!)\n }\n return didChange\n }\n }\n\n /**\n * @param x pixel x coordinate\n * @param y pixel y coordinate\n * @param w pixel width\n * @param h pixel height\n */\n storeRegionBeforeState(\n x: number,\n y: number,\n w: number,\n h: number,\n ): DidChangeFn | null {\n const columns = this.config.targetColumns\n const targetWidth = this.config.targetWidth\n const targetHeight = this.config.targetHeight\n const invTileSize = this.config.invTileSize\n\n // Clamp the bounding box to the actual canvas dimensions\n const clipX1 = Math.max(0, x)\n const clipY1 = Math.max(0, y)\n const clipX2 = Math.min(targetWidth - 1, x + w - 1)\n const clipY2 = Math.min(targetHeight - 1, y + h - 1)\n\n // If the region is entirely off-canvas, return a no-op\n if (clipX2 < clipX1 || clipY2 < clipY1) {\n return null\n }\n\n const startX = (clipX1 * invTileSize) | 0\n const startY = (clipY1 * invTileSize) | 0\n const endX = (clipX2 * invTileSize) | 0\n const endY = (clipY2 * invTileSize) | 0\n\n const startIndex = this.beforeTiles.length\n\n for (let ty = startY; ty <= endY; ty++) {\n for (let tx = startX; tx <= endX; tx++) {\n const id = ty * columns + tx\n let tile = this.lookup[id]\n\n if (!tile) {\n tile = this.pixelTilePool.getTile(id, tx, ty)\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n }\n }\n }\n\n return (didChange: boolean) => {\n if (!didChange) {\n const length = this.beforeTiles.length\n\n for (let i = startIndex; i < length; i++) {\n let t = this.beforeTiles[i]\n\n if (t) {\n this.lookup[t.id] = undefined\n this.pixelTilePool.releaseTile(t)\n }\n }\n\n this.beforeTiles.length = startIndex\n }\n return didChange\n }\n }\n\n storeTileBeforeState(id: number, tx: number, ty: number): DidChangeFn {\n let tile = this.lookup[id]\n let added = false\n\n if (!tile) {\n tile = this.pixelTilePool.getTile(id, tx, ty)\n\n this.extractState(tile)\n this.lookup[id] = tile\n this.beforeTiles.push(tile)\n added = true\n }\n\n return (didChange: boolean) => {\n if (!didChange && added) {\n this.beforeTiles.pop()\n this.lookup[id] = undefined\n this.pixelTilePool.releaseTile(tile!)\n }\n return didChange\n }\n }\n\n extractState(tile: PixelTile) {\n const target = this.config.target\n const TILE_SIZE = this.config.tileSize\n const dst = tile.data\n const src = target.data\n const startX = tile.tx * TILE_SIZE\n const startY = tile.ty * TILE_SIZE\n const targetWidth = target.w\n const targetHeight = target.h\n\n // If the tile is completely outside the canvas, zero it out.\n if (startX >= targetWidth || startX + TILE_SIZE <= 0 || startY >= targetHeight || startY + TILE_SIZE <= 0) {\n dst.fill(0)\n return\n }\n\n // Calculate offset if tile starts off the left side of the screen\n let srcOffsetX = Math.max(0, -startX)\n let copyWidth = Math.max(0, Math.min(TILE_SIZE - srcOffsetX, targetWidth - Math.max(0, startX)))\n\n for (let ly = 0; ly < TILE_SIZE; ly++) {\n let globalY = startY + ly\n let dstIndex = ly * TILE_SIZE\n\n // Check negative bounds accurately\n if (globalY < 0 || globalY >= targetHeight || copyWidth === 0) {\n dst.fill(0, dstIndex, dstIndex + TILE_SIZE)\n continue\n }\n\n let srcIndex = globalY * targetWidth + Math.max(0, startX)\n let rowData = src.subarray(srcIndex, srcIndex + copyWidth)\n\n // Shift the paste over by the offset\n dst.set(rowData, dstIndex + srcOffsetX)\n\n // Pad the left edge with 0s if we hung off the left side\n if (srcOffsetX > 0) {\n dst.fill(0, dstIndex, dstIndex + srcOffsetX)\n }\n\n // Pad the right edge with 0s if we hung off the right side\n if (srcOffsetX + copyWidth < TILE_SIZE) {\n dst.fill(0, dstIndex + srcOffsetX + copyWidth, dstIndex + TILE_SIZE)\n }\n }\n }\n\n extractPatch(): PixelPatchTiles {\n const afterTiles: PixelTile[] = []\n const length = this.beforeTiles.length\n\n for (let i = 0; i < length; i++) {\n let beforeTile = this.beforeTiles[i]\n\n if (beforeTile) {\n let afterTile = this.pixelTilePool.getTile(beforeTile.id, beforeTile.tx, beforeTile.ty)\n\n this.extractState(afterTile)\n afterTiles.push(afterTile)\n }\n }\n\n const beforeTiles = this.beforeTiles\n this.beforeTiles = []\n this.lookup.length = 0\n\n return {\n beforeTiles,\n afterTiles,\n }\n }\n\n rollbackAfterError() {\n const target = this.config.target\n const tileSize = this.config.tileSize\n const length = this.beforeTiles.length\n\n applyPatchTiles(target, this.beforeTiles, tileSize)\n\n for (let i = 0; i < length; i++) {\n let tile = this.beforeTiles[i]\n\n if (tile) {\n this.lookup[tile.id] = undefined\n this.pixelTilePool.releaseTile(tile)\n }\n }\n\n this.beforeTiles.length = 0\n this.lookup.length = 0\n }\n}\n","import { type ApplyMaskToPixelDataOptions } from '../_types'\nimport type { AlphaMask } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyAlphaMaskToPixelData(\n target: PixelData32,\n mask: AlphaMask,\n opts?: ApplyMaskToPixelDataOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const width = opts?.w ?? target.w\n const height = opts?.h ?? target.h\n const globalAlpha = opts?.alpha ?? 255\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const invertMask = opts?.invertMask ?? false\n\n if (globalAlpha === 0) return false\n\n // 1. Initial Destination Clipping\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\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 w = Math.min(w, target.w - x)\n h = Math.min(h, target.h - y)\n\n if (w <= 0) return false\n if (h <= 0) return false\n\n // 2. Determine Source Dimensions\n const mPitch = mask.w\n if (mPitch <= 0) return false\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX)\n const startY = my + (y - targetY)\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX)\n const sY0 = Math.max(0, startY)\n const sX1 = Math.min(mPitch, startX + w)\n const sY1 = Math.min(mask.h, startY + h)\n\n const finalW = sX1 - sX0\n const finalH = sY1 - sY0\n\n // This is where your failing tests are now caught\n if (finalW <= 0) return false\n if (finalH <= 0) return false\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX\n const yShift = sY0 - startY\n\n const dst32 = target.data\n const dw = target.w\n const dStride = dw - finalW\n const mStride = mPitch - finalW\n const maskData = mask.data\n\n let dIdx = (y + yShift) * dw + (x + xShift)\n let mIdx = sY0 * mPitch + sX0\n\n let didChange = false\n if (invertMask) {\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const effectiveM = 255 - maskData[mIdx]\n\n if (effectiveM === 0) {\n const current = dst32[dIdx]\n const next = (current & 0x00ffffff) >>> 0\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n } else {\n const t1 = effectiveM * globalAlpha + 128\n const weight = (t1 + (t1 >> 8)) >> 8\n\n if (weight < 255) {\n const current = dst32[dIdx]\n const da = current >>> 24\n\n if (da !== 0) {\n const t2 = da * weight + 128\n const finalAlpha = (t2 + (t2 >> 8)) >> 8\n const next = ((current & 0x00ffffff) | (finalAlpha << 24)) >>> 0\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n }\n }\n }\n\n dIdx++\n mIdx++\n }\n dIdx += dStride\n mIdx += mStride\n }\n } else {\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const effectiveM = maskData[mIdx]\n\n if (effectiveM === 0) {\n const current = dst32[dIdx]\n const next = (current & 0x00ffffff) >>> 0\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n } else {\n const t1 = effectiveM * globalAlpha + 128\n const weight = (t1 + (t1 >> 8)) >> 8\n\n if (weight < 255) {\n const current = dst32[dIdx]\n const da = current >>> 24\n\n if (da !== 0) {\n const t2 = da * weight + 128\n const finalAlpha = (t2 + (t2 >> 8)) >> 8\n const next = ((current & 0x00ffffff) | (finalAlpha << 24)) >>> 0\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n }\n }\n }\n\n dIdx++\n mIdx++\n }\n dIdx += dStride\n mIdx += mStride\n }\n }\n return didChange\n}\n","import type { ImageDataLike } from './_ImageData-types'\n\n/**\n * Non destructively resizes the {@link ImageData} buffer to new dimensions, optionally\n * offsetting the original content.\n * This operation creates a new buffer. It does not scale or stretch pixels;\n * instead, it crops or pads the image based on the new dimensions and\n * provides an offset for repositioning.\n *\n * @param target The target 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 * @param offsetY The vertical offset for placing the\n * original image within the new buffer.\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 target: ImageDataLike,\n newWidth: number,\n newHeight: number,\n offsetX = 0,\n offsetY = 0,\n): ImageData {\n const result = new ImageData(newWidth, newHeight)\n const {\n width: oldW,\n height: oldH,\n data: oldData,\n } = target\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 { ImageDataLike } from '../ImageData/_ImageData-types'\nimport { _macro_imageDataToUint32Array } from '../ImageData/imageDataToUint32Array'\nimport type { PixelData } from './_pixelData-types'\n\nexport function makePixelData<T extends ImageDataLike = ImageData>(imageData: T): PixelData<T> {\n return {\n data: _macro_imageDataToUint32Array(imageData),\n imageData,\n w: imageData.width,\n h: imageData.height,\n }\n}\n\nexport function setPixelData(target: PixelData, imageData: ImageData) {\n ;(target as any).data = _macro_imageDataToUint32Array(imageData)\n ;(target as any).imageData = imageData\n ;(target as any).w = imageData.width\n ;(target as any).h = imageData.height\n}\n","import type { AlphaMask, BinaryMask } from '../Mask/_mask-types'\nimport type { PixelData } from '../PixelData/_pixelData-types'\n\nexport const enum TileType {\n PIXEL,\n MASK,\n}\n\ninterface BaseTile {\n tileType: TileType,\n id: number\n tx: number\n ty: number\n x: number\n y: number\n}\n\nexport interface PixelTile extends PixelData, BaseTile {\n}\n\nexport interface AlphaMaskTile extends AlphaMask, BaseTile {\n}\n\nexport interface BinaryMaskTile extends BinaryMask, BaseTile {\n}\n\nexport type Tile = PixelTile | AlphaMaskTile | BinaryMaskTile\n\nexport type TileFactory<T extends Tile> = (\n id: number,\n tx: number,\n ty: number,\n tileSize: number,\n tileArea: number,\n) => T\n\nexport interface TileTargetMeta {\n readonly tileArea: number\n readonly targetColumns: number\n readonly targetRows: number\n readonly targetWidth: number\n readonly targetHeight: number\n readonly tileSize: number\n readonly invTileSize: number\n}\n\nexport interface TileTargetConfig extends TileTargetMeta {\n readonly target: PixelData\n}\n","import { type PixelTile, TileType } from './_tile-types'\n\nexport function makePixelTile(\n id: number,\n tx: number,\n ty: number,\n tileSize: number,\n tileArea: number,\n): PixelTile {\n const data32 = new Uint32Array(tileArea)\n const data8 = new Uint8ClampedArray(data32.buffer) as Uint8ClampedArray<ArrayBuffer>\n\n return {\n tileType: TileType.PIXEL,\n id,\n tx,\n ty,\n x: tx * tileSize,\n y: ty * tileSize,\n w: tileSize,\n h: tileSize,\n data: data32,\n imageData: new ImageData(data8, tileSize, tileSize),\n }\n}\n","import type { Tile, TileFactory } from './_tile-types'\n\nexport class TilePool<T extends Tile> {\n public pool: T[]\n\n protected tileArea: number\n\n constructor(\n protected tileSize: number,\n protected tileFactory: TileFactory<T>,\n ) {\n this.pool = []\n this.tileSize = tileSize\n this.tileArea = tileSize * tileSize\n }\n\n getTile(\n id: number,\n tx: number,\n ty: number,\n ): T {\n let tile = this.pool.pop()\n const tileSize = this.tileSize\n\n if (tile) {\n tile.id = id\n tile.tx = tx\n tile.ty = ty\n tile.x = tx * tileSize\n tile.y = ty * tileSize\n\n // Wipe dirty memory from previous uses before handing it out\n tile.data.fill(0)\n\n return tile\n }\n\n return this.tileFactory(\n id,\n tx,\n ty,\n tileSize,\n this.tileArea,\n )\n }\n\n releaseTile(tile: T): void {\n this.pool.push(tile)\n }\n\n releaseTiles(tiles: (T | undefined)[]): void {\n let length = tiles.length\n\n for (let i = 0; i < length; i++) {\n let tile = tiles[i]\n\n if (tile) {\n this.pool.push(tile)\n }\n }\n\n tiles.length = 0\n }\n}\n","import type { PixelData } from '../PixelData/_pixelData-types'\nimport type { TileTargetConfig, TileTargetMeta } from './_tile-types'\n\nexport function makeTileTargetConfig(\n tileSize: number,\n target: PixelData,\n): TileTargetConfig {\n return {\n target,\n ...makeTileTargetMeta(tileSize, target),\n }\n}\n\nexport function makeTileTargetMeta(\n tileSize: number,\n target: { w: number, h: number },\n): TileTargetMeta {\n return {\n targetWidth: target.w,\n targetHeight: target.h,\n tileSize: tileSize,\n invTileSize: 1 / tileSize,\n tileArea: tileSize * tileSize,\n targetColumns: Math.ceil(target.w / tileSize),\n targetRows: Math.ceil(target.h / tileSize),\n }\n}\n","import { resizeImageData } from '../ImageData/resizeImageData'\nimport type { PixelData } from '../PixelData/_pixelData-types'\nimport { setPixelData } from '../PixelData/PixelData'\nimport type { PixelTile, TileTargetConfig } from '../Tile/_tile-types'\nimport { makePixelTile } from '../Tile/PixelTile'\nimport { TilePool } from '../Tile/TilePool'\nimport { makeTileTargetConfig } from '../Tile/TileTargetConfig'\nimport { type HistoryActionFactory, makeHistoryAction } from './HistoryAction'\nimport { HistoryManager } from './HistoryManager'\nimport { PixelAccumulator } from './PixelAccumulator'\nimport type { PixelPatchTiles } from './PixelPatchTiles'\n\nexport interface PixelWriterOptions {\n maxHistorySteps?: number\n tileSize?: number\n historyManager?: HistoryManager\n historyActionFactory?: HistoryActionFactory\n pixelTilePool?: TilePool<PixelTile>,\n accumulator?: PixelAccumulator\n}\n\n/**\n * @example\n * const targ = new PixelData(new ImageData(10, 10))\n * const writer = new PixelWriter(targ, (writer) => {\n * return {\n * ...mutatorApplyMask(writer),\n * ...mutatorBlendPixelData(writer),\n * ...mutatorBlendColor(writer),\n * ...mutatorBlendPixel(writer),\n * ...mutatorFill(writer),\n * }\n * })\n *\n * // to import all mutator functions\n * const writer = new PixelWriter(targ, makeFullPixelMutator)\n *\n * writer.withHistory((mutator) => {\n * mutator.applyMask()\n * mutator.blendPixelData()\n * })\n */\nexport class PixelWriter<M> {\n readonly historyManager: HistoryManager\n readonly accumulator: PixelAccumulator\n readonly historyActionFactory: HistoryActionFactory\n readonly config: TileTargetConfig\n readonly pixelTilePool: TilePool<PixelTile>\n readonly mutator: M\n\n private _inProgress = false\n\n constructor(target: PixelData, mutatorFactory: (writer: PixelWriter<any>) => M, options?: PixelWriterOptions) {\n const tileSize = options?.tileSize ?? 256\n const maxHistorySteps = options?.maxHistorySteps ?? 50\n\n this.config = makeTileTargetConfig(tileSize, target)\n this.historyManager = options?.historyManager ?? new HistoryManager(maxHistorySteps)\n this.historyActionFactory = options?.historyActionFactory ?? makeHistoryAction\n this.pixelTilePool = options?.pixelTilePool ?? new TilePool(this.config.tileSize, makePixelTile)\n this.accumulator = options?.accumulator ?? new PixelAccumulator(this.config, this.pixelTilePool)\n this.mutator = mutatorFactory(this)\n }\n\n /**\n * Executes `transaction` and commits the resulting pixel changes as a single\n * undoable history action.\n *\n * - If `transaction` throws, all accumulated changes are rolled back and the error\n * is re-thrown. No action is committed.\n * - If `transaction` completes without modifying any pixels, no action is committed.\n * - `withHistory` is not re-entrant. Calling it again from inside `transaction` will\n * throw immediately to prevent silent data loss from a nested extractPatch.\n *\n * @param transaction Callback to be executed inside the transaction.\n * @param afterUndo Called after undo only.\n * @param afterRedo Called after redo only.\n */\n withHistory(\n transaction: (mutator: M) => void,\n afterUndo?: (patch: PixelPatchTiles) => void,\n afterRedo?: (patch: PixelPatchTiles) => void,\n ): void {\n if (this._inProgress) {\n throw new Error('withHistory is not re-entrant — commit or rollback the current operation first')\n }\n\n this._inProgress = true\n\n try {\n transaction(this.mutator)\n } catch (e) {\n this.accumulator.rollbackAfterError()\n throw e\n } finally {\n this._inProgress = false\n }\n\n if (this.accumulator.beforeTiles.length === 0) return\n\n const patch = this.accumulator.extractPatch()\n const action = this.historyActionFactory(this.config, this.accumulator, patch, afterUndo, afterRedo)\n\n this.historyManager.commit(action)\n }\n\n resize(\n newWidth: number,\n newHeight: number,\n offsetX = 0,\n offsetY = 0,\n afterUndo?: (target: ImageData) => void,\n afterRedo?: (target: ImageData) => void,\n resizeImageDataFn = resizeImageData,\n ): void {\n if (this._inProgress) {\n throw new Error('Cannot resize inside a withHistory callback')\n }\n\n if (this.accumulator.beforeTiles.length > 0) {\n throw new Error('Cannot resize with an open accumulator — commit or rollback first')\n }\n\n const config = this.config\n const target = config.target\n const beforeImageData = target.imageData\n const afterImageData = resizeImageDataFn(beforeImageData, newWidth, newHeight, offsetX, offsetY)\n\n setPixelData(target, afterImageData)\n\n this.historyManager.commit({\n undo: () => {\n setPixelData(target, beforeImageData)\n afterUndo?.(beforeImageData)\n },\n redo: () => {\n setPixelData(target, afterImageData)\n afterRedo?.(afterImageData)\n },\n })\n }\n}\n\nexport type HistoryMutator<T extends {}, D extends {}> = (writer: PixelWriter<any>, deps?: Partial<D>) => T\n\n","import { type ApplyMaskToPixelDataOptions } from '../../_types'\nimport type { AlphaMask } from '../../Mask/_mask-types'\nimport { applyAlphaMaskToPixelData } from '../../PixelData/applyAlphaMaskToPixelData'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = {\n applyAlphaMaskToPixelData,\n}\n\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyAlphaMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyAlphaMaskToPixelData = defaults.applyAlphaMaskToPixelData,\n } = deps\n\n return {\n applyAlphaMask(mask: AlphaMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const target = writer.config.target\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? target.w\n const h = opts?.h ?? target.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n return didChange(applyAlphaMaskToPixelData(target, mask, opts))\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import { type ApplyMaskToPixelDataOptions } from '../_types'\nimport type { BinaryMask } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyBinaryMaskToPixelData(\n target: PixelData32,\n mask: BinaryMask,\n opts?: ApplyMaskToPixelDataOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const width = opts?.w ?? target.w\n const height = opts?.h ?? target.h\n const globalAlpha = opts?.alpha ?? 255\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const invertMask = opts?.invertMask ?? false\n\n if (globalAlpha === 0) return false\n\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\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 w = Math.min(w, target.w - x)\n h = Math.min(h, target.h - y)\n\n if (w <= 0 || h <= 0) return false\n\n const mPitch = mask.w\n if (mPitch <= 0) return false\n\n // 3. Source Bounds Clipping\n // Calculate where we would start reading in the mask\n const startX = mx + (x - targetX)\n const startY = my + (y - targetY)\n\n // Find the safe overlap between the requested region and the mask bounds\n const sX0 = Math.max(0, startX)\n const sY0 = Math.max(0, startY)\n const sX1 = Math.min(mPitch, startX + w)\n const sY1 = Math.min(mask.h, startY + h)\n\n const finalW = sX1 - sX0\n const finalH = sY1 - sY0\n\n if (finalW <= 0 || finalH <= 0) {\n return false\n }\n\n // 4. Align Destination with Source Clipping\n // If the source was clipped on the top/left, we must shift the destination start\n const xShift = sX0 - startX\n const yShift = sY0 - startY\n\n const dst32 = target.data\n const dw = target.w\n const dStride = dw - finalW\n const mStride = mPitch - finalW\n const maskData = mask.data\n\n let dIdx = (y + yShift) * dw + (x + xShift)\n let mIdx = sY0 * mPitch + sX0\n let didChange = false\n\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = maskData[mIdx]\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0\n\n if (isMaskedOut) {\n const current = dst32[dIdx]\n const next = (current & 0x00ffffff) >>> 0\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n } else if (globalAlpha !== 255) {\n const d = dst32[dIdx]\n const da = d >>> 24\n\n if (da !== 0) {\n const finalAlpha = da === 255 ? globalAlpha : (da * globalAlpha + 128) >> 8\n const next = ((d & 0x00ffffff) | (finalAlpha << 24)) >>> 0\n if (d !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n }\n }\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n\n return didChange\n}\n","import { type ApplyMaskToPixelDataOptions } from '../../_types'\nimport type { BinaryMask } from '../../Mask/_mask-types'\nimport { applyBinaryMaskToPixelData } from '../../PixelData/applyBinaryMaskToPixelData'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = {\n applyBinaryMaskToPixelData,\n}\n\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyBinaryMaskToPixelData = defaults.applyBinaryMaskToPixelData,\n } = deps\n\n return {\n applyBinaryMask(mask: BinaryMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const target = writer.config.target\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? target.w\n const h = opts?.h ?? target.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n const b = applyBinaryMaskToPixelData(target, mask, opts)\n console.log({ b })\n return didChange(b)\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import { type ApplyMaskToPixelDataOptions } from '../../_types'\nimport { type Mask, MaskType } from '../../Mask/_mask-types'\nimport { applyAlphaMaskToPixelData } from '../../PixelData/applyAlphaMaskToPixelData'\nimport { applyBinaryMaskToPixelData } from '../../PixelData/applyBinaryMaskToPixelData'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = {\n applyBinaryMaskToPixelData,\n applyAlphaMaskToPixelData,\n}\n\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorApplyMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n applyBinaryMaskToPixelData = defaults.applyBinaryMaskToPixelData,\n applyAlphaMaskToPixelData = defaults.applyAlphaMaskToPixelData,\n } = deps\n\n return {\n applyMask(mask: Mask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const target = writer.config.target\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? target.w\n const h = opts?.h ?? target.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n if (mask.type === MaskType.BINARY) {\n return didChange(applyBinaryMaskToPixelData(target, mask, opts))\n } else {\n return didChange(applyAlphaMaskToPixelData(target, mask, opts))\n }\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import { type PixelBlendMaskOptions } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { AlphaMask } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\n\nexport function blendPixelDataAlphaMask(\n target: PixelData32,\n src: PixelData32,\n alphaMask: AlphaMask,\n opts?: PixelBlendMaskOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const sourceX = opts?.sx ?? 0\n const sourceY = opts?.sy ?? 0\n const width = opts?.w ?? src.w\n const height = opts?.h ?? src.h\n const globalAlpha = opts?.alpha ?? 255\n const blendFn = opts?.blendFn ?? sourceOverPerfect\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const invertMask = opts?.invertMask ?? false\n\n if (globalAlpha === 0) return false\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. Clipping (Matches main branch behavior)\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.w - sx)\n h = Math.min(h, src.h - sy)\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, target.w - x)\n const actualH = Math.min(h, target.h - y)\n if (actualW <= 0 || actualH <= 0) return false\n\n // 2. Index Setup\n const dw = target.w\n const sw = src.w\n const mPitch = alphaMask.w\n const maskData = alphaMask.data\n\n // dx/dy is the displacement from requested start to clipped start.\n // This keeps the mask locked to the source content during cross-clipping.\n const dx = (x - targetX) | 0\n const dy = (y - targetY) | 0\n\n const dst32 = target.data\n const src32 = src.data\n\n let dIdx = (y * dw + x) | 0\n let sIdx = (sy * sw + sx) | 0\n let mIdx = ((my + dy) * mPitch + (mx + dx)) | 0\n\n const dStride = (dw - actualW) | 0\n const sStride = (sw - actualW) | 0\n const mStride = (mPitch - actualW) | 0\n\n const isOpaque = globalAlpha === 255\n const isOverwrite = blendFn.isOverwrite || false\n let didChange = false\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx]\n const effM = invertMask ? 255 - mVal : mVal\n\n // Early exit if mask is fully transparent\n if (effM === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n const srcCol = src32[sIdx] as Color32\n const srcAlpha = srcCol >>> 24\n\n // Early exit if source is fully transparent (unless overwriting)\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n // Calculate weight using linear logic (Easier for JIT than nested ternaries)\n let weight = globalAlpha\n if (isOpaque) {\n weight = effM\n } else if (effM !== 255) {\n weight = (effM * globalAlpha + 128) >> 8\n }\n\n // Zero-weight safety check\n if (weight === 0) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n let finalCol = srcCol\n if (weight < 255) {\n const a = (srcAlpha * weight + 128) >> 8\n // Final check: weight might have resulted in a transparent pixel\n if (a === 0 && !isOverwrite) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n finalCol = ((srcCol & 0x00ffffff) | (a << 24)) >>> 0 as Color32\n }\n const current = dst32[dIdx] as Color32\n const next = blendFn(finalCol, dst32[dIdx] as Color32)\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n\n dIdx++\n sIdx++\n mIdx++\n }\n dIdx += dStride\n sIdx += sStride\n mIdx += mStride\n }\n\n return didChange\n}\n","import type { PixelBlendMaskOptions } from '../../_types'\nimport type { AlphaMask } from '../../Mask/_mask-types'\nimport type { PixelData32 } from '../../PixelData/_pixelData-types'\nimport { blendPixelDataAlphaMask } from '../../PixelData/blendPixelDataAlphaMask'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { blendPixelDataAlphaMask }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendAlphaMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataAlphaMask = defaults.blendPixelDataAlphaMask,\n } = deps\n\n return {\n blendAlphaMask(\n src: PixelData32,\n mask: AlphaMask,\n opts?: PixelBlendMaskOptions,\n ): boolean {\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? src.w\n const h = opts?.h ?? src.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n return didChange(\n blendPixelDataAlphaMask(writer.config.target, src, mask, opts),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import type { PixelBlendMaskOptions } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { BinaryMask } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\n\nexport function blendPixelDataBinaryMask(\n target: PixelData32,\n src: PixelData32,\n binaryMask: BinaryMask,\n opts?: PixelBlendMaskOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const sourceX = opts?.sx ?? 0\n const sourceY = opts?.sy ?? 0\n const width = opts?.w ?? src.w\n const height = opts?.h ?? src.h\n const globalAlpha = opts?.alpha ?? 255\n const blendFn = opts?.blendFn ?? sourceOverPerfect\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const invertMask = opts?.invertMask ?? false\n\n if (globalAlpha === 0) return false\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.w - sx)\n h = Math.min(h, src.h - 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, target.w - x)\n const actualH = Math.min(h, target.h - y)\n\n if (actualW <= 0 || actualH <= 0) return false\n\n // 3. Coordinate Displacement for Mask Sync\n // dx/dy represents how far the clipped start is from the requested start.\n // This is the stable way to align the mask across all clipping permutations.\n const dx = (x - targetX) | 0\n const dy = (y - targetY) | 0\n\n const dst32 = target.data\n const src32 = src.data\n const dw = target.w\n const sw = src.w\n const mPitch = binaryMask.w\n const maskData = binaryMask.data\n\n let dIdx = (y * dw + x) | 0\n let sIdx = (sy * sw + sx) | 0\n let mIdx = ((my + dy) * mPitch + (mx + dx)) | 0\n\n const dStride = (dw - actualW) | 0\n const sStride = (sw - actualW) | 0\n const mStride = (mPitch - actualW) | 0\n\n const skipVal = invertMask ? 1 : 0\n const isOpaque = globalAlpha === 255\n const isOverwrite = blendFn.isOverwrite || false\n let didChange = false\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n // Binary Mask Check (Earliest exit)\n if (maskData[mIdx] === skipVal) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n const srcCol = src32[sIdx] as Color32\n const srcAlpha = srcCol >>> 24\n\n // Source Alpha Check\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n\n let finalCol = srcCol\n if (!isOpaque) {\n // Rounding-corrected global alpha application\n const a = (srcAlpha * globalAlpha + 128) >> 8\n if (a === 0 && !isOverwrite) {\n dIdx++\n sIdx++\n mIdx++\n continue\n }\n finalCol = ((srcCol & 0x00ffffff) | (a << 24)) >>> 0 as Color32\n }\n\n const current = dst32[dIdx] as Color32\n const next = blendFn(finalCol, dst32[dIdx] as Color32)\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n\n dIdx++\n sIdx++\n mIdx++\n }\n dIdx += dStride\n sIdx += sStride\n mIdx += mStride\n }\n\n return didChange\n}\n","import type { PixelBlendMaskOptions } from '../../_types'\nimport type { BinaryMask } from '../../Mask/_mask-types'\nimport type { PixelData32 } from '../../PixelData/_pixelData-types'\nimport { blendPixelDataBinaryMask } from '../../PixelData/blendPixelDataBinaryMask'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { blendPixelDataBinaryMask }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendBinaryMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataBinaryMask = defaults.blendPixelDataBinaryMask,\n } = deps\n\n return {\n blendBinaryMask(\n src: PixelData32,\n mask: BinaryMask,\n opts?: PixelBlendMaskOptions,\n ): boolean {\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? src.w\n const h = opts?.h ?? src.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n return didChange(\n blendPixelDataBinaryMask(writer.config.target, src, mask, opts),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import { type ColorBlendOptions } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Blends a solid color into a target pixel buffer.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelData(\n target: PixelData32,\n color: Color32,\n opts?: ColorBlendOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const width = opts?.w ?? target.w\n const height = opts?.h ?? target.h\n const globalAlpha = opts?.alpha ?? 255\n const blendFn = opts?.blendFn ?? sourceOverPerfect\n if (globalAlpha === 0) return false\n\n const baseSrcAlpha = (color >>> 24)\n const isOverwrite = (blendFn as any).isOverwrite || false\n\n if (baseSrcAlpha === 0 && !isOverwrite) return false\n\n // Clipping\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\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, target.w - x)\n const actualH = Math.min(h, target.h - y)\n\n if (actualW <= 0 || actualH <= 0) return false\n\n // Single-color fills can pre-calculate the source color once\n let finalSrcColor = color\n\n if (globalAlpha < 255) {\n const a = (baseSrcAlpha * globalAlpha + 128) >> 8\n if (a === 0 && !isOverwrite) return false\n finalSrcColor = ((color & 0x00ffffff) | (a << 24)) >>> 0 as Color32\n }\n\n const dst32 = target.data\n const dw = target.w\n let dIdx = (y * dw + x) | 0\n const dStride = (dw - actualW) | 0\n let didChange = false\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const current = dst32[dIdx] as Color32\n const next = blendFn(finalSrcColor, current)\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n\n dIdx++\n }\n dIdx += dStride\n }\n\n return didChange\n}\n","import type { ColorBlendOptions } from '../../_types'\nimport type { Color32 } from '../../Color/_color-types'\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { blendColorPixelData }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColor = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n blendColorPixelData = defaults.blendColorPixelData,\n } = deps\n\n return {\n blendColor(\n color: Color32,\n opts?: ColorBlendOptions,\n ): boolean {\n const target = writer.config.target\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? target.w\n const h = opts?.h ?? target.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n return didChange(\n blendColorPixelData(target, color, opts),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import type { ColorBlendMaskOptions } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { AlphaMask } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Blends a solid color into a target pixel buffer using an alpha mask.\n *\n * @remarks\n * If the width (`w`) or height (`h`) are omitted from the options, they will safely\n * default to the dimensions of the provided mask to prevent out-of-bounds memory access.\n *\n * @param target - The destination {@link PixelData32} buffer to modify.\n * @param color - The solid color to apply.\n * @param mask - The mask defining the per-pixel opacity of the target area.\n * @param opts - Configuration options including placement coordinates, bounds, global alpha, and mask offsets.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataAlphaMask(\n target: PixelData32,\n color: Color32,\n mask: AlphaMask,\n opts?: ColorBlendMaskOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const w = opts?.w ?? mask.w\n const h = opts?.h ?? mask.h\n const globalAlpha = opts?.alpha ?? 255\n const blendFn = opts?.blendFn ?? sourceOverPerfect\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const invertMask = opts?.invertMask ?? false\n\n if (globalAlpha === 0) return false\n\n const baseSrcAlpha = (color >>> 24)\n const isOverwrite = (blendFn as any).isOverwrite || false\n\n if (baseSrcAlpha === 0 && !isOverwrite) return false\n\n let x = targetX\n let y = targetY\n let actualW = w\n let actualH = h\n\n if (x < 0) {\n actualW += x\n x = 0\n }\n\n if (y < 0) {\n actualH += y\n y = 0\n }\n\n actualW = Math.min(actualW, target.w - x)\n actualH = Math.min(actualH, target.h - y)\n\n if (actualW <= 0 || actualH <= 0) return false\n\n const dx = (x - targetX) | 0\n const dy = (y - targetY) | 0\n\n const dst32 = target.data\n const dw = target.w\n const mPitch = mask.w\n const maskData = mask.data\n\n let dIdx = (y * dw + x) | 0\n let mIdx = ((my + dy) * mPitch + (mx + dx)) | 0\n\n const dStride = (dw - actualW) | 0\n const mStride = (mPitch - actualW) | 0\n const isOpaque = globalAlpha === 255\n const colorRGB = color & 0x00ffffff\n let didChange = false\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const mVal = maskData[mIdx]\n const effM = invertMask ? 255 - mVal : mVal\n\n if (effM === 0) {\n dIdx++\n mIdx++\n continue\n }\n\n let weight = globalAlpha\n\n if (isOpaque) {\n weight = effM\n } else if (effM !== 255) {\n weight = (effM * globalAlpha + 128) >> 8\n }\n\n if (weight === 0) {\n dIdx++\n mIdx++\n continue\n }\n\n let finalCol = color\n\n if (weight < 255) {\n const a = (baseSrcAlpha * weight + 128) >> 8\n if (a === 0 && !isOverwrite) {\n dIdx++\n mIdx++\n continue\n }\n finalCol = ((colorRGB | (a << 24)) >>> 0) as Color32\n }\n\n const current = dst32[dIdx] as Color32\n const next = blendFn(finalCol, current)\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n\n return didChange\n}\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../../Color/_color-types'\nimport type { PaintAlphaMask } from '../../Paint/_paint-types'\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = {\n blendColorPixelDataAlphaMask,\n}\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintAlphaMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n } = deps\n\n const OPTS = {\n x: 0,\n y: 0,\n blendFn: sourceOverPerfect,\n alpha: 255,\n }\n\n return {\n blendColorPaintAlphaMask(\n color: Color32,\n mask: PaintAlphaMask,\n x: number,\n y: number,\n alpha = 255,\n blendFn = sourceOverPerfect,\n ): boolean {\n const tx = x + mask.centerOffsetX\n const ty = y + mask.centerOffsetY\n\n const didChange = writer.accumulator.storeRegionBeforeState(tx, ty, mask.w, mask.h)\n if (!didChange) return false\n\n OPTS.x = tx\n OPTS.y = ty\n OPTS.alpha = alpha\n OPTS.blendFn = blendFn\n\n return didChange(\n blendColorPixelDataAlphaMask(writer.config.target, color, mask, OPTS),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import type { ColorBlendMaskOptions } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { BinaryMask } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Blends a solid color into a target pixel buffer using a binary mask.\n *\n * @remarks\n * If the width (`w`) or height (`h`) are omitted from the options, they will safely\n * default to the dimensions of the provided mask to prevent out-of-bounds memory access.\n *\n * @param target - The destination {@link PixelData32} buffer to modify.\n * @param color - The solid color to apply.\n * @param mask - The mask defining the per-pixel opacity of the target area.\n * @param opts - Configuration options including placement coordinates, bounds, global alpha, and mask offsets.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelDataBinaryMask(\n target: PixelData32,\n color: Color32,\n mask: BinaryMask,\n opts?: ColorBlendMaskOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n let w = opts?.w ?? mask.w\n let h = opts?.h ?? mask.h\n const globalAlpha = opts?.alpha ?? 255\n const blendFn = opts?.blendFn ?? sourceOverPerfect\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const invertMask = opts?.invertMask ?? false\n\n if (globalAlpha === 0) return false\n\n const baseSrcAlpha = (color >>> 24)\n const isOverwrite = (blendFn as any).isOverwrite || false\n\n if (baseSrcAlpha === 0 && !isOverwrite) return false\n\n let x = targetX\n let y = targetY\n\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, target.w - x)\n const actualH = Math.min(h, target.h - y)\n\n if (actualW <= 0 || actualH <= 0) return false\n\n let baseColorWithGlobalAlpha = color\n\n if (globalAlpha < 255) {\n const a = (baseSrcAlpha * globalAlpha + 128) >> 8\n if (a === 0 && !isOverwrite) return false\n baseColorWithGlobalAlpha = ((color & 0x00ffffff) | (a << 24)) >>> 0 as Color32\n }\n\n const dx = (x - targetX) | 0\n const dy = (y - targetY) | 0\n const dst32 = target.data\n const dw = target.w\n const mPitch = mask.w\n const maskData = mask.data\n let dIdx = (y * dw + x) | 0\n let mIdx = ((my + dy) * mPitch + (mx + dx)) | 0\n\n const dStride = (dw - actualW) | 0\n const mStride = (mPitch - actualW) | 0\n const skipVal = invertMask ? 1 : 0\n let didChange = false\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n if (maskData[mIdx] === skipVal) {\n dIdx++\n mIdx++\n continue\n }\n\n const current = dst32[dIdx] as Color32\n const next = blendFn(baseColorWithGlobalAlpha, current)\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n\n dIdx++\n mIdx++\n }\n\n dIdx += dStride\n mIdx += mStride\n }\n\n return didChange\n}\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../../Color/_color-types'\nimport type { PaintBinaryMask } from '../../Paint/_paint-types'\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = {\n blendColorPixelDataBinaryMask,\n}\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintBinaryMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n } = deps\n\n const OPTS = {\n x: 0,\n y: 0,\n blendFn: sourceOverPerfect,\n alpha: 255,\n }\n\n return {\n blendColorPaintBinaryMask(\n color: Color32,\n mask: PaintBinaryMask,\n x: number,\n y: number,\n alpha = 255,\n blendFn = sourceOverPerfect,\n ): boolean {\n const tx = x + mask.centerOffsetX\n const ty = y + mask.centerOffsetY\n\n const didChange = writer.accumulator.storeRegionBeforeState(tx, ty, mask.w, mask.h)\n if (!didChange) return false\n\n OPTS.x = tx\n OPTS.y = ty\n OPTS.alpha = alpha\n OPTS.blendFn = blendFn\n\n return didChange(\n blendColorPixelDataBinaryMask(writer.config.target, color, mask, OPTS),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../../Color/_color-types'\nimport { MaskType } from '../../Mask/_mask-types'\nimport type { PaintMask, PaintRect } from '../../Paint/_paint-types'\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData'\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask'\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = {\n blendColorPixelDataAlphaMask,\n blendColorPixelDataBinaryMask,\n blendColorPixelData,\n}\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendColorPixelDataBinaryMask = defaults.blendColorPixelDataBinaryMask,\n blendColorPixelDataAlphaMask = defaults.blendColorPixelDataAlphaMask,\n blendColorPixelData = defaults.blendColorPixelData,\n } = deps\n\n const OPTS = {\n x: 0,\n y: 0,\n blendFn: sourceOverPerfect,\n alpha: 255,\n w: undefined as number | undefined,\n h: undefined as number | undefined,\n }\n\n return {\n blendColorPaintMask(\n color: Color32,\n mask: PaintMask | PaintRect,\n x: number,\n y: number,\n alpha = 255,\n blendFn = sourceOverPerfect,\n ): boolean {\n const tx = x + mask.centerOffsetX\n const ty = y + mask.centerOffsetY\n\n const didChange = writer.accumulator.storeRegionBeforeState(tx, ty, mask.w, mask.h)\n if (!didChange) return false\n\n OPTS.x = tx\n OPTS.y = ty\n OPTS.alpha = alpha\n OPTS.blendFn = blendFn\n OPTS.w = undefined\n OPTS.h = undefined\n\n if (mask.data) {\n if (mask.type === MaskType.BINARY) {\n return didChange(\n blendColorPixelDataBinaryMask(writer.config.target, color, mask, OPTS),\n )\n }\n return didChange(\n blendColorPixelDataAlphaMask(writer.config.target, color, mask, OPTS),\n )\n }\n\n OPTS.w = mask.w\n OPTS.h = mask.h\n\n return didChange(\n blendColorPixelData(writer.config.target, color, OPTS),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import type { BlendColor32 } from '../../_types'\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../../Color/_color-types'\nimport { _macro_paintRectCenterOffset } from '../../Internal/macros'\nimport { blendColorPixelData } from '../../PixelData/blendColorPixelData'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = {\n blendColorPixelData,\n}\n\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendColorPaintRect = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n blendColorPixelData = defaults.blendColorPixelData,\n } = deps\n\n const OPTS = { x: 0, y: 0, w: 0, h: 0, blendFn: sourceOverPerfect, alpha: 255 }\n\n return {\n blendColorPaintRect(\n color: Color32,\n centerX: number,\n centerY: number,\n brushWidth: number,\n brushHeight: number,\n alpha = 255,\n blendFn: BlendColor32 = sourceOverPerfect,\n ): boolean {\n const target = writer.config.target\n\n const topLeftX = centerX + _macro_paintRectCenterOffset(brushWidth)\n const topLeftY = centerY + _macro_paintRectCenterOffset(brushHeight)\n\n OPTS.x = topLeftX\n OPTS.y = topLeftY\n OPTS.w = brushWidth\n OPTS.h = brushHeight\n OPTS.blendFn = blendFn\n OPTS.alpha = alpha\n\n const didChange = writer.accumulator.storeRegionBeforeState(topLeftX, topLeftY, brushWidth, brushHeight)\n if (!didChange) return false\n\n return didChange(\n blendColorPixelData(\n target,\n color,\n OPTS,\n ),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import { type PixelBlendMaskOptions } from '../../_types'\nimport { type Mask, MaskType } from '../../Mask/_mask-types'\nimport type { PixelData32 } from '../../PixelData/_pixelData-types'\nimport { blendPixelDataAlphaMask } from '../../PixelData/blendPixelDataAlphaMask'\nimport { blendPixelDataBinaryMask } from '../../PixelData/blendPixelDataBinaryMask'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { blendPixelDataAlphaMask, blendPixelDataBinaryMask }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendMask = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelDataAlphaMask = defaults.blendPixelDataAlphaMask,\n blendPixelDataBinaryMask = defaults.blendPixelDataBinaryMask,\n } = deps\n\n return {\n blendMask(\n src: PixelData32,\n mask: Mask,\n opts?: PixelBlendMaskOptions,\n ): boolean {\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? src.w\n const h = opts?.h ?? src.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n if (mask.type === MaskType.BINARY) {\n return didChange(\n blendPixelDataBinaryMask(writer.config.target, src, mask, opts),\n )\n } else {\n return didChange(\n blendPixelDataAlphaMask(writer.config.target, src, mask, opts),\n )\n }\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import type { BlendColor32 } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { PixelData32 } from './_pixelData-types'\n\nexport function blendPixel(\n target: PixelData32,\n x: number,\n y: number,\n color: Color32,\n alpha: number = 255,\n blendFn: BlendColor32 = sourceOverPerfect,\n): boolean {\n if (alpha === 0) return false\n\n let width = target.w\n let height = target.h\n\n if (x < 0 || x >= width || y < 0 || y >= height) return false\n\n let srcAlpha = color >>> 24\n let isOverwrite = blendFn.isOverwrite\n\n // Early exit for transparent source unless we are in an overwrite mode\n if (srcAlpha === 0 && !isOverwrite) return false\n\n let dst32 = target.data\n let index = y * width + x\n let finalColor = color\n\n if (alpha !== 255) {\n let finalAlpha = (srcAlpha * alpha + 128) >> 8\n\n if (finalAlpha === 0 && !isOverwrite) return false\n\n finalColor = (((color & 0x00ffffff) | (finalAlpha << 24)) >>> 0) as Color32\n }\n\n let current = dst32[index] as Color32\n let next = blendFn(finalColor, current)\n\n if (current !== next) {\n dst32[index] = next\n\n return true\n }\n\n return false\n}\n","import type { BlendColor32 } from '../../_types'\nimport type { Color32 } from '../../Color/_color-types'\nimport { blendPixel } from '../../PixelData/blendPixel'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { blendPixel }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixel = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixel = defaults.blendPixel,\n } = deps\n\n return {\n blendPixel(\n x: number,\n y: number,\n color: Color32,\n alpha?: number,\n blendFn?: BlendColor32,\n ): boolean {\n\n const didChange = writer.accumulator.storePixelBeforeState(x, y)\n if (!didChange) return false\n\n return didChange(\n blendPixel(writer.config.target, x, y, color, alpha, blendFn),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import { type PixelBlendOptions } from '../_types'\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { PixelData32 } from './_pixelData-types'\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 target: PixelData32,\n src: PixelData32,\n opts?: PixelBlendOptions,\n): boolean {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const sourceX = opts?.sx ?? 0\n const sourceY = opts?.sy ?? 0\n const width = opts?.w ?? src.w\n const height = opts?.h ?? src.h\n const globalAlpha = opts?.alpha ?? 255\n const blendFn = opts?.blendFn ?? sourceOverPerfect\n\n if (globalAlpha === 0) return false\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 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.w - sx)\n h = Math.min(h, src.h - sy)\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, target.w - x)\n const actualH = Math.min(h, target.h - y)\n if (actualW <= 0 || actualH <= 0) return false\n\n const dst32 = target.data\n const src32 = src.data\n const dw = target.w\n const sw = src.w\n\n let dIdx = (y * dw + x) | 0\n let sIdx = (sy * sw + sx) | 0\n\n const dStride = (dw - actualW) | 0\n const sStride = (sw - actualW) | 0\n const isOpaque = globalAlpha === 255\n const isOverwrite = blendFn.isOverwrite\n let didChange = false\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n const srcCol = src32[sIdx] as Color32\n const srcAlpha = (srcCol >>> 24)\n\n if (srcAlpha === 0 && !isOverwrite) {\n dIdx++\n sIdx++\n continue\n }\n\n let finalCol = srcCol\n if (!isOpaque) {\n const a = (srcAlpha * globalAlpha + 128) >> 8\n if (a === 0 && !isOverwrite) {\n dIdx++\n sIdx++\n continue\n }\n finalCol = ((srcCol & 0x00ffffff) | (a << 24)) >>> 0 as Color32\n }\n\n const current = dst32[dIdx] as Color32\n const next = blendFn(finalCol, dst32[dIdx] as Color32)\n\n if (current !== next) {\n dst32[dIdx] = next\n didChange = true\n }\n\n dIdx++\n sIdx++\n }\n dIdx += dStride\n sIdx += sStride\n }\n\n return didChange\n}\n","import type { PixelBlendOptions } from '../../_types'\nimport type { PixelData32 } from '../../PixelData/_pixelData-types'\nimport { blendPixelData } from '../../PixelData/blendPixelData'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { blendPixelData }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorBlendPixelData = ((writer: PixelWriter<any>, deps: Partial<Deps> = defaults) => {\n const {\n blendPixelData = defaults.blendPixelData,\n } = deps\n\n return {\n blendPixelData(\n src: PixelData32,\n opts?: PixelBlendOptions,\n ): boolean {\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? src.w\n const h = opts?.h ?? src.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n return didChange(\n blendPixelData(writer.config.target, src, opts),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n\n","import type { Color32 } from '../Color/_color-types'\nimport type { Rect } from '../Rect/_rect-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Fills a region or the {@link PixelData32} buffer with a solid color.\n *\n * @param dst - The target to modify.\n * @param color - The color to apply.\n * @param rect - Defines the area to fill. If omitted, the entire\n * @returns true if any pixels were actually modified.\n */\nexport function fillPixelData(\n dst: PixelData32,\n color: Color32,\n rect?: Partial<Rect>,\n): boolean\n/**\n * @param dst - The target to modify.\n * @param color - The color 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: PixelData32,\n color: Color32,\n x: number,\n y: number,\n w: number,\n h: number,\n): boolean\nexport function fillPixelData(\n dst: PixelData32,\n color: Color32,\n _x?: Partial<Rect> | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): boolean {\n const dstW = dst.w\n const dstH = dst.h\n\n let x: number\n let y: number\n let w: number\n let h: number\n\n if (typeof _x === 'number') {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n } else if (typeof _x === 'object') {\n x = _x.x ?? 0\n y = _x.y ?? 0\n w = _x.w ?? dstW\n h = _x.h ?? dstH\n } else {\n x = 0\n y = 0\n w = dstW\n h = dstH\n }\n\n // Inline bounds clipping\n let dstX = x\n let dstY = y\n let fillW = w\n let fillH = h\n\n if (dstX < 0) {\n fillW += dstX\n dstX = 0\n }\n\n if (dstY < 0) {\n fillH += dstY\n dstY = 0\n }\n\n fillW = Math.min(fillW, dstW - dstX)\n fillH = Math.min(fillH, dstH - dstY)\n\n if (fillW <= 0 || fillH <= 0) return false\n\n const dst32 = dst.data\n let hasChanged = false\n\n // Fast-path: If the area spans the full width, we can treat it as a contiguous 1D array\n if (dstX === 0 && fillW === dstW) {\n const start = dstY * dstW\n const end = start + fillW * fillH\n\n for (let i = start; i < end; i++) {\n if (dst32[i] !== color) {\n dst32[i] = color\n hasChanged = true\n }\n }\n\n return hasChanged\n }\n\n // Standard path: row-by-row\n for (let iy = 0; iy < fillH; iy++) {\n const rowOffset = (dstY + iy) * dstW\n const start = rowOffset + dstX\n const end = start + fillW\n\n for (let i = start; i < end; i++) {\n if (dst32[i] !== color) {\n dst32[i] = color\n hasChanged = true\n }\n }\n }\n\n return hasChanged\n}\n","import type { Color32 } from '../../Color/_color-types'\nimport { fillPixelData } from '../../PixelData/fillPixelData'\nimport type { Rect } from '../../Rect/_rect-types'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { fillPixelData }\n\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorClear = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData,\n } = deps\n\n return {\n clear(\n rect?: Partial<Rect>,\n ): boolean {\n const target = writer.config.target\n const x = rect?.x ?? 0\n const y = rect?.y ?? 0\n const w = rect?.w ?? target.w\n const h = rect?.h ?? target.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n return didChange(\n fillPixelData(target, 0 as Color32, x, y, w, h),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import type { Color32 } from '../../Color/_color-types'\nimport { fillPixelData } from '../../PixelData/fillPixelData'\nimport type { Rect } from '../../Rect/_rect-types'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { fillPixelData }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFill = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelData = defaults.fillPixelData,\n } = deps\n\n const config = writer.config\n\n function fill(\n color: Color32,\n rect?: Partial<Rect>,\n ): boolean\n\n function fill(\n color: Color32,\n x: number,\n y: number,\n w: number,\n h: number,\n ): boolean\n function fill(\n color: Color32,\n _x?: Partial<Rect> | number,\n _y?: number,\n _w?: number,\n _h?: number,\n ): boolean {\n const target = config.target\n\n const dstW = target.w\n const dstH = target.h\n\n let x: number\n let y: number\n let w: number\n let h: number\n\n if (typeof _x === 'number') {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n } else if (typeof _x === 'object') {\n x = _x.x ?? 0\n y = _x.y ?? 0\n w = _x.w ?? dstW\n h = _x.h ?? dstH\n } else {\n x = 0\n y = 0\n w = dstW\n h = dstH\n }\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n return didChange(\n fillPixelData(target, color, x, y, w, h),\n )\n }\n\n return { fill }\n}) satisfies HistoryMutator<any, Deps>\n","import type { Color32 } from '../Color/_color-types'\nimport type { BinaryMask } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Fills the target PixelData with a color based on a binary mask.\n *\n * @param target - The target to modify.\n * @param color - The color to apply.\n * @param mask - The binary mask determining where to fill.\n * @param x - Horizontal offset to place the mask.\n * @param y - Vertical offset to place the mask.\n * @returns true if any pixels were actually modified.\n */\nexport function fillPixelDataBinaryMask(\n target: PixelData32,\n color: Color32,\n mask: BinaryMask,\n x = 0,\n y = 0,\n): boolean {\n const targetW = target.w\n const targetH = target.h\n const maskW = mask.w\n const maskH = mask.h\n\n // Inline clipping logic\n let dstX = x\n let dstY = y\n let actualW = maskW\n let actualH = maskH\n\n if (dstX < 0) {\n actualW += dstX\n dstX = 0\n }\n\n if (dstY < 0) {\n actualH += dstY\n dstY = 0\n }\n\n actualW = Math.min(actualW, targetW - dstX)\n actualH = Math.min(actualH, targetH - dstY)\n\n if (actualW <= 0 || actualH <= 0) return false\n\n const maskData = mask.data\n const dst32 = target.data\n\n // Calculate offsets for the mask based on clipping\n const mx = dstX - x\n const my = dstY - y\n\n let hasChanged = false\n\n // Stride-based loop for performance\n let dIdx = dstY * targetW + dstX\n let mIdx = my * maskW + mx\n\n const dStride = targetW - actualW\n const mStride = maskW - actualW\n\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n if (maskData[mIdx]) {\n if (dst32[dIdx] !== color) {\n dst32[dIdx] = color\n hasChanged = true\n }\n }\n dIdx++\n mIdx++\n }\n dIdx += dStride\n mIdx += mStride\n }\n\n return hasChanged\n}\n","import type { Color32 } from '../../Color/_color-types'\nimport type { BinaryMask } from '../../Mask/_mask-types'\nimport { fillPixelDataBinaryMask } from '../../PixelData/fillPixelDataBinaryMask'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { fillPixelDataBinaryMask }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorFillBinaryMask = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n fillPixelDataBinaryMask = defaults.fillPixelDataBinaryMask,\n } = deps\n\n return {\n fillBinaryMask(\n color: Color32,\n mask: BinaryMask,\n x = 0,\n y = 0,\n ): boolean {\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, mask.w, mask.h)\n if (!didChange) return false\n return didChange(\n fillPixelDataBinaryMask(writer.config.target, color, mask, x, y),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import { type PixelMutateOptions } from '../_types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Inverts the RGB color data of the target PixelData, optionally controlled by a mask.\n * @param target - The target to modify.\n * @param opts - Options defining the area, mask, and offsets.\n * @returns true if the operation was performed within bounds.\n */\nexport function invertPixelData(\n target: PixelData32,\n opts?: PixelMutateOptions,\n): boolean {\n const targetW = target.w\n const targetH = target.h\n\n const mask = opts?.mask\n const invertMask = opts?.invertMask ?? false\n\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const w = opts?.w ?? targetW\n const h = opts?.h ?? targetH\n\n // Inline clipping logic\n let x = targetX\n let y = targetY\n let actualW = w\n let actualH = h\n\n if (x < 0) {\n actualW += x\n x = 0\n }\n\n if (y < 0) {\n actualH += y\n y = 0\n }\n\n actualW = Math.min(actualW, targetW - x)\n actualH = Math.min(actualH, targetH - y)\n\n if (actualW <= 0 || actualH <= 0) return false\n\n const dst32 = target.data\n const dw = targetW\n\n // Calculate relative movement for the mask coordinate\n const dx = x - targetX\n const dy = y - targetY\n\n let dIdx = y * dw + x\n const dStride = dw - actualW\n\n if (mask) {\n const maskData = mask.data\n const mPitch = mask.w\n let mIdx = (my + dy) * mPitch + (mx + dx)\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 = maskData[mIdx]\n const isHit = invertMask\n ? mVal === 0\n : mVal === 1\n\n if (isHit) {\n // XOR with 0x00FFFFFF flips RGB bits and ignores Alpha\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n }\n dIdx++\n mIdx++\n }\n dIdx += dStride\n mIdx += mStride\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF\n dIdx++\n }\n dIdx += dStride\n }\n }\n\n return true\n}\n","import type { PixelMutateOptions } from '../../_types'\nimport { invertPixelData } from '../../PixelData/invertPixelData'\nimport { type HistoryMutator, PixelWriter } from '../PixelWriter'\n\nconst defaults = { invertPixelData }\ntype Deps = Partial<typeof defaults>\n\n/**\n * @param deps - @hidden\n */\nexport const mutatorInvert = ((writer: PixelWriter<any>, deps: Deps = defaults) => {\n const {\n invertPixelData = defaults.invertPixelData,\n } = deps\n\n return {\n invert(opts?: PixelMutateOptions): boolean {\n const target = writer.config.target\n const x = opts?.x ?? 0\n const y = opts?.y ?? 0\n const w = opts?.w ?? target.w\n const h = opts?.h ?? target.h\n\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h)\n if (!didChange) return false\n\n return didChange?.(\n invertPixelData(target, opts),\n )\n },\n }\n}) satisfies HistoryMutator<any, Deps>\n","import { mutatorApplyAlphaMask } from './PixelMutator/mutatorApplyAlphaMask'\nimport { mutatorApplyBinaryMask } from './PixelMutator/mutatorApplyBinaryMask'\nimport { mutatorApplyMask } from './PixelMutator/mutatorApplyMask'\nimport { mutatorBlendAlphaMask } from './PixelMutator/mutatorBlendAlphaMask'\nimport { mutatorBlendBinaryMask } from './PixelMutator/mutatorBlendBinaryMask'\nimport { mutatorBlendColor } from './PixelMutator/mutatorBlendColor'\nimport { mutatorBlendColorPaintAlphaMask } from './PixelMutator/mutatorBlendColorPaintAlphaMask'\nimport { mutatorBlendColorPaintBinaryMask } from './PixelMutator/mutatorBlendColorPaintBinaryMask'\nimport { mutatorBlendColorPaintMask } from './PixelMutator/mutatorBlendColorPaintMask'\nimport { mutatorBlendColorPaintRect } from './PixelMutator/mutatorBlendColorPaintRect'\nimport { mutatorBlendMask } from './PixelMutator/mutatorBlendMask'\nimport { mutatorBlendPixel } from './PixelMutator/mutatorBlendPixel'\nimport { mutatorBlendPixelData } from './PixelMutator/mutatorBlendPixelData'\nimport { mutatorClear } from './PixelMutator/mutatorClear'\nimport { mutatorFill } from './PixelMutator/mutatorFill'\nimport { mutatorFillBinaryMask } from './PixelMutator/mutatorFillBinaryMask'\nimport { mutatorInvert } from './PixelMutator/mutatorInvert'\nimport type { PixelWriter } from './PixelWriter'\n\nexport function makeFullPixelMutator(writer: PixelWriter<any>) {\n return {\n // @sort\n ...mutatorApplyAlphaMask(writer),\n ...mutatorApplyBinaryMask(writer),\n ...mutatorApplyMask(writer),\n ...mutatorBlendAlphaMask(writer),\n ...mutatorBlendBinaryMask(writer),\n ...mutatorBlendColor(writer),\n ...mutatorBlendColorPaintAlphaMask(writer),\n ...mutatorBlendColorPaintBinaryMask(writer),\n ...mutatorBlendColorPaintMask(writer),\n ...mutatorBlendColorPaintRect(writer),\n ...mutatorBlendMask(writer),\n ...mutatorBlendPixel(writer),\n ...mutatorBlendPixelData(writer),\n ...mutatorClear(writer),\n ...mutatorFill(writer),\n ...mutatorFillBinaryMask(writer),\n ...mutatorInvert(writer),\n }\n}\n","import type { ImageDataLike } from './_ImageData-types'\n\nexport function copyImageData(source: ImageDataLike): ImageData {\n const dataCopy = new Uint8ClampedArray(source.data)\n\n return new ImageData(dataCopy, source.width, source.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 { Rect } from '../Rect/_rect-types'\nimport type { ImageDataLike } from './_ImageData-types'\nimport { extractImageDataBuffer } from './extractImageDataBuffer'\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 rect defining the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageData(\n imageData: ImageDataLike,\n rect: Rect,\n): ImageData | null\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 buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageData(\n imageData: ImageDataLike,\n x: number,\n y: number,\n w: number,\n h: number,\n): ImageData | null\nexport function extractImageData(\n imageData: ImageDataLike,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): ImageData | null {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n if (w <= 0 || h <= 0) return null\n\n const result = new ImageData(w, h)\n\n const buffer = extractImageDataBuffer(imageData, x, y, w, h)\n result.data.set(buffer)\n\n return result\n\n}\n","import type { ImageDataLike } from './_ImageData-types'\n\nexport function makeImageDataLike(width: number, height: number, data?: Buffer): ImageDataLike {\n const size = width * height * 4\n const buffer = data\n ? new Uint8ClampedArray(data.buffer, data.byteOffset, size)\n : new Uint8ClampedArray(size)\n return {\n width,\n height,\n data: buffer,\n }\n}\n","import { 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 imageDataToAlphaMaskBuffer(\n imageData: ImageData,\n): Uint8Array {\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)\n\n for (let i = 0; i < len; i++) {\n const val = data32[i]\n\n // Extract Alpha (top 8 bits in Little-Endian/ABGR)\n mask[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import { makeReusableCanvas } from '../Canvas/ReusableCanvas'\n\nconst get = makeReusableCanvas()\n\n/**\n * Converts an {@link ImageData} object into a base64-encoded Data URL string.\n *\n * @param imageData - The pixel data to be converted.\n *\n * @returns A string representing the image in `image/png` format as a\n * [Data URL](https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data).\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n * @example\n * ```typescript\n * const dataUrl = imageDataToDataUrl(imageData);\n * const img = new Image();\n * img.src = dataUrl;\n * ```\n */\nexport function imageDataToDataUrl(imageData: ImageData): string {\n const { canvas, ctx } = get(imageData.width, imageData.height)\n\n ctx.putImageData(imageData, 0, 0)\n return canvas.toDataURL()\n}\n\nimageDataToDataUrl.reset = get.reset\n","import type { ImageDataLike } from './_ImageData-types'\n\n/**\n * converts {@link ImageData} to a faster Uint32Array\n */\nexport function imageDataToUint32Array(imageData: ImageDataLike): Uint32Array {\n return _macro_imageDataToUint32Array(imageData)\n}\n\n// @__INLINE_MACRO__\nexport function _macro_imageDataToUint32Array(imageData: ImageDataLike): Uint32Array {\n return new Uint32Array(\n imageData.data.buffer,\n imageData.data.byteOffset,\n // Shift right by 2 is a fast bitwise division by 4.\n imageData.data.byteLength >> 2,\n )\n}\n","export function invertImageData(imageData: ImageData) {\n const data = imageData.data\n let length = data.length\n for (let i = 0; i < length; i += 4) {\n data[i] = 255 - data[i]!\n data[i + 1] = 255 - data[i + 1]!\n data[i + 2] = 255 - data[i + 2]!\n }\n return imageData\n}\n","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resampleUint32Array } from '../Algorithm/resampleUint32Array'\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer)\n const { data, w, h } = resampleUint32Array(src32, source.width, source.height, factor)\n\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>\n return new ImageData(uint8ClampedArray, w, h)\n}\n","export type ReusableImageData = ReturnType<typeof makeReusableImageData>\n\n/**\n * Creates a factory function that manages a single, reusable ImageData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled ImageData instance.\n */\nexport function makeReusableImageData() {\n let imageData: ImageData | null = null\n\n /**\n * Retrieves an ImageData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached or newly allocated ImageData object.\n */\n return function getReusableImageData(width: number, height: number) {\n if (imageData === null || imageData.width !== width || imageData.height !== height) {\n imageData = new ImageData(width, height)\n } else {\n imageData.data.fill(0)\n }\n\n return imageData!\n }\n}\n","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from './_ImageData-types'\n\nexport function base64EncodeArrayBuffer(buffer: ArrayBufferLike): Base64EncodedUInt8Array {\n const uint8 = new Uint8Array(buffer)\n const decoder = new TextDecoder('latin1')\n const binary = decoder.decode(uint8)\n\n return btoa(binary) as Base64EncodedUInt8Array\n}\n\nexport function base64DecodeArrayBuffer(encoded: Base64EncodedUInt8Array): Uint8ClampedArray<ArrayBuffer> {\n const binary = atob(encoded)\n const bytes = new Uint8ClampedArray(binary.length)\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i)\n }\n return bytes\n}\n\n/**\n * Serialize for use in JSON. Pixel data is stored as base64 encoded string.\n */\nexport function serializeImageData<T extends ImageDataLike>(imageData: T): SerializedImageData {\n return {\n width: imageData.width,\n height: imageData.height,\n data: base64EncodeArrayBuffer(imageData.data.buffer),\n }\n}\n\nexport function serializeNullableImageData<T extends ImageDataLike | null>(imageData: T): T extends null ? null : SerializedImageData {\n if (!imageData) return null as any\n\n return serializeImageData(imageData) as any\n}\n\nexport function deserializeRawImageData<T extends SerializedImageData>(serialized: T): ImageDataLike {\n return {\n width: serialized.width,\n height: serialized.height,\n data: base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array),\n }\n}\n\nexport function deserializeImageData<T extends SerializedImageData>(serialized: T): ImageData {\n const data = base64DecodeArrayBuffer(serialized.data as Base64EncodedUInt8Array)\n\n return new ImageData(data as ImageDataArray, serialized.width, serialized.height) as any\n}\n\nexport function deserializeNullableImageData<T extends SerializedImageData | null>(serialized: T): T extends null ? null : ImageData {\n if (!serialized) return null as any\n return deserializeImageData(serialized) as any\n}\n","import type { ImageDataLike } from './_ImageData-types'\n\nexport function uInt32ArrayToImageData(\n data: Uint32Array,\n width: number,\n height: number,\n): ImageData {\n const buffer = data.buffer as ArrayBuffer\n const byteOffset = data.byteOffset\n const byteLength = data.byteLength\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength)\n return new ImageData(clampedArray, width, height)\n}\n\nexport function uInt32ArrayToImageDataLike(\n data: Uint32Array,\n width: number,\n height: number,\n): ImageDataLike {\n const buffer = data.buffer\n const byteOffset = data.byteOffset\n const byteLength = data.byteLength\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength)\n return {\n width,\n height,\n data: clampedArray,\n }\n}\n","/**\n * Writes image data from a source to a target.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n */\nexport function writeImageData(\n target: ImageData,\n source: ImageData,\n x = 0,\n y = 0,\n): void {\n const dstW = target.width\n const dstH = target.height\n const dst = target.data\n\n const srcW = source.width\n const srcH = source.height\n const src = source.data\n\n let dstX = x\n let dstY = y\n let srcX = 0\n let srcY = 0\n let copyW = srcW\n let copyH = srcH\n\n if (dstX < 0) {\n srcX = -dstX\n copyW += dstX\n dstX = 0\n }\n\n if (dstY < 0) {\n srcY = -dstY\n copyH += dstY\n dstY = 0\n }\n\n copyW = Math.min(copyW, dstW - dstX)\n copyH = Math.min(copyH, dstH - dstY)\n\n if (copyW <= 0 || copyH <= 0) return\n\n const isDstAligned = dst.byteOffset % 4 === 0\n const isSrcAligned = src.byteOffset % 4 === 0\n\n if (isDstAligned && isSrcAligned) {\n const dstLen32 = dst.byteLength / 4\n const dst32 = new Uint32Array(dst.buffer, dst.byteOffset, dstLen32)\n\n const srcLen32 = src.byteLength / 4\n const src32 = new Uint32Array(src.buffer, src.byteOffset, srcLen32)\n\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX\n const srcStart = (srcY + row) * srcW + srcX\n const chunk = src32.subarray(srcStart, srcStart + copyW)\n\n dst32.set(chunk, dstStart)\n }\n } else {\n const rowLen = copyW * 4\n\n for (let row = 0; row < copyH; row++) {\n const dstStart = ((dstY + row) * dstW + dstX) * 4\n const srcStart = ((srcY + row) * srcW + srcX) * 4\n const chunk = src.subarray(srcStart, srcStart + rowLen)\n\n dst.set(chunk, dstStart)\n }\n }\n}\n","import type { Rect } from '../Rect/_rect-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 target - The target to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A rect defining the destination region.\n */\nexport function writeImageDataBuffer(\n target: ImageData,\n data: Uint8ClampedArray,\n rect: Rect,\n): void\n/**\n * @param target - The target to write into.\n * @param data - The source pixel data (RGBA). Must match the width/height.\n * @param x - The starting horizontal coordinate in the target.\n * @param y - The starting vertical coordinate in the target.\n * @param w - The width of the region to write.\n * @param h - The height of the region to write.\n */\nexport function writeImageDataBuffer(\n target: ImageData,\n data: Uint8ClampedArray,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writeImageDataBuffer(\n target: ImageData,\n data: Uint8ClampedArray,\n _x: 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\n y = _x.y\n w = _x.w\n h = _x.h\n } else {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n }\n\n if (w <= 0 || h <= 0) return\n\n const dstW = target.width\n const dstH = target.height\n const dst = target.data\n\n // Inline clipping logic for destination boundaries\n let dstX = x\n let dstY = y\n let srcX = 0\n let srcY = 0\n let copyW = w\n let copyH = h\n\n if (dstX < 0) {\n srcX = -dstX\n copyW += dstX\n dstX = 0\n }\n\n if (dstY < 0) {\n srcY = -dstY\n copyH += dstY\n dstY = 0\n }\n\n copyW = Math.min(copyW, dstW - dstX)\n copyH = Math.min(copyH, dstH - dstY)\n\n if (copyW <= 0 || copyH <= 0) return\n\n // Fast-path: Both arrays must be 4-byte aligned to use Uint32Array safely\n const isDstAligned = dst.byteOffset % 4 === 0\n const isSrcAligned = data.byteOffset % 4 === 0\n\n if (isDstAligned && isSrcAligned) {\n const dstLen32 = dst.byteLength / 4\n const dst32 = new Uint32Array(dst.buffer, dst.byteOffset, dstLen32)\n\n const srcLen32 = data.byteLength / 4\n const src32 = new Uint32Array(data.buffer, data.byteOffset, srcLen32)\n\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX\n const srcStart = (srcY + row) * w + srcX\n const chunk = src32.subarray(srcStart, srcStart + copyW)\n\n dst32.set(chunk, dstStart)\n }\n } else {\n // Fallback for unaligned data arrays\n const rowLen = copyW * 4\n\n for (let row = 0; row < copyH; row++) {\n const dstStart = ((dstY + row) * dstW + dstX) * 4\n const srcStart = ((srcY + row) * w + srcX) * 4\n const chunk = data.subarray(srcStart, srcStart + rowLen)\n\n dst.set(chunk, dstStart)\n }\n }\n}\n","import type { IndexedImage } from './_indexedImage-types'\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): Uint32Array {\n const data = indexedImage.data\n const palette = indexedImage.palette\n const frequencies = new Uint32Array(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 '../Color/_color-types'\nimport type { IndexedImage } from './_indexedImage-types'\n\nexport function makeIndexedImage(\n width: number,\n height: number,\n data: Uint32Array,\n palette: Uint32Array,\n transparentPalletIndex: number,\n): IndexedImage {\n return {\n w: width,\n h: height,\n data,\n palette,\n transparentPalletIndex,\n }\n}\n\nexport function makeIndexedImageFromImageDataRaw(\n data: Uint8ClampedArray,\n width: number,\n height: number,\n): IndexedImage {\n const buffer = data.buffer\n const rawData = new Uint32Array(buffer)\n const indexedData = new Uint32Array(rawData.length)\n const colorMap = new Map<number, number>()\n const transparentColor = 0\n const transparentPalletIndex = 0\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex)\n\n for (let i = 0; i < rawData.length; i++) {\n const pixel = rawData[i] as number\n const alpha = (pixel >>> 24) & 0xFF\n const isTransparent = alpha === 0\n const colorKey = isTransparent ? transparentColor : (pixel >>> 0)\n\n let id = colorMap.get(colorKey)\n\n if (id === undefined) {\n id = colorMap.size\n colorMap.set(colorKey, id)\n }\n\n indexedData[i] = id\n }\n\n const palette = Uint32Array.from(colorMap.keys())\n\n return makeIndexedImage(\n width,\n height,\n indexedData,\n palette,\n transparentPalletIndex,\n )\n}\n\nexport function makeIndexedImageFromImageData(imageData: ImageData): IndexedImage {\n return makeIndexedImageFromImageDataRaw(imageData.data, imageData.width, imageData.height)\n}\n\nexport function getIndexedImageColor(target: IndexedImage, x: number, y: number): Color32 {\n const index = x + y * target.w\n const paletteIndex = target.data[index]\n\n return target.palette[paletteIndex] as Color32\n}\n","import type { Color32 } from '../Color/_color-types'\n\nimport { packColor } from '../Color/pack-color'\nimport type { IndexedImage } from './_indexedImage-types'\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-types'\n\n/**\n * Converts an IndexedImage back into standard ImageData.\n */\nexport function indexedImageToImageData(indexedImage: IndexedImage): ImageData {\n const { w, h, data, palette } = indexedImage\n const result = new ImageData(w, h)\n const data32 = new Uint32Array(result.data.buffer)\n\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i]\n data32[i] = palette[paletteIndex]\n }\n\n return result\n}\n","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resampleUint32Array } from '../Algorithm/resampleUint32Array'\nimport { 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\n const output = {\n palette: source.palette,\n transparentPalletIndex: source.transparentPalletIndex,\n } as IndexedImage\n\n return resampleUint32Array(source.data, source.w, source.h, factor, output) as IndexedImage\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 '../Internal/_errors'\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 AlphaMask, MaskType } from './_mask-types'\n\n/**\n * Creates an Alpha Mask\n * @param w - width\n * @param h - height\n * @param data - values 0-255\n */\nexport function makeAlphaMask(w: number, h: number, data?: Uint8Array): AlphaMask {\n return {\n type: MaskType.ALPHA,\n data: data ?? new Uint8Array(w * h),\n w,\n h,\n }\n}\n","import type { ApplyMaskToPixelDataOptions } from '../_types'\nimport type { AlphaMask, BinaryMask } from './_mask-types'\n\nexport function applyBinaryMaskToAlphaMask(\n alphaMaskDst: AlphaMask,\n binaryMaskSrc: BinaryMask,\n opts?: ApplyMaskToPixelDataOptions,\n): void {\n const targetX = opts?.x ?? 0\n const targetY = opts?.y ?? 0\n const reqWidth = opts?.w ?? 0\n const reqHeight = opts?.h ?? 0\n const mx = opts?.mx ?? 0\n const my = opts?.my ?? 0\n const invertMask = opts?.invertMask ?? false\n\n const dstWidth = alphaMaskDst.w\n if (dstWidth <= 0) return\n if (binaryMaskSrc.data.length === 0) return\n const srcWidth = binaryMaskSrc.w\n if (srcWidth <= 0) return\n\n const dstHeight = (alphaMaskDst.data.length / dstWidth) | 0\n const srcHeight = (binaryMaskSrc.data.length / srcWidth) | 0\n\n if (dstHeight <= 0) return\n if (srcHeight <= 0) return\n\n const dstX0 = Math.max(0, targetX)\n const dstY0 = Math.max(0, targetY)\n const dstX1 = reqWidth > 0 ? Math.min(dstWidth, targetX + reqWidth) : dstWidth\n const dstY1 = reqHeight > 0 ? Math.min(dstHeight, targetY + reqHeight) : dstHeight\n\n if (dstX0 >= dstX1) return\n if (dstY0 >= dstY1) return\n\n const srcX0 = mx + (dstX0 - targetX)\n const srcY0 = my + (dstY0 - targetY)\n\n if (srcX0 >= srcWidth) return\n if (srcY0 >= srcHeight) return\n if (srcX0 + (dstX1 - dstX0) <= 0) return\n if (srcY0 + (dstY1 - dstY0) <= 0) return\n\n const iterW = Math.min(dstX1 - dstX0, srcWidth - srcX0)\n const iterH = Math.min(dstY1 - dstY0, srcHeight - srcY0)\n\n const srcData = binaryMaskSrc.data\n const dstData = alphaMaskDst.data\n\n let dstIdx = dstY0 * dstWidth + dstX0\n let srcIdx = srcY0 * srcWidth + srcX0\n\n if (invertMask) {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW\n let d = dstIdx\n let s = srcIdx\n\n while (d < dstEnd) {\n // inverted\n if (srcData[s] !== 0) {\n dstData[d] = 0\n }\n d++\n s++\n }\n\n dstIdx += dstWidth\n srcIdx += srcWidth\n }\n } else {\n for (let row = 0; row < iterH; row++) {\n const dstEnd = dstIdx + iterW\n let d = dstIdx\n let s = srcIdx\n\n while (d < dstEnd) {\n // If binary mask is empty, clear the alpha pixel.\n if (srcData[s] === 0) {\n dstData[d] = 0\n }\n d++\n s++\n }\n\n dstIdx += dstWidth\n srcIdx += srcWidth\n }\n }\n}\n","import { type BinaryMask, MaskType } from './_mask-types'\n\n/**\n * Creates a Binary Mask\n * @param w - width\n * @param h - height\n * @param data - values 0-1\n */\nexport function makeBinaryMask(w: number, h: number, data?: Uint8Array): BinaryMask {\n return {\n type: MaskType.BINARY,\n data: data ?? new Uint8Array(w * h),\n w,\n h,\n }\n}\n","import { type AlphaMask, type BinaryMask, MaskType, type MutableBinaryMask } from '../_mask-types'\n\nexport function makeBinaryMaskFromAlphaMask(mask: AlphaMask, threshold: number, out?: MutableBinaryMask): BinaryMask {\n const w = mask.w\n const h = mask.h\n const alphaData = mask.data\n const area = w * h\n\n const binaryData = new Uint8Array(area)\n\n for (let i = 0; i < area; i++) {\n if (alphaData[i] >= threshold) {\n binaryData[i] = 1\n }\n }\n\n out = out ?? { type: MaskType.BINARY } as MutableBinaryMask\n out.data = binaryData\n out.w = w\n out.h = h\n\n return out\n}\n","import { type BinaryMask, MaskType } from '../_mask-types'\n\nexport function makeBinaryMaskOutline(\n mask: BinaryMask,\n scale = 1,\n): BinaryMask {\n const w = mask.w\n const h = mask.h\n const maskData = mask.data\n\n const size = w * scale + 2\n const outData = new Uint8Array(size * size)\n\n for (let iy = 0; iy < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const i = iy * w + ix\n if (maskData[i] === 0) continue\n\n const lx = ix * scale + 1\n const ly = iy * scale + 1\n\n const top = iy === 0 || maskData[i - w] === 0\n const bottom = iy === h - 1 || maskData[i + w] === 0\n const left = ix === 0 || maskData[i - 1] === 0\n const right = ix === w - 1 || maskData[i + 1] === 0\n\n const topLeft = iy === 0 || ix === 0 || maskData[i - w - 1] === 0\n const topRight = iy === 0 || ix === w - 1 || maskData[i - w + 1] === 0\n const bottomLeft = iy === h - 1 || ix === 0 || maskData[i + w - 1] === 0\n const bottomRight = iy === h - 1 || ix === w - 1 || maskData[i + w + 1] === 0\n\n if (top) {\n for (let sx = 0; sx < scale; sx++) {\n const outIdx = (ly - 1) * size + (lx + sx)\n outData[outIdx] = 1\n }\n }\n\n if (bottom) {\n for (let sx = 0; sx < scale; sx++) {\n const outIdx = (ly + scale) * size + (lx + sx)\n outData[outIdx] = 1\n }\n }\n\n if (left) {\n for (let sy = 0; sy < scale; sy++) {\n const outIdx = (ly + sy) * size + (lx - 1)\n outData[outIdx] = 1\n }\n }\n\n if (right) {\n for (let sy = 0; sy < scale; sy++) {\n const outIdx = (ly + sy) * size + (lx + scale)\n outData[outIdx] = 1\n }\n }\n\n if (topLeft) {\n const outIdx = (ly - 1) * size + (lx - 1)\n outData[outIdx] = 1\n }\n\n if (topRight) {\n const outIdx = (ly - 1) * size + (lx + scale)\n outData[outIdx] = 1\n }\n\n if (bottomLeft) {\n const outIdx = (ly + scale) * size + (lx - 1)\n outData[outIdx] = 1\n }\n\n if (bottomRight) {\n const outIdx = (ly + scale) * size + (lx + scale)\n outData[outIdx] = 1\n }\n }\n }\n\n return {\n type: MaskType.BINARY,\n w: size,\n h: size,\n data: outData,\n }\n}\n","import { type BinaryMask, MaskType } from '../_mask-types'\n\nexport function makeCircleBinaryMaskOutline(size: number, scale: number): BinaryMask {\n const outSize = size * scale + 2\n const outArea = outSize * outSize\n const data = new Uint8Array(outArea)\n\n const radius = size / 2\n const r2 = radius * radius\n\n let prevMinX = -1\n let prevMaxX = -1\n\n let currMinX = -1\n let currMaxX = -1\n\n const initialDy = 0 - radius + 0.5\n const initialDy2 = initialDy * initialDy\n\n if (initialDy2 <= r2) {\n const dx = Math.sqrt(r2 - initialDy2)\n currMinX = Math.ceil(radius - 0.5 - dx)\n currMaxX = Math.floor(radius - 0.5 + dx)\n }\n\n for (let iy = 0; iy < size; iy++) {\n let nextMinX = -1\n let nextMaxX = -1\n\n if (iy + 1 < size) {\n const ny = (iy + 1) - radius + 0.5\n const ny2 = ny * ny\n\n if (ny2 <= r2) {\n const dx = Math.sqrt(r2 - ny2)\n nextMinX = Math.ceil(radius - 0.5 - dx)\n nextMaxX = Math.floor(radius - 0.5 + dx)\n }\n }\n\n if (currMinX !== -1) {\n for (let ix = currMinX; ix <= currMaxX; ix++) {\n // Offset by 1 to leave room for the top/left outline edges\n const sx = ix * scale + 1\n const sy = iy * scale + 1\n\n const isTop = prevMinX === -1 || ix < prevMinX || ix > prevMaxX\n const isBottom = nextMinX === -1 || ix < nextMinX || ix > nextMaxX\n const isLeft = ix === currMinX\n const isRight = ix === currMaxX\n\n if (isTop) {\n const leftOut = prevMinX === -1 || (ix - 1) < prevMinX || (ix - 1) > prevMaxX\n const rightOut = prevMinX === -1 || (ix + 1) < prevMinX || (ix + 1) > prevMaxX\n const startX = leftOut ? sx - 1 : sx\n const endX = rightOut ? sx + scale : sx + scale - 1\n\n for (let x = startX; x <= endX; x++) {\n const index = (sy - 1) * outSize + x\n data[index] = 1\n }\n }\n\n if (isBottom) {\n const leftOut = nextMinX === -1 || (ix - 1) < nextMinX || (ix - 1) > nextMaxX\n const rightOut = nextMinX === -1 || (ix + 1) < nextMinX || (ix + 1) > nextMaxX\n const startX = leftOut ? sx - 1 : sx\n const endX = rightOut ? sx + scale : sx + scale - 1\n\n for (let x = startX; x <= endX; x++) {\n const index = (sy + scale) * outSize + x\n data[index] = 1\n }\n }\n\n if (isLeft) {\n for (let y = sy; y < sy + scale; y++) {\n const index = y * outSize + (sx - 1)\n data[index] = 1\n }\n }\n\n if (isRight) {\n for (let y = sy; y < sy + scale; y++) {\n const index = y * outSize + (sx + scale)\n data[index] = 1\n }\n }\n }\n }\n\n prevMinX = currMinX\n prevMaxX = currMaxX\n currMinX = nextMinX\n currMaxX = nextMaxX\n }\n\n return {\n type: MaskType.BINARY,\n w: outSize,\n h: outSize,\n data,\n }\n}\n","import { type BinaryMask, MaskType } from '../_mask-types'\n\nexport function makeRectBinaryMaskOutline(\n w: number,\n h: number,\n scale = 1,\n): BinaryMask {\n const rw = w * scale\n const rh = h * scale\n\n const outW = rw + 2\n const outH = rh + 2\n const outData = new Uint8Array(outW * outH)\n\n // Top edge\n outData.fill(1, 0, outW)\n\n // Bottom edge\n outData.fill(1, (outH - 1) * outW, outH * outW)\n\n // Left and Right edges\n for (let iy = 1; iy < outH - 1; iy++) {\n const rowStart = iy * outW\n outData[rowStart] = 1\n outData[rowStart + outW - 1] = 1\n }\n\n return {\n type: MaskType.BINARY,\n w: outW,\n h: outH,\n data: outData,\n }\n}\n","import type { Mask } from './_mask-types'\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 Mask>(src: T): T {\n return {\n type: src.type,\n data: src.data.slice(),\n w: src.w,\n h: src.h,\n } as T\n}\n","import type { Rect } from '../Rect/_rect-types'\nimport type { Mask } from './_mask-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 target mask.\n * @param rect - A rect defining the region to extract.\n * @returns A new mask containing the extracted region.\n */\nexport function extractMask<T extends Mask>(\n mask: T,\n rect: Rect,\n): T\n\n/**\n * @param mask - The target mask.\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<T extends Mask>(\n mask: T,\n x: number,\n y: number,\n w: number,\n h: number,\n): T\nexport function extractMask<T extends Mask>(\n mask: T,\n xOrRect: number | Rect,\n y?: number,\n w?: number,\n h?: number,\n): T {\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 = {\n type: mask.type,\n w: finalW,\n h: finalH,\n data: new Uint8Array(finalW * finalH),\n } as T\n\n // Calculate the total height of the source mask based on the buffer size\n const srcH = mask.h\n const stride = mask.w\n\n for (let row = 0; row < finalH; row++) {\n const currentSrcY = finalY + row\n\n // Safety Check: If the requested row is outside the source mask, skip it (leave as 0)\n if (currentSrcY < 0 || currentSrcY >= srcH) continue\n\n // Calculate valid horizontal range within the source stride\n // We only copy if srcX is within the actual bounds of the source width\n const start = Math.max(0, finalX)\n const end = Math.min(stride, finalX + finalW)\n\n if (start < end) {\n const srcOffset = currentSrcY * stride + start\n const dstOffset = row * finalW + (start - finalX)\n const count = end - start\n\n out.data.set(mask.data.subarray(srcOffset, srcOffset + count), dstOffset)\n }\n }\n\n return out\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 data = dst.data\n const len = data.length\n\n for (let i = 0; i < len; i++) {\n data[i] = data[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 data = dst.data\n const len = data.length\n\n for (let i = 0; i < len; i++) {\n data[i] = 255 - data[i]\n }\n}\n","import type { MergeAlphaMasksOptions } from '../_types'\nimport type { AlphaMask } from './_mask-types'\n\n/**\n * Merges 2 alpha masks values are 0-255\n */\nexport function mergeAlphaMasks(\n dst: AlphaMask,\n src: AlphaMask,\n opts: MergeAlphaMasksOptions,\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 mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n if (width <= 0) return\n if (height <= 0) return\n if (globalAlpha === 0) return\n\n const dstData = dst.data\n const srcData = src.data\n const srcWidth = src.w\n const dstWidth = dst.w\n\n const startX = Math.max(0, -targetX, -mx)\n const startY = Math.max(0, -targetY, -my)\n\n const endX = Math.min(width, dstWidth - targetX, srcWidth - mx)\n const endY = Math.min(height, dst.h - targetY, src.h - my)\n\n if (startX >= endX) return\n if (startY >= endY) return\n\n for (let iy = startY; iy < endY; iy++) {\n const dy = targetY + iy\n const sy = my + iy\n\n let dIdx = dy * dstWidth + targetX + startX\n let sIdx = sy * srcWidth + mx + startX\n\n for (let ix = startX; ix < endX; ix++) {\n const rawM = srcData[sIdx]\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - rawM : rawM\n\n let weight = 0\n\n if (effectiveM === 0) {\n weight = 0\n } else if (effectiveM === 255) {\n weight = globalAlpha\n } else if (globalAlpha === 255) {\n weight = effectiveM\n } else {\n const t = effectiveM * globalAlpha + 128\n weight = (t + (t >> 8)) >> 8\n }\n\n if (weight !== 255) {\n if (weight === 0) {\n dstData[dIdx] = 0\n } else {\n const da = dstData[dIdx]\n\n if (da === 255) {\n dstData[dIdx] = weight\n } else if (da !== 0) {\n const t = da * weight + 128\n dstData[dIdx] = (t + (t >> 8)) >> 8\n }\n }\n }\n\n sIdx++\n dIdx++\n }\n }\n}\n","import type { MergeAlphaMasksOptions } from '../_types'\nimport type { BinaryMask } from './_mask-types'\n\nexport function mergeBinaryMasks(\n dst: BinaryMask,\n src: BinaryMask,\n opts: MergeAlphaMasksOptions,\n): void {\n const {\n x: targetX = 0,\n y: targetY = 0,\n w: width = 0,\n h: height = 0,\n mx = 0,\n my = 0,\n invertMask = false,\n } = opts\n\n const dstData = dst.data\n const srcData = src.data\n const srcWidth = src.w\n const dstWidth = dst.w\n\n if (dstWidth <= 0) return\n if (srcWidth <= 0) return\n\n // 1. Destination Clipping\n let x = targetX\n let y = targetY\n let w = width\n let h = height\n\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 w = Math.min(w, dstWidth - x)\n h = Math.min(h, dst.h - y)\n\n if (w <= 0) return\n if (h <= 0) return\n\n // 2. Source Bounds Clipping (Double Clipping)\n const startX = mx + (x - targetX)\n const startY = my + (y - targetY)\n\n const sX0 = Math.max(0, startX)\n const sY0 = Math.max(0, startY)\n const sX1 = Math.min(srcWidth, startX + w)\n const sY1 = Math.min(src.h, startY + h)\n\n const finalW = sX1 - sX0\n const finalH = sY1 - sY0\n\n if (finalW <= 0) return\n if (finalH <= 0) return\n\n // 3. Coordinate Alignment\n const xShift = sX0 - startX\n const yShift = sY0 - startY\n\n const dStride = dstWidth - finalW\n const sStride = srcWidth - finalW\n\n let dIdx = (y + yShift) * dstWidth + (x + xShift)\n let sIdx = sY0 * srcWidth + sX0\n\n for (let iy = 0; iy < finalH; iy++) {\n for (let ix = 0; ix < finalW; ix++) {\n const mVal = srcData[sIdx]\n // Determine if the source pixel effectively \"clears\" the destination\n const isMaskedOut = invertMask ? mVal !== 0 : mVal === 0\n\n if (isMaskedOut) {\n dstData[dIdx] = 0\n }\n\n dIdx++\n sIdx++\n }\n\n dIdx += dStride\n sIdx += sStride\n }\n}\n","import type { Mask } from './_mask-types'\n\nexport function setMaskData(mask: Mask, width: number, height: number, data: Uint8Array): void {\n ;(mask as any).w = width\n ;(mask as any).h = height\n ;(mask as any).data = data\n}\n","import type { Rect } from './_rect-types'\n\nexport function getRectsBounds<T extends Rect>(rects: T[]): T {\n if (rects.length === 1) return { ...rects[0] }\n let minX = Infinity, minY = Infinity\n let maxX = -Infinity, maxY = -Infinity\n\n for (let i = 0; i < rects.length; i++) {\n const r = rects[i]\n const x1 = r.x\n const y1 = r.y\n const x2 = x1 + r.w\n const y2 = y1 + r.h\n\n if (x1 < minX) minX = x1\n if (y1 < minY) minY = y1\n if (x2 > maxX) maxX = x2\n if (y2 > maxY) maxY = y2\n }\n\n return { x: minX, y: minY, w: maxX - minX, h: maxY - minY } as T\n}\n","import { MaskType, type NullableBinaryMaskRect } from '../Mask/_mask-types'\nimport { getRectsBounds } from '../Rect/getRectsBounds'\n\nexport function merge2BinaryMaskRects(\n a: NullableBinaryMaskRect,\n b: NullableBinaryMaskRect,\n): NullableBinaryMaskRect {\n const bounds = getRectsBounds([a, b])\n\n // If both are fully selected, check if they form a perfect, gapless rectangle\n if (\n (a.data === null || a.data === undefined)\n && (b.data === null || b.data === undefined)\n ) {\n const ix = Math.max(a.x, b.x)\n const iy = Math.max(a.y, b.y)\n const ir = Math.min(a.x + a.w, b.x + b.w)\n const ib = Math.min(a.y + a.h, b.y + b.h)\n\n const iw = Math.max(0, ir - ix)\n const ih = Math.max(0, ib - iy)\n\n const intersectionArea = iw * ih\n const areaA = a.w * a.h\n const areaB = b.w * b.h\n const boundsArea = bounds.w * bounds.h\n\n if (boundsArea === areaA + areaB - intersectionArea) {\n return {\n ...bounds,\n data: null,\n type: null,\n }\n }\n }\n\n const maskData = new Uint8Array(bounds.w * bounds.h)\n\n // --- Write A's contribution ---\n const aOffY = a.y - bounds.y\n const aOffX = a.x - bounds.x\n\n if (a.data === undefined || a.data === null) {\n for (let ay = 0; ay < a.h; ay++) {\n const destRow = (aOffY + ay) * bounds.w + aOffX\n maskData.fill(1, destRow, destRow + a.w)\n }\n } else {\n for (let ay = 0; ay < a.h; ay++) {\n const srcRow = ay * a.w\n const destRow = (aOffY + ay) * bounds.w + aOffX\n maskData.set(a.data.subarray(srcRow, srcRow + a.w), destRow)\n }\n }\n\n // --- OR B's contribution ---\n const bOffY = b.y - bounds.y\n const bOffX = b.x - bounds.x\n\n if (b.data === undefined || b.data === null) {\n for (let by = 0; by < b.h; by++) {\n const destRow = (bOffY + by) * bounds.w + bOffX\n maskData.fill(1, destRow, destRow + b.w)\n }\n } else {\n for (let by = 0; by < b.h; by++) {\n const srcRow = by * b.w\n const destRow = (bOffY + by) * bounds.w + bOffX\n\n for (let bx = 0; bx < b.w; bx++) {\n maskData[destRow + bx] |= b.data[srcRow + bx]\n }\n }\n }\n\n return {\n ...bounds,\n data: maskData,\n type: MaskType.BINARY,\n }\n}\n","import type { NullableBinaryMaskRect } from '../Mask/_mask-types'\nimport { merge2BinaryMaskRects } from './merge2BinaryMaskRects'\n\nexport function mergeBinaryMaskRects(current: NullableBinaryMaskRect[], adding: NullableBinaryMaskRect[]): NullableBinaryMaskRect[] {\n const rects = [...current, ...adding]\n\n let changed = true\n while (changed) {\n changed = false\n const next: NullableBinaryMaskRect[] = []\n\n for (const r of rects) {\n let merged = false\n\n for (let i = 0; i < next.length; i++) {\n const n = next[i]\n\n const overlap =\n r.x <= n.x + n.w &&\n r.x + r.w >= n.x &&\n r.y <= n.y + n.h &&\n r.y + r.h >= n.y\n\n if (overlap) {\n next[i] = merge2BinaryMaskRects(n, r)\n merged = true\n changed = true\n break\n }\n }\n\n if (!merged) next.push(r)\n }\n\n rects.splice(0, rects.length, ...next)\n }\n\n return rects\n}\n","import { MaskType, type NullableBinaryMaskRect } from '../Mask/_mask-types'\n\nexport function subtractBinaryMaskRects(\n current: NullableBinaryMaskRect[],\n subtracting: NullableBinaryMaskRect[],\n): NullableBinaryMaskRect[] {\n let result = [...current]\n\n for (const sub of subtracting) {\n const next: NullableBinaryMaskRect[] = []\n\n for (const r of result) {\n const ix = Math.max(r.x, sub.x)\n const iy = Math.max(r.y, sub.y)\n const ix2 = Math.min(r.x + r.w, sub.x + sub.w)\n const iy2 = Math.min(r.y + r.h, sub.y + sub.h)\n\n if (ix >= ix2 || iy >= iy2) {\n next.push(r)\n continue\n }\n\n // Split r into up to 4 pieces around the intersection.\n // Extract directly from r.mask — no intermediate copy, no mutation.\n //\n // ┌──────────────┐\n // │ TOP │ r.y .. iy (full width)\n // ├────┬─────┬───┤\n // │LEFT│ sub │RGT│ iy .. iy2 (side strips)\n // ├────┴─────┴───┤\n // │ BOTTOM │ iy2 .. r.y+r.h (full width)\n // └──────────────┘\n\n if (r.y < iy) pushPiece(next, r, r.x, r.y, r.w, iy - r.y)\n if (iy2 < r.y + r.h) pushPiece(next, r, r.x, iy2, r.w, r.y + r.h - iy2)\n if (r.x < ix) pushPiece(next, r, r.x, iy, ix - r.x, iy2 - iy)\n if (ix2 < r.x + r.w) pushPiece(next, r, ix2, iy, r.x + r.w - ix2, iy2 - iy)\n }\n\n result = next\n }\n\n return result\n}\n\n/**\n * Extract sub-region (x, y, w, h) in global coords from r's mask and push\n * onto dest. If r.mask is null (fully selected) the piece is also null —\n * zero allocations on the happy path.\n */\nfunction pushPiece(\n dest: NullableBinaryMaskRect[],\n r: NullableBinaryMaskRect,\n x: number,\n y: number,\n w: number,\n h: number,\n): void {\n if (r.data === null || r.data === undefined) {\n dest.push({ x, y, w, h, data: null, type: null })\n return\n }\n\n // Coords local to r.mask\n const lx = x - r.x\n const ly = y - r.y\n\n const data = new Uint8Array(w * h)\n for (let row = 0; row < h; row++) {\n data.set(\n r.data.subarray(\n (ly + row) * r.w + lx,\n (ly + row) * r.w + lx + w,\n ),\n row * w,\n )\n }\n\n dest.push({ x, y, w, h, data, type: MaskType.BINARY })\n}\n","import type { AlphaMask, BinaryMask } from '../Mask/_mask-types'\n\nexport enum PaintMaskOutline {\n MASKED,\n CIRCLE,\n RECT,\n}\n\ninterface BasePaintMask<T extends PaintMaskOutline = PaintMaskOutline> {\n readonly outlineType: T\n readonly centerOffsetX: number\n readonly centerOffsetY: number\n}\n\nexport interface PaintAlphaMask<T extends PaintMaskOutline = PaintMaskOutline> extends BasePaintMask<T>, AlphaMask {\n}\n\nexport interface PaintBinaryMask<T extends PaintMaskOutline = PaintMaskOutline> extends BasePaintMask<T>, BinaryMask {\n}\n\nexport type PaintMask = PaintAlphaMask<any> | PaintBinaryMask<any>\n\nexport type PaintBrush = PaintMask | PaintRect\n\nexport interface PaintRect {\n type: null,\n readonly outlineType: PaintMaskOutline.RECT\n w: number,\n h: number,\n centerOffsetX: number,\n centerOffsetY: number,\n data: null,\n}\n","import type { Rect } from './_rect-types'\n\nexport function trimRectBounds(\n x: number,\n y: number,\n w: number,\n h: number,\n targetWidth: number,\n targetHeight: number,\n out?: Rect,\n): Rect {\n const res = out ?? {\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n }\n\n const left = Math.max(0, x)\n const top = Math.max(0, y)\n const right = Math.min(targetWidth, x + w)\n const bottom = Math.min(targetHeight, y + h)\n\n res.x = left\n res.y = top\n res.w = Math.max(0, right - left)\n res.h = Math.max(0, bottom - top)\n\n return res\n}\n","import { MaskType } from '../Mask/_mask-types'\nimport { type AlphaMaskTile, type BinaryMaskTile, type TileFactory, TileType } from './_tile-types'\n\nexport const makeAlphaMaskTile: TileFactory<AlphaMaskTile> = (\n id: number,\n tx: number,\n ty: number,\n tileSize: number,\n tileArea: number,\n) => {\n return {\n tileType: TileType.MASK,\n type: MaskType.ALPHA,\n data: new Uint8Array(tileArea),\n w: tileSize,\n h: tileSize,\n x: tx * tileSize,\n y: ty * tileSize,\n id,\n tx,\n ty,\n }\n}\n\nexport const makeBinaryMaskTile: TileFactory<BinaryMaskTile> = (\n id: number,\n tx: number,\n ty: number,\n tileSize: number,\n tileArea: number,\n) => {\n return {\n tileType: TileType.MASK,\n type: MaskType.BINARY,\n data: new Uint8Array(tileArea),\n w: tileSize,\n h: tileSize,\n x: tx * tileSize,\n y: ty * tileSize,\n id,\n tx,\n ty,\n }\n}\n","import type { Rect } from '../Rect/_rect-types'\nimport type { Tile, TileTargetMeta } from '../Tile/_tile-types'\nimport type { TilePool } from '../Tile/TilePool'\n\nexport function eachTileInBounds<T extends Tile>(\n config: TileTargetMeta,\n lookup: (T | undefined)[],\n tilePool: TilePool<T>,\n bounds: Rect,\n callback: (tile: T, bX: number, bY: number, bW: number, bH: number) => void,\n): void {\n const { targetRows, targetColumns, tileSize } = config\n\n const x1 = Math.max(0, Math.floor(bounds.x / tileSize))\n const y1 = Math.max(0, Math.floor(bounds.y / tileSize))\n const x2 = Math.min(targetColumns - 1, Math.floor((bounds.x + bounds.w - 1) / tileSize))\n const y2 = Math.min(targetRows - 1, Math.floor((bounds.y + bounds.h - 1) / tileSize))\n\n if (x1 > x2 || y1 > y2) return\n\n for (let ty = y1; ty <= y2; ty++) {\n const rowOffset = ty * targetColumns\n const tileTop = ty * tileSize\n\n for (let tx = x1; tx <= x2; tx++) {\n const id = rowOffset + tx\n const tile = lookup[id] ?? (lookup[id] = tilePool.getTile(id, tx, ty))\n const tileLeft = tx * tileSize\n\n const startX = bounds.x > tileLeft ? bounds.x : tileLeft\n const startY = bounds.y > tileTop ? bounds.y : tileTop\n\n const maskEndX = bounds.x + bounds.w\n const tileEndX = tileLeft + tileSize\n const endX = maskEndX < tileEndX ? maskEndX : tileEndX\n\n const maskEndY = bounds.y + bounds.h\n const tileEndY = tileTop + tileSize\n const endY = maskEndY < tileEndY ? maskEndY : tileEndY\n\n callback(tile, startX, startY, endX - startX, endY - startY)\n }\n }\n}\n","import { forEachLinePoint } from '../Algorithm/forEachLinePoint'\nimport type { Rect } from '../Rect/_rect-types'\nimport { trimRectBounds } from '../Rect/trimRectBounds'\nimport type { AlphaMaskTile, TileTargetMeta } from '../Tile/_tile-types'\nimport { makeAlphaMaskTile } from '../Tile/MaskTile'\nimport { TilePool } from '../Tile/TilePool'\nimport type { PaintAlphaMask, PaintBinaryMask, PaintRect } from './_paint-types'\nimport { eachTileInBounds } from './eachTileInBounds'\n\nexport class AlphaMaskPaintBuffer {\n readonly lookup: (AlphaMaskTile | undefined)[]\n private readonly scratchBounds: Rect = { x: 0, y: 0, w: 0, h: 0 }\n\n private forEachLinePointFn = forEachLinePoint\n private trimRectBoundsFn = trimRectBounds\n private eachTileInBoundsFn = eachTileInBounds\n\n constructor(\n readonly config: TileTargetMeta,\n readonly tilePool: TilePool<AlphaMaskTile> = new TilePool(config.tileSize, makeAlphaMaskTile),\n ) {\n this.lookup = []\n }\n\n paintAlphaMask(\n brush: PaintAlphaMask,\n x: number,\n y: number,\n ): boolean\n paintAlphaMask(\n brush: PaintAlphaMask,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintAlphaMask(\n brush: PaintAlphaMask,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n const tileSize = config.tileSize\n\n const { w: bW, h: bH, data: bD, centerOffsetX, centerOffsetY } = brush\n\n let changed = false\n\n const eachTileInBoundsFn = this.eachTileInBoundsFn\n const trimRectBoundsFn = this.trimRectBoundsFn\n\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n trimRectBoundsFn(\n topLeftX,\n topLeftY,\n bW,\n bH,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const bOff = (canvasY - topLeftY) * bW\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j\n const brushA = bD[bOff + (canvasX - topLeftX)]\n if (brushA === 0) continue\n const idx = dS + j\n\n // Only overwrite if the brush stroke is stronger than the existing mask pixel\n if (brushA > data[idx]) {\n data[idx] = brushA\n tileChanged = true\n }\n }\n }\n if (tileChanged) changed = true\n })\n })\n return changed\n }\n\n paintBinaryMask(\n brush: PaintBinaryMask,\n alpha: number,\n x: number,\n y: number,\n ): boolean\n paintBinaryMask(\n brush: PaintBinaryMask,\n alpha: number,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintBinaryMask(\n brush: PaintBinaryMask,\n alpha: number,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n if (alpha === 0) return false\n\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n const tileSize = config.tileSize\n\n const { w: bW, h: bH, data: bD, centerOffsetX, centerOffsetY } = brush\n let changed = false\n\n const trimRectBoundsFn = this.trimRectBoundsFn\n const eachTileInBoundsFn = this.eachTileInBoundsFn\n\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n\n trimRectBoundsFn(\n topLeftX,\n topLeftY,\n bW,\n bH,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const bOff = (canvasY - topLeftY) * bW\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j\n if (data[idx] < alpha) {\n data[idx] = alpha\n tileChanged = true\n }\n }\n }\n }\n if (tileChanged) changed = true\n })\n })\n\n return changed\n }\n\n paintRect(\n alpha: number,\n brush: PaintRect,\n x: number,\n y: number,\n ): boolean\n paintRect(\n alpha: number,\n brush: PaintRect,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintRect(\n alpha: number,\n brush: PaintRect,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n const tileSize = config.tileSize\n\n const brushWidth = brush.w\n const brushHeight = brush.h\n const centerOffsetX = brush.centerOffsetX\n const centerOffsetY = brush.centerOffsetY\n\n const trimRectBoundsFn = this.trimRectBoundsFn\n const eachTileInBoundsFn = this.eachTileInBoundsFn\n\n let changed = false\n this.forEachLinePointFn(\n x0,\n y0,\n x1,\n y1,\n (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n\n trimRectBoundsFn(\n topLeftX,\n topLeftY,\n brushWidth,\n brushHeight,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j\n\n // If the new alpha is stronger than the current alpha, overwrite it\n if (alpha > data[idx]) {\n data[idx] = alpha\n tileChanged = true\n }\n }\n }\n\n if (tileChanged) {\n changed = true\n }\n },\n )\n },\n )\n\n return changed\n }\n\n clear(): void {\n this.tilePool.releaseTiles(this.lookup)\n }\n}\n","import { forEachLinePoint } from '../Algorithm/forEachLinePoint'\nimport type { Rect } from '../Rect/_rect-types'\nimport { trimRectBounds } from '../Rect/trimRectBounds'\nimport type { BinaryMaskTile, TileTargetMeta } from '../Tile/_tile-types'\nimport { makeBinaryMaskTile } from '../Tile/MaskTile'\nimport { TilePool } from '../Tile/TilePool'\nimport type { PaintBinaryMask, PaintRect } from './_paint-types'\nimport { eachTileInBounds } from './eachTileInBounds'\n\nexport class BinaryMaskPaintBuffer {\n readonly lookup: (BinaryMaskTile | undefined)[]\n private readonly scratchBounds: Rect = { x: 0, y: 0, w: 0, h: 0 }\n\n private forEachLinePointFn = forEachLinePoint\n private trimRectBoundsFn = trimRectBounds\n private eachTileInBoundsFn = eachTileInBounds\n\n constructor(\n readonly config: TileTargetMeta,\n readonly tilePool: TilePool<BinaryMaskTile> = new TilePool(config.tileSize, makeBinaryMaskTile),\n ) {\n this.lookup = []\n }\n\n paintBinaryMask(\n brush: PaintBinaryMask,\n x: number,\n y: number,\n ): boolean\n paintBinaryMask(\n brush: PaintBinaryMask,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintBinaryMask(\n brush: PaintBinaryMask,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n const tileSize = config.tileSize\n\n const { w: bW, h: bH, data: bD, centerOffsetX, centerOffsetY } = brush\n let changed = false\n\n const trimRectBoundsFn = this.trimRectBoundsFn\n const eachTileInBoundsFn = this.eachTileInBoundsFn\n\n this.forEachLinePointFn(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n\n trimRectBoundsFn(\n topLeftX,\n topLeftY,\n bW,\n bH,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const bOff = (canvasY - topLeftY) * bW\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j\n\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j\n\n // Only write if it's not already \"on\"\n if (data[idx] === 0) {\n data[idx] = 1\n tileChanged = true\n }\n }\n }\n }\n if (tileChanged) changed = true\n })\n })\n\n return changed\n }\n\n paintRect(\n brush: PaintRect,\n x: number,\n y: number,\n ): boolean\n paintRect(\n brush: PaintRect,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintRect(\n brush: PaintRect,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n const tileSize = config.tileSize\n\n const brushWidth = brush.w\n const brushHeight = brush.h\n const centerOffsetX = brush.centerOffsetX\n const centerOffsetY = brush.centerOffsetY\n\n const trimRectBoundsFn = this.trimRectBoundsFn\n const eachTileInBoundsFn = this.eachTileInBoundsFn\n\n let changed = false\n this.forEachLinePointFn(\n x0,\n y0,\n x1,\n y1,\n (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n\n trimRectBoundsFn(\n topLeftX,\n topLeftY,\n brushWidth,\n brushHeight,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBoundsFn(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const data = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j\n\n // Only write if it's not already \"on\"\n if (data[idx] === 0) {\n data[idx] = 1\n tileChanged = true\n }\n }\n }\n\n if (tileChanged) {\n changed = true\n }\n },\n )\n },\n )\n\n return changed\n }\n\n clear(): void {\n this.tilePool.releaseTiles(this.lookup)\n }\n}\n","import { forEachLinePoint } from '../Algorithm/forEachLinePoint'\nimport type { Color32 } from '../Color/_color-types'\nimport type { Rect } from '../Rect/_rect-types'\nimport { trimRectBounds } from '../Rect/trimRectBounds'\nimport type { PixelTile, TileTargetMeta } from '../Tile/_tile-types'\nimport type { TilePool } from '../Tile/TilePool'\nimport type { PaintAlphaMask, PaintBinaryMask, PaintRect } from './_paint-types'\nimport { eachTileInBounds } from './eachTileInBounds'\n\nexport class ColorPaintBuffer {\n readonly lookup: (PixelTile | undefined)[]\n private readonly scratchBounds: Rect = { x: 0, y: 0, w: 0, h: 0 }\n\n constructor(\n readonly config: TileTargetMeta,\n readonly tilePool: TilePool<PixelTile>,\n ) {\n this.lookup = []\n }\n\n paintAlphaMask(\n color: Color32,\n brush: PaintAlphaMask,\n x: number,\n y: number,\n ): boolean\n paintAlphaMask(\n color: Color32,\n brush: PaintAlphaMask,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintAlphaMask(\n color: Color32,\n brush: PaintAlphaMask,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n const cA = color >>> 24\n if (cA === 0) return false\n\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const tileSize = config.tileSize\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n\n const { w: bW, h: bH, data: bD, centerOffsetX, centerOffsetY } = brush\n const cRGB = color & 0x00ffffff\n\n let changed = false\n\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n trimRectBounds(\n topLeftX,\n topLeftY,\n bW,\n bH,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBounds(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const bOff = (canvasY - topLeftY) * bW\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j\n const brushA = bD[bOff + (canvasX - topLeftX)]\n if (brushA === 0) continue\n\n const t = cA * brushA + 128\n const blendedA = (t + (t >> 8)) >> 8\n\n const idx = dS + j\n const cur = d32[idx]\n if (brushA > (cur >>> 24)) {\n const next = (cRGB | (blendedA << 24)) >>> 0\n if (cur !== next) {\n d32[idx] = next as Color32\n tileChanged = true\n }\n }\n }\n }\n if (tileChanged) changed = true\n })\n })\n return changed\n }\n\n paintBinaryMask(\n color: Color32,\n brush: PaintBinaryMask,\n x: number,\n y: number,\n ): boolean\n paintBinaryMask(\n color: Color32,\n brush: PaintBinaryMask,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintBinaryMask(\n color: Color32,\n brush: PaintBinaryMask,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n const alphaIsZero = (color >>> 24) === 0\n if (alphaIsZero) return false\n\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const tileSize = config.tileSize\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n\n const { w: bW, h: bH, data: bD, centerOffsetX, centerOffsetY } = brush\n let changed = false\n\n forEachLinePoint(x0, y0, x1, y1, (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n\n trimRectBounds(\n topLeftX,\n topLeftY,\n bW,\n bH,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBounds(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const bOff = (canvasY - topLeftY) * bW\n\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const canvasX = bX + j\n if (bD[bOff + (canvasX - topLeftX)]) {\n const idx = dS + j\n if (d32[idx] !== color) {\n d32[idx] = color\n tileChanged = true\n }\n }\n }\n }\n if (tileChanged) changed = true\n })\n })\n\n return changed\n }\n\n paintRect(\n color: Color32,\n brush: PaintRect,\n x: number,\n y: number,\n ): boolean\n paintRect(\n color: Color32,\n brush: PaintRect,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n ): boolean\n paintRect(\n color: Color32,\n brush: PaintRect,\n x0: number,\n y0: number,\n x1: number = x0,\n y1: number = y0,\n ): boolean {\n const alphaIsZero = (color >>> 24) === 0\n if (alphaIsZero) return false\n\n const scratch = this.scratchBounds\n const lookup = this.lookup\n const tilePool = this.tilePool\n const config = this.config\n const targetW = config.targetWidth\n const targetH = config.targetHeight\n const tileSize = config.tileSize\n\n const brushWidth = brush.w\n const brushHeight = brush.h\n const centerOffsetX = brush.centerOffsetX\n const centerOffsetY = brush.centerOffsetY\n\n let changed = false\n\n forEachLinePoint(\n x0,\n y0,\n x1,\n y1,\n (px, py) => {\n const topLeftX = Math.floor(px + centerOffsetX)\n const topLeftY = Math.floor(py + centerOffsetY)\n\n trimRectBounds(\n topLeftX,\n topLeftY,\n brushWidth,\n brushHeight,\n targetW,\n targetH,\n scratch,\n )\n\n if (scratch.w <= 0 || scratch.h <= 0) return\n\n eachTileInBounds(config, lookup, tilePool, scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data\n let tileChanged = false\n\n for (let i = 0; i < bH_t; i++) {\n const canvasY = bY + i\n const tOff = (canvasY - tile.y) * tileSize\n const dS = tOff + (bX - tile.x)\n\n for (let j = 0; j < bW_t; j++) {\n const idx = dS + j\n\n if (d32[idx] !== color) {\n d32[idx] = color\n tileChanged = true\n }\n }\n }\n\n if (tileChanged) {\n changed = true\n }\n })\n })\n\n return changed\n }\n\n clear(): void {\n this.tilePool.releaseTiles(this.lookup)\n }\n}\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../../Color/_color-types'\nimport type { PixelAccumulator } from '../../History/PixelAccumulator'\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask'\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask'\nimport type { AlphaMaskPaintBuffer } from '../AlphaMaskPaintBuffer'\nimport type { BinaryMaskPaintBuffer } from '../BinaryMaskPaintBuffer'\n\nconst SCRATCH_OPTS = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n}\n\nexport function commitMaskPaintBuffer(\n accumulator: PixelAccumulator,\n paintBuffer: BinaryMaskPaintBuffer,\n color: Color32,\n alpha: number | undefined,\n blendFn: typeof sourceOverPerfect | undefined,\n blendColorPixelDataMaskFn: typeof blendColorPixelDataBinaryMask,\n): void\n\nexport function commitMaskPaintBuffer(\n accumulator: PixelAccumulator,\n paintBuffer: AlphaMaskPaintBuffer,\n color: Color32,\n alpha: number | undefined,\n blendFn: typeof sourceOverPerfect | undefined,\n blendColorPixelDataMaskFn: typeof blendColorPixelDataAlphaMask,\n): void\n\nexport function commitMaskPaintBuffer(\n accumulator: PixelAccumulator,\n paintBuffer: any,\n color: Color32,\n alpha = 255,\n blendFn = sourceOverPerfect,\n blendColorPixelDataMaskFn: any,\n) {\n const config = accumulator.config\n const lookup = paintBuffer.lookup\n\n SCRATCH_OPTS.alpha = alpha\n SCRATCH_OPTS.blendFn = blendFn\n\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i]\n\n if (tile) {\n const didChange = accumulator.storeTileBeforeState(tile.id, tile.tx, tile.ty)\n\n SCRATCH_OPTS.x = tile.x\n SCRATCH_OPTS.y = tile.y\n SCRATCH_OPTS.w = tile.w\n SCRATCH_OPTS.h = tile.h\n\n didChange(\n blendColorPixelDataMaskFn(\n config.target,\n color,\n tile,\n SCRATCH_OPTS,\n ),\n )\n }\n }\n\n paintBuffer.clear()\n}\n\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../../Color/_color-types'\nimport type { PixelAccumulator } from '../../History/PixelAccumulator'\nimport { blendColorPixelDataAlphaMask } from '../../PixelData/blendColorPixelDataAlphaMask'\nimport type { AlphaMaskPaintBuffer } from '../AlphaMaskPaintBuffer'\nimport { commitMaskPaintBuffer } from './commitMaskPaintBuffer'\n\nexport function makeAlphaMaskPaintBufferCommitter(\n accumulator: PixelAccumulator,\n paintBuffer: AlphaMaskPaintBuffer,\n) {\n return function commitAlphaMaskPaintBufferToAccumulator(\n color: Color32,\n alpha = 255,\n blendFn = sourceOverPerfect,\n ) {\n return commitMaskPaintBuffer(\n accumulator,\n paintBuffer,\n color,\n alpha,\n blendFn,\n blendColorPixelDataAlphaMask,\n )\n }\n}\n","import type { PixelData } from './_pixelData-types'\nimport { setPixelData } from './PixelData'\n\nexport type ReusablePixelData = ReturnType<typeof makeReusablePixelData>\n\n/**\n * Creates a factory function that manages a single, reusable PixelData instance.\n * This is used to minimize garbage collection overhead by recycling the\n * underlying pixel buffer across multiple operations.\n * @returns A function that takes width and height and returns a pooled PixelData instance.\n */\nexport function makeReusablePixelData() {\n const pixelData = {\n w: 0,\n h: 0,\n data: null as unknown as Uint32Array,\n imageData: null as unknown as ImageData,\n }\n\n /**\n * Retrieves a PixelData instance of the requested dimensions.\n * If the requested dimensions differ from the cached instance, a new one is allocated.\n * @param width - The desired width in pixels.\n * @param height - The desired height in pixels.\n * @returns The cached PixelData object.\n */\n return function getReusablePixelData(width: number, height: number): PixelData {\n if (pixelData.w !== width || pixelData.h !== height) {\n setPixelData(pixelData, new ImageData(width, height))\n } else {\n pixelData.data.fill(0)\n }\n\n return pixelData\n }\n}\n","import type { ReusableCanvasFactory } from '../../Canvas/_canvas-types'\nimport { makeReusableOffscreenCanvas } from '../../Canvas/ReusableCanvas'\nimport type { Color32 } from '../../Color/_color-types'\nimport type { PixelData } from '../../PixelData/_pixelData-types'\nimport { makeReusablePixelData } from '../../PixelData/ReusablePixelData'\nimport type { AlphaMaskTile, TileTargetMeta } from '../../Tile/_tile-types'\nimport type { AlphaMaskPaintBuffer } from '../AlphaMaskPaintBuffer'\n\nexport type AlphaMaskPaintBufferCanvasRenderer = ReturnType<typeof makeAlphaMaskPaintBufferCanvasRenderer>\n\nexport function makeAlphaMaskPaintBufferCanvasRenderer<T extends HTMLCanvasElement | OffscreenCanvas>(\n paintBuffer: AlphaMaskPaintBuffer,\n reusableCanvasFactory?: () => ReusableCanvasFactory<T>,\n) {\n const factory = (reusableCanvasFactory ?? makeReusableOffscreenCanvas) as unknown as () => ReusableCanvasFactory<T>\n const getBuffer = factory()\n const getBridge = makeReusablePixelData()\n\n let config: TileTargetMeta\n let tileSize: number\n let tileArea: number\n let lookup: (AlphaMaskTile | undefined)[]\n let view32: Uint32Array\n let bridge: PixelData\n let canvas: HTMLCanvasElement | OffscreenCanvas\n let ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D\n\n setBuffer(paintBuffer)\n\n function setBuffer(value: AlphaMaskPaintBuffer) {\n paintBuffer = value\n config = paintBuffer.config\n tileSize = config.tileSize\n tileArea = config.tileArea\n lookup = paintBuffer.lookup\n bridge = getBridge(tileSize, tileSize)\n view32 = bridge.data\n const buff = getBuffer(tileSize, tileSize)\n canvas = buff.canvas\n ctx = buff.ctx\n }\n\n function draw(\n targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n color: Color32,\n alpha = 255,\n compOperation: GlobalCompositeOperation = 'source-over',\n ): void {\n if (alpha === 0) return\n\n const baseSrcAlpha = (color >>> 24)\n const colorRGB = color & 0x00ffffff\n\n if (baseSrcAlpha === 0) return\n\n targetCtx.globalAlpha = alpha / 255\n targetCtx.globalCompositeOperation = compOperation\n\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i]\n\n if (tile) {\n const data8 = tile.data\n view32.fill(0)\n\n for (let p = 0; p < tileArea; p++) {\n const maskA = data8[p]\n if (maskA === 0) continue\n\n // If mask is solid, the final pixel is just the unmodified color\n if (maskA === 255) {\n view32[p] = color\n } else {\n // Otherwise, blend the color's inherent alpha with the mask's alpha\n const t = baseSrcAlpha * maskA + 128\n const finalA = (t + (t >> 8)) >> 8\n\n view32[p] = ((colorRGB | (finalA << 24)) >>> 0) as Color32\n }\n }\n\n ctx.putImageData(bridge.imageData, 0, 0)\n targetCtx.drawImage(canvas, tile.x, tile.y)\n }\n }\n\n targetCtx.globalAlpha = 1\n targetCtx.globalCompositeOperation = 'source-over'\n }\n\n return {\n draw,\n setBuffer,\n }\n}\n","import type { ReusableCanvasFactory } from '../../Canvas/_canvas-types'\nimport type { PixelWriter } from '../../History/PixelWriter'\nimport { makeAlphaMaskTile } from '../../Tile/MaskTile'\nimport { TilePool } from '../../Tile/TilePool'\nimport { AlphaMaskPaintBuffer } from '../AlphaMaskPaintBuffer'\nimport { makeAlphaMaskPaintBufferCanvasRenderer } from '../Render/AlphaMaskPaintBufferCanvasRenderer'\nimport { makeAlphaMaskPaintBufferCommitter } from './AlphaMaskPaintBufferCommitter'\n\nexport type AlphaMaskPaintBufferManager =\n Pick<AlphaMaskPaintBuffer, 'paintAlphaMask' | 'paintBinaryMask' | 'paintRect'>\n & {\n commit: ReturnType<typeof makeAlphaMaskPaintBufferCommitter>\n renderer: ReturnType<typeof makeAlphaMaskPaintBufferCanvasRenderer>\n clear: () => void\n}\n\nexport function makeAlphaMaskPaintBufferManager(\n writer: Pick<PixelWriter<any>, 'accumulator' | 'config'>,\n reusableCanvasFactory?: () => ReusableCanvasFactory<any>,\n): AlphaMaskPaintBufferManager {\n const pool = new TilePool(writer.config.tileSize, makeAlphaMaskTile)\n const buffer = new AlphaMaskPaintBuffer(writer.config, pool)\n const renderer = makeAlphaMaskPaintBufferCanvasRenderer(buffer, reusableCanvasFactory)\n\n return {\n clear: buffer.clear.bind(buffer),\n paintRect: buffer.paintRect.bind(buffer),\n paintAlphaMask: buffer.paintAlphaMask.bind(buffer),\n paintBinaryMask: buffer.paintBinaryMask.bind(buffer),\n commit: makeAlphaMaskPaintBufferCommitter(writer.accumulator, buffer),\n renderer,\n }\n}\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../../Color/_color-types'\nimport type { PixelAccumulator } from '../../History/PixelAccumulator'\nimport { blendColorPixelDataBinaryMask } from '../../PixelData/blendColorPixelDataBinaryMask'\nimport type { BinaryMaskPaintBuffer } from '../BinaryMaskPaintBuffer'\nimport { commitMaskPaintBuffer } from './commitMaskPaintBuffer'\n\nexport function makeBinaryMaskPaintBufferCommitter(\n accumulator: PixelAccumulator,\n paintBuffer: BinaryMaskPaintBuffer,\n) {\n return function commitBinaryMaskPaintBufferToAccumulator(\n color: Color32,\n alpha = 255,\n blendFn = sourceOverPerfect,\n ) {\n return commitMaskPaintBuffer(\n accumulator,\n paintBuffer,\n color,\n alpha,\n blendFn,\n blendColorPixelDataBinaryMask,\n )\n }\n}\n","import type { ReusableCanvasFactory } from '../../Canvas/_canvas-types'\nimport { makeReusableOffscreenCanvas } from '../../Canvas/ReusableCanvas'\nimport type { Color32 } from '../../Color/_color-types'\nimport type { PixelData } from '../../PixelData/_pixelData-types'\nimport { makeReusablePixelData } from '../../PixelData/ReusablePixelData'\nimport type { BinaryMaskTile, TileTargetMeta } from '../../Tile/_tile-types'\nimport type { BinaryMaskPaintBuffer } from '../BinaryMaskPaintBuffer'\n\nexport type BinaryMaskPaintBufferCanvasRenderer = ReturnType<typeof makeBinaryMaskPaintBufferCanvasRenderer>\n\nexport function makeBinaryMaskPaintBufferCanvasRenderer<T extends HTMLCanvasElement | OffscreenCanvas>(\n paintBuffer: BinaryMaskPaintBuffer,\n reusableCanvasFactory?: () => ReusableCanvasFactory<T>,\n) {\n const factory = (reusableCanvasFactory ?? makeReusableOffscreenCanvas) as unknown as () => ReusableCanvasFactory<T>\n const getBuffer = factory()\n const getBridge = makeReusablePixelData()\n\n let config: TileTargetMeta\n let tileSize: number\n let tileArea: number\n let lookup: (BinaryMaskTile | undefined)[]\n let view32: Uint32Array\n let bridge: PixelData\n let canvas: HTMLCanvasElement | OffscreenCanvas\n let ctx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D\n\n setBuffer(paintBuffer)\n\n function setBuffer(value: BinaryMaskPaintBuffer) {\n paintBuffer = value\n config = paintBuffer.config\n tileSize = config.tileSize\n tileArea = config.tileArea\n lookup = paintBuffer.lookup\n bridge = getBridge(tileSize, tileSize)\n view32 = bridge.data\n const buff = getBuffer(tileSize, tileSize)\n canvas = buff.canvas\n ctx = buff.ctx\n }\n\n function draw(\n targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n color: Color32,\n alpha = 255,\n compOperation: GlobalCompositeOperation = 'source-over',\n ): void {\n if (alpha === 0) return\n\n const baseSrcAlpha = (color >>> 24)\n if (baseSrcAlpha === 0) return\n\n targetCtx.globalAlpha = alpha / 255\n targetCtx.globalCompositeOperation = compOperation\n\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i]\n\n if (tile) {\n const data8 = tile.data\n view32.fill(0)\n\n for (let p = 0; p < tileArea; p++) {\n if (data8[p] === 1) {\n view32[p] = color\n }\n }\n\n ctx.putImageData(bridge.imageData, 0, 0)\n targetCtx.drawImage(canvas, tile.x, tile.y)\n }\n }\n\n targetCtx.globalAlpha = 1\n targetCtx.globalCompositeOperation = 'source-over'\n }\n\n return {\n draw,\n setBuffer,\n }\n}\n","import type { ReusableCanvasFactory } from '../../Canvas/_canvas-types'\nimport type { PixelWriter } from '../../History/PixelWriter'\nimport { makeBinaryMaskTile } from '../../Tile/MaskTile'\nimport { TilePool } from '../../Tile/TilePool'\nimport { BinaryMaskPaintBuffer } from '../BinaryMaskPaintBuffer'\nimport { makeBinaryMaskPaintBufferCanvasRenderer } from '../Render/BinaryMaskPaintBufferCanvasRenderer'\nimport { makeBinaryMaskPaintBufferCommitter } from './BinaryMaskPaintBufferCommitter'\n\nexport type BinaryMaskPaintBufferManager = Pick<BinaryMaskPaintBuffer, 'paintBinaryMask' | 'paintRect'> & {\n commit: ReturnType<typeof makeBinaryMaskPaintBufferCommitter>\n renderer: ReturnType<typeof makeBinaryMaskPaintBufferCanvasRenderer>\n clear: () => void\n}\n\nexport function makeBinaryMaskPaintBufferManager(\n writer: Pick<PixelWriter<any>, 'accumulator' | 'config'>,\n reusableCanvasFactory?: () => ReusableCanvasFactory<any>,\n): BinaryMaskPaintBufferManager {\n const pool = new TilePool(writer.config.tileSize, makeBinaryMaskTile)\n const buffer = new BinaryMaskPaintBuffer(writer.config, pool)\n const renderer = makeBinaryMaskPaintBufferCanvasRenderer(buffer, reusableCanvasFactory)\n\n return {\n clear: buffer.clear.bind(buffer),\n paintRect: buffer.paintRect.bind(buffer),\n paintBinaryMask: buffer.paintBinaryMask.bind(buffer),\n commit: makeBinaryMaskPaintBufferCommitter(writer.accumulator, buffer),\n renderer,\n }\n}\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { PixelAccumulator } from '../../History/PixelAccumulator'\nimport { blendPixelData } from '../../PixelData/blendPixelData'\nimport type { ColorPaintBuffer } from '../ColorPaintBuffer'\n\nconst SCRATCH_OPTS = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n}\n\nexport function commitColorPaintBuffer(\n accumulator: PixelAccumulator,\n paintBuffer: ColorPaintBuffer,\n alpha = 255,\n blendFn = sourceOverPerfect,\n blendPixelDataFn = blendPixelData,\n) {\n const config = accumulator.config\n const lookup = paintBuffer.lookup\n\n SCRATCH_OPTS.alpha = alpha\n SCRATCH_OPTS.blendFn = blendFn\n\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i]\n\n if (tile) {\n const didChange = accumulator.storeTileBeforeState(tile.id, tile.tx, tile.ty)\n\n SCRATCH_OPTS.x = tile.x\n SCRATCH_OPTS.y = tile.y\n SCRATCH_OPTS.w = tile.w\n SCRATCH_OPTS.h = tile.h\n\n didChange(\n blendPixelDataFn(\n config.target,\n tile,\n SCRATCH_OPTS,\n ),\n )\n }\n }\n\n paintBuffer.clear()\n}\n\n","import { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect'\nimport type { PixelAccumulator } from '../../History/PixelAccumulator'\nimport { blendPixelData } from '../../PixelData/blendPixelData'\nimport type { ColorPaintBuffer } from '../ColorPaintBuffer'\nimport { commitColorPaintBuffer } from './commitColorPaintBuffer'\n\nexport function makeColorPaintBufferCommitter(\n accumulator: PixelAccumulator,\n paintBuffer: ColorPaintBuffer,\n) {\n return function commitColorPaintBufferToAccumulator(\n alpha = 255,\n blendFn = sourceOverPerfect,\n ) {\n return commitColorPaintBuffer(\n accumulator,\n paintBuffer,\n alpha,\n blendFn,\n blendPixelData,\n )\n }\n}\n","import type { ReusableCanvasFactory } from '../../Canvas/_canvas-types'\nimport { makeReusableOffscreenCanvas } from '../../Canvas/ReusableCanvas'\nimport type { ColorPaintBuffer } from '../ColorPaintBuffer'\n\nexport type ColorPaintBufferCanvasRenderer = ReturnType<typeof makeColorPaintBufferCanvasRenderer>\n\nexport function makeColorPaintBufferCanvasRenderer<T extends HTMLCanvasElement | OffscreenCanvas>(\n paintBuffer: ColorPaintBuffer,\n reusableCanvasFactory?: () => ReusableCanvasFactory<T>,\n) {\n const factory = (reusableCanvasFactory ?? makeReusableOffscreenCanvas) as unknown as () => ReusableCanvasFactory<T>\n const getBuffer = factory()\n\n function draw(\n targetCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n alpha = 255,\n compOperation: GlobalCompositeOperation = 'source-over',\n ): void {\n const buff = getBuffer(paintBuffer.config.tileSize, paintBuffer.config.tileSize)\n const lookup = paintBuffer.lookup\n const length = lookup.length\n const ctx = buff.ctx\n const canvas = buff.canvas\n\n targetCtx.globalAlpha = alpha / 255\n targetCtx.globalCompositeOperation = compOperation\n\n for (let i = 0; i < length; i++) {\n const tile = lookup[i]\n\n if (tile) {\n ctx.putImageData(tile.imageData, 0, 0)\n targetCtx.drawImage(canvas, tile.x, tile.y)\n }\n }\n\n targetCtx.globalAlpha = 1\n targetCtx.globalCompositeOperation = 'source-over'\n }\n\n return {\n draw,\n setBuffer(value: ColorPaintBuffer) {\n paintBuffer = value\n },\n }\n}\n","import type { ReusableCanvasFactory } from '../../Canvas/_canvas-types'\nimport type { PixelWriter } from '../../History/PixelWriter'\nimport { makePixelTile } from '../../Tile/PixelTile'\nimport { TilePool } from '../../Tile/TilePool'\nimport { ColorPaintBuffer } from '../ColorPaintBuffer'\nimport { makeColorPaintBufferCanvasRenderer } from '../Render/ColorPaintBufferCanvasRenderer'\nimport { makeColorPaintBufferCommitter } from './ColorPaintBufferCommitter'\n\nexport type ColorPaintBufferManager =\n Pick<ColorPaintBuffer, 'paintAlphaMask' | 'paintBinaryMask' | 'paintRect'>\n & {\n commit: ReturnType<typeof makeColorPaintBufferCommitter>\n renderer: ReturnType<typeof makeColorPaintBufferCanvasRenderer>\n clear: () => void\n}\n\nexport function makeColorPaintBufferManager(\n writer: Pick<PixelWriter<any>, 'accumulator' | 'config'>,\n reusableCanvasFactory?: () => ReusableCanvasFactory<any>,\n): ColorPaintBufferManager {\n const pool = new TilePool(writer.config.tileSize, makePixelTile)\n const buffer = new ColorPaintBuffer(writer.config, pool)\n const renderer = makeColorPaintBufferCanvasRenderer(buffer, reusableCanvasFactory)\n\n return {\n clear: buffer.clear.bind(buffer),\n paintRect: buffer.paintRect.bind(buffer),\n paintAlphaMask: buffer.paintAlphaMask.bind(buffer),\n paintBinaryMask: buffer.paintBinaryMask.bind(buffer),\n commit: makeColorPaintBufferCommitter(writer.accumulator, buffer),\n renderer,\n }\n}\n","import { _macro_paintCircleCenterOffset } from '../Internal/macros'\nimport { MaskType } from '../Mask/_mask-types'\nimport { type PaintAlphaMask, type PaintBinaryMask, PaintMaskOutline } from './_paint-types'\n\nexport function makeCirclePaintAlphaMask(size: number, fallOff: (d: number) => number = (d) => d): PaintAlphaMask {\n const area = size * size\n const data = new Uint8Array(area)\n const radius = size / 2\n const invR = 1 / radius\n\n const centerOffset = _macro_paintCircleCenterOffset(radius)\n\n for (let y = 0; y < size; y++) {\n const rowOffset = y * size\n const dy = y - radius + 0.5\n const dy2 = dy * dy\n\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5\n const distSqr = dx * dx + dy2\n\n if (distSqr <= (radius * radius)) {\n const dist = Math.sqrt(distSqr) * invR\n\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist)\n if (strength > 0) {\n const intensity = (strength * 255) | 0\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity))\n }\n }\n }\n }\n\n return {\n type: MaskType.ALPHA,\n outlineType: PaintMaskOutline.CIRCLE,\n data,\n w: size,\n h: size,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset,\n }\n}\n\nexport function makeCirclePaintBinaryMask(size: number): PaintBinaryMask {\n const area = size * size\n const data = new Uint8Array(area)\n const radius = size / 2\n const r2 = radius * radius\n\n for (let y = 0; y < size; y++) {\n for (let x = 0; x < size; x++) {\n const dx = x - radius + 0.5\n const dy = y - radius + 0.5\n const distSqr = dx * dx + dy * dy\n if (distSqr <= r2) {\n data[y * size + x] = 1\n }\n }\n }\n\n const centerOffset = _macro_paintCircleCenterOffset(radius)\n\n return {\n type: MaskType.BINARY,\n outlineType: PaintMaskOutline.CIRCLE,\n w: size,\n h: size,\n data,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset,\n }\n}\n","import { _macro_halfAndFloor } from '../Internal/macros'\nimport { type AlphaMask, type BinaryMask, MaskType } from '../Mask/_mask-types'\nimport { type PaintAlphaMask, type PaintBinaryMask, PaintMaskOutline } from './_paint-types'\n\nexport function makePaintBinaryMask(\n mask: BinaryMask,\n): PaintBinaryMask {\n return {\n type: MaskType.BINARY,\n outlineType: PaintMaskOutline.MASKED,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -_macro_halfAndFloor(mask.w),\n centerOffsetY: -_macro_halfAndFloor(mask.h),\n }\n}\n\nexport function makePaintAlphaMask(\n mask: AlphaMask,\n): PaintAlphaMask {\n return {\n type: MaskType.ALPHA,\n outlineType: PaintMaskOutline.MASKED,\n data: mask.data,\n w: mask.w,\n h: mask.h,\n centerOffsetX: -_macro_halfAndFloor(mask.w),\n centerOffsetY: -_macro_halfAndFloor(mask.h),\n }\n}\n","import { _macro_halfAndFloor } from '../Internal/macros'\nimport { MaskType } from '../Mask/_mask-types'\nimport { type PaintAlphaMask, PaintMaskOutline } from './_paint-types'\n\nexport function makeRectFalloffPaintAlphaMask(\n width: number,\n height: number,\n fallOff: (d: number) => number = (d) => d,\n): PaintAlphaMask {\n const fPx = Math.floor(width / 2)\n const fPy = Math.floor(height / 2)\n\n const invHalfW = 2 / width\n const invHalfH = 2 / height\n\n const offX = (width % 2 === 0) ? 0.5 : 0\n const offY = (height % 2 === 0) ? 0.5 : 0\n\n const area = width * height\n const data = new Uint8Array(area)\n\n for (let y = 0; y < height; y++) {\n const dy = Math.abs((y - fPy) + offY) * invHalfH\n const rowOffset = y * width\n\n for (let x = 0; x < width; x++) {\n const dx = Math.abs((x - fPx) + offX) * invHalfW\n\n // Chebyshev distance (square/rect shape)\n const dist = dx > dy ? dx : dy\n // Pass 1.0 at center, 0.0 at edge\n const strength = fallOff(1 - dist)\n if (strength > 0) {\n const intensity = (strength * 255) | 0\n data[rowOffset + x] = Math.max(0, Math.min(255, intensity))\n }\n }\n }\n\n return {\n type: MaskType.ALPHA,\n outlineType: PaintMaskOutline.RECT,\n data: data,\n w: width,\n h: height,\n centerOffsetX: -_macro_halfAndFloor(width),\n centerOffsetY: -_macro_halfAndFloor(height),\n }\n}\n","import { _macro_paintRectCenterOffset } from '../Internal/macros'\nimport { PaintMaskOutline, type PaintRect } from './_paint-types'\n\nexport function makePaintRect(w: number, h: number): PaintRect {\n return {\n type: null,\n outlineType: PaintMaskOutline.RECT,\n data: null,\n w,\n h,\n centerOffsetX: _macro_paintRectCenterOffset(w),\n centerOffsetY: _macro_paintRectCenterOffset(h),\n }\n}\n","import type { ReusableCanvasFactory } from '../../Canvas/_canvas-types'\nimport { makeReusableOffscreenCanvas } from '../../Canvas/ReusableCanvas'\nimport type { Color32 } from '../../Color/_color-types'\n\nimport { packColor } from '../../Color/pack-color'\nimport { _macro_paintRectCenterOffset } from '../../Internal/macros'\nimport { type BinaryMask, MaskType } from '../../Mask/_mask-types'\nimport { makeBinaryMaskFromAlphaMask } from '../../Mask/BinaryMask/makeBinaryMaskFromAlphaMask'\nimport { makeBinaryMaskOutline } from '../../Mask/BinaryMask/makeBinaryMaskOutline'\nimport { makeCircleBinaryMaskOutline } from '../../Mask/BinaryMask/makeCircleBinaryMaskOutline'\nimport { makeRectBinaryMaskOutline } from '../../Mask/BinaryMask/makeRectBinaryMaskOutline'\nimport { fillPixelDataBinaryMask } from '../../PixelData/fillPixelDataBinaryMask'\nimport { makeReusablePixelData } from '../../PixelData/ReusablePixelData'\nimport type { Rect } from '../../Rect/_rect-types'\nimport { type PaintBrush, PaintMaskOutline } from '../_paint-types'\n\nexport type PaintCursorRenderer = ReturnType<typeof makePaintCursorRenderer>\n\nexport function makePaintCursorRenderer<T extends HTMLCanvasElement | OffscreenCanvas = OffscreenCanvas>(\n reusableCanvasFactory?: () => ReusableCanvasFactory<T>,\n) {\n const factory = (reusableCanvasFactory ?? makeReusableOffscreenCanvas) as unknown as () => ReusableCanvasFactory<T>\n const updateBuffer = factory()\n const { canvas, ctx } = updateBuffer(1, 1)\n\n const getPixelData = makeReusablePixelData()\n\n let _color = packColor(0, 255, 255, 255)\n let _scale = 1\n\n let currentBrush: PaintBrush = {\n type: null,\n outlineType: PaintMaskOutline.RECT,\n w: 1,\n h: 1,\n centerOffsetX: _macro_paintRectCenterOffset(10),\n centerOffsetY: _macro_paintRectCenterOffset(10),\n data: null,\n }\n\n let outline: BinaryMask\n\n function update(paintMask?: PaintBrush, scale?: number, color?: Color32, alphaThreshold = 127) {\n currentBrush = paintMask ?? currentBrush\n\n _scale = scale ?? _scale\n _color = color ?? _color\n\n updateBuffer(\n currentBrush.w * _scale + 2 * _scale,\n currentBrush.h * _scale + 2 * _scale,\n )\n\n if (currentBrush.type === MaskType.BINARY) {\n if (currentBrush.outlineType === PaintMaskOutline.CIRCLE) {\n outline = makeCircleBinaryMaskOutline(currentBrush.w, _scale)\n } else if (currentBrush.outlineType === PaintMaskOutline.RECT) {\n outline = makeRectBinaryMaskOutline(currentBrush.w, currentBrush.h, _scale)\n } else if (currentBrush.outlineType === PaintMaskOutline.MASKED) {\n outline = makeBinaryMaskOutline(currentBrush, _scale)\n }\n } else if (currentBrush.type === MaskType.ALPHA) {\n const mask = makeBinaryMaskFromAlphaMask(currentBrush, alphaThreshold)\n outline = makeBinaryMaskOutline(mask, _scale)\n } else {\n outline = makeRectBinaryMaskOutline(currentBrush.w, currentBrush.h, _scale)\n }\n\n const pixelData = getPixelData(outline.w, outline.h)\n fillPixelDataBinaryMask(pixelData, _color, outline)\n ctx.putImageData(pixelData.imageData, 0, 0)\n }\n\n const boundsScratch = { x: 0, y: 0, w: 0, h: 0 }\n\n function getBounds(centerX: number, centerY: number): Rect {\n boundsScratch.x = centerX + currentBrush.centerOffsetX\n boundsScratch.y = centerY + currentBrush.centerOffsetY\n boundsScratch.w = currentBrush.w\n boundsScratch.h = currentBrush.h\n\n return boundsScratch\n }\n\n const boundsScaledScratch = { x: 0, y: 0, w: 0, h: 0 }\n\n function getOutlineBoundsScaled(centerX: number, centerY: number): Rect {\n boundsScaledScratch.x = centerX * _scale + currentBrush.centerOffsetX * _scale - 1\n boundsScaledScratch.y = centerY * _scale + currentBrush.centerOffsetY * _scale - 1\n boundsScaledScratch.w = currentBrush.w * _scale\n boundsScaledScratch.h = currentBrush.h * _scale\n\n return boundsScaledScratch\n }\n\n function draw(\n drawCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n centerX: number,\n centerY: number,\n ) {\n const dx = centerX * _scale + currentBrush.centerOffsetX * _scale - 1\n const dy = centerY * _scale + currentBrush.centerOffsetY * _scale - 1\n\n drawCtx.drawImage(canvas, Math.floor(dx), Math.floor(dy))\n }\n\n function drawRaw(\n drawCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D,\n x: number,\n y: number,\n ) {\n drawCtx.drawImage(canvas, Math.floor(x * _scale), Math.floor(y * _scale))\n }\n\n function getSettings() {\n return {\n color: _color,\n scale: _scale,\n currentBrush,\n }\n }\n\n return {\n update,\n getBounds,\n getBoundsScaled: getOutlineBoundsScaled,\n draw,\n drawRaw,\n getSettings,\n }\n}\n","import { type ApplyMaskToPixelDataOptions } from '../_types'\nimport { type AlphaMask, type BinaryMask, type Mask, MaskType } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\nimport { applyAlphaMaskToPixelData } from './applyAlphaMaskToPixelData'\nimport { applyBinaryMaskToPixelData } from './applyBinaryMaskToPixelData'\n\nexport function applyMaskToPixelData(\n dst: PixelData32,\n mask: Mask,\n opts?: ApplyMaskToPixelDataOptions,\n): boolean {\n if (mask.type === MaskType.BINARY) {\n return applyBinaryMaskToPixelData(dst, mask as BinaryMask, opts)\n } else {\n return applyAlphaMaskToPixelData(dst, mask as AlphaMask, opts)\n }\n}\n","import { type ColorBlendMaskOptions } from '../_types'\nimport type { Color32 } from '../Color/_color-types'\nimport { type Mask, MaskType } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask'\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask'\n\nexport function blendColorPixelDataMask(\n dst: PixelData32,\n color: Color32,\n mask: Mask,\n opts?: ColorBlendMaskOptions,\n): boolean {\n if (mask.type === MaskType.BINARY) {\n return blendColorPixelDataBinaryMask(dst, color, mask, opts)\n } else {\n return blendColorPixelDataAlphaMask(dst, color, mask, opts)\n }\n}\n","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { PaintAlphaMask } from '../Paint/_paint-types'\nimport type { PixelData32 } from './_pixelData-types'\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask'\n\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: sourceOverPerfect,\n}\n\nexport function blendColorPixelDataPaintAlphaMask(\n dst: PixelData32,\n color: Color32,\n mask: PaintAlphaMask,\n x: number,\n y: number,\n alpha = 255,\n blendFn = sourceOverPerfect,\n): boolean {\n const tx = x + mask.centerOffsetX\n const ty = y + mask.centerOffsetY\n\n SCRATCH_OPTS.x = tx\n SCRATCH_OPTS.y = ty\n SCRATCH_OPTS.alpha = alpha\n SCRATCH_OPTS.blendFn = blendFn\n\n return blendColorPixelDataAlphaMask(dst, color, mask, SCRATCH_OPTS)\n}\n","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport type { PaintBinaryMask } from '../Paint/_paint-types'\nimport type { PixelData32 } from './_pixelData-types'\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask'\n\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: sourceOverPerfect,\n}\n\nexport function blendColorPixelDataPaintBinaryMask(\n dst: PixelData32,\n color: Color32,\n mask: PaintBinaryMask,\n x: number,\n y: number,\n alpha = 255,\n blendFn = sourceOverPerfect,\n): boolean {\n const tx = x + mask.centerOffsetX\n const ty = y + mask.centerOffsetY\n\n SCRATCH_OPTS.x = tx\n SCRATCH_OPTS.y = ty\n SCRATCH_OPTS.alpha = alpha\n SCRATCH_OPTS.blendFn = blendFn\n\n return blendColorPixelDataBinaryMask(dst, color, mask, SCRATCH_OPTS)\n}\n","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect'\nimport type { Color32 } from '../Color/_color-types'\nimport { MaskType } from '../Mask/_mask-types'\nimport type { PaintMask, PaintRect } from '../Paint/_paint-types'\nimport type { PixelData32 } from './_pixelData-types'\nimport { blendColorPixelData } from './blendColorPixelData'\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask'\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask'\n\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: sourceOverPerfect,\n w: undefined as number | undefined,\n h: undefined as number | undefined,\n}\n\nexport function blendColorPixelDataPaintMask(\n target: PixelData32,\n color: Color32,\n mask: PaintMask | PaintRect,\n x: number,\n y: number,\n alpha = 255,\n blendFn = sourceOverPerfect,\n): boolean {\n const tx = x + mask.centerOffsetX\n const ty = y + mask.centerOffsetY\n\n SCRATCH_OPTS.x = tx\n SCRATCH_OPTS.y = ty\n SCRATCH_OPTS.alpha = alpha\n SCRATCH_OPTS.blendFn = blendFn\n SCRATCH_OPTS.w = undefined\n SCRATCH_OPTS.h = undefined\n\n if (mask.data) {\n if (mask.type === MaskType.BINARY) {\n return blendColorPixelDataBinaryMask(target, color, mask, SCRATCH_OPTS)\n } else {\n return blendColorPixelDataAlphaMask(target, color, mask, SCRATCH_OPTS)\n }\n }\n SCRATCH_OPTS.w = mask.w\n SCRATCH_OPTS.h = mask.h\n\n return blendColorPixelData(target, color, SCRATCH_OPTS)\n}\n","import { type PixelBlendMaskOptions } from '../_types'\nimport { type Mask, MaskType } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\nimport { blendPixelDataAlphaMask } from './blendPixelDataAlphaMask'\nimport { blendPixelDataBinaryMask } from './blendPixelDataBinaryMask'\n\nexport function blendPixelDataMask(\n target: PixelData32,\n src: PixelData32,\n mask: Mask,\n opts?: PixelBlendMaskOptions,\n): boolean {\n if (mask.type === MaskType.BINARY) {\n return blendPixelDataBinaryMask(target, src, mask, opts)\n } else {\n return blendPixelDataAlphaMask(target, src, mask, opts)\n }\n}\n","import type { BlendColor32 } from '../_types'\nimport type { ColorPaintBuffer } from '../Paint/ColorPaintBuffer'\nimport type { PixelData32 } from './_pixelData-types'\nimport { blendPixelData } from './blendPixelData'\n\nconst SCRATCH_OPTS = {\n x: 0,\n y: 0,\n alpha: 255,\n blendFn: undefined as BlendColor32 | undefined,\n}\n\nexport function blendPixelDataPaintBuffer(\n target: PixelData32,\n paintBuffer: ColorPaintBuffer,\n alpha = 255,\n blendFn?: BlendColor32,\n blendPixelDataFn = blendPixelData,\n): void {\n const lookup = paintBuffer.lookup\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i]\n\n if (tile) {\n const x = tile.x\n const y = tile.y\n\n SCRATCH_OPTS.x = x\n SCRATCH_OPTS.y = y\n SCRATCH_OPTS.alpha = alpha\n SCRATCH_OPTS.blendFn = blendFn\n\n blendPixelDataFn(target, tile, SCRATCH_OPTS)\n }\n }\n}\n\n","import type { Color32 } from '../Color/_color-types'\nimport type { Rect } from '../Rect/_rect-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Fills a region or the {@link PixelData32} buffer with a solid color.\n * This function is faster than {@link fillPixelData} but does not\n * return a boolean value indicating changes were made.\n *\n * @param target - The target to modify.\n * @param color - The color to apply.\n * @param rect - Defines the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelDataFast(\n target: PixelData32,\n color: Color32,\n rect?: Partial<Rect>,\n): void\n/**\n * @param dst - The target to modify.\n * @param color - The color 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 fillPixelDataFast(\n dst: PixelData32,\n color: Color32,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function fillPixelDataFast(\n dst: PixelData32,\n color: Color32,\n _x?: Partial<Rect> | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): void {\n const dstW = dst.w\n const dstH = dst.h\n\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.w\n h = _x.h ?? dst.h\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.w\n h = dst.h\n }\n\n // Inline bounds clipping\n let dstX = x\n let dstY = y\n let fillW = w\n let fillH = h\n\n if (dstX < 0) {\n fillW += dstX\n dstX = 0\n }\n\n if (dstY < 0) {\n fillH += dstY\n dstY = 0\n }\n\n fillW = Math.min(fillW, dstW - dstX)\n fillH = Math.min(fillH, dstH - dstY)\n\n if (fillW <= 0 || fillH <= 0) return\n\n const dst32 = dst.data\n const dw = dst.w\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (fillW === dw && fillH === dst.h && dstX === 0 && dstY === 0) {\n dst32.fill(color)\n return\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < fillH; iy++) {\n const start = (dstY + iy) * dw + dstX\n const end = start + fillW\n dst32.fill(color, start, end)\n }\n}\n","import type { Color32 } from '../Color/_color-types'\nimport type { BinaryMaskRect } from '../Mask/_mask-types'\nimport type { PixelData32 } from './_pixelData-types'\nimport { fillPixelDataFast } from './fillPixelDataFast'\n\n/**\n * Clears a region of the PixelData to transparent (0x00000000).\n * Internally uses the optimized fillPixelDataFast.\n */\nexport function clearPixelDataFast(\n dst: PixelData32,\n rect?: Partial<BinaryMaskRect>,\n): void {\n fillPixelDataFast(dst, 0 as Color32, rect)\n}\n","import type { ImageDataLike } from '../ImageData/_ImageData-types'\nimport type { PixelData } from './_pixelData-types'\nimport { makePixelData } from './PixelData'\n\nexport function copyPixelData<T extends ImageDataLike = ImageData>(target: PixelData<T>): PixelData {\n const data = target.imageData.data\n const buffer = new Uint8ClampedArray(data)\n\n return makePixelData(new ImageData(\n buffer,\n target.w,\n target.h,\n ))\n}\n","import type { MutablePixelData, PixelData, PixelData32 } from './_pixelData-types'\nimport { setPixelData } from './PixelData'\n\nexport function cropPixelData(src: PixelData32, x: number, y: number, w: number, h: number, out?: MutablePixelData): PixelData {\n const cx = Math.max(x, 0)\n const cy = Math.max(y, 0)\n const cw = Math.min(x + w, src.w) - cx\n const ch = Math.min(y + h, src.h) - cy\n\n if (cw <= 0 || ch <= 0) {\n throw new Error(`Crop [${x},${y} ${w}x${h}] does not overlap PixelData [${src.w}x${src.h}]`)\n }\n\n const cropped = new ImageData(cw, ch)\n\n let dst32: Uint32Array\n if (out) {\n setPixelData(out, cropped)\n dst32 = out.data\n } else {\n dst32 = new Uint32Array(cropped.data.buffer)\n }\n\n for (let row = 0; row < ch; row++) {\n const srcOffset = ((cy + row) * src.w) + cx\n const dstOffset = row * cw\n dst32.set(src.data.subarray(srcOffset, srcOffset + cw), dstOffset)\n }\n\n return out ?? {\n data: dst32,\n imageData: cropped,\n w: cw,\n h: ch,\n }\n}\n","import type { Rect } from '../Rect/_rect-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(\n source: PixelData32,\n rect: Rect,\n): Uint32Array\nexport function extractPixelDataBuffer(\n source: PixelData32,\n x: number,\n y: number,\n w: number,\n h: number,\n): Uint32Array\nexport function extractPixelDataBuffer(\n source: PixelData32,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): Uint32Array {\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\n y = _x.y\n w = _x.w\n h = _x.h\n } else {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n }\n\n const srcW = source.w\n const srcH = source.h\n const srcData = source.data\n\n if (w <= 0 || h <= 0) return new Uint32Array(0)\n\n const dstData = new Uint32Array(w * h)\n\n // Inline clipping logic to avoid object allocations\n let srcX = x\n let srcY = y\n let dstX = 0\n let dstY = 0\n let copyW = w\n let copyH = h\n\n if (srcX < 0) {\n dstX = -srcX\n copyW += srcX\n srcX = 0\n }\n\n if (srcY < 0) {\n dstY = -srcY\n copyH += srcY\n srcY = 0\n }\n\n copyW = Math.min(copyW, srcW - srcX)\n copyH = Math.min(copyH, srcH - srcY)\n\n if (copyW <= 0 || copyH <= 0) return dstData\n\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX\n const dstStart = (dstY + row) * w + dstX\n const chunk = srcData.subarray(srcStart, srcStart + copyW)\n\n dstData.set(chunk, dstStart)\n }\n\n return dstData\n}\n","import type { Rect } from '../Rect/_rect-types'\nimport type { PixelData, PixelData32 } from './_pixelData-types'\nimport { extractPixelDataBuffer } from './extractPixelDataBuffer'\nimport { makePixelData } from './PixelData'\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: PixelData32, rect: Rect): PixelData\nexport function extractPixelData(source: PixelData32, x: number, y: number, w: number, h: number): PixelData\nexport function extractPixelData(\n source: PixelData32,\n _x: Rect | number,\n _y?: number,\n _w?: number,\n _h?: number,\n): PixelData {\n const { x, y, w, h } = typeof _x === 'object'\n ? _x\n : { x: _x, y: _y!, w: _w!, h: _h! }\n\n const result = makePixelData(new ImageData(w, h))\n\n const buffer = extractPixelDataBuffer(source, x, y, w, h)\n result.data.set(buffer)\n\n return result\n}\n","import type { AlphaMask } from '../Mask/_mask-types'\nimport { makeAlphaMask } from '../Mask/AlphaMask'\nimport type { PixelData32 } from './_pixelData-types'\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: PixelData32,\n): AlphaMask {\n const {\n data,\n w,\n h,\n } = pixelData\n const len = data.length\n const mask = makeAlphaMask(w, h)\n const maskData = mask.data\n\n for (let i = 0; i < len; i++) {\n const val = data[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 maskData[i] = (val >>> 24) & 0xff\n }\n\n return mask\n}\n","import type { PixelData32 } from './_pixelData-types'\n\nexport function reflectPixelDataHorizontal(pixelData: PixelData32): void {\n const width = pixelData.w\n const height = pixelData.h\n const data = pixelData.data\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: PixelData32): void {\n const width = pixelData.w\n const height = pixelData.h\n const data = pixelData.data\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 { resampleUint32Array } from '../Algorithm/resampleUint32Array'\nimport { type MutablePixelData32, type PixelData, type PixelData32, uInt32ArrayToImageData } from '../index'\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(\n pixelData: PixelData32,\n factor: number,\n): PixelData {\n\n const output = {} as MutablePixelData32\n\n const resampled = resampleUint32Array(pixelData.data, pixelData.w, pixelData.h, factor, output) as PixelData\n\n (resampled as any).imageData = uInt32ArrayToImageData(resampled.data, resampled.w, resampled.h)\n\n return resampled\n}\n\nexport function resamplePixelDataInPlace(\n pixelData: PixelData32,\n factor: number,\n): void {\n\n const resampled = resampleUint32Array(pixelData.data, pixelData.w, pixelData.h, factor, pixelData) as PixelData\n\n (resampled as any).imageData = uInt32ArrayToImageData(resampled.data, resampled.w, resampled.h)\n}\n","import type { MutablePixelData32, PixelData32 } from './_pixelData-types'\n\n/**\n * Non-destructively resizes the {@link PixelData32} 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.\n *\n * @param target - The source pixel data 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 original image.\n * @param offsetY - The vertical offset for placing the original image.\n * @param out - output object\n * @returns A new {@link PixelData32} object with the specified dimensions.\n */\nexport function resizePixelData(\n target: PixelData32,\n newWidth: number,\n newHeight: number,\n offsetX = 0,\n offsetY = 0,\n out?: MutablePixelData32,\n): PixelData32 {\n const newData = new Uint32Array(newWidth * newHeight)\n const {\n w: oldW,\n h: oldH,\n data: oldData,\n } = target\n\n const result = out ?? {} as MutablePixelData32\n result.w = newWidth\n result.h = newHeight\n result.data = newData\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 copyW = x1 - x0\n const copyH = y1 - y0\n\n // Optimization: If we are copying the full width of both buffers,\n // we can perform a single bulk 1D copy.\n if (copyW === oldW && copyW === newWidth && offsetX === 0) {\n const srcStart = (y0 - offsetY) * oldW\n const dstStart = y0 * newWidth\n const len = copyW * copyH\n\n newData.set(oldData.subarray(srcStart, srcStart + len), dstStart)\n return result\n }\n\n // Standard row-by-row copy\n for (let row = 0; row < copyH; row++) {\n const dstY = y0 + row\n const srcY = dstY - offsetY\n const srcX = x0 - offsetX\n\n const dstStart = dstY * newWidth + x0\n const srcStart = srcY * oldW + srcX\n const chunk = oldData.subarray(srcStart, srcStart + copyW)\n\n newData.set(chunk, dstStart)\n }\n\n return result\n}\n","import type { PixelData } from './_pixelData-types'\nimport { setPixelData } from './PixelData'\n\n/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.w\n const height = pixelData.h\n const data = pixelData.data\n\n if (width === height) {\n rotateSquareInPlace(pixelData)\n return\n }\n\n const newWidth = height\n const newHeight = width\n const newData32 = new Uint32Array(data.length)\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const oldIdx = y * width + x\n const newX = height - 1 - y\n const newY = x\n const newIdx = newY * newWidth + newX\n\n newData32[newIdx] = data[oldIdx]\n }\n }\n\n // To update a rectangular PixelData, we must create a new ImageData\n // since width/height are read-only properties of the native object.\n const newImageData = new ImageData(\n new Uint8ClampedArray(newData32.buffer),\n newWidth,\n newHeight,\n )\n\n setPixelData(pixelData, newImageData)\n}\n\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.w\n const data = pixelData.data\n\n for (let i = 0; i < n / 2; i++) {\n for (let j = i; j < n - i - 1; j++) {\n const top = i * n + j\n const right = j * n + (n - 1 - i)\n const bottom = (n - 1 - i) * n + (n - 1 - j)\n const left = (n - 1 - j) * n + i\n\n const temp = data[top]\n data[top] = data[left]\n data[left] = data[bottom]\n data[bottom] = data[right]\n data[right] = temp\n }\n }\n}\n","import type { Rect } from '../Rect/_rect-types'\nimport type { MutablePixelData, PixelData, PixelData32 } from './_pixelData-types'\nimport { cropPixelData } from './cropPixelData'\n\nexport function getPixelDataTransparentTrimmedBounds(target: PixelData32): Rect | null {\n let minX = target.w\n let minY = target.h\n let maxX = -1\n let maxY = -1\n\n for (let y = 0; y < target.h; y++) {\n for (let x = 0; x < target.w; x++) {\n const alpha = target.data[y * target.w + x] >>> 24\n if (alpha !== 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 (maxX === -1) return null\n\n return {\n x: minX,\n y: minY,\n w: maxX - minX + 1,\n h: maxY - minY + 1,\n }\n}\n\nexport function trimTransparentPixelData(target: PixelData32): PixelData {\n const r = getPixelDataTransparentTrimmedBounds(target)\n if (!r) {\n throw new Error('PixelData is fully transparent — no crop bounds found')\n }\n\n return cropPixelData(target, r.x, r.y, r.w, r.h)\n}\n\nexport function trimTransparentPixelDataInPlace(target: MutablePixelData) {\n const r = getPixelDataTransparentTrimmedBounds(target)\n if (!r) {\n throw new Error('PixelData is fully transparent — no crop bounds found')\n }\n\n cropPixelData(target, r.x, r.y, r.w, r.h, target)\n}\n","import { makePixelData, type PixelData } from '../index'\n\nexport function uInt32ArrayToPixelData(\n data: Uint32Array,\n width: number,\n height: number,\n): PixelData {\n const buffer = data.buffer as ArrayBuffer\n const byteOffset = data.byteOffset\n const byteLength = data.byteLength\n const clampedArray = new Uint8ClampedArray(buffer, byteOffset, byteLength)\n const imageData = new ImageData(clampedArray, width, height)\n\n return makePixelData(imageData)\n}\n","import type { Rect } from '../Rect/_rect-types'\nimport type { PixelData32 } from './_pixelData-types'\n\n/**\n * Copies a pixel buffer into a specific region of a {@link PixelData32} object.\n * @param target - The target to write into.\n * @param data - The source pixel data (Uint32Array).\n * @param rect - A rect defining the destination region.\n */\nexport function writePixelDataBuffer(\n target: PixelData32,\n data: Uint32Array,\n rect: Rect,\n): void\n/**\n * @param target - The target to write into.\n * @param data - The source pixel data (Uint32Array).\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 writePixelDataBuffer(\n target: PixelData32,\n data: Uint32Array,\n x: number,\n y: number,\n w: number,\n h: number,\n): void\nexport function writePixelDataBuffer(\n target: PixelData32,\n data: Uint32Array,\n _x: 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\n y = _x.y\n w = _x.w\n h = _x.h\n } else {\n x = _x\n y = _y!\n w = _w!\n h = _h!\n }\n\n if (w <= 0 || h <= 0) return\n\n const dstW = target.w\n const dstH = target.h\n const dstData = target.data\n\n // Inline clipping logic\n let dstX = x\n let dstY = y\n let srcX = 0\n let srcY = 0\n let copyW = w\n let copyH = h\n\n if (dstX < 0) {\n srcX = -dstX\n copyW += dstX\n dstX = 0\n }\n\n if (dstY < 0) {\n srcY = -dstY\n copyH += dstY\n dstY = 0\n }\n\n copyW = Math.min(copyW, dstW - dstX)\n copyH = Math.min(copyH, dstH - dstY)\n\n if (copyW <= 0 || copyH <= 0) return\n\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX\n const srcStart = (srcY + row) * w + srcX\n const chunk = data.subarray(srcStart, srcStart + copyW)\n\n dstData.set(chunk, dstStart)\n }\n}\n","import type { ColorPaintBuffer } from '../Paint/ColorPaintBuffer'\nimport type { PixelData } from './_pixelData-types'\nimport { writePixelDataBuffer } from './writePixelDataBuffer'\n\n/**\n * @param writePixelDataBufferFn - @hidden\n */\nexport function writePaintBufferToPixelData(\n target: PixelData,\n paintBuffer: ColorPaintBuffer,\n writePixelDataBufferFn = writePixelDataBuffer,\n) {\n const lookup = paintBuffer.lookup\n\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i]\n\n if (tile) {\n writePixelDataBufferFn(target, tile.data, tile.x, tile.y, tile.w, tile.h)\n }\n }\n}\n","import type { PixelData32 } from './_pixelData-types'\n\n/**\n * Writes PixelData from a source to a target.\n * @param target - The destination to write to.\n * @param source - The source to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n */\nexport function writePixelData(\n target: PixelData32,\n source: PixelData32,\n x = 0,\n y = 0,\n): void {\n const dstW = target.w\n const dstH = target.h\n const dst = target.data\n\n const srcW = source.w\n const srcH = source.h\n const src = source.data\n\n let dstX = x\n let dstY = y\n let srcX = 0\n let srcY = 0\n let copyW = srcW\n let copyH = srcH\n\n if (dstX < 0) {\n srcX = -dstX\n copyW += dstX\n dstX = 0\n }\n\n if (dstY < 0) {\n srcY = -dstY\n copyH += dstY\n dstY = 0\n }\n\n copyW = Math.min(copyW, dstW - dstX)\n copyH = Math.min(copyH, dstH - dstY)\n\n if (copyW <= 0 || copyH <= 0) return\n\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX\n const srcStart = (srcY + row) * srcW + srcX\n const chunk = src.subarray(srcStart, srcStart + copyW)\n\n dst.set(chunk, dstStart)\n }\n}\n"],"mappings":"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","names":["OFFSCREEN_CANVAS_CTX_FAILED","CANVAS_CTX_FAILED","colorDistance","a","b","dr","dg","db","da","extractImageDataBuffer","imageData","_x","_y","_w","_h","x","y","w","h","Uint8ClampedArray","srcW","width","srcH","height","src","data","outLen","out","srcX","srcY","dstX","dstY","copyW","copyH","Math","min","isAligned","byteOffset","srcLen32","byteLength","src32","Uint32Array","buffer","out32","row","srcStart","dstStart","chunk","subarray","set","rowLen","MaskType","ALPHA","BINARY","extractMaskBuffer","maskBuffer","maskWidth","xOrRect","y","w","h","finalX","finalY","finalW","finalH","x","out","Uint8Array","srcH","length","row","currentSrcY","start","Math","max","end","min","srcOffset","dstOffset","count","set","subarray","trimMaskRectBounds","target","bounds","originalX","x","originalY","y","originalW","w","intersectedX","Math","max","intersectedY","intersectedMaxX","min","intersectedMaxY","h","data","Uint8Array","intersectedW","intersectedH","offsetX","offsetY","currentMaskBuffer","extractMaskBuffer","minX","maxX","minY","maxY","finalW","finalH","newMaskBuffer","floodFillSelection","target","startX","startY","contiguous","tolerance","bounds","out","data32","data","width","w","height","h","lx","x","ly","y","lw","lh","xMin","Math","max","xMax","min","yMin","yMax","baseColor","matchCount","matchX","Uint16Array","matchY","minX","maxX","minY","maxY","visited","Uint8Array","stack","Uint32Array","stackPtr","val","idx","colorDistance","color","type","finalMask","i","mx","my","trimMaskRectBounds","pixels","extractImageDataBuffer","imageData","forEachLinePoint","x0","y0","x1","y1","callback","dx","dy","steps","Math","max","abs","xInc","yInc","curX","curY","i","resampleUint32Array","srcData32","srcW","srcH","factor","out","dstW","Math","max","dstH","dstData","Uint32Array","scaleX","scaleY","y","srcY","min","srcRowOffset","dstRowOffset","x","srcX","data","w","h","BaseBlendMode","overwrite","sourceOver","darken","multiply","colorBurn","linearBurn","darkerColor","lighten","screen","colorDodge","linearDodge","lighterColor","overlay","softLight","hardLight","vividLight","linearLight","pinLight","hardMix","difference","exclusion","subtract","divide","sourceIn","sourceOut","sourceAtop","destinationOver","destinationIn","destinationOut","destinationAtop","xor","overwriteBase","src","_dst","isOverwrite","makeBlendModeRegistry","blendModes","initialEntries","registryName","blendToName","Map","blendToIndex","indexToName","indexToBlend","nameToBlend","nameToIndex","add","name","index","blendFn","Number","isFinite","Error","set","Object","entries","blend","indexType","nameType","overwriteFast","overwriteBase","sourceInFast","src","dst","da","sa","sr","sg","sb","r","g","b","a","sourceOutFast","invDa","sourceAtopFast","dr","dg","db","invSa","destinationOverFast","destinationInFast","destinationOutFast","destinationAtopFast","xorFast","sourceOverFast","invA","darkenFast","br","bg","bb","multiplyFast","colorBurnFast","Math","max","linearBurnFast","brU","bgU","bbU","darkerFast","lumSrc","lumDst","lightenFast","screenFast","colorDodgeFast","min","linearDodgeFast","lighterFast","overlayFast","softLightFast","hardLightFast","vividLightFast","linearLightFast","pinLightFast","hardMixFast","differenceFast","brD","bgD","bbD","exclusionFast","subtractFast","divideFast","BASE_FAST_BLEND_MODE_FUNCTIONS","BaseBlendMode","overwrite","sourceIn","sourceOut","sourceAtop","destinationOver","destinationIn","destinationOut","destinationAtop","xor","sourceOver","darken","multiply","colorBurn","linearBurn","darkerColor","lighten","screen","colorDodge","linearDodge","lighterColor","overlay","softLight","hardLight","vividLight","linearLight","pinLight","hardMix","difference","exclusion","subtract","divide","makeFastBlendModeRegistry","name","makeBlendModeRegistry","overwritePerfect","overwriteBase","sourceInPerfect","src","dst","da","sa","sr","sg","sb","tR","r","tG","g","tB","b","tA","a","sourceOutPerfect","invDa","sourceAtopPerfect","dr","dg","db","invSa","destinationOverPerfect","destinationInPerfect","destinationOutPerfect","destinationAtopPerfect","xorPerfect","sourceOverPerfect","invA","darkenPerfect","br","bg","bb","multiplyPerfect","mR","mG","mB","colorBurnPerfect","resR","resG","resB","linearBurnPerfect","brU","bgU","bbU","darkerPerfect","lumSrc","lumDst","lightenPerfect","screenPerfect","colorDodgePerfect","linearDodgePerfect","lighterPerfect","overlayPerfect","softLightPerfect","scR","scG","scB","hardLightPerfect","vividLightPerfect","Math","max","min","linearLightPerfect","pinLightPerfect","hardMixPerfect","differencePerfect","exclusionPerfect","r2","g2","b2","subtractPerfect","dividePerfect","BASE_PERFECT_BLEND_MODE_FUNCTIONS","BaseBlendMode","overwrite","sourceIn","sourceOut","sourceAtop","destinationOver","destinationIn","destinationOut","destinationAtop","xor","sourceOver","darken","multiply","colorBurn","linearBurn","darkerColor","lighten","screen","colorDodge","linearDodge","lighterColor","overlay","softLight","hardLight","vividLight","linearLight","pinLight","hardMix","difference","exclusion","subtract","divide","makePerfectBlendModeRegistry","name","makeBlendModeRegistry","toBlendModeIndexAndName","input","name","getKeyByValue","BaseBlendMode","undefined","Error","blendIndex","blendName","trimmed","trim","num","Number","isNumeric","isNaN","isInteger","JSON","stringify","obj","value","key","CANVAS_COMPOSITE_MAP","BaseBlendMode","overwrite","sourceOver","darken","multiply","colorBurn","lighten","screen","colorDodge","linearDodge","overlay","softLight","hardLight","difference","exclusion","makeReusableCanvas","makeReusableCanvasMeta","w","h","canvas","document","createElement","width","height","makeReusableOffscreenCanvas","OffscreenCanvas","factory","ctx","result","get","getContext","Error","CANVAS_CTX_FAILED","imageSmoothingEnabled","reset","makeCanvasFrameRenderer","reusableCanvasFactory","makeReusableOffscreenCanvas","getBuffer","renderCanvasFrame","pixelCanvas","scale","getImageData","drawPixelLayer","drawScreenLayer","canvas","ctx","w","width","h","height","buffer","img","putImageData","setTransform","clearRect","drawImage","makeCanvasPixelDataRenderer","reusableCanvasFactory","makeReusableOffscreenCanvas","bufferCanvas","drawPixelData","targetCtx","pixelData","x","y","buffer","w","h","ctx","putImageData","imageData","drawImage","canvas","makePixelCanvas","canvas","ctx","getContext","Error","CANVAS_CTX_FAILED","imageSmoothingEnabled","resize","w","h","width","height","imgBlobToImageData","blob","bitmap","createImageBitmap","canvas","OffscreenCanvas","width","height","ctx","getContext","Error","drawImage","getImageData","close","getImageDataFromClipboard","clipboardEvent","items","clipboardData","length","i","item","type","startsWith","blob","getAsFile","imgBlobToImageData","imageDataToImgBlob","imageData","canvas","OffscreenCanvas","width","height","ctx","getContext","Error","putImageData","convertToBlob","type","writeImgBlobToClipboard","blob","item","ClipboardItem","navigator","clipboard","write","writeImageDataToClipboard","imageData","blob","imageDataToImgBlob","writeImgBlobToClipboard","lerpColor32","a","b","t","r","g","b_","a_","lerpColor32Fast","src","dst","w","invA","rb","ga","color32ToHex","color","r","toString","padStart","g","b","a","color32ToCssRGBAString","alpha","Number","toFixed","color32ToCssRGBA","cssRGBAToColor32","packColor","r","g","b","a","packRGBA","unpackRed","packed","unpackGreen","unpackBlue","unpackAlpha","unpackColor","SCRATCH_RGBA","unpackColorTo","scratch","makeBatchedQueue","processor","queue","activeSet","Set","processingSet","scheduled","flush","current","clear","markDirty","item","add","markMultipleDirty","items","len","length","i","makeRenderQueue","cb","needsRender","frameId","trigger","requestAnimationFrame","cancel","cancelAnimationFrame","applyPatchTiles","target","tiles","tileSize","i","length","tile","dst","data","src","dstWidth","w","dstHeight","h","startX","tx","startY","ty","copyWidth","Math","max","min","ly","globalY","dstIndex","srcIndex","rowData","subarray","set","makeHistoryAction","config","accumulator","patch","afterUndo","afterRedo","applyPatchTilesFn","applyPatchTiles","target","tileSize","undo","beforeTiles","redo","afterTiles","dispose","recyclePatch","HistoryManager","constructor","maxSteps","undoStack","redoStack","listeners","Set","canUndo","length","canRedo","subscribe","fn","add","delete","notify","forEach","commit","action","push","clearRedoStack","shift","dispose","undo","pop","redo","i","PixelAccumulator","constructor","config","pixelTilePool","lookup","beforeTiles","recyclePatch","patch","releaseTiles","afterTiles","storePixelBeforeState","x","y","columns","targetColumns","targetWidth","targetHeight","tx","invTileSize","ty","id","tile","added","getTile","extractState","push","didChange","pop","undefined","releaseTile","storeRegionBeforeState","w","h","clipX1","Math","max","clipY1","clipX2","min","clipY2","startX","startY","endX","endY","startIndex","length","i","t","storeTileBeforeState","target","TILE_SIZE","tileSize","dst","data","src","fill","srcOffsetX","copyWidth","ly","globalY","dstIndex","srcIndex","rowData","subarray","set","extractPatch","beforeTile","afterTile","rollbackAfterError","applyPatchTiles","applyAlphaMaskToPixelData","target","mask","opts","targetX","x","targetY","y","width","w","height","h","globalAlpha","alpha","mx","my","invertMask","Math","min","mPitch","startX","startY","sX0","max","sY0","sX1","sY1","finalW","finalH","xShift","yShift","dst32","data","dw","dStride","mStride","maskData","dIdx","mIdx","didChange","iy","ix","effectiveM","current","next","t1","weight","da","t2","finalAlpha","resizeImageData","target","newWidth","newHeight","offsetX","offsetY","result","ImageData","width","oldW","height","oldH","data","oldData","newData","x0","Math","max","y0","x1","min","y1","rowCount","rowLen","row","dstY","srcY","srcX","dstStart","srcStart","set","subarray","makePixelData","imageData","data","Uint32Array","buffer","byteOffset","byteLength","w","width","h","height","setPixelData","target","TileType","PIXEL","MASK","makePixelTile","id","tx","ty","tileSize","tileArea","data32","Uint32Array","data8","Uint8ClampedArray","buffer","tileType","x","y","w","h","data","imageData","ImageData","TilePool","constructor","tileSize","tileFactory","pool","tileArea","getTile","id","tx","ty","tile","pop","x","y","data","fill","releaseTile","push","releaseTiles","tiles","length","i","makeTileTargetConfig","tileSize","target","makeTileTargetMeta","targetWidth","w","targetHeight","h","invTileSize","tileArea","targetColumns","Math","ceil","targetRows","PixelWriter","historyManager","accumulator","historyActionFactory","config","pixelTilePool","mutator","_inProgress","constructor","target","mutatorFactory","options","tileSize","maxHistorySteps","makeTileTargetConfig","HistoryManager","makeHistoryAction","TilePool","makePixelTile","PixelAccumulator","withHistory","transaction","afterUndo","afterRedo","Error","e","rollbackAfterError","beforeTiles","length","patch","extractPatch","action","commit","resize","newWidth","newHeight","offsetX","offsetY","resizeImageDataFn","resizeImageData","beforeImageData","imageData","afterImageData","setPixelData","undo","redo","defaults","applyAlphaMaskToPixelData","mutatorApplyAlphaMask","writer","deps","applyAlphaMask","mask","opts","target","config","x","y","w","h","didChange","accumulator","storeRegionBeforeState","applyBinaryMaskToPixelData","target","mask","opts","targetX","x","targetY","y","width","w","height","h","globalAlpha","alpha","mx","my","invertMask","Math","min","mPitch","startX","startY","sX0","max","sY0","sX1","sY1","finalW","finalH","xShift","yShift","dst32","data","dw","dStride","mStride","maskData","dIdx","mIdx","didChange","iy","ix","mVal","isMaskedOut","current","next","d","da","finalAlpha","defaults","applyBinaryMaskToPixelData","mutatorApplyBinaryMask","writer","deps","applyBinaryMask","mask","opts","target","config","x","y","w","h","didChange","accumulator","storeRegionBeforeState","b","console","log","defaults","applyBinaryMaskToPixelData","applyAlphaMaskToPixelData","mutatorApplyMask","writer","deps","applyMask","mask","opts","target","config","x","y","w","h","didChange","accumulator","storeRegionBeforeState","type","blendPixelDataAlphaMask","target","src","alphaMask","opts","targetX","x","targetY","y","sourceX","sx","sourceY","sy","width","w","height","h","globalAlpha","alpha","blendFn","sourceOverPerfect","mx","my","invertMask","Math","min","actualW","actualH","dw","sw","mPitch","maskData","data","dx","dy","dst32","src32","dIdx","sIdx","mIdx","dStride","sStride","mStride","isOpaque","isOverwrite","didChange","iy","ix","mVal","effM","srcCol","srcAlpha","weight","finalCol","a","current","next","defaults","blendPixelDataAlphaMask","mutatorBlendAlphaMask","writer","deps","blendAlphaMask","src","mask","opts","x","y","w","h","didChange","accumulator","storeRegionBeforeState","config","target","blendPixelDataBinaryMask","target","src","binaryMask","opts","targetX","x","targetY","y","sourceX","sx","sourceY","sy","width","w","height","h","globalAlpha","alpha","blendFn","sourceOverPerfect","mx","my","invertMask","Math","min","actualW","actualH","dx","dy","dst32","data","src32","dw","sw","mPitch","maskData","dIdx","sIdx","mIdx","dStride","sStride","mStride","skipVal","isOpaque","isOverwrite","didChange","iy","ix","srcCol","srcAlpha","finalCol","a","current","next","defaults","blendPixelDataBinaryMask","mutatorBlendBinaryMask","writer","deps","blendBinaryMask","src","mask","opts","x","y","w","h","didChange","accumulator","storeRegionBeforeState","config","target","blendColorPixelData","target","color","opts","targetX","x","targetY","y","width","w","height","h","globalAlpha","alpha","blendFn","sourceOverPerfect","baseSrcAlpha","isOverwrite","actualW","Math","min","actualH","finalSrcColor","a","dst32","data","dw","dIdx","dStride","didChange","iy","ix","current","next","defaults","blendColorPixelData","mutatorBlendColor","writer","deps","blendColor","color","opts","target","config","x","y","w","h","didChange","accumulator","storeRegionBeforeState","blendColorPixelDataAlphaMask","target","color","mask","opts","targetX","x","targetY","y","w","h","globalAlpha","alpha","blendFn","sourceOverPerfect","mx","my","invertMask","baseSrcAlpha","isOverwrite","actualW","actualH","Math","min","dx","dy","dst32","data","dw","mPitch","maskData","dIdx","mIdx","dStride","mStride","isOpaque","colorRGB","didChange","iy","ix","mVal","effM","weight","finalCol","a","current","next","defaults","blendColorPixelDataAlphaMask","mutatorBlendColorPaintAlphaMask","writer","deps","OPTS","x","y","blendFn","sourceOverPerfect","alpha","blendColorPaintAlphaMask","color","mask","tx","centerOffsetX","ty","centerOffsetY","didChange","accumulator","storeRegionBeforeState","w","h","config","target","blendColorPixelDataBinaryMask","target","color","mask","opts","targetX","x","targetY","y","w","h","globalAlpha","alpha","blendFn","sourceOverPerfect","mx","my","invertMask","baseSrcAlpha","isOverwrite","actualW","Math","min","actualH","baseColorWithGlobalAlpha","a","dx","dy","dst32","data","dw","mPitch","maskData","dIdx","mIdx","dStride","mStride","skipVal","didChange","iy","ix","current","next","defaults","blendColorPixelDataBinaryMask","mutatorBlendColorPaintBinaryMask","writer","deps","OPTS","x","y","blendFn","sourceOverPerfect","alpha","blendColorPaintBinaryMask","color","mask","tx","centerOffsetX","ty","centerOffsetY","didChange","accumulator","storeRegionBeforeState","w","h","config","target","defaults","blendColorPixelDataAlphaMask","blendColorPixelDataBinaryMask","blendColorPixelData","mutatorBlendColorPaintMask","writer","deps","OPTS","x","y","blendFn","sourceOverPerfect","alpha","w","undefined","h","blendColorPaintMask","color","mask","tx","centerOffsetX","ty","centerOffsetY","didChange","accumulator","storeRegionBeforeState","data","type","config","target","defaults","blendColorPixelData","mutatorBlendColorPaintRect","writer","deps","OPTS","x","y","w","h","blendFn","sourceOverPerfect","alpha","blendColorPaintRect","color","centerX","centerY","brushWidth","brushHeight","target","config","topLeftX","topLeftY","didChange","accumulator","storeRegionBeforeState","defaults","blendPixelDataAlphaMask","blendPixelDataBinaryMask","mutatorBlendMask","writer","deps","blendMask","src","mask","opts","x","y","w","h","didChange","accumulator","storeRegionBeforeState","type","config","target","blendPixel","target","x","y","color","alpha","blendFn","sourceOverPerfect","width","w","height","h","srcAlpha","isOverwrite","dst32","data","index","finalColor","finalAlpha","current","next","defaults","blendPixel","mutatorBlendPixel","writer","deps","x","y","color","alpha","blendFn","didChange","accumulator","storePixelBeforeState","config","target","blendPixelData","target","src","opts","targetX","x","targetY","y","sourceX","sx","sourceY","sy","width","w","height","h","globalAlpha","alpha","blendFn","sourceOverPerfect","Math","min","actualW","actualH","dst32","data","src32","dw","sw","dIdx","sIdx","dStride","sStride","isOpaque","isOverwrite","didChange","iy","ix","srcCol","srcAlpha","finalCol","a","current","next","defaults","blendPixelData","mutatorBlendPixelData","writer","deps","src","opts","x","y","w","h","didChange","accumulator","storeRegionBeforeState","config","target","fillPixelData","dst","color","_x","_y","_w","_h","dstW","w","dstH","h","x","y","dstX","dstY","fillW","fillH","Math","min","dst32","data","hasChanged","start","end","i","iy","rowOffset","defaults","fillPixelData","mutatorClear","writer","deps","clear","rect","target","config","x","y","w","h","didChange","accumulator","storeRegionBeforeState","defaults","fillPixelData","mutatorFill","writer","deps","config","fill","color","_x","_y","_w","_h","target","dstW","w","dstH","h","x","y","didChange","accumulator","storeRegionBeforeState","fillPixelDataBinaryMask","target","color","mask","x","y","targetW","w","targetH","h","maskW","maskH","dstX","dstY","actualW","actualH","Math","min","maskData","data","dst32","mx","my","hasChanged","dIdx","mIdx","dStride","mStride","iy","ix","defaults","fillPixelDataBinaryMask","mutatorFillBinaryMask","writer","deps","fillBinaryMask","color","mask","x","y","didChange","accumulator","storeRegionBeforeState","w","h","config","target","invertPixelData","target","opts","targetW","w","targetH","h","mask","invertMask","targetX","x","targetY","y","mx","my","actualW","actualH","Math","min","dst32","data","dw","dx","dy","dIdx","dStride","maskData","mPitch","mIdx","mStride","iy","ix","mVal","isHit","defaults","invertPixelData","mutatorInvert","writer","deps","invert","opts","target","config","x","y","w","h","didChange","accumulator","storeRegionBeforeState","makeFullPixelMutator","writer","mutatorApplyAlphaMask","mutatorApplyBinaryMask","mutatorApplyMask","mutatorBlendAlphaMask","mutatorBlendBinaryMask","mutatorBlendColor","mutatorBlendColorPaintAlphaMask","mutatorBlendColorPaintBinaryMask","mutatorBlendColorPaintMask","mutatorBlendColorPaintRect","mutatorBlendMask","mutatorBlendPixel","mutatorBlendPixelData","mutatorClear","mutatorFill","mutatorFillBinaryMask","mutatorInvert","copyImageData","source","dataCopy","Uint8ClampedArray","data","ImageData","width","height","copyImageDataLike","slice","extractImageData","imageData","_x","_y","_w","_h","x","y","w","h","result","ImageData","buffer","extractImageDataBuffer","data","set","makeImageDataLike","width","height","data","size","buffer","Uint8ClampedArray","byteOffset","imageDataToAlphaMaskBuffer","imageData","width","height","data","data32","Uint32Array","buffer","byteOffset","byteLength","len","length","mask","Uint8Array","i","val","get","makeReusableCanvas","imageDataToDataUrl","imageData","canvas","ctx","width","height","putImageData","toDataURL","reset","imageDataToUint32Array","imageData","Uint32Array","data","buffer","byteOffset","byteLength","invertImageData","imageData","data","length","i","resampleImageData","source","factor","src32","Uint32Array","data","buffer","w","h","resampleUint32Array","width","height","uint8ClampedArray","Uint8ClampedArray","ImageData","makeReusableImageData","imageData","getReusableImageData","width","height","ImageData","data","fill","base64EncodeArrayBuffer","buffer","uint8","Uint8Array","decoder","TextDecoder","binary","decode","btoa","base64DecodeArrayBuffer","encoded","atob","bytes","Uint8ClampedArray","length","i","charCodeAt","serializeImageData","imageData","width","height","data","serializeNullableImageData","deserializeRawImageData","serialized","deserializeImageData","ImageData","deserializeNullableImageData","uInt32ArrayToImageData","data","width","height","buffer","byteOffset","byteLength","clampedArray","Uint8ClampedArray","ImageData","uInt32ArrayToImageDataLike","writeImageData","target","source","x","y","dstW","width","dstH","height","dst","data","srcW","srcH","src","dstX","dstY","srcX","srcY","copyW","copyH","Math","min","isDstAligned","byteOffset","isSrcAligned","dstLen32","byteLength","dst32","Uint32Array","buffer","srcLen32","src32","row","dstStart","srcStart","chunk","subarray","set","rowLen","writeImageDataBuffer","target","data","_x","_y","_w","_h","x","y","w","h","dstW","width","dstH","height","dst","dstX","dstY","srcX","srcY","copyW","copyH","Math","min","isDstAligned","byteOffset","isSrcAligned","dstLen32","byteLength","dst32","Uint32Array","buffer","srcLen32","src32","row","dstStart","srcStart","chunk","subarray","set","rowLen","getIndexedImageColorCounts","indexedImage","data","palette","frequencies","Uint32Array","length","i","colorIndex","makeIndexedImage","width","height","data","palette","transparentPalletIndex","w","h","makeIndexedImageFromImageDataRaw","buffer","rawData","Uint32Array","indexedData","length","colorMap","Map","transparentColor","set","i","pixel","alpha","isTransparent","colorKey","id","get","undefined","size","from","keys","makeIndexedImageFromImageData","imageData","getIndexedImageColor","target","x","y","index","paletteIndex","indexedImageToAverageColor","indexedImage","includeTransparent","data","palette","transparentPalletIndex","counts","Uint32Array","length","i","id","rSum","gSum","bSum","aSum","totalWeight","weight","color","r","g","b","a","packColor","indexedImageToImageData","indexedImage","w","h","data","palette","result","ImageData","data32","Uint32Array","buffer","i","length","paletteIndex","resampleIndexedImage","source","factor","output","palette","transparentPalletIndex","resampleUint32Array","data","w","h","fileInputChangeToImageData","event","target","file","files","fileToImageData","UnsupportedFormatError","Error","constructor","mimeType","name","fileToImageData","file","type","startsWith","bitmap","createImageBitmap","canvas","OffscreenCanvas","width","height","ctx","getContext","OFFSCREEN_CANVAS_CTX_FAILED","drawImage","getImageData","close","formatsPromise","defaultRasterMimes","getSupportedPixelFormats","rasterMimes","probeCanvas","canvas","OffscreenCanvas","results","Promise","all","map","mime","blob","convertToBlob","type","filter","catch","error","makeAlphaMask","w","h","data","type","Uint8Array","applyBinaryMaskToAlphaMask","alphaMaskDst","binaryMaskSrc","opts","targetX","x","targetY","y","reqWidth","w","reqHeight","h","mx","my","invertMask","dstWidth","data","length","srcWidth","dstHeight","srcHeight","dstX0","Math","max","dstY0","dstX1","min","dstY1","srcX0","srcY0","iterW","iterH","srcData","dstData","dstIdx","srcIdx","row","dstEnd","d","s","makeBinaryMask","w","h","data","type","Uint8Array","makeBinaryMaskFromAlphaMask","mask","threshold","out","w","h","alphaData","data","area","binaryData","Uint8Array","i","type","makeBinaryMaskOutline","mask","scale","w","h","maskData","data","size","outData","Uint8Array","iy","ix","i","lx","ly","top","bottom","left","right","topLeft","topRight","bottomLeft","bottomRight","sx","outIdx","sy","type","makeCircleBinaryMaskOutline","size","scale","outSize","outArea","data","Uint8Array","radius","r2","prevMinX","prevMaxX","currMinX","currMaxX","initialDy","initialDy2","dx","Math","sqrt","ceil","floor","iy","nextMinX","nextMaxX","ny","ny2","ix","sx","sy","isTop","isBottom","isLeft","isRight","leftOut","rightOut","startX","endX","x","index","y","type","w","h","makeRectBinaryMaskOutline","w","h","scale","rw","rh","outW","outH","outData","Uint8Array","fill","iy","rowStart","type","data","copyMask","src","type","data","slice","w","h","extractMask","mask","xOrRect","y","w","h","finalX","finalY","finalW","finalH","x","out","type","data","Uint8Array","srcH","stride","row","currentSrcY","start","Math","max","end","min","srcOffset","dstOffset","count","set","subarray","invertBinaryMask","dst","data","len","length","i","invertAlphaMask","mergeAlphaMasks","dst","src","opts","x","targetX","y","targetY","w","width","h","height","alpha","globalAlpha","mx","my","invertMask","dstData","data","srcData","srcWidth","dstWidth","startX","Math","max","startY","endX","min","endY","iy","dy","sy","dIdx","sIdx","ix","rawM","effectiveM","weight","t","da","mergeBinaryMasks","dst","src","opts","x","targetX","y","targetY","w","width","h","height","mx","my","invertMask","dstData","data","srcData","srcWidth","dstWidth","Math","min","startX","startY","sX0","max","sY0","sX1","sY1","finalW","finalH","xShift","yShift","dStride","sStride","dIdx","sIdx","iy","ix","mVal","isMaskedOut","setMaskData","mask","width","height","data","w","h","getRectsBounds","rects","length","minX","Infinity","minY","maxX","maxY","i","r","x1","x","y1","y","x2","w","y2","h","merge2BinaryMaskRects","a","b","bounds","getRectsBounds","data","undefined","ix","Math","max","x","iy","y","ir","min","w","ib","h","iw","ih","intersectionArea","areaA","areaB","boundsArea","type","maskData","Uint8Array","aOffY","aOffX","ay","destRow","fill","srcRow","set","subarray","bOffY","bOffX","by","bx","mergeBinaryMaskRects","current","adding","rects","changed","next","r","merged","i","length","n","overlap","x","w","y","h","merge2BinaryMaskRects","push","splice","subtractBinaryMaskRects","current","subtracting","result","sub","next","r","ix","Math","max","x","iy","y","ix2","min","w","iy2","h","push","pushPiece","dest","data","undefined","type","lx","ly","Uint8Array","row","set","subarray","PaintMaskOutline","MASKED","CIRCLE","RECT","trimRectBounds","x","y","w","h","targetWidth","targetHeight","out","res","left","Math","max","top","right","min","bottom","makeAlphaMaskTile","id","tx","ty","tileSize","tileArea","tileType","type","data","Uint8Array","w","h","x","y","makeBinaryMaskTile","eachTileInBounds","config","lookup","tilePool","bounds","callback","targetRows","targetColumns","tileSize","x1","Math","max","floor","x","y1","y","x2","min","w","y2","h","ty","rowOffset","tileTop","tx","id","tile","getTile","tileLeft","startX","startY","maskEndX","tileEndX","endX","maskEndY","tileEndY","endY","AlphaMaskPaintBuffer","constructor","config","tilePool","TilePool","tileSize","makeAlphaMaskTile","lookup","scratchBounds","x","y","w","h","forEachLinePointFn","forEachLinePoint","trimRectBoundsFn","trimRectBounds","eachTileInBoundsFn","eachTileInBounds","paintAlphaMask","brush","x0","y0","x1","y1","scratch","targetW","targetWidth","targetH","targetHeight","bW","bH","data","bD","centerOffsetX","centerOffsetY","changed","px","py","topLeftX","Math","floor","topLeftY","tile","bX","bY","bW_t","bH_t","tileChanged","i","canvasY","bOff","tOff","dS","j","canvasX","brushA","idx","paintBinaryMask","alpha","paintRect","brushWidth","brushHeight","clear","releaseTiles","BinaryMaskPaintBuffer","constructor","config","tilePool","TilePool","tileSize","makeBinaryMaskTile","lookup","scratchBounds","x","y","w","h","forEachLinePointFn","forEachLinePoint","trimRectBoundsFn","trimRectBounds","eachTileInBoundsFn","eachTileInBounds","paintBinaryMask","brush","x0","y0","x1","y1","scratch","targetW","targetWidth","targetH","targetHeight","bW","bH","data","bD","centerOffsetX","centerOffsetY","changed","px","py","topLeftX","Math","floor","topLeftY","tile","bX","bY","bW_t","bH_t","tileChanged","i","canvasY","bOff","tOff","dS","j","canvasX","idx","paintRect","brushWidth","brushHeight","clear","releaseTiles","ColorPaintBuffer","constructor","config","tilePool","lookup","scratchBounds","x","y","w","h","paintAlphaMask","color","brush","x0","y0","x1","y1","cA","scratch","tileSize","targetW","targetWidth","targetH","targetHeight","bW","bH","data","bD","centerOffsetX","centerOffsetY","cRGB","changed","forEachLinePoint","px","py","topLeftX","Math","floor","topLeftY","trimRectBounds","eachTileInBounds","tile","bX","bY","bW_t","bH_t","d32","tileChanged","i","canvasY","bOff","tOff","dS","j","canvasX","brushA","t","blendedA","idx","cur","next","paintBinaryMask","alphaIsZero","paintRect","brushWidth","brushHeight","clear","releaseTiles","SCRATCH_OPTS","alpha","blendFn","sourceOverPerfect","x","y","w","h","commitMaskPaintBuffer","accumulator","paintBuffer","color","blendColorPixelDataMaskFn","config","lookup","i","length","tile","didChange","storeTileBeforeState","id","tx","ty","target","clear","makeAlphaMaskPaintBufferCommitter","accumulator","paintBuffer","commitAlphaMaskPaintBufferToAccumulator","color","alpha","blendFn","sourceOverPerfect","commitMaskPaintBuffer","blendColorPixelDataAlphaMask","makeReusablePixelData","pixelData","w","h","data","imageData","getReusablePixelData","width","height","setPixelData","ImageData","fill","makeAlphaMaskPaintBufferCanvasRenderer","paintBuffer","reusableCanvasFactory","factory","makeReusableOffscreenCanvas","getBuffer","getBridge","makeReusablePixelData","config","tileSize","tileArea","lookup","view32","bridge","canvas","ctx","setBuffer","value","data","buff","draw","targetCtx","color","alpha","compOperation","baseSrcAlpha","colorRGB","globalAlpha","globalCompositeOperation","i","length","tile","data8","fill","p","maskA","t","finalA","putImageData","imageData","drawImage","x","y","makeAlphaMaskPaintBufferManager","writer","reusableCanvasFactory","pool","TilePool","config","tileSize","makeAlphaMaskTile","buffer","AlphaMaskPaintBuffer","renderer","makeAlphaMaskPaintBufferCanvasRenderer","clear","bind","paintRect","paintAlphaMask","paintBinaryMask","commit","makeAlphaMaskPaintBufferCommitter","accumulator","makeBinaryMaskPaintBufferCommitter","accumulator","paintBuffer","commitBinaryMaskPaintBufferToAccumulator","color","alpha","blendFn","sourceOverPerfect","commitMaskPaintBuffer","blendColorPixelDataBinaryMask","makeBinaryMaskPaintBufferCanvasRenderer","paintBuffer","reusableCanvasFactory","factory","makeReusableOffscreenCanvas","getBuffer","getBridge","makeReusablePixelData","config","tileSize","tileArea","lookup","view32","bridge","canvas","ctx","setBuffer","value","data","buff","draw","targetCtx","color","alpha","compOperation","baseSrcAlpha","globalAlpha","globalCompositeOperation","i","length","tile","data8","fill","p","putImageData","imageData","drawImage","x","y","makeBinaryMaskPaintBufferManager","writer","reusableCanvasFactory","pool","TilePool","config","tileSize","makeBinaryMaskTile","buffer","BinaryMaskPaintBuffer","renderer","makeBinaryMaskPaintBufferCanvasRenderer","clear","bind","paintRect","paintBinaryMask","commit","makeBinaryMaskPaintBufferCommitter","accumulator","SCRATCH_OPTS","alpha","blendFn","sourceOverPerfect","x","y","w","h","commitColorPaintBuffer","accumulator","paintBuffer","blendPixelDataFn","blendPixelData","config","lookup","i","length","tile","didChange","storeTileBeforeState","id","tx","ty","target","clear","makeColorPaintBufferCommitter","accumulator","paintBuffer","commitColorPaintBufferToAccumulator","alpha","blendFn","sourceOverPerfect","commitColorPaintBuffer","blendPixelData","makeColorPaintBufferCanvasRenderer","paintBuffer","reusableCanvasFactory","factory","makeReusableOffscreenCanvas","getBuffer","draw","targetCtx","alpha","compOperation","buff","config","tileSize","lookup","length","ctx","canvas","globalAlpha","globalCompositeOperation","i","tile","putImageData","imageData","drawImage","x","y","setBuffer","value","makeColorPaintBufferManager","writer","reusableCanvasFactory","pool","TilePool","config","tileSize","makePixelTile","buffer","ColorPaintBuffer","renderer","makeColorPaintBufferCanvasRenderer","clear","bind","paintRect","paintAlphaMask","paintBinaryMask","commit","makeColorPaintBufferCommitter","accumulator","makeCirclePaintAlphaMask","size","fallOff","d","area","data","Uint8Array","radius","invR","centerOffset","Math","ceil","y","rowOffset","dy","dy2","x","dx","distSqr","dist","sqrt","strength","intensity","max","min","type","outlineType","w","h","centerOffsetX","centerOffsetY","makeCirclePaintBinaryMask","r2","makePaintBinaryMask","mask","type","outlineType","data","w","h","centerOffsetX","centerOffsetY","makePaintAlphaMask","makeRectFalloffPaintAlphaMask","width","height","fallOff","d","fPx","Math","floor","fPy","invHalfW","invHalfH","offX","offY","area","data","Uint8Array","y","dy","abs","rowOffset","x","dx","dist","strength","intensity","max","min","type","outlineType","w","h","centerOffsetX","centerOffsetY","makePaintRect","w","h","type","outlineType","data","centerOffsetX","centerOffsetY","makePaintCursorRenderer","reusableCanvasFactory","factory","makeReusableOffscreenCanvas","updateBuffer","canvas","ctx","getPixelData","makeReusablePixelData","_color","packColor","_scale","currentBrush","type","outlineType","w","h","centerOffsetX","centerOffsetY","data","outline","update","paintMask","scale","color","alphaThreshold","makeCircleBinaryMaskOutline","makeRectBinaryMaskOutline","makeBinaryMaskOutline","mask","makeBinaryMaskFromAlphaMask","pixelData","fillPixelDataBinaryMask","putImageData","imageData","boundsScratch","x","y","getBounds","centerX","centerY","boundsScaledScratch","getOutlineBoundsScaled","draw","drawCtx","dx","dy","drawImage","Math","floor","drawRaw","getSettings","getBoundsScaled","applyMaskToPixelData","dst","mask","opts","type","applyBinaryMaskToPixelData","applyAlphaMaskToPixelData","blendColorPixelDataMask","dst","color","mask","opts","type","blendColorPixelDataBinaryMask","blendColorPixelDataAlphaMask","SCRATCH_OPTS","x","y","alpha","blendFn","sourceOverPerfect","blendColorPixelDataPaintAlphaMask","dst","color","mask","tx","centerOffsetX","ty","centerOffsetY","blendColorPixelDataAlphaMask","SCRATCH_OPTS","x","y","alpha","blendFn","sourceOverPerfect","blendColorPixelDataPaintBinaryMask","dst","color","mask","tx","centerOffsetX","ty","centerOffsetY","blendColorPixelDataBinaryMask","SCRATCH_OPTS","x","y","alpha","blendFn","sourceOverPerfect","w","undefined","h","blendColorPixelDataPaintMask","target","color","mask","tx","centerOffsetX","ty","centerOffsetY","data","type","blendColorPixelDataBinaryMask","blendColorPixelDataAlphaMask","blendColorPixelData","blendPixelDataMask","target","src","mask","opts","type","blendPixelDataBinaryMask","blendPixelDataAlphaMask","SCRATCH_OPTS","x","y","alpha","blendFn","undefined","blendPixelDataPaintBuffer","target","paintBuffer","blendPixelDataFn","blendPixelData","lookup","i","length","tile","fillPixelDataFast","dst","color","_x","_y","_w","_h","dstW","w","dstH","h","x","y","dstX","dstY","fillW","fillH","Math","min","dst32","data","dw","fill","iy","start","end","clearPixelDataFast","dst","rect","fillPixelDataFast","copyPixelData","target","data","imageData","buffer","Uint8ClampedArray","makePixelData","ImageData","w","h","cropPixelData","src","x","y","w","h","out","cx","Math","max","cy","cw","min","ch","Error","cropped","ImageData","dst32","setPixelData","data","Uint32Array","buffer","row","srcOffset","dstOffset","set","subarray","imageData","extractPixelDataBuffer","source","_x","_y","_w","_h","x","y","w","h","srcW","srcH","srcData","data","Uint32Array","dstData","srcX","srcY","dstX","dstY","copyW","copyH","Math","min","row","srcStart","dstStart","chunk","subarray","set","extractPixelData","source","_x","_y","_w","_h","x","y","w","h","result","makePixelData","ImageData","buffer","extractPixelDataBuffer","data","set","pixelDataToAlphaMask","pixelData","data","w","h","len","length","mask","makeAlphaMask","maskData","i","val","reflectPixelDataHorizontal","pixelData","width","w","height","h","data","halfWidth","Math","floor","y","rowOffset","x","leftIdx","rightIdx","temp","reflectPixelDataVertical","halfHeight","topRowOffset","bottomRowOffset","topIdx","bottomIdx","resamplePixelData","pixelData","factor","output","resampled","resampleUint32Array","data","w","h","imageData","uInt32ArrayToImageData","resamplePixelDataInPlace","resizePixelData","target","newWidth","newHeight","offsetX","offsetY","out","newData","Uint32Array","w","oldW","h","oldH","data","oldData","result","x0","Math","max","y0","x1","min","y1","copyW","copyH","srcStart","dstStart","len","set","subarray","row","dstY","srcY","srcX","chunk","rotatePixelData","pixelData","width","w","height","h","data","rotateSquareInPlace","newWidth","newHeight","newData32","Uint32Array","length","y","x","oldIdx","newX","newY","newIdx","newImageData","ImageData","Uint8ClampedArray","buffer","setPixelData","n","i","j","top","right","bottom","left","temp","getPixelDataTransparentTrimmedBounds","target","minX","w","minY","h","maxX","maxY","y","x","alpha","data","trimTransparentPixelData","r","Error","cropPixelData","trimTransparentPixelDataInPlace","uInt32ArrayToPixelData","data","width","height","buffer","byteOffset","byteLength","clampedArray","Uint8ClampedArray","imageData","ImageData","makePixelData","writePixelDataBuffer","target","data","_x","_y","_w","_h","x","y","w","h","dstW","dstH","dstData","dstX","dstY","srcX","srcY","copyW","copyH","Math","min","row","dstStart","srcStart","chunk","subarray","set","writePaintBufferToPixelData","target","paintBuffer","writePixelDataBufferFn","writePixelDataBuffer","lookup","i","length","tile","data","x","y","w","h","writePixelData","target","source","x","y","dstW","w","dstH","h","dst","data","srcW","srcH","src","dstX","dstY","srcX","srcY","copyW","copyH","Math","min","row","dstStart","srcStart","chunk","subarray","set"]}
|