pixel-data-js 0.34.0 → 0.36.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 +188 -56
- package/dist/index.prod.cjs.map +1 -1
- package/dist/index.prod.d.ts +30 -14
- package/dist/index.prod.js +184 -55
- package/dist/index.prod.js.map +1 -1
- package/package.json +1 -1
- package/src/History/PixelAccumulator.ts +27 -6
- 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 +2 -0
- package/src/History/PixelMutator/mutatorBlendColorPaintAlphaMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendColorPaintBinaryMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendColorPaintMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendColorPaintRect.ts +2 -0
- package/src/History/PixelMutator/mutatorBlendMask.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendPixel.ts +1 -0
- package/src/History/PixelMutator/mutatorBlendPixelData.ts +1 -0
- package/src/History/PixelMutator/mutatorClear.ts +2 -1
- package/src/History/PixelMutator/mutatorFill.ts +53 -37
- package/src/History/PixelMutator/mutatorFillBinaryMask.ts +2 -1
- package/src/History/PixelMutator/mutatorInvert.ts +3 -2
- package/src/History/PixelMutator.ts +1 -2
- package/src/Paint/PaintRect.ts +4 -1
- package/src/Paint/Render/PaintCursorRenderer.ts +40 -28
- package/src/Paint/_paint-types.ts +5 -0
- package/src/PixelData/_pixelData-types.ts +7 -0
- package/src/PixelData/cropPixelData.ts +36 -0
- package/src/PixelData/fillPixelData.ts +6 -6
- package/src/PixelData/trimPixelData.ts +49 -0
- package/src/index.ts +2 -0
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 interface PaintRect {\n w: number;\n h: number;\n centerOffsetX: number;\n centerOffsetY: number;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFscGhhTWFzaywgQmluYXJ5TWFzayB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuZXhwb3J0IGVudW0gUGFpbnRNYXNrT3V0bGluZSB7XG4gIE1BU0tFRCxcbiAgQ0lSQ0xFLFxuICBSRUNULFxufVxuaW50ZXJmYWNlIEJhc2VQYWludE1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiB7XG4gIHJlYWRvbmx5IG91dGxpbmVUeXBlOiBUO1xuICByZWFkb25seSBjZW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNlbnRlck9mZnNldFk6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGFpbnRBbHBoYU1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiBleHRlbmRzIEJhc2VQYWludE1hc2s8VD4sIEFscGhhTWFzayB7fVxuZXhwb3J0IGludGVyZmFjZSBQYWludEJpbmFyeU1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiBleHRlbmRzIEJhc2VQYWludE1hc2s8VD4sIEJpbmFyeU1hc2sge31cbmV4cG9ydCB0eXBlIFBhaW50TWFzayA9IFBhaW50QWxwaGFNYXNrPGFueT4gfCBQYWludEJpbmFyeU1hc2s8YW55PjtcbmV4cG9ydCBpbnRlcmZhY2UgUGFpbnRSZWN0IHtcbiAgdzogbnVtYmVyO1xuICBoOiBudW1iZXI7XG4gIGNlbnRlck9mZnNldFg6IG51bWJlcjtcbiAgY2VudGVyT2Zmc2V0WTogbnVtYmVyO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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=","export function makePaintRect(w: number, h: number): PaintRect {\n return {\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gbWFrZVBhaW50UmVjdCh3OiBudW1iZXIsIGg6IG51bWJlcik6IFBhaW50UmVjdCB7XG4gIHJldHVybiB7XG4gICAgdyxcbiAgICBoLFxuICAgIGNlbnRlck9mZnNldFg6ICgtKHcgLSAxID4+IDEpKSxcbiAgICBjZW50ZXJPZmZzZXRZOiAoLShoIC0gMSA+PiAxKSlcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 { type PaintMask, 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 currentMask: PaintMask = {\n type: MaskType.BINARY,\n outlineType: PaintMaskOutline.RECT,\n w: 1,\n h: 1,\n centerOffsetX: (-(10 - 1 >> 1)),\n centerOffsetY: (-(10 - 1 >> 1))\n } as PaintMask;\n let outline: BinaryMask;\n function update(paintMask?: PaintMask, scale?: number, color?: Color32, alphaThreshold = 127) {\n currentMask = paintMask ?? currentMask;\n _scale = scale ?? _scale;\n _color = color ?? _color;\n updateBuffer(currentMask.w * _scale + 2 * _scale, currentMask.h * _scale + 2 * _scale);\n if (currentMask.type === MaskType.BINARY) {\n if (currentMask.outlineType === PaintMaskOutline.CIRCLE) {\n outline = makeCircleBinaryMaskOutline(currentMask.w, _scale);\n } else if (currentMask.outlineType === PaintMaskOutline.RECT) {\n outline = makeRectBinaryMaskOutline(currentMask.w, currentMask.h, _scale);\n } else if (currentMask.outlineType === PaintMaskOutline.MASKED) {\n outline = makeBinaryMaskOutline(currentMask, _scale);\n }\n } else if (currentMask.type === MaskType.ALPHA) {\n const mask = makeBinaryMaskFromAlphaMask(currentMask, alphaThreshold);\n outline = makeBinaryMaskOutline(mask, _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 + currentMask.centerOffsetX;\n boundsScratch.y = centerY + currentMask.centerOffsetY;\n boundsScratch.w = currentMask.w;\n boundsScratch.h = currentMask.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 + currentMask.centerOffsetX * _scale - 1;\n boundsScaledScratch.y = centerY * _scale + currentMask.centerOffsetY * _scale - 1;\n boundsScaledScratch.w = currentMask.w * _scale;\n boundsScaledScratch.h = currentMask.h * _scale;\n return boundsScaledScratch;\n }\n function draw(drawCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, centerX: number, centerY: number) {\n const dx = centerX * _scale + currentMask.centerOffsetX * _scale - 1;\n const dy = centerY * _scale + currentMask.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 currentMask\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUmV1c2FibGVPZmZzY3JlZW5DYW52YXMgfSBmcm9tICcuLi8uLi9DYW52YXMvUmV1c2FibGVDYW52YXMnO1xuaW1wb3J0IHsgcGFja0NvbG9yIH0gZnJvbSAnLi4vLi4vY29sb3InO1xuaW1wb3J0IHsgTWFza1R5cGUgfSBmcm9tICcuLi8uLi9NYXNrL19tYXNrLXR5cGVzJztcbmltcG9ydCB7IG1ha2VCaW5hcnlNYXNrRnJvbUFscGhhTWFzayB9IGZyb20gJy4uLy4uL01hc2svQmluYXJ5TWFzay9tYWtlQmluYXJ5TWFza0Zyb21BbHBoYU1hc2snO1xuaW1wb3J0IHsgbWFrZUJpbmFyeU1hc2tPdXRsaW5lIH0gZnJvbSAnLi4vLi4vTWFzay9CaW5hcnlNYXNrL21ha2VCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBtYWtlQ2lyY2xlQmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi8uLi9NYXNrL0JpbmFyeU1hc2svbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lJztcbmltcG9ydCB7IG1ha2VSZWN0QmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi8uLi9NYXNrL0JpbmFyeU1hc2svbWFrZVJlY3RCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyBtYWtlUmV1c2FibGVQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvUmV1c2FibGVQaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBQYWludE1hc2ssIFBhaW50TWFza091dGxpbmUgfSBmcm9tICcuLi9fcGFpbnQtdHlwZXMnO1xuZXhwb3J0IHR5cGUgUGFpbnRDdXJzb3JSZW5kZXJlciA9IFJldHVyblR5cGU8dHlwZW9mIG1ha2VQYWludEN1cnNvclJlbmRlcmVyPjtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFpbnRDdXJzb3JSZW5kZXJlcjxUIGV4dGVuZHMgSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXMgPSBPZmZzY3JlZW5DYW52YXM+KHJldXNhYmxlQ2FudmFzRmFjdG9yeT86ICgpID0+IFJldXNhYmxlQ2FudmFzRmFjdG9yeTxUPikge1xuICBjb25zdCBmYWN0b3J5ID0gKHJldXNhYmxlQ2FudmFzRmFjdG9yeSA/PyBtYWtlUmV1c2FibGVPZmZzY3JlZW5DYW52YXMpIGFzIHVua25vd24gYXMgKCkgPT4gUmV1c2FibGVDYW52YXNGYWN0b3J5PFQ+O1xuICBjb25zdCB1cGRhdGVCdWZmZXIgPSBmYWN0b3J5KCk7XG4gIGNvbnN0IHtcbiAgICBjYW52YXMsXG4gICAgY3R4XG4gIH0gPSB1cGRhdGVCdWZmZXIoMSwgMSk7XG4gIGNvbnN0IGdldFBpeGVsRGF0YSA9IG1ha2VSZXVzYWJsZVBpeGVsRGF0YSgpO1xuICBsZXQgX2NvbG9yID0gcGFja0NvbG9yKDAsIDI1NSwgMjU1LCAyNTUpO1xuICBsZXQgX3NjYWxlID0gMTtcbiAgbGV0IGN1cnJlbnRNYXNrOiBQYWludE1hc2sgPSB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIG91dGxpbmVUeXBlOiBQYWludE1hc2tPdXRsaW5lLlJFQ1QsXG4gICAgdzogMSxcbiAgICBoOiAxLFxuICAgIGNlbnRlck9mZnNldFg6ICgtKDEwIC0gMSA+PiAxKSksXG4gICAgY2VudGVyT2Zmc2V0WTogKC0oMTAgLSAxID4+IDEpKVxuICB9IGFzIFBhaW50TWFzaztcbiAgbGV0IG91dGxpbmU6IEJpbmFyeU1hc2s7XG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWludE1hc2s/OiBQYWludE1hc2ssIHNjYWxlPzogbnVtYmVyLCBjb2xvcj86IENvbG9yMzIsIGFscGhhVGhyZXNob2xkID0gMTI3KSB7XG4gICAgY3VycmVudE1hc2sgPSBwYWludE1hc2sgPz8gY3VycmVudE1hc2s7XG4gICAgX3NjYWxlID0gc2NhbGUgPz8gX3NjYWxlO1xuICAgIF9jb2xvciA9IGNvbG9yID8/IF9jb2xvcjtcbiAgICB1cGRhdGVCdWZmZXIoY3VycmVudE1hc2sudyAqIF9zY2FsZSArIDIgKiBfc2NhbGUsIGN1cnJlbnRNYXNrLmggKiBfc2NhbGUgKyAyICogX3NjYWxlKTtcbiAgICBpZiAoY3VycmVudE1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICBpZiAoY3VycmVudE1hc2sub3V0bGluZVR5cGUgPT09IFBhaW50TWFza091dGxpbmUuQ0lSQ0xFKSB7XG4gICAgICAgIG91dGxpbmUgPSBtYWtlQ2lyY2xlQmluYXJ5TWFza091dGxpbmUoY3VycmVudE1hc2sudywgX3NjYWxlKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudE1hc2sub3V0bGluZVR5cGUgPT09IFBhaW50TWFza091dGxpbmUuUkVDVCkge1xuICAgICAgICBvdXRsaW5lID0gbWFrZVJlY3RCaW5hcnlNYXNrT3V0bGluZShjdXJyZW50TWFzay53LCBjdXJyZW50TWFzay5oLCBfc2NhbGUpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50TWFzay5vdXRsaW5lVHlwZSA9PT0gUGFpbnRNYXNrT3V0bGluZS5NQVNLRUQpIHtcbiAgICAgICAgb3V0bGluZSA9IG1ha2VCaW5hcnlNYXNrT3V0bGluZShjdXJyZW50TWFzaywgX3NjYWxlKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRNYXNrLnR5cGUgPT09IE1hc2tUeXBlLkFMUEhBKSB7XG4gICAgICBjb25zdCBtYXNrID0gbWFrZUJpbmFyeU1hc2tGcm9tQWxwaGFNYXNrKGN1cnJlbnRNYXNrLCBhbHBoYVRocmVzaG9sZCk7XG4gICAgICBvdXRsaW5lID0gbWFrZUJpbmFyeU1hc2tPdXRsaW5lKG1hc2ssIF9zY2FsZSk7XG4gICAgfVxuICAgIGNvbnN0IHBpeGVsRGF0YSA9IGdldFBpeGVsRGF0YShvdXRsaW5lLncsIG91dGxpbmUuaCk7XG4gICAgZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2socGl4ZWxEYXRhLCBfY29sb3IsIG91dGxpbmUpO1xuICAgIGN0eC5wdXRJbWFnZURhdGEocGl4ZWxEYXRhLmltYWdlRGF0YSwgMCwgMCk7XG4gIH1cbiAgY29uc3QgYm91bmRzU2NyYXRjaCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwXG4gIH07XG4gIGZ1bmN0aW9uIGdldEJvdW5kcyhjZW50ZXJYOiBudW1iZXIsIGNlbnRlclk6IG51bWJlcik6IFJlY3Qge1xuICAgIGJvdW5kc1NjcmF0Y2gueCA9IGNlbnRlclggKyBjdXJyZW50TWFzay5jZW50ZXJPZmZzZXRYO1xuICAgIGJvdW5kc1NjcmF0Y2gueSA9IGNlbnRlclkgKyBjdXJyZW50TWFzay5jZW50ZXJPZmZzZXRZO1xuICAgIGJvdW5kc1NjcmF0Y2gudyA9IGN1cnJlbnRNYXNrLnc7XG4gICAgYm91bmRzU2NyYXRjaC5oID0gY3VycmVudE1hc2suaDtcbiAgICByZXR1cm4gYm91bmRzU2NyYXRjaDtcbiAgfVxuICBjb25zdCBib3VuZHNTY2FsZWRTY3JhdGNoID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0T3V0bGluZUJvdW5kc1NjYWxlZChjZW50ZXJYOiBudW1iZXIsIGNlbnRlclk6IG51bWJlcik6IFJlY3Qge1xuICAgIGJvdW5kc1NjYWxlZFNjcmF0Y2gueCA9IGNlbnRlclggKiBfc2NhbGUgKyBjdXJyZW50TWFzay5jZW50ZXJPZmZzZXRYICogX3NjYWxlIC0gMTtcbiAgICBib3VuZHNTY2FsZWRTY3JhdGNoLnkgPSBjZW50ZXJZICogX3NjYWxlICsgY3VycmVudE1hc2suY2VudGVyT2Zmc2V0WSAqIF9zY2FsZSAtIDE7XG4gICAgYm91bmRzU2NhbGVkU2NyYXRjaC53ID0gY3VycmVudE1hc2sudyAqIF9zY2FsZTtcbiAgICBib3VuZHNTY2FsZWRTY3JhdGNoLmggPSBjdXJyZW50TWFzay5oICogX3NjYWxlO1xuICAgIHJldHVybiBib3VuZHNTY2FsZWRTY3JhdGNoO1xuICB9XG4gIGZ1bmN0aW9uIGRyYXcoZHJhd0N0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIHwgT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBjZW50ZXJYOiBudW1iZXIsIGNlbnRlclk6IG51bWJlcikge1xuICAgIGNvbnN0IGR4ID0gY2VudGVyWCAqIF9zY2FsZSArIGN1cnJlbnRNYXNrLmNlbnRlck9mZnNldFggKiBfc2NhbGUgLSAxO1xuICAgIGNvbnN0IGR5ID0gY2VudGVyWSAqIF9zY2FsZSArIGN1cnJlbnRNYXNrLmNlbnRlck9mZnNldFkgKiBfc2NhbGUgLSAxO1xuICAgIGRyYXdDdHguZHJhd0ltYWdlKGNhbnZhcywgTWF0aC5mbG9vcihkeCksIE1hdGguZmxvb3IoZHkpKTtcbiAgfVxuICBmdW5jdGlvbiBnZXRTZXR0aW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29sb3I6IF9jb2xvcixcbiAgICAgIHNjYWxlOiBfc2NhbGUsXG4gICAgICBjdXJyZW50TWFza1xuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB1cGRhdGUsXG4gICAgZ2V0Qm91bmRzLFxuICAgIGdldEJvdW5kc1NjYWxlZDogZ2V0T3V0bGluZUJvdW5kc1NjYWxlZCxcbiAgICBkcmF3LFxuICAgIGdldFNldHRpbmdzXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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.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/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//# 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 | null {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const targetWidth = this.config.target.w;\n const targetHeight = this.config.target.h;\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 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 | null {\n const shift = this.config.tileShift;\n const columns = this.config.targetColumns;\n const targetWidth = this.config.target.w;\n const targetHeight = this.config.target.h;\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 const startX = clipX1 >> shift;\n const startY = clipY1 >> shift;\n const endX = clipX2 >> shift;\n const endY = clipY2 >> 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+IGJvb2xlYW47XG5leHBvcnQgY2xhc3MgUGl4ZWxBY2N1bXVsYXRvciB7XG4gIHB1YmxpYyBsb29rdXA6IChQaXhlbFRpbGUgfCB1bmRlZmluZWQpW107XG4gIHB1YmxpYyBiZWZvcmVUaWxlczogUGl4ZWxUaWxlW107XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIHJlYWRvbmx5IHBpeGVsVGlsZVBvb2w6IFRpbGVQb29sPFBpeGVsVGlsZT4pIHtcbiAgICB0aGlzLmxvb2t1cCA9IFtdO1xuICAgIHRoaXMuYmVmb3JlVGlsZXMgPSBbXTtcbiAgfVxuICByZWN5Y2xlUGF0Y2gocGF0Y2g6IFBpeGVsUGF0Y2hUaWxlcykge1xuICAgIHRoaXMucGl4ZWxUaWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYmVmb3JlVGlsZXMpO1xuICAgIHRoaXMucGl4ZWxUaWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYWZ0ZXJUaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHggcGl4ZWwgeCBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB5IHBpeGVsIHkgY29vcmRpbmF0ZVxuICAgKi9cbiAgc3RvcmVQaXhlbEJlZm9yZVN0YXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogRGlkQ2hhbmdlRm4gfCBudWxsIHtcbiAgICBjb25zdCBzaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWcudGFyZ2V0Q29sdW1ucztcbiAgICBjb25zdCB0YXJnZXRXaWR0aCA9IHRoaXMuY29uZmlnLnRhcmdldC53O1xuICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHRoaXMuY29uZmlnLnRhcmdldC5oO1xuXG4gICAgLy8gUmV0dXJuIGEgbm8tb3AgaWYgdGhlIHBpeGVsIGlzIG91dHNpZGUgdGhlIHRhcmdldCBib3VuZGFyaWVzXG4gICAgaWYgKHggPCAwIHx8IHggPj0gdGFyZ2V0V2lkdGggfHwgeSA8IDAgfHwgeSA+PSB0YXJnZXRIZWlnaHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB0eCA9IHggPj4gc2hpZnQ7XG4gICAgY29uc3QgdHkgPSB5ID4+IHNoaWZ0O1xuICAgIGNvbnN0IGlkID0gdHkgKiBjb2x1bW5zICsgdHg7XG4gICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF07XG4gICAgbGV0IGFkZGVkID0gZmFsc2U7XG4gICAgaWYgKCF0aWxlKSB7XG4gICAgICB0aWxlID0gdGhpcy5waXhlbFRpbGVQb29sLmdldFRpbGUoaWQsIHR4LCB0eSk7XG4gICAgICB0aGlzLmV4dHJhY3RTdGF0ZSh0aWxlKTtcbiAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGU7XG4gICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSk7XG4gICAgICBhZGRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoZGlkQ2hhbmdlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWRpZENoYW5nZSAmJiBhZGRlZCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnBvcCgpO1xuICAgICAgICB0aGlzLmxvb2t1cFtpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGl4ZWxUaWxlUG9vbC5yZWxlYXNlVGlsZSh0aWxlISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHggcGl4ZWwgeCBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB5IHBpeGVsIHkgY29vcmRpbmF0ZVxuICAgKiBAcGFyYW0gdyBwaXhlbCB3aWR0aFxuICAgKiBAcGFyYW0gaCBwaXhlbCBoZWlnaHRcbiAgICovXG4gIHN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogRGlkQ2hhbmdlRm4gfCBudWxsIHtcbiAgICBjb25zdCBzaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWcudGFyZ2V0Q29sdW1ucztcbiAgICBjb25zdCB0YXJnZXRXaWR0aCA9IHRoaXMuY29uZmlnLnRhcmdldC53O1xuICAgIGNvbnN0IHRhcmdldEhlaWdodCA9IHRoaXMuY29uZmlnLnRhcmdldC5oO1xuXG4gICAgLy8gQ2xhbXAgdGhlIGJvdW5kaW5nIGJveCB0byB0aGUgYWN0dWFsIGNhbnZhcyBkaW1lbnNpb25zXG4gICAgY29uc3QgY2xpcFgxID0gTWF0aC5tYXgoMCwgeCk7XG4gICAgY29uc3QgY2xpcFkxID0gTWF0aC5tYXgoMCwgeSk7XG4gICAgY29uc3QgY2xpcFgyID0gTWF0aC5taW4odGFyZ2V0V2lkdGggLSAxLCB4ICsgdyAtIDEpO1xuICAgIGNvbnN0IGNsaXBZMiA9IE1hdGgubWluKHRhcmdldEhlaWdodCAtIDEsIHkgKyBoIC0gMSk7XG5cbiAgICAvLyBJZiB0aGUgcmVnaW9uIGlzIGVudGlyZWx5IG9mZi1jYW52YXMsIHJldHVybiBhIG5vLW9wXG4gICAgaWYgKGNsaXBYMiA8IGNsaXBYMSB8fCBjbGlwWTIgPCBjbGlwWTEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBzdGFydFggPSBjbGlwWDEgPj4gc2hpZnQ7XG4gICAgY29uc3Qgc3RhcnRZID0gY2xpcFkxID4+IHNoaWZ0O1xuICAgIGNvbnN0IGVuZFggPSBjbGlwWDIgPj4gc2hpZnQ7XG4gICAgY29uc3QgZW5kWSA9IGNsaXBZMiA+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 if (!didChange) return false;\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/PyB0YXJnZXQuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKCFkaWRDaGFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQsIG1hc2ssIG9wdHMpKTtcbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\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 if (!didChange) return false;\n const b = applyBinaryMaskToPixelData(target, mask, opts);\n console.log({\n b\n });\n return didChange(b);\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9hcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSc7XG5pbXBvcnQgeyB0eXBlIEhpc3RvcnlNdXRhdG9yIH0gZnJvbSAnLi4vUGl4ZWxXcml0ZXInO1xuY29uc3QgZGVmYXVsdHMgPSB7XG4gIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckFwcGx5QmluYXJ5TWFzayA9ICgod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzOiBEZXBzID0gZGVmYXVsdHMpID0+IHtcbiAgY29uc3Qge1xuICAgIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhID0gZGVmYXVsdHMuYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGFcbiAgfSA9IGRlcHM7XG4gIHJldHVybiB7XG4gICAgYXBwbHlCaW5hcnlNYXNrKG1hc2s6IEJpbmFyeU1hc2ssIG9wdHM/OiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHdyaXRlci5jb25maWcudGFyZ2V0O1xuICAgICAgY29uc3QgeCA9IG9wdHM/LnggPz8gMDtcbiAgICAgIGNvbnN0IHkgPSBvcHRzPy55ID8/IDA7XG4gICAgICBjb25zdCB3ID0gb3B0cz8udyA/PyB0YXJnZXQudztcbiAgICAgIGNvbnN0IGggPSBvcHRzPy5oID8/IHRhcmdldC5oO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICBpZiAoIWRpZENoYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgY29uc3QgYiA9IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cyk7XG4gICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgIGJcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShiKTtcbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 (!didChange) return false;\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/LmggPz8gdGFyZ2V0Lmg7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIGlmICghZGlkQ2hhbmdlKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAobWFzay50eXBlID09PSBNYXNrVHlwZS5CSU5BUlkpIHtcbiAgICAgICAgcmV0dXJuIGRpZENoYW5nZShhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQsIG1hc2ssIG9wdHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQsIG1hc2ssIG9wdHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 if (!didChange) return false;\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/PyBzcmMuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKCFkaWRDaGFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 if (!didChange) return false;\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/IHNyYy5oO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICBpZiAoIWRpZENoYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 if (!didChange) return false;\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/IHRhcmdldC5oO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICBpZiAoIWRpZENoYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZENvbG9yUGl4ZWxEYXRhKHRhcmdldCwgY29sb3IsIG9wdHMpKTtcbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 if (!didChange) return false;\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+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrXG4gIH0gPSBkZXBzO1xuICBjb25zdCBPUFRTID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBhbHBoYTogMjU1XG4gIH07XG4gIHJldHVybiB7XG4gICAgYmxlbmRDb2xvclBhaW50QWxwaGFNYXNrKGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludEFscGhhTWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIsIGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHR4ID0geCArIG1hc2suY2VudGVyT2Zmc2V0WDtcbiAgICAgIGNvbnN0IHR5ID0geSArIG1hc2suY2VudGVyT2Zmc2V0WTtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHR4LCB0eSwgbWFzay53LCBtYXNrLmgpO1xuICAgICAgaWYgKCFkaWRDaGFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIE9QVFMueCA9IHR4O1xuICAgICAgT1BUUy55ID0gdHk7XG4gICAgICBPUFRTLmFscGhhID0gYWxwaGE7XG4gICAgICBPUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBjb2xvciwgbWFzaywgT1BUUykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+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 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 if (!didChange) return false;\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+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQ29sb3JQYWludEJpbmFyeU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrXG4gIH0gPSBkZXBzO1xuICBjb25zdCBPUFRTID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICBhbHBoYTogMjU1XG4gIH07XG4gIHJldHVybiB7XG4gICAgYmxlbmRDb2xvclBhaW50QmluYXJ5TWFzayhjb2xvcjogQ29sb3IzMiwgbWFzazogUGFpbnRCaW5hcnlNYXNrLCB4OiBudW1iZXIsIHk6IG51bWJlciwgYWxwaGEgPSAyNTUsIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdHggPSB4ICsgbWFzay5jZW50ZXJPZmZzZXRYO1xuICAgICAgY29uc3QgdHkgPSB5ICsgbWFzay5jZW50ZXJPZmZzZXRZO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUodHgsIHR5LCBtYXNrLncsIG1hc2suaCk7XG4gICAgICBpZiAoIWRpZENoYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgT1BUUy54ID0gdHg7XG4gICAgICBPUFRTLnkgPSB0eTtcbiAgICAgIE9QVFMuYWxwaGEgPSBhbHBoYTtcbiAgICAgIE9QVFMuYmxlbmRGbiA9IGJsZW5kRm47XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBjb2xvciwgbWFzaywgT1BUUykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 if (!didChange) return false;\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+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2ssXG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayA9IGRlZmF1bHRzLmJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2tcbiAgfSA9IGRlcHM7XG4gIGNvbnN0IE9QVFMgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIGFscGhhOiAyNTVcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yUGFpbnRNYXNrKGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludE1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0KTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB0eCA9IHggKyBtYXNrLmNlbnRlck9mZnNldFg7XG4gICAgICBjb25zdCB0eSA9IHkgKyBtYXNrLmNlbnRlck9mZnNldFk7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh0eCwgdHksIG1hc2sudywgbWFzay5oKTtcbiAgICAgIGlmICghZGlkQ2hhbmdlKSByZXR1cm4gZmFsc2U7XG4gICAgICBPUFRTLnggPSB0eDtcbiAgICAgIE9QVFMueSA9IHR5O1xuICAgICAgT1BUUy5hbHBoYSA9IGFscGhhO1xuICAgICAgT1BUUy5ibGVuZEZuID0gYmxlbmRGbjtcbiAgICAgIGlmIChtYXNrLnR5cGUgPT09IE1hc2tUeXBlLkJJTkFSWSkge1xuICAgICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBjb2xvciwgbWFzaywgT1BUUykpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBjb2xvciwgbWFzaywgT1BUUykpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 if (!didChange) return false;\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+IDEpKTtcbiAgICAgIE9QVFMueCA9IHRvcExlZnRYO1xuICAgICAgT1BUUy55ID0gdG9wTGVmdFk7XG4gICAgICBPUFRTLncgPSBicnVzaFdpZHRoO1xuICAgICAgT1BUUy5oID0gYnJ1c2hIZWlnaHQ7XG4gICAgICBPUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICAgICAgT1BUUy5hbHBoYSA9IGFscGhhO1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUodG9wTGVmdFgsIHRvcExlZnRZLCBicnVzaFdpZHRoLCBicnVzaEhlaWdodCk7XG4gICAgICBpZiAoIWRpZENoYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZENvbG9yUGl4ZWxEYXRhKHRhcmdldCwgY29sb3IsIE9QVFMpKTtcbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 (!didChange) return false;\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/PyBzcmMuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKCFkaWRDaGFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmIChtYXNrLnR5cGUgPT09IE1hc2tUeXBlLkJJTkFSWSkge1xuICAgICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgc3JjLCBtYXNrLCBvcHRzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBzcmMsIG1hc2ssIG9wdHMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 if (!didChange) return false;\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/OiBCbGVuZENvbG9yMzIpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVBpeGVsQmVmb3JlU3RhdGUoeCwgeSk7XG4gICAgICBpZiAoIWRpZENoYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZFBpeGVsKHdyaXRlci5jb25maWcudGFyZ2V0LCB4LCB5LCBjb2xvciwgYWxwaGEsIGJsZW5kRm4pKTtcbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 if (!didChange) return false;\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/PyBzcmMuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKCFkaWRDaGFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGEod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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 === '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 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/OiBudW1iZXIsIF93PzogbnVtYmVyLCBfaD86IG51bWJlcik6IGJvb2xlYW4ge1xuICBjb25zdCBkc3RXID0gZHN0Lnc7XG4gIGNvbnN0IGRzdEggPSBkc3QuaDtcbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcbiAgbGV0IHc6IG51bWJlcjtcbiAgbGV0IGg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3g7XG4gICAgeSA9IF95ITtcbiAgICB3ID0gX3chO1xuICAgIGggPSBfaCE7XG4gIH0gZWxzZSBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgIHggPSBfeC54ID8/IDA7XG4gICAgeSA9IF94LnkgPz8gMDtcbiAgICB3ID0gX3gudyA/PyBkc3RXO1xuICAgIGggPSBfeC5oID8/IGRzdEg7XG4gIH0gZWxzZSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gICAgdyA9IGRzdFc7XG4gICAgaCA9IGRzdEg7XG4gIH1cblxuICAvLyBJbmxpbmUgYm91bmRzIGNsaXBwaW5nXG4gIGxldCBkc3RYID0geDtcbiAgbGV0IGRzdFkgPSB5O1xuICBsZXQgZmlsbFcgPSB3O1xuICBsZXQgZmlsbEggPSBoO1xuICBpZiAoZHN0WCA8IDApIHtcbiAgICBmaWxsVyArPSBkc3RYO1xuICAgIGRzdFggPSAwO1xuICB9XG4gIGlmIChkc3RZIDwgMCkge1xuICAgIGZpbGxIICs9IGRzdFk7XG4gICAgZHN0WSA9IDA7XG4gIH1cbiAgZmlsbFcgPSBNYXRoLm1pbihmaWxsVywgZHN0VyAtIGRzdFgpO1xuICBmaWxsSCA9IE1hdGgubWluKGZpbGxILCBkc3RIIC0gZHN0WSk7XG4gIGlmIChmaWxsVyA8PSAwIHx8IGZpbGxIIDw9IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTtcbiAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcblxuICAvLyBGYXN0LXBhdGg6IElmIHRoZSBhcmVhIHNwYW5zIHRoZSBmdWxsIHdpZHRoLCB3ZSBjYW4gdHJlYXQgaXQgYXMgYSBjb250aWd1b3VzIDFEIGFycmF5XG4gIGlmIChkc3RYID09PSAwICYmIGZpbGxXID09PSBkc3RXKSB7XG4gICAgY29uc3Qgc3RhcnQgPSBkc3RZICogZHN0VztcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGZpbGxXICogZmlsbEg7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIGlmIChkc3QzMltpXSAhPT0gY29sb3IpIHtcbiAgICAgICAgZHN0MzJbaV0gPSBjb2xvcjtcbiAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXNDaGFuZ2VkO1xuICB9XG5cbiAgLy8gU3RhbmRhcmQgcGF0aDogcm93LWJ5LXJvd1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgZmlsbEg7IGl5KyspIHtcbiAgICBjb25zdCByb3dPZmZzZXQgPSAoZHN0WSArIGl5KSAqIGRzdFc7XG4gICAgY29uc3Qgc3RhcnQgPSByb3dPZmZzZXQgKyBkc3RYO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgZmlsbFc7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIGlmIChkc3QzMltpXSAhPT0gY29sb3IpIHtcbiAgICAgICAgZHN0MzJbaV0gPSBjb2xvcjtcbiAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNDaGFuZ2VkO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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>): 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 const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n if (!didChange) return false;\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+KTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldDtcbiAgICAgIGNvbnN0IHggPSByZWN0Py54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gcmVjdD8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IHJlY3Q/LncgPz8gdGFyZ2V0Lnc7XG4gICAgICBjb25zdCBoID0gcmVjdD8uaCA/PyB0YXJnZXQuaDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKCFkaWRDaGFuZ2UpIHJldHVybiBmYWxzZTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoZmlsbFBpeGVsRGF0YSh0YXJnZXQsIDAgYXMgQ29sb3IzMiwgeCwgeSwgdywgaCkpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 const config = writer.config;\n function fill(color: Color32, rect?: Partial<Rect>): boolean;\n function fill(color: Color32, x: number, y: number, w: number, h: number): boolean;\n function fill(color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): boolean {\n const target = config.target;\n const dstW = target.w;\n const dstH = target.h;\n let x: number;\n let y: number;\n let w: number;\n let h: number;\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 const didChange = writer.accumulator.storeRegionBeforeState(x, y, w, h);\n if (!didChange) return false;\n return didChange(fillPixelData(target, color, x, y, w, h));\n }\n return {\n fill\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmaWxsUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBmaWxsUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgY29uc3QgY29uZmlnID0gd3JpdGVyLmNvbmZpZztcbiAgZnVuY3Rpb24gZmlsbChjb2xvcjogQ29sb3IzMiwgcmVjdD86IFBhcnRpYWw8UmVjdD4pOiBib29sZWFuO1xuICBmdW5jdGlvbiBmaWxsKGNvbG9yOiBDb2xvcjMyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiBib29sZWFuO1xuICBmdW5jdGlvbiBmaWxsKGNvbG9yOiBDb2xvcjMyLCBfeD86IFBhcnRpYWw8UmVjdD4gfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IGRzdFcgPSB0YXJnZXQudztcbiAgICBjb25zdCBkc3RIID0gdGFyZ2V0Lmg7XG4gICAgbGV0IHg6IG51bWJlcjtcbiAgICBsZXQgeTogbnVtYmVyO1xuICAgIGxldCB3OiBudW1iZXI7XG4gICAgbGV0IGg6IG51bWJlcjtcbiAgICBpZiAodHlwZW9mIF94ID09PSAnbnVtYmVyJykge1xuICAgICAgeCA9IF94O1xuICAgICAgeSA9IF95ITtcbiAgICAgIHcgPSBfdyE7XG4gICAgICBoID0gX2ghO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgICAgeCA9IF94LnggPz8gMDtcbiAgICAgIHkgPSBfeC55ID8/IDA7XG4gICAgICB3ID0gX3gudyA/PyBkc3RXO1xuICAgICAgaCA9IF94LmggPz8gZHN0SDtcbiAgICB9IGVsc2Uge1xuICAgICAgeCA9IDA7XG4gICAgICB5ID0gMDtcbiAgICAgIHcgPSBkc3RXO1xuICAgICAgaCA9IGRzdEg7XG4gICAgfVxuICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgIGlmICghZGlkQ2hhbmdlKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGRpZENoYW5nZShmaWxsUGl4ZWxEYXRhKHRhcmdldCwgY29sb3IsIHgsIHksIHcsIGgpKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGxcbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+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): boolean {\n const didChange = writer.accumulator.storeRegionBeforeState(x, y, mask.w, mask.h);\n if (!didChange) return false;\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+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGxCaW5hcnlNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IERlcHMgPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5maWxsUGl4ZWxEYXRhQmluYXJ5TWFza1xuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBmaWxsQmluYXJ5TWFzayhjb2xvcjogQ29sb3IzMiwgbWFzazogQmluYXJ5TWFzaywgeCA9IDAsIHkgPSAwKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCBtYXNrLncsIG1hc2suaCk7XG4gICAgICBpZiAoIWRpZENoYW5nZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgY29sb3IsIG1hc2ssIHgsIHkpKTtcbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\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): 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 (!didChange) return false;\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+IHtcbiAgY29uc3Qge1xuICAgIGludmVydFBpeGVsRGF0YSA9IGRlZmF1bHRzLmludmVydFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBpbnZlcnQob3B0cz86IFBpeGVsTXV0YXRlT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQ7XG4gICAgICBjb25zdCB4ID0gb3B0cz8ueCA/PyAwO1xuICAgICAgY29uc3QgeSA9IG9wdHM/LnkgPz8gMDtcbiAgICAgIGNvbnN0IHcgPSBvcHRzPy53ID8/IHRhcmdldC53O1xuICAgICAgY29uc3QgaCA9IG9wdHM/LmggPz8gdGFyZ2V0Lmg7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIGlmICghZGlkQ2hhbmdlKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlPy4oaW52ZXJ0UGl4ZWxEYXRhKHRhcmdldCwgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+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 } 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 ...mutatorInvert(writer)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtdXRhdG9yQXBwbHlBbHBoYU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlBbHBoYU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5QmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUJpbmFyeU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQWxwaGFNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQWxwaGFNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRCaW5hcnlNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZENvbG9yIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3InO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3JQYWludEFscGhhTWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRBbHBoYU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3JQYWludEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvclBhaW50QmluYXJ5TWFzayc7XG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRDb2xvclBhaW50TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZENvbG9yUGFpbnRSZWN0IH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3JQYWludFJlY3QnO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kTWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZE1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kUGl4ZWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCc7XG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGEnO1xuaW1wb3J0IHsgbXV0YXRvckNsZWFyIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckNsZWFyJztcbmltcG9ydCB7IG11dGF0b3JGaWxsIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckZpbGwnO1xuaW1wb3J0IHsgbXV0YXRvckZpbGxCaW5hcnlNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckZpbGxCaW5hcnlNYXNrJztcbmltcG9ydCB7IG11dGF0b3JJbnZlcnQgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9ySW52ZXJ0JztcbmV4cG9ydCBmdW5jdGlvbiBtYWtlRnVsbFBpeGVsTXV0YXRvcih3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4pIHtcbiAgcmV0dXJuIHtcbiAgICAvLyBAc29ydFxuICAgIC4uLm11dGF0b3JBcHBseUFscGhhTWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JBcHBseUJpbmFyeU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQXBwbHlNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQmluYXJ5TWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZENvbG9yKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3JQYWludEFscGhhTWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZENvbG9yUGFpbnRCaW5hcnlNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3JQYWludE1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRDb2xvclBhaW50UmVjdCh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZE1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRQaXhlbCh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsRGF0YSh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JDbGVhcih3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JGaWxsKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckZpbGxCaW5hcnlNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckludmVydCh3cml0ZXIpXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 drawRaw(drawCtx: CanvasRenderingContext2D | OffscreenCanvasRenderingContext2D, x: number, y: number) {\n drawCtx.drawImage(canvas, Math.floor(x * _scale), Math.floor(y * _scale));\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 drawRaw,\n getSettings\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUmV1c2FibGVPZmZzY3JlZW5DYW52YXMgfSBmcm9tICcuLi8uLi9DYW52YXMvUmV1c2FibGVDYW52YXMnO1xuaW1wb3J0IHsgcGFja0NvbG9yIH0gZnJvbSAnLi4vLi4vY29sb3InO1xuaW1wb3J0IHsgTWFza1R5cGUgfSBmcm9tICcuLi8uLi9NYXNrL19tYXNrLXR5cGVzJztcbmltcG9ydCB7IG1ha2VCaW5hcnlNYXNrRnJvbUFscGhhTWFzayB9IGZyb20gJy4uLy4uL01hc2svQmluYXJ5TWFzay9tYWtlQmluYXJ5TWFza0Zyb21BbHBoYU1hc2snO1xuaW1wb3J0IHsgbWFrZUJpbmFyeU1hc2tPdXRsaW5lIH0gZnJvbSAnLi4vLi4vTWFzay9CaW5hcnlNYXNrL21ha2VCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBtYWtlQ2lyY2xlQmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi8uLi9NYXNrL0JpbmFyeU1hc2svbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lJztcbmltcG9ydCB7IG1ha2VSZWN0QmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi8uLi9NYXNrL0JpbmFyeU1hc2svbWFrZVJlY3RCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyBtYWtlUmV1c2FibGVQaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvUmV1c2FibGVQaXhlbERhdGEnO1xuaW1wb3J0IHsgUGFpbnRNYXNrT3V0bGluZSB9IGZyb20gJy4uL19wYWludC10eXBlcyc7XG5leHBvcnQgdHlwZSBQYWludEN1cnNvclJlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZVBhaW50Q3Vyc29yUmVuZGVyZXI+O1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWludEN1cnNvclJlbmRlcmVyPFQgZXh0ZW5kcyBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcyA9IE9mZnNjcmVlbkNhbnZhcz4ocmV1c2FibGVDYW52YXNGYWN0b3J5PzogKCkgPT4gUmV1c2FibGVDYW52YXNGYWN0b3J5PFQ+KSB7XG4gIGNvbnN0IGZhY3RvcnkgPSAocmV1c2FibGVDYW52YXNGYWN0b3J5ID8/IG1ha2VSZXVzYWJsZU9mZnNjcmVlbkNhbnZhcykgYXMgdW5rbm93biBhcyAoKSA9PiBSZXVzYWJsZUNhbnZhc0ZhY3Rvcnk8VD47XG4gIGNvbnN0IHVwZGF0ZUJ1ZmZlciA9IGZhY3RvcnkoKTtcbiAgY29uc3Qge1xuICAgIGNhbnZhcyxcbiAgICBjdHhcbiAgfSA9IHVwZGF0ZUJ1ZmZlcigxLCAxKTtcbiAgY29uc3QgZ2V0UGl4ZWxEYXRhID0gbWFrZVJldXNhYmxlUGl4ZWxEYXRhKCk7XG4gIGxldCBfY29sb3IgPSBwYWNrQ29sb3IoMCwgMjU1LCAyNTUsIDI1NSk7XG4gIGxldCBfc2NhbGUgPSAxO1xuICBsZXQgY3VycmVudEJydXNoOiBQYWludEJydXNoID0ge1xuICAgIHR5cGU6IG51bGwsXG4gICAgb3V0bGluZVR5cGU6IFBhaW50TWFza091dGxpbmUuUkVDVCxcbiAgICB3OiAxLFxuICAgIGg6IDEsXG4gICAgY2VudGVyT2Zmc2V0WDogKC0oMTAgLSAxID4+IDEpKSxcbiAgICBjZW50ZXJPZmZzZXRZOiAoLSgxMCAtIDEgPj4gMSkpLFxuICAgIGRhdGE6IG51bGxcbiAgfTtcbiAgbGV0IG91dGxpbmU6IEJpbmFyeU1hc2s7XG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWludE1hc2s/OiBQYWludEJydXNoLCBzY2FsZT86IG51bWJlciwgY29sb3I/OiBDb2xvcjMyLCBhbHBoYVRocmVzaG9sZCA9IDEyNykge1xuICAgIGN1cnJlbnRCcnVzaCA9IHBhaW50TWFzayA/PyBjdXJyZW50QnJ1c2g7XG4gICAgX3NjYWxlID0gc2NhbGUgPz8gX3NjYWxlO1xuICAgIF9jb2xvciA9IGNvbG9yID8/IF9jb2xvcjtcbiAgICB1cGRhdGVCdWZmZXIoY3VycmVudEJydXNoLncgKiBfc2NhbGUgKyAyICogX3NjYWxlLCBjdXJyZW50QnJ1c2guaCAqIF9zY2FsZSArIDIgKiBfc2NhbGUpO1xuICAgIGlmIChjdXJyZW50QnJ1c2gudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICBpZiAoY3VycmVudEJydXNoLm91dGxpbmVUeXBlID09PSBQYWludE1hc2tPdXRsaW5lLkNJUkNMRSkge1xuICAgICAgICBvdXRsaW5lID0gbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lKGN1cnJlbnRCcnVzaC53LCBfc2NhbGUpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50QnJ1c2gub3V0bGluZVR5cGUgPT09IFBhaW50TWFza091dGxpbmUuUkVDVCkge1xuICAgICAgICBvdXRsaW5lID0gbWFrZVJlY3RCaW5hcnlNYXNrT3V0bGluZShjdXJyZW50QnJ1c2gudywgY3VycmVudEJydXNoLmgsIF9zY2FsZSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRCcnVzaC5vdXRsaW5lVHlwZSA9PT0gUGFpbnRNYXNrT3V0bGluZS5NQVNLRUQpIHtcbiAgICAgICAgb3V0bGluZSA9IG1ha2VCaW5hcnlNYXNrT3V0bGluZShjdXJyZW50QnJ1c2gsIF9zY2FsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjdXJyZW50QnJ1c2gudHlwZSA9PT0gTWFza1R5cGUuQUxQSEEpIHtcbiAgICAgIGNvbnN0IG1hc2sgPSBtYWtlQmluYXJ5TWFza0Zyb21BbHBoYU1hc2soY3VycmVudEJydXNoLCBhbHBoYVRocmVzaG9sZCk7XG4gICAgICBvdXRsaW5lID0gbWFrZUJpbmFyeU1hc2tPdXRsaW5lKG1hc2ssIF9zY2FsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dGxpbmUgPSBtYWtlUmVjdEJpbmFyeU1hc2tPdXRsaW5lKGN1cnJlbnRCcnVzaC53LCBjdXJyZW50QnJ1c2guaCwgX3NjYWxlKTtcbiAgICB9XG4gICAgY29uc3QgcGl4ZWxEYXRhID0gZ2V0UGl4ZWxEYXRhKG91dGxpbmUudywgb3V0bGluZS5oKTtcbiAgICBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayhwaXhlbERhdGEsIF9jb2xvciwgb3V0bGluZSk7XG4gICAgY3R4LnB1dEltYWdlRGF0YShwaXhlbERhdGEuaW1hZ2VEYXRhLCAwLCAwKTtcbiAgfVxuICBjb25zdCBib3VuZHNTY3JhdGNoID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0Qm91bmRzKGNlbnRlclg6IG51bWJlciwgY2VudGVyWTogbnVtYmVyKTogUmVjdCB7XG4gICAgYm91bmRzU2NyYXRjaC54ID0gY2VudGVyWCArIGN1cnJlbnRCcnVzaC5jZW50ZXJPZmZzZXRYO1xuICAgIGJvdW5kc1NjcmF0Y2gueSA9IGNlbnRlclkgKyBjdXJyZW50QnJ1c2guY2VudGVyT2Zmc2V0WTtcbiAgICBib3VuZHNTY3JhdGNoLncgPSBjdXJyZW50QnJ1c2gudztcbiAgICBib3VuZHNTY3JhdGNoLmggPSBjdXJyZW50QnJ1c2guaDtcbiAgICByZXR1cm4gYm91bmRzU2NyYXRjaDtcbiAgfVxuICBjb25zdCBib3VuZHNTY2FsZWRTY3JhdGNoID0ge1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0T3V0bGluZUJvdW5kc1NjYWxlZChjZW50ZXJYOiBudW1iZXIsIGNlbnRlclk6IG51bWJlcik6IFJlY3Qge1xuICAgIGJvdW5kc1NjYWxlZFNjcmF0Y2gueCA9IGNlbnRlclggKiBfc2NhbGUgKyBjdXJyZW50QnJ1c2guY2VudGVyT2Zmc2V0WCAqIF9zY2FsZSAtIDE7XG4gICAgYm91bmRzU2NhbGVkU2NyYXRjaC55ID0gY2VudGVyWSAqIF9zY2FsZSArIGN1cnJlbnRCcnVzaC5jZW50ZXJPZmZzZXRZICogX3NjYWxlIC0gMTtcbiAgICBib3VuZHNTY2FsZWRTY3JhdGNoLncgPSBjdXJyZW50QnJ1c2gudyAqIF9zY2FsZTtcbiAgICBib3VuZHNTY2FsZWRTY3JhdGNoLmggPSBjdXJyZW50QnJ1c2guaCAqIF9zY2FsZTtcbiAgICByZXR1cm4gYm91bmRzU2NhbGVkU2NyYXRjaDtcbiAgfVxuICBmdW5jdGlvbiBkcmF3KGRyYXdDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIpIHtcbiAgICBjb25zdCBkeCA9IGNlbnRlclggKiBfc2NhbGUgKyBjdXJyZW50QnJ1c2guY2VudGVyT2Zmc2V0WCAqIF9zY2FsZSAtIDE7XG4gICAgY29uc3QgZHkgPSBjZW50ZXJZICogX3NjYWxlICsgY3VycmVudEJydXNoLmNlbnRlck9mZnNldFkgKiBfc2NhbGUgLSAxO1xuICAgIGRyYXdDdHguZHJhd0ltYWdlKGNhbnZhcywgTWF0aC5mbG9vcihkeCksIE1hdGguZmxvb3IoZHkpKTtcbiAgfVxuICBmdW5jdGlvbiBkcmF3UmF3KGRyYXdDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcbiAgICBkcmF3Q3R4LmRyYXdJbWFnZShjYW52YXMsIE1hdGguZmxvb3IoeCAqIF9zY2FsZSksIE1hdGguZmxvb3IoeSAqIF9zY2FsZSkpO1xuICB9XG4gIGZ1bmN0aW9uIGdldFNldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb2xvcjogX2NvbG9yLFxuICAgICAgc2NhbGU6IF9zY2FsZSxcbiAgICAgIGN1cnJlbnRCcnVzaFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB1cGRhdGUsXG4gICAgZ2V0Qm91bmRzLFxuICAgIGdldEJvdW5kc1NjYWxlZDogZ2V0T3V0bGluZUJvdW5kc1NjYWxlZCxcbiAgICBkcmF3LFxuICAgIGRyYXdSYXcsXG4gICAgZ2V0U2V0dGluZ3NcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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","import { setPixelData } from './PixelData';\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 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 const cropped = new ImageData(cw, ch);\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 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 return out ?? {\n data: dst32,\n imageData: cropped,\n w: cw,\n h: ch\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzZXRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsRGF0YSc7XG5leHBvcnQgZnVuY3Rpb24gY3JvcFBpeGVsRGF0YShzcmM6IFBpeGVsRGF0YTMyLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIsIG91dD86IE11dGFibGVQaXhlbERhdGEpOiBQaXhlbERhdGEge1xuICBjb25zdCBjeCA9IE1hdGgubWF4KHgsIDApO1xuICBjb25zdCBjeSA9IE1hdGgubWF4KHksIDApO1xuICBjb25zdCBjdyA9IE1hdGgubWluKHggKyB3LCBzcmMudykgLSBjeDtcbiAgY29uc3QgY2ggPSBNYXRoLm1pbih5ICsgaCwgc3JjLmgpIC0gY3k7XG4gIGlmIChjdyA8PSAwIHx8IGNoIDw9IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENyb3AgWyR7eH0sJHt5fSAke3d9eCR7aH1dIGRvZXMgbm90IG92ZXJsYXAgUGl4ZWxEYXRhIFske3NyYy53fXgke3NyYy5ofV1gKTtcbiAgfVxuICBjb25zdCBjcm9wcGVkID0gbmV3IEltYWdlRGF0YShjdywgY2gpO1xuICBsZXQgZHN0MzI6IFVpbnQzMkFycmF5O1xuICBpZiAob3V0KSB7XG4gICAgc2V0UGl4ZWxEYXRhKG91dCwgY3JvcHBlZCk7XG4gICAgZHN0MzIgPSBvdXQuZGF0YTtcbiAgfSBlbHNlIHtcbiAgICBkc3QzMiA9IG5ldyBVaW50MzJBcnJheShjcm9wcGVkLmRhdGEuYnVmZmVyKTtcbiAgfVxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjaDsgcm93KyspIHtcbiAgICBjb25zdCBzcmNPZmZzZXQgPSAoY3kgKyByb3cpICogc3JjLncgKyBjeDtcbiAgICBjb25zdCBkc3RPZmZzZXQgPSByb3cgKiBjdztcbiAgICBkc3QzMi5zZXQoc3JjLmRhdGEuc3ViYXJyYXkoc3JjT2Zmc2V0LCBzcmNPZmZzZXQgKyBjdyksIGRzdE9mZnNldCk7XG4gIH1cbiAgcmV0dXJuIG91dCA/PyB7XG4gICAgZGF0YTogZHN0MzIsXG4gICAgaW1hZ2VEYXRhOiBjcm9wcGVkLFxuICAgIHc6IGN3LFxuICAgIGg6IGNoXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 { cropPixelData } from './cropPixelData';\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 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 if (maxX === -1) return null;\n return {\n x: minX,\n y: minY,\n w: maxX - minX + 1,\n h: maxY - minY + 1\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 return cropPixelData(target, r.x, r.y, r.w, r.h);\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 cropPixelData(target, r.x, r.y, r.w, r.h, target);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcm9wUGl4ZWxEYXRhIH0gZnJvbSAnLi9jcm9wUGl4ZWxEYXRhJztcbmV4cG9ydCBmdW5jdGlvbiBnZXRQaXhlbERhdGFUcmFuc3BhcmVudFRyaW1tZWRCb3VuZHModGFyZ2V0OiBQaXhlbERhdGEzMik6IFJlY3QgfCBudWxsIHtcbiAgbGV0IG1pblggPSB0YXJnZXQudztcbiAgbGV0IG1pblkgPSB0YXJnZXQuaDtcbiAgbGV0IG1heFggPSAtMTtcbiAgbGV0IG1heFkgPSAtMTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCB0YXJnZXQuaDsgeSsrKSB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB0YXJnZXQudzsgeCsrKSB7XG4gICAgICBjb25zdCBhbHBoYSA9IHRhcmdldC5kYXRhW3kgKiB0YXJnZXQudyArIHhdID4+PiAyNDtcbiAgICAgIGlmIChhbHBoYSAhPT0gMCkge1xuICAgICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobWF4WCA9PT0gLTEpIHJldHVybiBudWxsO1xuICByZXR1cm4ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICB3OiBtYXhYIC0gbWluWCArIDEsXG4gICAgaDogbWF4WSAtIG1pblkgKyAxXG4gIH07XG59XG5leHBvcnQgZnVuY3Rpb24gdHJpbVRyYW5zcGFyZW50UGl4ZWxEYXRhKHRhcmdldDogUGl4ZWxEYXRhMzIpOiBQaXhlbERhdGEge1xuICBjb25zdCByID0gZ2V0UGl4ZWxEYXRhVHJhbnNwYXJlbnRUcmltbWVkQm91bmRzKHRhcmdldCk7XG4gIGlmICghcikge1xuICAgIHRocm93IG5ldyBFcnJvcignUGl4ZWxEYXRhIGlzIGZ1bGx5IHRyYW5zcGFyZW50IOKAlCBubyBjcm9wIGJvdW5kcyBmb3VuZCcpO1xuICB9XG4gIHJldHVybiBjcm9wUGl4ZWxEYXRhKHRhcmdldCwgci54LCByLnksIHIudywgci5oKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmltVHJhbnNwYXJlbnRQaXhlbERhdGFJblBsYWNlKHRhcmdldDogTXV0YWJsZVBpeGVsRGF0YSkge1xuICBjb25zdCByID0gZ2V0UGl4ZWxEYXRhVHJhbnNwYXJlbnRUcmltbWVkQm91bmRzKHRhcmdldCk7XG4gIGlmICghcikge1xuICAgIHRocm93IG5ldyBFcnJvcignUGl4ZWxEYXRhIGlzIGZ1bGx5IHRyYW5zcGFyZW50IOKAlCBubyBjcm9wIGJvdW5kcyBmb3VuZCcpO1xuICB9XG4gIGNyb3BQaXhlbERhdGEodGFyZ2V0LCByLngsIHIueSwgci53LCByLmgsIHRhcmdldCk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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"]}
|