pixel-data-js 0.27.0 → 0.28.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.
Files changed (139) hide show
  1. package/README.md +12 -2
  2. package/dist/index.prod.cjs +2222 -1045
  3. package/dist/index.prod.cjs.map +1 -1
  4. package/dist/index.prod.d.ts +542 -417
  5. package/dist/index.prod.js +2167 -1024
  6. package/dist/index.prod.js.map +1 -1
  7. package/package.json +11 -11
  8. package/src/Algorithm/floodFillSelection.ts +8 -6
  9. package/src/Algorithm/forEachLinePoint.ts +6 -6
  10. package/src/{Internal/resample32.ts → Algorithm/resampleUint32Array.ts} +11 -21
  11. package/src/BlendModes/blend-modes-fast.ts +169 -0
  12. package/src/BlendModes/blend-modes-perfect.ts +207 -0
  13. package/src/BlendModes/blend-modes.ts +9 -0
  14. package/src/Canvas/CanvasFrameRenderer.ts +20 -28
  15. package/src/Canvas/CanvasPixelDataRenderer.ts +23 -0
  16. package/src/Canvas/PixelCanvas.ts +2 -7
  17. package/src/Canvas/ReusableCanvas.ts +4 -12
  18. package/src/Canvas/_canvas-types.ts +26 -0
  19. package/src/History/PixelAccumulator.ts +17 -17
  20. package/src/History/PixelEngineConfig.ts +3 -3
  21. package/src/History/PixelMutator/mutatorApplyAlphaMask.ts +4 -3
  22. package/src/History/PixelMutator/mutatorApplyBinaryMask.ts +4 -3
  23. package/src/History/PixelMutator/mutatorApplyMask.ts +4 -3
  24. package/src/History/PixelMutator/mutatorBlendAlphaMask.ts +6 -4
  25. package/src/History/PixelMutator/mutatorBlendBinaryMask.ts +6 -4
  26. package/src/History/PixelMutator/mutatorBlendColor.ts +2 -2
  27. package/src/History/PixelMutator/mutatorBlendColorPaintAlphaMask.ts +2 -1
  28. package/src/History/PixelMutator/mutatorBlendColorPaintBinaryMask.ts +2 -1
  29. package/src/History/PixelMutator/mutatorBlendColorPaintMask.ts +3 -1
  30. package/src/History/PixelMutator/mutatorBlendColorPaintRect.ts +3 -3
  31. package/src/History/PixelMutator/mutatorBlendMask.ts +6 -4
  32. package/src/History/PixelMutator/mutatorBlendPixelData.ts +5 -4
  33. package/src/History/PixelMutator/mutatorClear.ts +4 -3
  34. package/src/History/PixelMutator/mutatorFill.ts +5 -4
  35. package/src/History/PixelMutator/mutatorFillBinaryMask.ts +2 -1
  36. package/src/History/PixelMutator/mutatorInvert.ts +2 -2
  37. package/src/History/PixelMutator.ts +1 -1
  38. package/src/History/PixelPatchTiles.ts +7 -7
  39. package/src/History/PixelWriter.ts +12 -63
  40. package/src/ImageData/ImageDataLike.ts +1 -1
  41. package/src/ImageData/_ImageData-types.ts +13 -0
  42. package/src/ImageData/copyImageData.ts +1 -1
  43. package/src/ImageData/extractImageDataBuffer.ts +3 -2
  44. package/src/ImageData/imageDataToUint32Array.ts +18 -0
  45. package/src/ImageData/resampleImageData.ts +3 -3
  46. package/src/ImageData/resizeImageData.ts +1 -1
  47. package/src/ImageData/serialization.ts +1 -1
  48. package/src/ImageData/uInt32ArrayToImageData.ts +1 -1
  49. package/src/ImageData/writeImageData.ts +2 -2
  50. package/src/ImageData/writeImageDataBuffer.ts +2 -2
  51. package/src/IndexedImage/IndexedImage.ts +56 -98
  52. package/src/IndexedImage/_indexedImage-types.ts +18 -0
  53. package/src/IndexedImage/getIndexedImageColorCounts.ts +3 -3
  54. package/src/IndexedImage/indexedImageToAverageColor.ts +1 -1
  55. package/src/IndexedImage/indexedImageToImageData.ts +4 -6
  56. package/src/IndexedImage/resampleIndexedImage.ts +7 -15
  57. package/src/Input/fileToImageData.ts +1 -1
  58. package/src/Internal/_errors.ts +2 -0
  59. package/src/Internal/macros.ts +14 -0
  60. package/src/Mask/AlphaMask.ts +1 -1
  61. package/src/Mask/BinaryMask/makeBinaryMaskFromAlphaMask.ts +23 -0
  62. package/src/Mask/BinaryMask/makeBinaryMaskOutline.ts +88 -0
  63. package/src/Mask/BinaryMask/makeCircleBinaryMaskOutline.ts +104 -0
  64. package/src/Mask/BinaryMask/makeRectBinaryMaskOutline.ts +34 -0
  65. package/src/Mask/BinaryMask.ts +1 -1
  66. package/src/Mask/_mask-types.ts +73 -0
  67. package/src/Mask/applyBinaryMaskToAlphaMask.ts +2 -1
  68. package/src/Mask/copyMask.ts +1 -1
  69. package/src/Mask/extractMask.ts +2 -1
  70. package/src/Mask/extractMaskBuffer.ts +1 -1
  71. package/src/Mask/mergeAlphaMasks.ts +6 -3
  72. package/src/Mask/mergeBinaryMasks.ts +2 -1
  73. package/src/Mask/setMaskData.ts +1 -1
  74. package/src/MaskRect/merge2BinaryMaskRects.ts +2 -2
  75. package/src/MaskRect/mergeBinaryMaskRects.ts +1 -1
  76. package/src/MaskRect/subtractBinaryMaskRects.ts +1 -1
  77. package/src/Paint/AlphaMaskPaintBuffer.ts +339 -0
  78. package/src/Paint/AlphaMaskPaintBufferCanvasRenderer.ts +78 -0
  79. package/src/Paint/BinaryMaskPaintBuffer.ts +254 -0
  80. package/src/Paint/BinaryMaskPaintBufferCanvasRenderer.ts +67 -0
  81. package/src/Paint/{PaintBuffer.ts → ColorPaintBuffer.ts} +148 -77
  82. package/src/Paint/{PaintBufferCanvasRenderer.ts → ColorPaintBufferCanvasRenderer.ts} +6 -5
  83. package/src/Paint/PaintCursorRenderer.ts +117 -0
  84. package/src/Paint/_paint-types.ts +22 -0
  85. package/src/Paint/eachTileInBounds.ts +45 -0
  86. package/src/Paint/makeCirclePaintMask.ts +74 -0
  87. package/src/Paint/makePaintMask.ts +5 -2
  88. package/src/Paint/makeRectFalloffPaintAlphaMask.ts +4 -2
  89. package/src/PixelData/PixelData.ts +15 -19
  90. package/src/PixelData/ReusablePixelData.ts +36 -0
  91. package/src/PixelData/_pixelData-types.ts +17 -0
  92. package/src/PixelData/applyAlphaMaskToPixelData.ts +80 -43
  93. package/src/PixelData/applyBinaryMaskToPixelData.ts +10 -8
  94. package/src/PixelData/applyMaskToPixelData.ts +4 -9
  95. package/src/PixelData/blendColorPixelData.ts +9 -8
  96. package/src/PixelData/blendColorPixelDataAlphaMask.ts +9 -7
  97. package/src/PixelData/blendColorPixelDataBinaryMask.ts +9 -7
  98. package/src/PixelData/blendColorPixelDataMask.ts +4 -2
  99. package/src/PixelData/blendColorPixelDataPaintAlphaMask.ts +4 -2
  100. package/src/PixelData/blendColorPixelDataPaintBinaryMask.ts +4 -2
  101. package/src/PixelData/blendColorPixelDataPaintMask.ts +5 -2
  102. package/src/PixelData/blendPixel.ts +6 -5
  103. package/src/PixelData/blendPixelData.ts +14 -13
  104. package/src/PixelData/blendPixelDataAlphaMask.ts +15 -13
  105. package/src/PixelData/blendPixelDataBinaryMask.ts +15 -13
  106. package/src/PixelData/blendPixelDataMask.ts +5 -3
  107. package/src/PixelData/blendPixelDataPaintBuffer.ts +5 -4
  108. package/src/PixelData/clearPixelDataFast.ts +4 -2
  109. package/src/PixelData/copyPixelData.ts +14 -0
  110. package/src/PixelData/extractPixelData.ts +8 -7
  111. package/src/PixelData/extractPixelDataBuffer.ts +9 -8
  112. package/src/PixelData/fillPixelData.ts +16 -14
  113. package/src/PixelData/fillPixelDataBinaryMask.ts +10 -8
  114. package/src/PixelData/fillPixelDataFast.ts +16 -14
  115. package/src/PixelData/invertPixelData.ts +9 -8
  116. package/src/PixelData/pixelDataToAlphaMask.ts +9 -8
  117. package/src/PixelData/reflectPixelData.ts +9 -9
  118. package/src/PixelData/resamplePixelData.ts +20 -9
  119. package/src/PixelData/rotatePixelData.ts +8 -7
  120. package/src/PixelData/uInt32ArrayToPixelData.ts +15 -0
  121. package/src/PixelData/writePaintBufferToPixelData.ts +5 -5
  122. package/src/PixelData/writePixelDataBuffer.ts +10 -9
  123. package/src/Rect/_rect-types.ts +7 -0
  124. package/src/Rect/getRectsBounds.ts +1 -1
  125. package/src/Rect/trimMaskRectBounds.ts +2 -1
  126. package/src/Rect/trimRectBounds.ts +1 -1
  127. package/src/Tile/MaskTile.ts +40 -0
  128. package/src/Tile/PixelTile.ts +23 -0
  129. package/src/{PixelTile/PixelTilePool.ts → Tile/TilePool.ts} +9 -9
  130. package/src/Tile/_tile-types.ts +33 -0
  131. package/src/_errors.ts +1 -0
  132. package/src/_types.ts +2 -118
  133. package/src/index.ts +46 -21
  134. package/src/ImageData/imageDataToUInt32Array.ts +0 -13
  135. package/src/Internal/helpers.ts +0 -5
  136. package/src/Paint/makeCirclePaintAlphaMask.ts +0 -41
  137. package/src/Paint/makeCirclePaintBinaryMask.ts +0 -29
  138. package/src/PixelTile/PixelTile.ts +0 -21
  139. /package/src/{Internal → Rect}/resolveClipping.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/_types.ts","../src/color.ts","../src/Internal/resolveClipping.ts","../src/ImageData/extractImageDataBuffer.ts","../src/Mask/extractMaskBuffer.ts","../src/Rect/trimMaskRectBounds.ts","../src/Algorithm/floodFillSelection.ts","../src/Algorithm/forEachLinePoint.ts","../src/BlendModes/BlendModeRegistry.ts","../src/BlendModes/blend-modes.ts","../src/BlendModes/blend-modes-fast.ts","../src/BlendModes/blend-modes-perfect.ts","../src/BlendModes/toBlendModeIndexAndName.ts","../support/error-strings.ts","../src/Canvas/ReusableCanvas.ts","../src/Canvas/CanvasFrameRenderer.ts","../src/Canvas/PixelCanvas.ts","../src/Canvas/canvas-blend-modes.ts","../src/ImageData/imgBlobToImageData.ts","../src/Clipboard/getImageDataFromClipboard.ts","../src/ImageData/imageDataToImgBlob.ts","../src/Clipboard/writeImgBlobToClipboard.ts","../src/Clipboard/writeImageDataToClipboard.ts","../src/History/PixelPatchTiles.ts","../src/History/HistoryAction.ts","../src/History/HistoryManager.ts","../src/History/PixelAccumulator.ts","../src/History/PixelEngineConfig.ts","../src/PixelData/applyAlphaMaskToPixelData.ts","../src/ImageData/resizeImageData.ts","../src/Rect/trimRectBounds.ts","../src/Paint/PaintBuffer.ts","../src/PixelData/blendPixelData.ts","../src/PixelTile/PixelTile.ts","../src/PixelTile/PixelTilePool.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/mutatorBlendMask.ts","../src/History/PixelMutator/mutatorBlendColorPaintRect.ts","../src/PixelData/blendPixel.ts","../src/History/PixelMutator/mutatorBlendPixel.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/ImageDataLike.ts","../src/ImageData/ReusableImageData.ts","../src/ImageData/copyImageData.ts","../src/ImageData/imageDataToAlphaMaskBuffer.ts","../src/ImageData/imageDataToDataUrl.ts","../src/ImageData/imageDataToUInt32Array.ts","../src/ImageData/invertImageData.ts","../src/Internal/resample32.ts","../src/ImageData/resampleImageData.ts","../src/ImageData/serialization.ts","../src/ImageData/uInt32ArrayToImageData.ts","../src/ImageData/writeImageData.ts","../src/ImageData/writeImageDataBuffer.ts","../src/IndexedImage/IndexedImage.ts","../src/IndexedImage/getIndexedImageColorCounts.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/BinaryMask.ts","../src/Mask/applyBinaryMaskToAlphaMask.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/PaintBufferCanvasRenderer.ts","../src/Paint/makeCirclePaintAlphaMask.ts","../src/Paint/makeCirclePaintBinaryMask.ts","../src/Paint/makePaintMask.ts","../src/Paint/makeRectFalloffPaintAlphaMask.ts","../src/PixelData/PixelData.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/extractPixelDataBuffer.ts","../src/PixelData/extractPixelData.ts","../src/PixelData/pixelDataToAlphaMask.ts","../src/PixelData/reflectPixelData.ts","../src/PixelData/resamplePixelData.ts","../src/PixelData/rotatePixelData.ts","../src/PixelData/writePixelDataBuffer.ts","../src/PixelData/writePaintBufferToPixelData.ts"],"sourcesContent":["// @sort-all (generated by `npm run re-index`)\n\nexport * from './Algorithm/floodFillSelection';\nexport * from './Algorithm/forEachLinePoint';\nexport * from './BlendModes/BlendModeRegistry';\nexport * from './BlendModes/blend-modes-fast';\nexport * from './BlendModes/blend-modes-perfect';\nexport * from './BlendModes/blend-modes';\nexport * from './BlendModes/toBlendModeIndexAndName';\nexport * from './Canvas/CanvasFrameRenderer';\nexport * from './Canvas/PixelCanvas';\nexport * from './Canvas/ReusableCanvas';\nexport * from './Canvas/canvas-blend-modes';\nexport * from './Clipboard/getImageDataFromClipboard';\nexport * from './Clipboard/writeImageDataToClipboard';\nexport * from './Clipboard/writeImgBlobToClipboard';\nexport * from './History/HistoryAction';\nexport * from './History/HistoryManager';\nexport * from './History/PixelAccumulator';\nexport * from './History/PixelEngineConfig';\nexport * from './History/PixelMutator';\nexport * from './History/PixelMutator/mutatorApplyAlphaMask';\nexport * from './History/PixelMutator/mutatorApplyBinaryMask';\nexport * from './History/PixelMutator/mutatorApplyMask';\nexport * from './History/PixelMutator/mutatorBlendAlphaMask';\nexport * from './History/PixelMutator/mutatorBlendBinaryMask';\nexport * from './History/PixelMutator/mutatorBlendColor';\nexport * from './History/PixelMutator/mutatorBlendColorPaintAlphaMask';\nexport * from './History/PixelMutator/mutatorBlendColorPaintBinaryMask';\nexport * from './History/PixelMutator/mutatorBlendColorPaintMask';\nexport * from './History/PixelMutator/mutatorBlendColorPaintRect';\nexport * from './History/PixelMutator/mutatorBlendMask';\nexport * from './History/PixelMutator/mutatorBlendPixel';\nexport * from './History/PixelMutator/mutatorBlendPixelData';\nexport * from './History/PixelMutator/mutatorClear';\nexport * from './History/PixelMutator/mutatorFill';\nexport * from './History/PixelMutator/mutatorFillBinaryMask';\nexport * from './History/PixelMutator/mutatorInvert';\nexport * from './History/PixelPatchTiles';\nexport * from './History/PixelWriter';\nexport * from './ImageData/ImageDataLike';\nexport * from './ImageData/ReusableImageData';\nexport * from './ImageData/copyImageData';\nexport * from './ImageData/extractImageDataBuffer';\nexport * from './ImageData/imageDataToAlphaMaskBuffer';\nexport * from './ImageData/imageDataToDataUrl';\nexport * from './ImageData/imageDataToImgBlob';\nexport * from './ImageData/imageDataToUInt32Array';\nexport * from './ImageData/imgBlobToImageData';\nexport * from './ImageData/invertImageData';\nexport * from './ImageData/resampleImageData';\nexport * from './ImageData/resizeImageData';\nexport * from './ImageData/serialization';\nexport * from './ImageData/uInt32ArrayToImageData';\nexport * from './ImageData/writeImageData';\nexport * from './ImageData/writeImageDataBuffer';\nexport * from './IndexedImage/IndexedImage';\nexport * from './IndexedImage/getIndexedImageColorCounts';\nexport * from './IndexedImage/indexedImageToAverageColor';\nexport * from './IndexedImage/indexedImageToImageData';\nexport * from './IndexedImage/resampleIndexedImage';\nexport * from './Input/fileInputChangeToImageData';\nexport * from './Input/fileToImageData';\nexport * from './Input/getSupportedRasterFormats';\nexport * from './Internal/resample32';\nexport * from './Internal/resolveClipping';\nexport * from './Mask/AlphaMask';\nexport * from './Mask/BinaryMask';\nexport * from './Mask/applyBinaryMaskToAlphaMask';\nexport * from './Mask/copyMask';\nexport * from './Mask/extractMask';\nexport * from './Mask/extractMaskBuffer';\nexport * from './Mask/invertMask';\nexport * from './Mask/mergeAlphaMasks';\nexport * from './Mask/mergeBinaryMasks';\nexport * from './Mask/setMaskData';\nexport * from './MaskRect/merge2BinaryMaskRects';\nexport * from './MaskRect/mergeBinaryMaskRects';\nexport * from './MaskRect/subtractBinaryMaskRects';\nexport * from './Paint/PaintBuffer';\nexport * from './Paint/PaintBufferCanvasRenderer';\nexport * from './Paint/makeCirclePaintAlphaMask';\nexport * from './Paint/makeCirclePaintBinaryMask';\nexport * from './Paint/makePaintMask';\nexport * from './Paint/makeRectFalloffPaintAlphaMask';\nexport * from './PixelData/PixelData';\nexport * from './PixelData/applyAlphaMaskToPixelData';\nexport * from './PixelData/applyBinaryMaskToPixelData';\nexport * from './PixelData/applyMaskToPixelData';\nexport * from './PixelData/blendColorPixelData';\nexport * from './PixelData/blendColorPixelDataAlphaMask';\nexport * from './PixelData/blendColorPixelDataBinaryMask';\nexport * from './PixelData/blendColorPixelDataMask';\nexport * from './PixelData/blendColorPixelDataPaintAlphaMask';\nexport * from './PixelData/blendColorPixelDataPaintBinaryMask';\nexport * from './PixelData/blendColorPixelDataPaintMask';\nexport * from './PixelData/blendPixel';\nexport * from './PixelData/blendPixelData';\nexport * from './PixelData/blendPixelDataAlphaMask';\nexport * from './PixelData/blendPixelDataBinaryMask';\nexport * from './PixelData/blendPixelDataMask';\nexport * from './PixelData/blendPixelDataPaintBuffer';\nexport * from './PixelData/clearPixelDataFast';\nexport * from './PixelData/extractPixelData';\nexport * from './PixelData/extractPixelDataBuffer';\nexport * from './PixelData/fillPixelData';\nexport * from './PixelData/fillPixelDataBinaryMask';\nexport * from './PixelData/fillPixelDataFast';\nexport * from './PixelData/invertPixelData';\nexport * from './PixelData/pixelDataToAlphaMask';\nexport * from './PixelData/reflectPixelData';\nexport * from './PixelData/resamplePixelData';\nexport * from './PixelData/rotatePixelData';\nexport * from './PixelData/writePaintBufferToPixelData';\nexport * from './PixelData/writePixelDataBuffer';\nexport * from './PixelTile/PixelTile';\nexport * from './PixelTile/PixelTilePool';\nexport * from './Rect/getRectsBounds';\nexport * from './Rect/trimMaskRectBounds';\nexport * from './Rect/trimRectBounds';\nexport * from './_types';\nexport * from './color';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAc29ydC1hbGwgKGdlbmVyYXRlZCBieSBgbnBtIHJ1biByZS1pbmRleGApXG5cbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2Zsb29kRmlsbFNlbGVjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50JztcbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRNb2Rlcy9CbGVuZE1vZGVSZWdpc3RyeSc7XG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtZmFzdCc7XG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9CbGVuZE1vZGVzL3RvQmxlbmRNb2RlSW5kZXhBbmROYW1lJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL0NhbnZhc0ZyYW1lUmVuZGVyZXInO1xuZXhwb3J0ICogZnJvbSAnLi9DYW52YXMvUGl4ZWxDYW52YXMnO1xuZXhwb3J0ICogZnJvbSAnLi9DYW52YXMvUmV1c2FibGVDYW52YXMnO1xuZXhwb3J0ICogZnJvbSAnLi9DYW52YXMvY2FudmFzLWJsZW5kLW1vZGVzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xpcGJvYXJkL2dldEltYWdlRGF0YUZyb21DbGlwYm9hcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9DbGlwYm9hcmQvd3JpdGVJbWFnZURhdGFUb0NsaXBib2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL0NsaXBib2FyZC93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvSGlzdG9yeUFjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvSGlzdG9yeU1hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsQWNjdW11bGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsRW5naW5lQ29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3InO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlBbHBoYU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlCaW5hcnlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckFwcGx5TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZEFscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZEJpbmFyeU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvcic7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRBbHBoYU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvclBhaW50QmluYXJ5TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3JQYWludFJlY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kUGl4ZWwnO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQ2xlYXInO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbCc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JGaWxsQmluYXJ5TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JJbnZlcnQnO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsUGF0Y2hUaWxlcyc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxXcml0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvSW1hZ2VEYXRhTGlrZSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9SZXVzYWJsZUltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9jb3B5SW1hZ2VEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2V4dHJhY3RJbWFnZURhdGFCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvaW1hZ2VEYXRhVG9BbHBoYU1hc2tCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvaW1hZ2VEYXRhVG9EYXRhVXJsJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvSW1nQmxvYic7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbWFnZURhdGFUb1VJbnQzMkFycmF5JztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltZ0Jsb2JUb0ltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbnZlcnRJbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvcmVzYW1wbGVJbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvcmVzaXplSW1hZ2VEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3NlcmlhbGl6YXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvdUludDMyQXJyYXlUb0ltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS93cml0ZUltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS93cml0ZUltYWdlRGF0YUJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9JbmRleGVkSW1hZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvZ2V0SW5kZXhlZEltYWdlQ29sb3JDb3VudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvaW5kZXhlZEltYWdlVG9BdmVyYWdlQ29sb3InO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvaW5kZXhlZEltYWdlVG9JbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvcmVzYW1wbGVJbmRleGVkSW1hZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dC9maWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0L2ZpbGVUb0ltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0L2dldFN1cHBvcnRlZFJhc3RlckZvcm1hdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnRlcm5hbC9yZXNhbXBsZTMyJztcbmV4cG9ydCAqIGZyb20gJy4vSW50ZXJuYWwvcmVzb2x2ZUNsaXBwaW5nJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9BbHBoYU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL0JpbmFyeU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2FwcGx5QmluYXJ5TWFza1RvQWxwaGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9jb3B5TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL01hc2svZXh0cmFjdE1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2V4dHJhY3RNYXNrQnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9pbnZlcnRNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9tZXJnZUFscGhhTWFza3MnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL21lcmdlQmluYXJ5TWFza3MnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL3NldE1hc2tEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vTWFza1JlY3QvbWVyZ2UyQmluYXJ5TWFza1JlY3RzJztcbmV4cG9ydCAqIGZyb20gJy4vTWFza1JlY3QvbWVyZ2VCaW5hcnlNYXNrUmVjdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrUmVjdC9zdWJ0cmFjdEJpbmFyeU1hc2tSZWN0cyc7XG5leHBvcnQgKiBmcm9tICcuL1BhaW50L1BhaW50QnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcic7XG5leHBvcnQgKiBmcm9tICcuL1BhaW50L21ha2VDaXJjbGVQYWludEFscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL1BhaW50L21ha2VDaXJjbGVQYWludEJpbmFyeU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9tYWtlUGFpbnRNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvbWFrZVJlY3RGYWxsb2ZmUGFpbnRBbHBoYU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2FwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYXBwbHlNYXNrVG9QaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFQYWludEFscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhUGFpbnRCaW5hcnlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFQYWludE1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRQaXhlbCc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YUFscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhUGFpbnRCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvY2xlYXJQaXhlbERhdGFGYXN0JztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2V4dHJhY3RQaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFCaW5hcnlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2ZpbGxQaXhlbERhdGFGYXN0JztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2ludmVydFBpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9waXhlbERhdGFUb0FscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9yZWZsZWN0UGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3Jlc2FtcGxlUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3JvdGF0ZVBpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS93cml0ZVBhaW50QnVmZmVyVG9QaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvd3JpdGVQaXhlbERhdGFCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbFRpbGUvUGl4ZWxUaWxlJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxUaWxlL1BpeGVsVGlsZVBvb2wnO1xuZXhwb3J0ICogZnJvbSAnLi9SZWN0L2dldFJlY3RzQm91bmRzJztcbmV4cG9ydCAqIGZyb20gJy4vUmVjdC90cmltTWFza1JlY3RCb3VuZHMnO1xuZXhwb3J0ICogZnJvbSAnLi9SZWN0L3RyaW1SZWN0Qm91bmRzJztcbmV4cG9ydCAqIGZyb20gJy4vX3R5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vY29sb3InOyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/** ALL values are 0-255 (including alpha which in CSS is 0-1) */\nexport type RGBA = {\n r: number;\n g: number;\n b: number;\n a: number;\n};\n\n/** Represents a 32-bit color in 0xAABBGGRR (Little endian) */\nexport type Color32 = number & {\n readonly __brandColor32: unique symbol;\n};\n\n/**\n * A function that defines how to combine a source color with a destination color.\n * @param src - The incoming color (source).\n * @param dst - The existing color in the buffer (destination).\n * @returns The resulting 32-bit color to be written to the buffer.\n */\nexport type BlendColor32 = {\n (src: Color32, dst: Color32): Color32;\n isOverwrite?: true;\n};\nexport type ImageDataLike = {\n width: number;\n height: number;\n data: Uint8ClampedArray<ArrayBufferLike>;\n};\nexport type ImageDataLikeConstructor<T extends ImageDataLike = ImageDataLike> = {\n new (data: Uint8ClampedArray, width: number, height: number): T;\n};\nexport type SerializedImageData = {\n width: number;\n height: number;\n data: string;\n};\nexport type Base64EncodedUInt8Array = string & {\n readonly __brandBase64UInt8Array: unique symbol;\n};\n\n/** Rectangle definition */\nexport type Rect = {\n x: number;\n y: number;\n w: number;\n h: number;\n};\n\n/**\n * Defines how mask values should be interpreted during a draw operation.\n */\nexport enum MaskType {\n /**\n * Values are treated as alpha weights.\n * 0 is skipped, values > 0 are processed.\n */\n ALPHA,\n /**\n * Values are treated as on/off.\n * 0 is fully transparent (skipped), any other value is fully opaque.\n */\n BINARY,\n}\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}\ninterface BasePaintMask {\n readonly centerOffsetX: number;\n readonly centerOffsetY: number;\n}\nexport interface PaintAlphaMask extends BasePaintMask, AlphaMask {}\nexport interface PaintBinaryMask extends BasePaintMask, BinaryMask {}\nexport type PaintMask = PaintAlphaMask | PaintBinaryMask;\n\n/**\n * Configuration for pixel manipulation operations.\n * Designed to be used by spreading a Rect object ({x, y, w, h}) directly.\n */\nexport interface PixelRect {\n /**\n * The starting X coordinate in the destination buffer.\n * @default 0\n */\n x?: number;\n\n /**\n * The starting Y coordinate in the destination buffer.\n * @default 0\n */\n y?: number;\n\n /**\n * The width of the region in the destination buffer.\n * @default Source width.\n */\n w?: number;\n\n /**\n * The height of the region in the destination buffer.\n * @default Source height.\n */\n h?: number;\n}\nexport interface MaskOffset {\n /**\n * X offset into the mask buffer.\n * @default 0\n */\n mx?: number;\n\n /**\n * Y offset into the mask buffer.\n * @default 0\n */\n my?: number;\n}\nexport interface InvertMask {\n /**\n * If true the inverse of the mask will be applied\n * @default false\n */\n invertMask?: boolean;\n}\ninterface Alpha {\n /**\n * Overall layer opacity 0-255.\n * @default 255\n */\n alpha?: number;\n}\nexport interface ApplyMaskToPixelDataOptions extends PixelRect, Alpha, MaskOffset, InvertMask {}\nexport interface MergeAlphaMasksOptions extends PixelRect, Alpha, MaskOffset, InvertMask {}\nexport interface PixelMutateOptions extends PixelRect, MaskOffset, InvertMask {\n /** An optional mask to restrict where pixels are mutated. */\n mask?: BinaryMask | null;\n}\n\n/**\n * Configuration for blitting (copying/blending) one image into another.\n */\n\nexport interface BasePixelBlendOptions {\n /**\n * The source rectangle x-coordinate\n * @default 0\n */\n sx?: number;\n\n /**\n * The source rectangle y-coordinate\n * @default 0\n */\n sy?: number;\n\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface PixelBlendOptions extends PixelRect, Alpha, BasePixelBlendOptions {}\nexport interface PixelBlendMaskOptions extends PixelRect, Alpha, MaskOffset, InvertMask, BasePixelBlendOptions {}\n\n/**\n * Configuration for operations that require color blending.\n */\nexport interface ColorBlendOptions extends PixelRect, Alpha {\n /**\n * The blending algorithm to use for blending pixels.\n * @default {@link sourceOverPerfect}\n */\n blendFn?: BlendColor32;\n}\nexport interface ColorBlendMaskOptions extends ColorBlendOptions, MaskOffset, InvertMask {}\nexport interface ColorBlendPaintMaskOptions extends Omit<ColorBlendOptions, 'w' | 'h'> {}\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});\nexport interface IPixelData32 {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n}\nexport interface IPixelData<T extends ImageDataLike = ImageData> extends IPixelData32 {\n readonly imageData: T;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQUxMIHZhbHVlcyBhcmUgMC0yNTUgKGluY2x1ZGluZyBhbHBoYSB3aGljaCBpbiBDU1MgaXMgMC0xKSAqL1xuZXhwb3J0IHR5cGUgUkdCQSA9IHtcbiAgcjogbnVtYmVyO1xuICBnOiBudW1iZXI7XG4gIGI6IG51bWJlcjtcbiAgYTogbnVtYmVyO1xufTtcblxuLyoqIFJlcHJlc2VudHMgYSAzMi1iaXQgY29sb3IgaW4gMHhBQUJCR0dSUiAoTGl0dGxlIGVuZGlhbikgKi9cbmV4cG9ydCB0eXBlIENvbG9yMzIgPSBudW1iZXIgJiB7XG4gIHJlYWRvbmx5IF9fYnJhbmRDb2xvcjMyOiB1bmlxdWUgc3ltYm9sO1xufTtcblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBob3cgdG8gY29tYmluZSBhIHNvdXJjZSBjb2xvciB3aXRoIGEgZGVzdGluYXRpb24gY29sb3IuXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGluY29taW5nIGNvbG9yIChzb3VyY2UpLlxuICogQHBhcmFtIGRzdCAtIFRoZSBleGlzdGluZyBjb2xvciBpbiB0aGUgYnVmZmVyIChkZXN0aW5hdGlvbikuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0aW5nIDMyLWJpdCBjb2xvciB0byBiZSB3cml0dGVuIHRvIHRoZSBidWZmZXIuXG4gKi9cbmV4cG9ydCB0eXBlIEJsZW5kQ29sb3IzMiA9IHtcbiAgKHNyYzogQ29sb3IzMiwgZHN0OiBDb2xvcjMyKTogQ29sb3IzMjtcbiAgaXNPdmVyd3JpdGU/OiB0cnVlO1xufTtcbmV4cG9ydCB0eXBlIEltYWdlRGF0YUxpa2UgPSB7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBkYXRhOiBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlckxpa2U+O1xufTtcbmV4cG9ydCB0eXBlIEltYWdlRGF0YUxpa2VDb25zdHJ1Y3RvcjxUIGV4dGVuZHMgSW1hZ2VEYXRhTGlrZSA9IEltYWdlRGF0YUxpa2U+ID0ge1xuICBuZXcgKGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlcik6IFQ7XG59O1xuZXhwb3J0IHR5cGUgU2VyaWFsaXplZEltYWdlRGF0YSA9IHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG4gIGRhdGE6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBCYXNlNjRFbmNvZGVkVUludDhBcnJheSA9IHN0cmluZyAmIHtcbiAgcmVhZG9ubHkgX19icmFuZEJhc2U2NFVJbnQ4QXJyYXk6IHVuaXF1ZSBzeW1ib2w7XG59O1xuXG4vKiogUmVjdGFuZ2xlIGRlZmluaXRpb24gKi9cbmV4cG9ydCB0eXBlIFJlY3QgPSB7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xuICB3OiBudW1iZXI7XG4gIGg6IG51bWJlcjtcbn07XG5cbi8qKlxuICogRGVmaW5lcyBob3cgbWFzayB2YWx1ZXMgc2hvdWxkIGJlIGludGVycHJldGVkIGR1cmluZyBhIGRyYXcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBNYXNrVHlwZSB7XG4gIC8qKlxuICAgKiBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgYWxwaGEgd2VpZ2h0cy5cbiAgICogMCBpcyBza2lwcGVkLCB2YWx1ZXMgPiAwIGFyZSBwcm9jZXNzZWQuXG4gICAqL1xuICBBTFBIQSxcbiAgLyoqXG4gICAqICBWYWx1ZXMgYXJlIHRyZWF0ZWQgYXMgb24vb2ZmLlxuICAgKiAwIGlzIGZ1bGx5IHRyYW5zcGFyZW50IChza2lwcGVkKSwgYW55IG90aGVyIHZhbHVlIGlzIGZ1bGx5IG9wYXF1ZS5cbiAgICovXG4gIEJJTkFSWSxcbn1cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZU1hc2sge1xuICByZWFkb25seSB0eXBlOiBNYXNrVHlwZTtcbiAgcmVhZG9ubHkgZGF0YTogVWludDhBcnJheTtcbiAgcmVhZG9ubHkgdzogbnVtYmVyO1xuICByZWFkb25seSBoOiBudW1iZXI7XG59XG5leHBvcnQgdHlwZSBNYXNrID0gQmluYXJ5TWFzayB8IEFscGhhTWFzaztcblxuLyoqIFN0cmljdGx5IDAgb3IgMSAqL1xuZXhwb3J0IGludGVyZmFjZSBCaW5hcnlNYXNrIGV4dGVuZHMgQmFzZU1hc2sge1xuICByZWFkb25seSB0eXBlOiBNYXNrVHlwZS5CSU5BUlk7XG59XG5cbi8qKiBTdHJpY3RseSAwLTI1NSAqL1xuZXhwb3J0IGludGVyZmFjZSBBbHBoYU1hc2sgZXh0ZW5kcyBCYXNlTWFzayB7XG4gIHJlYWRvbmx5IHR5cGU6IE1hc2tUeXBlLkFMUEhBO1xufVxuaW50ZXJmYWNlIEJhc2VQYWludE1hc2sge1xuICByZWFkb25seSBjZW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNlbnRlck9mZnNldFk6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGFpbnRBbHBoYU1hc2sgZXh0ZW5kcyBCYXNlUGFpbnRNYXNrLCBBbHBoYU1hc2sge31cbmV4cG9ydCBpbnRlcmZhY2UgUGFpbnRCaW5hcnlNYXNrIGV4dGVuZHMgQmFzZVBhaW50TWFzaywgQmluYXJ5TWFzayB7fVxuZXhwb3J0IHR5cGUgUGFpbnRNYXNrID0gUGFpbnRBbHBoYU1hc2sgfCBQYWludEJpbmFyeU1hc2s7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGl4ZWwgbWFuaXB1bGF0aW9uIG9wZXJhdGlvbnMuXG4gKiBEZXNpZ25lZCB0byBiZSB1c2VkIGJ5IHNwcmVhZGluZyBhIFJlY3Qgb2JqZWN0ICh7eCwgeSwgdywgaH0pIGRpcmVjdGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsUmVjdCB7XG4gIC8qKlxuICAgKiBUaGUgc3RhcnRpbmcgWCBjb29yZGluYXRlIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHg/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGFydGluZyBZIGNvb3JkaW5hdGUgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgeT86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci5cbiAgICogQGRlZmF1bHQgU291cmNlIHdpZHRoLlxuICAgKi9cbiAgdz86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIGluIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuXG4gICAqIEBkZWZhdWx0IFNvdXJjZSBoZWlnaHQuXG4gICAqL1xuICBoPzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBNYXNrT2Zmc2V0IHtcbiAgLyoqXG4gICAqIFggb2Zmc2V0IGludG8gdGhlIG1hc2sgYnVmZmVyLlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICBteD86IG51bWJlcjtcblxuICAvKipcbiAgICogWSBvZmZzZXQgaW50byB0aGUgbWFzayBidWZmZXIuXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIG15PzogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBJbnZlcnRNYXNrIHtcbiAgLyoqXG4gICAqIElmIHRydWUgdGhlIGludmVyc2Ugb2YgdGhlIG1hc2sgd2lsbCBiZSBhcHBsaWVkXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBpbnZlcnRNYXNrPzogYm9vbGVhbjtcbn1cbmludGVyZmFjZSBBbHBoYSB7XG4gIC8qKlxuICAgKiBPdmVyYWxsIGxheWVyIG9wYWNpdHkgMC0yNTUuXG4gICAqIEBkZWZhdWx0IDI1NVxuICAgKi9cbiAgYWxwaGE/OiBudW1iZXI7XG59XG5leHBvcnQgaW50ZXJmYWNlIEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgQWxwaGEsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge31cbmV4cG9ydCBpbnRlcmZhY2UgTWVyZ2VBbHBoYU1hc2tzT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgQWxwaGEsIE1hc2tPZmZzZXQsIEludmVydE1hc2sge31cbmV4cG9ydCBpbnRlcmZhY2UgUGl4ZWxNdXRhdGVPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBNYXNrT2Zmc2V0LCBJbnZlcnRNYXNrIHtcbiAgLyoqIEFuIG9wdGlvbmFsIG1hc2sgdG8gcmVzdHJpY3Qgd2hlcmUgcGl4ZWxzIGFyZSBtdXRhdGVkLiAqL1xuICBtYXNrPzogQmluYXJ5TWFzayB8IG51bGw7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYmxpdHRpbmcgKGNvcHlpbmcvYmxlbmRpbmcpIG9uZSBpbWFnZSBpbnRvIGFub3RoZXIuXG4gKi9cblxuZXhwb3J0IGludGVyZmFjZSBCYXNlUGl4ZWxCbGVuZE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHNvdXJjZSByZWN0YW5nbGUgeC1jb29yZGluYXRlXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHN4PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHJlY3RhbmdsZSB5LWNvb3JkaW5hdGVcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgc3k/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBibGVuZGluZyBhbGdvcml0aG0gdG8gdXNlIGZvciBibGVuZGluZyBwaXhlbHMuXG4gICAqIEBkZWZhdWx0IHtAbGluayBzb3VyY2VPdmVyUGVyZmVjdH1cbiAgICovXG4gIGJsZW5kRm4/OiBCbGVuZENvbG9yMzI7XG59XG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsQmxlbmRPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSwgQmFzZVBpeGVsQmxlbmRPcHRpb25zIHt9XG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsQmxlbmRNYXNrT3B0aW9ucyBleHRlbmRzIFBpeGVsUmVjdCwgQWxwaGEsIE1hc2tPZmZzZXQsIEludmVydE1hc2ssIEJhc2VQaXhlbEJsZW5kT3B0aW9ucyB7fVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGNvbG9yIGJsZW5kaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbG9yQmxlbmRPcHRpb25zIGV4dGVuZHMgUGl4ZWxSZWN0LCBBbHBoYSB7XG4gIC8qKlxuICAgKiBUaGUgYmxlbmRpbmcgYWxnb3JpdGhtIHRvIHVzZSBmb3IgYmxlbmRpbmcgcGl4ZWxzLlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgc291cmNlT3ZlclBlcmZlY3R9XG4gICAqL1xuICBibGVuZEZuPzogQmxlbmRDb2xvcjMyO1xufVxuZXhwb3J0IGludGVyZmFjZSBDb2xvckJsZW5kTWFza09wdGlvbnMgZXh0ZW5kcyBDb2xvckJsZW5kT3B0aW9ucywgTWFza09mZnNldCwgSW52ZXJ0TWFzayB7fVxuZXhwb3J0IGludGVyZmFjZSBDb2xvckJsZW5kUGFpbnRNYXNrT3B0aW9ucyBleHRlbmRzIE9taXQ8Q29sb3JCbGVuZE9wdGlvbnMsICd3JyB8ICdoJz4ge31cbmV4cG9ydCB0eXBlIE1hc2tSZWN0PFQgZXh0ZW5kcyBNYXNrVHlwZT4gPSBSZWN0ICYge1xuICB0eXBlOiBUO1xuICBkYXRhOiBVaW50OEFycmF5O1xufTtcbmV4cG9ydCB0eXBlIEJpbmFyeU1hc2tSZWN0ID0gTWFza1JlY3Q8TWFza1R5cGUuQklOQVJZPjtcbmV4cG9ydCB0eXBlIEFscGhhTWFza1JlY3QgPSBNYXNrUmVjdDxNYXNrVHlwZS5BTFBIQT47XG5leHBvcnQgdHlwZSBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0ID0gUmVjdCAmICh7XG4gIHR5cGU6IE1hc2tUeXBlLkJJTkFSWTtcbiAgZGF0YTogVWludDhBcnJheTtcbn0gfCB7XG4gIHR5cGU/OiBudWxsO1xuICBkYXRhPzogbnVsbDtcbn0pO1xuZXhwb3J0IHR5cGUgTnVsbGFibGVNYXNrUmVjdCA9IFJlY3QgJiAoe1xuICB0eXBlOiBNYXNrVHlwZTtcbiAgZGF0YTogVWludDhBcnJheTtcbn0gfCB7XG4gIHR5cGU/OiBudWxsO1xuICBkYXRhPzogbnVsbDtcbn0pO1xuZXhwb3J0IGludGVyZmFjZSBJUGl4ZWxEYXRhMzIge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5O1xuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVBpeGVsRGF0YTxUIGV4dGVuZHMgSW1hZ2VEYXRhTGlrZSA9IEltYWdlRGF0YT4gZXh0ZW5kcyBJUGl4ZWxEYXRhMzIge1xuICByZWFkb25seSBpbWFnZURhdGE6IFQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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==","export type ClippedRect = {\n x: number;\n y: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\nexport type ClippedBlit = {\n x: number;\n y: number;\n sx: number;\n sy: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\n\n// use factory functions when creating reusable objects ensure property order for JIT perf\nexport const makeClippedRect = (): ClippedRect => ({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\nexport const makeClippedBlit = (): ClippedBlit => ({\n x: 0,\n y: 0,\n sx: 0,\n sy: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\n\n/**\n * Calculates the intersection of a target rectangle and a bounding box (usually 0,0 -> width,height).\n * Handles negative offsets by shrinking dimensions.\n */\nexport function resolveRectClipping(x: number, y: number, w: number, h: number, boundaryW: number, boundaryH: number, out: ClippedRect): ClippedRect {\n // Destination Clipping (Top/Left)\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n\n // Destination Clipping (Bottom/Right)\n const actualW = Math.min(w, boundaryW - x);\n const actualH = Math.min(h, boundaryH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n\n/**\n * Calculates the clipping for transferring data from a Source to a Destination.\n * Handles cases where the source is out of bounds (shifting the destination target)\n * AND cases where the destination is out of bounds (shifting the source target).\n */\nexport function resolveBlitClipping(x: number, y: number, sx: number, sy: number, w: number, h: number, dstW: number, dstH: number, srcW: number, srcH: number, out: ClippedBlit): ClippedBlit {\n // 1. Source Clipping: If reading from negative source, shift target right and shrink\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, srcW - sx);\n h = Math.min(h, srcH - sy);\n\n // 2. Destination Clipping: If writing to negative dest, shift source right and shrink\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, dstW - x);\n const actualH = Math.min(h, dstH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.sx = sx;\n out.sy = sy;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBDbGlwcGVkUmVjdCA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xuICBpbkJvdW5kczogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBDbGlwcGVkQmxpdCA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHN4OiBudW1iZXI7XG4gIHN5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xuICBpbkJvdW5kczogYm9vbGVhbjtcbn07XG5cbi8vIHVzZSBmYWN0b3J5IGZ1bmN0aW9ucyB3aGVuIGNyZWF0aW5nIHJldXNhYmxlIG9iamVjdHMgZW5zdXJlIHByb3BlcnR5IG9yZGVyIGZvciBKSVQgcGVyZlxuZXhwb3J0IGNvbnN0IG1ha2VDbGlwcGVkUmVjdCA9ICgpOiBDbGlwcGVkUmVjdCA9PiAoe1xuICB4OiAwLFxuICB5OiAwLFxuICB3OiAwLFxuICBoOiAwLFxuICBpbkJvdW5kczogZmFsc2Vcbn0pO1xuZXhwb3J0IGNvbnN0IG1ha2VDbGlwcGVkQmxpdCA9ICgpOiBDbGlwcGVkQmxpdCA9PiAoe1xuICB4OiAwLFxuICB5OiAwLFxuICBzeDogMCxcbiAgc3k6IDAsXG4gIHc6IDAsXG4gIGg6IDAsXG4gIGluQm91bmRzOiBmYWxzZVxufSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgdGFyZ2V0IHJlY3RhbmdsZSBhbmQgYSBib3VuZGluZyBib3ggKHVzdWFsbHkgMCwwIC0+IHdpZHRoLGhlaWdodCkuXG4gKiBIYW5kbGVzIG5lZ2F0aXZlIG9mZnNldHMgYnkgc2hyaW5raW5nIGRpbWVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVjdENsaXBwaW5nKHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlciwgYm91bmRhcnlXOiBudW1iZXIsIGJvdW5kYXJ5SDogbnVtYmVyLCBvdXQ6IENsaXBwZWRSZWN0KTogQ2xpcHBlZFJlY3Qge1xuICAvLyBEZXN0aW5hdGlvbiBDbGlwcGluZyAoVG9wL0xlZnQpXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geDtcbiAgICB4ID0gMDtcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cblxuICAvLyBEZXN0aW5hdGlvbiBDbGlwcGluZyAoQm90dG9tL1JpZ2h0KVxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgYm91bmRhcnlXIC0geCk7XG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBib3VuZGFyeUggLSB5KTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHtcbiAgICBvdXQuaW5Cb3VuZHMgPSBmYWxzZTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIG91dC54ID0geDtcbiAgb3V0LnkgPSB5O1xuICBvdXQudyA9IGFjdHVhbFc7XG4gIG91dC5oID0gYWN0dWFsSDtcbiAgb3V0LmluQm91bmRzID0gdHJ1ZTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjbGlwcGluZyBmb3IgdHJhbnNmZXJyaW5nIGRhdGEgZnJvbSBhIFNvdXJjZSB0byBhIERlc3RpbmF0aW9uLlxuICogSGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgc291cmNlIGlzIG91dCBvZiBib3VuZHMgKHNoaWZ0aW5nIHRoZSBkZXN0aW5hdGlvbiB0YXJnZXQpXG4gKiBBTkQgY2FzZXMgd2hlcmUgdGhlIGRlc3RpbmF0aW9uIGlzIG91dCBvZiBib3VuZHMgKHNoaWZ0aW5nIHRoZSBzb3VyY2UgdGFyZ2V0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCbGl0Q2xpcHBpbmcoeDogbnVtYmVyLCB5OiBudW1iZXIsIHN4OiBudW1iZXIsIHN5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLCBkc3RXOiBudW1iZXIsIGRzdEg6IG51bWJlciwgc3JjVzogbnVtYmVyLCBzcmNIOiBudW1iZXIsIG91dDogQ2xpcHBlZEJsaXQpOiBDbGlwcGVkQmxpdCB7XG4gIC8vIDEuIFNvdXJjZSBDbGlwcGluZzogSWYgcmVhZGluZyBmcm9tIG5lZ2F0aXZlIHNvdXJjZSwgc2hpZnQgdGFyZ2V0IHJpZ2h0IGFuZCBzaHJpbmtcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3g7XG4gICAgdyArPSBzeDtcbiAgICBzeCA9IDA7XG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3k7XG4gICAgaCArPSBzeTtcbiAgICBzeSA9IDA7XG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyY1cgLSBzeCk7XG4gIGggPSBNYXRoLm1pbihoLCBzcmNIIC0gc3kpO1xuXG4gIC8vIDIuIERlc3RpbmF0aW9uIENsaXBwaW5nOiBJZiB3cml0aW5nIHRvIG5lZ2F0aXZlIGRlc3QsIHNoaWZ0IHNvdXJjZSByaWdodCBhbmQgc2hyaW5rXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHg7XG4gICAgdyArPSB4O1xuICAgIHggPSAwO1xuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHk7XG4gICAgaCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3RXIC0geCk7XG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3RIIC0geSk7XG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSB7XG4gICAgb3V0LmluQm91bmRzID0gZmFsc2U7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICBvdXQueCA9IHg7XG4gIG91dC55ID0geTtcbiAgb3V0LnN4ID0gc3g7XG4gIG91dC5zeSA9IHN5O1xuICBvdXQudyA9IGFjdHVhbFc7XG4gIG91dC5oID0gYWN0dWFsSDtcbiAgb3V0LmluQm91bmRzID0gdHJ1ZTtcbiAgcmV0dXJuIG91dDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A rect defining the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(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 const {\n width: srcW,\n height: srcH,\n data: src\n } = imageData;\n // Safety check for invalid dimensions\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0);\n const out = new Uint8ClampedArray(w * h * 4);\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return out;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\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\n // Perform the high-speed bulk copy\n out.set(src.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KCk7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBzcGVjaWZpYyByZWN0YW5ndWxhciByZWdpb24gb2YgcGl4ZWxzIGZyb20gYSBsYXJnZXIge0BsaW5rIEltYWdlRGF0YUxpa2V9XG4gKiBzb3VyY2UgaW50byBhIG5ldyB7QGxpbmsgVWludDhDbGFtcGVkQXJyYXl9LlxuICpcbiAqIFRoaXMgaXMgYSBcInJlYWQtb25seVwiIG9wZXJhdGlvbiB0aGF0IHJldHVybnMgYSBjb3B5IG9mIHRoZSBwaXhlbCBkYXRhLlxuICpcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgc291cmNlIGltYWdlIGRhdGEgdG8gcmVhZCBmcm9tLlxuICogQHBhcmFtIHJlY3QgLSBBIHJlY3QgZGVmaW5pbmcgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHJldHVybnMgQSBidWZmZXIgY29udGFpbmluZyB0aGUgUkdCQSBwaXhlbCBkYXRhIG9mIHRoZSByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSwgcmVjdDogUmVjdCk6IFVpbnQ4Q2xhbXBlZEFycmF5O1xuLyoqXG4gKiBAcGFyYW0gaW1hZ2VEYXRhIC0gVGhlIHNvdXJjZSBpbWFnZSBkYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB4IC0gVGhlIHN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcGFyYW0gaCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHJldHVybnMgQSBidWZmZXIgY29udGFpbmluZyB0aGUgUkdCQSBwaXhlbCBkYXRhIG9mIHRoZSByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogVWludDhDbGFtcGVkQXJyYXk7XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcihpbWFnZURhdGE6IEltYWdlRGF0YUxpa2UsIF94OiBSZWN0IHwgbnVtYmVyLCBfeT86IG51bWJlciwgX3c/OiBudW1iZXIsIF9oPzogbnVtYmVyKTogVWludDhDbGFtcGVkQXJyYXkge1xuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHcsXG4gICAgaFxuICB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0JyA/IF94IDoge1xuICAgIHg6IF94LFxuICAgIHk6IF95ISxcbiAgICB3OiBfdyEsXG4gICAgaDogX2ghXG4gIH07XG4gIGNvbnN0IHtcbiAgICB3aWR0aDogc3JjVyxcbiAgICBoZWlnaHQ6IHNyY0gsXG4gICAgZGF0YTogc3JjXG4gIH0gPSBpbWFnZURhdGE7XG4gIC8vIFNhZmV0eSBjaGVjayBmb3IgaW52YWxpZCBkaW1lbnNpb25zXG4gIGlmICh3IDw9IDAgfHwgaCA8PSAwKSByZXR1cm4gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KDApO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodyAqIGggKiA0KTtcbiAgY29uc3QgY2xpcCA9IHJlc29sdmVCbGl0Q2xpcHBpbmcoMCwgMCwgeCwgeSwgdywgaCwgdywgaCwgc3JjVywgc3JjSCwgU0NSQVRDSF9CTElUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gb3V0O1xuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlIXG4gIH0gPSBjbGlwO1xuICBjb25zdCByb3dMZW4gPSBjb3B5VyAqIDQ7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKChzcmNZICsgcm93KSAqIHNyY1cgKyBzcmNYKSAqIDQ7XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoKGRzdFkgKyByb3cpICogdyArIGRzdFgpICogNDtcblxuICAgIC8vIFBlcmZvcm0gdGhlIGhpZ2gtc3BlZWQgYnVsayBjb3B5XG4gICAgb3V0LnNldChzcmMuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgcm93TGVuKSwgZHN0U3RhcnQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 '../_types';\nimport { extractMaskBuffer } from '../Mask/extractMaskBuffer';\n\n/**\n * Intersects a target rectangle with a boundary, trimming dimensions and masks in-place.\n * This utility calculates the axis-aligned intersection between the `target` and `bounds`.\n * If the `target` includes a `mask` (as in a {@link NullableMaskRect}), the mask is physically\n * cropped and re-aligned using `extractMaskBuffer` to match the new dimensions.\n * @param target - The rectangle or selection object to be trimmed. **Note:** This object is mutated in-place.\n * @param bounds - The boundary rectangle defining the maximum allowable area (e.g., canvas dimensions).\n * @example\n * const selection = { x: -10, y: -10, w: 50, h: 50, mask: new Uint8Array(2500) };\n * const canvas = { x: 0, y: 0, w: 100, h: 100 };\n * // Selection will be moved to (0,0) and resized to 40x40.\n * // The mask is cropped by 10 px on the top and left.\n * trimRectBounds(selection, canvas);\n */\nexport function trimMaskRectBounds<T extends NullableMaskRect>(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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE51bGxhYmxlTWFza1JlY3QgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgZXh0cmFjdE1hc2tCdWZmZXIgfSBmcm9tICcuLi9NYXNrL2V4dHJhY3RNYXNrQnVmZmVyJztcblxuLyoqXG4gKiBJbnRlcnNlY3RzIGEgdGFyZ2V0IHJlY3RhbmdsZSB3aXRoIGEgYm91bmRhcnksIHRyaW1taW5nIGRpbWVuc2lvbnMgYW5kIG1hc2tzIGluLXBsYWNlLlxuICogVGhpcyB1dGlsaXR5IGNhbGN1bGF0ZXMgdGhlIGF4aXMtYWxpZ25lZCBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0aGUgYHRhcmdldGAgYW5kIGBib3VuZHNgLlxuICogSWYgdGhlIGB0YXJnZXRgIGluY2x1ZGVzIGEgYG1hc2tgIChhcyBpbiBhIHtAbGluayBOdWxsYWJsZU1hc2tSZWN0fSksIHRoZSBtYXNrIGlzIHBoeXNpY2FsbHlcbiAqIGNyb3BwZWQgYW5kIHJlLWFsaWduZWQgdXNpbmcgYGV4dHJhY3RNYXNrQnVmZmVyYCB0byBtYXRjaCB0aGUgbmV3IGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHJlY3RhbmdsZSBvciBzZWxlY3Rpb24gb2JqZWN0IHRvIGJlIHRyaW1tZWQuICoqTm90ZToqKiBUaGlzIG9iamVjdCBpcyBtdXRhdGVkIGluLXBsYWNlLlxuICogQHBhcmFtIGJvdW5kcyAtIFRoZSBib3VuZGFyeSByZWN0YW5nbGUgZGVmaW5pbmcgdGhlIG1heGltdW0gYWxsb3dhYmxlIGFyZWEgKGUuZy4sIGNhbnZhcyBkaW1lbnNpb25zKS5cbiAqIEBleGFtcGxlXG4gKiBjb25zdCBzZWxlY3Rpb24gPSB7IHg6IC0xMCwgeTogLTEwLCB3OiA1MCwgaDogNTAsIG1hc2s6IG5ldyBVaW50OEFycmF5KDI1MDApIH07XG4gKiBjb25zdCBjYW52YXMgPSB7IHg6IDAsIHk6IDAsIHc6IDEwMCwgaDogMTAwIH07XG4gKiAvLyBTZWxlY3Rpb24gd2lsbCBiZSBtb3ZlZCB0byAoMCwwKSBhbmQgcmVzaXplZCB0byA0MHg0MC5cbiAqIC8vIFRoZSBtYXNrIGlzIGNyb3BwZWQgYnkgMTAgcHggb24gdGhlIHRvcCBhbmQgbGVmdC5cbiAqIHRyaW1SZWN0Qm91bmRzKHNlbGVjdGlvbiwgY2FudmFzKTtcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRyaW1NYXNrUmVjdEJvdW5kczxUIGV4dGVuZHMgTnVsbGFibGVNYXNrUmVjdD4odGFyZ2V0OiBULCBib3VuZHM6IFJlY3QpOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxYID0gdGFyZ2V0Lng7XG4gIGNvbnN0IG9yaWdpbmFsWSA9IHRhcmdldC55O1xuICBjb25zdCBvcmlnaW5hbFcgPSB0YXJnZXQudztcbiAgY29uc3QgaW50ZXJzZWN0ZWRYID0gTWF0aC5tYXgodGFyZ2V0LngsIGJvdW5kcy54KTtcbiAgY29uc3QgaW50ZXJzZWN0ZWRZID0gTWF0aC5tYXgodGFyZ2V0LnksIGJvdW5kcy55KTtcbiAgY29uc3QgaW50ZXJzZWN0ZWRNYXhYID0gTWF0aC5taW4odGFyZ2V0LnggKyB0YXJnZXQudywgYm91bmRzLnggKyBib3VuZHMudyk7XG4gIGNvbnN0IGludGVyc2VjdGVkTWF4WSA9IE1hdGgubWluKHRhcmdldC55ICsgdGFyZ2V0LmgsIGJvdW5kcy55ICsgYm91bmRzLmgpO1xuXG4gIC8vIEludGVyc2VjdGlvbiBjaGVja1xuICBpZiAoaW50ZXJzZWN0ZWRNYXhYIDw9IGludGVyc2VjdGVkWCB8fCBpbnRlcnNlY3RlZE1heFkgPD0gaW50ZXJzZWN0ZWRZKSB7XG4gICAgdGFyZ2V0LncgPSAwO1xuICAgIHRhcmdldC5oID0gMDtcbiAgICBpZiAoJ2RhdGEnIGluIHRhcmdldCAmJiB0YXJnZXQuZGF0YSkge1xuICAgICAgdGFyZ2V0LmRhdGEgPSBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGludGVyc2VjdGVkVyA9IGludGVyc2VjdGVkTWF4WCAtIGludGVyc2VjdGVkWDtcbiAgY29uc3QgaW50ZXJzZWN0ZWRIID0gaW50ZXJzZWN0ZWRNYXhZIC0gaW50ZXJzZWN0ZWRZO1xuICBjb25zdCBvZmZzZXRYID0gaW50ZXJzZWN0ZWRYIC0gb3JpZ2luYWxYO1xuICBjb25zdCBvZmZzZXRZID0gaW50ZXJzZWN0ZWRZIC0gb3JpZ2luYWxZO1xuICB0YXJnZXQueCA9IGludGVyc2VjdGVkWDtcbiAgdGFyZ2V0LnkgPSBpbnRlcnNlY3RlZFk7XG4gIHRhcmdldC53ID0gaW50ZXJzZWN0ZWRXO1xuICB0YXJnZXQuaCA9IGludGVyc2VjdGVkSDtcbiAgaWYgKCdkYXRhJyBpbiB0YXJnZXQgJiYgdGFyZ2V0LmRhdGEpIHtcbiAgICBjb25zdCBjdXJyZW50TWFza0J1ZmZlciA9IGV4dHJhY3RNYXNrQnVmZmVyKHRhcmdldC5kYXRhLCBvcmlnaW5hbFcsIG9mZnNldFgsIG9mZnNldFksIGludGVyc2VjdGVkVywgaW50ZXJzZWN0ZWRIKTtcbiAgICBsZXQgbWluWCA9IGludGVyc2VjdGVkVztcbiAgICBsZXQgbWF4WCA9IC0xO1xuICAgIGxldCBtaW5ZID0gaW50ZXJzZWN0ZWRIO1xuICAgIGxldCBtYXhZID0gLTE7XG5cbiAgICAvLyBTY2FuIGZvciBjb250ZW50XG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBpbnRlcnNlY3RlZEg7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBpbnRlcnNlY3RlZFc7IHgrKykge1xuICAgICAgICBpZiAoY3VycmVudE1hc2tCdWZmZXJbeSAqIGludGVyc2VjdGVkVyArIHhdICE9PSAwKSB7XG4gICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcbiAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIG5vIGNvbnRlbnQgaXMgZm91bmQgKGFsbCB6ZXJvcylcbiAgICBpZiAobWF4WCA9PT0gLTEpIHtcbiAgICAgIHRhcmdldC53ID0gMDtcbiAgICAgIHRhcmdldC5oID0gMDtcbiAgICAgIHRhcmdldC5kYXRhID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGZpbmFsVyA9IG1heFggLSBtaW5YICsgMTtcbiAgICBjb25zdCBmaW5hbEggPSBtYXhZIC0gbWluWSArIDE7XG5cbiAgICAvLyBPbmx5IHNoaWZ0IGFuZCBjcm9wIGlmIHRoZSBjb250ZW50IGlzIHNtYWxsZXIgdGhhbiB0aGUgaW50ZXJzZWN0aW9uXG4gICAgaWYgKGZpbmFsVyAhPT0gaW50ZXJzZWN0ZWRXIHx8IGZpbmFsSCAhPT0gaW50ZXJzZWN0ZWRIKSB7XG4gICAgICBjb25zdCBuZXdNYXNrQnVmZmVyID0gZXh0cmFjdE1hc2tCdWZmZXIoY3VycmVudE1hc2tCdWZmZXIsIGludGVyc2VjdGVkVywgbWluWCwgbWluWSwgZmluYWxXLCBmaW5hbEgpO1xuICAgICAgdGFyZ2V0LnggKz0gbWluWDtcbiAgICAgIHRhcmdldC55ICs9IG1pblk7XG4gICAgICB0YXJnZXQudyA9IGZpbmFsVztcbiAgICAgIHRhcmdldC5oID0gZmluYWxIO1xuICAgICAgdGFyZ2V0LmRhdGEgPSBuZXdNYXNrQnVmZmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXQudyA9IGZpbmFsVztcbiAgICAgIHRhcmdldC5oID0gZmluYWxIO1xuICAgICAgdGFyZ2V0LmRhdGEgPSBjdXJyZW50TWFza0J1ZmZlcjtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type BinaryMaskRect, type Color32, MaskType } from '../_types';\nimport { colorDistance } from '../color';\nimport { extractImageDataBuffer } from '../ImageData/extractImageDataBuffer';\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 on {@link ImageData} or {@link PixelData}.\n * This utility identifies pixels starting from a specific coordinate that fall within a\n * color tolerance. It can operate in \"contiguous\" mode (classic bucket fill) or\n * \"non-contiguous\" mode (selects all matching pixels in the buffer).\n *\n * @param 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.data32;\n const width = target.width;\n const height = target.height;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEJpbmFyeU1hc2tSZWN0LCB0eXBlIENvbG9yMzIsIE1hc2tUeXBlIH0gZnJvbSAnLi4vX3R5cGVzJztcbmltcG9ydCB7IGNvbG9yRGlzdGFuY2UgfSBmcm9tICcuLi9jb2xvcic7XG5pbXBvcnQgeyBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyIH0gZnJvbSAnLi4vSW1hZ2VEYXRhL2V4dHJhY3RJbWFnZURhdGFCdWZmZXInO1xuaW1wb3J0IHsgdHJpbU1hc2tSZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltTWFza1JlY3RCb3VuZHMnO1xuZXhwb3J0IHR5cGUgRmxvb2RGaWxsUmVzdWx0ID0gQmluYXJ5TWFza1JlY3QgJiB7XG4gIHN0YXJ0WDogbnVtYmVyO1xuICBzdGFydFk6IG51bWJlcjtcbiAgcGl4ZWxzOiBVaW50OENsYW1wZWRBcnJheTtcbn07XG5cbi8qKlxuICogUGVyZm9ybXMgYSBjb2xvci1iYXNlZCBmbG9vZCBmaWxsIHNlbGVjdGlvbiBvbiB7QGxpbmsgSW1hZ2VEYXRhfSBvciB7QGxpbmsgUGl4ZWxEYXRhfS5cbiAqIFRoaXMgdXRpbGl0eSBpZGVudGlmaWVzIHBpeGVscyBzdGFydGluZyBmcm9tIGEgc3BlY2lmaWMgY29vcmRpbmF0ZSB0aGF0IGZhbGwgd2l0aGluIGFcbiAqIGNvbG9yIHRvbGVyYW5jZS4gSXQgY2FuIG9wZXJhdGUgaW4gXCJjb250aWd1b3VzXCIgbW9kZSAoY2xhc3NpYyBidWNrZXQgZmlsbCkgb3JcbiAqIFwibm9uLWNvbnRpZ3VvdXNcIiBtb2RlIChzZWxlY3RzIGFsbCBtYXRjaGluZyBwaXhlbHMgaW4gdGhlIGJ1ZmZlcikuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byBwcm9jZXNzLlxuICogQHBhcmFtIHN0YXJ0WCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gc3RhcnRZIC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gY29udGlndW91cyAtIElmIHRydWUsIG9ubHkgY29ubmVjdGVkIHBpeGVscyBhcmVcbiAqIHNlbGVjdGVkLiBJZiBmYWxzZSwgYWxsIHBpeGVscyB3aXRoaW4gdG9sZXJhbmNlIGFyZSBzZWxlY3RlZCByZWdhcmRsZXNzIG9mIHBvc2l0aW9uLlxuICogQHBhcmFtIHRvbGVyYW5jZSAtIFRoZSBtYXhpbXVtIGFsbG93ZWQgZGlmZmVyZW5jZSBpbiBjb2xvclxuICogZGlzdGFuY2UgKDAtMjU1KSBmb3IgYSBwaXhlbCB0byBiZSBpbmNsdWRlZC5cbiAqIEBwYXJhbSBib3VuZHMgLSBPcHRpb25hbCBib3VuZGluZyBib3ggdG8gcmVzdHJpY3QgdGhlIHNlYXJjaCBhcmVhLlxuICogQHBhcmFtIG91dCBvdXRwdXQgb2JqZWN0XG4gKiBAcmV0dXJucyBBIHtAbGluayBGbG9vZEZpbGxSZXN1bHR9IGNvbnRhaW5pbmcgdGhlIG1hc2sgYW5kIGJvdW5kcyBvZiB0aGUgc2VsZWN0aW9uLFxuICogb3IgYG51bGxgIGlmIHRoZSBzdGFydGluZyBjb29yZGluYXRlcyBhcmUgb3V0IG9mIGJvdW5kcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcmVzdWx0ID0gZmxvb2RGaWxsSW1hZ2VEYXRhU2VsZWN0aW9uKFxuICogY3R4LmdldEltYWdlRGF0YSgwLCAwLCAxMDAsIDEwMCksXG4gKiA1MCxcbiAqIDUwLFxuICoge1xuICogdG9sZXJhbmNlOiAyMCxcbiAqIGNvbnRpZ3VvdXM6IHRydWVcbiAqIH1cbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZsb29kRmlsbFNlbGVjdGlvbih0YXJnZXQ6IFBpeGVsRGF0YSwgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBjb250aWd1b3VzID0gdHJ1ZSwgdG9sZXJhbmNlID0gMCwgYm91bmRzPzogUmVjdCwgb3V0PzogRmxvb2RGaWxsUmVzdWx0KTogRmxvb2RGaWxsUmVzdWx0IHwgbnVsbCB7XG4gIGNvbnN0IGRhdGEzMiA9IHRhcmdldC5kYXRhMzI7XG4gIGNvbnN0IHdpZHRoID0gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSB0YXJnZXQuaGVpZ2h0O1xuICBjb25zdCBseCA9IGJvdW5kcz8ueCA/PyAwO1xuICBjb25zdCBseSA9IGJvdW5kcz8ueSA/PyAwO1xuICBjb25zdCBsdyA9IGJvdW5kcz8udyA/PyB3aWR0aDtcbiAgY29uc3QgbGggPSBib3VuZHM/LmggPz8gaGVpZ2h0O1xuICBjb25zdCB4TWluID0gTWF0aC5tYXgoMCwgbHgpO1xuICBjb25zdCB4TWF4ID0gTWF0aC5taW4od2lkdGggLSAxLCBseCArIGx3IC0gMSk7XG4gIGNvbnN0IHlNaW4gPSBNYXRoLm1heCgwLCBseSk7XG4gIGNvbnN0IHlNYXggPSBNYXRoLm1pbihoZWlnaHQgLSAxLCBseSArIGxoIC0gMSk7XG4gIGlmIChzdGFydFggPCB4TWluIHx8IHN0YXJ0WCA+IHhNYXggfHwgc3RhcnRZIDwgeU1pbiB8fCBzdGFydFkgPiB5TWF4KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgb3V0ID0gb3V0ID8/IHt9IGFzIEZsb29kRmlsbFJlc3VsdDtcbiAgY29uc3QgYmFzZUNvbG9yID0gZGF0YTMyW3N0YXJ0WSAqIHdpZHRoICsgc3RhcnRYXSBhcyBDb2xvcjMyO1xuICBsZXQgbWF0Y2hDb3VudCA9IDA7XG4gIGNvbnN0IG1hdGNoWCA9IG5ldyBVaW50MTZBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gIGNvbnN0IG1hdGNoWSA9IG5ldyBVaW50MTZBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gIGxldCBtaW5YID0gc3RhcnRYO1xuICBsZXQgbWF4WCA9IHN0YXJ0WDtcbiAgbGV0IG1pblkgPSBzdGFydFk7XG4gIGxldCBtYXhZID0gc3RhcnRZO1xuICBpZiAoY29udGlndW91cykge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgVWludDMyQXJyYXkod2lkdGggKiBoZWlnaHQpO1xuICAgIGxldCBzdGFja1B0ciA9IDA7XG4gICAgc3RhY2tbc3RhY2tQdHIrK10gPSBzdGFydFkgPDwgMTYgfCBzdGFydFg7XG4gICAgdmlzaXRlZFtzdGFydFkgKiB3aWR0aCArIHN0YXJ0WF0gPSAxO1xuICAgIHdoaWxlIChzdGFja1B0ciA+IDApIHtcbiAgICAgIGNvbnN0IHZhbCA9IHN0YWNrWy0tc3RhY2tQdHJdO1xuICAgICAgY29uc3QgeCA9IHZhbCAmIDB4RkZGRjtcbiAgICAgIGNvbnN0IHkgPSB2YWwgPj4+IDE2O1xuICAgICAgbWF0Y2hYW21hdGNoQ291bnRdID0geDtcbiAgICAgIG1hdGNoWVttYXRjaENvdW50XSA9IHk7XG4gICAgICBtYXRjaENvdW50Kys7XG4gICAgICBpZiAoeCA8IG1pblgpIG1pblggPSB4O1xuICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICBpZiAoeSA+IG1heFkpIG1heFkgPSB5O1xuXG4gICAgICAvLyBSaWdodFxuICAgICAgaWYgKHggKyAxIDw9IHhNYXgpIHtcbiAgICAgICAgY29uc3QgaWR4ID0geSAqIHdpZHRoICsgKHggKyAxKTtcbiAgICAgICAgaWYgKCF2aXNpdGVkW2lkeF0gJiYgY29sb3JEaXN0YW5jZShkYXRhMzJbaWR4XSBhcyBDb2xvcjMyLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIHZpc2l0ZWRbaWR4XSA9IDE7XG4gICAgICAgICAgc3RhY2tbc3RhY2tQdHIrK10gPSB5IDw8IDE2IHwgeCArIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIExlZnRcbiAgICAgIGlmICh4IC0gMSA+PSB4TWluKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiB3aWR0aCArICh4IC0gMSk7XG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxO1xuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0geSA8PCAxNiB8IHggLSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBEb3duXG4gICAgICBpZiAoeSArIDEgPD0geU1heCkge1xuICAgICAgICBjb25zdCBpZHggPSAoeSArIDEpICogd2lkdGggKyB4O1xuICAgICAgICBpZiAoIXZpc2l0ZWRbaWR4XSAmJiBjb2xvckRpc3RhbmNlKGRhdGEzMltpZHhdIGFzIENvbG9yMzIsIGJhc2VDb2xvcikgPD0gdG9sZXJhbmNlKSB7XG4gICAgICAgICAgdmlzaXRlZFtpZHhdID0gMTtcbiAgICAgICAgICBzdGFja1tzdGFja1B0cisrXSA9IHkgKyAxIDw8IDE2IHwgeDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVXBcbiAgICAgIGlmICh5IC0gMSA+PSB5TWluKSB7XG4gICAgICAgIGNvbnN0IGlkeCA9ICh5IC0gMSkgKiB3aWR0aCArIHg7XG4gICAgICAgIGlmICghdmlzaXRlZFtpZHhdICYmIGNvbG9yRGlzdGFuY2UoZGF0YTMyW2lkeF0gYXMgQ29sb3IzMiwgYmFzZUNvbG9yKSA8PSB0b2xlcmFuY2UpIHtcbiAgICAgICAgICB2aXNpdGVkW2lkeF0gPSAxO1xuICAgICAgICAgIHN0YWNrW3N0YWNrUHRyKytdID0geSAtIDEgPDwgMTYgfCB4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IHkgPSB5TWluOyB5IDw9IHlNYXg7IHkrKykge1xuICAgICAgZm9yIChsZXQgeCA9IHhNaW47IHggPD0geE1heDsgeCsrKSB7XG4gICAgICAgIGNvbnN0IGNvbG9yID0gZGF0YTMyW3kgKiB3aWR0aCArIHhdIGFzIENvbG9yMzI7XG4gICAgICAgIGlmIChjb2xvckRpc3RhbmNlKGNvbG9yLCBiYXNlQ29sb3IpIDw9IHRvbGVyYW5jZSkge1xuICAgICAgICAgIG1hdGNoWFttYXRjaENvdW50XSA9IHg7XG4gICAgICAgICAgbWF0Y2hZW21hdGNoQ291bnRdID0geTtcbiAgICAgICAgICBtYXRjaENvdW50Kys7XG4gICAgICAgICAgaWYgKHggPCBtaW5YKSBtaW5YID0geDtcbiAgICAgICAgICBpZiAoeCA+IG1heFgpIG1heFggPSB4O1xuICAgICAgICAgIGlmICh5IDwgbWluWSkgbWluWSA9IHk7XG4gICAgICAgICAgaWYgKHkgPiBtYXhZKSBtYXhZID0geTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobWF0Y2hDb3VudCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gIGNvbnN0IHcgPSBtYXhYIC0gbWluWCArIDE7XG4gIGNvbnN0IGggPSBtYXhZIC0gbWluWSArIDE7XG4gIG91dC5zdGFydFggPSBzdGFydFg7XG4gIG91dC5zdGFydFkgPSBzdGFydFk7XG4gIG91dC54ID0gbWluWDtcbiAgb3V0LnkgPSBtaW5ZO1xuICBvdXQudyA9IHc7XG4gIG91dC5oID0gaDtcbiAgb3V0LmRhdGEgPSBuZXcgVWludDhBcnJheSh3ICogaCk7XG4gIG91dC50eXBlID0gTWFza1R5cGUuQklOQVJZO1xuICBjb25zdCBmaW5hbE1hc2sgPSBvdXQuZGF0YTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaENvdW50OyBpKyspIHtcbiAgICBjb25zdCBteCA9IG1hdGNoWFtpXSAtIG1pblg7XG4gICAgY29uc3QgbXkgPSBtYXRjaFlbaV0gLSBtaW5ZO1xuICAgIGlmIChteCA+PSAwICYmIG14IDwgdyAmJiBteSA+PSAwICYmIG15IDwgaCkge1xuICAgICAgZmluYWxNYXNrW215ICogdyArIG14XSA9IDE7XG4gICAgfVxuICB9XG4gIHRyaW1NYXNrUmVjdEJvdW5kcyhvdXQsIHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogd2lkdGgsXG4gICAgaDogaGVpZ2h0XG4gIH0pO1xuICBvdXQucGl4ZWxzID0gZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcih0YXJnZXQuaW1hZ2VEYXRhLCBvdXQueCwgb3V0LnksIG91dC53LCBvdXQuaCk7XG4gIHJldHVybiBvdXQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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 const dx = x1 - x0;\n const dy = y1 - y0;\n\n // Determine the number of steps based on the longest axis\n const steps = Math.max(Math.abs(dx), Math.abs(dy));\n\n // Handle the zero-length line (Single Stamp Case)\n if (steps === 0) {\n callback(x0, y0);\n return;\n }\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEl0ZXJhdGVzIHRocm91Z2ggYSBsaW5lIHdpdGggc3ViLXBpeGVsIHByZWNpc2lvbi5cbiAqIEd1YXJhbnRlZXMgdGhhdCB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnRzIGFyZSBleGFjdGx5ICh4MCwgeTApIGFuZCAoeDEsIHkxKS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvckVhY2hMaW5lUG9pbnQoeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlciwgY2FsbGJhY2s6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICBjb25zdCBkeCA9IHgxIC0geDA7XG4gIGNvbnN0IGR5ID0geTEgLSB5MDtcblxuICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBzdGVwcyBiYXNlZCBvbiB0aGUgbG9uZ2VzdCBheGlzXG4gIGNvbnN0IHN0ZXBzID0gTWF0aC5tYXgoTWF0aC5hYnMoZHgpLCBNYXRoLmFicyhkeSkpO1xuXG4gIC8vIEhhbmRsZSB0aGUgemVyby1sZW5ndGggbGluZSAoU2luZ2xlIFN0YW1wIENhc2UpXG4gIGlmIChzdGVwcyA9PT0gMCkge1xuICAgIGNhbGxiYWNrKHgwLCB5MCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHhJbmMgPSBkeCAvIHN0ZXBzO1xuICBjb25zdCB5SW5jID0gZHkgLyBzdGVwcztcbiAgbGV0IGN1clggPSB4MDtcbiAgbGV0IGN1clkgPSB5MDtcblxuICAvLyBXZSBhZGQgKzEgdG8gdGhlIGxvb3AgdG8gZW5zdXJlIHdlIHJlYWNoIHRoZSBmaW5hbCAoeDEsIHkxKVxuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSsrKSB7XG4gICAgY2FsbGJhY2soY3VyWCwgY3VyWSk7XG4gICAgY3VyWCArPSB4SW5jO1xuICAgIGN1clkgKz0geUluYztcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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","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} 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgQmFzZUJsZW5kTW9kZSA9IHtcbiAgb3ZlcndyaXRlOiAwLFxuICBzb3VyY2VPdmVyOiAxLFxuICBkYXJrZW46IDIsXG4gIG11bHRpcGx5OiAzLFxuICBjb2xvckJ1cm46IDQsXG4gIGxpbmVhckJ1cm46IDUsXG4gIGRhcmtlckNvbG9yOiA2LFxuICBsaWdodGVuOiA3LFxuICBzY3JlZW46IDgsXG4gIGNvbG9yRG9kZ2U6IDksXG4gIGxpbmVhckRvZGdlOiAxMCxcbiAgbGlnaHRlckNvbG9yOiAxMSxcbiAgb3ZlcmxheTogMTIsXG4gIHNvZnRMaWdodDogMTMsXG4gIGhhcmRMaWdodDogMTQsXG4gIHZpdmlkTGlnaHQ6IDE1LFxuICBsaW5lYXJMaWdodDogMTYsXG4gIHBpbkxpZ2h0OiAxNyxcbiAgaGFyZE1peDogMTgsXG4gIGRpZmZlcmVuY2U6IDE5LFxuICBleGNsdXNpb246IDIwLFxuICBzdWJ0cmFjdDogMjEsXG4gIGRpdmlkZTogMjJcbn0gYXMgY29uc3Q7XG5leHBvcnQgaW50ZXJmYWNlIFJlcXVpcmVkQmxlbmRNb2RlcyB7XG4gIG92ZXJ3cml0ZTogMDtcbn1cbmV4cG9ydCB0eXBlIEJhc2VCbGVuZE1vZGVzID0gUmVxdWlyZWRCbGVuZE1vZGVzICYgUmVjb3JkPHN0cmluZywgbnVtYmVyPjtcbmV4cG9ydCBjb25zdCBvdmVyd3JpdGVCYXNlOiBCbGVuZENvbG9yMzIgPSAoc3JjLCBfZHN0KSA9PiBzcmM7XG5vdmVyd3JpdGVCYXNlLmlzT3ZlcndyaXRlID0gdHJ1ZTsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwriteFast = overwriteBase;\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.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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSwgb3ZlcndyaXRlQmFzZSB9IGZyb20gJy4vYmxlbmQtbW9kZXMnO1xuaW1wb3J0IHsgbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5IH0gZnJvbSAnLi9CbGVuZE1vZGVSZWdpc3RyeSc7XG5leHBvcnQgY29uc3Qgb3ZlcndyaXRlRmFzdCA9IG92ZXJ3cml0ZUJhc2U7XG5leHBvcnQgY29uc3Qgc291cmNlT3ZlckZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuIHNyYztcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gc3IgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gc2cgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gc2IgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyBkYSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IGRhcmtlbkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IHNyIDwgZHIgPyBzciA6IGRyO1xuICBjb25zdCBiZyA9IHNnIDwgZGcgPyBzZyA6IGRnO1xuICBjb25zdCBiYiA9IHNiIDwgZGIgPyBzYiA6IGRiO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogKHNyYyAqIGRzdCkgLyAyNTUgKi9cbmV4cG9ydCBjb25zdCBtdWx0aXBseUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuXG4gIC8vIENvbnNpc3RlbnQgZmxvb3Igcm91bmRpbmcgZm9yIGFsbCBjaGFubmVsc1xuICBjb25zdCBiciA9IHNyICogZHIgPj4gODtcbiAgY29uc3QgYmcgPSBzZyAqIGRnID4+IDg7XG4gIGNvbnN0IGJiID0gc2IgKiBkYiA+PiA4O1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgZGEgPSBkc3QgPj4+IDI0ICYgMHhGRjtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgZGEgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIDI1NSAtICgyNTUtc3JjKS9kc3QgKi9cbmV4cG9ydCBjb25zdCBjb2xvckJ1cm5GYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBkciA9PT0gMjU1ID8gMjU1IDogc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKDI1NSAtIGRyIDw8IDgpIC8gc3IgfCAwKTtcbiAgY29uc3QgYmcgPSBkZyA9PT0gMjU1ID8gMjU1IDogc2cgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKDI1NSAtIGRnIDw8IDgpIC8gc2cgfCAwKTtcbiAgY29uc3QgYmIgPSBkYiA9PT0gMjU1ID8gMjU1IDogc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKDI1NSAtIGRiIDw8IDgpIC8gc2IgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IGRhID0gZHN0ID4+PiAyNCAmIDB4RkY7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIGRhICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBzcmMgKyBkc3QgLSAyNTUgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJCdXJuRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG5cbiAgLy8gTWF0aDogQmFzZSArIEJsZW5kIC0gMjU1IChjbGFtcGVkIHRvIDApXG4gIGNvbnN0IGJyVSA9IGRyICsgc3IgLSAyNTU7XG4gIGNvbnN0IGJnVSA9IGRnICsgc2cgLSAyNTU7XG4gIGNvbnN0IGJiVSA9IGRiICsgc2IgLSAyNTU7XG4gIGNvbnN0IGJyID0gYnJVIDwgMCA/IDAgOiBiclU7XG4gIGNvbnN0IGJnID0gYmdVIDwgMCA/IDAgOiBiZ1U7XG4gIGNvbnN0IGJiID0gYmJVIDwgMCA/IDAgOiBiYlU7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5leHBvcnQgY29uc3QgZGFya2VyRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG5cbiAgLy8gMS4gQ2FsY3VsYXRlIEx1bWlub3NpdHkgKFBob3Rvc2hvcCBXZWlnaHRzOiBSOjAuMywgRzowLjU5LCBCOjAuMTEpXG4gIC8vIFNjYWxlZCBieSAyNTYgZm9yIGludGVnZXIgbWF0aDogNzcsIDE1MSwgMjhcbiAgY29uc3QgbHVtU3JjID0gc3IgKiA3NyArIHNnICogMTUxICsgc2IgKiAyODtcbiAgY29uc3QgbHVtRHN0ID0gZHIgKiA3NyArIGRnICogMTUxICsgZGIgKiAyODtcblxuICAvLyAyLiBTZWxlY3Rpb24gTG9naWNcbiAgLy8gUGljayB0aGUgcGVyY2VwdHVhbGx5IGRhcmtlciBwaXhlbFxuICBsZXQgYnIsIGJnLCBiYjtcbiAgaWYgKGx1bVNyYyA8IGx1bURzdCkge1xuICAgIGJyID0gc3I7XG4gICAgYmcgPSBzZztcbiAgICBiYiA9IHNiO1xuICB9IGVsc2Uge1xuICAgIGJyID0gZHI7XG4gICAgYmcgPSBkZztcbiAgICBiYiA9IGRiO1xuICB9XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyAzLiBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBNYXRoLm1heChzcmMsIGRzdCkgKi9cbmV4cG9ydCBjb25zdCBsaWdodGVuRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgYnIgPSBNYXRoLm1heChzcmMgJiAweEZGLCBkc3QgJiAweEZGKTtcbiAgY29uc3QgYmcgPSBNYXRoLm1heChzcmMgPj4gOCAmIDB4RkYsIGRzdCA+PiA4ICYgMHhGRik7XG4gIGNvbnN0IGJiID0gTWF0aC5tYXgoc3JjID4+IDE2ICYgMHhGRiwgZHN0ID4+IDE2ICYgMHhGRik7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGO1xuICBjb25zdCBkZyA9IGRzdCA+PiA4ICYgMHhGRjtcbiAgY29uc3QgZGIgPSBkc3QgPj4gMTYgJiAweEZGO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqXG4gKiAyNTUgLSAoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSlcbiAqL1xuZXhwb3J0IGNvbnN0IHNjcmVlbkZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSAyNTUgLSAoKDI1NSAtIChzcmMgJiAweEZGKSkgKiAoMjU1IC0gZHIpID4+IDgpO1xuICBjb25zdCBiZyA9IDI1NSAtICgoMjU1IC0gKHNyYyA+Pj4gOCAmIDB4RkYpKSAqICgyNTUgLSBkZykgPj4gOCk7XG4gIGNvbnN0IGJiID0gMjU1IC0gKCgyNTUgLSAoc3JjID4+PiAxNiAmIDB4RkYpKSAqICgyNTUgLSBkYikgPj4gOCk7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBzcmMgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRzdCA8PCA4KSAvICgyNTUgLSBzcmMpKSAqL1xuZXhwb3J0IGNvbnN0IGNvbG9yRG9kZ2VGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZHIgPDwgOCkgLyAoMjU1IC0gc3IpIHwgMCk7XG4gIGNvbnN0IGJnID0gc2cgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRnIDw8IDgpIC8gKDI1NSAtIHNnKSB8IDApO1xuICBjb25zdCBiYiA9IHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkYiA8PCA4KSAvICgyNTUgLSBzYikgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIHNyYyArIGRzdCAqL1xuZXhwb3J0IGNvbnN0IGxpbmVhckRvZGdlRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiclUgPSAoc3JjICYgMHhGRikgKyBkcjtcbiAgY29uc3QgYmdVID0gKHNyYyA+Pj4gOCAmIDB4RkYpICsgZGc7XG4gIGNvbnN0IGJiVSA9IChzcmMgPj4+IDE2ICYgMHhGRikgKyBkYjtcbiAgY29uc3QgYnIgPSBiclUgPiAyNTUgPyAyNTUgOiBiclU7XG4gIGNvbnN0IGJnID0gYmdVID4gMjU1ID8gMjU1IDogYmdVO1xuICBjb25zdCBiYiA9IGJiVSA+IDI1NSA/IDI1NSA6IGJiVTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBsaWdodGVyRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG5cbiAgLy8gQ2FsY3VsYXRlIEx1bWlub3NpdHkgKFBob3Rvc2hvcCB1c2VzIFdlaWdodHM6IFI6MC4zLCBHOjAuNTksIEI6MC4xMSlcbiAgLy8gV2UgdXNlIGludGVnZXIgbWF0aCAoc2NhbGVkIGJ5IDI1NikgZm9yIHNwZWVkLlxuICBjb25zdCBsdW1TcmMgPSBzciAqIDc3ICsgc2cgKiAxNTEgKyBzYiAqIDI4O1xuICBjb25zdCBsdW1Ec3QgPSBkciAqIDc3ICsgZGcgKiAxNTEgKyBkYiAqIDI4O1xuXG4gIC8vIFNlbGVjdGlvbiBMb2dpYyAoQmFzZSByZXN1bHQpXG4gIGxldCBiciwgYmcsIGJiO1xuICBpZiAobHVtU3JjID4gbHVtRHN0KSB7XG4gICAgYnIgPSBzcjtcbiAgICBiZyA9IHNnO1xuICAgIGJiID0gc2I7XG4gIH0gZWxzZSB7XG4gICAgYnIgPSBkcjtcbiAgICBiZyA9IGRnO1xuICAgIGJiID0gZGI7XG4gIH1cbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnBcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBzcmMgPCAxMjggPyAoMiAqIHNyYyAqIGRzdCkgOiAoMjU1IC0gMiAqICgyNTUgLSBzcmMpICogKDI1NSAtIGRzdCkpICovXG5leHBvcnQgY29uc3Qgb3ZlcmxheUZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IGRyIDwgMTI4ID8gMiAqIHNyICogZHIgPj4gOCA6IDI1NSAtICgyICogKDI1NSAtIHNyKSAqICgyNTUgLSBkcikgPj4gOCk7XG4gIGNvbnN0IGJnID0gZGcgPCAxMjggPyAyICogc2cgKiBkZyA+PiA4IDogMjU1IC0gKDIgKiAoMjU1IC0gc2cpICogKDI1NSAtIGRnKSA+PiA4KTtcbiAgY29uc3QgYmIgPSBkYiA8IDEyOCA/IDIgKiBzYiAqIGRiID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzYikgKiAoMjU1IC0gZGIpID4+IDgpO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogKCgyNTUgLSBkc3QpICogKChzcmMgKiBkc3QpID4+IDgpICsgZHN0ICogKDI1NSAtICgoKDI1NSAtIHNyYykgKiAoMjU1IC0gZHN0KSkgPj4gOCkpKSA+PiA4ICovXG5leHBvcnQgY29uc3Qgc29mdExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gKDI1NSAtIGRyKSAqIChzciAqIGRyID4+IDgpICsgZHIgKiAoMjU1IC0gKCgyNTUgLSBzcikgKiAoMjU1IC0gZHIpID4+IDgpKSA+PiA4O1xuICBjb25zdCBiZyA9ICgyNTUgLSBkZykgKiAoc2cgKiBkZyA+PiA4KSArIGRnICogKDI1NSAtICgoMjU1IC0gc2cpICogKDI1NSAtIGRnKSA+PiA4KSkgPj4gODtcbiAgY29uc3QgYmIgPSAoMjU1IC0gZGIpICogKHNiICogZGIgPj4gOCkgKyBkYiAqICgyNTUgLSAoKDI1NSAtIHNiKSAqICgyNTUgLSBkYikgPj4gOCkpID4+IDg7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBJZiBzcmMgPCAxMjggKDUwJSBncmF5KSwgTXVsdGlwbHk7IG90aGVyd2lzZSwgU2NyZWVuICovXG5leHBvcnQgY29uc3QgaGFyZExpZ2h0RmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gc3IgPCAxMjggPyAyICogc3IgKiBkciA+PiA4IDogMjU1IC0gKDIgKiAoMjU1IC0gc3IpICogKDI1NSAtIGRyKSA+PiA4KTtcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IDIgKiBzZyAqIGRnID4+IDggOiAyNTUgLSAoMiAqICgyNTUgLSBzZykgKiAoMjU1IC0gZGcpID4+IDgpO1xuICBjb25zdCBiYiA9IHNiIDwgMTI4ID8gMiAqIHNiICogZGIgPj4gOCA6IDI1NSAtICgyICogKDI1NSAtIHNiKSAqICgyNTUgLSBkYikgPj4gOCk7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKlxuICogSWYgc3JjIDwgMTI4OiBCdXJuKGRzdCwgMiAqIHNyYylcbiAqIElmIHNyYyA+PSAxMjg6IERvZGdlKGRzdCwgMiAqIChzcmMgLSAxMjgpKVxuICovXG5leHBvcnQgY29uc3Qgdml2aWRMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IHNyIDwgMTI4ID8gc3IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKDI1NSAtIGRyIDw8IDgpIC8gKDIgKiBzcikgfCAwKSA6IHNyID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkciA8PCA4KSAvICgyICogKDI1NSAtIHNyKSkgfCAwKTtcbiAgY29uc3QgYmcgPSBzZyA8IDEyOCA/IHNnID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgyNTUgLSBkZyA8PCA4KSAvICgyICogc2cpIHwgMCkgOiBzZyA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZGcgPDwgOCkgLyAoMiAqICgyNTUgLSBzZykpIHwgMCk7XG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyBzYiA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoMjU1IC0gZGIgPDwgOCkgLyAoMiAqIHNiKSB8IDApIDogc2IgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRiIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2IpKSB8IDApO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogZHN0ICsgMiAqIHNyYyAtIDI1NSAoQ2xhbXBlZCB0byAwLTI1NSkgKi9cbmV4cG9ydCBjb25zdCBsaW5lYXJMaWdodEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiclUgPSBkciArIDIgKiBzciAtIDI1NTtcbiAgY29uc3QgYmdVID0gZGcgKyAyICogc2cgLSAyNTU7XG4gIGNvbnN0IGJiVSA9IGRiICsgMiAqIHNiIC0gMjU1O1xuICBjb25zdCBiciA9IGJyVSA8IDAgPyAwIDogYnJVID4gMjU1ID8gMjU1IDogYnJVO1xuICBjb25zdCBiZyA9IGJnVSA8IDAgPyAwIDogYmdVID4gMjU1ID8gMjU1IDogYmdVO1xuICBjb25zdCBiYiA9IGJiVSA8IDAgPyAwIDogYmJVID4gMjU1ID8gMjU1IDogYmJVO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogc3JjIDwgMTI4ID8gbWluKGRzdCwgMiAqIHNyYykgOiBtYXgoZHN0LCAyICogKHNyYyAtIDEyOCkpICovXG5leHBvcnQgY29uc3QgcGluTGlnaHRGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA8IDEyOCA/IGRyIDwgMiAqIHNyID8gZHIgOiAyICogc3IgOiBkciA+IDIgKiBzciAtIDI1NiA/IGRyIDogMiAqIHNyIC0gMjU2O1xuICBjb25zdCBiZyA9IHNnIDwgMTI4ID8gZGcgPCAyICogc2cgPyBkZyA6IDIgKiBzZyA6IGRnID4gMiAqIHNnIC0gMjU2ID8gZGcgOiAyICogc2cgLSAyNTY7XG4gIGNvbnN0IGJiID0gc2IgPCAxMjggPyBkYiA8IDIgKiBzYiA/IGRiIDogMiAqIHNiIDogZGIgPiAyICogc2IgLSAyNTYgPyBkYiA6IDIgKiBzYiAtIDI1NjtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIChWaXZpZCBMaWdodCBsb2dpYyBmb3JjZWQgdG8gMCBvciAyNTUpICovXG5leHBvcnQgY29uc3QgaGFyZE1peEZhc3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+Pj4gMjQgJiAweEZGO1xuICBpZiAoc2EgPT09IDApIHJldHVybiBkc3Q7XG4gIGNvbnN0IGRyID0gZHN0ICYgMHhGRixcbiAgICBkZyA9IGRzdCA+Pj4gOCAmIDB4RkYsXG4gICAgZGIgPSBkc3QgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3Qgc3IgPSBzcmMgJiAweEZGLFxuICAgIHNnID0gc3JjID4+PiA4ICYgMHhGRixcbiAgICBzYiA9IHNyYyA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBiciA9IChzciA8IDEyOCA/IHNyID09PSAwID8gMCA6IE1hdGgubWF4KDAsIDI1NSAtICgyNTUgLSBkciA8PCA4KSAvICgyICogc3IpIHwgMCkgOiBzciA9PT0gMjU1ID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZHIgPDwgOCkgLyAoMiAqICgyNTUgLSBzcikpIHwgMCkpIDwgMTI4ID8gMCA6IDI1NTtcbiAgY29uc3QgYmcgPSAoc2cgPCAxMjggPyBzZyA9PT0gMCA/IDAgOiBNYXRoLm1heCgwLCAyNTUgLSAoMjU1IC0gZGcgPDwgOCkgLyAoMiAqIHNnKSB8IDApIDogc2cgPT09IDI1NSA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRnIDw8IDgpIC8gKDIgKiAoMjU1IC0gc2cpKSB8IDApKSA8IDEyOCA/IDAgOiAyNTU7XG4gIGNvbnN0IGJiID0gKHNiIDwgMTI4ID8gc2IgPT09IDAgPyAwIDogTWF0aC5tYXgoMCwgMjU1IC0gKDI1NSAtIGRiIDw8IDgpIC8gKDIgKiBzYikgfCAwKSA6IHNiID09PSAyNTUgPyAyNTUgOiBNYXRoLm1pbigyNTUsIChkYiA8PCA4KSAvICgyICogKDI1NSAtIHNiKSkgfCAwKSkgPCAxMjggPyAwIDogMjU1O1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogTWF0aC5hYnMoc3JjIC0gZHN0KSAqL1xuZXhwb3J0IGNvbnN0IGRpZmZlcmVuY2VGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyRCA9IChzcmMgJiAweEZGKSAtIGRyO1xuICBjb25zdCBiZ0QgPSAoc3JjID4+PiA4ICYgMHhGRikgLSBkZztcbiAgY29uc3QgYmJEID0gKHNyYyA+Pj4gMTYgJiAweEZGKSAtIGRiO1xuICBjb25zdCBiciA9IGJyRCA8IDAgPyAtYnJEIDogYnJEO1xuICBjb25zdCBiZyA9IGJnRCA8IDAgPyAtYmdEIDogYmdEO1xuICBjb25zdCBiYiA9IGJiRCA8IDAgPyAtYmJEIDogYmJEO1xuICBpZiAoc2EgPT09IDI1NSkgcmV0dXJuICgweEZGMDAwMDAwIHwgYmIgPDwgMTYgfCBiZyA8PCA4IHwgYnIpID4+PiAwIGFzIENvbG9yMzI7XG5cbiAgLy8gQWxwaGEgTGVycCBpbmxpbmVkXG4gIGNvbnN0IGludkEgPSAyNTUgLSBzYTtcbiAgY29uc3QgciA9IGJyICogc2EgKyBkciAqIGludkEgPj4gODtcbiAgY29uc3QgZyA9IGJnICogc2EgKyBkZyAqIGludkEgPj4gODtcbiAgY29uc3QgYiA9IGJiICogc2EgKyBkYiAqIGludkEgPj4gODtcbiAgY29uc3QgYSA9IDI1NSAqIHNhICsgKGRzdCA+Pj4gMjQgJiAweEZGKSAqIGludkEgPj4gODtcbiAgcmV0dXJuIChhIDw8IDI0IHwgYiA8PCAxNiB8IGcgPDwgOCB8IHIpID4+PiAwIGFzIENvbG9yMzI7XG59O1xuXG4vKiogZHN0ICsgc3JjIC0gKChkc3QgKiBzcmMpID4+IDcpICovXG5leHBvcnQgY29uc3QgZXhjbHVzaW9uRmFzdDogQmxlbmRDb2xvcjMyID0gKHNyYywgZHN0KSA9PiB7XG4gIGNvbnN0IHNhID0gc3JjID4+PiAyNCAmIDB4RkY7XG4gIGlmIChzYSA9PT0gMCkgcmV0dXJuIGRzdDtcbiAgY29uc3QgZHIgPSBkc3QgJiAweEZGLFxuICAgIGRnID0gZHN0ID4+PiA4ICYgMHhGRixcbiAgICBkYiA9IGRzdCA+Pj4gMTYgJiAweEZGO1xuICBjb25zdCBzciA9IHNyYyAmIDB4RkYsXG4gICAgc2cgPSBzcmMgPj4+IDggJiAweEZGLFxuICAgIHNiID0gc3JjID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IGJyID0gZHIgKyBzciAtIChkciAqIHNyID4+IDcpO1xuICBjb25zdCBiZyA9IGRnICsgc2cgLSAoZGcgKiBzZyA+PiA3KTtcbiAgY29uc3QgYmIgPSBkYiArIHNiIC0gKGRiICogc2IgPj4gNyk7XG4gIGlmIChzYSA9PT0gMjU1KSByZXR1cm4gKDB4RkYwMDAwMDAgfCBiYiA8PCAxNiB8IGJnIDw8IDggfCBicikgPj4+IDAgYXMgQ29sb3IzMjtcblxuICAvLyBBbHBoYSBMZXJwIGlubGluZWRcbiAgY29uc3QgaW52QSA9IDI1NSAtIHNhO1xuICBjb25zdCByID0gYnIgKiBzYSArIGRyICogaW52QSA+PiA4O1xuICBjb25zdCBnID0gYmcgKiBzYSArIGRnICogaW52QSA+PiA4O1xuICBjb25zdCBiID0gYmIgKiBzYSArIGRiICogaW52QSA+PiA4O1xuICBjb25zdCBhID0gMjU1ICogc2EgKyAoZHN0ID4+PiAyNCAmIDB4RkYpICogaW52QSA+PiA4O1xuICByZXR1cm4gKGEgPDwgMjQgfCBiIDw8IDE2IHwgZyA8PCA4IHwgcikgPj4+IDAgYXMgQ29sb3IzMjtcbn07XG5cbi8qKiBNYXRoLm1heCgwLCBkc3QgLSBzcmMpICovXG5leHBvcnQgY29uc3Qgc3VidHJhY3RGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnJVID0gZHIgLSBzcjtcbiAgY29uc3QgYmdVID0gZGcgLSBzZztcbiAgY29uc3QgYmJVID0gZGIgLSBzYjtcbiAgY29uc3QgYnIgPSBiclUgPCAwID8gMCA6IGJyVTtcbiAgY29uc3QgYmcgPSBiZ1UgPCAwID8gMCA6IGJnVTtcbiAgY29uc3QgYmIgPSBiYlUgPCAwID8gMCA6IGJiVTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcblxuLyoqIHNyID09PSAwID8gMjU1IDogTWF0aC5taW4oMjU1LCAoZHIgPDwgOCkgLyBzcikgKi9cbmV4cG9ydCBjb25zdCBkaXZpZGVGYXN0OiBCbGVuZENvbG9yMzIgPSAoc3JjLCBkc3QpID0+IHtcbiAgY29uc3Qgc2EgPSBzcmMgPj4+IDI0ICYgMHhGRjtcbiAgaWYgKHNhID09PSAwKSByZXR1cm4gZHN0O1xuICBjb25zdCBkciA9IGRzdCAmIDB4RkYsXG4gICAgZGcgPSBkc3QgPj4+IDggJiAweEZGLFxuICAgIGRiID0gZHN0ID4+PiAxNiAmIDB4RkY7XG4gIGNvbnN0IHNyID0gc3JjICYgMHhGRixcbiAgICBzZyA9IHNyYyA+Pj4gOCAmIDB4RkYsXG4gICAgc2IgPSBzcmMgPj4+IDE2ICYgMHhGRjtcbiAgY29uc3QgYnIgPSBzciA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRyIDw8IDgpIC8gc3IgfCAwKTtcbiAgY29uc3QgYmcgPSBzZyA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRnIDw8IDgpIC8gc2cgfCAwKTtcbiAgY29uc3QgYmIgPSBzYiA9PT0gMCA/IDI1NSA6IE1hdGgubWluKDI1NSwgKGRiIDw8IDgpIC8gc2IgfCAwKTtcbiAgaWYgKHNhID09PSAyNTUpIHJldHVybiAoMHhGRjAwMDAwMCB8IGJiIDw8IDE2IHwgYmcgPDwgOCB8IGJyKSA+Pj4gMCBhcyBDb2xvcjMyO1xuXG4gIC8vIEFscGhhIExlcnAgaW5saW5lZFxuICBjb25zdCBpbnZBID0gMjU1IC0gc2E7XG4gIGNvbnN0IHIgPSBiciAqIHNhICsgZHIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGcgPSBiZyAqIHNhICsgZGcgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGIgPSBiYiAqIHNhICsgZGIgKiBpbnZBID4+IDg7XG4gIGNvbnN0IGEgPSAyNTUgKiBzYSArIChkc3QgPj4+IDI0ICYgMHhGRikgKiBpbnZBID4+IDg7XG4gIHJldHVybiAoYSA8PCAyNCB8IGIgPDwgMTYgfCBnIDw8IDggfCByKSA+Pj4gMCBhcyBDb2xvcjMyO1xufTtcbmV4cG9ydCBjb25zdCBCQVNFX0ZBU1RfQkxFTkRfTU9ERV9GVU5DVElPTlM6IFJlY29yZDxudW1iZXIsIEJsZW5kQ29sb3IzMj4gPSB7XG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJ3cml0ZV06IG92ZXJ3cml0ZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvdXJjZU92ZXJdOiBzb3VyY2VPdmVyRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGFya2VuXTogZGFya2VuRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubXVsdGlwbHldOiBtdWx0aXBseUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmNvbG9yQnVybl06IGNvbG9yQnVybkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpbmVhckJ1cm5dOiBsaW5lYXJCdXJuRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGFya2VyQ29sb3JdOiBkYXJrZXJGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5saWdodGVuXTogbGlnaHRlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNjcmVlbl06IHNjcmVlbkZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmNvbG9yRG9kZ2VdOiBjb2xvckRvZGdlRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyRG9kZ2VdOiBsaW5lYXJEb2RnZUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpZ2h0ZXJDb2xvcl06IGxpZ2h0ZXJGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5vdmVybGF5XTogb3ZlcmxheUZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnNvZnRMaWdodF06IHNvZnRMaWdodEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRMaWdodF06IGhhcmRMaWdodEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnZpdmlkTGlnaHRdOiB2aXZpZExpZ2h0RmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyTGlnaHRdOiBsaW5lYXJMaWdodEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLnBpbkxpZ2h0XTogcGluTGlnaHRGYXN0LFxuICBbQmFzZUJsZW5kTW9kZS5oYXJkTWl4XTogaGFyZE1peEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRpZmZlcmVuY2VdOiBkaWZmZXJlbmNlRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZXhjbHVzaW9uXTogZXhjbHVzaW9uRmFzdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc3VidHJhY3RdOiBzdWJ0cmFjdEZhc3QsXG4gIFtCYXNlQmxlbmRNb2RlLmRpdmlkZV06IGRpdmlkZUZhc3Rcbn07XG5leHBvcnQgZnVuY3Rpb24gbWFrZUZhc3RCbGVuZE1vZGVSZWdpc3RyeShuYW1lID0gJ2Zhc3QnKSB7XG4gIHJldHVybiBtYWtlQmxlbmRNb2RlUmVnaXN0cnkoQmFzZUJsZW5kTW9kZSwgQkFTRV9GQVNUX0JMRU5EX01PREVfRlVOQ1RJT05TLCBuYW1lKTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { BaseBlendMode, overwriteBase } from './blend-modes';\nimport { makeBlendModeRegistry } from './BlendModeRegistry';\nexport const overwritePerfect = overwriteBase;\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.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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgQmFzZUJsZW5kTW9kZSwgb3ZlcndyaXRlQmFzZSB9IGZyb20gJy4vYmxlbmQtbW9kZXMnO1xuaW1wb3J0IHsgbWFrZUJsZW5kTW9kZVJlZ2lzdHJ5IH0gZnJvbSAnLi9CbGVuZE1vZGVSZWdpc3RyeSc7XG5leHBvcnQgY29uc3Qgb3ZlcndyaXRlUGVyZmVjdCA9IG92ZXJ3cml0ZUJhc2U7XG5leHBvcnQgY29uc3Qgc291cmNlT3ZlclBlcmZlY3Q6IEJsZW5kQ29sb3IzMiA9IChzcmMsIGRzdCkgPT4ge1xuICBjb25zdCBzYSA9IHNyYyA+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+PiAwIGFzIENvbG9yMzI7XG59O1xuZXhwb3J0IGNvbnN0IEJBU0VfUEVSRkVDVF9CTEVORF9NT0RFX0ZVTkNUSU9OUzogUmVjb3JkPG51bWJlciwgQmxlbmRDb2xvcjMyPiA9IHtcbiAgW0Jhc2VCbGVuZE1vZGUub3ZlcndyaXRlXTogb3ZlcndyaXRlUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc291cmNlT3Zlcl06IHNvdXJjZU92ZXJQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZW5dOiBkYXJrZW5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5tdWx0aXBseV06IG11bHRpcGx5UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JCdXJuXTogY29sb3JCdXJuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGluZWFyQnVybl06IGxpbmVhckJ1cm5QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5kYXJrZXJDb2xvcl06IGRhcmtlclBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmxpZ2h0ZW5dOiBsaWdodGVuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc2NyZWVuXTogc2NyZWVuUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuY29sb3JEb2RnZV06IGNvbG9yRG9kZ2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJEb2RnZV06IGxpbmVhckRvZGdlUGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUubGlnaHRlckNvbG9yXTogbGlnaHRlclBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLm92ZXJsYXldOiBvdmVybGF5UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuc29mdExpZ2h0XTogc29mdExpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuaGFyZExpZ2h0XTogaGFyZExpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUudml2aWRMaWdodF06IHZpdmlkTGlnaHRQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5saW5lYXJMaWdodF06IGxpbmVhckxpZ2h0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUucGluTGlnaHRdOiBwaW5MaWdodFBlcmZlY3QsXG4gIFtCYXNlQmxlbmRNb2RlLmhhcmRNaXhdOiBoYXJkTWl4UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGlmZmVyZW5jZV06IGRpZmZlcmVuY2VQZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5leGNsdXNpb25dOiBleGNsdXNpb25QZXJmZWN0LFxuICBbQmFzZUJsZW5kTW9kZS5zdWJ0cmFjdF06IHN1YnRyYWN0UGVyZmVjdCxcbiAgW0Jhc2VCbGVuZE1vZGUuZGl2aWRlXTogZGl2aWRlUGVyZmVjdFxufTtcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGVyZmVjdEJsZW5kTW9kZVJlZ2lzdHJ5KG5hbWUgPSAncGVyZmVjdCcpIHtcbiAgcmV0dXJuIG1ha2VCbGVuZE1vZGVSZWdpc3RyeShCYXNlQmxlbmRNb2RlLCBCQVNFX1BFUkZFQ1RfQkxFTkRfTU9ERV9GVU5DVElPTlMsIG5hbWUpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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","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 { CANVAS_CTX_FAILED } from '../../support/error-strings';\nexport type CanvasContext<T> = T extends HTMLCanvasElement ? CanvasRenderingContext2D : OffscreenCanvasRenderingContext2D;\nexport type ReusableCanvas<T extends HTMLCanvasElement | OffscreenCanvas> = {\n readonly canvas: T;\n readonly ctx: CanvasContext<T>;\n};\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: (w: number, h: number) => 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uLy4uL3N1cHBvcnQvZXJyb3Itc3RyaW5ncyc7XG5leHBvcnQgdHlwZSBDYW52YXNDb250ZXh0PFQ+ID0gVCBleHRlbmRzIEhUTUxDYW52YXNFbGVtZW50ID8gQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEIDogT2Zmc2NyZWVuQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuZXhwb3J0IHR5cGUgUmV1c2FibGVDYW52YXM8VCBleHRlbmRzIEhUTUxDYW52YXNFbGVtZW50IHwgT2Zmc2NyZWVuQ2FudmFzPiA9IHtcbiAgcmVhZG9ubHkgY2FudmFzOiBUO1xuICByZWFkb25seSBjdHg6IENhbnZhc0NvbnRleHQ8VD47XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZXVzYWJsZSBIVE1MQ2FudmFzRWxlbWVudCBhbmQgY29udGV4dCB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgRE9NLlxuICogRW5zdXJlcyBpdCBpcyBhbHdheXMgc2V0IHRvIGBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlYFxuICogQHNlZSBtYWtlUGl4ZWxDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VSZXVzYWJsZUNhbnZhcygpIHtcbiAgcmV0dXJuIG1ha2VSZXVzYWJsZUNhbnZhc01ldGE8SFRNTENhbnZhc0VsZW1lbnQ+KCh3LCBoKSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gdztcbiAgICBjYW52YXMuaGVpZ2h0ID0gaDtcbiAgICByZXR1cm4gY2FudmFzO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgcmV1c2FibGUgT2Zmc2NyZWVuQ2FudmFzIGFuZCBjb250ZXh0LlxuICogRW5zdXJlcyBpdCBpcyBhbHdheXMgc2V0IHRvIGBjb250ZXh0LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlYFxuICogQHNlZSBtYWtlUGl4ZWxDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRH0gY29udGV4dCBjYW5ub3QgYmUgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUmV1c2FibGVPZmZzY3JlZW5DYW52YXMoKSB7XG4gIHJldHVybiBtYWtlUmV1c2FibGVDYW52YXNNZXRhPE9mZnNjcmVlbkNhbnZhcz4oKHcsIGgpID0+IG5ldyBPZmZzY3JlZW5DYW52YXModywgaCkpO1xufVxuZnVuY3Rpb24gbWFrZVJldXNhYmxlQ2FudmFzTWV0YTxUIGV4dGVuZHMgSFRNTENhbnZhc0VsZW1lbnQgfCBPZmZzY3JlZW5DYW52YXM+KGZhY3Rvcnk6ICh3OiBudW1iZXIsIGg6IG51bWJlcikgPT4gVCkge1xuICBsZXQgY2FudmFzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGxldCBjdHg6IENhbnZhc0NvbnRleHQ8VD4gfCBudWxsID0gbnVsbDtcbiAgY29uc3QgcmVzdWx0OiBSZXVzYWJsZUNhbnZhczxUPiA9IHtcbiAgICBjYW52YXM6IG51bGwgYXMgYW55LFxuICAgIGN0eDogbnVsbCBhcyBhbnlcbiAgfTtcbiAgZnVuY3Rpb24gZ2V0KHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogUmV1c2FibGVDYW52YXM8VD4ge1xuICAgIGlmIChjYW52YXMgPT09IG51bGwpIHtcbiAgICAgIGNhbnZhcyA9IGZhY3Rvcnkod2lkdGgsIGhlaWdodCk7XG4gICAgICBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKSBhcyBDYW52YXNDb250ZXh0PFQ+IHwgbnVsbDtcbiAgICAgIGlmICghY3R4KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZyZXNoIGNvbnRleHQgc3RhdGVcbiAgICAgIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgIChyZXN1bHQgYXMgYW55KS5jYW52YXMgPSBjYW52YXM7XG4gICAgICAocmVzdWx0IGFzIGFueSkuY3R4ID0gY3R4O1xuXG4gICAgICAvLyBFYXJseSByZXR1cm4gdG8gc2tpcCByZXNpemUvY2xlYXIgY2hlY2tzIGZvciBicmFuZCBuZXcgY2FudmFzZXNcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLy8gUmVzaXplIGlmIG5lZWRlZCAocmVzaXppbmcgYXV0by1jbGVhcnMpXG4gICAgaWYgKGNhbnZhcy53aWR0aCAhPT0gd2lkdGggfHwgY2FudmFzLmhlaWdodCAhPT0gaGVpZ2h0KSB7XG4gICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICBjdHghLmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBbHdheXMgcmVzZXQgdHJhbnNmb3JtIGJlZm9yZSBjbGVhcmluZyB0byBlbnN1cmUgdGhlIHdob2xlIGJ1ZmZlciBpcyB3aXBlZFxuICAgICAgY3R4IS5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgICAvLyBTYW1lIHNpemUg4oaSIG1hbnVhbGx5IGNsZWFyXG4gICAgICBjdHghLmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBnZXQucmVzZXQgPSAoKSA9PiB7XG4gICAgY2FudmFzID0gbnVsbDtcbiAgICBjdHggPSBudWxsO1xuICAgIChyZXN1bHQgYXMgYW55KS5jYW52YXMgPSBudWxsO1xuICAgIChyZXN1bHQgYXMgYW55KS5jdHggPSBudWxsO1xuICB9O1xuICByZXR1cm4gZ2V0O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeReusableCanvas } from './ReusableCanvas';\nexport type DrawPixelLayer = (ctx: CanvasRenderingContext2D) => void;\nexport type DrawScreenLayer = (ctx: CanvasRenderingContext2D, scale: number) => void;\nexport type CanvasFrameRenderer = ReturnType<typeof makeCanvasFrameRenderer>;\nconst defaults = {\n makeReusableCanvas\n};\ntype Deps = Partial<typeof defaults>;\n\n/**\n * @param deps - @hidden\n */\nexport function makeCanvasFrameRenderer(deps: Deps = defaults) {\n const {\n makeReusableCanvas = defaults.makeReusableCanvas\n } = deps;\n const bufferCanvas = makeReusableCanvas();\n return function renderCanvasFrame(pixelCanvas: PixelCanvas, scale: number, getImageData: () => ImageData | undefined | null, drawPixelLayer?: DrawPixelLayer, drawScreenLayer?: DrawScreenLayer) {\n const {\n canvas,\n ctx\n } = pixelCanvas;\n\n // 1. Clear pixel buffer (unscaled)\n const {\n ctx: pxCtx,\n canvas: pxCanvas\n } = bufferCanvas(canvas.width, canvas.height);\n\n // 2. Draw pixel data into pixel buffer\n const img = getImageData();\n if (img) {\n pxCtx.putImageData(img, 0, 0);\n }\n\n // draw transient pixel data\n drawPixelLayer?.(pxCtx);\n\n // clear target canvas\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Draw pixel buffer scaled onto screen\n ctx.setTransform(scale, 0, 0, scale, 0, 0);\n ctx.drawImage(pxCanvas, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlUmV1c2FibGVDYW52YXMgfSBmcm9tICcuL1JldXNhYmxlQ2FudmFzJztcbmV4cG9ydCB0eXBlIERyYXdQaXhlbExheWVyID0gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgRHJhd1NjcmVlbkxheWVyID0gKGN0eDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELCBzY2FsZTogbnVtYmVyKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQ2FudmFzRnJhbWVSZW5kZXJlciA9IFJldHVyblR5cGU8dHlwZW9mIG1ha2VDYW52YXNGcmFtZVJlbmRlcmVyPjtcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBtYWtlUmV1c2FibGVDYW52YXNcbn07XG50eXBlIERlcHMgPSBQYXJ0aWFsPHR5cGVvZiBkZWZhdWx0cz47XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2FudmFzRnJhbWVSZW5kZXJlcihkZXBzOiBEZXBzID0gZGVmYXVsdHMpIHtcbiAgY29uc3Qge1xuICAgIG1ha2VSZXVzYWJsZUNhbnZhcyA9IGRlZmF1bHRzLm1ha2VSZXVzYWJsZUNhbnZhc1xuICB9ID0gZGVwcztcbiAgY29uc3QgYnVmZmVyQ2FudmFzID0gbWFrZVJldXNhYmxlQ2FudmFzKCk7XG4gIHJldHVybiBmdW5jdGlvbiByZW5kZXJDYW52YXNGcmFtZShwaXhlbENhbnZhczogUGl4ZWxDYW52YXMsIHNjYWxlOiBudW1iZXIsIGdldEltYWdlRGF0YTogKCkgPT4gSW1hZ2VEYXRhIHwgdW5kZWZpbmVkIHwgbnVsbCwgZHJhd1BpeGVsTGF5ZXI/OiBEcmF3UGl4ZWxMYXllciwgZHJhd1NjcmVlbkxheWVyPzogRHJhd1NjcmVlbkxheWVyKSB7XG4gICAgY29uc3Qge1xuICAgICAgY2FudmFzLFxuICAgICAgY3R4XG4gICAgfSA9IHBpeGVsQ2FudmFzO1xuXG4gICAgLy8gMS4gQ2xlYXIgcGl4ZWwgYnVmZmVyICh1bnNjYWxlZClcbiAgICBjb25zdCB7XG4gICAgICBjdHg6IHB4Q3R4LFxuICAgICAgY2FudmFzOiBweENhbnZhc1xuICAgIH0gPSBidWZmZXJDYW52YXMoY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIC8vIDIuIERyYXcgcGl4ZWwgZGF0YSBpbnRvIHBpeGVsIGJ1ZmZlclxuICAgIGNvbnN0IGltZyA9IGdldEltYWdlRGF0YSgpO1xuICAgIGlmIChpbWcpIHtcbiAgICAgIHB4Q3R4LnB1dEltYWdlRGF0YShpbWcsIDAsIDApO1xuICAgIH1cblxuICAgIC8vIGRyYXcgdHJhbnNpZW50IHBpeGVsIGRhdGFcbiAgICBkcmF3UGl4ZWxMYXllcj8uKHB4Q3R4KTtcblxuICAgIC8vIGNsZWFyIHRhcmdldCBjYW52YXNcbiAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApO1xuICAgIGN0eC5jbGVhclJlY3QoMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIC8vIERyYXcgcGl4ZWwgYnVmZmVyIHNjYWxlZCBvbnRvIHNjcmVlblxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oc2NhbGUsIDAsIDAsIHNjYWxlLCAwLCAwKTtcbiAgICBjdHguZHJhd0ltYWdlKHB4Q2FudmFzLCAwLCAwKTtcblxuICAgIC8vIERyYXcgb3ZlcmxheXMgaW4gc2NyZWVuIHNwYWNlXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBkcmF3U2NyZWVuTGF5ZXI/LihjdHgsIHNjYWxlKTtcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { CANVAS_CTX_FAILED } from '../../support/error-strings';\nexport type PixelCanvas = {\n readonly canvas: HTMLCanvasElement;\n readonly ctx: CanvasRenderingContext2D;\n readonly resize: (w: number, h: number) => void;\n};\n\n/**\n * Ensures the canvas ctx is always set to imageSmoothingEnabled = false.\n * Intended for canvas elements that are already part of the DOM.\n * @see makeReusableCanvas\n * @throws {Error} If the {@link HTMLCanvasElement} context cannot be initialized.\n */\nexport function makePixelCanvas(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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uLy4uL3N1cHBvcnQvZXJyb3Itc3RyaW5ncyc7XG5leHBvcnQgdHlwZSBQaXhlbENhbnZhcyA9IHtcbiAgcmVhZG9ubHkgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDtcbiAgcmVhZG9ubHkgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHJlYWRvbmx5IHJlc2l6ZTogKHc6IG51bWJlciwgaDogbnVtYmVyKSA9PiB2b2lkO1xufTtcblxuLyoqXG4gKiBFbnN1cmVzIHRoZSBjYW52YXMgY3R4IGlzIGFsd2F5cyBzZXQgdG8gaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2UuXG4gKiBJbnRlbmRlZCBmb3IgY2FudmFzIGVsZW1lbnRzIHRoYXQgYXJlIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NLlxuICogQHNlZSBtYWtlUmV1c2FibGVDYW52YXNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUge0BsaW5rIEhUTUxDYW52YXNFbGVtZW50fSBjb250ZXh0IGNhbm5vdCBiZSBpbml0aWFsaXplZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQaXhlbENhbnZhcyhjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogUGl4ZWxDYW52YXMge1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRCk7XG4gIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIHtcbiAgICBjYW52YXMsXG4gICAgY3R4LFxuICAgIHJlc2l6ZSh3OiBudW1iZXIsIGg6IG51bWJlcikge1xuICAgICAgY2FudmFzLndpZHRoID0gdztcbiAgICAgIGNhbnZhcy5oZWlnaHQgPSBoO1xuICAgICAgY3R4LmltYWdlU21vb3RoaW5nRW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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","/**\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 PixelPatchTiles = {\n beforeTiles: PixelTile[];\n afterTiles: PixelTile[];\n};\nexport function applyPatchTiles(target: IPixelData32, 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.data32;\n const src = tile.data32;\n const dstWidth = target.width;\n const dstHeight = target.height;\n const startX = tile.tx * tileSize;\n const startY = tile.ty * tileSize;\n\n // Calculate clamping to prevent wrapping artifacts on image edges\n const copyWidth = Math.max(0, Math.min(tileSize, dstWidth - startX));\n 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBQaXhlbFBhdGNoVGlsZXMgPSB7XG4gIGJlZm9yZVRpbGVzOiBQaXhlbFRpbGVbXTtcbiAgYWZ0ZXJUaWxlczogUGl4ZWxUaWxlW107XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5UGF0Y2hUaWxlcyh0YXJnZXQ6IElQaXhlbERhdGEzMiwgdGlsZXM6IFBpeGVsVGlsZVtdLCB0aWxlU2l6ZTogbnVtYmVyKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0aWxlID0gdGlsZXNbaV07XG4gICAgaWYgKCF0aWxlKSBjb250aW51ZTtcbiAgICBjb25zdCBkc3QgPSB0YXJnZXQuZGF0YTMyO1xuICAgIGNvbnN0IHNyYyA9IHRpbGUuZGF0YTMyO1xuICAgIGNvbnN0IGRzdFdpZHRoID0gdGFyZ2V0LndpZHRoO1xuICAgIGNvbnN0IGRzdEhlaWdodCA9IHRhcmdldC5oZWlnaHQ7XG4gICAgY29uc3Qgc3RhcnRYID0gdGlsZS50eCAqIHRpbGVTaXplO1xuICAgIGNvbnN0IHN0YXJ0WSA9IHRpbGUudHkgKiB0aWxlU2l6ZTtcblxuICAgIC8vIENhbGN1bGF0ZSBjbGFtcGluZyB0byBwcmV2ZW50IHdyYXBwaW5nIGFydGlmYWN0cyBvbiBpbWFnZSBlZGdlc1xuICAgIGNvbnN0IGNvcHlXaWR0aCA9IE1hdGgubWF4KDAsIE1hdGgubWluKHRpbGVTaXplLCBkc3RXaWR0aCAtIHN0YXJ0WCkpO1xuICAgIGlmIChjb3B5V2lkdGggPD0gMCkgY29udGludWU7XG4gICAgZm9yIChsZXQgbHkgPSAwOyBseSA8IHRpbGVTaXplOyBseSsrKSB7XG4gICAgICBjb25zdCBnbG9iYWxZID0gc3RhcnRZICsgbHk7XG5cbiAgICAgIC8vIFN0b3AgaWYgd2UgZ28gYmVsb3cgdGhlIGltYWdlXG4gICAgICBpZiAoZ2xvYmFsWSA+PSBkc3RIZWlnaHQpIGJyZWFrO1xuICAgICAgY29uc3QgZHN0SW5kZXggPSBnbG9iYWxZICogZHN0V2lkdGggKyBzdGFydFg7XG4gICAgICBjb25zdCBzcmNJbmRleCA9IGx5ICogdGlsZVNpemU7XG4gICAgICBjb25zdCByb3dEYXRhID0gc3JjLnN1YmFycmF5KHNyY0luZGV4LCBzcmNJbmRleCArIGNvcHlXaWR0aCk7XG4gICAgICBkc3Quc2V0KHJvd0RhdGEsIGRzdEluZGV4KTtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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, after?: () => void, afterUndo?: () => void, afterRedo?: () => 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?.();\n after?.();\n },\n redo: () => {\n applyPatchTilesFn(target, patch.afterTiles, tileSize);\n afterRedo?.();\n after?.();\n },\n dispose: () => accumulator.recyclePatch(patch)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHBseVBhdGNoVGlsZXMgfSBmcm9tICcuL1BpeGVsUGF0Y2hUaWxlcyc7XG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBY3Rpb24ge1xuICB1bmRvOiAoKSA9PiB2b2lkO1xuICByZWRvOiAoKSA9PiB2b2lkO1xuICBkaXNwb3NlPzogKCkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIEhpc3RvcnlBY3Rpb25GYWN0b3J5ID0gdHlwZW9mIG1ha2VIaXN0b3J5QWN0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VIaXN0b3J5QWN0aW9uKGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIGFjY3VtdWxhdG9yOiBQaXhlbEFjY3VtdWxhdG9yLCBwYXRjaDogUGl4ZWxQYXRjaFRpbGVzLCBhZnRlcj86ICgpID0+IHZvaWQsIGFmdGVyVW5kbz86ICgpID0+IHZvaWQsIGFmdGVyUmVkbz86ICgpID0+IHZvaWQsIGFwcGx5UGF0Y2hUaWxlc0ZuID0gYXBwbHlQYXRjaFRpbGVzKTogSGlzdG9yeUFjdGlvbiB7XG4gIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICByZXR1cm4ge1xuICAgIHVuZG86ICgpID0+IHtcbiAgICAgIGFwcGx5UGF0Y2hUaWxlc0ZuKHRhcmdldCwgcGF0Y2guYmVmb3JlVGlsZXMsIHRpbGVTaXplKTtcbiAgICAgIGFmdGVyVW5kbz8uKCk7XG4gICAgICBhZnRlcj8uKCk7XG4gICAgfSxcbiAgICByZWRvOiAoKSA9PiB7XG4gICAgICBhcHBseVBhdGNoVGlsZXNGbih0YXJnZXQsIHBhdGNoLmFmdGVyVGlsZXMsIHRpbGVTaXplKTtcbiAgICAgIGFmdGVyUmVkbz8uKCk7XG4gICAgICBhZnRlcj8uKCk7XG4gICAgfSxcbiAgICBkaXNwb3NlOiAoKSA9PiBhY2N1bXVsYXRvci5yZWN5Y2xlUGF0Y2gocGF0Y2gpXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 tilePool: PixelTilePool) {\n this.lookup = [];\n this.beforeTiles = [];\n }\n recyclePatch(patch: PixelPatchTiles) {\n this.tilePool.releaseTiles(patch.beforeTiles);\n this.tilePool.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.tilePool.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.tilePool.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.tilePool.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.tilePool.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.tilePool.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.tilePool.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.data32;\n const src = target.data32;\n const startX = tile.tx * TILE_SIZE;\n const startY = tile.ty * TILE_SIZE;\n const targetWidth = target.width;\n const targetHeight = target.height;\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.tilePool.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.tilePool.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+IGJvb2xlYW47XG5leHBvcnQgY2xhc3MgUGl4ZWxBY2N1bXVsYXRvciB7XG4gIHB1YmxpYyBsb29rdXA6IChQaXhlbFRpbGUgfCB1bmRlZmluZWQpW107XG4gIHB1YmxpYyBiZWZvcmVUaWxlczogUGl4ZWxUaWxlW107XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIHJlYWRvbmx5IHRpbGVQb29sOiBQaXhlbFRpbGVQb29sKSB7XG4gICAgdGhpcy5sb29rdXAgPSBbXTtcbiAgICB0aGlzLmJlZm9yZVRpbGVzID0gW107XG4gIH1cbiAgcmVjeWNsZVBhdGNoKHBhdGNoOiBQaXhlbFBhdGNoVGlsZXMpIHtcbiAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlcyhwYXRjaC5iZWZvcmVUaWxlcyk7XG4gICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZXMocGF0Y2guYWZ0ZXJUaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHggcGl4ZWwgeCBjb29yZGluYXRlXG4gICAqIEBwYXJhbSB5IHBpeGVsIHkgY29vcmRpbmF0ZVxuICAgKi9cbiAgc3RvcmVQaXhlbEJlZm9yZVN0YXRlKHg6IG51bWJlciwgeTogbnVtYmVyKTogRGlkQ2hhbmdlRm4ge1xuICAgIGNvbnN0IHNoaWZ0ID0gdGhpcy5jb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbmZpZy50YXJnZXRDb2x1bW5zO1xuICAgIGNvbnN0IHR4ID0geCA+PiBzaGlmdDtcbiAgICBjb25zdCB0eSA9IHkgPj4gc2hpZnQ7XG4gICAgY29uc3QgaWQgPSB0eSAqIGNvbHVtbnMgKyB0eDtcbiAgICBsZXQgdGlsZSA9IHRoaXMubG9va3VwW2lkXTtcbiAgICBsZXQgYWRkZWQgPSBmYWxzZTtcbiAgICBpZiAoIXRpbGUpIHtcbiAgICAgIHRpbGUgPSB0aGlzLnRpbGVQb29sLmdldFRpbGUoaWQsIHR4LCB0eSk7XG4gICAgICB0aGlzLmV4dHJhY3RTdGF0ZSh0aWxlKTtcbiAgICAgIHRoaXMubG9va3VwW2lkXSA9IHRpbGU7XG4gICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSk7XG4gICAgICBhZGRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiAoZGlkQ2hhbmdlOiBib29sZWFuKSA9PiB7XG4gICAgICBpZiAoIWRpZENoYW5nZSAmJiBhZGRlZCkge1xuICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnBvcCgpO1xuICAgICAgICB0aGlzLmxvb2t1cFtpZF0gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMudGlsZVBvb2wucmVsZWFzZVRpbGUodGlsZSEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRpZENoYW5nZTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB4IHBpeGVsIHggY29vcmRpbmF0ZVxuICAgKiBAcGFyYW0geSBwaXhlbCB5IGNvb3JkaW5hdGVcbiAgICogQHBhcmFtIHcgcGl4ZWwgd2lkdGhcbiAgICogQHBhcmFtIGggcGl4ZWwgaGVpZ2h0XG4gICAqL1xuICBzdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IERpZENoYW5nZUZuIHtcbiAgICBjb25zdCBzaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5jb25maWcudGFyZ2V0Q29sdW1ucztcbiAgICBjb25zdCBzdGFydFggPSB4ID4+IHNoaWZ0O1xuICAgIGNvbnN0IHN0YXJ0WSA9IHkgPj4gc2hpZnQ7XG4gICAgY29uc3QgZW5kWCA9IHggKyB3IC0gMSA+PiBzaGlmdDtcbiAgICBjb25zdCBlbmRZID0geSArIGggLSAxID4+IHNoaWZ0O1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aDtcbiAgICBmb3IgKGxldCB0eSA9IHN0YXJ0WTsgdHkgPD0gZW5kWTsgdHkrKykge1xuICAgICAgZm9yIChsZXQgdHggPSBzdGFydFg7IHR4IDw9IGVuZFg7IHR4KyspIHtcbiAgICAgICAgY29uc3QgaWQgPSB0eSAqIGNvbHVtbnMgKyB0eDtcbiAgICAgICAgbGV0IHRpbGUgPSB0aGlzLmxvb2t1cFtpZF07XG4gICAgICAgIGlmICghdGlsZSkge1xuICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVQb29sLmdldFRpbGUoaWQsIHR4LCB0eSk7XG4gICAgICAgICAgdGhpcy5leHRyYWN0U3RhdGUodGlsZSk7XG4gICAgICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZTtcbiAgICAgICAgICB0aGlzLmJlZm9yZVRpbGVzLnB1c2godGlsZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChkaWRDaGFuZ2U6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbGV0IHQgPSB0aGlzLmJlZm9yZVRpbGVzW2ldO1xuICAgICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0aGlzLmxvb2t1cFt0LmlkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMudGlsZVBvb2wucmVsZWFzZVRpbGUodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmVmb3JlVGlsZXMubGVuZ3RoID0gc3RhcnRJbmRleDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBkaWRDaGFuZ2U7XG4gICAgfTtcbiAgfVxuICBzdG9yZVRpbGVCZWZvcmVTdGF0ZShpZDogbnVtYmVyLCB0eDogbnVtYmVyLCB0eTogbnVtYmVyKTogRGlkQ2hhbmdlRm4ge1xuICAgIGxldCB0aWxlID0gdGhpcy5sb29rdXBbaWRdO1xuICAgIGxldCBhZGRlZCA9IGZhbHNlO1xuICAgIGlmICghdGlsZSkge1xuICAgICAgdGlsZSA9IHRoaXMudGlsZVBvb2wuZ2V0VGlsZShpZCwgdHgsIHR5KTtcbiAgICAgIHRoaXMuZXh0cmFjdFN0YXRlKHRpbGUpO1xuICAgICAgdGhpcy5sb29rdXBbaWRdID0gdGlsZTtcbiAgICAgIHRoaXMuYmVmb3JlVGlsZXMucHVzaCh0aWxlKTtcbiAgICAgIGFkZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIChkaWRDaGFuZ2U6IGJvb2xlYW4pID0+IHtcbiAgICAgIGlmICghZGlkQ2hhbmdlICYmIGFkZGVkKSB7XG4gICAgICAgIHRoaXMuYmVmb3JlVGlsZXMucG9wKCk7XG4gICAgICAgIHRoaXMubG9va3VwW2lkXSA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy50aWxlUG9vbC5yZWxlYXNlVGlsZSh0aWxlISk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlO1xuICAgIH07XG4gIH1cbiAgZXh0cmFjdFN0YXRlKHRpbGU6IFBpeGVsVGlsZSkge1xuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMuY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCBUSUxFX1NJWkUgPSB0aGlzLmNvbmZpZy50aWxlU2l6ZTtcbiAgICBjb25zdCBkc3QgPSB0aWxlLmRhdGEzMjtcbiAgICBjb25zdCBzcmMgPSB0YXJnZXQuZGF0YTMyO1xuICAgIGNvbnN0IHN0YXJ0WCA9IHRpbGUudHggKiBUSUxFX1NJWkU7XG4gICAgY29uc3Qgc3RhcnRZID0gdGlsZS50eSAqIFRJTEVfU0laRTtcbiAgICBjb25zdCB0YXJnZXRXaWR0aCA9IHRhcmdldC53aWR0aDtcbiAgICBjb25zdCB0YXJnZXRIZWlnaHQgPSB0YXJnZXQuaGVpZ2h0O1xuXG4gICAgLy8gSWYgdGhlIHRpbGUgaXMgY29tcGxldGVseSBvdXRzaWRlIHRoZSBjYW52YXMsIHplcm8gaXQgb3V0LlxuICAgIGlmIChzdGFydFggPj0gdGFyZ2V0V2lkdGggfHwgc3RhcnRYICsgVElMRV9TSVpFIDw9IDAgfHwgc3RhcnRZID49IHRhcmdldEhlaWdodCB8fCBzdGFydFkgKyBUSUxFX1NJWkUgPD0gMCkge1xuICAgICAgZHN0LmZpbGwoMCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIG9mZnNldCBpZiB0aWxlIHN0YXJ0cyBvZmYgdGhlIGxlZnQgc2lkZSBvZiB0aGUgc2NyZWVuXG4gICAgbGV0IHNyY09mZnNldFggPSBNYXRoLm1heCgwLCAtc3RhcnRYKTtcbiAgICBsZXQgY29weVdpZHRoID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oVElMRV9TSVpFIC0gc3JjT2Zmc2V0WCwgdGFyZ2V0V2lkdGggLSBNYXRoLm1heCgwLCBzdGFydFgpKSk7XG4gICAgZm9yIChsZXQgbHkgPSAwOyBseSA8IFRJTEVfU0laRTsgbHkrKykge1xuICAgICAgbGV0IGdsb2JhbFkgPSBzdGFydFkgKyBseTtcbiAgICAgIGxldCBkc3RJbmRleCA9IGx5ICogVElMRV9TSVpFO1xuXG4gICAgICAvLyBDaGVjayBuZWdhdGl2ZSBib3VuZHMgYWNjdXJhdGVseVxuICAgICAgaWYgKGdsb2JhbFkgPCAwIHx8IGdsb2JhbFkgPj0gdGFyZ2V0SGVpZ2h0IHx8IGNvcHlXaWR0aCA9PT0gMCkge1xuICAgICAgICBkc3QuZmlsbCgwLCBkc3RJbmRleCwgZHN0SW5kZXggKyBUSUxFX1NJWkUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBzcmNJbmRleCA9IGdsb2JhbFkgKiB0YXJnZXRXaWR0aCArIE1hdGgubWF4KDAsIHN0YXJ0WCk7XG4gICAgICBsZXQgcm93RGF0YSA9IHNyYy5zdWJhcnJheShzcmNJbmRleCwgc3JjSW5kZXggKyBjb3B5V2lkdGgpO1xuXG4gICAgICAvLyBTaGlmdCB0aGUgcGFzdGUgb3ZlciBieSB0aGUgb2Zmc2V0XG4gICAgICBkc3Quc2V0KHJvd0RhdGEsIGRzdEluZGV4ICsgc3JjT2Zmc2V0WCk7XG5cbiAgICAgIC8vIFBhZCB0aGUgbGVmdCBlZGdlIHdpdGggMHMgaWYgd2UgaHVuZyBvZmYgdGhlIGxlZnQgc2lkZVxuICAgICAgaWYgKHNyY09mZnNldFggPiAwKSB7XG4gICAgICAgIGRzdC5maWxsKDAsIGRzdEluZGV4LCBkc3RJbmRleCArIHNyY09mZnNldFgpO1xuICAgICAgfVxuXG4gICAgICAvLyBQYWQgdGhlIHJpZ2h0IGVkZ2Ugd2l0aCAwcyBpZiB3ZSBodW5nIG9mZiB0aGUgcmlnaHQgc2lkZVxuICAgICAgaWYgKHNyY09mZnNldFggKyBjb3B5V2lkdGggPCBUSUxFX1NJWkUpIHtcbiAgICAgICAgZHN0LmZpbGwoMCwgZHN0SW5kZXggKyBzcmNPZmZzZXRYICsgY29weVdpZHRoLCBkc3RJbmRleCArIFRJTEVfU0laRSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4dHJhY3RQYXRjaCgpOiBQaXhlbFBhdGNoVGlsZXMge1xuICAgIGNvbnN0IGFmdGVyVGlsZXM6IFBpeGVsVGlsZVtdID0gW107XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5iZWZvcmVUaWxlcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IGJlZm9yZVRpbGUgPSB0aGlzLmJlZm9yZVRpbGVzW2ldO1xuICAgICAgaWYgKGJlZm9yZVRpbGUpIHtcbiAgICAgICAgbGV0IGFmdGVyVGlsZSA9IHRoaXMudGlsZVBvb2wuZ2V0VGlsZShiZWZvcmVUaWxlLmlkLCBiZWZvcmVUaWxlLnR4LCBiZWZvcmVUaWxlLnR5KTtcbiAgICAgICAgdGhpcy5leHRyYWN0U3RhdGUoYWZ0ZXJUaWxlKTtcbiAgICAgICAgYWZ0ZXJUaWxlcy5wdXNoKGFmdGVyVGlsZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGJlZm9yZVRpbGVzID0gdGhpcy5iZWZvcmVUaWxlcztcbiAgICB0aGlzLmJlZm9yZVRpbGVzID0gW107XG4gICAgdGhpcy5sb29rdXAubGVuZ3RoID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgYmVmb3JlVGlsZXMsXG4gICAgICBhZnRlclRpbGVzXG4gICAgfTtcbiAgfVxuICByb2xsYmFja0FmdGVyRXJyb3IoKSB7XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5jb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IHRpbGVTaXplID0gdGhpcy5jb25maWcudGlsZVNpemU7XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5iZWZvcmVUaWxlcy5sZW5ndGg7XG4gICAgYXBwbHlQYXRjaFRpbGVzKHRhcmdldCwgdGhpcy5iZWZvcmVUaWxlcywgdGlsZVNpemUpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCB0aWxlID0gdGhpcy5iZWZvcmVUaWxlc1tpXTtcbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMubG9va3VwW3RpbGUuaWRdID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlKHRpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmJlZm9yZVRpbGVzLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5sb29rdXAubGVuZ3RoID0gMDtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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.width + this.tileMask >> this.tileShift;\n this.targetRows = target.height + this.tileMask >> this.tileShift;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgUGl4ZWxFbmdpbmVDb25maWcge1xuICByZWFkb25seSB0aWxlU2l6ZTogbnVtYmVyO1xuICAvLyBwaXhlbFggPSB0aWxlWCA8PCB0aWxlU2hpZnRcbiAgLy8gcGl4ZWxZID0gdGlsZVkgPDwgdGlsZVNoaWZ0XG4gIHJlYWRvbmx5IHRpbGVTaGlmdDogbnVtYmVyO1xuICByZWFkb25seSB0aWxlTWFzazogbnVtYmVyO1xuICByZWFkb25seSB0aWxlQXJlYTogbnVtYmVyO1xuICByZWFkb25seSB0YXJnZXQhOiBQaXhlbERhdGE7XG4gIHJlYWRvbmx5IHRhcmdldENvbHVtbnM6IG51bWJlciA9IDA7XG4gIHJlYWRvbmx5IHRhcmdldFJvd3M6IG51bWJlciA9IDA7XG4gIGNvbnN0cnVjdG9yKHRpbGVTaXplOiBudW1iZXIsIHRhcmdldDogUGl4ZWxEYXRhKSB7XG4gICAgLy8gRW5zdXJlIGl0J3MgYSBwb3dlciBvZiAyIHRvIGd1YXJhbnRlZSBiaXR3aXNlIG1hdGggd29ya3NcbiAgICBpZiAoKHRpbGVTaXplICYgdGlsZVNpemUgLSAxKSAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aWxlU2l6ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMicpO1xuICAgIH1cbiAgICB0aGlzLnRpbGVTaXplID0gdGlsZVNpemU7XG4gICAgdGhpcy50aWxlU2hpZnQgPSAzMSAtIE1hdGguY2x6MzIodGlsZVNpemUpO1xuICAgIHRoaXMudGlsZU1hc2sgPSB0aWxlU2l6ZSAtIDE7XG4gICAgdGhpcy50aWxlQXJlYSA9IHRpbGVTaXplICogdGlsZVNpemU7XG4gICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7XG4gICAgdGhpcy50YXJnZXRDb2x1bW5zID0gdGFyZ2V0LndpZHRoICsgdGhpcy50aWxlTWFzayA+PiB0aGlzLnRpbGVTaGlmdDtcbiAgICB0aGlzLnRhcmdldFJvd3MgPSB0YXJnZXQuaGVpZ2h0ICsgdGhpcy50aWxlTWFzayA+PiB0aGlzLnRpbGVTaGlmdDtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\n\n/**\n * Directly applies a mask to a region of PixelData,\n * modifying the destination's alpha channel in-place.\n * @returns true if any pixels were actually modified.\n */\nexport function applyAlphaMaskToPixelData(target: IPixelData32, mask: AlphaMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const width = opts?.w ?? target.width;\n const height = opts?.h ?? target.height;\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.width - x);\n h = Math.min(h, target.height - 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.data32;\n const dw = target.width;\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 < h; iy++) {\n for (let ix = 0; ix < w; ix++) {\n const mVal = maskData[mIdx];\n // Unified logic branch inside the hot path\n const effectiveM = invertMask ? 255 - mVal : mVal;\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 weight = effectiveM * globalAlpha + 128 >> 8;\n }\n if (weight === 0) {\n // Clear alpha channel\n dst32[dIdx] = (dst32[dIdx] & 0x00ffffff) >>> 0;\n didChange = true;\n } else if (weight !== 255) {\n // Merge alpha channel\n const d = dst32[dIdx];\n const da = d >>> 24;\n if (da !== 0) {\n const finalAlpha = da === 255 ? weight : da * weight + 128 >> 8;\n const current = dst32[dIdx] as Color32;\n const next = (d & 0x00ffffff | finalAlpha << 24) >>> 0;\n if (current !== 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuXG4vKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldDogSVBpeGVsRGF0YTMyLCBtYXNrOiBBbHBoYU1hc2ssIG9wdHM/OiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHM/LnggPz8gMDtcbiAgY29uc3QgdGFyZ2V0WSA9IG9wdHM/LnkgPz8gMDtcbiAgY29uc3Qgd2lkdGggPSBvcHRzPy53ID8/IHRhcmdldC53aWR0aDtcbiAgY29uc3QgaGVpZ2h0ID0gb3B0cz8uaCA/PyB0YXJnZXQuaGVpZ2h0O1xuICBjb25zdCBnbG9iYWxBbHBoYSA9IG9wdHM/LmFscGhhID8/IDI1NTtcbiAgY29uc3QgbXggPSBvcHRzPy5teCA/PyAwO1xuICBjb25zdCBteSA9IG9wdHM/Lm15ID8/IDA7XG4gIGNvbnN0IGludmVydE1hc2sgPSBvcHRzPy5pbnZlcnRNYXNrID8/IGZhbHNlO1xuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcblxuICAvLyAxLiBJbml0aWFsIERlc3RpbmF0aW9uIENsaXBwaW5nXG4gIGxldCB4ID0gdGFyZ2V0WDtcbiAgbGV0IHkgPSB0YXJnZXRZO1xuICBsZXQgdyA9IHdpZHRoO1xuICBsZXQgaCA9IGhlaWdodDtcbiAgaWYgKHggPCAwKSB7XG4gICAgdyArPSB4O1xuICAgIHggPSAwO1xuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIGggKz0geTtcbiAgICB5ID0gMDtcbiAgfVxuICB3ID0gTWF0aC5taW4odywgdGFyZ2V0LndpZHRoIC0geCk7XG4gIGggPSBNYXRoLm1pbihoLCB0YXJnZXQuaGVpZ2h0IC0geSk7XG4gIGlmICh3IDw9IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKGggPD0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDIuIERldGVybWluZSBTb3VyY2UgRGltZW5zaW9uc1xuICBjb25zdCBtUGl0Y2ggPSBtYXNrLnc7XG4gIGlmIChtUGl0Y2ggPD0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDMuIFNvdXJjZSBCb3VuZHMgQ2xpcHBpbmdcbiAgLy8gQ2FsY3VsYXRlIHdoZXJlIHdlIHdvdWxkIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIG1hc2tcbiAgY29uc3Qgc3RhcnRYID0gbXggKyAoeCAtIHRhcmdldFgpO1xuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSk7XG5cbiAgLy8gRmluZCB0aGUgc2FmZSBvdmVybGFwIGJldHdlZW4gdGhlIHJlcXVlc3RlZCByZWdpb24gYW5kIHRoZSBtYXNrIGJvdW5kc1xuICBjb25zdCBzWDAgPSBNYXRoLm1heCgwLCBzdGFydFgpO1xuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpO1xuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpO1xuICBjb25zdCBzWTEgPSBNYXRoLm1pbihtYXNrLmgsIHN0YXJ0WSArIGgpO1xuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDA7XG4gIGNvbnN0IGZpbmFsSCA9IHNZMSAtIHNZMDtcblxuICAvLyBUaGlzIGlzIHdoZXJlIHlvdXIgZmFpbGluZyB0ZXN0cyBhcmUgbm93IGNhdWdodFxuICBpZiAoZmluYWxXIDw9IDApIHJldHVybiBmYWxzZTtcbiAgaWYgKGZpbmFsSCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gNC4gQWxpZ24gRGVzdGluYXRpb24gd2l0aCBTb3VyY2UgQ2xpcHBpbmdcbiAgLy8gSWYgdGhlIHNvdXJjZSB3YXMgY2xpcHBlZCBvbiB0aGUgdG9wL2xlZnQsIHdlIG11c3Qgc2hpZnQgdGhlIGRlc3RpbmF0aW9uIHN0YXJ0XG4gIGNvbnN0IHhTaGlmdCA9IHNYMCAtIHN0YXJ0WDtcbiAgY29uc3QgeVNoaWZ0ID0gc1kwIC0gc3RhcnRZO1xuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhMzI7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFc7XG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBmaW5hbFc7XG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhO1xuICBsZXQgZElkeCA9ICh5ICsgeVNoaWZ0KSAqIGR3ICsgKHggKyB4U2hpZnQpO1xuICBsZXQgbUlkeCA9IHNZMCAqIG1QaXRjaCArIHNYMDtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgaDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCB3OyBpeCsrKSB7XG4gICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF07XG4gICAgICAvLyBVbmlmaWVkIGxvZ2ljIGJyYW5jaCBpbnNpZGUgdGhlIGhvdCBwYXRoXG4gICAgICBjb25zdCBlZmZlY3RpdmVNID0gaW52ZXJ0TWFzayA/IDI1NSAtIG1WYWwgOiBtVmFsO1xuICAgICAgbGV0IHdlaWdodCA9IDA7XG4gICAgICBpZiAoZWZmZWN0aXZlTSA9PT0gMCkge1xuICAgICAgICB3ZWlnaHQgPSAwO1xuICAgICAgfSBlbHNlIGlmIChlZmZlY3RpdmVNID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZ2xvYmFsQWxwaGE7XG4gICAgICB9IGVsc2UgaWYgKGdsb2JhbEFscGhhID09PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmZWN0aXZlTTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdlaWdodCA9IGVmZmVjdGl2ZU0gKiBnbG9iYWxBbHBoYSArIDEyOCA+PiA4O1xuICAgICAgfVxuICAgICAgaWYgKHdlaWdodCA9PT0gMCkge1xuICAgICAgICAvLyBDbGVhciBhbHBoYSBjaGFubmVsXG4gICAgICAgIGRzdDMyW2RJZHhdID0gKGRzdDMyW2RJZHhdICYgMHgwMGZmZmZmZikgPj4+IDA7XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHdlaWdodCAhPT0gMjU1KSB7XG4gICAgICAgIC8vIE1lcmdlIGFscGhhIGNoYW5uZWxcbiAgICAgICAgY29uc3QgZCA9IGRzdDMyW2RJZHhdO1xuICAgICAgICBjb25zdCBkYSA9IGQgPj4+IDI0O1xuICAgICAgICBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICBjb25zdCBmaW5hbEFscGhhID0gZGEgPT09IDI1NSA/IHdlaWdodCA6IGRhICogd2VpZ2h0ICsgMTI4ID4+IDg7XG4gICAgICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzI7XG4gICAgICAgICAgY29uc3QgbmV4dCA9IChkICYgMHgwMGZmZmZmZiB8IGZpbmFsQWxwaGEgPDwgMjQpID4+PiAwO1xuICAgICAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgZElkeCsrO1xuICAgICAgbUlkeCsrO1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGU7XG4gICAgbUlkeCArPSBtU3RyaWRlO1xuICB9XG4gIHJldHVybiBkaWRDaGFuZ2U7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\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=","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 { Color32 } from '../_types';\nimport { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { trimRectBounds } from '../Rect/trimRectBounds';\nexport class PaintBuffer {\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: PixelTilePool) {\n this.lookup = [];\n }\n private eachTileInBounds(bounds: Rect, callback: (tile: PixelTile, bX: number, bY: number, bW: number, bH: number) => void): void {\n const {\n tileShift,\n targetColumns,\n targetRows,\n tileSize\n } = this.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 const lookup = this.lookup;\n const tilePool = this.tilePool;\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 writePaintAlphaMaskStroke(color: Color32, brush: PaintAlphaMask, x0: number, y0: number, x1: number, y1: number): boolean {\n const cA = color >>> 24;\n if (cA === 0) return false;\n const {\n tileShift,\n tileMask,\n target\n } = this.config;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n const cRGB = color & 0x00ffffff;\n const scratch = this.scratchBounds;\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.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\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 writePaintBinaryMaskStroke(color: Color32, brush: PaintBinaryMask, x0: number, y0: number, x1: number, y1: number): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const {\n tileShift,\n tileMask,\n target\n } = this.config;\n const {\n w: bW,\n h: bH,\n data: bD,\n centerOffsetX,\n centerOffsetY\n } = brush;\n const scratch = this.scratchBounds;\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.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\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 writeRectStroke(color: Color32, brushWidth: number, brushHeight: number, x0: number, y0: number, x1: number, y1: number): boolean {\n const alphaIsZero = color >>> 24 === 0;\n if (alphaIsZero) return false;\n const config = this.config;\n const tileShift = config.tileShift;\n const tileMask = config.tileMask;\n const target = config.target;\n const scratch = this.scratchBounds;\n const centerOffsetX = -(brushWidth - 1 >> 1);\n const centerOffsetY = -(brushHeight - 1 >> 1);\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.width, target.height, scratch);\n if (scratch.w <= 0 || scratch.h <= 0) return;\n this.eachTileInBounds(scratch, (tile, bX, bY, bW_t, bH_t) => {\n const d32 = tile.data32;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgZm9yRWFjaExpbmVQb2ludCB9IGZyb20gJy4uL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50JztcbmltcG9ydCB7IHRyaW1SZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltUmVjdEJvdW5kcyc7XG5leHBvcnQgY2xhc3MgUGFpbnRCdWZmZXIge1xuICByZWFkb25seSBsb29rdXA6IChQaXhlbFRpbGUgfCB1bmRlZmluZWQpW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NyYXRjaEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwXG4gIH07XG4gIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIHJlYWRvbmx5IHRpbGVQb29sOiBQaXhlbFRpbGVQb29sKSB7XG4gICAgdGhpcy5sb29rdXAgPSBbXTtcbiAgfVxuICBwcml2YXRlIGVhY2hUaWxlSW5Cb3VuZHMoYm91bmRzOiBSZWN0LCBjYWxsYmFjazogKHRpbGU6IFBpeGVsVGlsZSwgYlg6IG51bWJlciwgYlk6IG51bWJlciwgYlc6IG51bWJlciwgYkg6IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIGNvbnN0IHtcbiAgICAgIHRpbGVTaGlmdCxcbiAgICAgIHRhcmdldENvbHVtbnMsXG4gICAgICB0YXJnZXRSb3dzLFxuICAgICAgdGlsZVNpemVcbiAgICB9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgeDEgPSBNYXRoLm1heCgwLCBib3VuZHMueCA+PiB0aWxlU2hpZnQpO1xuICAgIGNvbnN0IHkxID0gTWF0aC5tYXgoMCwgYm91bmRzLnkgPj4gdGlsZVNoaWZ0KTtcbiAgICBjb25zdCB4MiA9IE1hdGgubWluKHRhcmdldENvbHVtbnMgLSAxLCBib3VuZHMueCArIGJvdW5kcy53IC0gMSA+PiB0aWxlU2hpZnQpO1xuICAgIGNvbnN0IHkyID0gTWF0aC5taW4odGFyZ2V0Um93cyAtIDEsIGJvdW5kcy55ICsgYm91bmRzLmggLSAxID4+IHRpbGVTaGlmdCk7XG4gICAgaWYgKHgxID4geDIgfHwgeTEgPiB5MikgcmV0dXJuO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbDtcbiAgICBmb3IgKGxldCB0eSA9IHkxOyB0eSA8PSB5MjsgdHkrKykge1xuICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gdHkgKiB0YXJnZXRDb2x1bW5zO1xuICAgICAgY29uc3QgdGlsZVRvcCA9IHR5IDw8IHRpbGVTaGlmdDtcbiAgICAgIGZvciAobGV0IHR4ID0geDE7IHR4IDw9IHgyOyB0eCsrKSB7XG4gICAgICAgIGNvbnN0IGlkID0gcm93T2Zmc2V0ICsgdHg7XG4gICAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaWRdID8/IChsb29rdXBbaWRdID0gdGlsZVBvb2wuZ2V0VGlsZShpZCwgdHgsIHR5KSk7XG4gICAgICAgIGNvbnN0IHRpbGVMZWZ0ID0gdHggPDwgdGlsZVNoaWZ0O1xuICAgICAgICBjb25zdCBzdGFydFggPSBib3VuZHMueCA+IHRpbGVMZWZ0ID8gYm91bmRzLnggOiB0aWxlTGVmdDtcbiAgICAgICAgY29uc3Qgc3RhcnRZID0gYm91bmRzLnkgPiB0aWxlVG9wID8gYm91bmRzLnkgOiB0aWxlVG9wO1xuICAgICAgICBjb25zdCBtYXNrRW5kWCA9IGJvdW5kcy54ICsgYm91bmRzLnc7XG4gICAgICAgIGNvbnN0IHRpbGVFbmRYID0gdGlsZUxlZnQgKyB0aWxlU2l6ZTtcbiAgICAgICAgY29uc3QgZW5kWCA9IG1hc2tFbmRYIDwgdGlsZUVuZFggPyBtYXNrRW5kWCA6IHRpbGVFbmRYO1xuICAgICAgICBjb25zdCBtYXNrRW5kWSA9IGJvdW5kcy55ICsgYm91bmRzLmg7XG4gICAgICAgIGNvbnN0IHRpbGVFbmRZID0gdGlsZVRvcCArIHRpbGVTaXplO1xuICAgICAgICBjb25zdCBlbmRZID0gbWFza0VuZFkgPCB0aWxlRW5kWSA/IG1hc2tFbmRZIDogdGlsZUVuZFk7XG4gICAgICAgIGNhbGxiYWNrKHRpbGUsIHN0YXJ0WCwgc3RhcnRZLCBlbmRYIC0gc3RhcnRYLCBlbmRZIC0gc3RhcnRZKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgd3JpdGVQYWludEFscGhhTWFza1N0cm9rZShjb2xvcjogQ29sb3IzMiwgYnJ1c2g6IFBhaW50QWxwaGFNYXNrLCB4MDogbnVtYmVyLCB5MDogbnVtYmVyLCB4MTogbnVtYmVyLCB5MTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY0EgPSBjb2xvciA+Pj4gMjQ7XG4gICAgaWYgKGNBID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qge1xuICAgICAgdGlsZVNoaWZ0LFxuICAgICAgdGlsZU1hc2ssXG4gICAgICB0YXJnZXRcbiAgICB9ID0gdGhpcy5jb25maWc7XG4gICAgY29uc3Qge1xuICAgICAgdzogYlcsXG4gICAgICBoOiBiSCxcbiAgICAgIGRhdGE6IGJELFxuICAgICAgY2VudGVyT2Zmc2V0WCxcbiAgICAgIGNlbnRlck9mZnNldFlcbiAgICB9ID0gYnJ1c2g7XG4gICAgY29uc3QgY1JHQiA9IGNvbG9yICYgMHgwMGZmZmZmZjtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WCk7XG4gICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKTtcbiAgICAgIHRyaW1SZWN0Qm91bmRzKHRvcExlZnRYLCB0b3BMZWZ0WSwgYlcsIGJILCB0YXJnZXQud2lkdGgsIHRhcmdldC5oZWlnaHQsIHNjcmF0Y2gpO1xuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm47XG4gICAgICB0aGlzLmVhY2hUaWxlSW5Cb3VuZHMoc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkMzIgPSB0aWxlLmRhdGEzMjtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiVztcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzWCA9IGJYICsgajtcbiAgICAgICAgICAgIGNvbnN0IGJydXNoQSA9IGJEW2JPZmYgKyAoY2FudmFzWCAtIHRvcExlZnRYKV07XG4gICAgICAgICAgICBpZiAoYnJ1c2hBID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBjQSAqIGJydXNoQSArIDEyODtcbiAgICAgICAgICAgIGNvbnN0IGJsZW5kZWRBID0gdCArICh0ID4+IDgpID4+IDg7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBkUyArIGo7XG4gICAgICAgICAgICBjb25zdCBjdXIgPSBkMzJbaWR4XTtcbiAgICAgICAgICAgIGlmIChicnVzaEEgPiBjdXIgPj4+IDI0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHQgPSAoY1JHQiB8IGJsZW5kZWRBIDw8IDI0KSA+Pj4gMDtcbiAgICAgICAgICAgICAgaWYgKGN1ciAhPT0gbmV4dCkge1xuICAgICAgICAgICAgICAgIGQzMltpZHhdID0gbmV4dCBhcyBDb2xvcjMyO1xuICAgICAgICAgICAgICAgIHRpbGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgd3JpdGVQYWludEJpbmFyeU1hc2tTdHJva2UoY29sb3I6IENvbG9yMzIsIGJydXNoOiBQYWludEJpbmFyeU1hc2ssIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIsIHkxOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbHBoYUlzWmVybyA9IGNvbG9yID4+PiAyNCA9PT0gMDtcbiAgICBpZiAoYWxwaGFJc1plcm8pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCB7XG4gICAgICB0aWxlU2hpZnQsXG4gICAgICB0aWxlTWFzayxcbiAgICAgIHRhcmdldFxuICAgIH0gPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB7XG4gICAgICB3OiBiVyxcbiAgICAgIGg6IGJILFxuICAgICAgZGF0YTogYkQsXG4gICAgICBjZW50ZXJPZmZzZXRYLFxuICAgICAgY2VudGVyT2Zmc2V0WVxuICAgIH0gPSBicnVzaDtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WCk7XG4gICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKTtcbiAgICAgIHRyaW1SZWN0Qm91bmRzKHRvcExlZnRYLCB0b3BMZWZ0WSwgYlcsIGJILCB0YXJnZXQud2lkdGgsIHRhcmdldC5oZWlnaHQsIHNjcmF0Y2gpO1xuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm47XG4gICAgICB0aGlzLmVhY2hUaWxlSW5Cb3VuZHMoc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkMzIgPSB0aWxlLmRhdGEzMjtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiVztcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzWCA9IGJYICsgajtcbiAgICAgICAgICAgIGlmIChiRFtiT2ZmICsgKGNhbnZhc1ggLSB0b3BMZWZ0WCldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcbiAgICAgICAgICAgICAgaWYgKGQzMltpZHhdICE9PSBjb2xvcikge1xuICAgICAgICAgICAgICAgIGQzMltpZHhdID0gY29sb3I7XG4gICAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuICB3cml0ZVJlY3RTdHJva2UoY29sb3I6IENvbG9yMzIsIGJydXNoV2lkdGg6IG51bWJlciwgYnJ1c2hIZWlnaHQ6IG51bWJlciwgeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciwgeTE6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFscGhhSXNaZXJvID0gY29sb3IgPj4+IDI0ID09PSAwO1xuICAgIGlmIChhbHBoYUlzWmVybykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnQ7XG4gICAgY29uc3QgdGlsZU1hc2sgPSBjb25maWcudGlsZU1hc2s7XG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSAtKGJydXNoV2lkdGggLSAxID4+IDEpO1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFkgPSAtKGJydXNoSGVpZ2h0IC0gMSA+PiAxKTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGZvckVhY2hMaW5lUG9pbnQoeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgIGNvbnN0IHRvcExlZnRYID0gTWF0aC5mbG9vcihweCArIGNlbnRlck9mZnNldFgpO1xuICAgICAgY29uc3QgdG9wTGVmdFkgPSBNYXRoLmZsb29yKHB5ICsgY2VudGVyT2Zmc2V0WSk7XG4gICAgICB0cmltUmVjdEJvdW5kcyh0b3BMZWZ0WCwgdG9wTGVmdFksIGJydXNoV2lkdGgsIGJydXNoSGVpZ2h0LCB0YXJnZXQud2lkdGgsIHRhcmdldC5oZWlnaHQsIHNjcmF0Y2gpO1xuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm47XG4gICAgICB0aGlzLmVhY2hUaWxlSW5Cb3VuZHMoc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkMzIgPSB0aWxlLmRhdGEzMjtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gZFMgKyBqO1xuICAgICAgICAgICAgaWYgKGQzMltpZHhdICE9PSBjb2xvcikge1xuICAgICAgICAgICAgICBkMzJbaWR4XSA9IGNvbG9yO1xuICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlcyh0aGlzLmxvb2t1cCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blits source PixelData into a destination PixelData using 32-bit integer bitwise blending.\n * This function bypasses standard ImageData limitations by operating directly on\n * Uint32Array views. It supports various blend modes, binary/alpha masking, and\n * automatic clipping of both source and destination bounds.\n * @example\n *\n * const dst = new PixelData(ctx.getImageData(0,0,100,100))\n * blendImageData32(dst, sprite, {\n * blendFn: COLOR_32_BLEND_MODES.multiply,\n * mask: brushMask,\n * maskType: MaskType.ALPHA\n * });\n */\nexport function blendPixelData(target: IPixelData32, src: IPixelData32, 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.width;\n const height = opts?.h ?? src.height;\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.width - sx);\n h = Math.min(h, src.height - 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.width - x);\n const actualH = Math.min(h, target.height - y);\n if (actualW <= 0 || actualH <= 0) return false;\n const dst32 = target.data32;\n const src32 = src.data32;\n const dw = target.width;\n const sw = src.width;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuXG4vKipcbiAqIEJsaXRzIHNvdXJjZSBQaXhlbERhdGEgaW50byBhIGRlc3RpbmF0aW9uIFBpeGVsRGF0YSB1c2luZyAzMi1iaXQgaW50ZWdlciBiaXR3aXNlIGJsZW5kaW5nLlxuICogVGhpcyBmdW5jdGlvbiBieXBhc3NlcyBzdGFuZGFyZCBJbWFnZURhdGEgbGltaXRhdGlvbnMgYnkgb3BlcmF0aW5nIGRpcmVjdGx5IG9uXG4gKiBVaW50MzJBcnJheSB2aWV3cy4gSXQgc3VwcG9ydHMgdmFyaW91cyBibGVuZCBtb2RlcywgYmluYXJ5L2FscGhhIG1hc2tpbmcsIGFuZFxuICogYXV0b21hdGljIGNsaXBwaW5nIG9mIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBib3VuZHMuXG4gKiBAZXhhbXBsZVxuICpcbiAqIGNvbnN0IGRzdCA9IG5ldyBQaXhlbERhdGEoY3R4LmdldEltYWdlRGF0YSgwLDAsMTAwLDEwMCkpXG4gKiBibGVuZEltYWdlRGF0YTMyKGRzdCwgc3ByaXRlLCB7XG4gKiAgIGJsZW5kRm46IENPTE9SXzMyX0JMRU5EX01PREVTLm11bHRpcGx5LFxuICogICBtYXNrOiBicnVzaE1hc2ssXG4gKiAgIG1hc2tUeXBlOiBNYXNrVHlwZS5BTFBIQVxuICogfSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZFBpeGVsRGF0YSh0YXJnZXQ6IElQaXhlbERhdGEzMiwgc3JjOiBJUGl4ZWxEYXRhMzIsIG9wdHM/OiBQaXhlbEJsZW5kT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXJnZXRYID0gb3B0cz8ueCA/PyAwO1xuICBjb25zdCB0YXJnZXRZID0gb3B0cz8ueSA/PyAwO1xuICBjb25zdCBzb3VyY2VYID0gb3B0cz8uc3ggPz8gMDtcbiAgY29uc3Qgc291cmNlWSA9IG9wdHM/LnN5ID8/IDA7XG4gIGNvbnN0IHdpZHRoID0gb3B0cz8udyA/PyBzcmMud2lkdGg7XG4gIGNvbnN0IGhlaWdodCA9IG9wdHM/LmggPz8gc3JjLmhlaWdodDtcbiAgY29uc3QgZ2xvYmFsQWxwaGEgPSBvcHRzPy5hbHBoYSA/PyAyNTU7XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzPy5ibGVuZEZuID8/IHNvdXJjZU92ZXJQZXJmZWN0O1xuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCBzeCA9IHNvdXJjZVg7XG4gIGxldCBzeSA9IHNvdXJjZVk7XG4gIGxldCB3ID0gd2lkdGg7XG4gIGxldCBoID0gaGVpZ2h0O1xuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeDtcbiAgICB3ICs9IHN4O1xuICAgIHN4ID0gMDtcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeTtcbiAgICBoICs9IHN5O1xuICAgIHN5ID0gMDtcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpO1xuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KTtcbiAgaWYgKHggPCAwKSB7XG4gICAgc3ggLT0geDtcbiAgICB3ICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgc3kgLT0geTtcbiAgICBoICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIHRhcmdldC53aWR0aCAtIHgpO1xuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgdGFyZ2V0LmhlaWdodCAtIHkpO1xuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhMzI7XG4gIGNvbnN0IHNyYzMyID0gc3JjLmRhdGEzMjtcbiAgY29uc3QgZHcgPSB0YXJnZXQud2lkdGg7XG4gIGNvbnN0IHN3ID0gc3JjLndpZHRoO1xuICBsZXQgZElkeCA9IHkgKiBkdyArIHggfCAwO1xuICBsZXQgc0lkeCA9IHN5ICogc3cgKyBzeCB8IDA7XG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBzU3RyaWRlID0gc3cgLSBhY3R1YWxXIHwgMDtcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1O1xuICBjb25zdCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGU7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgY29uc3Qgc3JjQ29sID0gc3JjMzJbc0lkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IHNyY0FscGhhID0gc3JjQ29sID4+PiAyNDtcbiAgICAgIGlmIChzcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBzSWR4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGZpbmFsQ29sID0gc3JjQ29sO1xuICAgICAgaWYgKCFpc09wYXF1ZSkge1xuICAgICAgICBjb25zdCBhID0gc3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCA+PiA4O1xuICAgICAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgICBkSWR4Kys7XG4gICAgICAgICAgc0lkeCsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKHNyY0NvbCAmIDB4MDBmZmZmZmYgfCBhIDw8IDI0KSA+Pj4gMCBhcyBDb2xvcjMyO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzI7XG4gICAgICBjb25zdCBuZXh0ID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMik7XG4gICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBkSWR4Kys7XG4gICAgICBzSWR4Kys7XG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICBzSWR4ICs9IHNTdHJpZGU7XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { IPixelData } from '../_types';\nexport class PixelTile implements IPixelData {\n readonly data32: Uint32Array;\n readonly width: number;\n readonly height: number;\n readonly imageData: ImageData;\n constructor(public id: number, public tx: number, public ty: number, tileSize: number, tileArea: number) {\n this.width = this.height = tileSize;\n this.data32 = new Uint32Array(tileArea);\n const data8 = new Uint8ClampedArray(this.data32.buffer) as Uint8ClampedArray<ArrayBuffer>;\n this.imageData = new ImageData(data8, tileSize, tileSize);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnO1xuZXhwb3J0IGNsYXNzIFBpeGVsVGlsZSBpbXBsZW1lbnRzIElQaXhlbERhdGEge1xuICByZWFkb25seSBkYXRhMzI6IFVpbnQzMkFycmF5O1xuICByZWFkb25seSB3aWR0aDogbnVtYmVyO1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgaW1hZ2VEYXRhOiBJbWFnZURhdGE7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogbnVtYmVyLCBwdWJsaWMgdHg6IG51bWJlciwgcHVibGljIHR5OiBudW1iZXIsIHRpbGVTaXplOiBudW1iZXIsIHRpbGVBcmVhOiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoID0gdGhpcy5oZWlnaHQgPSB0aWxlU2l6ZTtcbiAgICB0aGlzLmRhdGEzMiA9IG5ldyBVaW50MzJBcnJheSh0aWxlQXJlYSk7XG4gICAgY29uc3QgZGF0YTggPSBuZXcgVWludDhDbGFtcGVkQXJyYXkodGhpcy5kYXRhMzIuYnVmZmVyKSBhcyBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj47XG4gICAgdGhpcy5pbWFnZURhdGEgPSBuZXcgSW1hZ2VEYXRhKGRhdGE4LCB0aWxlU2l6ZSwgdGlsZVNpemUpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { PixelTile } from './PixelTile';\nexport class PixelTilePool {\n public pool: PixelTile[];\n private tileSize: number;\n private tileArea: number;\n constructor(config: PixelEngineConfig) {\n this.pool = [];\n this.tileSize = config.tileSize;\n this.tileArea = config.tileArea;\n }\n getTile(id: number, tx: number, ty: number): PixelTile {\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.data32.fill(0);\n return tile;\n }\n return new PixelTile(id, tx, ty, this.tileSize, this.tileArea);\n }\n releaseTile(tile: PixelTile): void {\n this.pool.push(tile);\n }\n releaseTiles(tiles: (PixelTile | 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXhlbFRpbGUgfSBmcm9tICcuL1BpeGVsVGlsZSc7XG5leHBvcnQgY2xhc3MgUGl4ZWxUaWxlUG9vbCB7XG4gIHB1YmxpYyBwb29sOiBQaXhlbFRpbGVbXTtcbiAgcHJpdmF0ZSB0aWxlU2l6ZTogbnVtYmVyO1xuICBwcml2YXRlIHRpbGVBcmVhOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcpIHtcbiAgICB0aGlzLnBvb2wgPSBbXTtcbiAgICB0aGlzLnRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICAgIHRoaXMudGlsZUFyZWEgPSBjb25maWcudGlsZUFyZWE7XG4gIH1cbiAgZ2V0VGlsZShpZDogbnVtYmVyLCB0eDogbnVtYmVyLCB0eTogbnVtYmVyKTogUGl4ZWxUaWxlIHtcbiAgICBsZXQgdGlsZSA9IHRoaXMucG9vbC5wb3AoKTtcbiAgICBpZiAodGlsZSkge1xuICAgICAgdGlsZS5pZCA9IGlkO1xuICAgICAgdGlsZS50eCA9IHR4O1xuICAgICAgdGlsZS50eSA9IHR5O1xuXG4gICAgICAvLyBXaXBlIGRpcnR5IG1lbW9yeSBmcm9tIHByZXZpb3VzIHVzZXMgYmVmb3JlIGhhbmRpbmcgaXQgb3V0XG4gICAgICB0aWxlLmRhdGEzMi5maWxsKDApO1xuICAgICAgcmV0dXJuIHRpbGU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUGl4ZWxUaWxlKGlkLCB0eCwgdHksIHRoaXMudGlsZVNpemUsIHRoaXMudGlsZUFyZWEpO1xuICB9XG4gIHJlbGVhc2VUaWxlKHRpbGU6IFBpeGVsVGlsZSk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpO1xuICB9XG4gIHJlbGVhc2VUaWxlcyh0aWxlczogKFBpeGVsVGlsZSB8IHVuZGVmaW5lZClbXSk6IHZvaWQge1xuICAgIGxldCBsZW5ndGggPSB0aWxlcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHRpbGUgPSB0aWxlc1tpXTtcbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIHRoaXMucG9vbC5wdXNoKHRpbGUpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aWxlcy5sZW5ndGggPSAwO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { resizeImageData } from '../ImageData/resizeImageData';\nimport { PaintBuffer } from '../Paint/PaintBuffer';\nimport { blendPixelData } from '../PixelData/blendPixelData';\nimport { PixelTilePool } from '../PixelTile/PixelTilePool';\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?: PixelTilePool;\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: PixelTilePool;\n readonly paintBuffer: PaintBuffer;\n readonly mutator: M;\n private blendPixelDataOpts = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\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 PixelTilePool(this.config);\n this.accumulator = options?.accumulator ?? new PixelAccumulator(this.config, this.pixelTilePool);\n this.mutator = mutatorFactory(this);\n this.paintBuffer = new PaintBuffer(this.config, this.pixelTilePool);\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 after Called after both undo and redo — use for generic change notifications.\n * @param afterUndo Called after undo only — use for dimension or state changes specific to undo.\n * @param afterRedo Called after redo only.\n */\n withHistory(transaction: (mutator: M) => void, after?: () => void, afterUndo?: () => void, afterRedo?: () => 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, after, afterUndo, afterRedo);\n this.historyManager.commit(action);\n }\n resize(newWidth: number, newHeight: number, offsetX = 0, offsetY = 0, after?: (target: ImageData) => void, 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 target.set(afterImageData);\n this.historyManager.commit({\n undo: () => {\n target.set(beforeImageData);\n afterUndo?.(beforeImageData);\n after?.(beforeImageData);\n },\n redo: () => {\n target.set(afterImageData);\n afterRedo?.(afterImageData);\n after?.(afterImageData);\n }\n });\n }\n commitPaintBuffer(alpha = 255, blendFn = sourceOverPerfect, blendPixelDataFn = blendPixelData) {\n const paintBuffer = this.paintBuffer;\n const tileShift = paintBuffer.config.tileShift;\n const lookup = paintBuffer.lookup;\n const opts = this.blendPixelDataOpts;\n opts.alpha = alpha;\n opts.blendFn = blendFn;\n for (let i = 0; i < lookup.length; i++) {\n const tile = lookup[i];\n if (tile) {\n const didChange = this.accumulator.storeTileBeforeState(tile.id, tile.tx, tile.ty);\n const dx = tile.tx << tileShift;\n const dy = tile.ty << tileShift;\n opts.x = dx;\n opts.y = dy;\n opts.w = tile.width;\n opts.h = tile.height;\n didChange(blendPixelDataFn(this.config.target, tile, opts));\n }\n }\n paintBuffer.clear();\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyByZXNpemVJbWFnZURhdGEgfSBmcm9tICcuLi9JbWFnZURhdGEvcmVzaXplSW1hZ2VEYXRhJztcbmltcG9ydCB7IFBhaW50QnVmZmVyIH0gZnJvbSAnLi4vUGFpbnQvUGFpbnRCdWZmZXInO1xuaW1wb3J0IHsgYmxlbmRQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGEnO1xuaW1wb3J0IHsgUGl4ZWxUaWxlUG9vbCB9IGZyb20gJy4uL1BpeGVsVGlsZS9QaXhlbFRpbGVQb29sJztcbmltcG9ydCB7IG1ha2VIaXN0b3J5QWN0aW9uIH0gZnJvbSAnLi9IaXN0b3J5QWN0aW9uJztcbmltcG9ydCB7IEhpc3RvcnlNYW5hZ2VyIH0gZnJvbSAnLi9IaXN0b3J5TWFuYWdlcic7XG5pbXBvcnQgeyBQaXhlbEFjY3VtdWxhdG9yIH0gZnJvbSAnLi9QaXhlbEFjY3VtdWxhdG9yJztcbmltcG9ydCB7IFBpeGVsRW5naW5lQ29uZmlnIH0gZnJvbSAnLi9QaXhlbEVuZ2luZUNvbmZpZyc7XG5leHBvcnQgaW50ZXJmYWNlIFBpeGVsV3JpdGVyT3B0aW9ucyB7XG4gIG1heEhpc3RvcnlTdGVwcz86IG51bWJlcjtcbiAgdGlsZVNpemU/OiBudW1iZXI7XG4gIGhpc3RvcnlNYW5hZ2VyPzogSGlzdG9yeU1hbmFnZXI7XG4gIGhpc3RvcnlBY3Rpb25GYWN0b3J5PzogSGlzdG9yeUFjdGlvbkZhY3Rvcnk7XG4gIHBpeGVsVGlsZVBvb2w/OiBQaXhlbFRpbGVQb29sO1xuICBhY2N1bXVsYXRvcj86IFBpeGVsQWNjdW11bGF0b3I7XG59XG5cbi8qKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IHRhcmcgPSBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEoMTAsIDEwKSlcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCAod3JpdGVyKSA9PiB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgLi4ubXV0YXRvckFwcGx5TWFzayh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsRGF0YSh3cml0ZXIpLFxuICogICAgIC4uLm11dGF0b3JCbGVuZENvbG9yKHdyaXRlciksXG4gKiAgICAgLi4ubXV0YXRvckJsZW5kUGl4ZWwod3JpdGVyKSxcbiAqICAgICAuLi5tdXRhdG9yRmlsbCh3cml0ZXIpLFxuICogICB9XG4gKiB9KVxuICpcbiAqIC8vIHRvIGltcG9ydCBhbGwgbXV0YXRvciBmdW5jdGlvbnNcbiAqIGNvbnN0IHdyaXRlciA9IG5ldyBQaXhlbFdyaXRlcih0YXJnLCBtYWtlRnVsbFBpeGVsTXV0YXRvcilcbiAqXG4gKiB3cml0ZXIud2l0aEhpc3RvcnkoKG11dGF0b3IpID0+IHtcbiAqICAgbXV0YXRvci5hcHBseU1hc2soKVxuICogICBtdXRhdG9yLmJsZW5kUGl4ZWxEYXRhKClcbiAqIH0pXG4gKi9cbmV4cG9ydCBjbGFzcyBQaXhlbFdyaXRlcjxNPiB7XG4gIHJlYWRvbmx5IGhpc3RvcnlNYW5hZ2VyOiBIaXN0b3J5TWFuYWdlcjtcbiAgcmVhZG9ubHkgYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3I7XG4gIHJlYWRvbmx5IGhpc3RvcnlBY3Rpb25GYWN0b3J5OiBIaXN0b3J5QWN0aW9uRmFjdG9yeTtcbiAgcmVhZG9ubHkgY29uZmlnOiBQaXhlbEVuZ2luZUNvbmZpZztcbiAgcmVhZG9ubHkgcGl4ZWxUaWxlUG9vbDogUGl4ZWxUaWxlUG9vbDtcbiAgcmVhZG9ubHkgcGFpbnRCdWZmZXI6IFBhaW50QnVmZmVyO1xuICByZWFkb25seSBtdXRhdG9yOiBNO1xuICBwcml2YXRlIGJsZW5kUGl4ZWxEYXRhT3B0cyA9IHtcbiAgICBhbHBoYTogMjU1LFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB3OiAwLFxuICAgIGg6IDBcbiAgfTtcbiAgcHJpdmF0ZSBfaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcih0YXJnZXQ6IFBpeGVsRGF0YSwgbXV0YXRvckZhY3Rvcnk6ICh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4pID0+IE0sIG9wdGlvbnM/OiBQaXhlbFdyaXRlck9wdGlvbnMpIHtcbiAgICBjb25zdCB0aWxlU2l6ZSA9IG9wdGlvbnM/LnRpbGVTaXplID8/IDI1NjtcbiAgICBjb25zdCBtYXhIaXN0b3J5U3RlcHMgPSBvcHRpb25zPy5tYXhIaXN0b3J5U3RlcHMgPz8gNTA7XG4gICAgdGhpcy5jb25maWcgPSBuZXcgUGl4ZWxFbmdpbmVDb25maWcodGlsZVNpemUsIHRhcmdldCk7XG4gICAgdGhpcy5oaXN0b3J5TWFuYWdlciA9IG9wdGlvbnM/Lmhpc3RvcnlNYW5hZ2VyID8/IG5ldyBIaXN0b3J5TWFuYWdlcihtYXhIaXN0b3J5U3RlcHMpO1xuICAgIHRoaXMuaGlzdG9yeUFjdGlvbkZhY3RvcnkgPSBvcHRpb25zPy5oaXN0b3J5QWN0aW9uRmFjdG9yeSA/PyBtYWtlSGlzdG9yeUFjdGlvbjtcbiAgICB0aGlzLnBpeGVsVGlsZVBvb2wgPSBvcHRpb25zPy5waXhlbFRpbGVQb29sID8/IG5ldyBQaXhlbFRpbGVQb29sKHRoaXMuY29uZmlnKTtcbiAgICB0aGlzLmFjY3VtdWxhdG9yID0gb3B0aW9ucz8uYWNjdW11bGF0b3IgPz8gbmV3IFBpeGVsQWNjdW11bGF0b3IodGhpcy5jb25maWcsIHRoaXMucGl4ZWxUaWxlUG9vbCk7XG4gICAgdGhpcy5tdXRhdG9yID0gbXV0YXRvckZhY3RvcnkodGhpcyk7XG4gICAgdGhpcy5wYWludEJ1ZmZlciA9IG5ldyBQYWludEJ1ZmZlcih0aGlzLmNvbmZpZywgdGhpcy5waXhlbFRpbGVQb29sKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgdHJhbnNhY3Rpb25gIGFuZCBjb21taXRzIHRoZSByZXN1bHRpbmcgcGl4ZWwgY2hhbmdlcyBhcyBhIHNpbmdsZVxuICAgKiB1bmRvYWJsZSBoaXN0b3J5IGFjdGlvbi5cbiAgICpcbiAgICogLSBJZiBgdHJhbnNhY3Rpb25gIHRocm93cywgYWxsIGFjY3VtdWxhdGVkIGNoYW5nZXMgYXJlIHJvbGxlZCBiYWNrIGFuZCB0aGUgZXJyb3JcbiAgICogICBpcyByZS10aHJvd24uIE5vIGFjdGlvbiBpcyBjb21taXR0ZWQuXG4gICAqIC0gSWYgYHRyYW5zYWN0aW9uYCBjb21wbGV0ZXMgd2l0aG91dCBtb2RpZnlpbmcgYW55IHBpeGVscywgbm8gYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICogLSBgd2l0aEhpc3RvcnlgIGlzIG5vdCByZS1lbnRyYW50LiBDYWxsaW5nIGl0IGFnYWluIGZyb20gaW5zaWRlIGB0cmFuc2FjdGlvbmAgd2lsbFxuICAgKiAgIHRocm93IGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgc2lsZW50IGRhdGEgbG9zcyBmcm9tIGEgbmVzdGVkIGV4dHJhY3RQYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIENhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBhZnRlciAgICBDYWxsZWQgYWZ0ZXIgYm90aCB1bmRvIGFuZCByZWRvIOKAlCB1c2UgZm9yIGdlbmVyaWMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEBwYXJhbSBhZnRlclVuZG8gQ2FsbGVkIGFmdGVyIHVuZG8gb25seSDigJQgdXNlIGZvciBkaW1lbnNpb24gb3Igc3RhdGUgY2hhbmdlcyBzcGVjaWZpYyB0byB1bmRvLlxuICAgKiBAcGFyYW0gYWZ0ZXJSZWRvIENhbGxlZCBhZnRlciByZWRvIG9ubHkuXG4gICAqL1xuICB3aXRoSGlzdG9yeSh0cmFuc2FjdGlvbjogKG11dGF0b3I6IE0pID0+IHZvaWQsIGFmdGVyPzogKCkgPT4gdm9pZCwgYWZ0ZXJVbmRvPzogKCkgPT4gdm9pZCwgYWZ0ZXJSZWRvPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pblByb2dyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpdGhIaXN0b3J5IGlzIG5vdCByZS1lbnRyYW50IOKAlCBjb21taXQgb3Igcm9sbGJhY2sgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGZpcnN0Jyk7XG4gICAgfVxuICAgIHRoaXMuX2luUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbih0aGlzLm11dGF0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWNjdW11bGF0b3Iucm9sbGJhY2tBZnRlckVycm9yKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5hY2N1bXVsYXRvci5leHRyYWN0UGF0Y2goKTtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmhpc3RvcnlBY3Rpb25GYWN0b3J5KHRoaXMuY29uZmlnLCB0aGlzLmFjY3VtdWxhdG9yLCBwYXRjaCwgYWZ0ZXIsIGFmdGVyVW5kbywgYWZ0ZXJSZWRvKTtcbiAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLmNvbW1pdChhY3Rpb24pO1xuICB9XG4gIHJlc2l6ZShuZXdXaWR0aDogbnVtYmVyLCBuZXdIZWlnaHQ6IG51bWJlciwgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwLCBhZnRlcj86ICh0YXJnZXQ6IEltYWdlRGF0YSkgPT4gdm9pZCwgYWZ0ZXJVbmRvPzogKHRhcmdldDogSW1hZ2VEYXRhKSA9PiB2b2lkLCBhZnRlclJlZG8/OiAodGFyZ2V0OiBJbWFnZURhdGEpID0+IHZvaWQsIHJlc2l6ZUltYWdlRGF0YUZuID0gcmVzaXplSW1hZ2VEYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlc2l6ZSBpbnNpZGUgYSB3aXRoSGlzdG9yeSBjYWxsYmFjaycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY2N1bXVsYXRvci5iZWZvcmVUaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXNpemUgd2l0aCBhbiBvcGVuIGFjY3VtdWxhdG9yIOKAlCBjb21taXQgb3Igcm9sbGJhY2sgZmlyc3QnKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCBiZWZvcmVJbWFnZURhdGEgPSB0YXJnZXQuaW1hZ2VEYXRhO1xuICAgIGNvbnN0IGFmdGVySW1hZ2VEYXRhID0gcmVzaXplSW1hZ2VEYXRhRm4oYmVmb3JlSW1hZ2VEYXRhLCBuZXdXaWR0aCwgbmV3SGVpZ2h0LCBvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICB0YXJnZXQuc2V0KGFmdGVySW1hZ2VEYXRhKTtcbiAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLmNvbW1pdCh7XG4gICAgICB1bmRvOiAoKSA9PiB7XG4gICAgICAgIHRhcmdldC5zZXQoYmVmb3JlSW1hZ2VEYXRhKTtcbiAgICAgICAgYWZ0ZXJVbmRvPy4oYmVmb3JlSW1hZ2VEYXRhKTtcbiAgICAgICAgYWZ0ZXI/LihiZWZvcmVJbWFnZURhdGEpO1xuICAgICAgfSxcbiAgICAgIHJlZG86ICgpID0+IHtcbiAgICAgICAgdGFyZ2V0LnNldChhZnRlckltYWdlRGF0YSk7XG4gICAgICAgIGFmdGVyUmVkbz8uKGFmdGVySW1hZ2VEYXRhKTtcbiAgICAgICAgYWZ0ZXI/LihhZnRlckltYWdlRGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgY29tbWl0UGFpbnRCdWZmZXIoYWxwaGEgPSAyNTUsIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCwgYmxlbmRQaXhlbERhdGFGbiA9IGJsZW5kUGl4ZWxEYXRhKSB7XG4gICAgY29uc3QgcGFpbnRCdWZmZXIgPSB0aGlzLnBhaW50QnVmZmVyO1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IHBhaW50QnVmZmVyLmNvbmZpZy50aWxlU2hpZnQ7XG4gICAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLmJsZW5kUGl4ZWxEYXRhT3B0cztcbiAgICBvcHRzLmFscGhhID0gYWxwaGE7XG4gICAgb3B0cy5ibGVuZEZuID0gYmxlbmRGbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGlsZSA9IGxvb2t1cFtpXTtcbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHRoaXMuYWNjdW11bGF0b3Iuc3RvcmVUaWxlQmVmb3JlU3RhdGUodGlsZS5pZCwgdGlsZS50eCwgdGlsZS50eSk7XG4gICAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGNvbnN0IGR5ID0gdGlsZS50eSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIG9wdHMueCA9IGR4O1xuICAgICAgICBvcHRzLnkgPSBkeTtcbiAgICAgICAgb3B0cy53ID0gdGlsZS53aWR0aDtcbiAgICAgICAgb3B0cy5oID0gdGlsZS5oZWlnaHQ7XG4gICAgICAgIGRpZENoYW5nZShibGVuZFBpeGVsRGF0YUZuKHRoaXMuY29uZmlnLnRhcmdldCwgdGlsZSwgb3B0cykpO1xuICAgICAgfVxuICAgIH1cbiAgICBwYWludEJ1ZmZlci5jbGVhcigpO1xuICB9XG59XG5leHBvcnQgdHlwZSBIaXN0b3J5TXV0YXRvcjxUIGV4dGVuZHMge30sIEQgZXh0ZW5kcyB7fT4gPSAod3JpdGVyOiBQaXhlbFdyaXRlcjxhbnk+LCBkZXBzPzogUGFydGlhbDxEPikgPT4gVDsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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.width;\n const h = opts?.h ?? target.height;\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/LncgPz8gdGFyZ2V0LndpZHRoO1xuICAgICAgY29uc3QgaCA9IG9wdHM/LmggPz8gdGFyZ2V0LmhlaWdodDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+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: IPixelData32, mask: BinaryMask, opts?: ApplyMaskToPixelDataOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const width = opts?.w ?? target.width;\n const height = opts?.h ?? target.height;\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.width - x);\n h = Math.min(h, target.height - 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.data32;\n const dw = target.width;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIERpcmVjdGx5IGFwcGxpZXMgYSBtYXNrIHRvIGEgcmVnaW9uIG9mIFBpeGVsRGF0YSxcbiAqIG1vZGlmeWluZyB0aGUgZGVzdGluYXRpb24ncyBhbHBoYSBjaGFubmVsIGluLXBsYWNlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSh0YXJnZXQ6IElQaXhlbERhdGEzMiwgbWFzazogQmluYXJ5TWFzaywgb3B0cz86IEFwcGx5TWFza1RvUGl4ZWxEYXRhT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXJnZXRYID0gb3B0cz8ueCA/PyAwO1xuICBjb25zdCB0YXJnZXRZID0gb3B0cz8ueSA/PyAwO1xuICBjb25zdCB3aWR0aCA9IG9wdHM/LncgPz8gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBvcHRzPy5oID8/IHRhcmdldC5oZWlnaHQ7XG4gIGNvbnN0IGdsb2JhbEFscGhhID0gb3B0cz8uYWxwaGEgPz8gMjU1O1xuICBjb25zdCBteCA9IG9wdHM/Lm14ID8/IDA7XG4gIGNvbnN0IG15ID0gb3B0cz8ubXkgPz8gMDtcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHM/LmludmVydE1hc2sgPz8gZmFsc2U7XG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBsZXQgeCA9IHRhcmdldFg7XG4gIGxldCB5ID0gdGFyZ2V0WTtcbiAgbGV0IHcgPSB3aWR0aDtcbiAgbGV0IGggPSBoZWlnaHQ7XG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geDtcbiAgICB4ID0gMDtcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHRhcmdldC53aWR0aCAtIHgpO1xuICBoID0gTWF0aC5taW4oaCwgdGFyZ2V0LmhlaWdodCAtIHkpO1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBtUGl0Y2ggPSBtYXNrLnc7XG4gIGlmIChtUGl0Y2ggPD0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDMuIFNvdXJjZSBCb3VuZHMgQ2xpcHBpbmdcbiAgLy8gQ2FsY3VsYXRlIHdoZXJlIHdlIHdvdWxkIHN0YXJ0IHJlYWRpbmcgaW4gdGhlIG1hc2tcbiAgY29uc3Qgc3RhcnRYID0gbXggKyAoeCAtIHRhcmdldFgpO1xuICBjb25zdCBzdGFydFkgPSBteSArICh5IC0gdGFyZ2V0WSk7XG5cbiAgLy8gRmluZCB0aGUgc2FmZSBvdmVybGFwIGJldHdlZW4gdGhlIHJlcXVlc3RlZCByZWdpb24gYW5kIHRoZSBtYXNrIGJvdW5kc1xuICBjb25zdCBzWDAgPSBNYXRoLm1heCgwLCBzdGFydFgpO1xuICBjb25zdCBzWTAgPSBNYXRoLm1heCgwLCBzdGFydFkpO1xuICBjb25zdCBzWDEgPSBNYXRoLm1pbihtUGl0Y2gsIHN0YXJ0WCArIHcpO1xuICBjb25zdCBzWTEgPSBNYXRoLm1pbihtYXNrLmgsIHN0YXJ0WSArIGgpO1xuICBjb25zdCBmaW5hbFcgPSBzWDEgLSBzWDA7XG4gIGNvbnN0IGZpbmFsSCA9IHNZMSAtIHNZMDtcbiAgaWYgKGZpbmFsVyA8PSAwIHx8IGZpbmFsSCA8PSAwKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gNC4gQWxpZ24gRGVzdGluYXRpb24gd2l0aCBTb3VyY2UgQ2xpcHBpbmdcbiAgLy8gSWYgdGhlIHNvdXJjZSB3YXMgY2xpcHBlZCBvbiB0aGUgdG9wL2xlZnQsIHdlIG11c3Qgc2hpZnQgdGhlIGRlc3RpbmF0aW9uIHN0YXJ0XG4gIGNvbnN0IHhTaGlmdCA9IHNYMCAtIHN0YXJ0WDtcbiAgY29uc3QgeVNoaWZ0ID0gc1kwIC0gc3RhcnRZO1xuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhMzI7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBmaW5hbFc7XG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBmaW5hbFc7XG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhO1xuICBsZXQgZElkeCA9ICh5ICsgeVNoaWZ0KSAqIGR3ICsgKHggKyB4U2hpZnQpO1xuICBsZXQgbUlkeCA9IHNZMCAqIG1QaXRjaCArIHNYMDtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgZmluYWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGZpbmFsVzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IG1hc2tEYXRhW21JZHhdO1xuICAgICAgY29uc3QgaXNNYXNrZWRPdXQgPSBpbnZlcnRNYXNrID8gbVZhbCAhPT0gMCA6IG1WYWwgPT09IDA7XG4gICAgICBpZiAoaXNNYXNrZWRPdXQpIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdO1xuICAgICAgICBjb25zdCBuZXh0ID0gKGN1cnJlbnQgJiAweDAwZmZmZmZmKSA+Pj4gMDtcbiAgICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChnbG9iYWxBbHBoYSAhPT0gMjU1KSB7XG4gICAgICAgIGNvbnN0IGQgPSBkc3QzMltkSWR4XTtcbiAgICAgICAgY29uc3QgZGEgPSBkID4+PiAyNDtcbiAgICAgICAgaWYgKGRhICE9PSAwKSB7XG4gICAgICAgICAgY29uc3QgZmluYWxBbHBoYSA9IGRhID09PSAyNTUgPyBnbG9iYWxBbHBoYSA6IGRhICogZ2xvYmFsQWxwaGEgKyAxMjggPj4gODtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gKGQgJiAweDAwZmZmZmZmIHwgZmluYWxBbHBoYSA8PCAyNCkgPj4+IDA7XG4gICAgICAgICAgaWYgKGQgIT09IG5leHQpIHtcbiAgICAgICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dDtcbiAgICAgICAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkSWR4Kys7XG4gICAgICBtSWR4Kys7XG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICBtSWR4ICs9IG1TdHJpZGU7XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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.width;\n const h = opts?.h ?? target.height;\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/PyB0YXJnZXQud2lkdGg7XG4gICAgICBjb25zdCBoID0gb3B0cz8uaCA/PyB0YXJnZXQuaGVpZ2h0O1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKHRhcmdldCwgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../../_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.width;\n const h = opts?.h ?? target.height;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uLy4uL190eXBlcyc7XG5pbXBvcnQgeyBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2FwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEnO1xuaW1wb3J0IHsgYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSxcbiAgYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YVxufTtcbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPjtcblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JBcHBseU1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSA9IGRlZmF1bHRzLmFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhLFxuICAgIGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEgPSBkZWZhdWx0cy5hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhXG4gIH0gPSBkZXBzO1xuICByZXR1cm4ge1xuICAgIGFwcGx5TWFzayhtYXNrOiBNYXNrLCBvcHRzPzogQXBwbHlNYXNrVG9QaXhlbERhdGFPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB0YXJnZXQgPSB3cml0ZXIuY29uZmlnLnRhcmdldDtcbiAgICAgIGNvbnN0IHggPSBvcHRzPy54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3B0cz8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IG9wdHM/LncgPz8gdGFyZ2V0LndpZHRoO1xuICAgICAgY29uc3QgaCA9IG9wdHM/LmggPz8gdGFyZ2V0LmhlaWdodDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYXBwbHlCaW5hcnlNYXNrVG9QaXhlbERhdGEodGFyZ2V0LCBtYXNrLCBvcHRzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZGlkQ2hhbmdlKGFwcGx5QWxwaGFNYXNrVG9QaXhlbERhdGEodGFyZ2V0LCBtYXNrLCBvcHRzKSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataAlphaMask(target: IPixelData32, src: IPixelData32, 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.width;\n const height = opts?.h ?? src.height;\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.width - sx);\n h = Math.min(h, src.height - 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.width - x);\n const actualH = Math.min(h, target.height - y);\n if (actualW <= 0 || actualH <= 0) return false;\n\n // 2. Index Setup\n const dw = target.width;\n const sw = src.width;\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.data32;\n const src32 = src.data32;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKHRhcmdldDogSVBpeGVsRGF0YTMyLCBzcmM6IElQaXhlbERhdGEzMiwgYWxwaGFNYXNrOiBBbHBoYU1hc2ssIG9wdHM/OiBQaXhlbEJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHM/LnggPz8gMDtcbiAgY29uc3QgdGFyZ2V0WSA9IG9wdHM/LnkgPz8gMDtcbiAgY29uc3Qgc291cmNlWCA9IG9wdHM/LnN4ID8/IDA7XG4gIGNvbnN0IHNvdXJjZVkgPSBvcHRzPy5zeSA/PyAwO1xuICBjb25zdCB3aWR0aCA9IG9wdHM/LncgPz8gc3JjLndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBvcHRzPy5oID8/IHNyYy5oZWlnaHQ7XG4gIGNvbnN0IGdsb2JhbEFscGhhID0gb3B0cz8uYWxwaGEgPz8gMjU1O1xuICBjb25zdCBibGVuZEZuID0gb3B0cz8uYmxlbmRGbiA/PyBzb3VyY2VPdmVyUGVyZmVjdDtcbiAgY29uc3QgbXggPSBvcHRzPy5teCA/PyAwO1xuICBjb25zdCBteSA9IG9wdHM/Lm15ID8/IDA7XG4gIGNvbnN0IGludmVydE1hc2sgPSBvcHRzPy5pbnZlcnRNYXNrID8/IGZhbHNlO1xuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCBzeCA9IHNvdXJjZVg7XG4gIGxldCBzeSA9IHNvdXJjZVk7XG4gIGxldCB3ID0gd2lkdGg7XG4gIGxldCBoID0gaGVpZ2h0O1xuXG4gIC8vIDEuIENsaXBwaW5nIChNYXRjaGVzIG1haW4gYnJhbmNoIGJlaGF2aW9yKVxuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeDtcbiAgICB3ICs9IHN4O1xuICAgIHN4ID0gMDtcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeTtcbiAgICBoICs9IHN5O1xuICAgIHN5ID0gMDtcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpO1xuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KTtcbiAgaWYgKHggPCAwKSB7XG4gICAgc3ggLT0geDtcbiAgICB3ICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgc3kgLT0geTtcbiAgICBoICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cbiAgY29uc3QgYWN0dWFsVyA9IE1hdGgubWluKHcsIHRhcmdldC53aWR0aCAtIHgpO1xuICBjb25zdCBhY3R1YWxIID0gTWF0aC5taW4oaCwgdGFyZ2V0LmhlaWdodCAtIHkpO1xuICBpZiAoYWN0dWFsVyA8PSAwIHx8IGFjdHVhbEggPD0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIDIuIEluZGV4IFNldHVwXG4gIGNvbnN0IGR3ID0gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBzdyA9IHNyYy53aWR0aDtcbiAgY29uc3QgbVBpdGNoID0gYWxwaGFNYXNrLnc7XG4gIGNvbnN0IG1hc2tEYXRhID0gYWxwaGFNYXNrLmRhdGE7XG5cbiAgLy8gZHgvZHkgaXMgdGhlIGRpc3BsYWNlbWVudCBmcm9tIHJlcXVlc3RlZCBzdGFydCB0byBjbGlwcGVkIHN0YXJ0LlxuICAvLyBUaGlzIGtlZXBzIHRoZSBtYXNrIGxvY2tlZCB0byB0aGUgc291cmNlIGNvbnRlbnQgZHVyaW5nIGNyb3NzLWNsaXBwaW5nLlxuICBjb25zdCBkeCA9IHggLSB0YXJnZXRYIHwgMDtcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WSB8IDA7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGEzMjtcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyO1xuICBsZXQgZElkeCA9IHkgKiBkdyArIHggfCAwO1xuICBsZXQgc0lkeCA9IHN5ICogc3cgKyBzeCB8IDA7XG4gIGxldCBtSWR4ID0gKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpIHwgMDtcbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IHNTdHJpZGUgPSBzdyAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IGlzT3BhcXVlID0gZ2xvYmFsQWxwaGEgPT09IDI1NTtcbiAgY29uc3QgaXNPdmVyd3JpdGUgPSBibGVuZEZuLmlzT3ZlcndyaXRlIHx8IGZhbHNlO1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgIGNvbnN0IG1WYWwgPSBtYXNrRGF0YVttSWR4XTtcbiAgICAgIGNvbnN0IGVmZk0gPSBpbnZlcnRNYXNrID8gMjU1IC0gbVZhbCA6IG1WYWw7XG5cbiAgICAgIC8vIEVhcmx5IGV4aXQgaWYgbWFzayBpcyBmdWxseSB0cmFuc3BhcmVudFxuICAgICAgaWYgKGVmZk0gPT09IDApIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBzSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyO1xuICAgICAgY29uc3Qgc3JjQWxwaGEgPSBzcmNDb2wgPj4+IDI0O1xuXG4gICAgICAvLyBFYXJseSBleGl0IGlmIHNvdXJjZSBpcyBmdWxseSB0cmFuc3BhcmVudCAodW5sZXNzIG92ZXJ3cml0aW5nKVxuICAgICAgaWYgKHNyY0FscGhhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICBkSWR4Kys7XG4gICAgICAgIHNJZHgrKztcbiAgICAgICAgbUlkeCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHdlaWdodCB1c2luZyBsaW5lYXIgbG9naWMgKEVhc2llciBmb3IgSklUIHRoYW4gbmVzdGVkIHRlcm5hcmllcylcbiAgICAgIGxldCB3ZWlnaHQgPSBnbG9iYWxBbHBoYTtcbiAgICAgIGlmIChpc09wYXF1ZSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZNO1xuICAgICAgfSBlbHNlIGlmIChlZmZNICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmTSAqIGdsb2JhbEFscGhhICsgMTI4ID4+IDg7XG4gICAgICB9XG5cbiAgICAgIC8vIFplcm8td2VpZ2h0IHNhZmV0eSBjaGVja1xuICAgICAgaWYgKHdlaWdodCA9PT0gMCkge1xuICAgICAgICBkSWR4Kys7XG4gICAgICAgIHNJZHgrKztcbiAgICAgICAgbUlkeCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBmaW5hbENvbCA9IHNyY0NvbDtcbiAgICAgIGlmICh3ZWlnaHQgPCAyNTUpIHtcbiAgICAgICAgY29uc3QgYSA9IHNyY0FscGhhICogd2VpZ2h0ICsgMTI4ID4+IDg7XG4gICAgICAgIC8vIEZpbmFsIGNoZWNrOiB3ZWlnaHQgbWlnaHQgaGF2ZSByZXN1bHRlZCBpbiBhIHRyYW5zcGFyZW50IHBpeGVsXG4gICAgICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICAgIGRJZHgrKztcbiAgICAgICAgICBzSWR4Kys7XG4gICAgICAgICAgbUlkeCsrO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGZpbmFsQ29sID0gKHNyY0NvbCAmIDB4MDBmZmZmZmYgfCBhIDw8IDI0KSA+Pj4gMCBhcyBDb2xvcjMyO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzI7XG4gICAgICBjb25zdCBuZXh0ID0gYmxlbmRGbihmaW5hbENvbCwgZHN0MzJbZElkeF0gYXMgQ29sb3IzMik7XG4gICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBkSWR4Kys7XG4gICAgICBzSWR4Kys7XG4gICAgICBtSWR4Kys7XG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICBzSWR4ICs9IHNTdHJpZGU7XG4gICAgbUlkeCArPSBtU3RyaWRlO1xuICB9XG4gIHJldHVybiBkaWRDaGFuZ2U7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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: IPixelData32, mask: AlphaMask, opts?: PixelBlendMaskOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.width;\n const h = opts?.h ?? src.height;\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+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQWxwaGFNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YUFscGhhTWFza1xuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZEFscGhhTWFzayhzcmM6IElQaXhlbERhdGEzMiwgbWFzazogQWxwaGFNYXNrLCBvcHRzPzogUGl4ZWxCbGVuZE1hc2tPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB4ID0gb3B0cz8ueCA/PyAwO1xuICAgICAgY29uc3QgeSA9IG9wdHM/LnkgPz8gMDtcbiAgICAgIGNvbnN0IHcgPSBvcHRzPy53ID8/IHNyYy53aWR0aDtcbiAgICAgIGNvbnN0IGggPSBvcHRzPy5oID8/IHNyYy5oZWlnaHQ7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixelDataBinaryMask(target: IPixelData32, src: IPixelData32, 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.width;\n const height = opts?.h ?? src.height;\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.width - sx);\n h = Math.min(h, src.height - sy);\n\n // 2. Destination Clipping\n if (x < 0) {\n sx -= x;\n w += x;\n x = 0;\n }\n if (y < 0) {\n sy -= y;\n h += y;\n y = 0;\n }\n const actualW = Math.min(w, target.width - x);\n const actualH = Math.min(h, target.height - 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.data32;\n const src32 = src.data32;\n const dw = target.width;\n const sw = src.width;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayh0YXJnZXQ6IElQaXhlbERhdGEzMiwgc3JjOiBJUGl4ZWxEYXRhMzIsIGJpbmFyeU1hc2s6IEJpbmFyeU1hc2ssIG9wdHM/OiBQaXhlbEJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHM/LnggPz8gMDtcbiAgY29uc3QgdGFyZ2V0WSA9IG9wdHM/LnkgPz8gMDtcbiAgY29uc3Qgc291cmNlWCA9IG9wdHM/LnN4ID8/IDA7XG4gIGNvbnN0IHNvdXJjZVkgPSBvcHRzPy5zeSA/PyAwO1xuICBjb25zdCB3aWR0aCA9IG9wdHM/LncgPz8gc3JjLndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBvcHRzPy5oID8/IHNyYy5oZWlnaHQ7XG4gIGNvbnN0IGdsb2JhbEFscGhhID0gb3B0cz8uYWxwaGEgPz8gMjU1O1xuICBjb25zdCBibGVuZEZuID0gb3B0cz8uYmxlbmRGbiA/PyBzb3VyY2VPdmVyUGVyZmVjdDtcbiAgY29uc3QgbXggPSBvcHRzPy5teCA/PyAwO1xuICBjb25zdCBteSA9IG9wdHM/Lm15ID8/IDA7XG4gIGNvbnN0IGludmVydE1hc2sgPSBvcHRzPy5pbnZlcnRNYXNrID8/IGZhbHNlO1xuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCBzeCA9IHNvdXJjZVg7XG4gIGxldCBzeSA9IHNvdXJjZVk7XG4gIGxldCB3ID0gd2lkdGg7XG4gIGxldCBoID0gaGVpZ2h0O1xuXG4gIC8vIDEuIFNvdXJjZSBDbGlwcGluZ1xuICBpZiAoc3ggPCAwKSB7XG4gICAgeCAtPSBzeDtcbiAgICB3ICs9IHN4O1xuICAgIHN4ID0gMDtcbiAgfVxuICBpZiAoc3kgPCAwKSB7XG4gICAgeSAtPSBzeTtcbiAgICBoICs9IHN5O1xuICAgIHN5ID0gMDtcbiAgfVxuICB3ID0gTWF0aC5taW4odywgc3JjLndpZHRoIC0gc3gpO1xuICBoID0gTWF0aC5taW4oaCwgc3JjLmhlaWdodCAtIHN5KTtcblxuICAvLyAyLiBEZXN0aW5hdGlvbiBDbGlwcGluZ1xuICBpZiAoeCA8IDApIHtcbiAgICBzeCAtPSB4O1xuICAgIHcgKz0geDtcbiAgICB4ID0gMDtcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBzeSAtPSB5O1xuICAgIGggKz0geTtcbiAgICB5ID0gMDtcbiAgfVxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgdGFyZ2V0LndpZHRoIC0geCk7XG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCB0YXJnZXQuaGVpZ2h0IC0geSk7XG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gMy4gQ29vcmRpbmF0ZSBEaXNwbGFjZW1lbnQgZm9yIE1hc2sgU3luY1xuICAvLyBkeC9keSByZXByZXNlbnRzIGhvdyBmYXIgdGhlIGNsaXBwZWQgc3RhcnQgaXMgZnJvbSB0aGUgcmVxdWVzdGVkIHN0YXJ0LlxuICAvLyBUaGlzIGlzIHRoZSBzdGFibGUgd2F5IHRvIGFsaWduIHRoZSBtYXNrIGFjcm9zcyBhbGwgY2xpcHBpbmcgcGVybXV0YXRpb25zLlxuICBjb25zdCBkeCA9IHggLSB0YXJnZXRYIHwgMDtcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WSB8IDA7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGEzMjtcbiAgY29uc3Qgc3JjMzIgPSBzcmMuZGF0YTMyO1xuICBjb25zdCBkdyA9IHRhcmdldC53aWR0aDtcbiAgY29uc3Qgc3cgPSBzcmMud2lkdGg7XG4gIGNvbnN0IG1QaXRjaCA9IGJpbmFyeU1hc2sudztcbiAgY29uc3QgbWFza0RhdGEgPSBiaW5hcnlNYXNrLmRhdGE7XG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeCB8IDA7XG4gIGxldCBzSWR4ID0gc3kgKiBzdyArIHN4IHwgMDtcbiAgbGV0IG1JZHggPSAobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCkgfCAwO1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBhY3R1YWxXIHwgMDtcbiAgY29uc3Qgc1N0cmlkZSA9IHN3IC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBhY3R1YWxXIHwgMDtcbiAgY29uc3Qgc2tpcFZhbCA9IGludmVydE1hc2sgPyAxIDogMDtcbiAgY29uc3QgaXNPcGFxdWUgPSBnbG9iYWxBbHBoYSA9PT0gMjU1O1xuICBjb25zdCBpc092ZXJ3cml0ZSA9IGJsZW5kRm4uaXNPdmVyd3JpdGUgfHwgZmFsc2U7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgLy8gQmluYXJ5IE1hc2sgQ2hlY2sgKEVhcmxpZXN0IGV4aXQpXG4gICAgICBpZiAobWFza0RhdGFbbUlkeF0gPT09IHNraXBWYWwpIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBzSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzcmNDb2wgPSBzcmMzMltzSWR4XSBhcyBDb2xvcjMyO1xuICAgICAgY29uc3Qgc3JjQWxwaGEgPSBzcmNDb2wgPj4+IDI0O1xuXG4gICAgICAvLyBTb3VyY2UgQWxwaGEgQ2hlY2tcbiAgICAgIGlmIChzcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBzSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBsZXQgZmluYWxDb2wgPSBzcmNDb2w7XG4gICAgICBpZiAoIWlzT3BhcXVlKSB7XG4gICAgICAgIC8vIFJvdW5kaW5nLWNvcnJlY3RlZCBnbG9iYWwgYWxwaGEgYXBwbGljYXRpb25cbiAgICAgICAgY29uc3QgYSA9IHNyY0FscGhhICogZ2xvYmFsQWxwaGEgKyAxMjggPj4gODtcbiAgICAgICAgaWYgKGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSB7XG4gICAgICAgICAgZElkeCsrO1xuICAgICAgICAgIHNJZHgrKztcbiAgICAgICAgICBtSWR4Kys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxDb2wgPSAoc3JjQ29sICYgMHgwMGZmZmZmZiB8IGEgPDwgMjQpID4+PiAwIGFzIENvbG9yMzI7XG4gICAgICB9XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGZpbmFsQ29sLCBkc3QzMltkSWR4XSBhcyBDb2xvcjMyKTtcbiAgICAgIGlmIChjdXJyZW50ICE9PSBuZXh0KSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gbmV4dDtcbiAgICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGRJZHgrKztcbiAgICAgIHNJZHgrKztcbiAgICAgIG1JZHgrKztcbiAgICB9XG4gICAgZElkeCArPSBkU3RyaWRlO1xuICAgIHNJZHggKz0gc1N0cmlkZTtcbiAgICBtSWR4ICs9IG1TdHJpZGU7XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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: IPixelData32, mask: BinaryMask, opts?: PixelBlendMaskOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.width;\n const h = opts?.h ?? src.height;\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+IHtcbiAgY29uc3Qge1xuICAgIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayA9IGRlZmF1bHRzLmJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFza1xuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZEJpbmFyeU1hc2soc3JjOiBJUGl4ZWxEYXRhMzIsIG1hc2s6IEJpbmFyeU1hc2ssIG9wdHM/OiBQaXhlbEJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzPy54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3B0cz8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IG9wdHM/LncgPz8gc3JjLndpZHRoO1xuICAgICAgY29uc3QgaCA9IG9wdHM/LmggPz8gc3JjLmhlaWdodDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgbWFzaywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { type Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blends a solid color into a target pixel buffer.\n * @returns true if any pixels were actually modified.\n */\nexport function blendColorPixelData(target: IPixelData32, color: Color32, opts?: ColorBlendOptions): boolean {\n const targetX = opts?.x ?? 0;\n const targetY = opts?.y ?? 0;\n const width = opts?.w ?? target.width;\n const height = opts?.h ?? target.height;\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.width - x);\n const actualH = Math.min(h, target.height - 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.data32;\n const dw = target.width;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhbnkgcGl4ZWxzIHdlcmUgYWN0dWFsbHkgbW9kaWZpZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhKHRhcmdldDogSVBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgb3B0cz86IENvbG9yQmxlbmRPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGNvbnN0IHdpZHRoID0gb3B0cz8udyA/PyB0YXJnZXQud2lkdGg7XG4gIGNvbnN0IGhlaWdodCA9IG9wdHM/LmggPz8gdGFyZ2V0LmhlaWdodDtcbiAgY29uc3QgZ2xvYmFsQWxwaGEgPSBvcHRzPy5hbHBoYSA/PyAyNTU7XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzPy5ibGVuZEZuID8/IHNvdXJjZU92ZXJQZXJmZWN0O1xuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0O1xuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2U7XG4gIGlmIChiYXNlU3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gQ2xpcHBpbmdcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCB3ID0gd2lkdGg7XG4gIGxldCBoID0gaGVpZ2h0O1xuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCB0YXJnZXQud2lkdGggLSB4KTtcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIHRhcmdldC5oZWlnaHQgLSB5KTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZTtcblxuICAvLyBTaW5nbGUtY29sb3IgZmlsbHMgY2FuIHByZS1jYWxjdWxhdGUgdGhlIHNvdXJjZSBjb2xvciBvbmNlXG4gIGxldCBmaW5hbFNyY0NvbG9yID0gY29sb3I7XG4gIGlmIChnbG9iYWxBbHBoYSA8IDI1NSkge1xuICAgIGNvbnN0IGEgPSBiYXNlU3JjQWxwaGEgKiBnbG9iYWxBbHBoYSArIDEyOCA+PiA4O1xuICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkgcmV0dXJuIGZhbHNlO1xuICAgIGZpbmFsU3JjQ29sb3IgPSAoY29sb3IgJiAweDAwZmZmZmZmIHwgYSA8PCAyNCkgPj4+IDAgYXMgQ29sb3IzMjtcbiAgfVxuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhMzI7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0LndpZHRoO1xuICBsZXQgZElkeCA9IHkgKiBkdyArIHggfCAwO1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBhY3R1YWxXIHwgMDtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZElkeF0gYXMgQ29sb3IzMjtcbiAgICAgIGNvbnN0IG5leHQgPSBibGVuZEZuKGZpbmFsU3JjQ29sb3IsIGN1cnJlbnQpO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0O1xuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZElkeCsrO1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGU7XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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.width;\n const h = opts?.h ?? target.height;\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/PyB0YXJnZXQud2lkdGg7XG4gICAgICBjb25zdCBoID0gb3B0cz8uaCA/PyB0YXJnZXQuaGVpZ2h0O1xuICAgICAgY29uc3QgZGlkQ2hhbmdlID0gd3JpdGVyLmFjY3VtdWxhdG9yLnN0b3JlUmVnaW9uQmVmb3JlU3RhdGUoeCwgeSwgdywgaCk7XG4gICAgICByZXR1cm4gZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGEodGFyZ2V0LCBjb2xvciwgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\n\n/**\n * Blends a solid color into a target pixel buffer using an alpha mask.\n *\n * @remarks\n * If the width (`w`) or height (`h`) are omitted from the options, they will safely\n * default to the dimensions of the provided mask to prevent out-of-bounds memory access.\n *\n * @param target - The destination {@link IPixelData32} 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: IPixelData32, 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.width - x);\n actualH = Math.min(actualH, target.height - 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.data32;\n const dw = target.width;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyIHVzaW5nIGFuIGFscGhhIG1hc2suXG4gKlxuICogQHJlbWFya3NcbiAqIElmIHRoZSB3aWR0aCAoYHdgKSBvciBoZWlnaHQgKGBoYCkgYXJlIG9taXR0ZWQgZnJvbSB0aGUgb3B0aW9ucywgdGhleSB3aWxsIHNhZmVseVxuICogZGVmYXVsdCB0byB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcHJvdmlkZWQgbWFzayB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzcy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGRlc3RpbmF0aW9uIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgc29saWQgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gbWFzayAtIFRoZSBtYXNrIGRlZmluaW5nIHRoZSBwZXItcGl4ZWwgb3BhY2l0eSBvZiB0aGUgdGFyZ2V0IGFyZWEuXG4gKiBAcGFyYW0gb3B0cyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgcGxhY2VtZW50IGNvb3JkaW5hdGVzLCBib3VuZHMsIGdsb2JhbCBhbHBoYSwgYW5kIG1hc2sgb2Zmc2V0cy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayh0YXJnZXQ6IElQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIG1hc2s6IEFscGhhTWFzaywgb3B0cz86IENvbG9yQmxlbmRNYXNrT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCB0YXJnZXRYID0gb3B0cz8ueCA/PyAwO1xuICBjb25zdCB0YXJnZXRZID0gb3B0cz8ueSA/PyAwO1xuICBjb25zdCB3ID0gb3B0cz8udyA/PyBtYXNrLnc7XG4gIGNvbnN0IGggPSBvcHRzPy5oID8/IG1hc2suaDtcbiAgY29uc3QgZ2xvYmFsQWxwaGEgPSBvcHRzPy5hbHBoYSA/PyAyNTU7XG4gIGNvbnN0IGJsZW5kRm4gPSBvcHRzPy5ibGVuZEZuID8/IHNvdXJjZU92ZXJQZXJmZWN0O1xuICBjb25zdCBteCA9IG9wdHM/Lm14ID8/IDA7XG4gIGNvbnN0IG15ID0gb3B0cz8ubXkgPz8gMDtcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHM/LmludmVydE1hc2sgPz8gZmFsc2U7XG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBiYXNlU3JjQWxwaGEgPSBjb2xvciA+Pj4gMjQ7XG4gIGNvbnN0IGlzT3ZlcndyaXRlID0gKGJsZW5kRm4gYXMgYW55KS5pc092ZXJ3cml0ZSB8fCBmYWxzZTtcbiAgaWYgKGJhc2VTcmNBbHBoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZTtcbiAgbGV0IHggPSB0YXJnZXRYO1xuICBsZXQgeSA9IHRhcmdldFk7XG4gIGxldCBhY3R1YWxXID0gdztcbiAgbGV0IGFjdHVhbEggPSBoO1xuICBpZiAoeCA8IDApIHtcbiAgICBhY3R1YWxXICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgYWN0dWFsSCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGFjdHVhbFcgPSBNYXRoLm1pbihhY3R1YWxXLCB0YXJnZXQud2lkdGggLSB4KTtcbiAgYWN0dWFsSCA9IE1hdGgubWluKGFjdHVhbEgsIHRhcmdldC5oZWlnaHQgLSB5KTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgZHggPSB4IC0gdGFyZ2V0WCB8IDA7XG4gIGNvbnN0IGR5ID0geSAtIHRhcmdldFkgfCAwO1xuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhMzI7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBtUGl0Y2ggPSBtYXNrLnc7XG4gIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhO1xuICBsZXQgZElkeCA9IHkgKiBkdyArIHggfCAwO1xuICBsZXQgbUlkeCA9IChteSArIGR5KSAqIG1QaXRjaCArIChteCArIGR4KSB8IDA7XG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFcgfCAwO1xuICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IGlzT3BhcXVlID0gZ2xvYmFsQWxwaGEgPT09IDI1NTtcbiAgY29uc3QgY29sb3JSR0IgPSBjb2xvciAmIDB4MDBmZmZmZmY7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgY29uc3QgbVZhbCA9IG1hc2tEYXRhW21JZHhdO1xuICAgICAgY29uc3QgZWZmTSA9IGludmVydE1hc2sgPyAyNTUgLSBtVmFsIDogbVZhbDtcbiAgICAgIGlmIChlZmZNID09PSAwKSB7XG4gICAgICAgIGRJZHgrKztcbiAgICAgICAgbUlkeCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCB3ZWlnaHQgPSBnbG9iYWxBbHBoYTtcbiAgICAgIGlmIChpc09wYXF1ZSkge1xuICAgICAgICB3ZWlnaHQgPSBlZmZNO1xuICAgICAgfSBlbHNlIGlmIChlZmZNICE9PSAyNTUpIHtcbiAgICAgICAgd2VpZ2h0ID0gZWZmTSAqIGdsb2JhbEFscGhhICsgMTI4ID4+IDg7XG4gICAgICB9XG4gICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgIGRJZHgrKztcbiAgICAgICAgbUlkeCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBmaW5hbENvbCA9IGNvbG9yO1xuICAgICAgaWYgKHdlaWdodCA8IDI1NSkge1xuICAgICAgICBjb25zdCBhID0gYmFzZVNyY0FscGhhICogd2VpZ2h0ICsgMTI4ID4+IDg7XG4gICAgICAgIGlmIChhID09PSAwICYmICFpc092ZXJ3cml0ZSkge1xuICAgICAgICAgIGRJZHgrKztcbiAgICAgICAgICBtSWR4Kys7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxDb2wgPSAoY29sb3JSR0IgfCBhIDw8IDI0KSA+Pj4gMCBhcyBDb2xvcjMyO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzI7XG4gICAgICBjb25zdCBuZXh0ID0gYmxlbmRGbihmaW5hbENvbCwgY3VycmVudCk7XG4gICAgICBpZiAoY3VycmVudCAhPT0gbmV4dCkge1xuICAgICAgICBkc3QzMltkSWR4XSA9IG5leHQ7XG4gICAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBkSWR4Kys7XG4gICAgICBtSWR4Kys7XG4gICAgfVxuICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICBtSWR4ICs9IG1TdHJpZGU7XG4gIH1cbiAgcmV0dXJuIGRpZENoYW5nZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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/**\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 IPixelData32} 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: IPixelData32, 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.width - x);\n const actualH = Math.min(h, target.height - 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.data32;\n const dw = target.width;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuXG4vKipcbiAqIEJsZW5kcyBhIHNvbGlkIGNvbG9yIGludG8gYSB0YXJnZXQgcGl4ZWwgYnVmZmVyIHVzaW5nIGEgYmluYXJ5IG1hc2suXG4gKlxuICogQHJlbWFya3NcbiAqIElmIHRoZSB3aWR0aCAoYHdgKSBvciBoZWlnaHQgKGBoYCkgYXJlIG9taXR0ZWQgZnJvbSB0aGUgb3B0aW9ucywgdGhleSB3aWxsIHNhZmVseVxuICogZGVmYXVsdCB0byB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcHJvdmlkZWQgbWFzayB0byBwcmV2ZW50IG91dC1vZi1ib3VuZHMgbWVtb3J5IGFjY2Vzcy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIGRlc3RpbmF0aW9uIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgc29saWQgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gbWFzayAtIFRoZSBtYXNrIGRlZmluaW5nIHRoZSBwZXItcGl4ZWwgb3BhY2l0eSBvZiB0aGUgdGFyZ2V0IGFyZWEuXG4gKiBAcGFyYW0gb3B0cyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgcGxhY2VtZW50IGNvb3JkaW5hdGVzLCBib3VuZHMsIGdsb2JhbCBhbHBoYSwgYW5kIG1hc2sgb2Zmc2V0cy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sodGFyZ2V0OiBJUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBCaW5hcnlNYXNrLCBvcHRzPzogQ29sb3JCbGVuZE1hc2tPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHRhcmdldFggPSBvcHRzPy54ID8/IDA7XG4gIGNvbnN0IHRhcmdldFkgPSBvcHRzPy55ID8/IDA7XG4gIGxldCB3ID0gb3B0cz8udyA/PyBtYXNrLnc7XG4gIGxldCBoID0gb3B0cz8uaCA/PyBtYXNrLmg7XG4gIGNvbnN0IGdsb2JhbEFscGhhID0gb3B0cz8uYWxwaGEgPz8gMjU1O1xuICBjb25zdCBibGVuZEZuID0gb3B0cz8uYmxlbmRGbiA/PyBzb3VyY2VPdmVyUGVyZmVjdDtcbiAgY29uc3QgbXggPSBvcHRzPy5teCA/PyAwO1xuICBjb25zdCBteSA9IG9wdHM/Lm15ID8/IDA7XG4gIGNvbnN0IGludmVydE1hc2sgPSBvcHRzPy5pbnZlcnRNYXNrID8/IGZhbHNlO1xuICBpZiAoZ2xvYmFsQWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgY29uc3QgYmFzZVNyY0FscGhhID0gY29sb3IgPj4+IDI0O1xuICBjb25zdCBpc092ZXJ3cml0ZSA9IChibGVuZEZuIGFzIGFueSkuaXNPdmVyd3JpdGUgfHwgZmFsc2U7XG4gIGlmIChiYXNlU3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2U7XG4gIGxldCB4ID0gdGFyZ2V0WDtcbiAgbGV0IHkgPSB0YXJnZXRZO1xuICBpZiAoeCA8IDApIHtcbiAgICB3ICs9IHg7XG4gICAgeCA9IDA7XG4gIH1cbiAgaWYgKHkgPCAwKSB7XG4gICAgaCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCB0YXJnZXQud2lkdGggLSB4KTtcbiAgY29uc3QgYWN0dWFsSCA9IE1hdGgubWluKGgsIHRhcmdldC5oZWlnaHQgLSB5KTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHJldHVybiBmYWxzZTtcbiAgbGV0IGJhc2VDb2xvcldpdGhHbG9iYWxBbHBoYSA9IGNvbG9yO1xuICBpZiAoZ2xvYmFsQWxwaGEgPCAyNTUpIHtcbiAgICBjb25zdCBhID0gYmFzZVNyY0FscGhhICogZ2xvYmFsQWxwaGEgKyAxMjggPj4gODtcbiAgICBpZiAoYSA9PT0gMCAmJiAhaXNPdmVyd3JpdGUpIHJldHVybiBmYWxzZTtcbiAgICBiYXNlQ29sb3JXaXRoR2xvYmFsQWxwaGEgPSAoY29sb3IgJiAweDAwZmZmZmZmIHwgYSA8PCAyNCkgPj4+IDAgYXMgQ29sb3IzMjtcbiAgfVxuICBjb25zdCBkeCA9IHggLSB0YXJnZXRYIHwgMDtcbiAgY29uc3QgZHkgPSB5IC0gdGFyZ2V0WSB8IDA7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGEzMjtcbiAgY29uc3QgZHcgPSB0YXJnZXQud2lkdGg7XG4gIGNvbnN0IG1QaXRjaCA9IG1hc2sudztcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGE7XG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeCB8IDA7XG4gIGxldCBtSWR4ID0gKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpIHwgMDtcbiAgY29uc3QgZFN0cmlkZSA9IGR3IC0gYWN0dWFsVyB8IDA7XG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBhY3R1YWxXIHwgMDtcbiAgY29uc3Qgc2tpcFZhbCA9IGludmVydE1hc2sgPyAxIDogMDtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBpZiAobWFza0RhdGFbbUlkeF0gPT09IHNraXBWYWwpIHtcbiAgICAgICAgZElkeCsrO1xuICAgICAgICBtSWR4Kys7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgY3VycmVudCA9IGRzdDMyW2RJZHhdIGFzIENvbG9yMzI7XG4gICAgICBjb25zdCBuZXh0ID0gYmxlbmRGbihiYXNlQ29sb3JXaXRoR2xvYmFsQWxwaGEsIGN1cnJlbnQpO1xuICAgICAgaWYgKGN1cnJlbnQgIT09IG5leHQpIHtcbiAgICAgICAgZHN0MzJbZElkeF0gPSBuZXh0O1xuICAgICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgICAgfVxuICAgICAgZElkeCsrO1xuICAgICAgbUlkeCsrO1xuICAgIH1cbiAgICBkSWR4ICs9IGRTdHJpZGU7XG4gICAgbUlkeCArPSBtU3RyaWRlO1xuICB9XG4gIHJldHVybiBkaWRDaGFuZ2U7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 { MaskType } from '../../_types';\nimport { sourceOverPerfect } from '../../BlendModes/blend-modes-perfect';\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uLy4uL190eXBlcyc7XG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snO1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFza1xufTtcbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPjtcblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZENvbG9yUGFpbnRNYXNrID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgPSBkZWZhdWx0cy5ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayxcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFza1xuICB9ID0gZGVwcztcbiAgY29uc3QgT1BUUyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgYWxwaGE6IDI1NVxuICB9O1xuICByZXR1cm4ge1xuICAgIGJsZW5kQ29sb3JQYWludE1hc2soY29sb3I6IENvbG9yMzIsIG1hc2s6IFBhaW50TWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIsIGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHR4ID0geCArIG1hc2suY2VudGVyT2Zmc2V0WDtcbiAgICAgIGNvbnN0IHR5ID0geSArIG1hc2suY2VudGVyT2Zmc2V0WTtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHR4LCB0eSwgbWFzay53LCBtYXNrLmgpO1xuICAgICAgT1BUUy54ID0gdHg7XG4gICAgICBPUFRTLnkgPSB0eTtcbiAgICAgIE9QVFMuYWxwaGEgPSBhbHBoYTtcbiAgICAgIE9QVFMuYmxlbmRGbiA9IGJsZW5kRm47XG4gICAgICBpZiAobWFzay50eXBlID09PSBNYXNrVHlwZS5CSU5BUlkpIHtcbiAgICAgICAgcmV0dXJuIGRpZENoYW5nZShibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgY29sb3IsIG1hc2ssIE9QVFMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayh3cml0ZXIuY29uZmlnLnRhcmdldCwgY29sb3IsIG1hc2ssIE9QVFMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59KSBzYXRpc2ZpZXMgSGlzdG9yeU11dGF0b3I8YW55LCBEZXBzPjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../../_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: IPixelData32, mask: Mask, opts?: PixelBlendMaskOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.width;\n const h = opts?.h ?? src.height;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uLy4uL190eXBlcyc7XG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4uLy4uL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YUFscGhhTWFzayc7XG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi8uLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrJztcbmltcG9ydCB7IHR5cGUgSGlzdG9yeU11dGF0b3IgfSBmcm9tICcuLi9QaXhlbFdyaXRlcic7XG5jb25zdCBkZWZhdWx0cyA9IHtcbiAgYmxlbmRQaXhlbERhdGFBbHBoYU1hc2ssXG4gIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFza1xufTtcbnR5cGUgRGVwcyA9IFBhcnRpYWw8dHlwZW9mIGRlZmF1bHRzPjtcblxuLyoqXG4gKiBAcGFyYW0gZGVwcyAtIEBoaWRkZW5cbiAqL1xuZXhwb3J0IGNvbnN0IG11dGF0b3JCbGVuZE1hc2sgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogUGFydGlhbDxEZXBzPiA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZFBpeGVsRGF0YUFscGhhTWFzayA9IGRlZmF1bHRzLmJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrLFxuICAgIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayA9IGRlZmF1bHRzLmJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFza1xuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZE1hc2soc3JjOiBJUGl4ZWxEYXRhMzIsIG1hc2s6IE1hc2ssIG9wdHM/OiBQaXhlbEJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHggPSBvcHRzPy54ID8/IDA7XG4gICAgICBjb25zdCB5ID0gb3B0cz8ueSA/PyAwO1xuICAgICAgY29uc3QgdyA9IG9wdHM/LncgPz8gc3JjLndpZHRoO1xuICAgICAgY29uc3QgaCA9IG9wdHM/LmggPz8gc3JjLmhlaWdodDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrKHdyaXRlci5jb25maWcudGFyZ2V0LCBzcmMsIG1hc2ssIG9wdHMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGFBbHBoYU1hc2sod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgbWFzaywgb3B0cykpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+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 return didChange(blendColorPixelData(target, color, OPTS));\n }\n };\n}) satisfies HistoryMutator<any, Deps>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uLy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhIH0gZnJvbSAnLi4vLi4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBIaXN0b3J5TXV0YXRvciB9IGZyb20gJy4uL1BpeGVsV3JpdGVyJztcbmNvbnN0IGRlZmF1bHRzID0ge1xuICBibGVuZENvbG9yUGl4ZWxEYXRhXG59O1xudHlwZSBEZXBzID0gUGFydGlhbDx0eXBlb2YgZGVmYXVsdHM+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kQ29sb3JQYWludFJlY3QgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBibGVuZENvbG9yUGl4ZWxEYXRhID0gZGVmYXVsdHMuYmxlbmRDb2xvclBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgY29uc3QgT1BUUyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwLFxuICAgIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0LFxuICAgIGFscGhhOiAyNTVcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICBibGVuZENvbG9yUGFpbnRSZWN0KGNvbG9yOiBDb2xvcjMyLCBjZW50ZXJYOiBudW1iZXIsIGNlbnRlclk6IG51bWJlciwgYnJ1c2hXaWR0aDogbnVtYmVyLCBicnVzaEhlaWdodDogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QpOiBib29sZWFuIHtcbiAgICAgIGNvbnN0IHRhcmdldCA9IHdyaXRlci5jb25maWcudGFyZ2V0O1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBjZW50ZXJYICsgLShicnVzaFdpZHRoIC0gMSA+PiAxKTtcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gY2VudGVyWSArIC0oYnJ1c2hIZWlnaHQgLSAxID4+IDEpO1xuICAgICAgT1BUUy54ID0gdG9wTGVmdFg7XG4gICAgICBPUFRTLnkgPSB0b3BMZWZ0WTtcbiAgICAgIE9QVFMudyA9IGJydXNoV2lkdGg7XG4gICAgICBPUFRTLmggPSBicnVzaEhlaWdodDtcbiAgICAgIE9QVFMuYmxlbmRGbiA9IGJsZW5kRm47XG4gICAgICBPUFRTLmFscGhhID0gYWxwaGE7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh0b3BMZWZ0WCwgdG9wTGVmdFksIGJydXNoV2lkdGgsIGJydXNoSGVpZ2h0KTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRDb2xvclBpeGVsRGF0YSh0YXJnZXQsIGNvbG9yLCBPUFRTKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nexport function blendPixel(target: IPixelData32, x: number, y: number, color: Color32, alpha: number = 255, blendFn: BlendColor32 = sourceOverPerfect): boolean {\n if (alpha === 0) return false;\n let width = target.width;\n let height = target.height;\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.data32;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWwodGFyZ2V0OiBJUGl4ZWxEYXRhMzIsIHg6IG51bWJlciwgeTogbnVtYmVyLCBjb2xvcjogQ29sb3IzMiwgYWxwaGE6IG51bWJlciA9IDI1NSwgYmxlbmRGbjogQmxlbmRDb2xvcjMyID0gc291cmNlT3ZlclBlcmZlY3QpOiBib29sZWFuIHtcbiAgaWYgKGFscGhhID09PSAwKSByZXR1cm4gZmFsc2U7XG4gIGxldCB3aWR0aCA9IHRhcmdldC53aWR0aDtcbiAgbGV0IGhlaWdodCA9IHRhcmdldC5oZWlnaHQ7XG4gIGlmICh4IDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPCAwIHx8IHkgPj0gaGVpZ2h0KSByZXR1cm4gZmFsc2U7XG4gIGxldCBzcmNBbHBoYSA9IGNvbG9yID4+PiAyNDtcbiAgbGV0IGlzT3ZlcndyaXRlID0gYmxlbmRGbi5pc092ZXJ3cml0ZTtcblxuICAvLyBFYXJseSBleGl0IGZvciB0cmFuc3BhcmVudCBzb3VyY2UgdW5sZXNzIHdlIGFyZSBpbiBhbiBvdmVyd3JpdGUgbW9kZVxuICBpZiAoc3JjQWxwaGEgPT09IDAgJiYgIWlzT3ZlcndyaXRlKSByZXR1cm4gZmFsc2U7XG4gIGxldCBkc3QzMiA9IHRhcmdldC5kYXRhMzI7XG4gIGxldCBpbmRleCA9IHkgKiB3aWR0aCArIHg7XG4gIGxldCBmaW5hbENvbG9yID0gY29sb3I7XG4gIGlmIChhbHBoYSAhPT0gMjU1KSB7XG4gICAgbGV0IGZpbmFsQWxwaGEgPSBzcmNBbHBoYSAqIGFscGhhICsgMTI4ID4+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 { 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: IPixelData32, opts?: PixelBlendOptions): boolean {\n const x = opts?.x ?? 0;\n const y = opts?.y ?? 0;\n const w = opts?.w ?? src.width;\n const h = opts?.h ?? src.height;\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+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckJsZW5kUGl4ZWxEYXRhID0gKCh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM6IFBhcnRpYWw8RGVwcz4gPSBkZWZhdWx0cykgPT4ge1xuICBjb25zdCB7XG4gICAgYmxlbmRQaXhlbERhdGEgPSBkZWZhdWx0cy5ibGVuZFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBibGVuZFBpeGVsRGF0YShzcmM6IElQaXhlbERhdGEzMiwgb3B0cz86IFBpeGVsQmxlbmRPcHRpb25zKTogYm9vbGVhbiB7XG4gICAgICBjb25zdCB4ID0gb3B0cz8ueCA/PyAwO1xuICAgICAgY29uc3QgeSA9IG9wdHM/LnkgPz8gMDtcbiAgICAgIGNvbnN0IHcgPSBvcHRzPy53ID8/IHNyYy53aWR0aDtcbiAgICAgIGNvbnN0IGggPSBvcHRzPy5oID8/IHNyYy5oZWlnaHQ7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoYmxlbmRQaXhlbERhdGEod3JpdGVyLmNvbmZpZy50YXJnZXQsIHNyYywgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link IPixelData32} 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: IPixelData32, 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: IPixelData32, color: Color32, x: number, y: number, w: number, h: number): boolean;\nexport function fillPixelData(dst: IPixelData32, color: Color32, _x?: Partial<Rect> | number, _y?: number, _w?: number, _h?: number): boolean {\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.width;\n h = _x.h ?? dst.height;\n } else if (typeof _x === 'number') {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n } else {\n x = 0;\n y = 0;\n w = dst.width;\n h = dst.height;\n }\n const clip = resolveRectClipping(x, y, w, h, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return false;\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n let hasChanged = false;\n for (let iy = 0; iy < actualH; iy++) {\n const rowOffset = (finalY + iy) * dw;\n const start = rowOffset + finalX;\n const end = start + actualW;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KCk7XG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb3IgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHJlY3QgLSBEZWZpbmVzIHRoZSBhcmVhIHRvIGZpbGwuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmVcbiAqIEByZXR1cm5zIHRydWUgaWYgYW55IHBpeGVscyB3ZXJlIGFjdHVhbGx5IG1vZGlmaWVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShkc3Q6IElQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIHJlY3Q/OiBQYXJ0aWFsPFJlY3Q+KTogYm9vbGVhbjtcbi8qKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHggLSBTdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFdpZHRoIG9mIHRoZSBmaWxsIGFyZWEuXG4gKiBAcGFyYW0gaCAtIEhlaWdodCBvZiB0aGUgZmlsbCBhcmVhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShkc3Q6IElQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IGJvb2xlYW47XG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShkc3Q6IElQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIF94PzogUGFydGlhbDxSZWN0PiB8IG51bWJlciwgX3k/OiBudW1iZXIsIF93PzogbnVtYmVyLCBfaD86IG51bWJlcik6IGJvb2xlYW4ge1xuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuICBsZXQgdzogbnVtYmVyO1xuICBsZXQgaDogbnVtYmVyO1xuICBpZiAodHlwZW9mIF94ID09PSAnb2JqZWN0Jykge1xuICAgIHggPSBfeC54ID8/IDA7XG4gICAgeSA9IF94LnkgPz8gMDtcbiAgICB3ID0gX3gudyA/PyBkc3Qud2lkdGg7XG4gICAgaCA9IF94LmggPz8gZHN0LmhlaWdodDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgX3ggPT09ICdudW1iZXInKSB7XG4gICAgeCA9IF94O1xuICAgIHkgPSBfeSE7XG4gICAgdyA9IF93ITtcbiAgICBoID0gX2ghO1xuICB9IGVsc2Uge1xuICAgIHggPSAwO1xuICAgIHkgPSAwO1xuICAgIHcgPSBkc3Qud2lkdGg7XG4gICAgaCA9IGRzdC5oZWlnaHQ7XG4gIH1cbiAgY29uc3QgY2xpcCA9IHJlc29sdmVSZWN0Q2xpcHBpbmcoeCwgeSwgdywgaCwgZHN0LndpZHRoLCBkc3QuaGVpZ2h0LCBTQ1JBVENIX1JFQ1QpO1xuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxIXG4gIH0gPSBjbGlwO1xuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhMzI7XG4gIGNvbnN0IGR3ID0gZHN0LndpZHRoO1xuICBsZXQgaGFzQ2hhbmdlZCA9IGZhbHNlO1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGNvbnN0IHJvd09mZnNldCA9IChmaW5hbFkgKyBpeSkgKiBkdztcbiAgICBjb25zdCBzdGFydCA9IHJvd09mZnNldCArIGZpbmFsWDtcbiAgICBjb25zdCBlbmQgPSBzdGFydCArIGFjdHVhbFc7XG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHtcbiAgICAgIGlmIChkc3QzMltpXSAhPT0gY29sb3IpIHtcbiAgICAgICAgZHN0MzJbaV0gPSBjb2xvcjtcbiAgICAgICAgaGFzQ2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBoYXNDaGFuZ2VkO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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.width;\n const h = rect?.h ?? target.height;\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/LncgPz8gdGFyZ2V0LndpZHRoO1xuICAgICAgY29uc3QgaCA9IHJlY3Q/LmggPz8gdGFyZ2V0LmhlaWdodDtcbiAgICAgIGNvbnN0IGRpZENoYW5nZSA9IHdyaXRlci5hY2N1bXVsYXRvci5zdG9yZVJlZ2lvbkJlZm9yZVN0YXRlKHgsIHksIHcsIGgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShmaWxsUGl4ZWxEYXRhKHRhcmdldCwgMCBhcyBDb2xvcjMyLCB4LCB5LCB3LCBoKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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.width, h = writer.config.target.height) {\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+O1xuXG4vKipcbiAqIEBwYXJhbSBkZXBzIC0gQGhpZGRlblxuICovXG5leHBvcnQgY29uc3QgbXV0YXRvckZpbGwgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBmaWxsKGNvbG9yOiBDb2xvcjMyLCB4ID0gMCwgeSA9IDAsIHcgPSB3cml0ZXIuY29uZmlnLnRhcmdldC53aWR0aCwgaCA9IHdyaXRlci5jb25maWcudGFyZ2V0LmhlaWdodCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQ7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoZmlsbFBpeGVsRGF0YSh0YXJnZXQsIGNvbG9yLCB4LCB5LCB3LCBoKSk7XG4gICAgfVxuICB9O1xufSkgc2F0aXNmaWVzIEhpc3RvcnlNdXRhdG9yPGFueSwgRGVwcz47XG5cbi8qKlxuICogQHBhcmFtIGRlcHMgLSBAaGlkZGVuXG4gKi9cbmV4cG9ydCBjb25zdCBtdXRhdG9yRmlsbFJlY3QgPSAoKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55PiwgZGVwczogRGVwcyA9IGRlZmF1bHRzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBmaWxsUGl4ZWxEYXRhID0gZGVmYXVsdHMuZmlsbFBpeGVsRGF0YVxuICB9ID0gZGVwcztcbiAgcmV0dXJuIHtcbiAgICBmaWxsUmVjdChjb2xvcjogQ29sb3IzMiwgcmVjdDogUmVjdCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gd3JpdGVyLmNvbmZpZy50YXJnZXQ7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZShyZWN0LngsIHJlY3QueSwgcmVjdC53LCByZWN0LmgpO1xuICAgICAgcmV0dXJuIGRpZENoYW5nZShmaWxsUGl4ZWxEYXRhKHRhcmdldCwgY29sb3IsIHJlY3QueCwgcmVjdC55LCByZWN0LncsIHJlY3QuaCkpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+OyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region of the {@link IPixelData32} buffer with a solid color using a mask.\n * @param target - The target to modify.\n * @param color - The color to apply.\n * @param mask - The mask defining the area to fill.\n * @param x - Starting horizontal coordinate for the mask placement.\n * @param y - Starting vertical coordinate for the mask placement.\n */\nexport function fillPixelDataBinaryMask(target: IPixelData32, color: Color32, mask: BinaryMask, x = 0, y = 0): boolean {\n const maskW = mask.w;\n const maskH = mask.h;\n const clip = resolveRectClipping(x, y, maskW, maskH, target.width, target.height, SCRATCH_RECT);\n if (!clip.inBounds) return false;\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const maskData = mask.data;\n const dst32 = target.data32;\n const dw = target.width;\n let hasChanged = false;\n for (let iy = 0; iy < actualH; iy++) {\n const currentY = finalY + iy;\n const maskY = currentY - y;\n const maskOffset = maskY * maskW;\n const dstRowOffset = currentY * dw;\n for (let ix = 0; ix < actualW; ix++) {\n const currentX = finalX + ix;\n const maskX = currentX - x;\n const maskIndex = maskOffset + maskX;\n if (maskData[maskIndex]) {\n const current = dst32[dstRowOffset + currentX];\n if (current !== color) {\n dst32[dstRowOffset + currentX] = color;\n hasChanged = true;\n }\n }\n }\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KCk7XG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb2YgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IgdXNpbmcgYSBtYXNrLlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIG1hc2sgLSBUaGUgbWFzayBkZWZpbmluZyB0aGUgYXJlYSB0byBmaWxsLlxuICogQHBhcmFtIHggLSBTdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUgZm9yIHRoZSBtYXNrIHBsYWNlbWVudC5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZSBmb3IgdGhlIG1hc2sgcGxhY2VtZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YUJpbmFyeU1hc2sodGFyZ2V0OiBJUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBCaW5hcnlNYXNrLCB4ID0gMCwgeSA9IDApOiBib29sZWFuIHtcbiAgY29uc3QgbWFza1cgPSBtYXNrLnc7XG4gIGNvbnN0IG1hc2tIID0gbWFzay5oO1xuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh4LCB5LCBtYXNrVywgbWFza0gsIHRhcmdldC53aWR0aCwgdGFyZ2V0LmhlaWdodCwgU0NSQVRDSF9SRUNUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHtcbiAgICB4OiBmaW5hbFgsXG4gICAgeTogZmluYWxZLFxuICAgIHc6IGFjdHVhbFcsXG4gICAgaDogYWN0dWFsSFxuICB9ID0gY2xpcDtcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGE7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGEzMjtcbiAgY29uc3QgZHcgPSB0YXJnZXQud2lkdGg7XG4gIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3QgY3VycmVudFkgPSBmaW5hbFkgKyBpeTtcbiAgICBjb25zdCBtYXNrWSA9IGN1cnJlbnRZIC0geTtcbiAgICBjb25zdCBtYXNrT2Zmc2V0ID0gbWFza1kgKiBtYXNrVztcbiAgICBjb25zdCBkc3RSb3dPZmZzZXQgPSBjdXJyZW50WSAqIGR3O1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50WCA9IGZpbmFsWCArIGl4O1xuICAgICAgY29uc3QgbWFza1ggPSBjdXJyZW50WCAtIHg7XG4gICAgICBjb25zdCBtYXNrSW5kZXggPSBtYXNrT2Zmc2V0ICsgbWFza1g7XG4gICAgICBpZiAobWFza0RhdGFbbWFza0luZGV4XSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZHN0Um93T2Zmc2V0ICsgY3VycmVudFhdO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gY29sb3IpIHtcbiAgICAgICAgICBkc3QzMltkc3RSb3dPZmZzZXQgKyBjdXJyZW50WF0gPSBjb2xvcjtcbiAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQ2hhbmdlZDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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==","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\nexport function invertPixelData(target: IPixelData32, opts?: PixelMutateOptions): boolean {\n const mask = opts?.mask;\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 width = opts?.w ?? target.width;\n const height = opts?.h ?? target.height;\n const invertMask = opts?.invertMask ?? false;\n const clip = resolveRectClipping(targetX, targetY, width, height, target.width, target.height, SCRATCH_RECT);\n if (!clip.inBounds) return false;\n const {\n x,\n y,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = target.data32;\n const dw = target.width;\n const mPitch = mask?.w ?? width;\n const dx = x - targetX;\n const dy = y - targetY;\n let dIdx = y * dw + x;\n let mIdx = (my + dy) * mPitch + (mx + dx);\n const dStride = dw - actualW;\n const mStride = mPitch - actualW;\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n const maskData = mask.data;\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 (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n dIdx++;\n }\n dIdx += dStride;\n }\n }\n return true;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KCk7XG5leHBvcnQgZnVuY3Rpb24gaW52ZXJ0UGl4ZWxEYXRhKHRhcmdldDogSVBpeGVsRGF0YTMyLCBvcHRzPzogUGl4ZWxNdXRhdGVPcHRpb25zKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1hc2sgPSBvcHRzPy5tYXNrO1xuICBjb25zdCB0YXJnZXRYID0gb3B0cz8ueCA/PyAwO1xuICBjb25zdCB0YXJnZXRZID0gb3B0cz8ueSA/PyAwO1xuICBjb25zdCBteCA9IG9wdHM/Lm14ID8/IDA7XG4gIGNvbnN0IG15ID0gb3B0cz8ubXkgPz8gMDtcbiAgY29uc3Qgd2lkdGggPSBvcHRzPy53ID8/IHRhcmdldC53aWR0aDtcbiAgY29uc3QgaGVpZ2h0ID0gb3B0cz8uaCA/PyB0YXJnZXQuaGVpZ2h0O1xuICBjb25zdCBpbnZlcnRNYXNrID0gb3B0cz8uaW52ZXJ0TWFzayA/PyBmYWxzZTtcbiAgY29uc3QgY2xpcCA9IHJlc29sdmVSZWN0Q2xpcHBpbmcodGFyZ2V0WCwgdGFyZ2V0WSwgd2lkdGgsIGhlaWdodCwgdGFyZ2V0LndpZHRoLCB0YXJnZXQuaGVpZ2h0LCBTQ1JBVENIX1JFQ1QpO1xuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVybiBmYWxzZTtcbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICB3OiBhY3R1YWxXLFxuICAgIGg6IGFjdHVhbEhcbiAgfSA9IGNsaXA7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGEzMjtcbiAgY29uc3QgZHcgPSB0YXJnZXQud2lkdGg7XG4gIGNvbnN0IG1QaXRjaCA9IG1hc2s/LncgPz8gd2lkdGg7XG4gIGNvbnN0IGR4ID0geCAtIHRhcmdldFg7XG4gIGNvbnN0IGR5ID0geSAtIHRhcmdldFk7XG4gIGxldCBkSWR4ID0geSAqIGR3ICsgeDtcbiAgbGV0IG1JZHggPSAobXkgKyBkeSkgKiBtUGl0Y2ggKyAobXggKyBkeCk7XG4gIGNvbnN0IGRTdHJpZGUgPSBkdyAtIGFjdHVhbFc7XG4gIGNvbnN0IG1TdHJpZGUgPSBtUGl0Y2ggLSBhY3R1YWxXO1xuXG4gIC8vIE9wdGltaXphdGlvbjogU3BsaXQgbG9vcHMgdG8gYXZvaWQgY2hlY2tpbmcgYGlmIChtYXNrKWAgZm9yIGV2ZXJ5IHBpeGVsLlxuICBpZiAobWFzaykge1xuICAgIGNvbnN0IG1hc2tEYXRhID0gbWFzay5kYXRhO1xuICAgIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgICBjb25zdCBtVmFsID0gbWFza0RhdGFbbUlkeF07XG4gICAgICAgIGNvbnN0IGlzSGl0ID0gaW52ZXJ0TWFzayA/IG1WYWwgPT09IDAgOiBtVmFsID09PSAxO1xuICAgICAgICBpZiAoaXNIaXQpIHtcbiAgICAgICAgICAvLyBYT1Igd2l0aCAweDAwRkZGRkZGIGZsaXBzIFJHQiBiaXRzIGFuZCBpZ25vcmVzIEFscGhhICh0aGUgdG9wIDggYml0cylcbiAgICAgICAgICBkc3QzMltkSWR4XSA9IGRzdDMyW2RJZHhdIF4gMHgwMEZGRkZGRjtcbiAgICAgICAgfVxuICAgICAgICBkSWR4Kys7XG4gICAgICAgIG1JZHgrKztcbiAgICAgIH1cbiAgICAgIGRJZHggKz0gZFN0cmlkZTtcbiAgICAgIG1JZHggKz0gbVN0cmlkZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICAgIGRzdDMyW2RJZHhdID0gZHN0MzJbZElkeF0gXiAweDAwRkZGRkZGO1xuICAgICAgICBkSWR4Kys7XG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGU7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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.width;\n const h = opts?.h ?? target.height;\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/IHRhcmdldC53aWR0aDtcbiAgICAgIGNvbnN0IGggPSBvcHRzPy5oID8/IHRhcmdldC5oZWlnaHQ7XG4gICAgICBjb25zdCBkaWRDaGFuZ2UgPSB3cml0ZXIuYWNjdW11bGF0b3Iuc3RvcmVSZWdpb25CZWZvcmVTdGF0ZSh4LCB5LCB3LCBoKTtcbiAgICAgIHJldHVybiBkaWRDaGFuZ2UoaW52ZXJ0UGl4ZWxEYXRhKHRhcmdldCwgb3B0cykpO1xuICAgIH1cbiAgfTtcbn0pIHNhdGlzZmllcyBIaXN0b3J5TXV0YXRvcjxhbnksIERlcHM+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 { mutatorBlendMask } from './PixelMutator/mutatorBlendMask';\nimport { mutatorBlendColorPaintRect } from './PixelMutator/mutatorBlendColorPaintRect';\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtdXRhdG9yQXBwbHlBbHBoYU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlBbHBoYU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5QmluYXJ5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUJpbmFyeU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckFwcGx5TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQWxwaGFNYXNrIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQWxwaGFNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRCaW5hcnlNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZENvbG9yIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3InO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3JQYWludEFscGhhTWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRBbHBoYU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kQ29sb3JQYWludEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvclBhaW50QmluYXJ5TWFzayc7XG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRDb2xvclBhaW50TWFzayB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZE1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRNYXNrJztcbmltcG9ydCB7IG11dGF0b3JCbGVuZENvbG9yUGFpbnRSZWN0IH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3JQYWludFJlY3QnO1xuaW1wb3J0IHsgbXV0YXRvckJsZW5kUGl4ZWwgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCc7XG5pbXBvcnQgeyBtdXRhdG9yQmxlbmRQaXhlbERhdGEgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbERhdGEnO1xuaW1wb3J0IHsgbXV0YXRvckNsZWFyIH0gZnJvbSAnLi9QaXhlbE11dGF0b3IvbXV0YXRvckNsZWFyJztcbmltcG9ydCB7IG11dGF0b3JGaWxsLCBtdXRhdG9yRmlsbFJlY3QgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbCc7XG5pbXBvcnQgeyBtdXRhdG9yRmlsbEJpbmFyeU1hc2sgfSBmcm9tICcuL1BpeGVsTXV0YXRvci9tdXRhdG9yRmlsbEJpbmFyeU1hc2snO1xuaW1wb3J0IHsgbXV0YXRvckludmVydCB9IGZyb20gJy4vUGl4ZWxNdXRhdG9yL211dGF0b3JJbnZlcnQnO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VGdWxsUGl4ZWxNdXRhdG9yKHdyaXRlcjogUGl4ZWxXcml0ZXI8YW55Pikge1xuICByZXR1cm4ge1xuICAgIC8vIEBzb3J0XG4gICAgLi4ubXV0YXRvckFwcGx5QWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckFwcGx5QmluYXJ5TWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JBcHBseU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRBbHBoYU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRCaW5hcnlNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3Iod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRDb2xvclBhaW50QWxwaGFNYXNrKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kQ29sb3JQYWludEJpbmFyeU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yQmxlbmRDb2xvclBhaW50TWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZENvbG9yUGFpbnRSZWN0KHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kTWFzayh3cml0ZXIpLFxuICAgIC4uLm11dGF0b3JCbGVuZFBpeGVsKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckJsZW5kUGl4ZWxEYXRhKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckNsZWFyKHdyaXRlciksXG4gICAgLi4ubXV0YXRvckZpbGwod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbEJpbmFyeU1hc2sod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9yRmlsbFJlY3Qod3JpdGVyKSxcbiAgICAuLi5tdXRhdG9ySW52ZXJ0KHdyaXRlcilcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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","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","export function copyImageData({\n data,\n width,\n height\n}: ImageDataLike): ImageData {\n return new ImageData(data.slice(), width, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY29weUltYWdlRGF0YSh7XG4gIGRhdGEsXG4gIHdpZHRoLFxuICBoZWlnaHRcbn06IEltYWdlRGF0YUxpa2UpOiBJbWFnZURhdGEge1xuICByZXR1cm4gbmV3IEltYWdlRGF0YShkYXRhLnNsaWNlKCksIHdpZHRoLCBoZWlnaHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJbWFnZURhdGFMaWtlKHtcbiAgZGF0YSxcbiAgd2lkdGgsXG4gIGhlaWdodFxufTogSW1hZ2VEYXRhTGlrZSk6IEltYWdlRGF0YUxpa2Uge1xuICByZXR1cm4ge1xuICAgIGRhdGE6IGRhdGEuc2xpY2UoKSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\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//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGNvbnZlcnRzIHtAbGluayBJbWFnZURhdGF9IHRvIGEgZmFzdGVyIFVpbnQzMkFycmF5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSk6IFVpbnQzMkFycmF5IHtcbiAgcmV0dXJuIG5ldyBVaW50MzJBcnJheShpbWFnZURhdGEuZGF0YS5idWZmZXIsIGltYWdlRGF0YS5kYXRhLmJ5dGVPZmZzZXQsXG4gIC8vIFNoaWZ0IHJpZ2h0IGJ5IDIgaXMgYSBmYXN0IGJpdHdpc2UgZGl2aXNpb24gYnkgNC5cbiAgaW1hZ2VEYXRhLmRhdGEuYnl0ZUxlbmd0aCA+PiAyKTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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","const resample32Scratch = {\n data: null as null | Int32Array,\n width: 0,\n height: 0\n};\n\n/**\n * @internal\n */\ntype Resample32Result = {\n data: Int32Array;\n width: number;\n height: number;\n};\n\n/**\n * @internal\n */\nexport function resample32(srcData32: Uint32Array | Int32Array, srcW: number, srcH: number, factor: number): Resample32Result {\n const dstW = Math.max(1, srcW * factor | 0);\n const dstH = Math.max(1, srcH * factor | 0);\n const dstData = new Int32Array(dstW * dstH);\n\n // Use the reciprocal to map back precisely\n const scaleX = srcW / dstW;\n const scaleY = srcH / dstH;\n 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 resample32Scratch.data = dstData;\n resample32Scratch.width = dstW;\n resample32Scratch.height = dstH;\n return resample32Scratch as Resample32Result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCByZXNhbXBsZTMyU2NyYXRjaCA9IHtcbiAgZGF0YTogbnVsbCBhcyBudWxsIHwgSW50MzJBcnJheSxcbiAgd2lkdGg6IDAsXG4gIGhlaWdodDogMFxufTtcblxuLyoqXG4gKiAgQGludGVybmFsXG4gKi9cbnR5cGUgUmVzYW1wbGUzMlJlc3VsdCA9IHtcbiAgZGF0YTogSW50MzJBcnJheTtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59O1xuXG4vKipcbiAqICBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlMzIoc3JjRGF0YTMyOiBVaW50MzJBcnJheSB8IEludDMyQXJyYXksIHNyY1c6IG51bWJlciwgc3JjSDogbnVtYmVyLCBmYWN0b3I6IG51bWJlcik6IFJlc2FtcGxlMzJSZXN1bHQge1xuICBjb25zdCBkc3RXID0gTWF0aC5tYXgoMSwgc3JjVyAqIGZhY3RvciB8IDApO1xuICBjb25zdCBkc3RIID0gTWF0aC5tYXgoMSwgc3JjSCAqIGZhY3RvciB8IDApO1xuICBjb25zdCBkc3REYXRhID0gbmV3IEludDMyQXJyYXkoZHN0VyAqIGRzdEgpO1xuXG4gIC8vIFVzZSB0aGUgcmVjaXByb2NhbCB0byBtYXAgYmFjayBwcmVjaXNlbHlcbiAgY29uc3Qgc2NhbGVYID0gc3JjVyAvIGRzdFc7XG4gIGNvbnN0IHNjYWxlWSA9IHNyY0ggLyBkc3RIO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IGRzdEg7IHkrKykge1xuICAgIGNvbnN0IHNyY1kgPSBNYXRoLm1pbihzcmNIIC0gMSwgeSAqIHNjYWxlWSB8IDApO1xuICAgIGNvbnN0IHNyY1Jvd09mZnNldCA9IHNyY1kgKiBzcmNXO1xuICAgIGNvbnN0IGRzdFJvd09mZnNldCA9IHkgKiBkc3RXO1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgZHN0VzsgeCsrKSB7XG4gICAgICBjb25zdCBzcmNYID0gTWF0aC5taW4oc3JjVyAtIDEsIHggKiBzY2FsZVggfCAwKTtcbiAgICAgIGRzdERhdGFbZHN0Um93T2Zmc2V0ICsgeF0gPSBzcmNEYXRhMzJbc3JjUm93T2Zmc2V0ICsgc3JjWF0hO1xuICAgIH1cbiAgfVxuICByZXNhbXBsZTMyU2NyYXRjaC5kYXRhID0gZHN0RGF0YTtcbiAgcmVzYW1wbGUzMlNjcmF0Y2gud2lkdGggPSBkc3RXO1xuICByZXNhbXBsZTMyU2NyYXRjaC5oZWlnaHQgPSBkc3RIO1xuICByZXR1cm4gcmVzYW1wbGUzMlNjcmF0Y2ggYXMgUmVzYW1wbGUzMlJlc3VsdDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples ImageData by a specific factor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleImageData(source: ImageData, factor: number): ImageData {\n const src32 = new Uint32Array(source.data.buffer);\n const {\n data,\n width,\n height\n } = resample32(src32, source.width, source.height, factor);\n const uint8ClampedArray = new Uint8ClampedArray(data.buffer) as Uint8ClampedArray<ArrayBuffer>;\n return new ImageData(uint8ClampedArray, width, height);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc2FtcGxlcyBJbWFnZURhdGEgYnkgYSBzcGVjaWZpYyBmYWN0b3IuXG4gKiBGYWN0b3IgPiAxIHVwc2NhbGVzLCBGYWN0b3IgPCAxIGRvd25zY2FsZXMuXG4gKi9cbmltcG9ydCB7IHJlc2FtcGxlMzIgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNhbXBsZTMyJztcblxuLyoqXG4gKiBSZXNhbXBsZXMgSW1hZ2VEYXRhIGJ5IGEgc3BlY2lmaWMgZmFjdG9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVJbWFnZURhdGEoc291cmNlOiBJbWFnZURhdGEsIGZhY3RvcjogbnVtYmVyKTogSW1hZ2VEYXRhIHtcbiAgY29uc3Qgc3JjMzIgPSBuZXcgVWludDMyQXJyYXkoc291cmNlLmRhdGEuYnVmZmVyKTtcbiAgY29uc3Qge1xuICAgIGRhdGEsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSByZXNhbXBsZTMyKHNyYzMyLCBzb3VyY2Uud2lkdGgsIHNvdXJjZS5oZWlnaHQsIGZhY3Rvcik7XG4gIGNvbnN0IHVpbnQ4Q2xhbXBlZEFycmF5ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGRhdGEuYnVmZmVyKSBhcyBVaW50OENsYW1wZWRBcnJheTxBcnJheUJ1ZmZlcj47XG4gIHJldHVybiBuZXcgSW1hZ2VEYXRhKHVpbnQ4Q2xhbXBlZEFycmF5LCB3aWR0aCwgaGVpZ2h0KTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Base64EncodedUInt8Array, ImageDataLike, SerializedImageData } from '../_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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJhc2U2NEVuY29kZWRVSW50OEFycmF5LCBJbWFnZURhdGFMaWtlLCBTZXJpYWxpemVkSW1hZ2VEYXRhIH0gZnJvbSAnLi4vX3R5cGVzJztcbmV4cG9ydCBmdW5jdGlvbiBiYXNlNjRFbmNvZGVBcnJheUJ1ZmZlcihidWZmZXI6IEFycmF5QnVmZmVyTGlrZSk6IEJhc2U2NEVuY29kZWRVSW50OEFycmF5IHtcbiAgY29uc3QgdWludDggPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCdsYXRpbjEnKTtcbiAgY29uc3QgYmluYXJ5ID0gZGVjb2Rlci5kZWNvZGUodWludDgpO1xuICByZXR1cm4gYnRvYShiaW5hcnkpIGFzIEJhc2U2NEVuY29kZWRVSW50OEFycmF5O1xufVxuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NERlY29kZUFycmF5QnVmZmVyKGVuY29kZWQ6IEJhc2U2NEVuY29kZWRVSW50OEFycmF5KTogVWludDhDbGFtcGVkQXJyYXk8QXJyYXlCdWZmZXI+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","import { MaskType } from '../_types';\nimport { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(target: ImageData, source: ImageData, x: number, y: number, sx: number = 0, sy: number = 0, sw: number = source.width, sh: number = source.height, mask: Uint8Array | null = null, maskType: MaskType = MaskType.BINARY): void {\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data;\n const srcW = source.width;\n const srcData = source.data;\n const clip = resolveBlitClipping(x, y, sx, sy, sw, sh, dstW, dstH, srcW, source.height, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const useMask = !!mask;\n for (let row = 0; row < copyH; row++) {\n const currentDstY = dstY + row;\n const currentSrcY = srcY + row;\n const dstStart = (currentDstY * dstW + dstX) * 4;\n const srcStart = (currentSrcY * srcW + srcX) * 4;\n if (useMask && mask) {\n for (let ix = 0; ix < copyW; ix++) {\n const mi = currentSrcY * srcW + (srcX + ix);\n const alpha = mask[mi];\n if (alpha === 0) {\n continue;\n }\n const di = dstStart + ix * 4;\n const si = srcStart + ix * 4;\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si];\n dstData[di + 1] = srcData[si + 1];\n dstData[di + 2] = srcData[si + 2];\n dstData[di + 3] = srcData[si + 3];\n } else {\n const a = alpha / 255;\n const invA = 1 - a;\n dstData[di] = srcData[si] * a + dstData[di] * invA;\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA;\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA;\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA;\n }\n }\n } else {\n const byteLen = copyW * 4;\n const sub = srcData.subarray(srcStart, srcStart + byteLen);\n dstData.set(sub, dstStart);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KCk7XG5cbi8qKlxuICogV3JpdGVzIGltYWdlIGRhdGEgZnJvbSBhIHNvdXJjZSB0byBhIHRhcmdldCB3aXRoIHN1cHBvcnQgZm9yIGNsaXBwaW5nIGFuZCBhbHBoYSBtYXNraW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZGVzdGluYXRpb24gSW1hZ2VEYXRhIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0IHdoZXJlIGRyYXdpbmcgc3RhcnRzLlxuICogQHBhcmFtIHkgLSBUaGUgeS1jb29yZGluYXRlIGluIHRoZSB0YXJnZXQgd2hlcmUgZHJhd2luZyBzdGFydHMuXG4gKiBAcGFyYW0gc3ggLSBUaGUgeC1jb29yZGluYXRlIGluIHRoZSBzb3VyY2UgdG8gc3RhcnQgY29weWluZyBmcm9tLlxuICogQHBhcmFtIHN5IC0gVGhlIHktY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS5cbiAqIEBwYXJhbSBzdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvcHkuXG4gKiBAcGFyYW0gc2ggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY29weS5cbiAqIEBwYXJhbSBtYXNrIC0gQW4gb3B0aW9uYWwgVWludDhBcnJheSBtYXNrICgwLTI1NSkuIDAgaXMgdHJhbnNwYXJlbnQsIDI1NSBpcyBvcGFxdWUuXG4gKiBAcGFyYW0gbWFza1R5cGUgLSB0eXBlIG9mIG1hc2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhKHRhcmdldDogSW1hZ2VEYXRhLCBzb3VyY2U6IEltYWdlRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHN4OiBudW1iZXIgPSAwLCBzeTogbnVtYmVyID0gMCwgc3c6IG51bWJlciA9IHNvdXJjZS53aWR0aCwgc2g6IG51bWJlciA9IHNvdXJjZS5oZWlnaHQsIG1hc2s6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCwgbWFza1R5cGU6IE1hc2tUeXBlID0gTWFza1R5cGUuQklOQVJZKTogdm9pZCB7XG4gIGNvbnN0IGRzdFcgPSB0YXJnZXQud2lkdGg7XG4gIGNvbnN0IGRzdEggPSB0YXJnZXQuaGVpZ2h0O1xuICBjb25zdCBkc3REYXRhID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IHNyY1cgPSBzb3VyY2Uud2lkdGg7XG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YTtcbiAgY29uc3QgY2xpcCA9IHJlc29sdmVCbGl0Q2xpcHBpbmcoeCwgeSwgc3gsIHN5LCBzdywgc2gsIGRzdFcsIGRzdEgsIHNyY1csIHNvdXJjZS5oZWlnaHQsIFNDUkFUQ0hfQkxJVCk7XG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuO1xuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlIXG4gIH0gPSBjbGlwO1xuICBjb25zdCB1c2VNYXNrID0gISFtYXNrO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50RHN0WSA9IGRzdFkgKyByb3c7XG4gICAgY29uc3QgY3VycmVudFNyY1kgPSBzcmNZICsgcm93O1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGN1cnJlbnREc3RZICogZHN0VyArIGRzdFgpICogNDtcbiAgICBjb25zdCBzcmNTdGFydCA9IChjdXJyZW50U3JjWSAqIHNyY1cgKyBzcmNYKSAqIDQ7XG4gICAgaWYgKHVzZU1hc2sgJiYgbWFzaykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGNvcHlXOyBpeCsrKSB7XG4gICAgICAgIGNvbnN0IG1pID0gY3VycmVudFNyY1kgKiBzcmNXICsgKHNyY1ggKyBpeCk7XG4gICAgICAgIGNvbnN0IGFscGhhID0gbWFza1ttaV07XG4gICAgICAgIGlmIChhbHBoYSA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpID0gZHN0U3RhcnQgKyBpeCAqIDQ7XG4gICAgICAgIGNvbnN0IHNpID0gc3JjU3RhcnQgKyBpeCAqIDQ7XG4gICAgICAgIGlmIChtYXNrVHlwZSA9PT0gTWFza1R5cGUuQklOQVJZIHx8IGFscGhhID09PSAyNTUpIHtcbiAgICAgICAgICBkc3REYXRhW2RpXSA9IHNyY0RhdGFbc2ldO1xuICAgICAgICAgIGRzdERhdGFbZGkgKyAxXSA9IHNyY0RhdGFbc2kgKyAxXTtcbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl07XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDNdID0gc3JjRGF0YVtzaSArIDNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGEgPSBhbHBoYSAvIDI1NTtcbiAgICAgICAgICBjb25zdCBpbnZBID0gMSAtIGE7XG4gICAgICAgICAgZHN0RGF0YVtkaV0gPSBzcmNEYXRhW3NpXSAqIGEgKyBkc3REYXRhW2RpXSAqIGludkE7XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDFdID0gc3JjRGF0YVtzaSArIDFdICogYSArIGRzdERhdGFbZGkgKyAxXSAqIGludkE7XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDJdID0gc3JjRGF0YVtzaSArIDJdICogYSArIGRzdERhdGFbZGkgKyAyXSAqIGludkE7XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDNdID0gc3JjRGF0YVtzaSArIDNdICogYSArIGRzdERhdGFbZGkgKyAzXSAqIGludkE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnl0ZUxlbiA9IGNvcHlXICogNDtcbiAgICAgIGNvbnN0IHN1YiA9IHNyY0RhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgYnl0ZUxlbik7XG4gICAgICBkc3REYXRhLnNldChzdWIsIGRzdFN0YXJ0KTtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param target - The target to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A rect defining the destination region.\n */\nexport function writeImageDataBuffer(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 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 {\n width: dstW,\n height: dstH,\n data: dst\n } = target;\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\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 dst.set(data.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KCk7XG5cbi8qKlxuICogQ29waWVzIGEgcGl4ZWwgYnVmZmVyIGludG8gYSBzcGVjaWZpYyByZWdpb24gb2YgYW4ge0BsaW5rIEltYWdlRGF0YX0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBkaXJlY3QgbWVtb3J5IGNvcHkgZnJvbSBhIHtAbGluayBVaW50OENsYW1wZWRBcnJheX1cbiAqIGludG8gdGhlIHRhcmdldCB7QGxpbmsgSW1hZ2VEYXRhfSBidWZmZXIuIEl0IHN1cHBvcnRzIGJvdGgge0BsaW5rIFJlY3R9XG4gKiBvYmplY3RzIGFuZCBkaXNjcmV0ZSBjb29yZGluYXRlcy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCB0byB3cml0ZSBpbnRvLiBNdXN0IG1hdGNoIHRoZSByZWN0IHdpZHRoL2hlaWdodC5cbiAqIEBwYXJhbSBkYXRhIC0gVGhlIHNvdXJjZSBwaXhlbCBkYXRhIChSR0JBKS5cbiAqIEBwYXJhbSByZWN0IC0gQSByZWN0IGRlZmluaW5nIHRoZSBkZXN0aW5hdGlvbiByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YUJ1ZmZlcih0YXJnZXQ6IEltYWdlRGF0YSwgZGF0YTogVWludDhDbGFtcGVkQXJyYXksIHJlY3Q6IFJlY3QpOiB2b2lkO1xuLyoqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCB0byB3cml0ZSBpbnRvLlxuICogQHBhcmFtIGRhdGEgLSBUaGUgc291cmNlIHBpeGVsIGRhdGEgKFJHQkEpLiBNdXN0IG1hdGNoIHRoZSB3aWR0aC9oZWlnaHQuXG4gKiBAcGFyYW0geCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUgaW4gdGhlIHRhcmdldC5cbiAqIEBwYXJhbSB5IC0gVGhlIHN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUgaW4gdGhlIHRhcmdldC5cbiAqIEBwYXJhbSB3IC0gVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gdG8gd3JpdGUuXG4gKiBAcGFyYW0gaCAtIFRoZSBoZWlnaHQgb2YgdGhlIHJlZ2lvbiB0byB3cml0ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhQnVmZmVyKHRhcmdldDogSW1hZ2VEYXRhLCBkYXRhOiBVaW50OENsYW1wZWRBcnJheSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiB3cml0ZUltYWdlRGF0YUJ1ZmZlcih0YXJnZXQ6IEltYWdlRGF0YSwgZGF0YTogVWludDhDbGFtcGVkQXJyYXksIF94OiBSZWN0IHwgbnVtYmVyLCBfeT86IG51bWJlciwgX3c/OiBudW1iZXIsIF9oPzogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoXG4gIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnID8gX3ggOiB7XG4gICAgeDogX3gsXG4gICAgeTogX3khLFxuICAgIHc6IF93ISxcbiAgICBoOiBfaCFcbiAgfTtcbiAgY29uc3Qge1xuICAgIHdpZHRoOiBkc3RXLFxuICAgIGhlaWdodDogZHN0SCxcbiAgICBkYXRhOiBkc3RcbiAgfSA9IHRhcmdldDtcbiAgY29uc3QgY2xpcCA9IHJlc29sdmVCbGl0Q2xpcHBpbmcoeCwgeSwgMCwgMCwgdywgaCwgZHN0VywgZHN0SCwgdywgaCwgU0NSQVRDSF9CTElUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm47XG4gIGNvbnN0IHtcbiAgICB4OiBkc3RYLFxuICAgIHk6IGRzdFksXG4gICAgc3g6IHNyY1gsXG4gICAgc3k6IHNyY1ksXG4gICAgdzogY29weVcsXG4gICAgaDogY29weUhcbiAgfSA9IGNsaXA7XG4gIGNvbnN0IHJvd0xlbiA9IGNvcHlXICogNDtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weUg7IHJvdysrKSB7XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFgpICogNDtcbiAgICBjb25zdCBzcmNTdGFydCA9ICgoc3JjWSArIHJvdykgKiB3ICsgc3JjWCkgKiA0O1xuICAgIGRzdC5zZXQoZGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pLCBkc3RTdGFydCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\n\n/**\n * Represents an image using a palette-based indexing system.\n * Instead of storing 4 bytes (RGBA) per pixel, this class stores a single index\n * into a color palette. This format is optimized for memory efficiency and\n * high-speed pattern matching or recoloring operations.\n */\nexport class IndexedImage {\n /** The width of the image in pixels. */\n public readonly width: number;\n /** The height of the image in pixels. */\n public readonly height: number;\n /** Flat array of palette indices. Index = x + (y * width). */\n public readonly data: Int32Array;\n /** The palette of unique 32-bit colors (ABGR/RGBA packed) found in the image. */\n public readonly palette: Uint32Array;\n /** The specific index in the palette reserved for fully transparent pixels. */\n public readonly transparentPalletIndex: number;\n\n /**\n * @param width - Image width.\n * @param height - Image height.\n * @param data - The indexed pixel data.\n * @param palette - The array of packed colors.\n * @param transparentPalletIndex - The index representing alpha 0.\n */\n constructor(width: number, height: number, data: Int32Array, palette: Uint32Array, transparentPalletIndex: number) {\n this.width = width;\n this.height = height;\n this.data = data;\n this.palette = palette;\n this.transparentPalletIndex = transparentPalletIndex;\n }\n\n /**\n * Creates an IndexedImage from standard browser ImageData.\n * @param imageData - The source ImageData to convert.\n * @returns A new IndexedImage instance.\n */\n static fromImageData(imageData: ImageData): IndexedImage {\n return IndexedImage.fromRaw(imageData.data, imageData.width, imageData.height);\n }\n\n /**\n * Creates an IndexedImage from a raw byte buffer and dimensions.\n * Any pixel with an alpha channel of 0 is normalized to the transparent palette index.\n * @param data - Raw RGBA byte data.\n * @param width - Image width.\n * @param height - Image height.\n * @returns A new IndexedImage instance.\n */\n static fromRaw(data: Uint8ClampedArray, width: number, height: number): IndexedImage {\n const buffer = data.buffer;\n const rawData = new Uint32Array(buffer);\n const indexedData = new Int32Array(rawData.length);\n const colorMap = new Map<number, number>();\n const transparentColor = 0;\n const transparentPalletIndex = 0;\n\n // Initialize palette with normalized transparent color\n colorMap.set(transparentColor, transparentPalletIndex);\n 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 new IndexedImage(width, height, indexedData, palette, transparentPalletIndex);\n }\n\n /**\n * Retrieves the 32-bit packed color value at the given coordinates.\n * @param x - X coordinate.\n * @param y - Y coordinate.\n * @returns The packed color from the palette.\n */\n public getColorAt(x: number, y: number): Color32 {\n const index = x + y * this.width;\n const paletteIndex = this.data[index];\n return this.palette[paletteIndex] as Color32;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW1hZ2UgdXNpbmcgYSBwYWxldHRlLWJhc2VkIGluZGV4aW5nIHN5c3RlbS5cbiAqIEluc3RlYWQgb2Ygc3RvcmluZyA0IGJ5dGVzIChSR0JBKSBwZXIgcGl4ZWwsIHRoaXMgY2xhc3Mgc3RvcmVzIGEgc2luZ2xlIGluZGV4XG4gKiBpbnRvIGEgY29sb3IgcGFsZXR0ZS4gVGhpcyBmb3JtYXQgaXMgb3B0aW1pemVkIGZvciBtZW1vcnkgZWZmaWNpZW5jeSBhbmRcbiAqIGhpZ2gtc3BlZWQgcGF0dGVybiBtYXRjaGluZyBvciByZWNvbG9yaW5nIG9wZXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbmRleGVkSW1hZ2Uge1xuICAvKiogVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSB3aWR0aDogbnVtYmVyO1xuICAvKiogVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG4gIC8qKiBGbGF0IGFycmF5IG9mIHBhbGV0dGUgaW5kaWNlcy4gSW5kZXggPSB4ICsgKHkgKiB3aWR0aCkuICovXG4gIHB1YmxpYyByZWFkb25seSBkYXRhOiBJbnQzMkFycmF5O1xuICAvKiogVGhlIHBhbGV0dGUgb2YgdW5pcXVlIDMyLWJpdCBjb2xvcnMgKEFCR1IvUkdCQSBwYWNrZWQpIGZvdW5kIGluIHRoZSBpbWFnZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhbGV0dGU6IFVpbnQzMkFycmF5O1xuICAvKiogVGhlIHNwZWNpZmljIGluZGV4IGluIHRoZSBwYWxldHRlIHJlc2VydmVkIGZvciBmdWxseSB0cmFuc3BhcmVudCBwaXhlbHMuICovXG4gIHB1YmxpYyByZWFkb25seSB0cmFuc3BhcmVudFBhbGxldEluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB3aWR0aCAtIEltYWdlIHdpZHRoLlxuICAgKiBAcGFyYW0gaGVpZ2h0IC0gSW1hZ2UgaGVpZ2h0LlxuICAgKiBAcGFyYW0gZGF0YSAtIFRoZSBpbmRleGVkIHBpeGVsIGRhdGEuXG4gICAqIEBwYXJhbSBwYWxldHRlIC0gVGhlIGFycmF5IG9mIHBhY2tlZCBjb2xvcnMuXG4gICAqIEBwYXJhbSB0cmFuc3BhcmVudFBhbGxldEluZGV4IC0gVGhlIGluZGV4IHJlcHJlc2VudGluZyBhbHBoYSAwLlxuICAgKi9cbiAgY29uc3RydWN0b3Iod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGRhdGE6IEludDMyQXJyYXksIHBhbGV0dGU6IFVpbnQzMkFycmF5LCB0cmFuc3BhcmVudFBhbGxldEluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnBhbGV0dGUgPSBwYWxldHRlO1xuICAgIHRoaXMudHJhbnNwYXJlbnRQYWxsZXRJbmRleCA9IHRyYW5zcGFyZW50UGFsbGV0SW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBJbmRleGVkSW1hZ2UgZnJvbSBzdGFuZGFyZCBicm93c2VyIEltYWdlRGF0YS5cbiAgICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIGNvbnZlcnQuXG4gICAqIEByZXR1cm5zIEEgbmV3IEluZGV4ZWRJbWFnZSBpbnN0YW5jZS5cbiAgICovXG4gIHN0YXRpYyBmcm9tSW1hZ2VEYXRhKGltYWdlRGF0YTogSW1hZ2VEYXRhKTogSW5kZXhlZEltYWdlIHtcbiAgICByZXR1cm4gSW5kZXhlZEltYWdlLmZyb21SYXcoaW1hZ2VEYXRhLmRhdGEsIGltYWdlRGF0YS53aWR0aCwgaW1hZ2VEYXRhLmhlaWdodCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBJbmRleGVkSW1hZ2UgZnJvbSBhIHJhdyBieXRlIGJ1ZmZlciBhbmQgZGltZW5zaW9ucy5cbiAgICogQW55IHBpeGVsIHdpdGggYW4gYWxwaGEgY2hhbm5lbCBvZiAwIGlzIG5vcm1hbGl6ZWQgdG8gdGhlIHRyYW5zcGFyZW50IHBhbGV0dGUgaW5kZXguXG4gICAqIEBwYXJhbSBkYXRhIC0gUmF3IFJHQkEgYnl0ZSBkYXRhLlxuICAgKiBAcGFyYW0gd2lkdGggLSBJbWFnZSB3aWR0aC5cbiAgICogQHBhcmFtIGhlaWdodCAtIEltYWdlIGhlaWdodC5cbiAgICogQHJldHVybnMgQSBuZXcgSW5kZXhlZEltYWdlIGluc3RhbmNlLlxuICAgKi9cbiAgc3RhdGljIGZyb21SYXcoZGF0YTogVWludDhDbGFtcGVkQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKTogSW5kZXhlZEltYWdlIHtcbiAgICBjb25zdCBidWZmZXIgPSBkYXRhLmJ1ZmZlcjtcbiAgICBjb25zdCByYXdEYXRhID0gbmV3IFVpbnQzMkFycmF5KGJ1ZmZlcik7XG4gICAgY29uc3QgaW5kZXhlZERhdGEgPSBuZXcgSW50MzJBcnJheShyYXdEYXRhLmxlbmd0aCk7XG4gICAgY29uc3QgY29sb3JNYXAgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuICAgIGNvbnN0IHRyYW5zcGFyZW50Q29sb3IgPSAwO1xuICAgIGNvbnN0IHRyYW5zcGFyZW50UGFsbGV0SW5kZXggPSAwO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBwYWxldHRlIHdpdGggbm9ybWFsaXplZCB0cmFuc3BhcmVudCBjb2xvclxuICAgIGNvbG9yTWFwLnNldCh0cmFuc3BhcmVudENvbG9yLCB0cmFuc3BhcmVudFBhbGxldEluZGV4KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0RhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBpeGVsID0gcmF3RGF0YVtpXSBhcyBudW1iZXI7XG4gICAgICBjb25zdCBhbHBoYSA9IHBpeGVsID4+PiAyNCAmIDB4RkY7XG4gICAgICBjb25zdCBpc1RyYW5zcGFyZW50ID0gYWxwaGEgPT09IDA7XG4gICAgICBjb25zdCBjb2xvcktleSA9IGlzVHJhbnNwYXJlbnQgPyB0cmFuc3BhcmVudENvbG9yIDogcGl4ZWwgPj4+IDA7XG4gICAgICBsZXQgaWQgPSBjb2xvck1hcC5nZXQoY29sb3JLZXkpO1xuICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWQgPSBjb2xvck1hcC5zaXplO1xuICAgICAgICBjb2xvck1hcC5zZXQoY29sb3JLZXksIGlkKTtcbiAgICAgIH1cbiAgICAgIGluZGV4ZWREYXRhW2ldID0gaWQ7XG4gICAgfVxuICAgIGNvbnN0IHBhbGV0dGUgPSBVaW50MzJBcnJheS5mcm9tKGNvbG9yTWFwLmtleXMoKSk7XG4gICAgcmV0dXJuIG5ldyBJbmRleGVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgaW5kZXhlZERhdGEsIHBhbGV0dGUsIHRyYW5zcGFyZW50UGFsbGV0SW5kZXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgMzItYml0IHBhY2tlZCBjb2xvciB2YWx1ZSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuXG4gICAqIEBwYXJhbSB4IC0gWCBjb29yZGluYXRlLlxuICAgKiBAcGFyYW0geSAtIFkgY29vcmRpbmF0ZS5cbiAgICogQHJldHVybnMgVGhlIHBhY2tlZCBjb2xvciBmcm9tIHRoZSBwYWxldHRlLlxuICAgKi9cbiAgcHVibGljIGdldENvbG9yQXQoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBDb2xvcjMyIHtcbiAgICBjb25zdCBpbmRleCA9IHggKyB5ICogdGhpcy53aWR0aDtcbiAgICBjb25zdCBwYWxldHRlSW5kZXggPSB0aGlzLmRhdGFbaW5kZXhdO1xuICAgIHJldHVybiB0aGlzLnBhbGV0dGVbcGFsZXR0ZUluZGV4XSBhcyBDb2xvcjMyO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Calculates the frequency of each palette index based on the image data.\n * The index of the returned array maps directly to the index of the palette.\n * @param indexedImage - The source image containing data and palette definitions.\n * @returns A typed array where each entry represents the total count of that palette index.\n */\nexport function getIndexedImageColorCounts(indexedImage: IndexedImage): Int32Array {\n const data = indexedImage.data;\n const palette = indexedImage.palette;\n const frequencies = new Int32Array(palette.length);\n 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENhbGN1bGF0ZXMgdGhlIGZyZXF1ZW5jeSBvZiBlYWNoIHBhbGV0dGUgaW5kZXggYmFzZWQgb24gdGhlIGltYWdlIGRhdGEuXG4gKiBUaGUgaW5kZXggb2YgdGhlIHJldHVybmVkIGFycmF5IG1hcHMgZGlyZWN0bHkgdG8gdGhlIGluZGV4IG9mIHRoZSBwYWxldHRlLlxuICogQHBhcmFtIGluZGV4ZWRJbWFnZSAtIFRoZSBzb3VyY2UgaW1hZ2UgY29udGFpbmluZyBkYXRhIGFuZCBwYWxldHRlIGRlZmluaXRpb25zLlxuICogQHJldHVybnMgQSB0eXBlZCBhcnJheSB3aGVyZSBlYWNoIGVudHJ5IHJlcHJlc2VudHMgdGhlIHRvdGFsIGNvdW50IG9mIHRoYXQgcGFsZXR0ZSBpbmRleC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluZGV4ZWRJbWFnZUNvbG9yQ291bnRzKGluZGV4ZWRJbWFnZTogSW5kZXhlZEltYWdlKTogSW50MzJBcnJheSB7XG4gIGNvbnN0IGRhdGEgPSBpbmRleGVkSW1hZ2UuZGF0YTtcbiAgY29uc3QgcGFsZXR0ZSA9IGluZGV4ZWRJbWFnZS5wYWxldHRlO1xuICBjb25zdCBmcmVxdWVuY2llcyA9IG5ldyBJbnQzMkFycmF5KHBhbGV0dGUubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgY29sb3JJbmRleCA9IGRhdGFbaV0hO1xuICAgIGZyZXF1ZW5jaWVzW2NvbG9ySW5kZXhdKys7XG4gIH1cbiAgcmV0dXJuIGZyZXF1ZW5jaWVzO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 width,\n height,\n data,\n palette\n } = indexedImage;\n const result = new ImageData(width, height);\n const data32 = new Uint32Array(result.data.buffer);\n for (let i = 0; i < data.length; i++) {\n const paletteIndex = data[i];\n const color = palette[paletteIndex];\n data32[i] = color;\n }\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbnZlcnRzIGFuIEluZGV4ZWRJbWFnZSBiYWNrIGludG8gc3RhbmRhcmQgSW1hZ2VEYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhlZEltYWdlVG9JbWFnZURhdGEoaW5kZXhlZEltYWdlOiBJbmRleGVkSW1hZ2UpOiBJbWFnZURhdGEge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGRhdGEsXG4gICAgcGFsZXR0ZVxuICB9ID0gaW5kZXhlZEltYWdlO1xuICBjb25zdCByZXN1bHQgPSBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQpO1xuICBjb25zdCBkYXRhMzIgPSBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEuYnVmZmVyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcGFsZXR0ZUluZGV4ID0gZGF0YVtpXTtcbiAgICBjb25zdCBjb2xvciA9IHBhbGV0dGVbcGFsZXR0ZUluZGV4XTtcbiAgICBkYXRhMzJbaV0gPSBjb2xvcjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nimport { IndexedImage } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples an IndexedImage by a specific factor using nearest neighbor\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resampleIndexedImage(source: IndexedImage, factor: number): IndexedImage {\n const {\n data,\n width,\n height\n } = resample32(source.data, source.width, source.height, factor);\n return new IndexedImage(width, height, data, source.palette, source.transparentPalletIndex);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJlc2FtcGxlcyBhbiBJbmRleGVkSW1hZ2UgYnkgYSBzcGVjaWZpYyBmYWN0b3IgdXNpbmcgbmVhcmVzdCBuZWlnaGJvclxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5pbXBvcnQgeyBJbmRleGVkSW1hZ2UgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMic7XG5cbi8qKlxuICogUmVzYW1wbGVzIGFuIEluZGV4ZWRJbWFnZSBieSBhIHNwZWNpZmljIGZhY3RvciB1c2luZyBuZWFyZXN0IG5laWdoYm9yXG4gKiBGYWN0b3IgPiAxIHVwc2NhbGVzLCBGYWN0b3IgPCAxIGRvd25zY2FsZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNhbXBsZUluZGV4ZWRJbWFnZShzb3VyY2U6IEluZGV4ZWRJbWFnZSwgZmFjdG9yOiBudW1iZXIpOiBJbmRleGVkSW1hZ2Uge1xuICBjb25zdCB7XG4gICAgZGF0YSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfSA9IHJlc2FtcGxlMzIoc291cmNlLmRhdGEsIHNvdXJjZS53aWR0aCwgc291cmNlLmhlaWdodCwgZmFjdG9yKTtcbiAgcmV0dXJuIG5ldyBJbmRleGVkSW1hZ2Uod2lkdGgsIGhlaWdodCwgZGF0YSwgc291cmNlLnBhbGV0dGUsIHNvdXJjZS50cmFuc3BhcmVudFBhbGxldEluZGV4KTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 '../../support/error-strings';\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPRkZTQ1JFRU5fQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuLi8uLi9zdXBwb3J0L2Vycm9yLXN0cmluZ3MnO1xuXG4vKipcbiAqIFRocm93biB3aGVuIHRoZSB1c2VyIHByb3ZpZGVzIGEgZmlsZSB0aGF0IGlzbid0IGFuIGltYWdlLlxuICovXG5leHBvcnQgY2xhc3MgVW5zdXBwb3J0ZWRGb3JtYXRFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWltZVR5cGU6IHN0cmluZykge1xuICAgIHN1cGVyKGBGaWxlIHR5cGUgJHttaW1lVHlwZX0gaXMgbm90IGEgc3VwcG9ydGVkIGltYWdlIGZvcm1hdC5gKTtcbiAgICB0aGlzLm5hbWUgPSAnVW5zdXBwb3J0ZWRGb3JtYXRFcnJvcic7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGJyb3dzZXIge0BsaW5rIEZpbGV9IG9iamVjdCBpbnRvIHtAbGluayBJbWFnZURhdGF9LlxuICogVGhpcyB1dGlsaXR5IGhhbmRsZXMgdGhlIGZ1bGwgcGlwZWxpbmUgb2YgaW1hZ2UgZGVjb2RpbmcgdXNpbmcgaGFyZHdhcmUtYWNjZWxlcmF0ZWRcbiAqIEFQSXMge0BsaW5rIGNyZWF0ZUltYWdlQml0bWFwfSBhbmQge0BsaW5rIE9mZnNjcmVlbkNhbnZhc30uIEl0IGVuc3VyZXMgdGhhdCB1bmRlcmx5aW5nXG4gKiByZXNvdXJjZXMgbGlrZSBgSW1hZ2VCaXRtYXBgIGFyZSBwcm9wZXJseSBjbG9zZWQgZXZlbiBpZiB0aGUgY29udmVyc2lvbiBmYWlscy5cbiAqXG4gKiBAcGFyYW0gZmlsZSAtIFRoZSBpbWFnZSBmaWxlIHRvIGNvbnZlcnQuIENhbiBiZSBudWxsIG9yIHVuZGVmaW5lZC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIHJlc29sdmluZyB0byB0aGUgcGl4ZWwgZGF0YSBhcyB7QGxpbmsgSW1hZ2VEYXRhfSxcbiAqIG9yIGBudWxsYCBpZiBubyBmaWxlIHdhcyBwcm92aWRlZC5cbiAqIEB0aHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkRm9ybWF0RXJyb3J9XG4gKiBUaHJvd24gaWYgdGhlIHByb3ZpZGVkIGZpbGUncyBNSU1FIHR5cGUgZG9lcyBub3Qgc3RhcnQgd2l0aCBgaW1hZ2UvYC5cbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB0cnkge1xuICogICBjb25zdCBpbWFnZURhdGEgPSBhd2FpdCBmaWxlVG9JbWFnZURhdGEoZmlsZSk7XG4gKiAgIGlmIChpbWFnZURhdGEpIHtcbiAqICAgICBjb25zb2xlLmxvZygnUGl4ZWxzOicsIGltYWdlRGF0YS5kYXRhKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyKSB7XG4gKiAgIGlmIChlcnIgaW5zdGFuY2VvZiBVbnN1cHBvcnRlZEZvcm1hdEVycm9yKSB7XG4gKiAgICAgLy8gSGFuZGxlIGJhZCBmaWxlIHR5cGVcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBmaWxlVG9JbWFnZURhdGEoZmlsZTogRmlsZSB8IG51bGwgfCB1bmRlZmluZWQpOiBQcm9taXNlPEltYWdlRGF0YSB8IG51bGw+IHtcbiAgaWYgKCFmaWxlKSByZXR1cm4gbnVsbDtcbiAgaWYgKCFmaWxlLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRGb3JtYXRFcnJvcihmaWxlLnR5cGUpO1xuICB9XG4gIGxldCBiaXRtYXA6IEltYWdlQml0bWFwIHwgbnVsbCA9IG51bGw7XG4gIHRyeSB7XG4gICAgYml0bWFwID0gYXdhaXQgY3JlYXRlSW1hZ2VCaXRtYXAoZmlsZSk7XG4gICAgY29uc3QgY2FudmFzID0gbmV3IE9mZnNjcmVlbkNhbnZhcyhiaXRtYXAud2lkdGgsIGJpdG1hcC5oZWlnaHQpO1xuICAgIGNvbnN0IGN0eCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoT0ZGU0NSRUVOX0NBTlZBU19DVFhfRkFJTEVEKTtcbiAgICBjdHguZHJhd0ltYWdlKGJpdG1hcCwgMCwgMCk7XG4gICAgcmV0dXJuIGN0eC5nZXRJbWFnZURhdGEoMCwgMCwgYml0bWFwLndpZHRoLCBiaXRtYXAuaGVpZ2h0KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBiaXRtYXA/LmNsb3NlKCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","// 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 '../_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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBBbHBoYSBNYXNrXG4gKiBAcGFyYW0gdyAtIHdpZHRoXG4gKiBAcGFyYW0gaCAtIGhlaWdodFxuICogQHBhcmFtIGRhdGEgLSB2YWx1ZXMgMC0yNTVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VBbHBoYU1hc2sodzogbnVtYmVyLCBoOiBudW1iZXIsIGRhdGE/OiBVaW50OEFycmF5KTogQWxwaGFNYXNrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5BTFBIQSxcbiAgICBkYXRhOiBkYXRhID8/IG5ldyBVaW50OEFycmF5KHcgKiBoKSxcbiAgICB3LFxuICAgIGhcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIEJpbmFyeSBNYXNrXG4gKiBAcGFyYW0gdyAtIHdpZHRoXG4gKiBAcGFyYW0gaCAtIGhlaWdodFxuICogQHBhcmFtIGRhdGEgLSB2YWx1ZXMgMC0xXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQmluYXJ5TWFzayh3OiBudW1iZXIsIGg6IG51bWJlciwgZGF0YT86IFVpbnQ4QXJyYXkpOiBCaW5hcnlNYXNrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUlksXG4gICAgZGF0YTogZGF0YSA/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 { type Mask } from '../_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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE1hc2sgfSBmcm9tICcuLi9fdHlwZXMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgY29weSBvZiBhIG1hc2suXG4gKiBVc2VzIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlcidzIHNsaWNlIG1ldGhvZCBmb3IgaGlnaC1wZXJmb3JtYW5jZSBtZW1vcnkgY29weWluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlNYXNrPFQgZXh0ZW5kcyBNYXNrPihzcmM6IFQpOiBUIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBzcmMudHlwZSxcbiAgICBkYXRhOiBzcmMuZGF0YS5zbGljZSgpLFxuICAgIHc6IHNyYy53LFxuICAgIGg6IHNyYy5oXG4gIH0gYXMgVDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type Mask } from '../_types';\n\n/**\n * Extracts a rectangular region from a 1D {@link Uint8Array} mask.\n * This utility calculates the necessary offsets based on the `maskWidth` to\n * slice out a specific area.\n *\n * @param mask - The 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE1hc2sgfSBmcm9tICcuLi9fdHlwZXMnO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgcmVjdGFuZ3VsYXIgcmVnaW9uIGZyb20gYSAxRCB7QGxpbmsgVWludDhBcnJheX0gbWFzay5cbiAqIFRoaXMgdXRpbGl0eSBjYWxjdWxhdGVzIHRoZSBuZWNlc3Nhcnkgb2Zmc2V0cyBiYXNlZCBvbiB0aGUgYG1hc2tXaWR0aGAgdG9cbiAqIHNsaWNlIG91dCBhIHNwZWNpZmljIGFyZWEuXG4gKlxuICogQHBhcmFtIG1hc2sgLSBUaGUgdGFyZ2V0IG1hc2suXG4gKiBAcGFyYW0gcmVjdCAtIEEgcmVjdCBkZWZpbmluZyB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIG5ldyBtYXNrIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCByZWdpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TWFzazxUIGV4dGVuZHMgTWFzaz4obWFzazogVCwgcmVjdDogUmVjdCk6IFQ7XG5cbi8qKlxuICogQHBhcmFtIG1hc2sgLSBUaGUgdGFyZ2V0IG1hc2suXG4gKiBAcGFyYW0geCAtIFRoZSBzdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFRoZSBzdGFydGluZyB2ZXJ0aWNhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHcgLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byBleHRyYWN0LlxuICogQHBhcmFtIGggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEByZXR1cm5zIEEgbmV3IHtAbGluayBVaW50OEFycmF5fSBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgcmVnaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hc2s8VCBleHRlbmRzIE1hc2s+KG1hc2s6IFQsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IFQ7XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdE1hc2s8VCBleHRlbmRzIE1hc2s+KG1hc2s6IFQsIHhPclJlY3Q6IG51bWJlciB8IFJlY3QsIHk/OiBudW1iZXIsIHc/OiBudW1iZXIsIGg/OiBudW1iZXIpOiBUIHtcbiAgbGV0IGZpbmFsWDogbnVtYmVyO1xuICBsZXQgZmluYWxZOiBudW1iZXI7XG4gIGxldCBmaW5hbFc6IG51bWJlcjtcbiAgbGV0IGZpbmFsSDogbnVtYmVyO1xuICBpZiAodHlwZW9mIHhPclJlY3QgPT09ICdvYmplY3QnKSB7XG4gICAgZmluYWxYID0geE9yUmVjdC54O1xuICAgIGZpbmFsWSA9IHhPclJlY3QueTtcbiAgICBmaW5hbFcgPSB4T3JSZWN0Lnc7XG4gICAgZmluYWxIID0geE9yUmVjdC5oO1xuICB9IGVsc2Uge1xuICAgIGZpbmFsWCA9IHhPclJlY3Q7XG4gICAgZmluYWxZID0geSE7XG4gICAgZmluYWxXID0gdyE7XG4gICAgZmluYWxIID0gaCE7XG4gIH1cbiAgY29uc3Qgb3V0ID0ge1xuICAgIHR5cGU6IG1hc2sudHlwZSxcbiAgICB3OiBmaW5hbFcsXG4gICAgaDogZmluYWxILFxuICAgIGRhdGE6IG5ldyBVaW50OEFycmF5KGZpbmFsVyAqIGZpbmFsSClcbiAgfSBhcyBUO1xuXG4gIC8vIENhbGN1bGF0ZSB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoZSBzb3VyY2UgbWFzayBiYXNlZCBvbiB0aGUgYnVmZmVyIHNpemVcbiAgY29uc3Qgc3JjSCA9IG1hc2suaDtcbiAgY29uc3Qgc3RyaWRlID0gbWFzay53O1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBmaW5hbEg7IHJvdysrKSB7XG4gICAgY29uc3QgY3VycmVudFNyY1kgPSBmaW5hbFkgKyByb3c7XG5cbiAgICAvLyBTYWZldHkgQ2hlY2s6IElmIHRoZSByZXF1ZXN0ZWQgcm93IGlzIG91dHNpZGUgdGhlIHNvdXJjZSBtYXNrLCBza2lwIGl0IChsZWF2ZSBhcyAwKVxuICAgIGlmIChjdXJyZW50U3JjWSA8IDAgfHwgY3VycmVudFNyY1kgPj0gc3JjSCkgY29udGludWU7XG5cbiAgICAvLyBDYWxjdWxhdGUgdmFsaWQgaG9yaXpvbnRhbCByYW5nZSB3aXRoaW4gdGhlIHNvdXJjZSBzdHJpZGVcbiAgICAvLyBXZSBvbmx5IGNvcHkgaWYgc3JjWCBpcyB3aXRoaW4gdGhlIGFjdHVhbCBib3VuZHMgb2YgdGhlIHNvdXJjZSB3aWR0aFxuICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgZmluYWxYKTtcbiAgICBjb25zdCBlbmQgPSBNYXRoLm1pbihzdHJpZGUsIGZpbmFsWCArIGZpbmFsVyk7XG4gICAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgICBjb25zdCBzcmNPZmZzZXQgPSBjdXJyZW50U3JjWSAqIHN0cmlkZSArIHN0YXJ0O1xuICAgICAgY29uc3QgZHN0T2Zmc2V0ID0gcm93ICogZmluYWxXICsgKHN0YXJ0IC0gZmluYWxYKTtcbiAgICAgIGNvbnN0IGNvdW50ID0gZW5kIC0gc3RhcnQ7XG4gICAgICBvdXQuZGF0YS5zZXQobWFzay5kYXRhLnN1YmFycmF5KHNyY09mZnNldCwgc3JjT2Zmc2V0ICsgY291bnQpLCBkc3RPZmZzZXQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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 weight = effectiveM * globalAlpha + 128 >> 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 dstData[dIdx] = da * weight + 128 >> 8;\n }\n }\n }\n sIdx++;\n dIdx++;\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1lcmdlcyAyIGFscGhhIG1hc2tzIHZhbHVlcyBhcmUgMC0yNTVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlQWxwaGFNYXNrcyhkc3Q6IEFscGhhTWFzaywgc3JjOiBBbHBoYU1hc2ssIG9wdHM6IE1lcmdlQWxwaGFNYXNrc09wdGlvbnMpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHg6IHRhcmdldFggPSAwLFxuICAgIHk6IHRhcmdldFkgPSAwLFxuICAgIHc6IHdpZHRoID0gMCxcbiAgICBoOiBoZWlnaHQgPSAwLFxuICAgIGFscGhhOiBnbG9iYWxBbHBoYSA9IDI1NSxcbiAgICBteCA9IDAsXG4gICAgbXkgPSAwLFxuICAgIGludmVydE1hc2sgPSBmYWxzZVxuICB9ID0gb3B0cztcbiAgaWYgKHdpZHRoIDw9IDApIHJldHVybjtcbiAgaWYgKGhlaWdodCA8PSAwKSByZXR1cm47XG4gIGlmIChnbG9iYWxBbHBoYSA9PT0gMCkgcmV0dXJuO1xuICBjb25zdCBkc3REYXRhID0gZHN0LmRhdGE7XG4gIGNvbnN0IHNyY0RhdGEgPSBzcmMuZGF0YTtcbiAgY29uc3Qgc3JjV2lkdGggPSBzcmMudztcbiAgY29uc3QgZHN0V2lkdGggPSBkc3QudztcbiAgY29uc3Qgc3RhcnRYID0gTWF0aC5tYXgoMCwgLXRhcmdldFgsIC1teCk7XG4gIGNvbnN0IHN0YXJ0WSA9IE1hdGgubWF4KDAsIC10YXJnZXRZLCAtbXkpO1xuICBjb25zdCBlbmRYID0gTWF0aC5taW4od2lkdGgsIGRzdFdpZHRoIC0gdGFyZ2V0WCwgc3JjV2lkdGggLSBteCk7XG4gIGNvbnN0IGVuZFkgPSBNYXRoLm1pbihoZWlnaHQsIGRzdC5oIC0gdGFyZ2V0WSwgc3JjLmggLSBteSk7XG4gIGlmIChzdGFydFggPj0gZW5kWCkgcmV0dXJuO1xuICBpZiAoc3RhcnRZID49IGVuZFkpIHJldHVybjtcbiAgZm9yIChsZXQgaXkgPSBzdGFydFk7IGl5IDwgZW5kWTsgaXkrKykge1xuICAgIGNvbnN0IGR5ID0gdGFyZ2V0WSArIGl5O1xuICAgIGNvbnN0IHN5ID0gbXkgKyBpeTtcbiAgICBsZXQgZElkeCA9IGR5ICogZHN0V2lkdGggKyB0YXJnZXRYICsgc3RhcnRYO1xuICAgIGxldCBzSWR4ID0gc3kgKiBzcmNXaWR0aCArIG14ICsgc3RhcnRYO1xuICAgIGZvciAobGV0IGl4ID0gc3RhcnRYOyBpeCA8IGVuZFg7IGl4KyspIHtcbiAgICAgIGNvbnN0IHJhd00gPSBzcmNEYXRhW3NJZHhdO1xuICAgICAgLy8gVW5pZmllZCBsb2dpYyBicmFuY2ggaW5zaWRlIHRoZSBob3QgcGF0aFxuICAgICAgY29uc3QgZWZmZWN0aXZlTSA9IGludmVydE1hc2sgPyAyNTUgLSByYXdNIDogcmF3TTtcbiAgICAgIGxldCB3ZWlnaHQgPSAwO1xuICAgICAgaWYgKGVmZmVjdGl2ZU0gPT09IDApIHtcbiAgICAgICAgd2VpZ2h0ID0gMDtcbiAgICAgIH0gZWxzZSBpZiAoZWZmZWN0aXZlTSA9PT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IGdsb2JhbEFscGhhO1xuICAgICAgfSBlbHNlIGlmIChnbG9iYWxBbHBoYSA9PT0gMjU1KSB7XG4gICAgICAgIHdlaWdodCA9IGVmZmVjdGl2ZU07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3ZWlnaHQgPSBlZmZlY3RpdmVNICogZ2xvYmFsQWxwaGEgKyAxMjggPj4gODtcbiAgICAgIH1cbiAgICAgIGlmICh3ZWlnaHQgIT09IDI1NSkge1xuICAgICAgICBpZiAod2VpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgZHN0RGF0YVtkSWR4XSA9IDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZGEgPSBkc3REYXRhW2RJZHhdO1xuICAgICAgICAgIGlmIChkYSA9PT0gMjU1KSB7XG4gICAgICAgICAgICBkc3REYXRhW2RJZHhdID0gd2VpZ2h0O1xuICAgICAgICAgIH0gZWxzZSBpZiAoZGEgIT09IDApIHtcbiAgICAgICAgICAgIGRzdERhdGFbZElkeF0gPSBkYSAqIHdlaWdodCArIDEyOCA+PiA4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgc0lkeCsrO1xuICAgICAgZElkeCsrO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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 '../_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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFJlY3QgfSBmcm9tICcuLi9fdHlwZXMnO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlY3RzQm91bmRzPFQgZXh0ZW5kcyBSZWN0PihyZWN0czogVFtdKTogVCB7XG4gIGlmIChyZWN0cy5sZW5ndGggPT09IDEpIHJldHVybiB7XG4gICAgLi4ucmVjdHNbMF1cbiAgfTtcbiAgbGV0IG1pblggPSBJbmZpbml0eSxcbiAgICBtaW5ZID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5LFxuICAgIG1heFkgPSAtSW5maW5pdHk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCByID0gcmVjdHNbaV07XG4gICAgY29uc3QgeDEgPSByLng7XG4gICAgY29uc3QgeTEgPSByLnk7XG4gICAgY29uc3QgeDIgPSB4MSArIHIudztcbiAgICBjb25zdCB5MiA9IHkxICsgci5oO1xuICAgIGlmICh4MSA8IG1pblgpIG1pblggPSB4MTtcbiAgICBpZiAoeTEgPCBtaW5ZKSBtaW5ZID0geTE7XG4gICAgaWYgKHgyID4gbWF4WCkgbWF4WCA9IHgyO1xuICAgIGlmICh5MiA+IG1heFkpIG1heFkgPSB5MjtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IG1pblgsXG4gICAgeTogbWluWSxcbiAgICB3OiBtYXhYIC0gbWluWCxcbiAgICBoOiBtYXhZIC0gbWluWVxuICB9IGFzIFQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBnZXRSZWN0c0JvdW5kcyB9IGZyb20gJy4uL1JlY3QvZ2V0UmVjdHNCb3VuZHMnO1xuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlMkJpbmFyeU1hc2tSZWN0cyhhOiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0LCBiOiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0KTogTnVsbGFibGVCaW5hcnlNYXNrUmVjdCB7XG4gIGNvbnN0IGJvdW5kcyA9IGdldFJlY3RzQm91bmRzKFthLCBiXSk7XG5cbiAgLy8gSWYgYm90aCBhcmUgZnVsbHkgc2VsZWN0ZWQsIGNoZWNrIGlmIHRoZXkgZm9ybSBhIHBlcmZlY3QsIGdhcGxlc3MgcmVjdGFuZ2xlXG4gIGlmICgoYS5kYXRhID09PSBudWxsIHx8IGEuZGF0YSA9PT0gdW5kZWZpbmVkKSAmJiAoYi5kYXRhID09PSBudWxsIHx8IGIuZGF0YSA9PT0gdW5kZWZpbmVkKSkge1xuICAgIGNvbnN0IGl4ID0gTWF0aC5tYXgoYS54LCBiLngpO1xuICAgIGNvbnN0IGl5ID0gTWF0aC5tYXgoYS55LCBiLnkpO1xuICAgIGNvbnN0IGlyID0gTWF0aC5taW4oYS54ICsgYS53LCBiLnggKyBiLncpO1xuICAgIGNvbnN0IGliID0gTWF0aC5taW4oYS55ICsgYS5oLCBiLnkgKyBiLmgpO1xuICAgIGNvbnN0IGl3ID0gTWF0aC5tYXgoMCwgaXIgLSBpeCk7XG4gICAgY29uc3QgaWggPSBNYXRoLm1heCgwLCBpYiAtIGl5KTtcbiAgICBjb25zdCBpbnRlcnNlY3Rpb25BcmVhID0gaXcgKiBpaDtcbiAgICBjb25zdCBhcmVhQSA9IGEudyAqIGEuaDtcbiAgICBjb25zdCBhcmVhQiA9IGIudyAqIGIuaDtcbiAgICBjb25zdCBib3VuZHNBcmVhID0gYm91bmRzLncgKiBib3VuZHMuaDtcbiAgICBpZiAoYm91bmRzQXJlYSA9PT0gYXJlYUEgKyBhcmVhQiAtIGludGVyc2VjdGlvbkFyZWEpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmJvdW5kcyxcbiAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgdHlwZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gIH1cbiAgY29uc3QgbWFza0RhdGEgPSBuZXcgVWludDhBcnJheShib3VuZHMudyAqIGJvdW5kcy5oKTtcblxuICAvLyAtLS0gV3JpdGUgQSdzIGNvbnRyaWJ1dGlvbiAtLS1cbiAgY29uc3QgYU9mZlkgPSBhLnkgLSBib3VuZHMueTtcbiAgY29uc3QgYU9mZlggPSBhLnggLSBib3VuZHMueDtcbiAgaWYgKGEuZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGEuZGF0YSA9PT0gbnVsbCkge1xuICAgIGZvciAobGV0IGF5ID0gMDsgYXkgPCBhLmg7IGF5KyspIHtcbiAgICAgIGNvbnN0IGRlc3RSb3cgPSAoYU9mZlkgKyBheSkgKiBib3VuZHMudyArIGFPZmZYO1xuICAgICAgbWFza0RhdGEuZmlsbCgxLCBkZXN0Um93LCBkZXN0Um93ICsgYS53KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgYXkgPSAwOyBheSA8IGEuaDsgYXkrKykge1xuICAgICAgY29uc3Qgc3JjUm93ID0gYXkgKiBhLnc7XG4gICAgICBjb25zdCBkZXN0Um93ID0gKGFPZmZZICsgYXkpICogYm91bmRzLncgKyBhT2ZmWDtcbiAgICAgIG1hc2tEYXRhLnNldChhLmRhdGEuc3ViYXJyYXkoc3JjUm93LCBzcmNSb3cgKyBhLncpLCBkZXN0Um93KTtcbiAgICB9XG4gIH1cblxuICAvLyAtLS0gT1IgQidzIGNvbnRyaWJ1dGlvbiAtLS1cbiAgY29uc3QgYk9mZlkgPSBiLnkgLSBib3VuZHMueTtcbiAgY29uc3QgYk9mZlggPSBiLnggLSBib3VuZHMueDtcbiAgaWYgKGIuZGF0YSA9PT0gdW5kZWZpbmVkIHx8IGIuZGF0YSA9PT0gbnVsbCkge1xuICAgIGZvciAobGV0IGJ5ID0gMDsgYnkgPCBiLmg7IGJ5KyspIHtcbiAgICAgIGNvbnN0IGRlc3RSb3cgPSAoYk9mZlkgKyBieSkgKiBib3VuZHMudyArIGJPZmZYO1xuICAgICAgbWFza0RhdGEuZmlsbCgxLCBkZXN0Um93LCBkZXN0Um93ICsgYi53KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgYnkgPSAwOyBieSA8IGIuaDsgYnkrKykge1xuICAgICAgY29uc3Qgc3JjUm93ID0gYnkgKiBiLnc7XG4gICAgICBjb25zdCBkZXN0Um93ID0gKGJPZmZZICsgYnkpICogYm91bmRzLncgKyBiT2ZmWDtcbiAgICAgIGZvciAobGV0IGJ4ID0gMDsgYnggPCBiLnc7IGJ4KyspIHtcbiAgICAgICAgbWFza0RhdGFbZGVzdFJvdyArIGJ4XSB8PSBiLmRhdGFbc3JjUm93ICsgYnhdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLmJvdW5kcyxcbiAgICBkYXRhOiBtYXNrRGF0YSxcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUllcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 '../_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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gc3VidHJhY3RCaW5hcnlNYXNrUmVjdHMoY3VycmVudDogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdLCBzdWJ0cmFjdGluZzogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdKTogTnVsbGFibGVCaW5hcnlNYXNrUmVjdFtdIHtcbiAgbGV0IHJlc3VsdCA9IFsuLi5jdXJyZW50XTtcbiAgZm9yIChjb25zdCBzdWIgb2Ygc3VidHJhY3RpbmcpIHtcbiAgICBjb25zdCBuZXh0OiBOdWxsYWJsZUJpbmFyeU1hc2tSZWN0W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgcmVzdWx0KSB7XG4gICAgICBjb25zdCBpeCA9IE1hdGgubWF4KHIueCwgc3ViLngpO1xuICAgICAgY29uc3QgaXkgPSBNYXRoLm1heChyLnksIHN1Yi55KTtcbiAgICAgIGNvbnN0IGl4MiA9IE1hdGgubWluKHIueCArIHIudywgc3ViLnggKyBzdWIudyk7XG4gICAgICBjb25zdCBpeTIgPSBNYXRoLm1pbihyLnkgKyByLmgsIHN1Yi55ICsgc3ViLmgpO1xuICAgICAgaWYgKGl4ID49IGl4MiB8fCBpeSA+PSBpeTIpIHtcbiAgICAgICAgbmV4dC5wdXNoKHIpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gU3BsaXQgciBpbnRvIHVwIHRvIDQgcGllY2VzIGFyb3VuZCB0aGUgaW50ZXJzZWN0aW9uLlxuICAgICAgLy8gRXh0cmFjdCBkaXJlY3RseSBmcm9tIHIubWFzayDigJQgbm8gaW50ZXJtZWRpYXRlIGNvcHksIG5vIG11dGF0aW9uLlxuICAgICAgLy9cbiAgICAgIC8vICAg4pSM4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAgICAvLyAgIOKUgiAgICAgVE9QICAgICAg4pSCICByLnkgLi4gaXkgICAgICAoZnVsbCB3aWR0aClcbiAgICAgIC8vICAg4pSc4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSs4pSA4pSA4pSA4pSkXG4gICAgICAvLyAgIOKUgkxFRlTilIIgc3ViIOKUglJHVOKUgiAgaXkgLi4gaXkyICAgICAgKHNpZGUgc3RyaXBzKVxuICAgICAgLy8gICDilJzilIDilIDilIDilIDilLTilIDilIDilIDilIDilIDilLTilIDilIDilIDilKRcbiAgICAgIC8vICAg4pSCICAgIEJPVFRPTSAgICDilIIgIGl5MiAuLiByLnkrci5oIChmdWxsIHdpZHRoKVxuICAgICAgLy8gICDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcblxuICAgICAgaWYgKHIueSA8IGl5KSBwdXNoUGllY2UobmV4dCwgciwgci54LCByLnksIHIudywgaXkgLSByLnkpO1xuICAgICAgaWYgKGl5MiA8IHIueSArIHIuaCkgcHVzaFBpZWNlKG5leHQsIHIsIHIueCwgaXkyLCByLncsIHIueSArIHIuaCAtIGl5Mik7XG4gICAgICBpZiAoci54IDwgaXgpIHB1c2hQaWVjZShuZXh0LCByLCByLngsIGl5LCBpeCAtIHIueCwgaXkyIC0gaXkpO1xuICAgICAgaWYgKGl4MiA8IHIueCArIHIudykgcHVzaFBpZWNlKG5leHQsIHIsIGl4MiwgaXksIHIueCArIHIudyAtIGl4MiwgaXkyIC0gaXkpO1xuICAgIH1cbiAgICByZXN1bHQgPSBuZXh0O1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0cmFjdCBzdWItcmVnaW9uICh4LCB5LCB3LCBoKSBpbiBnbG9iYWwgY29vcmRzIGZyb20gcidzIG1hc2sgYW5kIHB1c2hcbiAqIG9udG8gZGVzdC4gSWYgci5tYXNrIGlzIG51bGwgKGZ1bGx5IHNlbGVjdGVkKSB0aGUgcGllY2UgaXMgYWxzbyBudWxsIOKAlFxuICogemVybyBhbGxvY2F0aW9ucyBvbiB0aGUgaGFwcHkgcGF0aC5cbiAqL1xuZnVuY3Rpb24gcHVzaFBpZWNlKGRlc3Q6IE51bGxhYmxlQmluYXJ5TWFza1JlY3RbXSwgcjogTnVsbGFibGVCaW5hcnlNYXNrUmVjdCwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZCB7XG4gIGlmIChyLmRhdGEgPT09IG51bGwgfHwgci5kYXRhID09PSB1bmRlZmluZWQpIHtcbiAgICBkZXN0LnB1c2goe1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3LFxuICAgICAgaCxcbiAgICAgIGRhdGE6IG51bGwsXG4gICAgICB0eXBlOiBudWxsXG4gICAgfSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ29vcmRzIGxvY2FsIHRvIHIubWFza1xuICBjb25zdCBseCA9IHggLSByLng7XG4gIGNvbnN0IGx5ID0geSAtIHIueTtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OEFycmF5KHcgKiBoKTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaDsgcm93KyspIHtcbiAgICBkYXRhLnNldChyLmRhdGEuc3ViYXJyYXkoKGx5ICsgcm93KSAqIHIudyArIGx4LCAobHkgKyByb3cpICogci53ICsgbHggKyB3KSwgcm93ICogdyk7XG4gIH1cbiAgZGVzdC5wdXNoKHtcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoLFxuICAgIGRhdGEsXG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZXG4gIH0pO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { CANVAS_CTX_FAILED } from '../../support/error-strings';\nexport type PaintBufferCanvasRenderer = ReturnType<typeof makePaintBufferCanvasRenderer>;\n\n/**\n *\n * @param offscreenCanvasClass - @internal\n */\nexport function makePaintBufferCanvasRenderer(paintBuffer: PaintBuffer, offscreenCanvasClass = OffscreenCanvas) {\n const config = paintBuffer.config;\n const tileSize = config.tileSize;\n const tileShift = config.tileShift;\n const lookup = paintBuffer.lookup;\n const canvas = new offscreenCanvasClass(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, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uLy4uL3N1cHBvcnQvZXJyb3Itc3RyaW5ncyc7XG5leHBvcnQgdHlwZSBQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZVBhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXI+O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gb2Zmc2NyZWVuQ2FudmFzQ2xhc3MgLSBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyKHBhaW50QnVmZmVyOiBQYWludEJ1ZmZlciwgb2Zmc2NyZWVuQ2FudmFzQ2xhc3MgPSBPZmZzY3JlZW5DYW52YXMpIHtcbiAgY29uc3QgY29uZmlnID0gcGFpbnRCdWZmZXIuY29uZmlnO1xuICBjb25zdCB0aWxlU2l6ZSA9IGNvbmZpZy50aWxlU2l6ZTtcbiAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwO1xuICBjb25zdCBjYW52YXMgPSBuZXcgb2Zmc2NyZWVuQ2FudmFzQ2xhc3ModGlsZVNpemUsIHRpbGVTaXplKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIodGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGFscGhhID0gMjU1LCBjb21wT3BlcmF0aW9uOiBHbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInKTogdm9pZCB7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gYWxwaGEgLyAyNTU7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBPcGVyYXRpb247XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkeCA9IHRpbGUudHggPDwgdGlsZVNoaWZ0O1xuICAgICAgICBjb25zdCBkeSA9IHRpbGUudHkgPDwgdGlsZVNoaWZ0O1xuICAgICAgICBjdHgucHV0SW1hZ2VEYXRhKHRpbGUuaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICAgICAgdGFyZ2V0Q3R4LmRyYXdJbWFnZShjYW52YXMsIGR4LCBkeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldEN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_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 data,\n w: size,\n h: size,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gbWFrZUNpcmNsZVBhaW50QWxwaGFNYXNrKHNpemU6IG51bWJlciwgZmFsbE9mZjogKGQ6IG51bWJlcikgPT4gbnVtYmVyID0gZCA9PiBkKTogUGFpbnRBbHBoYU1hc2sge1xuICBjb25zdCBhcmVhID0gc2l6ZSAqIHNpemU7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKTtcbiAgY29uc3QgcmFkaXVzID0gc2l6ZSAvIDI7XG4gIGNvbnN0IGludlIgPSAxIC8gcmFkaXVzO1xuICBjb25zdCBjZW50ZXJPZmZzZXQgPSAtTWF0aC5jZWlsKHJhZGl1cyAtIDAuNSk7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgc2l6ZTsgeSsrKSB7XG4gICAgY29uc3Qgcm93T2Zmc2V0ID0geSAqIHNpemU7XG4gICAgY29uc3QgZHkgPSB5IC0gcmFkaXVzICsgMC41O1xuICAgIGNvbnN0IGR5MiA9IGR5ICogZHk7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBzaXplOyB4KyspIHtcbiAgICAgIGNvbnN0IGR4ID0geCAtIHJhZGl1cyArIDAuNTtcbiAgICAgIGNvbnN0IGRpc3RTcXIgPSBkeCAqIGR4ICsgZHkyO1xuICAgICAgaWYgKGRpc3RTcXIgPD0gcmFkaXVzICogcmFkaXVzKSB7XG4gICAgICAgIGNvbnN0IGRpc3QgPSBNYXRoLnNxcnQoZGlzdFNxcikgKiBpbnZSO1xuXG4gICAgICAgIC8vIFBhc3MgMS4wIGF0IGNlbnRlciwgMC4wIGF0IGVkZ2VcbiAgICAgICAgY29uc3Qgc3RyZW5ndGggPSBmYWxsT2ZmKDEgLSBkaXN0KTtcbiAgICAgICAgaWYgKHN0cmVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGludGVuc2l0eSA9IHN0cmVuZ3RoICogMjU1IHwgMDtcbiAgICAgICAgICBkYXRhW3Jvd09mZnNldCArIHhdID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBpbnRlbnNpdHkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkFMUEhBLFxuICAgIGRhdGEsXG4gICAgdzogc2l6ZSxcbiAgICBoOiBzaXplLFxuICAgIGNlbnRlck9mZnNldFg6IGNlbnRlck9mZnNldCxcbiAgICBjZW50ZXJPZmZzZXRZOiBjZW50ZXJPZmZzZXRcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nexport function makeCirclePaintBinaryMask(size: number): PaintBinaryMask {\n const area = size * size;\n const data = new Uint8Array(area);\n const radius = size / 2;\n const centerOffset = -Math.ceil(radius - 0.5);\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 <= radius * radius) {\n data[y * size + x] = 1;\n }\n }\n }\n return {\n type: MaskType.BINARY,\n data,\n w: size,\n h: size,\n centerOffsetX: centerOffset,\n centerOffsetY: centerOffset\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gbWFrZUNpcmNsZVBhaW50QmluYXJ5TWFzayhzaXplOiBudW1iZXIpOiBQYWludEJpbmFyeU1hc2sge1xuICBjb25zdCBhcmVhID0gc2l6ZSAqIHNpemU7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKTtcbiAgY29uc3QgcmFkaXVzID0gc2l6ZSAvIDI7XG4gIGNvbnN0IGNlbnRlck9mZnNldCA9IC1NYXRoLmNlaWwocmFkaXVzIC0gMC41KTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBzaXplOyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHNpemU7IHgrKykge1xuICAgICAgY29uc3QgZHggPSB4IC0gcmFkaXVzICsgMC41O1xuICAgICAgY29uc3QgZHkgPSB5IC0gcmFkaXVzICsgMC41O1xuICAgICAgY29uc3QgZGlzdFNxciA9IGR4ICogZHggKyBkeSAqIGR5O1xuICAgICAgaWYgKGRpc3RTcXIgPD0gcmFkaXVzICogcmFkaXVzKSB7XG4gICAgICAgIGRhdGFbeSAqIHNpemUgKyB4XSA9IDE7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIGRhdGEsXG4gICAgdzogc2l6ZSxcbiAgICBoOiBzaXplLFxuICAgIGNlbnRlck9mZnNldFg6IGNlbnRlck9mZnNldCxcbiAgICBjZW50ZXJPZmZzZXRZOiBjZW50ZXJPZmZzZXRcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { MaskType } from '../_types';\nexport function makePaintBinaryMask(mask: BinaryMask): PaintBinaryMask {\n return {\n type: MaskType.BINARY,\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 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhaW50QmluYXJ5TWFzayhtYXNrOiBCaW5hcnlNYXNrKTogUGFpbnRCaW5hcnlNYXNrIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiBNYXNrVHlwZS5CSU5BUlksXG4gICAgZGF0YTogbWFzay5kYXRhLFxuICAgIHc6IG1hc2sudyxcbiAgICBoOiBtYXNrLmgsXG4gICAgY2VudGVyT2Zmc2V0WDogLShtYXNrLncgPj4gMSksXG4gICAgY2VudGVyT2Zmc2V0WTogLShtYXNrLmggPj4gMSlcbiAgfTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYWtlUGFpbnRBbHBoYU1hc2sobWFzazogQWxwaGFNYXNrKTogUGFpbnRBbHBoYU1hc2sge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IE1hc2tUeXBlLkFMUEhBLFxuICAgIGRhdGE6IG1hc2suZGF0YSxcbiAgICB3OiBtYXNrLncsXG4gICAgaDogbWFzay5oLFxuICAgIGNlbnRlck9mZnNldFg6IC0obWFzay53ID4+IDEpLFxuICAgIGNlbnRlck9mZnNldFk6IC0obWFzay5oID4+IDEpXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_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 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5leHBvcnQgZnVuY3Rpb24gbWFrZVJlY3RGYWxsb2ZmUGFpbnRBbHBoYU1hc2sod2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIsIGZhbGxPZmY6IChkOiBudW1iZXIpID0+IG51bWJlciA9IGQgPT4gZCk6IFBhaW50QWxwaGFNYXNrIHtcbiAgY29uc3QgZlB4ID0gTWF0aC5mbG9vcih3aWR0aCAvIDIpO1xuICBjb25zdCBmUHkgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpO1xuICBjb25zdCBpbnZIYWxmVyA9IDIgLyB3aWR0aDtcbiAgY29uc3QgaW52SGFsZkggPSAyIC8gaGVpZ2h0O1xuICBjb25zdCBvZmZYID0gd2lkdGggJSAyID09PSAwID8gMC41IDogMDtcbiAgY29uc3Qgb2ZmWSA9IGhlaWdodCAlIDIgPT09IDAgPyAwLjUgOiAwO1xuICBjb25zdCBhcmVhID0gd2lkdGggKiBoZWlnaHQ7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhBcnJheShhcmVhKTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGNvbnN0IGR5ID0gTWF0aC5hYnMoeSAtIGZQeSArIG9mZlkpICogaW52SGFsZkg7XG4gICAgY29uc3Qgcm93T2Zmc2V0ID0geSAqIHdpZHRoO1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgZHggPSBNYXRoLmFicyh4IC0gZlB4ICsgb2ZmWCkgKiBpbnZIYWxmVztcblxuICAgICAgLy8gQ2hlYnlzaGV2IGRpc3RhbmNlIChzcXVhcmUvcmVjdCBzaGFwZSlcbiAgICAgIGNvbnN0IGRpc3QgPSBkeCA+IGR5ID8gZHggOiBkeTtcbiAgICAgIC8vIFBhc3MgMS4wIGF0IGNlbnRlciwgMC4wIGF0IGVkZ2VcbiAgICAgIGNvbnN0IHN0cmVuZ3RoID0gZmFsbE9mZigxIC0gZGlzdCk7XG4gICAgICBpZiAoc3RyZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IGludGVuc2l0eSA9IHN0cmVuZ3RoICogMjU1IHwgMDtcbiAgICAgICAgZGF0YVtyb3dPZmZzZXQgKyB4XSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgaW50ZW5zaXR5KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgdHlwZTogTWFza1R5cGUuQUxQSEEsXG4gICAgZGF0YTogZGF0YSxcbiAgICB3OiB3aWR0aCxcbiAgICBoOiBoZWlnaHQsXG4gICAgY2VudGVyT2Zmc2V0WDogLSh3aWR0aCA+PiAxKSxcbiAgICBjZW50ZXJPZmZzZXRZOiAtKGhlaWdodCA+PiAxKVxuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import type { ImageDataLike, IPixelData } from '../_types';\nimport { imageDataToUInt32Array } from '../ImageData/imageDataToUInt32Array';\nexport class PixelData<T extends ImageDataLike = ImageData> implements IPixelData<T> {\n readonly data32: Uint32Array;\n readonly imageData: T;\n readonly width: number;\n readonly height: number;\n constructor(imageData: T) {\n this.data32 = imageDataToUInt32Array(imageData);\n this.imageData = imageData;\n this.width = imageData.width;\n this.height = imageData.height;\n }\n set(imageData: T): void {\n ;\n (this as any).imageData = imageData;\n (this as any).data32 = imageDataToUInt32Array(imageData);\n (this as any).width = imageData.width;\n (this as any).height = imageData.height;\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEltYWdlRGF0YUxpa2UsIElQaXhlbERhdGEgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgaW1hZ2VEYXRhVG9VSW50MzJBcnJheSB9IGZyb20gJy4uL0ltYWdlRGF0YS9pbWFnZURhdGFUb1VJbnQzMkFycmF5JztcbmV4cG9ydCBjbGFzcyBQaXhlbERhdGE8VCBleHRlbmRzIEltYWdlRGF0YUxpa2UgPSBJbWFnZURhdGE+IGltcGxlbWVudHMgSVBpeGVsRGF0YTxUPiB7XG4gIHJlYWRvbmx5IGRhdGEzMjogVWludDMyQXJyYXk7XG4gIHJlYWRvbmx5IGltYWdlRGF0YTogVDtcbiAgcmVhZG9ubHkgd2lkdGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKGltYWdlRGF0YTogVCkge1xuICAgIHRoaXMuZGF0YTMyID0gaW1hZ2VEYXRhVG9VSW50MzJBcnJheShpbWFnZURhdGEpO1xuICAgIHRoaXMuaW1hZ2VEYXRhID0gaW1hZ2VEYXRhO1xuICAgIHRoaXMud2lkdGggPSBpbWFnZURhdGEud2lkdGg7XG4gICAgdGhpcy5oZWlnaHQgPSBpbWFnZURhdGEuaGVpZ2h0O1xuICB9XG4gIHNldChpbWFnZURhdGE6IFQpOiB2b2lkIHtcbiAgICA7XG4gICAgKHRoaXMgYXMgYW55KS5pbWFnZURhdGEgPSBpbWFnZURhdGE7XG4gICAgKHRoaXMgYXMgYW55KS5kYXRhMzIgPSBpbWFnZURhdGFUb1VJbnQzMkFycmF5KGltYWdlRGF0YSk7XG4gICAgKHRoaXMgYXMgYW55KS53aWR0aCA9IGltYWdlRGF0YS53aWR0aDtcbiAgICAodGhpcyBhcyBhbnkpLmhlaWdodCA9IGltYWdlRGF0YS5oZWlnaHQ7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { type AlphaMask, type BinaryMask, MaskType } from '../_types';\nimport { applyAlphaMaskToPixelData } from './applyAlphaMaskToPixelData';\nimport { applyBinaryMaskToPixelData } from './applyBinaryMaskToPixelData';\nexport function applyMaskToPixelData(dst: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEFscGhhTWFzaywgdHlwZSBCaW5hcnlNYXNrLCBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBhcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi9hcHBseUFscGhhTWFza1RvUGl4ZWxEYXRhJztcbmltcG9ydCB7IGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhIH0gZnJvbSAnLi9hcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSc7XG5leHBvcnQgZnVuY3Rpb24gYXBwbHlNYXNrVG9QaXhlbERhdGEoZHN0OiBJUGl4ZWxEYXRhMzIsIG1hc2s6IE1hc2ssIG9wdHM/OiBBcHBseU1hc2tUb1BpeGVsRGF0YU9wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgcmV0dXJuIGFwcGx5QmluYXJ5TWFza1RvUGl4ZWxEYXRhKGRzdCwgbWFzayBhcyBCaW5hcnlNYXNrLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YShkc3QsIG1hc2sgYXMgQWxwaGFNYXNrLCBvcHRzKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { MaskType } from '../_types';\nimport { blendColorPixelDataAlphaMask } from './blendColorPixelDataAlphaMask';\nimport { blendColorPixelDataBinaryMask } from './blendColorPixelDataBinaryMask';\nexport function blendColorPixelDataMask(dst: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi9ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YU1hc2soZHN0OiBJUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBNYXNrLCBvcHRzPzogQ29sb3JCbGVuZE1hc2tPcHRpb25zKTogYm9vbGVhbiB7XG4gIGlmIChtYXNrLnR5cGUgPT09IE1hc2tUeXBlLkJJTkFSWSkge1xuICAgIHJldHVybiBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayhkc3QsIGNvbG9yLCBtYXNrLCBvcHRzKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhkc3QsIGNvbG9yLCBtYXNrLCBvcHRzKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmNvbnN0IFNDUkFUQ0hfT1BUUyA9IHtcbiAgeDogMCxcbiAgeTogMCxcbiAgYWxwaGE6IDI1NSxcbiAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3Rcbn07XG5leHBvcnQgZnVuY3Rpb24gYmxlbmRDb2xvclBpeGVsRGF0YVBhaW50QWxwaGFNYXNrKGRzdDogSVBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgbWFzazogUGFpbnRBbHBoYU1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHR4ID0geCArIG1hc2suY2VudGVyT2Zmc2V0WDtcbiAgY29uc3QgdHkgPSB5ICsgbWFzay5jZW50ZXJPZmZzZXRZO1xuICBTQ1JBVENIX09QVFMueCA9IHR4O1xuICBTQ1JBVENIX09QVFMueSA9IHR5O1xuICBTQ1JBVENIX09QVFMuYWxwaGEgPSBhbHBoYTtcbiAgU0NSQVRDSF9PUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhkc3QsIGNvbG9yLCBtYXNrLCBTQ1JBVENIX09QVFMpO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4vYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snO1xuY29uc3QgU0NSQVRDSF9PUFRTID0ge1xuICB4OiAwLFxuICB5OiAwLFxuICBhbHBoYTogMjU1LFxuICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdFxufTtcbmV4cG9ydCBmdW5jdGlvbiBibGVuZENvbG9yUGl4ZWxEYXRhUGFpbnRCaW5hcnlNYXNrKGRzdDogSVBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgbWFzazogUGFpbnRCaW5hcnlNYXNrLCB4OiBudW1iZXIsIHk6IG51bWJlciwgYWxwaGEgPSAyNTUsIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCB0eCA9IHggKyBtYXNrLmNlbnRlck9mZnNldFg7XG4gIGNvbnN0IHR5ID0geSArIG1hc2suY2VudGVyT2Zmc2V0WTtcbiAgU0NSQVRDSF9PUFRTLnggPSB0eDtcbiAgU0NSQVRDSF9PUFRTLnkgPSB0eTtcbiAgU0NSQVRDSF9PUFRTLmFscGhhID0gYWxwaGE7XG4gIFNDUkFUQ0hfT1BUUy5ibGVuZEZuID0gYmxlbmRGbjtcbiAgcmV0dXJuIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrKGRzdCwgY29sb3IsIG1hc2ssIFNDUkFUQ0hfT1BUUyk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_types';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\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: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBzb3VyY2VPdmVyUGVyZmVjdCB9IGZyb20gJy4uL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5pbXBvcnQgeyBibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrIH0gZnJvbSAnLi9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmltcG9ydCB7IGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi9ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5jb25zdCBTQ1JBVENIX09QVFMgPSB7XG4gIHg6IDAsXG4gIHk6IDAsXG4gIGFscGhhOiAyNTUsXG4gIGJsZW5kRm46IHNvdXJjZU92ZXJQZXJmZWN0XG59O1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kQ29sb3JQaXhlbERhdGFQYWludE1hc2soZHN0OiBJUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBQYWludE1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHR4ID0geCArIG1hc2suY2VudGVyT2Zmc2V0WDtcbiAgY29uc3QgdHkgPSB5ICsgbWFzay5jZW50ZXJPZmZzZXRZO1xuICBTQ1JBVENIX09QVFMueCA9IHR4O1xuICBTQ1JBVENIX09QVFMueSA9IHR5O1xuICBTQ1JBVENIX09QVFMuYWxwaGEgPSBhbHBoYTtcbiAgU0NSQVRDSF9PUFRTLmJsZW5kRm4gPSBibGVuZEZuO1xuICBpZiAobWFzay50eXBlID09PSBNYXNrVHlwZS5CSU5BUlkpIHtcbiAgICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2soZHN0LCBjb2xvciwgbWFzaywgU0NSQVRDSF9PUFRTKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayhkc3QsIGNvbG9yLCBtYXNrLCBTQ1JBVENIX09QVFMpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { MaskType } from '../_types';\nimport { blendPixelDataAlphaMask } from './blendPixelDataAlphaMask';\nimport { blendPixelDataBinaryMask } from './blendPixelDataBinaryMask';\nexport function blendPixelDataMask(target: IPixelData32, src: IPixelData32, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4vYmxlbmRQaXhlbERhdGFBbHBoYU1hc2snO1xuaW1wb3J0IHsgYmxlbmRQaXhlbERhdGFCaW5hcnlNYXNrIH0gZnJvbSAnLi9ibGVuZFBpeGVsRGF0YUJpbmFyeU1hc2snO1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhTWFzayh0YXJnZXQ6IElQaXhlbERhdGEzMiwgc3JjOiBJUGl4ZWxEYXRhMzIsIG1hc2s6IE1hc2ssIG9wdHM/OiBQaXhlbEJsZW5kTWFza09wdGlvbnMpOiBib29sZWFuIHtcbiAgaWYgKG1hc2sudHlwZSA9PT0gTWFza1R5cGUuQklOQVJZKSB7XG4gICAgcmV0dXJuIGJsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayh0YXJnZXQsIHNyYywgbWFzaywgb3B0cyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGJsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrKHRhcmdldCwgc3JjLCBtYXNrLCBvcHRzKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, paintBuffer: PaintBuffer, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJsZW5kQ29sb3IzMiB9IGZyb20gJy4uL190eXBlcyc7XG5pbXBvcnQgeyBibGVuZFBpeGVsRGF0YSB9IGZyb20gJy4vYmxlbmRQaXhlbERhdGEnO1xuY29uc3QgU0NSQVRDSF9PUFRTID0ge1xuICB4OiAwLFxuICB5OiAwLFxuICBhbHBoYTogMjU1LFxuICBibGVuZEZuOiB1bmRlZmluZWQgYXMgQmxlbmRDb2xvcjMyIHwgdW5kZWZpbmVkXG59O1xuZXhwb3J0IGZ1bmN0aW9uIGJsZW5kUGl4ZWxEYXRhUGFpbnRCdWZmZXIodGFyZ2V0OiBJUGl4ZWxEYXRhMzIsIHBhaW50QnVmZmVyOiBQYWludEJ1ZmZlciwgYWxwaGEgPSAyNTUsIGJsZW5kRm4/OiBCbGVuZENvbG9yMzIsIGJsZW5kUGl4ZWxEYXRhRm4gPSBibGVuZFBpeGVsRGF0YSk6IHZvaWQge1xuICBjb25zdCB0aWxlU2hpZnQgPSBwYWludEJ1ZmZlci5jb25maWcudGlsZVNoaWZ0O1xuICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdGlsZSA9IGxvb2t1cFtpXTtcbiAgICBpZiAodGlsZSkge1xuICAgICAgY29uc3QgeCA9IHRpbGUudHggPDwgdGlsZVNoaWZ0O1xuICAgICAgY29uc3QgeSA9IHRpbGUudHkgPDwgdGlsZVNoaWZ0O1xuICAgICAgU0NSQVRDSF9PUFRTLnggPSB4O1xuICAgICAgU0NSQVRDSF9PUFRTLnkgPSB5O1xuICAgICAgU0NSQVRDSF9PUFRTLmFscGhhID0gYWxwaGE7XG4gICAgICBTQ1JBVENIX09QVFMuYmxlbmRGbiA9IGJsZW5kRm47XG4gICAgICBibGVuZFBpeGVsRGF0YUZuKHRhcmdldCwgdGlsZSwgU0NSQVRDSF9PUFRTKTtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedRect, resolveRectClipping } from '../Internal/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link IPixelData32} 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: IPixelData32, 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: IPixelData32, color: Color32, x: number, y: number, w: number, h: number): void;\nexport function fillPixelDataFast(dst: IPixelData32, color: Color32, _x?: Partial<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 ?? 0;\n y = _x.y ?? 0;\n w = _x.w ?? dst.width;\n h = _x.h ?? dst.height;\n } else if (typeof _x === 'number') {\n x = _x;\n y = _y!;\n w = _w!;\n h = _h!;\n } else {\n x = 0;\n y = 0;\n w = dst.width;\n h = dst.height;\n }\n const clip = resolveRectClipping(x, y, w, h, dst.width, dst.height, SCRATCH_RECT);\n if (!clip.inBounds) return;\n\n // Use the clipped values\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data32;\n const dw = dst.width;\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.height && finalX === 0 && finalY === 0) {\n dst32.fill(color);\n return;\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (finalY + iy) * dw + finalX;\n const end = start + actualW;\n dst32.fill(color, start, end);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9SRUNUID0gbWFrZUNsaXBwZWRSZWN0KCk7XG5cbi8qKlxuICogRmlsbHMgYSByZWdpb24gb3IgdGhlIHtAbGluayBJUGl4ZWxEYXRhMzJ9IGJ1ZmZlciB3aXRoIGEgc29saWQgY29sb3IuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIGZhc3RlciB0aGFuIHtAbGluayBmaWxsUGl4ZWxEYXRhfSBidXQgZG9lcyBub3RcbiAqIHJldHVybiBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyBjaGFuZ2VzIHdlcmUgbWFkZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0gcmVjdCAtIERlZmluZXMgdGhlIGFyZWEgdG8gZmlsbC4gSWYgb21pdHRlZCwgdGhlIGVudGlyZVxuICogYnVmZmVyIGlzIGZpbGxlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFGYXN0KHRhcmdldDogSVBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgcmVjdD86IFBhcnRpYWw8UmVjdD4pOiB2b2lkO1xuLyoqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhRmFzdChkc3Q6IElQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YUZhc3QoZHN0OiBJUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBfeD86IFBhcnRpYWw8UmVjdD4gfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiB2b2lkIHtcbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcbiAgbGV0IHc6IG51bWJlcjtcbiAgbGV0IGg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBfeCA9PT0gJ29iamVjdCcpIHtcbiAgICB4ID0gX3gueCA/PyAwO1xuICAgIHkgPSBfeC55ID8/IDA7XG4gICAgdyA9IF94LncgPz8gZHN0LndpZHRoO1xuICAgIGggPSBfeC5oID8/IGRzdC5oZWlnaHQ7XG4gIH0gZWxzZSBpZiAodHlwZW9mIF94ID09PSAnbnVtYmVyJykge1xuICAgIHggPSBfeDtcbiAgICB5ID0gX3khO1xuICAgIHcgPSBfdyE7XG4gICAgaCA9IF9oITtcbiAgfSBlbHNlIHtcbiAgICB4ID0gMDtcbiAgICB5ID0gMDtcbiAgICB3ID0gZHN0LndpZHRoO1xuICAgIGggPSBkc3QuaGVpZ2h0O1xuICB9XG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlUmVjdENsaXBwaW5nKHgsIHksIHcsIGgsIGRzdC53aWR0aCwgZHN0LmhlaWdodCwgU0NSQVRDSF9SRUNUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm47XG5cbiAgLy8gVXNlIHRoZSBjbGlwcGVkIHZhbHVlc1xuICBjb25zdCB7XG4gICAgeDogZmluYWxYLFxuICAgIHk6IGZpbmFsWSxcbiAgICB3OiBhY3R1YWxXLFxuICAgIGg6IGFjdHVhbEhcbiAgfSA9IGNsaXA7XG4gIGNvbnN0IGRzdDMyID0gZHN0LmRhdGEzMjtcbiAgY29uc3QgZHcgPSBkc3Qud2lkdGg7XG5cbiAgLy8gT3B0aW1pemF0aW9uOiBJZiBmaWxsaW5nIHRoZSBlbnRpcmUgYnVmZmVyLCB1c2UgdGhlIG5hdGl2ZSAuZmlsbCgpXG4gIGlmIChhY3R1YWxXID09PSBkdyAmJiBhY3R1YWxIID09PSBkc3QuaGVpZ2h0ICYmIGZpbmFsWCA9PT0gMCAmJiBmaW5hbFkgPT09IDApIHtcbiAgICBkc3QzMi5maWxsKGNvbG9yKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBSb3ctYnktcm93IGZpbGwgZm9yIHBhcnRpYWwgcmVjdGFuZ2xlc1xuICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgIGNvbnN0IHN0YXJ0ID0gKGZpbmFsWSArIGl5KSAqIGR3ICsgZmluYWxYO1xuICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgYWN0dWFsVztcbiAgICBkc3QzMi5maWxsKGNvbG9yLCBzdGFydCwgZW5kKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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: IPixelData32, rect?: Partial<BinaryMaskRect>): void {\n fillPixelDataFast(dst, 0 as Color32, rect);\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgZmlsbFBpeGVsRGF0YUZhc3QgfSBmcm9tICcuL2ZpbGxQaXhlbERhdGFGYXN0JztcblxuLyoqXG4gKiBDbGVhcnMgYSByZWdpb24gb2YgdGhlIFBpeGVsRGF0YSB0byB0cmFuc3BhcmVudCAoMHgwMDAwMDAwMCkuXG4gKiBJbnRlcm5hbGx5IHVzZXMgdGhlIG9wdGltaXplZCBmaWxsUGl4ZWxEYXRhRmFzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyUGl4ZWxEYXRhRmFzdChkc3Q6IElQaXhlbERhdGEzMiwgcmVjdD86IFBhcnRpYWw8QmluYXJ5TWFza1JlY3Q+KTogdm9pZCB7XG4gIGZpbGxQaXhlbERhdGFGYXN0KGRzdCwgMCBhcyBDb2xvcjMyLCByZWN0KTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: IPixelData32, rect: Rect): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData32, x: number, y: number, w: number, h: number): Uint32Array;\nexport function extractPixelDataBuffer(source: IPixelData32, _x: Rect | number, _y?: number, _w?: number, _h?: number): Uint32Array {\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 srcW = source.width;\n const srcH = source.height;\n const srcData = source.data32;\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0);\n }\n const dstData = new Uint32Array(w * h);\n\n // We map from Source (srcW, srcH) at (x,y)\n // To Dest (w, h) at (0,0)\n // Note: resolveBlitClipping usually takes (dstX, dstY, srcX, srcY...)\n // Here we are \"blitting\" FROM x,y TO 0,0.\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return dstData;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX;\n const dstStart = (dstY + row) * w + dstX;\n\n // Perform the high-speed 32-bit bulk copy\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KCk7XG5cbi8qKlxuICogRXh0cmFjdHMgYSByZWN0YW5ndWxhciByZWdpb24gb2YgcGl4ZWxzIGZyb20gUGl4ZWxEYXRhLlxuICogUmV0dXJucyBhIG5ldyBVaW50MzJBcnJheSBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgcGl4ZWxzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YUJ1ZmZlcihzb3VyY2U6IElQaXhlbERhdGEzMiwgcmVjdDogUmVjdCk6IFVpbnQzMkFycmF5O1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBJUGl4ZWxEYXRhMzIsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IFVpbnQzMkFycmF5O1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBJUGl4ZWxEYXRhMzIsIF94OiBSZWN0IHwgbnVtYmVyLCBfeT86IG51bWJlciwgX3c/OiBudW1iZXIsIF9oPzogbnVtYmVyKTogVWludDMyQXJyYXkge1xuICBjb25zdCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHcsXG4gICAgaFxuICB9ID0gdHlwZW9mIF94ID09PSAnb2JqZWN0JyA/IF94IDoge1xuICAgIHg6IF94LFxuICAgIHk6IF95ISxcbiAgICB3OiBfdyEsXG4gICAgaDogX2ghXG4gIH07XG4gIGNvbnN0IHNyY1cgPSBzb3VyY2Uud2lkdGg7XG4gIGNvbnN0IHNyY0ggPSBzb3VyY2UuaGVpZ2h0O1xuICBjb25zdCBzcmNEYXRhID0gc291cmNlLmRhdGEzMjtcblxuICAvLyBTYWZldHkgY2hlY2sgZm9yIGVtcHR5IG9yIGludmFsaWQgZGltZW5zaW9uc1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkoMCk7XG4gIH1cbiAgY29uc3QgZHN0RGF0YSA9IG5ldyBVaW50MzJBcnJheSh3ICogaCk7XG5cbiAgLy8gV2UgbWFwIGZyb20gU291cmNlIChzcmNXLCBzcmNIKSBhdCAoeCx5KVxuICAvLyBUbyBEZXN0ICh3LCBoKSBhdCAoMCwwKVxuICAvLyBOb3RlOiByZXNvbHZlQmxpdENsaXBwaW5nIHVzdWFsbHkgdGFrZXMgKGRzdFgsIGRzdFksIHNyY1gsIHNyY1kuLi4pXG4gIC8vIEhlcmUgd2UgYXJlIFwiYmxpdHRpbmdcIiBGUk9NIHgseSBUTyAwLDAuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKDAsIDAsIHgsIHksIHcsIGgsIHcsIGgsIHNyY1csIHNyY0gsIFNDUkFUQ0hfQkxJVCk7XG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIGRzdERhdGE7XG4gIGNvbnN0IHtcbiAgICB4OiBkc3RYLFxuICAgIHk6IGRzdFksXG4gICAgc3g6IHNyY1gsXG4gICAgc3k6IHNyY1ksXG4gICAgdzogY29weVcsXG4gICAgaDogY29weUhcbiAgfSA9IGNsaXA7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1g7XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoZHN0WSArIHJvdykgKiB3ICsgZHN0WDtcblxuICAgIC8vIFBlcmZvcm0gdGhlIGhpZ2gtc3BlZWQgMzItYml0IGJ1bGsgY29weVxuICAgIGNvbnN0IGNodW5rID0gc3JjRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5Vyk7XG4gICAgZHN0RGF0YS5zZXQoY2h1bmssIGRzdFN0YXJ0KTtcbiAgfVxuICByZXR1cm4gZHN0RGF0YTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { extractPixelDataBuffer } from './extractPixelDataBuffer';\nimport { PixelData } from './PixelData';\n\n/**\n * High-level extraction that returns a new PixelData instance.\n * Leverages extractPixelDataBuffer for optimized 32-bit memory moves.\n */\nexport function extractPixelData(source: IPixelData32, rect: Rect): PixelData;\nexport function extractPixelData(source: IPixelData32, x: number, y: number, w: number, h: number): PixelData;\nexport function extractPixelData(source: IPixelData32, _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 = new PixelData(new ImageData(w, h));\n const buffer = extractPixelDataBuffer(source, x, y, w, h);\n result.data32.set(buffer);\n return result;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyIH0gZnJvbSAnLi9leHRyYWN0UGl4ZWxEYXRhQnVmZmVyJztcbmltcG9ydCB7IFBpeGVsRGF0YSB9IGZyb20gJy4vUGl4ZWxEYXRhJztcblxuLyoqXG4gKiBIaWdoLWxldmVsIGV4dHJhY3Rpb24gdGhhdCByZXR1cm5zIGEgbmV3IFBpeGVsRGF0YSBpbnN0YW5jZS5cbiAqIExldmVyYWdlcyBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyIGZvciBvcHRpbWl6ZWQgMzItYml0IG1lbW9yeSBtb3Zlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGEoc291cmNlOiBJUGl4ZWxEYXRhMzIsIHJlY3Q6IFJlY3QpOiBQaXhlbERhdGE7XG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdFBpeGVsRGF0YShzb3VyY2U6IElQaXhlbERhdGEzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogUGl4ZWxEYXRhO1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGEoc291cmNlOiBJUGl4ZWxEYXRhMzIsIF94OiBSZWN0IHwgbnVtYmVyLCBfeT86IG51bWJlciwgX3c/OiBudW1iZXIsIF9oPzogbnVtYmVyKTogUGl4ZWxEYXRhIHtcbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICB3LFxuICAgIGhcbiAgfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCcgPyBfeCA6IHtcbiAgICB4OiBfeCxcbiAgICB5OiBfeSEsXG4gICAgdzogX3chLFxuICAgIGg6IF9oIVxuICB9O1xuICBjb25zdCByZXN1bHQgPSBuZXcgUGl4ZWxEYXRhKG5ldyBJbWFnZURhdGEodywgaCkpO1xuICBjb25zdCBidWZmZXIgPSBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZSwgeCwgeSwgdywgaCk7XG4gIHJlc3VsdC5kYXRhMzIuc2V0KGJ1ZmZlcik7XG4gIHJldHVybiByZXN1bHQ7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { makeAlphaMask } from '../Mask/AlphaMask';\n\n/**\n * Extracts the alpha channel from PixelData into a single-channel mask.\n * Returns a Uint8Array branded as AlphaMask.\n */\nexport function pixelDataToAlphaMask(pixelData: IPixelData32): AlphaMask {\n const {\n data32,\n width,\n height\n } = pixelData;\n const len = data32.length;\n const mask = makeAlphaMask(width, height);\n const maskData = mask.data;\n for (let i = 0; i < len; i++) {\n const val = data32[i];\n\n // Extract the Alpha byte (top 8 bits in ABGR / Little-Endian)\n // Shift right by 24 moves the 4th byte to the 1st position\n maskData[i] = val >>> 24 & 0xff;\n }\n return mask;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQWxwaGFNYXNrIH0gZnJvbSAnLi4vTWFzay9BbHBoYU1hc2snO1xuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSBhbHBoYSBjaGFubmVsIGZyb20gUGl4ZWxEYXRhIGludG8gYSBzaW5nbGUtY2hhbm5lbCBtYXNrLlxuICogUmV0dXJucyBhIFVpbnQ4QXJyYXkgYnJhbmRlZCBhcyBBbHBoYU1hc2suXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaXhlbERhdGFUb0FscGhhTWFzayhwaXhlbERhdGE6IElQaXhlbERhdGEzMik6IEFscGhhTWFzayB7XG4gIGNvbnN0IHtcbiAgICBkYXRhMzIsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSBwaXhlbERhdGE7XG4gIGNvbnN0IGxlbiA9IGRhdGEzMi5sZW5ndGg7XG4gIGNvbnN0IG1hc2sgPSBtYWtlQWxwaGFNYXNrKHdpZHRoLCBoZWlnaHQpO1xuICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIGNvbnN0IHZhbCA9IGRhdGEzMltpXTtcblxuICAgIC8vIEV4dHJhY3QgdGhlIEFscGhhIGJ5dGUgKHRvcCA4IGJpdHMgaW4gQUJHUiAvIExpdHRsZS1FbmRpYW4pXG4gICAgLy8gU2hpZnQgcmlnaHQgYnkgMjQgbW92ZXMgdGhlIDR0aCBieXRlIHRvIHRoZSAxc3QgcG9zaXRpb25cbiAgICBtYXNrRGF0YVtpXSA9IHZhbCA+Pj4gMjQgJiAweGZmO1xuICB9XG4gIHJldHVybiBtYXNrO1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","export function reflectPixelDataHorizontal(pixelData: IPixelData32): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\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: IPixelData32): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcmVmbGVjdFBpeGVsRGF0YUhvcml6b250YWwocGl4ZWxEYXRhOiBJUGl4ZWxEYXRhMzIpOiB2b2lkIHtcbiAgY29uc3Qgd2lkdGggPSBwaXhlbERhdGEud2lkdGg7XG4gIGNvbnN0IGhlaWdodCA9IHBpeGVsRGF0YS5oZWlnaHQ7XG4gIGNvbnN0IGRhdGEgPSBwaXhlbERhdGEuZGF0YTMyO1xuICBjb25zdCBoYWxmV2lkdGggPSBNYXRoLmZsb29yKHdpZHRoIC8gMik7XG4gIGZvciAobGV0IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHtcbiAgICBjb25zdCByb3dPZmZzZXQgPSB5ICogd2lkdGg7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBoYWxmV2lkdGg7IHgrKykge1xuICAgICAgY29uc3QgbGVmdElkeCA9IHJvd09mZnNldCArIHg7XG4gICAgICBjb25zdCByaWdodElkeCA9IHJvd09mZnNldCArICh3aWR0aCAtIDEgLSB4KTtcbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW2xlZnRJZHhdO1xuICAgICAgZGF0YVtsZWZ0SWR4XSA9IGRhdGFbcmlnaHRJZHhdO1xuICAgICAgZGF0YVtyaWdodElkeF0gPSB0ZW1wO1xuICAgIH1cbiAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIHJlZmxlY3RQaXhlbERhdGFWZXJ0aWNhbChwaXhlbERhdGE6IElQaXhlbERhdGEzMik6IHZvaWQge1xuICBjb25zdCB3aWR0aCA9IHBpeGVsRGF0YS53aWR0aDtcbiAgY29uc3QgaGVpZ2h0ID0gcGl4ZWxEYXRhLmhlaWdodDtcbiAgY29uc3QgZGF0YSA9IHBpeGVsRGF0YS5kYXRhMzI7XG4gIGNvbnN0IGhhbGZIZWlnaHQgPSBNYXRoLmZsb29yKGhlaWdodCAvIDIpO1xuICBmb3IgKGxldCB5ID0gMDsgeSA8IGhhbGZIZWlnaHQ7IHkrKykge1xuICAgIGNvbnN0IHRvcFJvd09mZnNldCA9IHkgKiB3aWR0aDtcbiAgICBjb25zdCBib3R0b21Sb3dPZmZzZXQgPSAoaGVpZ2h0IC0gMSAtIHkpICogd2lkdGg7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7XG4gICAgICBjb25zdCB0b3BJZHggPSB0b3BSb3dPZmZzZXQgKyB4O1xuICAgICAgY29uc3QgYm90dG9tSWR4ID0gYm90dG9tUm93T2Zmc2V0ICsgeDtcbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW3RvcElkeF07XG4gICAgICBkYXRhW3RvcElkeF0gPSBkYXRhW2JvdHRvbUlkeF07XG4gICAgICBkYXRhW2JvdHRvbUlkeF0gPSB0ZW1wO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { PixelData } from '../index';\nimport { resample32 } from '../Internal/resample32';\n\n/**\n * Resamples PixelData by a specific factor using nearest neighbor.\n * Factor > 1 upscales, Factor < 1 downscales.\n */\nexport function resamplePixelData(pixelData: IPixelData32, factor: number): PixelData {\n const {\n data,\n width,\n height\n } = resample32(pixelData.data32, pixelData.width, pixelData.height, factor);\n return new PixelData(new ImageData(new Uint8ClampedArray(data.buffer) as ImageDataArray, width, height));\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQaXhlbERhdGEgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyByZXNhbXBsZTMyIH0gZnJvbSAnLi4vSW50ZXJuYWwvcmVzYW1wbGUzMic7XG5cbi8qKlxuICogUmVzYW1wbGVzIFBpeGVsRGF0YSBieSBhIHNwZWNpZmljIGZhY3RvciB1c2luZyBuZWFyZXN0IG5laWdoYm9yLlxuICogRmFjdG9yID4gMSB1cHNjYWxlcywgRmFjdG9yIDwgMSBkb3duc2NhbGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVQaXhlbERhdGEocGl4ZWxEYXRhOiBJUGl4ZWxEYXRhMzIsIGZhY3RvcjogbnVtYmVyKTogUGl4ZWxEYXRhIHtcbiAgY29uc3Qge1xuICAgIGRhdGEsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0XG4gIH0gPSByZXNhbXBsZTMyKHBpeGVsRGF0YS5kYXRhMzIsIHBpeGVsRGF0YS53aWR0aCwgcGl4ZWxEYXRhLmhlaWdodCwgZmFjdG9yKTtcbiAgcmV0dXJuIG5ldyBQaXhlbERhdGEobmV3IEltYWdlRGF0YShuZXcgVWludDhDbGFtcGVkQXJyYXkoZGF0YS5idWZmZXIpIGFzIEltYWdlRGF0YUFycmF5LCB3aWR0aCwgaGVpZ2h0KSk7XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","/**\n * Rotates pixel data 90 degrees clockwise.\n * If the image is square, it performs the rotation in-place.\n * If rectangular, it replaces the internal ImageData with a new rotated version.\n */\nexport function rotatePixelData(pixelData: PixelData): void {\n const width = pixelData.width;\n const height = pixelData.height;\n const data = pixelData.data32;\n 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 pixelData.set(newImageData);\n}\nfunction rotateSquareInPlace(pixelData: PixelData): void {\n const n = pixelData.width;\n const data = pixelData.data32;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFJvdGF0ZXMgcGl4ZWwgZGF0YSA5MCBkZWdyZWVzIGNsb2Nrd2lzZS5cbiAqIElmIHRoZSBpbWFnZSBpcyBzcXVhcmUsIGl0IHBlcmZvcm1zIHRoZSByb3RhdGlvbiBpbi1wbGFjZS5cbiAqIElmIHJlY3Rhbmd1bGFyLCBpdCByZXBsYWNlcyB0aGUgaW50ZXJuYWwgSW1hZ2VEYXRhIHdpdGggYSBuZXcgcm90YXRlZCB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcm90YXRlUGl4ZWxEYXRhKHBpeGVsRGF0YTogUGl4ZWxEYXRhKTogdm9pZCB7XG4gIGNvbnN0IHdpZHRoID0gcGl4ZWxEYXRhLndpZHRoO1xuICBjb25zdCBoZWlnaHQgPSBwaXhlbERhdGEuaGVpZ2h0O1xuICBjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGEzMjtcbiAgaWYgKHdpZHRoID09PSBoZWlnaHQpIHtcbiAgICByb3RhdGVTcXVhcmVJblBsYWNlKHBpeGVsRGF0YSk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5ld1dpZHRoID0gaGVpZ2h0O1xuICBjb25zdCBuZXdIZWlnaHQgPSB3aWR0aDtcbiAgY29uc3QgbmV3RGF0YTMyID0gbmV3IFVpbnQzMkFycmF5KGRhdGEubGVuZ3RoKTtcbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykge1xuICAgIGZvciAobGV0IHggPSAwOyB4IDwgd2lkdGg7IHgrKykge1xuICAgICAgY29uc3Qgb2xkSWR4ID0geSAqIHdpZHRoICsgeDtcbiAgICAgIGNvbnN0IG5ld1ggPSBoZWlnaHQgLSAxIC0geTtcbiAgICAgIGNvbnN0IG5ld1kgPSB4O1xuICAgICAgY29uc3QgbmV3SWR4ID0gbmV3WSAqIG5ld1dpZHRoICsgbmV3WDtcbiAgICAgIG5ld0RhdGEzMltuZXdJZHhdID0gZGF0YVtvbGRJZHhdO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRvIHVwZGF0ZSBhIHJlY3Rhbmd1bGFyIFBpeGVsRGF0YSwgd2UgbXVzdCBjcmVhdGUgYSBuZXcgSW1hZ2VEYXRhXG4gIC8vIHNpbmNlIHdpZHRoL2hlaWdodCBhcmUgcmVhZC1vbmx5IHByb3BlcnRpZXMgb2YgdGhlIG5hdGl2ZSBvYmplY3QuXG4gIGNvbnN0IG5ld0ltYWdlRGF0YSA9IG5ldyBJbWFnZURhdGEobmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG5ld0RhdGEzMi5idWZmZXIpLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcbiAgcGl4ZWxEYXRhLnNldChuZXdJbWFnZURhdGEpO1xufVxuZnVuY3Rpb24gcm90YXRlU3F1YXJlSW5QbGFjZShwaXhlbERhdGE6IFBpeGVsRGF0YSk6IHZvaWQge1xuICBjb25zdCBuID0gcGl4ZWxEYXRhLndpZHRoO1xuICBjb25zdCBkYXRhID0gcGl4ZWxEYXRhLmRhdGEzMjtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuIC8gMjsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IGk7IGogPCBuIC0gaSAtIDE7IGorKykge1xuICAgICAgY29uc3QgdG9wID0gaSAqIG4gKyBqO1xuICAgICAgY29uc3QgcmlnaHQgPSBqICogbiArIChuIC0gMSAtIGkpO1xuICAgICAgY29uc3QgYm90dG9tID0gKG4gLSAxIC0gaSkgKiBuICsgKG4gLSAxIC0gaik7XG4gICAgICBjb25zdCBsZWZ0ID0gKG4gLSAxIC0gaikgKiBuICsgaTtcbiAgICAgIGNvbnN0IHRlbXAgPSBkYXRhW3RvcF07XG4gICAgICBkYXRhW3RvcF0gPSBkYXRhW2xlZnRdO1xuICAgICAgZGF0YVtsZWZ0XSA9IGRhdGFbYm90dG9tXTtcbiAgICAgIGRhdGFbYm90dG9tXSA9IGRhdGFbcmlnaHRdO1xuICAgICAgZGF0YVtyaWdodF0gPSB0ZW1wO1xuICAgIH1cbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { makeClippedBlit, resolveBlitClipping } from '../Internal/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of a {@link IPixelData32} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target buffer.\n */\nexport function writePixelDataBuffer(target: IPixelData32, data: Uint32Array, rect: Rect): void;\nexport function writePixelDataBuffer(target: IPixelData32, data: Uint32Array, x: number, y: number, w: number, h: number): void;\nexport function writePixelDataBuffer(target: IPixelData32, data: Uint32Array, _x: Rect | number, _y?: number, _w?: number, _h?: number): void {\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 dstW = target.width;\n const dstH = target.height;\n const dstData = target.data32;\n\n // treat the source buffer as a Source Image starting at 0,0 with size w,h\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * w + srcX;\n dstData.set(data.subarray(srcStart, srcStart + copyW), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9JbnRlcm5hbC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KCk7XG5cbi8qKlxuICogQ29waWVzIGEgcGl4ZWwgYnVmZmVyIGludG8gYSBzcGVjaWZpYyByZWdpb24gb2YgYSB7QGxpbmsgSVBpeGVsRGF0YTMyfSBvYmplY3QuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRpcmVjdCBtZW1vcnkgY29weSBmcm9tIGEge0BsaW5rIFVpbnQzMkFycmF5fVxuICogaW50byB0aGUgdGFyZ2V0IGJ1ZmZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGl4ZWxEYXRhQnVmZmVyKHRhcmdldDogSVBpeGVsRGF0YTMyLCBkYXRhOiBVaW50MzJBcnJheSwgcmVjdDogUmVjdCk6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGFCdWZmZXIodGFyZ2V0OiBJUGl4ZWxEYXRhMzIsIGRhdGE6IFVpbnQzMkFycmF5LCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlUGl4ZWxEYXRhQnVmZmVyKHRhcmdldDogSVBpeGVsRGF0YTMyLCBkYXRhOiBVaW50MzJBcnJheSwgX3g6IFJlY3QgfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICB3LFxuICAgIGhcbiAgfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCcgPyBfeCA6IHtcbiAgICB4OiBfeCxcbiAgICB5OiBfeSEsXG4gICAgdzogX3chLFxuICAgIGg6IF9oIVxuICB9O1xuICBjb25zdCBkc3RXID0gdGFyZ2V0LndpZHRoO1xuICBjb25zdCBkc3RIID0gdGFyZ2V0LmhlaWdodDtcbiAgY29uc3QgZHN0RGF0YSA9IHRhcmdldC5kYXRhMzI7XG5cbiAgLy8gdHJlYXQgdGhlIHNvdXJjZSBidWZmZXIgYXMgYSBTb3VyY2UgSW1hZ2Ugc3RhcnRpbmcgYXQgMCwwIHdpdGggc2l6ZSB3LGhcbiAgY29uc3QgY2xpcCA9IHJlc29sdmVCbGl0Q2xpcHBpbmcoeCwgeSwgMCwgMCwgdywgaCwgZHN0VywgZHN0SCwgdywgaCwgU0NSQVRDSF9CTElUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm47XG4gIGNvbnN0IHtcbiAgICB4OiBkc3RYLFxuICAgIHk6IGRzdFksXG4gICAgc3g6IHNyY1gsXG4gICAgc3k6IHNyY1ksXG4gICAgdzogY29weVcsXG4gICAgaDogY29weUhcbiAgfSA9IGNsaXA7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGRzdFkgKyByb3cpICogZHN0VyArIGRzdFg7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoc3JjWSArIHJvdykgKiB3ICsgc3JjWDtcbiAgICBkc3REYXRhLnNldChkYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIGNvcHlXKSwgZHN0U3RhcnQpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import { writePixelDataBuffer } from './writePixelDataBuffer';\n\n/**\n * @param writePixelDataBufferFn - @hidden\n */\nexport function writePaintBufferToPixelData(target: IPixelData, paintBuffer: PaintBuffer, 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.data32, dx, dy, tile.width, tile.height);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB3cml0ZVBpeGVsRGF0YUJ1ZmZlciB9IGZyb20gJy4vd3JpdGVQaXhlbERhdGFCdWZmZXInO1xuXG4vKipcbiAqIEBwYXJhbSB3cml0ZVBpeGVsRGF0YUJ1ZmZlckZuIC0gQGhpZGRlblxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQYWludEJ1ZmZlclRvUGl4ZWxEYXRhKHRhcmdldDogSVBpeGVsRGF0YSwgcGFpbnRCdWZmZXI6IFBhaW50QnVmZmVyLCB3cml0ZVBpeGVsRGF0YUJ1ZmZlckZuID0gd3JpdGVQaXhlbERhdGFCdWZmZXIpIHtcbiAgY29uc3QgdGlsZVNoaWZ0ID0gcGFpbnRCdWZmZXIuY29uZmlnLnRpbGVTaGlmdDtcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgaWYgKHRpbGUpIHtcbiAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnQ7XG4gICAgICBjb25zdCBkeSA9IHRpbGUudHkgPDwgdGlsZVNoaWZ0O1xuICAgICAgd3JpdGVQaXhlbERhdGFCdWZmZXJGbih0YXJnZXQsIHRpbGUuZGF0YTMyLCBkeCwgZHksIHRpbGUud2lkdGgsIHRpbGUuaGVpZ2h0KTtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0="],"mappings":"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","names":["MaskType","get","makeReusableCanvas","defaults","applyAlphaMaskToPixelData","defaults","applyBinaryMaskToPixelData","defaults","applyBinaryMaskToPixelData","applyAlphaMaskToPixelData","defaults","blendPixelDataAlphaMask","defaults","blendPixelDataBinaryMask","defaults","blendColorPixelData","defaults","blendColorPixelDataAlphaMask","defaults","blendColorPixelDataBinaryMask","defaults","blendColorPixelDataBinaryMask","blendColorPixelDataAlphaMask","defaults","blendPixelDataAlphaMask","blendPixelDataBinaryMask","defaults","blendColorPixelData","defaults","blendPixel","defaults","blendPixelData","defaults","fillPixelData","defaults","fillPixelData","SCRATCH_RECT","defaults","fillPixelDataBinaryMask","SCRATCH_RECT","defaults","invertPixelData","SCRATCH_BLIT","SCRATCH_BLIT","r","g","b","a","SCRATCH_OPTS","SCRATCH_OPTS","SCRATCH_OPTS","SCRATCH_RECT","SCRATCH_BLIT","SCRATCH_BLIT"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/Internal/_errors.ts","../src/color.ts","../src/Rect/resolveClipping.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/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/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/AlphaMaskPaintBufferCanvasRenderer.ts","../src/Paint/BinaryMaskPaintBuffer.ts","../src/Paint/BinaryMaskPaintBufferCanvasRenderer.ts","../src/Paint/ColorPaintBuffer.ts","../src/Paint/ColorPaintBufferCanvasRenderer.ts","../src/Paint/makeCirclePaintMask.ts","../src/Paint/makePaintMask.ts","../src/Paint/makeRectFalloffPaintAlphaMask.ts","../src/PixelData/ReusablePixelData.ts","../src/Paint/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/rotatePixelData.ts","../src/PixelData/uInt32ArrayToPixelData.ts","../src/PixelData/writePixelDataBuffer.ts","../src/PixelData/writePaintBufferToPixelData.ts","../src/Tile/MaskTile.ts"],"sourcesContent":["// generated by `npm run re-index` \n\nexport * from './_errors';\nexport * from './_types';\nexport * from './Algorithm/floodFillSelection';\nexport * from './Algorithm/forEachLinePoint';\nexport * from './Algorithm/resampleUint32Array';\nexport * from './BlendModes/blend-modes-fast';\nexport * from './BlendModes/blend-modes-perfect';\nexport * from './BlendModes/blend-modes';\nexport * from './BlendModes/BlendModeRegistry';\nexport * from './BlendModes/toBlendModeIndexAndName';\nexport * from './Canvas/_canvas-types';\nexport * from './Canvas/canvas-blend-modes';\nexport * from './Canvas/CanvasFrameRenderer';\nexport * from './Canvas/CanvasPixelDataRenderer';\nexport * from './Canvas/PixelCanvas';\nexport * from './Canvas/ReusableCanvas';\nexport * from './Clipboard/getImageDataFromClipboard';\nexport * from './Clipboard/writeImageDataToClipboard';\nexport * from './Clipboard/writeImgBlobToClipboard';\nexport * from './color';\nexport * from './History/HistoryAction';\nexport * from './History/HistoryManager';\nexport * from './History/PixelAccumulator';\nexport * from './History/PixelEngineConfig';\nexport * from './History/PixelMutator';\nexport * from './History/PixelMutator/mutatorApplyAlphaMask';\nexport * from './History/PixelMutator/mutatorApplyBinaryMask';\nexport * from './History/PixelMutator/mutatorApplyMask';\nexport * from './History/PixelMutator/mutatorBlendAlphaMask';\nexport * from './History/PixelMutator/mutatorBlendBinaryMask';\nexport * from './History/PixelMutator/mutatorBlendColor';\nexport * from './History/PixelMutator/mutatorBlendColorPaintAlphaMask';\nexport * from './History/PixelMutator/mutatorBlendColorPaintBinaryMask';\nexport * from './History/PixelMutator/mutatorBlendColorPaintMask';\nexport * from './History/PixelMutator/mutatorBlendColorPaintRect';\nexport * from './History/PixelMutator/mutatorBlendMask';\nexport * from './History/PixelMutator/mutatorBlendPixel';\nexport * from './History/PixelMutator/mutatorBlendPixelData';\nexport * from './History/PixelMutator/mutatorClear';\nexport * from './History/PixelMutator/mutatorFill';\nexport * from './History/PixelMutator/mutatorFillBinaryMask';\nexport * from './History/PixelMutator/mutatorInvert';\nexport * from './History/PixelPatchTiles';\nexport * from './History/PixelWriter';\nexport * from './ImageData/_ImageData-types';\nexport * from './ImageData/copyImageData';\nexport * from './ImageData/extractImageDataBuffer';\nexport * from './ImageData/ImageDataLike';\nexport * from './ImageData/imageDataToAlphaMaskBuffer';\nexport * from './ImageData/imageDataToDataUrl';\nexport * from './ImageData/imageDataToImgBlob';\nexport * from './ImageData/imageDataToUint32Array';\nexport * from './ImageData/imgBlobToImageData';\nexport * from './ImageData/invertImageData';\nexport * from './ImageData/resampleImageData';\nexport * from './ImageData/resizeImageData';\nexport * from './ImageData/ReusableImageData';\nexport * from './ImageData/serialization';\nexport * from './ImageData/uInt32ArrayToImageData';\nexport * from './ImageData/writeImageData';\nexport * from './ImageData/writeImageDataBuffer';\nexport * from './IndexedImage/_indexedImage-types';\nexport * from './IndexedImage/getIndexedImageColorCounts';\nexport * from './IndexedImage/IndexedImage';\nexport * from './IndexedImage/indexedImageToAverageColor';\nexport * from './IndexedImage/indexedImageToImageData';\nexport * from './IndexedImage/resampleIndexedImage';\nexport * from './Input/fileInputChangeToImageData';\nexport * from './Input/fileToImageData';\nexport * from './Input/getSupportedRasterFormats';\nexport * from './Mask/_mask-types';\nexport * from './Mask/AlphaMask';\nexport * from './Mask/applyBinaryMaskToAlphaMask';\nexport * from './Mask/BinaryMask';\nexport * from './Mask/BinaryMask/makeBinaryMaskFromAlphaMask';\nexport * from './Mask/BinaryMask/makeBinaryMaskOutline';\nexport * from './Mask/BinaryMask/makeCircleBinaryMaskOutline';\nexport * from './Mask/BinaryMask/makeRectBinaryMaskOutline';\nexport * from './Mask/copyMask';\nexport * from './Mask/extractMask';\nexport * from './Mask/extractMaskBuffer';\nexport * from './Mask/invertMask';\nexport * from './Mask/mergeAlphaMasks';\nexport * from './Mask/mergeBinaryMasks';\nexport * from './Mask/setMaskData';\nexport * from './MaskRect/merge2BinaryMaskRects';\nexport * from './MaskRect/mergeBinaryMaskRects';\nexport * from './MaskRect/subtractBinaryMaskRects';\nexport * from './Paint/_paint-types';\nexport * from './Paint/AlphaMaskPaintBuffer';\nexport * from './Paint/AlphaMaskPaintBufferCanvasRenderer';\nexport * from './Paint/BinaryMaskPaintBuffer';\nexport * from './Paint/BinaryMaskPaintBufferCanvasRenderer';\nexport * from './Paint/ColorPaintBuffer';\nexport * from './Paint/ColorPaintBufferCanvasRenderer';\nexport * from './Paint/eachTileInBounds';\nexport * from './Paint/makeCirclePaintMask';\nexport * from './Paint/makePaintMask';\nexport * from './Paint/makeRectFalloffPaintAlphaMask';\nexport * from './Paint/PaintCursorRenderer';\nexport * from './PixelData/_pixelData-types';\nexport * from './PixelData/applyAlphaMaskToPixelData';\nexport * from './PixelData/applyBinaryMaskToPixelData';\nexport * from './PixelData/applyMaskToPixelData';\nexport * from './PixelData/blendColorPixelData';\nexport * from './PixelData/blendColorPixelDataAlphaMask';\nexport * from './PixelData/blendColorPixelDataBinaryMask';\nexport * from './PixelData/blendColorPixelDataMask';\nexport * from './PixelData/blendColorPixelDataPaintAlphaMask';\nexport * from './PixelData/blendColorPixelDataPaintBinaryMask';\nexport * from './PixelData/blendColorPixelDataPaintMask';\nexport * from './PixelData/blendPixel';\nexport * from './PixelData/blendPixelData';\nexport * from './PixelData/blendPixelDataAlphaMask';\nexport * from './PixelData/blendPixelDataBinaryMask';\nexport * from './PixelData/blendPixelDataMask';\nexport * from './PixelData/blendPixelDataPaintBuffer';\nexport * from './PixelData/clearPixelDataFast';\nexport * from './PixelData/copyPixelData';\nexport * from './PixelData/extractPixelData';\nexport * from './PixelData/extractPixelDataBuffer';\nexport * from './PixelData/fillPixelData';\nexport * from './PixelData/fillPixelDataBinaryMask';\nexport * from './PixelData/fillPixelDataFast';\nexport * from './PixelData/invertPixelData';\nexport * from './PixelData/PixelData';\nexport * from './PixelData/pixelDataToAlphaMask';\nexport * from './PixelData/reflectPixelData';\nexport * from './PixelData/resamplePixelData';\nexport * from './PixelData/ReusablePixelData';\nexport * from './PixelData/rotatePixelData';\nexport * from './PixelData/uInt32ArrayToPixelData';\nexport * from './PixelData/writePaintBufferToPixelData';\nexport * from './PixelData/writePixelDataBuffer';\nexport * from './Rect/_rect-types';\nexport * from './Rect/getRectsBounds';\nexport * from './Rect/resolveClipping';\nexport * from './Rect/trimMaskRectBounds';\nexport * from './Rect/trimRectBounds';\nexport * from './Tile/_tile-types';\nexport * from './Tile/MaskTile';\nexport * from './Tile/PixelTile';\nexport * from './Tile/TilePool';\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBnZW5lcmF0ZWQgYnkgYG5wbSBydW4gcmUtaW5kZXhgIFxuXG5leHBvcnQgKiBmcm9tICcuL19lcnJvcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9fdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9BbGdvcml0aG0vZmxvb2RGaWxsU2VsZWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9BbGdvcml0aG0vcmVzYW1wbGVVaW50MzJBcnJheSc7XG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtZmFzdCc7XG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMtcGVyZmVjdCc7XG5leHBvcnQgKiBmcm9tICcuL0JsZW5kTW9kZXMvYmxlbmQtbW9kZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9CbGVuZE1vZGVzL0JsZW5kTW9kZVJlZ2lzdHJ5JztcbmV4cG9ydCAqIGZyb20gJy4vQmxlbmRNb2Rlcy90b0JsZW5kTW9kZUluZGV4QW5kTmFtZSc7XG5leHBvcnQgKiBmcm9tICcuL0NhbnZhcy9fY2FudmFzLXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL2NhbnZhcy1ibGVuZC1tb2Rlcyc7XG5leHBvcnQgKiBmcm9tICcuL0NhbnZhcy9DYW52YXNGcmFtZVJlbmRlcmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL0NhbnZhc1BpeGVsRGF0YVJlbmRlcmVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL1BpeGVsQ2FudmFzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2FudmFzL1JldXNhYmxlQ2FudmFzJztcbmV4cG9ydCAqIGZyb20gJy4vQ2xpcGJvYXJkL2dldEltYWdlRGF0YUZyb21DbGlwYm9hcmQnO1xuZXhwb3J0ICogZnJvbSAnLi9DbGlwYm9hcmQvd3JpdGVJbWFnZURhdGFUb0NsaXBib2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL0NsaXBib2FyZC93cml0ZUltZ0Jsb2JUb0NsaXBib2FyZCc7XG5leHBvcnQgKiBmcm9tICcuL2NvbG9yJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9IaXN0b3J5QWN0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9IaXN0b3J5TWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxBY2N1bXVsYXRvcic7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxFbmdpbmVDb25maWcnO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvcic7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUFscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JBcHBseUJpbmFyeU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQXBwbHlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQWxwaGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQmluYXJ5TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3JQYWludEFscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZENvbG9yUGFpbnRCaW5hcnlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckJsZW5kQ29sb3JQYWludE1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRDb2xvclBhaW50UmVjdCc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZE1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9IaXN0b3J5L1BpeGVsTXV0YXRvci9tdXRhdG9yQmxlbmRQaXhlbCc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JCbGVuZFBpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JDbGVhcic7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxNdXRhdG9yL211dGF0b3JGaWxsJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckZpbGxCaW5hcnlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbE11dGF0b3IvbXV0YXRvckludmVydCc7XG5leHBvcnQgKiBmcm9tICcuL0hpc3RvcnkvUGl4ZWxQYXRjaFRpbGVzJztcbmV4cG9ydCAqIGZyb20gJy4vSGlzdG9yeS9QaXhlbFdyaXRlcic7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9fSW1hZ2VEYXRhLXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2NvcHlJbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvZXh0cmFjdEltYWdlRGF0YUJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9JbWFnZURhdGFMaWtlJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvQWxwaGFNYXNrQnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL2ltYWdlRGF0YVRvRGF0YVVybCc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbWFnZURhdGFUb0ltZ0Jsb2InO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvaW1hZ2VEYXRhVG9VaW50MzJBcnJheSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9pbWdCbG9iVG9JbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvaW52ZXJ0SW1hZ2VEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3Jlc2FtcGxlSW1hZ2VEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3Jlc2l6ZUltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9SZXVzYWJsZUltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0ltYWdlRGF0YS9zZXJpYWxpemF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vSW1hZ2VEYXRhL3VJbnQzMkFycmF5VG9JbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvd3JpdGVJbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbWFnZURhdGEvd3JpdGVJbWFnZURhdGFCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvX2luZGV4ZWRJbWFnZS10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9nZXRJbmRleGVkSW1hZ2VDb2xvckNvdW50cyc7XG5leHBvcnQgKiBmcm9tICcuL0luZGV4ZWRJbWFnZS9JbmRleGVkSW1hZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvaW5kZXhlZEltYWdlVG9BdmVyYWdlQ29sb3InO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvaW5kZXhlZEltYWdlVG9JbWFnZURhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbmRleGVkSW1hZ2UvcmVzYW1wbGVJbmRleGVkSW1hZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnB1dC9maWxlSW5wdXRDaGFuZ2VUb0ltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0L2ZpbGVUb0ltYWdlRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL0lucHV0L2dldFN1cHBvcnRlZFJhc3RlckZvcm1hdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL19tYXNrLXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9BbHBoYU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2FwcGx5QmluYXJ5TWFza1RvQWxwaGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9CaW5hcnlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9CaW5hcnlNYXNrL21ha2VCaW5hcnlNYXNrRnJvbUFscGhhTWFzayc7XG5leHBvcnQgKiBmcm9tICcuL01hc2svQmluYXJ5TWFzay9tYWtlQmluYXJ5TWFza091dGxpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL0JpbmFyeU1hc2svbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9CaW5hcnlNYXNrL21ha2VSZWN0QmluYXJ5TWFza091dGxpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2NvcHlNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vTWFzay9leHRyYWN0TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL01hc2svZXh0cmFjdE1hc2tCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL2ludmVydE1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrL21lcmdlQWxwaGFNYXNrcyc7XG5leHBvcnQgKiBmcm9tICcuL01hc2svbWVyZ2VCaW5hcnlNYXNrcyc7XG5leHBvcnQgKiBmcm9tICcuL01hc2svc2V0TWFza0RhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrUmVjdC9tZXJnZTJCaW5hcnlNYXNrUmVjdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9NYXNrUmVjdC9tZXJnZUJpbmFyeU1hc2tSZWN0cyc7XG5leHBvcnQgKiBmcm9tICcuL01hc2tSZWN0L3N1YnRyYWN0QmluYXJ5TWFza1JlY3RzJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvX3BhaW50LXR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvQWxwaGFNYXNrUGFpbnRCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9BbHBoYU1hc2tQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvQmluYXJ5TWFza1BhaW50QnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvQmluYXJ5TWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXInO1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9Db2xvclBhaW50QnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvQ29sb3JQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvZWFjaFRpbGVJbkJvdW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL1BhaW50L21ha2VDaXJjbGVQYWludE1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9tYWtlUGFpbnRNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGFpbnQvbWFrZVJlY3RGYWxsb2ZmUGFpbnRBbHBoYU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QYWludC9QYWludEN1cnNvclJlbmRlcmVyJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL19waXhlbERhdGEtdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYXBwbHlBbHBoYU1hc2tUb1BpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9hcHBseUJpbmFyeU1hc2tUb1BpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9hcHBseU1hc2tUb1BpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YVBhaW50QWxwaGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kQ29sb3JQaXhlbERhdGFQYWludEJpbmFyeU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YVBhaW50TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9ibGVuZFBpeGVsRGF0YU1hc2snO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvYmxlbmRQaXhlbERhdGFQYWludEJ1ZmZlcic7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9jbGVhclBpeGVsRGF0YUZhc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvY29weVBpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9leHRyYWN0UGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL2V4dHJhY3RQaXhlbERhdGFCdWZmZXInO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvZmlsbFBpeGVsRGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhRmFzdCc7XG5leHBvcnQgKiBmcm9tICcuL1BpeGVsRGF0YS9pbnZlcnRQaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3BpeGVsRGF0YVRvQWxwaGFNYXNrJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3JlZmxlY3RQaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvcmVzYW1wbGVQaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvUmV1c2FibGVQaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvcm90YXRlUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3VJbnQzMkFycmF5VG9QaXhlbERhdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9QaXhlbERhdGEvd3JpdGVQYWludEJ1ZmZlclRvUGl4ZWxEYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vUGl4ZWxEYXRhL3dyaXRlUGl4ZWxEYXRhQnVmZmVyJztcbmV4cG9ydCAqIGZyb20gJy4vUmVjdC9fcmVjdC10eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL1JlY3QvZ2V0UmVjdHNCb3VuZHMnO1xuZXhwb3J0ICogZnJvbSAnLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5leHBvcnQgKiBmcm9tICcuL1JlY3QvdHJpbU1hc2tSZWN0Qm91bmRzJztcbmV4cG9ydCAqIGZyb20gJy4vUmVjdC90cmltUmVjdEJvdW5kcyc7XG5leHBvcnQgKiBmcm9tICcuL1RpbGUvX3RpbGUtdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9UaWxlL01hc2tUaWxlJztcbmV4cG9ydCAqIGZyb20gJy4vVGlsZS9QaXhlbFRpbGUnO1xuZXhwb3J0ICogZnJvbSAnLi9UaWxlL1RpbGVQb29sJzsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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==","export type ClippedRect = {\n x: number;\n y: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\nexport type ClippedBlit = {\n x: number;\n y: number;\n sx: number;\n sy: number;\n w: number;\n h: number;\n inBounds: boolean;\n};\n\n// use factory functions when creating reusable objects ensure property order for JIT perf\nexport const makeClippedRect = (): ClippedRect => ({\n x: 0,\n y: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\nexport const makeClippedBlit = (): ClippedBlit => ({\n x: 0,\n y: 0,\n sx: 0,\n sy: 0,\n w: 0,\n h: 0,\n inBounds: false\n});\n\n/**\n * Calculates the intersection of a target rectangle and a bounding box (usually 0,0 -> width,height).\n * Handles negative offsets by shrinking dimensions.\n */\nexport function resolveRectClipping(x: number, y: number, w: number, h: number, boundaryW: number, boundaryH: number, out: ClippedRect): ClippedRect {\n // Destination Clipping (Top/Left)\n if (x < 0) {\n w += x;\n x = 0;\n }\n if (y < 0) {\n h += y;\n y = 0;\n }\n\n // Destination Clipping (Bottom/Right)\n const actualW = Math.min(w, boundaryW - x);\n const actualH = Math.min(h, boundaryH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n\n/**\n * Calculates the clipping for transferring data from a Source to a Destination.\n * Handles cases where the source is out of bounds (shifting the destination target)\n * AND cases where the destination is out of bounds (shifting the source target).\n */\nexport function resolveBlitClipping(x: number, y: number, sx: number, sy: number, w: number, h: number, dstW: number, dstH: number, srcW: number, srcH: number, out: ClippedBlit): ClippedBlit {\n // 1. Source Clipping: If reading from negative source, shift target right and shrink\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, srcW - sx);\n h = Math.min(h, srcH - sy);\n\n // 2. Destination Clipping: If writing to negative dest, shift source right and shrink\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, dstW - x);\n const actualH = Math.min(h, dstH - y);\n if (actualW <= 0 || actualH <= 0) {\n out.inBounds = false;\n return out;\n }\n out.x = x;\n out.y = y;\n out.sx = sx;\n out.sy = sy;\n out.w = actualW;\n out.h = actualH;\n out.inBounds = true;\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBDbGlwcGVkUmVjdCA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xuICBpbkJvdW5kczogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBDbGlwcGVkQmxpdCA9IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHN4OiBudW1iZXI7XG4gIHN5OiBudW1iZXI7XG4gIHc6IG51bWJlcjtcbiAgaDogbnVtYmVyO1xuICBpbkJvdW5kczogYm9vbGVhbjtcbn07XG5cbi8vIHVzZSBmYWN0b3J5IGZ1bmN0aW9ucyB3aGVuIGNyZWF0aW5nIHJldXNhYmxlIG9iamVjdHMgZW5zdXJlIHByb3BlcnR5IG9yZGVyIGZvciBKSVQgcGVyZlxuZXhwb3J0IGNvbnN0IG1ha2VDbGlwcGVkUmVjdCA9ICgpOiBDbGlwcGVkUmVjdCA9PiAoe1xuICB4OiAwLFxuICB5OiAwLFxuICB3OiAwLFxuICBoOiAwLFxuICBpbkJvdW5kczogZmFsc2Vcbn0pO1xuZXhwb3J0IGNvbnN0IG1ha2VDbGlwcGVkQmxpdCA9ICgpOiBDbGlwcGVkQmxpdCA9PiAoe1xuICB4OiAwLFxuICB5OiAwLFxuICBzeDogMCxcbiAgc3k6IDAsXG4gIHc6IDAsXG4gIGg6IDAsXG4gIGluQm91bmRzOiBmYWxzZVxufSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgdGFyZ2V0IHJlY3RhbmdsZSBhbmQgYSBib3VuZGluZyBib3ggKHVzdWFsbHkgMCwwIC0+IHdpZHRoLGhlaWdodCkuXG4gKiBIYW5kbGVzIG5lZ2F0aXZlIG9mZnNldHMgYnkgc2hyaW5raW5nIGRpbWVuc2lvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUmVjdENsaXBwaW5nKHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlciwgYm91bmRhcnlXOiBudW1iZXIsIGJvdW5kYXJ5SDogbnVtYmVyLCBvdXQ6IENsaXBwZWRSZWN0KTogQ2xpcHBlZFJlY3Qge1xuICAvLyBEZXN0aW5hdGlvbiBDbGlwcGluZyAoVG9wL0xlZnQpXG4gIGlmICh4IDwgMCkge1xuICAgIHcgKz0geDtcbiAgICB4ID0gMDtcbiAgfVxuICBpZiAoeSA8IDApIHtcbiAgICBoICs9IHk7XG4gICAgeSA9IDA7XG4gIH1cblxuICAvLyBEZXN0aW5hdGlvbiBDbGlwcGluZyAoQm90dG9tL1JpZ2h0KVxuICBjb25zdCBhY3R1YWxXID0gTWF0aC5taW4odywgYm91bmRhcnlXIC0geCk7XG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBib3VuZGFyeUggLSB5KTtcbiAgaWYgKGFjdHVhbFcgPD0gMCB8fCBhY3R1YWxIIDw9IDApIHtcbiAgICBvdXQuaW5Cb3VuZHMgPSBmYWxzZTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG4gIG91dC54ID0geDtcbiAgb3V0LnkgPSB5O1xuICBvdXQudyA9IGFjdHVhbFc7XG4gIG91dC5oID0gYWN0dWFsSDtcbiAgb3V0LmluQm91bmRzID0gdHJ1ZTtcbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBjbGlwcGluZyBmb3IgdHJhbnNmZXJyaW5nIGRhdGEgZnJvbSBhIFNvdXJjZSB0byBhIERlc3RpbmF0aW9uLlxuICogSGFuZGxlcyBjYXNlcyB3aGVyZSB0aGUgc291cmNlIGlzIG91dCBvZiBib3VuZHMgKHNoaWZ0aW5nIHRoZSBkZXN0aW5hdGlvbiB0YXJnZXQpXG4gKiBBTkQgY2FzZXMgd2hlcmUgdGhlIGRlc3RpbmF0aW9uIGlzIG91dCBvZiBib3VuZHMgKHNoaWZ0aW5nIHRoZSBzb3VyY2UgdGFyZ2V0KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVCbGl0Q2xpcHBpbmcoeDogbnVtYmVyLCB5OiBudW1iZXIsIHN4OiBudW1iZXIsIHN5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyLCBkc3RXOiBudW1iZXIsIGRzdEg6IG51bWJlciwgc3JjVzogbnVtYmVyLCBzcmNIOiBudW1iZXIsIG91dDogQ2xpcHBlZEJsaXQpOiBDbGlwcGVkQmxpdCB7XG4gIC8vIDEuIFNvdXJjZSBDbGlwcGluZzogSWYgcmVhZGluZyBmcm9tIG5lZ2F0aXZlIHNvdXJjZSwgc2hpZnQgdGFyZ2V0IHJpZ2h0IGFuZCBzaHJpbmtcbiAgaWYgKHN4IDwgMCkge1xuICAgIHggLT0gc3g7XG4gICAgdyArPSBzeDtcbiAgICBzeCA9IDA7XG4gIH1cbiAgaWYgKHN5IDwgMCkge1xuICAgIHkgLT0gc3k7XG4gICAgaCArPSBzeTtcbiAgICBzeSA9IDA7XG4gIH1cbiAgdyA9IE1hdGgubWluKHcsIHNyY1cgLSBzeCk7XG4gIGggPSBNYXRoLm1pbihoLCBzcmNIIC0gc3kpO1xuXG4gIC8vIDIuIERlc3RpbmF0aW9uIENsaXBwaW5nOiBJZiB3cml0aW5nIHRvIG5lZ2F0aXZlIGRlc3QsIHNoaWZ0IHNvdXJjZSByaWdodCBhbmQgc2hyaW5rXG4gIGlmICh4IDwgMCkge1xuICAgIHN4IC09IHg7XG4gICAgdyArPSB4O1xuICAgIHggPSAwO1xuICB9XG4gIGlmICh5IDwgMCkge1xuICAgIHN5IC09IHk7XG4gICAgaCArPSB5O1xuICAgIHkgPSAwO1xuICB9XG4gIGNvbnN0IGFjdHVhbFcgPSBNYXRoLm1pbih3LCBkc3RXIC0geCk7XG4gIGNvbnN0IGFjdHVhbEggPSBNYXRoLm1pbihoLCBkc3RIIC0geSk7XG4gIGlmIChhY3R1YWxXIDw9IDAgfHwgYWN0dWFsSCA8PSAwKSB7XG4gICAgb3V0LmluQm91bmRzID0gZmFsc2U7XG4gICAgcmV0dXJuIG91dDtcbiAgfVxuICBvdXQueCA9IHg7XG4gIG91dC55ID0geTtcbiAgb3V0LnN4ID0gc3g7XG4gIG91dC5zeSA9IHN5O1xuICBvdXQudyA9IGFjdHVhbFc7XG4gIG91dC5oID0gYWN0dWFsSDtcbiAgb3V0LmluQm91bmRzID0gdHJ1ZTtcbiAgcmV0dXJuIG91dDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedBlit, resolveBlitClipping } from '../Rect/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a specific rectangular region of pixels from a larger {@link ImageDataLike}\n * source into a new {@link Uint8ClampedArray}.\n *\n * This is a \"read-only\" operation that returns a copy of the pixel data.\n *\n * @param imageData - The source image data to read from.\n * @param rect - A rect defining the region to extract.\n * @returns A buffer containing the RGBA pixel data of the region.\n */\nexport function extractImageDataBuffer(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 const {\n width: srcW,\n height: srcH,\n data: src\n } = imageData;\n // Safety check for invalid dimensions\n if (w <= 0 || h <= 0) return new Uint8ClampedArray(0);\n const out = new Uint8ClampedArray(w * h * 4);\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return out;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\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\n // Perform the high-speed bulk copy\n out.set(src.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n return out;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHNwZWNpZmljIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiBwaXhlbHMgZnJvbSBhIGxhcmdlciB7QGxpbmsgSW1hZ2VEYXRhTGlrZX1cbiAqIHNvdXJjZSBpbnRvIGEgbmV3IHtAbGluayBVaW50OENsYW1wZWRBcnJheX0uXG4gKlxuICogVGhpcyBpcyBhIFwicmVhZC1vbmx5XCIgb3BlcmF0aW9uIHRoYXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHBpeGVsIGRhdGEuXG4gKlxuICogQHBhcmFtIGltYWdlRGF0YSAtIFRoZSBzb3VyY2UgaW1hZ2UgZGF0YSB0byByZWFkIGZyb20uXG4gKiBAcGFyYW0gcmVjdCAtIEEgcmVjdCBkZWZpbmluZyB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIGJ1ZmZlciBjb250YWluaW5nIHRoZSBSR0JBIHBpeGVsIGRhdGEgb2YgdGhlIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbWFnZURhdGFCdWZmZXIoaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLCByZWN0OiBSZWN0KTogVWludDhDbGFtcGVkQXJyYXk7XG4vKipcbiAqIEBwYXJhbSBpbWFnZURhdGEgLSBUaGUgc291cmNlIGltYWdlIGRhdGEgdG8gcmVhZCBmcm9tLlxuICogQHBhcmFtIHggLSBUaGUgc3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlLlxuICogQHBhcmFtIHkgLSBUaGUgc3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gVGhlIHdpZHRoIG9mIHRoZSByZWdpb24gdG8gZXh0cmFjdC5cbiAqIEBwYXJhbSBoIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIHRvIGV4dHJhY3QuXG4gKiBAcmV0dXJucyBBIGJ1ZmZlciBjb250YWluaW5nIHRoZSBSR0JBIHBpeGVsIGRhdGEgb2YgdGhlIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RJbWFnZURhdGFCdWZmZXIoaW1hZ2VEYXRhOiBJbWFnZURhdGFMaWtlLCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiBVaW50OENsYW1wZWRBcnJheTtcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SW1hZ2VEYXRhQnVmZmVyKGltYWdlRGF0YTogSW1hZ2VEYXRhTGlrZSwgX3g6IFJlY3QgfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiBVaW50OENsYW1wZWRBcnJheSB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoXG4gIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnID8gX3ggOiB7XG4gICAgeDogX3gsXG4gICAgeTogX3khLFxuICAgIHc6IF93ISxcbiAgICBoOiBfaCFcbiAgfTtcbiAgY29uc3Qge1xuICAgIHdpZHRoOiBzcmNXLFxuICAgIGhlaWdodDogc3JjSCxcbiAgICBkYXRhOiBzcmNcbiAgfSA9IGltYWdlRGF0YTtcbiAgLy8gU2FmZXR5IGNoZWNrIGZvciBpbnZhbGlkIGRpbWVuc2lvbnNcbiAgaWYgKHcgPD0gMCB8fCBoIDw9IDApIHJldHVybiBuZXcgVWludDhDbGFtcGVkQXJyYXkoMCk7XG4gIGNvbnN0IG91dCA9IG5ldyBVaW50OENsYW1wZWRBcnJheSh3ICogaCAqIDQpO1xuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZygwLCAwLCB4LCB5LCB3LCBoLCB3LCBoLCBzcmNXLCBzcmNILCBTQ1JBVENIX0JMSVQpO1xuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVybiBvdXQ7XG4gIGNvbnN0IHtcbiAgICB4OiBkc3RYLFxuICAgIHk6IGRzdFksXG4gICAgc3g6IHNyY1gsXG4gICAgc3k6IHNyY1ksXG4gICAgdzogY29weVcsXG4gICAgaDogY29weUhcbiAgfSA9IGNsaXA7XG4gIGNvbnN0IHJvd0xlbiA9IGNvcHlXICogNDtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weUg7IHJvdysrKSB7XG4gICAgY29uc3Qgc3JjU3RhcnQgPSAoKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1gpICogNDtcbiAgICBjb25zdCBkc3RTdGFydCA9ICgoZHN0WSArIHJvdykgKiB3ICsgZHN0WCkgKiA0O1xuXG4gICAgLy8gUGVyZm9ybSB0aGUgaGlnaC1zcGVlZCBidWxrIGNvcHlcbiAgICBvdXQuc2V0KHNyYy5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyByb3dMZW4pLCBkc3RTdGFydCk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 bufferCanvas = 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 = bufferCanvas(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+KSB7XG4gIGNvbnN0IGJ1ZmZlckNhbnZhcyA9IHJldXNhYmxlQ2FudmFzRmFjdG9yeSgpO1xuICByZXR1cm4gZnVuY3Rpb24gcmVuZGVyQ2FudmFzRnJhbWUocGl4ZWxDYW52YXM6IFBpeGVsQ2FudmFzLCBzY2FsZTogbnVtYmVyLCBnZXRJbWFnZURhdGE6ICgpID0+IEltYWdlRGF0YSB8IHVuZGVmaW5lZCB8IG51bGwsIGRyYXdQaXhlbExheWVyPzogRHJhd1BpeGVsTGF5ZXI8VD4sIGRyYXdTY3JlZW5MYXllcj86IERyYXdTY3JlZW5MYXllcikge1xuICAgIGNvbnN0IGNhbnZhcyA9IHBpeGVsQ2FudmFzLmNhbnZhcztcbiAgICBjb25zdCBjdHggPSBwaXhlbENhbnZhcy5jdHg7XG4gICAgY29uc3QgdyA9IGNhbnZhcy53aWR0aDtcbiAgICBjb25zdCBoID0gY2FudmFzLmhlaWdodDtcblxuICAgIC8vIDEuIENsZWFyIHBpeGVsIGJ1ZmZlclxuICAgIGNvbnN0IGJ1ZmZlciA9IGJ1ZmZlckNhbnZhcyh3LCBoKTtcblxuICAgIC8vIDIuIERyYXcgcGl4ZWwgZGF0YSBpbnRvIHBpeGVsIGJ1ZmZlclxuICAgIGNvbnN0IGltZyA9IGdldEltYWdlRGF0YSgpO1xuICAgIGlmIChpbWcpIHtcbiAgICAgIGJ1ZmZlci5jdHgucHV0SW1hZ2VEYXRhKGltZywgMCwgMCk7XG4gICAgfVxuXG4gICAgLy8gZHJhdyB0cmFuc2llbnQgcGl4ZWwgZGF0YVxuICAgIGRyYXdQaXhlbExheWVyPy4oYnVmZmVyLmN0eCk7XG5cbiAgICAvLyBjbGVhciB0YXJnZXQgY2FudmFzXG4gICAgY3R4LnNldFRyYW5zZm9ybSgxLCAwLCAwLCAxLCAwLCAwKTtcbiAgICBjdHguY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xuXG4gICAgLy8gRHJhdyBwaXhlbCBidWZmZXIgc2NhbGVkIG9udG8gc2NyZWVuXG4gICAgY3R4LnNldFRyYW5zZm9ybShzY2FsZSwgMCwgMCwgc2NhbGUsIDAsIDApO1xuICAgIGN0eC5kcmF3SW1hZ2UoYnVmZmVyLmNhbnZhcywgMCwgMCk7XG5cbiAgICAvLyBEcmF3IG92ZXJsYXlzIGluIHNjcmVlbiBzcGFjZVxuICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7XG4gICAgZHJhd1NjcmVlbkxheWVyPy4oY3R4LCBzY2FsZSk7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 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, after?: () => void, afterUndo?: () => void, afterRedo?: () => 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?.();\n after?.();\n },\n redo: () => {\n applyPatchTilesFn(target, patch.afterTiles, tileSize);\n afterRedo?.();\n after?.();\n },\n dispose: () => accumulator.recyclePatch(patch)\n };\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhcHBseVBhdGNoVGlsZXMgfSBmcm9tICcuL1BpeGVsUGF0Y2hUaWxlcyc7XG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcnlBY3Rpb24ge1xuICB1bmRvOiAoKSA9PiB2b2lkO1xuICByZWRvOiAoKSA9PiB2b2lkO1xuICBkaXNwb3NlPzogKCkgPT4gdm9pZDtcbn1cbmV4cG9ydCB0eXBlIEhpc3RvcnlBY3Rpb25GYWN0b3J5ID0gdHlwZW9mIG1ha2VIaXN0b3J5QWN0aW9uO1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VIaXN0b3J5QWN0aW9uKGNvbmZpZzogUGl4ZWxFbmdpbmVDb25maWcsIGFjY3VtdWxhdG9yOiBQaXhlbEFjY3VtdWxhdG9yLCBwYXRjaDogUGl4ZWxQYXRjaFRpbGVzLCBhZnRlcj86ICgpID0+IHZvaWQsIGFmdGVyVW5kbz86ICgpID0+IHZvaWQsIGFmdGVyUmVkbz86ICgpID0+IHZvaWQsIGFwcGx5UGF0Y2hUaWxlc0ZuID0gYXBwbHlQYXRjaFRpbGVzKTogSGlzdG9yeUFjdGlvbiB7XG4gIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICByZXR1cm4ge1xuICAgIHVuZG86ICgpID0+IHtcbiAgICAgIGFwcGx5UGF0Y2hUaWxlc0ZuKHRhcmdldCwgcGF0Y2guYmVmb3JlVGlsZXMsIHRpbGVTaXplKTtcbiAgICAgIGFmdGVyVW5kbz8uKCk7XG4gICAgICBhZnRlcj8uKCk7XG4gICAgfSxcbiAgICByZWRvOiAoKSA9PiB7XG4gICAgICBhcHBseVBhdGNoVGlsZXNGbih0YXJnZXQsIHBhdGNoLmFmdGVyVGlsZXMsIHRpbGVTaXplKTtcbiAgICAgIGFmdGVyUmVkbz8uKCk7XG4gICAgICBhZnRlcj8uKCk7XG4gICAgfSxcbiAgICBkaXNwb3NlOiAoKSA9PiBhY2N1bXVsYXRvci5yZWN5Y2xlUGF0Y2gocGF0Y2gpXG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 after Called after both undo and redo — use for generic change notifications.\n * @param afterUndo Called after undo only — use for dimension or state changes specific to undo.\n * @param afterRedo Called after redo only.\n */\n withHistory(transaction: (mutator: M) => void, after?: () => void, afterUndo?: () => void, afterRedo?: () => 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, after, afterUndo, afterRedo);\n this.historyManager.commit(action);\n }\n resize(newWidth: number, newHeight: number, offsetX = 0, offsetY = 0, after?: (target: ImageData) => void, 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 after?.(beforeImageData);\n },\n redo: () => {\n setPixelData(target, afterImageData);\n afterRedo?.(afterImageData);\n after?.(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/PyBuZXcgUGl4ZWxBY2N1bXVsYXRvcih0aGlzLmNvbmZpZywgdGhpcy5waXhlbFRpbGVQb29sKTtcbiAgICB0aGlzLm11dGF0b3IgPSBtdXRhdG9yRmFjdG9yeSh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgdHJhbnNhY3Rpb25gIGFuZCBjb21taXRzIHRoZSByZXN1bHRpbmcgcGl4ZWwgY2hhbmdlcyBhcyBhIHNpbmdsZVxuICAgKiB1bmRvYWJsZSBoaXN0b3J5IGFjdGlvbi5cbiAgICpcbiAgICogLSBJZiBgdHJhbnNhY3Rpb25gIHRocm93cywgYWxsIGFjY3VtdWxhdGVkIGNoYW5nZXMgYXJlIHJvbGxlZCBiYWNrIGFuZCB0aGUgZXJyb3JcbiAgICogICBpcyByZS10aHJvd24uIE5vIGFjdGlvbiBpcyBjb21taXR0ZWQuXG4gICAqIC0gSWYgYHRyYW5zYWN0aW9uYCBjb21wbGV0ZXMgd2l0aG91dCBtb2RpZnlpbmcgYW55IHBpeGVscywgbm8gYWN0aW9uIGlzIGNvbW1pdHRlZC5cbiAgICogLSBgd2l0aEhpc3RvcnlgIGlzIG5vdCByZS1lbnRyYW50LiBDYWxsaW5nIGl0IGFnYWluIGZyb20gaW5zaWRlIGB0cmFuc2FjdGlvbmAgd2lsbFxuICAgKiAgIHRocm93IGltbWVkaWF0ZWx5IHRvIHByZXZlbnQgc2lsZW50IGRhdGEgbG9zcyBmcm9tIGEgbmVzdGVkIGV4dHJhY3RQYXRjaC5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uIENhbGxiYWNrIHRvIGJlIGV4ZWN1dGVkIGluc2lkZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAqIEBwYXJhbSBhZnRlciAgICBDYWxsZWQgYWZ0ZXIgYm90aCB1bmRvIGFuZCByZWRvIOKAlCB1c2UgZm9yIGdlbmVyaWMgY2hhbmdlIG5vdGlmaWNhdGlvbnMuXG4gICAqIEBwYXJhbSBhZnRlclVuZG8gQ2FsbGVkIGFmdGVyIHVuZG8gb25seSDigJQgdXNlIGZvciBkaW1lbnNpb24gb3Igc3RhdGUgY2hhbmdlcyBzcGVjaWZpYyB0byB1bmRvLlxuICAgKiBAcGFyYW0gYWZ0ZXJSZWRvIENhbGxlZCBhZnRlciByZWRvIG9ubHkuXG4gICAqL1xuICB3aXRoSGlzdG9yeSh0cmFuc2FjdGlvbjogKG11dGF0b3I6IE0pID0+IHZvaWQsIGFmdGVyPzogKCkgPT4gdm9pZCwgYWZ0ZXJVbmRvPzogKCkgPT4gdm9pZCwgYWZ0ZXJSZWRvPzogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pblByb2dyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3dpdGhIaXN0b3J5IGlzIG5vdCByZS1lbnRyYW50IOKAlCBjb21taXQgb3Igcm9sbGJhY2sgdGhlIGN1cnJlbnQgb3BlcmF0aW9uIGZpcnN0Jyk7XG4gICAgfVxuICAgIHRoaXMuX2luUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICB0cmFuc2FjdGlvbih0aGlzLm11dGF0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuYWNjdW11bGF0b3Iucm9sbGJhY2tBZnRlckVycm9yKCk7XG4gICAgICB0aHJvdyBlO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pblByb2dyZXNzID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdG9yLmJlZm9yZVRpbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IHBhdGNoID0gdGhpcy5hY2N1bXVsYXRvci5leHRyYWN0UGF0Y2goKTtcbiAgICBjb25zdCBhY3Rpb24gPSB0aGlzLmhpc3RvcnlBY3Rpb25GYWN0b3J5KHRoaXMuY29uZmlnLCB0aGlzLmFjY3VtdWxhdG9yLCBwYXRjaCwgYWZ0ZXIsIGFmdGVyVW5kbywgYWZ0ZXJSZWRvKTtcbiAgICB0aGlzLmhpc3RvcnlNYW5hZ2VyLmNvbW1pdChhY3Rpb24pO1xuICB9XG4gIHJlc2l6ZShuZXdXaWR0aDogbnVtYmVyLCBuZXdIZWlnaHQ6IG51bWJlciwgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwLCBhZnRlcj86ICh0YXJnZXQ6IEltYWdlRGF0YSkgPT4gdm9pZCwgYWZ0ZXJVbmRvPzogKHRhcmdldDogSW1hZ2VEYXRhKSA9PiB2b2lkLCBhZnRlclJlZG8/OiAodGFyZ2V0OiBJbWFnZURhdGEpID0+IHZvaWQsIHJlc2l6ZUltYWdlRGF0YUZuID0gcmVzaXplSW1hZ2VEYXRhKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2luUHJvZ3Jlc3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHJlc2l6ZSBpbnNpZGUgYSB3aXRoSGlzdG9yeSBjYWxsYmFjaycpO1xuICAgIH1cbiAgICBpZiAodGhpcy5hY2N1bXVsYXRvci5iZWZvcmVUaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCByZXNpemUgd2l0aCBhbiBvcGVuIGFjY3VtdWxhdG9yIOKAlCBjb21taXQgb3Igcm9sbGJhY2sgZmlyc3QnKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCBiZWZvcmVJbWFnZURhdGEgPSB0YXJnZXQuaW1hZ2VEYXRhO1xuICAgIGNvbnN0IGFmdGVySW1hZ2VEYXRhID0gcmVzaXplSW1hZ2VEYXRhRm4oYmVmb3JlSW1hZ2VEYXRhLCBuZXdXaWR0aCwgbmV3SGVpZ2h0LCBvZmZzZXRYLCBvZmZzZXRZKTtcbiAgICBzZXRQaXhlbERhdGEodGFyZ2V0LCBhZnRlckltYWdlRGF0YSk7XG4gICAgdGhpcy5oaXN0b3J5TWFuYWdlci5jb21taXQoe1xuICAgICAgdW5kbzogKCkgPT4ge1xuICAgICAgICBzZXRQaXhlbERhdGEodGFyZ2V0LCBiZWZvcmVJbWFnZURhdGEpO1xuICAgICAgICBhZnRlclVuZG8/LihiZWZvcmVJbWFnZURhdGEpO1xuICAgICAgICBhZnRlcj8uKGJlZm9yZUltYWdlRGF0YSk7XG4gICAgICB9LFxuICAgICAgcmVkbzogKCkgPT4ge1xuICAgICAgICBzZXRQaXhlbERhdGEodGFyZ2V0LCBhZnRlckltYWdlRGF0YSk7XG4gICAgICAgIGFmdGVyUmVkbz8uKGFmdGVySW1hZ2VEYXRhKTtcbiAgICAgICAgYWZ0ZXI/LihhZnRlckltYWdlRGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbmV4cG9ydCB0eXBlIEhpc3RvcnlNdXRhdG9yPFQgZXh0ZW5kcyB7fSwgRCBleHRlbmRzIHt9PiA9ICh3cml0ZXI6IFBpeGVsV3JpdGVyPGFueT4sIGRlcHM/OiBQYXJ0aWFsPEQ+KSA9PiBUOyJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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","import { makeClippedRect, resolveRectClipping } from '../Rect/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link PixelData32} buffer with a solid color.\n *\n * @param dst - The target to modify.\n * @param color - The color to apply.\n * @param rect - Defines the area to fill. If omitted, the entire\n * @returns true if any pixels were actually modified.\n */\nexport function fillPixelData(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 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 const clip = resolveRectClipping(x, y, w, h, dst.w, dst.h, SCRATCH_RECT);\n if (!clip.inBounds) return false;\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data;\n const dw = dst.w;\n let hasChanged = false;\n for (let iy = 0; iy < actualH; iy++) {\n const rowOffset = (finalY + iy) * dw;\n const start = rowOffset + finalX;\n const end = start + actualW;\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKTtcblxuLyoqXG4gKiBGaWxscyBhIHJlZ2lvbiBvciB0aGUge0BsaW5rIFBpeGVsRGF0YTMyfSBidWZmZXIgd2l0aCBhIHNvbGlkIGNvbG9yLlxuICpcbiAqIEBwYXJhbSBkc3QgLSBUaGUgdGFyZ2V0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBjb2xvciB0byBhcHBseS5cbiAqIEBwYXJhbSByZWN0IC0gRGVmaW5lcyB0aGUgYXJlYSB0byBmaWxsLiBJZiBvbWl0dGVkLCB0aGUgZW50aXJlXG4gKiBAcmV0dXJucyB0cnVlIGlmIGFueSBwaXhlbHMgd2VyZSBhY3R1YWxseSBtb2RpZmllZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGEoZHN0OiBQaXhlbERhdGEzMiwgY29sb3I6IENvbG9yMzIsIHJlY3Q/OiBQYXJ0aWFsPFJlY3Q+KTogYm9vbGVhbjtcbi8qKlxuICogQHBhcmFtIGRzdCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHggLSBTdGFydGluZyBob3Jpem9udGFsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0geSAtIFN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUuXG4gKiBAcGFyYW0gdyAtIFdpZHRoIG9mIHRoZSBmaWxsIGFyZWEuXG4gKiBAcGFyYW0gaCAtIEhlaWdodCBvZiB0aGUgZmlsbCBhcmVhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmlsbFBpeGVsRGF0YShkc3Q6IFBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogYm9vbGVhbjtcbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhKGRzdDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBfeD86IFBhcnRpYWw8UmVjdD4gfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiBib29sZWFuIHtcbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcbiAgbGV0IHc6IG51bWJlcjtcbiAgbGV0IGg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBfeCA9PT0gJ29iamVjdCcpIHtcbiAgICB4ID0gX3gueCA/PyAwO1xuICAgIHkgPSBfeC55ID8/IDA7XG4gICAgdyA9IF94LncgPz8gZHN0Lnc7XG4gICAgaCA9IF94LmggPz8gZHN0Lmg7XG4gIH0gZWxzZSBpZiAodHlwZW9mIF94ID09PSAnbnVtYmVyJykge1xuICAgIHggPSBfeDtcbiAgICB5ID0gX3khO1xuICAgIHcgPSBfdyE7XG4gICAgaCA9IF9oITtcbiAgfSBlbHNlIHtcbiAgICB4ID0gMDtcbiAgICB5ID0gMDtcbiAgICB3ID0gZHN0Lnc7XG4gICAgaCA9IGRzdC5oO1xuICB9XG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlUmVjdENsaXBwaW5nKHgsIHksIHcsIGgsIGRzdC53LCBkc3QuaCwgU0NSQVRDSF9SRUNUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHtcbiAgICB4OiBmaW5hbFgsXG4gICAgeTogZmluYWxZLFxuICAgIHc6IGFjdHVhbFcsXG4gICAgaDogYWN0dWFsSFxuICB9ID0gY2xpcDtcbiAgY29uc3QgZHN0MzIgPSBkc3QuZGF0YTtcbiAgY29uc3QgZHcgPSBkc3QudztcbiAgbGV0IGhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgZm9yIChsZXQgaXkgPSAwOyBpeSA8IGFjdHVhbEg7IGl5KyspIHtcbiAgICBjb25zdCByb3dPZmZzZXQgPSAoZmluYWxZICsgaXkpICogZHc7XG4gICAgY29uc3Qgc3RhcnQgPSByb3dPZmZzZXQgKyBmaW5hbFg7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBhY3R1YWxXO1xuICAgIGZvciAobGV0IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICBpZiAoZHN0MzJbaV0gIT09IGNvbG9yKSB7XG4gICAgICAgIGRzdDMyW2ldID0gY29sb3I7XG4gICAgICAgIGhhc0NoYW5nZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQ2hhbmdlZDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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==","import { makeClippedRect, resolveRectClipping } from '../Rect/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region of the {@link PixelData32} buffer with a solid color using a mask.\n * @param target - The target to modify.\n * @param color - The color to apply.\n * @param mask - The mask defining the area to fill.\n * @param x - Starting horizontal coordinate for the mask placement.\n * @param y - Starting vertical coordinate for the mask placement.\n */\nexport function fillPixelDataBinaryMask(target: PixelData32, color: Color32, mask: BinaryMask, x = 0, y = 0): boolean {\n const maskW = mask.w;\n const maskH = mask.h;\n const clip = resolveRectClipping(x, y, maskW, maskH, target.w, target.h, SCRATCH_RECT);\n if (!clip.inBounds) return false;\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const maskData = mask.data;\n const dst32 = target.data;\n const dw = target.w;\n let hasChanged = false;\n for (let iy = 0; iy < actualH; iy++) {\n const currentY = finalY + iy;\n const maskY = currentY - y;\n const maskOffset = maskY * maskW;\n const dstRowOffset = currentY * dw;\n for (let ix = 0; ix < actualW; ix++) {\n const currentX = finalX + ix;\n const maskX = currentX - x;\n const maskIndex = maskOffset + maskX;\n if (maskData[maskIndex]) {\n const current = dst32[dstRowOffset + currentX];\n if (current !== color) {\n dst32[dstRowOffset + currentX] = color;\n hasChanged = true;\n }\n }\n }\n }\n return hasChanged;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKTtcblxuLyoqXG4gKiBGaWxscyBhIHJlZ2lvbiBvZiB0aGUge0BsaW5rIFBpeGVsRGF0YTMyfSBidWZmZXIgd2l0aCBhIHNvbGlkIGNvbG9yIHVzaW5nIGEgbWFzay5cbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHRvIG1vZGlmeS5cbiAqIEBwYXJhbSBjb2xvciAtIFRoZSBjb2xvciB0byBhcHBseS5cbiAqIEBwYXJhbSBtYXNrIC0gVGhlIG1hc2sgZGVmaW5pbmcgdGhlIGFyZWEgdG8gZmlsbC5cbiAqIEBwYXJhbSB4IC0gU3RhcnRpbmcgaG9yaXpvbnRhbCBjb29yZGluYXRlIGZvciB0aGUgbWFzayBwbGFjZW1lbnQuXG4gKiBAcGFyYW0geSAtIFN0YXJ0aW5nIHZlcnRpY2FsIGNvb3JkaW5hdGUgZm9yIHRoZSBtYXNrIHBsYWNlbWVudC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrKHRhcmdldDogUGl4ZWxEYXRhMzIsIGNvbG9yOiBDb2xvcjMyLCBtYXNrOiBCaW5hcnlNYXNrLCB4ID0gMCwgeSA9IDApOiBib29sZWFuIHtcbiAgY29uc3QgbWFza1cgPSBtYXNrLnc7XG4gIGNvbnN0IG1hc2tIID0gbWFzay5oO1xuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh4LCB5LCBtYXNrVywgbWFza0gsIHRhcmdldC53LCB0YXJnZXQuaCwgU0NSQVRDSF9SRUNUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHtcbiAgICB4OiBmaW5hbFgsXG4gICAgeTogZmluYWxZLFxuICAgIHc6IGFjdHVhbFcsXG4gICAgaDogYWN0dWFsSFxuICB9ID0gY2xpcDtcbiAgY29uc3QgbWFza0RhdGEgPSBtYXNrLmRhdGE7XG4gIGNvbnN0IGRzdDMyID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IGR3ID0gdGFyZ2V0Lnc7XG4gIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7XG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3QgY3VycmVudFkgPSBmaW5hbFkgKyBpeTtcbiAgICBjb25zdCBtYXNrWSA9IGN1cnJlbnRZIC0geTtcbiAgICBjb25zdCBtYXNrT2Zmc2V0ID0gbWFza1kgKiBtYXNrVztcbiAgICBjb25zdCBkc3RSb3dPZmZzZXQgPSBjdXJyZW50WSAqIGR3O1xuICAgIGZvciAobGV0IGl4ID0gMDsgaXggPCBhY3R1YWxXOyBpeCsrKSB7XG4gICAgICBjb25zdCBjdXJyZW50WCA9IGZpbmFsWCArIGl4O1xuICAgICAgY29uc3QgbWFza1ggPSBjdXJyZW50WCAtIHg7XG4gICAgICBjb25zdCBtYXNrSW5kZXggPSBtYXNrT2Zmc2V0ICsgbWFza1g7XG4gICAgICBpZiAobWFza0RhdGFbbWFza0luZGV4XSkge1xuICAgICAgICBjb25zdCBjdXJyZW50ID0gZHN0MzJbZHN0Um93T2Zmc2V0ICsgY3VycmVudFhdO1xuICAgICAgICBpZiAoY3VycmVudCAhPT0gY29sb3IpIHtcbiAgICAgICAgICBkc3QzMltkc3RSb3dPZmZzZXQgKyBjdXJyZW50WF0gPSBjb2xvcjtcbiAgICAgICAgICBoYXNDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gaGFzQ2hhbmdlZDtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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==","import { makeClippedRect, resolveRectClipping } from '../Rect/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\nexport function invertPixelData(target: PixelData32, opts?: PixelMutateOptions): boolean {\n const mask = opts?.mask;\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 width = opts?.w ?? target.w;\n const height = opts?.h ?? target.h;\n const invertMask = opts?.invertMask ?? false;\n const clip = resolveRectClipping(targetX, targetY, width, height, target.w, target.h, SCRATCH_RECT);\n if (!clip.inBounds) return false;\n const {\n x,\n y,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = target.data;\n const dw = target.w;\n const mPitch = mask?.w ?? width;\n const dx = x - targetX;\n const dy = y - targetY;\n let dIdx = y * dw + x;\n let mIdx = (my + dy) * mPitch + (mx + dx);\n const dStride = dw - actualW;\n const mStride = mPitch - actualW;\n\n // Optimization: Split loops to avoid checking `if (mask)` for every pixel.\n if (mask) {\n const maskData = mask.data;\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 (the top 8 bits)\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n }\n dIdx++;\n mIdx++;\n }\n dIdx += dStride;\n mIdx += mStride;\n }\n } else {\n for (let iy = 0; iy < actualH; iy++) {\n for (let ix = 0; ix < actualW; ix++) {\n dst32[dIdx] = dst32[dIdx] ^ 0x00FFFFFF;\n dIdx++;\n }\n dIdx += dStride;\n }\n }\n return true;\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKTtcbmV4cG9ydCBmdW5jdGlvbiBpbnZlcnRQaXhlbERhdGEodGFyZ2V0OiBQaXhlbERhdGEzMiwgb3B0cz86IFBpeGVsTXV0YXRlT3B0aW9ucyk6IGJvb2xlYW4ge1xuICBjb25zdCBtYXNrID0gb3B0cz8ubWFzaztcbiAgY29uc3QgdGFyZ2V0WCA9IG9wdHM/LnggPz8gMDtcbiAgY29uc3QgdGFyZ2V0WSA9IG9wdHM/LnkgPz8gMDtcbiAgY29uc3QgbXggPSBvcHRzPy5teCA/PyAwO1xuICBjb25zdCBteSA9IG9wdHM/Lm15ID8/IDA7XG4gIGNvbnN0IHdpZHRoID0gb3B0cz8udyA/PyB0YXJnZXQudztcbiAgY29uc3QgaGVpZ2h0ID0gb3B0cz8uaCA/PyB0YXJnZXQuaDtcbiAgY29uc3QgaW52ZXJ0TWFzayA9IG9wdHM/LmludmVydE1hc2sgPz8gZmFsc2U7XG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlUmVjdENsaXBwaW5nKHRhcmdldFgsIHRhcmdldFksIHdpZHRoLCBoZWlnaHQsIHRhcmdldC53LCB0YXJnZXQuaCwgU0NSQVRDSF9SRUNUKTtcbiAgaWYgKCFjbGlwLmluQm91bmRzKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxIXG4gIH0gPSBjbGlwO1xuICBjb25zdCBkc3QzMiA9IHRhcmdldC5kYXRhO1xuICBjb25zdCBkdyA9IHRhcmdldC53O1xuICBjb25zdCBtUGl0Y2ggPSBtYXNrPy53ID8/IHdpZHRoO1xuICBjb25zdCBkeCA9IHggLSB0YXJnZXRYO1xuICBjb25zdCBkeSA9IHkgLSB0YXJnZXRZO1xuICBsZXQgZElkeCA9IHkgKiBkdyArIHg7XG4gIGxldCBtSWR4ID0gKG15ICsgZHkpICogbVBpdGNoICsgKG14ICsgZHgpO1xuICBjb25zdCBkU3RyaWRlID0gZHcgLSBhY3R1YWxXO1xuICBjb25zdCBtU3RyaWRlID0gbVBpdGNoIC0gYWN0dWFsVztcblxuICAvLyBPcHRpbWl6YXRpb246IFNwbGl0IGxvb3BzIHRvIGF2b2lkIGNoZWNraW5nIGBpZiAobWFzaylgIGZvciBldmVyeSBwaXhlbC5cbiAgaWYgKG1hc2spIHtcbiAgICBjb25zdCBtYXNrRGF0YSA9IG1hc2suZGF0YTtcbiAgICBmb3IgKGxldCBpeSA9IDA7IGl5IDwgYWN0dWFsSDsgaXkrKykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGFjdHVhbFc7IGl4KyspIHtcbiAgICAgICAgY29uc3QgbVZhbCA9IG1hc2tEYXRhW21JZHhdO1xuICAgICAgICBjb25zdCBpc0hpdCA9IGludmVydE1hc2sgPyBtVmFsID09PSAwIDogbVZhbCA9PT0gMTtcbiAgICAgICAgaWYgKGlzSGl0KSB7XG4gICAgICAgICAgLy8gWE9SIHdpdGggMHgwMEZGRkZGRiBmbGlwcyBSR0IgYml0cyBhbmQgaWdub3JlcyBBbHBoYSAodGhlIHRvcCA4IGJpdHMpXG4gICAgICAgICAgZHN0MzJbZElkeF0gPSBkc3QzMltkSWR4XSBeIDB4MDBGRkZGRkY7XG4gICAgICAgIH1cbiAgICAgICAgZElkeCsrO1xuICAgICAgICBtSWR4Kys7XG4gICAgICB9XG4gICAgICBkSWR4ICs9IGRTdHJpZGU7XG4gICAgICBtSWR4ICs9IG1TdHJpZGU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgICBmb3IgKGxldCBpeCA9IDA7IGl4IDwgYWN0dWFsVzsgaXgrKykge1xuICAgICAgICBkc3QzMltkSWR4XSA9IGRzdDMyW2RJZHhdIF4gMHgwMEZGRkZGRjtcbiAgICAgICAgZElkeCsrO1xuICAgICAgfVxuICAgICAgZElkeCArPSBkU3RyaWRlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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({\n data,\n width,\n height\n}: ImageDataLike): ImageData {\n return new ImageData(data.slice(), width, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gY29weUltYWdlRGF0YSh7XG4gIGRhdGEsXG4gIHdpZHRoLFxuICBoZWlnaHRcbn06IEltYWdlRGF0YUxpa2UpOiBJbWFnZURhdGEge1xuICByZXR1cm4gbmV3IEltYWdlRGF0YShkYXRhLnNsaWNlKCksIHdpZHRoLCBoZWlnaHQpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGNvcHlJbWFnZURhdGFMaWtlKHtcbiAgZGF0YSxcbiAgd2lkdGgsXG4gIGhlaWdodFxufTogSW1hZ2VEYXRhTGlrZSk6IEltYWdlRGF0YUxpa2Uge1xuICByZXR1cm4ge1xuICAgIGRhdGE6IGRhdGEuc2xpY2UoKSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHRcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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","import { MaskType } from '../Mask/_mask-types';\nimport { makeClippedBlit, resolveBlitClipping } from '../Rect/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Writes image data from a source to a target with support for clipping and alpha masking.\n *\n * @param target - The destination ImageData to write to.\n * @param source - The source ImageData to read from.\n * @param x - The x-coordinate in the target where drawing starts.\n * @param y - The y-coordinate in the target where drawing starts.\n * @param sx - The x-coordinate in the source to start copying from.\n * @param sy - The y-coordinate in the source to start copying from.\n * @param sw - The width of the rectangle to copy.\n * @param sh - The height of the rectangle to copy.\n * @param mask - An optional Uint8Array mask (0-255). 0 is transparent, 255 is opaque.\n * @param maskType - type of mask\n */\nexport function writeImageData(target: ImageData, source: ImageData, x: number, y: number, sx: number = 0, sy: number = 0, sw: number = source.width, sh: number = source.height, mask: Uint8Array | null = null, maskType: MaskType = MaskType.BINARY): void {\n const dstW = target.width;\n const dstH = target.height;\n const dstData = target.data;\n const srcW = source.width;\n const srcData = source.data;\n const clip = resolveBlitClipping(x, y, sx, sy, sw, sh, dstW, dstH, srcW, source.height, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n const useMask = !!mask;\n for (let row = 0; row < copyH; row++) {\n const currentDstY = dstY + row;\n const currentSrcY = srcY + row;\n const dstStart = (currentDstY * dstW + dstX) * 4;\n const srcStart = (currentSrcY * srcW + srcX) * 4;\n if (useMask && mask) {\n for (let ix = 0; ix < copyW; ix++) {\n const mi = currentSrcY * srcW + (srcX + ix);\n const alpha = mask[mi];\n if (alpha === 0) {\n continue;\n }\n const di = dstStart + ix * 4;\n const si = srcStart + ix * 4;\n if (maskType === MaskType.BINARY || alpha === 255) {\n dstData[di] = srcData[si];\n dstData[di + 1] = srcData[si + 1];\n dstData[di + 2] = srcData[si + 2];\n dstData[di + 3] = srcData[si + 3];\n } else {\n const a = alpha / 255;\n const invA = 1 - a;\n dstData[di] = srcData[si] * a + dstData[di] * invA;\n dstData[di + 1] = srcData[si + 1] * a + dstData[di + 1] * invA;\n dstData[di + 2] = srcData[si + 2] * a + dstData[di + 2] * invA;\n dstData[di + 3] = srcData[si + 3] * a + dstData[di + 3] * invA;\n }\n }\n } else {\n const byteLen = copyW * 4;\n const sub = srcData.subarray(srcStart, srcStart + byteLen);\n dstData.set(sub, dstStart);\n }\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXNrVHlwZSB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuaW1wb3J0IHsgbWFrZUNsaXBwZWRCbGl0LCByZXNvbHZlQmxpdENsaXBwaW5nIH0gZnJvbSAnLi4vUmVjdC9yZXNvbHZlQ2xpcHBpbmcnO1xuY29uc3QgU0NSQVRDSF9CTElUID0gbWFrZUNsaXBwZWRCbGl0KCk7XG5cbi8qKlxuICogV3JpdGVzIGltYWdlIGRhdGEgZnJvbSBhIHNvdXJjZSB0byBhIHRhcmdldCB3aXRoIHN1cHBvcnQgZm9yIGNsaXBwaW5nIGFuZCBhbHBoYSBtYXNraW5nLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgZGVzdGluYXRpb24gSW1hZ2VEYXRhIHRvIHdyaXRlIHRvLlxuICogQHBhcmFtIHNvdXJjZSAtIFRoZSBzb3VyY2UgSW1hZ2VEYXRhIHRvIHJlYWQgZnJvbS5cbiAqIEBwYXJhbSB4IC0gVGhlIHgtY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0IHdoZXJlIGRyYXdpbmcgc3RhcnRzLlxuICogQHBhcmFtIHkgLSBUaGUgeS1jb29yZGluYXRlIGluIHRoZSB0YXJnZXQgd2hlcmUgZHJhd2luZyBzdGFydHMuXG4gKiBAcGFyYW0gc3ggLSBUaGUgeC1jb29yZGluYXRlIGluIHRoZSBzb3VyY2UgdG8gc3RhcnQgY29weWluZyBmcm9tLlxuICogQHBhcmFtIHN5IC0gVGhlIHktY29vcmRpbmF0ZSBpbiB0aGUgc291cmNlIHRvIHN0YXJ0IGNvcHlpbmcgZnJvbS5cbiAqIEBwYXJhbSBzdyAtIFRoZSB3aWR0aCBvZiB0aGUgcmVjdGFuZ2xlIHRvIGNvcHkuXG4gKiBAcGFyYW0gc2ggLSBUaGUgaGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgdG8gY29weS5cbiAqIEBwYXJhbSBtYXNrIC0gQW4gb3B0aW9uYWwgVWludDhBcnJheSBtYXNrICgwLTI1NSkuIDAgaXMgdHJhbnNwYXJlbnQsIDI1NSBpcyBvcGFxdWUuXG4gKiBAcGFyYW0gbWFza1R5cGUgLSB0eXBlIG9mIG1hc2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhKHRhcmdldDogSW1hZ2VEYXRhLCBzb3VyY2U6IEltYWdlRGF0YSwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHN4OiBudW1iZXIgPSAwLCBzeTogbnVtYmVyID0gMCwgc3c6IG51bWJlciA9IHNvdXJjZS53aWR0aCwgc2g6IG51bWJlciA9IHNvdXJjZS5oZWlnaHQsIG1hc2s6IFVpbnQ4QXJyYXkgfCBudWxsID0gbnVsbCwgbWFza1R5cGU6IE1hc2tUeXBlID0gTWFza1R5cGUuQklOQVJZKTogdm9pZCB7XG4gIGNvbnN0IGRzdFcgPSB0YXJnZXQud2lkdGg7XG4gIGNvbnN0IGRzdEggPSB0YXJnZXQuaGVpZ2h0O1xuICBjb25zdCBkc3REYXRhID0gdGFyZ2V0LmRhdGE7XG4gIGNvbnN0IHNyY1cgPSBzb3VyY2Uud2lkdGg7XG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YTtcbiAgY29uc3QgY2xpcCA9IHJlc29sdmVCbGl0Q2xpcHBpbmcoeCwgeSwgc3gsIHN5LCBzdywgc2gsIGRzdFcsIGRzdEgsIHNyY1csIHNvdXJjZS5oZWlnaHQsIFNDUkFUQ0hfQkxJVCk7XG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuO1xuICBjb25zdCB7XG4gICAgeDogZHN0WCxcbiAgICB5OiBkc3RZLFxuICAgIHN4OiBzcmNYLFxuICAgIHN5OiBzcmNZLFxuICAgIHc6IGNvcHlXLFxuICAgIGg6IGNvcHlIXG4gIH0gPSBjbGlwO1xuICBjb25zdCB1c2VNYXNrID0gISFtYXNrO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBjdXJyZW50RHN0WSA9IGRzdFkgKyByb3c7XG4gICAgY29uc3QgY3VycmVudFNyY1kgPSBzcmNZICsgcm93O1xuICAgIGNvbnN0IGRzdFN0YXJ0ID0gKGN1cnJlbnREc3RZICogZHN0VyArIGRzdFgpICogNDtcbiAgICBjb25zdCBzcmNTdGFydCA9IChjdXJyZW50U3JjWSAqIHNyY1cgKyBzcmNYKSAqIDQ7XG4gICAgaWYgKHVzZU1hc2sgJiYgbWFzaykge1xuICAgICAgZm9yIChsZXQgaXggPSAwOyBpeCA8IGNvcHlXOyBpeCsrKSB7XG4gICAgICAgIGNvbnN0IG1pID0gY3VycmVudFNyY1kgKiBzcmNXICsgKHNyY1ggKyBpeCk7XG4gICAgICAgIGNvbnN0IGFscGhhID0gbWFza1ttaV07XG4gICAgICAgIGlmIChhbHBoYSA9PT0gMCkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpID0gZHN0U3RhcnQgKyBpeCAqIDQ7XG4gICAgICAgIGNvbnN0IHNpID0gc3JjU3RhcnQgKyBpeCAqIDQ7XG4gICAgICAgIGlmIChtYXNrVHlwZSA9PT0gTWFza1R5cGUuQklOQVJZIHx8IGFscGhhID09PSAyNTUpIHtcbiAgICAgICAgICBkc3REYXRhW2RpXSA9IHNyY0RhdGFbc2ldO1xuICAgICAgICAgIGRzdERhdGFbZGkgKyAxXSA9IHNyY0RhdGFbc2kgKyAxXTtcbiAgICAgICAgICBkc3REYXRhW2RpICsgMl0gPSBzcmNEYXRhW3NpICsgMl07XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDNdID0gc3JjRGF0YVtzaSArIDNdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGEgPSBhbHBoYSAvIDI1NTtcbiAgICAgICAgICBjb25zdCBpbnZBID0gMSAtIGE7XG4gICAgICAgICAgZHN0RGF0YVtkaV0gPSBzcmNEYXRhW3NpXSAqIGEgKyBkc3REYXRhW2RpXSAqIGludkE7XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDFdID0gc3JjRGF0YVtzaSArIDFdICogYSArIGRzdERhdGFbZGkgKyAxXSAqIGludkE7XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDJdID0gc3JjRGF0YVtzaSArIDJdICogYSArIGRzdERhdGFbZGkgKyAyXSAqIGludkE7XG4gICAgICAgICAgZHN0RGF0YVtkaSArIDNdID0gc3JjRGF0YVtzaSArIDNdICogYSArIGRzdERhdGFbZGkgKyAzXSAqIGludkE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnl0ZUxlbiA9IGNvcHlXICogNDtcbiAgICAgIGNvbnN0IHN1YiA9IHNyY0RhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgYnl0ZUxlbik7XG4gICAgICBkc3REYXRhLnNldChzdWIsIGRzdFN0YXJ0KTtcbiAgICB9XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { makeClippedBlit, resolveBlitClipping } from '../Rect/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of an {@link ImageData} object.\n *\n * This function performs a direct memory copy from a {@link Uint8ClampedArray}\n * into the target {@link ImageData} buffer. It supports both {@link Rect}\n * objects and discrete coordinates.\n *\n * @param target - The target to write into. Must match the rect width/height.\n * @param data - The source pixel data (RGBA).\n * @param rect - A rect defining the destination region.\n */\nexport function writeImageDataBuffer(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 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 {\n width: dstW,\n height: dstH,\n data: dst\n } = target;\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\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 dst.set(data.subarray(srcStart, srcStart + rowLen), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKTtcblxuLyoqXG4gKiBDb3BpZXMgYSBwaXhlbCBidWZmZXIgaW50byBhIHNwZWNpZmljIHJlZ2lvbiBvZiBhbiB7QGxpbmsgSW1hZ2VEYXRhfSBvYmplY3QuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBhIGRpcmVjdCBtZW1vcnkgY29weSBmcm9tIGEge0BsaW5rIFVpbnQ4Q2xhbXBlZEFycmF5fVxuICogaW50byB0aGUgdGFyZ2V0IHtAbGluayBJbWFnZURhdGF9IGJ1ZmZlci4gSXQgc3VwcG9ydHMgYm90aCB7QGxpbmsgUmVjdH1cbiAqIG9iamVjdHMgYW5kIGRpc2NyZXRlIGNvb3JkaW5hdGVzLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHRvIHdyaXRlIGludG8uIE11c3QgbWF0Y2ggdGhlIHJlY3Qgd2lkdGgvaGVpZ2h0LlxuICogQHBhcmFtIGRhdGEgLSBUaGUgc291cmNlIHBpeGVsIGRhdGEgKFJHQkEpLlxuICogQHBhcmFtIHJlY3QgLSBBIHJlY3QgZGVmaW5pbmcgdGhlIGRlc3RpbmF0aW9uIHJlZ2lvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhQnVmZmVyKHRhcmdldDogSW1hZ2VEYXRhLCBkYXRhOiBVaW50OENsYW1wZWRBcnJheSwgcmVjdDogUmVjdCk6IHZvaWQ7XG4vKipcbiAqIEBwYXJhbSB0YXJnZXQgLSBUaGUgdGFyZ2V0IHRvIHdyaXRlIGludG8uXG4gKiBAcGFyYW0gZGF0YSAtIFRoZSBzb3VyY2UgcGl4ZWwgZGF0YSAoUkdCQSkuIE11c3QgbWF0Y2ggdGhlIHdpZHRoL2hlaWdodC5cbiAqIEBwYXJhbSB4IC0gVGhlIHN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0LlxuICogQHBhcmFtIHkgLSBUaGUgc3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZSBpbiB0aGUgdGFyZ2V0LlxuICogQHBhcmFtIHcgLSBUaGUgd2lkdGggb2YgdGhlIHJlZ2lvbiB0byB3cml0ZS5cbiAqIEBwYXJhbSBoIC0gVGhlIGhlaWdodCBvZiB0aGUgcmVnaW9uIHRvIHdyaXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3JpdGVJbWFnZURhdGFCdWZmZXIodGFyZ2V0OiBJbWFnZURhdGEsIGRhdGE6IFVpbnQ4Q2xhbXBlZEFycmF5LCB4OiBudW1iZXIsIHk6IG51bWJlciwgdzogbnVtYmVyLCBoOiBudW1iZXIpOiB2b2lkO1xuZXhwb3J0IGZ1bmN0aW9uIHdyaXRlSW1hZ2VEYXRhQnVmZmVyKHRhcmdldDogSW1hZ2VEYXRhLCBkYXRhOiBVaW50OENsYW1wZWRBcnJheSwgX3g6IFJlY3QgfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiB2b2lkIHtcbiAgY29uc3Qge1xuICAgIHgsXG4gICAgeSxcbiAgICB3LFxuICAgIGhcbiAgfSA9IHR5cGVvZiBfeCA9PT0gJ29iamVjdCcgPyBfeCA6IHtcbiAgICB4OiBfeCxcbiAgICB5OiBfeSEsXG4gICAgdzogX3chLFxuICAgIGg6IF9oIVxuICB9O1xuICBjb25zdCB7XG4gICAgd2lkdGg6IGRzdFcsXG4gICAgaGVpZ2h0OiBkc3RILFxuICAgIGRhdGE6IGRzdFxuICB9ID0gdGFyZ2V0O1xuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyh4LCB5LCAwLCAwLCB3LCBoLCBkc3RXLCBkc3RILCB3LCBoLCBTQ1JBVENIX0JMSVQpO1xuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVybjtcbiAgY29uc3Qge1xuICAgIHg6IGRzdFgsXG4gICAgeTogZHN0WSxcbiAgICBzeDogc3JjWCxcbiAgICBzeTogc3JjWSxcbiAgICB3OiBjb3B5VyxcbiAgICBoOiBjb3B5SFxuICB9ID0gY2xpcDtcbiAgY29uc3Qgcm93TGVuID0gY29weVcgKiA0O1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBjb3B5SDsgcm93KyspIHtcbiAgICBjb25zdCBkc3RTdGFydCA9ICgoZHN0WSArIHJvdykgKiBkc3RXICsgZHN0WCkgKiA0O1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKChzcmNZICsgcm93KSAqIHcgKyBzcmNYKSAqIDQ7XG4gICAgZHN0LnNldChkYXRhLnN1YmFycmF5KHNyY1N0YXJ0LCBzcmNTdGFydCArIHJvd0xlbiksIGRzdFN0YXJ0KTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","/**\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>;\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFscGhhTWFzaywgQmluYXJ5TWFzayB9IGZyb20gJy4uL01hc2svX21hc2stdHlwZXMnO1xuZXhwb3J0IGVudW0gUGFpbnRNYXNrT3V0bGluZSB7XG4gIE1BU0tFRCxcbiAgQ0lSQ0xFLFxuICBSRUNULFxufVxuaW50ZXJmYWNlIEJhc2VQYWludE1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiB7XG4gIHJlYWRvbmx5IG91dGxpbmVUeXBlOiBUO1xuICByZWFkb25seSBjZW50ZXJPZmZzZXRYOiBudW1iZXI7XG4gIHJlYWRvbmx5IGNlbnRlck9mZnNldFk6IG51bWJlcjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgUGFpbnRBbHBoYU1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiBleHRlbmRzIEJhc2VQYWludE1hc2s8VD4sIEFscGhhTWFzayB7fVxuZXhwb3J0IGludGVyZmFjZSBQYWludEJpbmFyeU1hc2s8VCBleHRlbmRzIFBhaW50TWFza091dGxpbmUgPSBQYWludE1hc2tPdXRsaW5lPiBleHRlbmRzIEJhc2VQYWludE1hc2s8VD4sIEJpbmFyeU1hc2sge31cbmV4cG9ydCB0eXBlIFBhaW50TWFzayA9IFBhaW50QWxwaGFNYXNrPGFueT4gfCBQYWludEJpbmFyeU1hc2s8YW55PjsiXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataAlphaMask } from '../PixelData/blendColorPixelDataAlphaMask';\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 blendColorPixelDataAlphaMaskFn = blendColorPixelDataAlphaMask;\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, brushWidth: number, brushHeight: number, x: number, y: number): boolean;\n paintRect(alpha: number, brushWidth: number, brushHeight: number, startX: number, startY: number, endX: number, endY: number): boolean;\n paintRect(alpha: number, brushWidth: number, brushHeight: number, 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 centerOffsetX = (-(brushWidth - 1 >> 1));\n const centerOffsetY = (-(brushHeight - 1 >> 1));\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 private opts = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n commit(accumulator: PixelAccumulator, color: Color32, alpha = 255, blendFn = sourceOverPerfect) {\n const blendColorPixelDataAlphaMaskFn = this.blendColorPixelDataAlphaMaskFn;\n const tileShift = this.config.tileShift;\n const lookup = this.lookup;\n const opts = this.opts;\n opts.alpha = alpha;\n 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 opts.x = dx;\n opts.y = dy;\n opts.w = tile.w;\n opts.h = tile.h;\n didChange(blendColorPixelDataAlphaMaskFn(this.config.target, color, tile, opts));\n }\n }\n this.clear();\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzayB9IGZyb20gJy4uL1BpeGVsRGF0YS9ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrJztcbmltcG9ydCB7IHRyaW1SZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltUmVjdEJvdW5kcyc7XG5pbXBvcnQgeyBlYWNoVGlsZUluQm91bmRzIH0gZnJvbSAnLi9lYWNoVGlsZUluQm91bmRzJztcbmV4cG9ydCBjbGFzcyBBbHBoYU1hc2tQYWludEJ1ZmZlciB7XG4gIHJlYWRvbmx5IGxvb2t1cDogKEFscGhhTWFza1RpbGUgfCB1bmRlZmluZWQpW107XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NyYXRjaEJvdW5kczogUmVjdCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwXG4gIH07XG4gIHByaXZhdGUgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFza0ZuID0gYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFzaztcbiAgcHJpdmF0ZSBmb3JFYWNoTGluZVBvaW50Rm4gPSBmb3JFYWNoTGluZVBvaW50O1xuICBwcml2YXRlIHRyaW1SZWN0Qm91bmRzRm4gPSB0cmltUmVjdEJvdW5kcztcbiAgcHJpdmF0ZSBlYWNoVGlsZUluQm91bmRzRm4gPSBlYWNoVGlsZUluQm91bmRzO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLCByZWFkb25seSB0aWxlUG9vbDogVGlsZVBvb2w8QWxwaGFNYXNrVGlsZT4pIHtcbiAgICB0aGlzLmxvb2t1cCA9IFtdO1xuICB9XG4gIHBhaW50QWxwaGFNYXNrKGJydXNoOiBQYWludEFscGhhTWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEFscGhhTWFzayhicnVzaDogUGFpbnRBbHBoYU1hc2ssIHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEFscGhhTWFzayhicnVzaDogUGFpbnRBbHBoYU1hc2ssIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IHtcbiAgICAgIHc6IGJXLFxuICAgICAgaDogYkgsXG4gICAgICBkYXRhOiBiRCxcbiAgICAgIGNlbnRlck9mZnNldFgsXG4gICAgICBjZW50ZXJPZmZzZXRZXG4gICAgfSA9IGJydXNoO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgZWFjaFRpbGVJbkJvdW5kc0ZuID0gdGhpcy5lYWNoVGlsZUluQm91bmRzRm47XG4gICAgY29uc3QgdHJpbVJlY3RCb3VuZHNGbiA9IHRoaXMudHJpbVJlY3RCb3VuZHNGbjtcbiAgICB0aGlzLmZvckVhY2hMaW5lUG9pbnRGbih4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WCk7XG4gICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKTtcbiAgICAgIHRyaW1SZWN0Qm91bmRzRm4odG9wTGVmdFgsIHRvcExlZnRZLCBiVywgYkgsIHRhcmdldC53LCB0YXJnZXQuaCwgc2NyYXRjaCk7XG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVybjtcbiAgICAgIGVhY2hUaWxlSW5Cb3VuZHNGbihjb25maWcsIGxvb2t1cCwgdGlsZVBvb2wsIHNjcmF0Y2gsICh0aWxlLCBiWCwgYlksIGJXX3QsIGJIX3QpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRpbGUuZGF0YTtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiVztcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzWCA9IGJYICsgajtcbiAgICAgICAgICAgIGNvbnN0IGJydXNoQSA9IGJEW2JPZmYgKyAoY2FudmFzWCAtIHRvcExlZnRYKV07XG4gICAgICAgICAgICBpZiAoYnJ1c2hBID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcblxuICAgICAgICAgICAgLy8gT25seSBvdmVyd3JpdGUgaWYgdGhlIGJydXNoIHN0cm9rZSBpcyBzdHJvbmdlciB0aGFuIHRoZSBleGlzdGluZyBtYXNrIHBpeGVsXG4gICAgICAgICAgICBpZiAoYnJ1c2hBID4gZGF0YVtpZHhdKSB7XG4gICAgICAgICAgICAgIGRhdGFbaWR4XSA9IGJydXNoQTtcbiAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgcGFpbnRCaW5hcnlNYXNrKGJydXNoOiBQYWludEJpbmFyeU1hc2ssIGFscGhhOiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRCaW5hcnlNYXNrKGJydXNoOiBQYWludEJpbmFyeU1hc2ssIGFscGhhOiBudW1iZXIsIHN0YXJ0WDogbnVtYmVyLCBzdGFydFk6IG51bWJlciwgZW5kWDogbnVtYmVyLCBlbmRZOiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEJpbmFyeU1hc2soYnJ1c2g6IFBhaW50QmluYXJ5TWFzaywgYWxwaGE6IG51bWJlciwgeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciA9IHgwLCB5MTogbnVtYmVyID0geTApOiBib29sZWFuIHtcbiAgICBpZiAoYWxwaGEgPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbDtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IHRpbGVNYXNrID0gY29uZmlnLnRpbGVNYXNrO1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gICAgY29uc3Qge1xuICAgICAgdzogYlcsXG4gICAgICBoOiBiSCxcbiAgICAgIGRhdGE6IGJELFxuICAgICAgY2VudGVyT2Zmc2V0WCxcbiAgICAgIGNlbnRlck9mZnNldFlcbiAgICB9ID0gYnJ1c2g7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBjb25zdCB0cmltUmVjdEJvdW5kc0ZuID0gdGhpcy50cmltUmVjdEJvdW5kc0ZuO1xuICAgIGNvbnN0IGVhY2hUaWxlSW5Cb3VuZHNGbiA9IHRoaXMuZWFjaFRpbGVJbkJvdW5kc0ZuO1xuICAgIHRoaXMuZm9yRWFjaExpbmVQb2ludEZuKHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKTtcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpO1xuICAgICAgdHJpbVJlY3RCb3VuZHNGbih0b3BMZWZ0WCwgdG9wTGVmdFksIGJXLCBiSCwgdGFyZ2V0LncsIHRhcmdldC5oLCBzY3JhdGNoKTtcbiAgICAgIGlmIChzY3JhdGNoLncgPD0gMCB8fCBzY3JhdGNoLmggPD0gMCkgcmV0dXJuO1xuICAgICAgZWFjaFRpbGVJbkJvdW5kc0ZuKGNvbmZpZywgbG9va3VwLCB0aWxlUG9vbCwgc2NyYXRjaCwgKHRpbGUsIGJYLCBiWSwgYldfdCwgYkhfdCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gdGlsZS5kYXRhO1xuICAgICAgICBsZXQgdGlsZUNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiSF90OyBpKyspIHtcbiAgICAgICAgICBjb25zdCBjYW52YXNZID0gYlkgKyBpO1xuICAgICAgICAgIGNvbnN0IGJPZmYgPSAoY2FudmFzWSAtIHRvcExlZnRZKSAqIGJXO1xuICAgICAgICAgIGNvbnN0IHRPZmYgPSAoY2FudmFzWSAmIHRpbGVNYXNrKSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgICAgY29uc3QgZFMgPSB0T2ZmICsgKGJYICYgdGlsZU1hc2spO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYldfdDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBjYW52YXNYID0gYlggKyBqO1xuICAgICAgICAgICAgaWYgKGJEW2JPZmYgKyAoY2FudmFzWCAtIHRvcExlZnRYKV0pIHtcbiAgICAgICAgICAgICAgY29uc3QgaWR4ID0gZFMgKyBqO1xuICAgICAgICAgICAgICBpZiAoZGF0YVtpZHhdIDwgYWxwaGEpIHtcbiAgICAgICAgICAgICAgICBkYXRhW2lkeF0gPSBhbHBoYTtcbiAgICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGVDaGFuZ2VkKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG4gIHBhaW50UmVjdChhbHBoYTogbnVtYmVyLCBicnVzaFdpZHRoOiBudW1iZXIsIGJydXNoSGVpZ2h0OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRSZWN0KGFscGhhOiBudW1iZXIsIGJydXNoV2lkdGg6IG51bWJlciwgYnJ1c2hIZWlnaHQ6IG51bWJlciwgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRYOiBudW1iZXIsIGVuZFk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50UmVjdChhbHBoYTogbnVtYmVyLCBicnVzaFdpZHRoOiBudW1iZXIsIGJydXNoSGVpZ2h0OiBudW1iZXIsIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSAoLShicnVzaFdpZHRoIC0gMSA+PiAxKSk7XG4gICAgY29uc3QgY2VudGVyT2Zmc2V0WSA9ICgtKGJydXNoSGVpZ2h0IC0gMSA+PiAxKSk7XG4gICAgY29uc3QgdHJpbVJlY3RCb3VuZHNGbiA9IHRoaXMudHJpbVJlY3RCb3VuZHNGbjtcbiAgICBjb25zdCBlYWNoVGlsZUluQm91bmRzRm4gPSB0aGlzLmVhY2hUaWxlSW5Cb3VuZHNGbjtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9yRWFjaExpbmVQb2ludEZuKHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKTtcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpO1xuICAgICAgdHJpbVJlY3RCb3VuZHNGbih0b3BMZWZ0WCwgdG9wTGVmdFksIGJydXNoV2lkdGgsIGJydXNoSGVpZ2h0LCB0YXJnZXQudywgdGFyZ2V0LmgsIHNjcmF0Y2gpO1xuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm47XG4gICAgICBlYWNoVGlsZUluQm91bmRzRm4oY29uZmlnLCBsb29rdXAsIHRpbGVQb29sLCBzY3JhdGNoLCAodGlsZSwgYlgsIGJZLCBiV190LCBiSF90KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aWxlLmRhdGE7XG4gICAgICAgIGxldCB0aWxlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJIX3Q7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGk7XG4gICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdDtcbiAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzayk7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBiV190OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBhbHBoYSBpcyBzdHJvbmdlciB0aGFuIHRoZSBjdXJyZW50IGFscGhhLCBvdmVyd3JpdGUgaXRcbiAgICAgICAgICAgIGlmIChhbHBoYSA+IGRhdGFbaWR4XSkge1xuICAgICAgICAgICAgICBkYXRhW2lkeF0gPSBhbHBoYTtcbiAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIHtcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgcHJpdmF0ZSBvcHRzID0ge1xuICAgIGFscGhhOiAyNTUsXG4gICAgYmxlbmRGbjogc291cmNlT3ZlclBlcmZlY3QsXG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMFxuICB9O1xuICBjb21taXQoYWNjdW11bGF0b3I6IFBpeGVsQWNjdW11bGF0b3IsIGNvbG9yOiBDb2xvcjMyLCBhbHBoYSA9IDI1NSwgYmxlbmRGbiA9IHNvdXJjZU92ZXJQZXJmZWN0KSB7XG4gICAgY29uc3QgYmxlbmRDb2xvclBpeGVsRGF0YUFscGhhTWFza0ZuID0gdGhpcy5ibGVuZENvbG9yUGl4ZWxEYXRhQWxwaGFNYXNrRm47XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gdGhpcy5jb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICAgIGNvbnN0IG9wdHMgPSB0aGlzLm9wdHM7XG4gICAgb3B0cy5hbHBoYSA9IGFscGhhO1xuICAgIG9wdHMuYmxlbmRGbiA9IGJsZW5kRm47XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkaWRDaGFuZ2UgPSBhY2N1bXVsYXRvci5zdG9yZVRpbGVCZWZvcmVTdGF0ZSh0aWxlLmlkLCB0aWxlLnR4LCB0aWxlLnR5KTtcbiAgICAgICAgY29uc3QgZHggPSB0aWxlLnR4IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgb3B0cy54ID0gZHg7XG4gICAgICAgIG9wdHMueSA9IGR5O1xuICAgICAgICBvcHRzLncgPSB0aWxlLnc7XG4gICAgICAgIG9wdHMuaCA9IHRpbGUuaDtcbiAgICAgICAgZGlkQ2hhbmdlKGJsZW5kQ29sb3JQaXhlbERhdGFBbHBoYU1hc2tGbih0aGlzLmNvbmZpZy50YXJnZXQsIGNvbG9yLCB0aWxlLCBvcHRzKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlcyh0aGlzLmxvb2t1cCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import type { Color32 } from '../_types';\nimport { CANVAS_CTX_FAILED } from '../Internal/_errors';\nimport { makePixelData } from '../PixelData/PixelData';\nexport type AlphaMaskPaintBufferCanvasRenderer = ReturnType<typeof makeAlphaMaskPaintBufferCanvasRenderer>;\nexport function makeAlphaMaskPaintBufferCanvasRenderer(paintBuffer: AlphaMaskPaintBuffer, offscreenCanvasClass = OffscreenCanvas) {\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 = new offscreenCanvasClass(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, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgQ0FOVkFTX0NUWF9GQUlMRUQgfSBmcm9tICcuLi9JbnRlcm5hbC9fZXJyb3JzJztcbmltcG9ydCB7IG1ha2VQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvUGl4ZWxEYXRhJztcbmV4cG9ydCB0eXBlIEFscGhhTWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQWxwaGFNYXNrUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcj47XG5leHBvcnQgZnVuY3Rpb24gbWFrZUFscGhhTWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIocGFpbnRCdWZmZXI6IEFscGhhTWFza1BhaW50QnVmZmVyLCBvZmZzY3JlZW5DYW52YXNDbGFzcyA9IE9mZnNjcmVlbkNhbnZhcykge1xuICBjb25zdCBjb25maWcgPSBwYWludEJ1ZmZlci5jb25maWc7XG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICBjb25zdCB0aWxlQXJlYSA9IGNvbmZpZy50aWxlQXJlYTtcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwO1xuICBjb25zdCBjYW52YXMgPSBuZXcgb2Zmc2NyZWVuQ2FudmFzQ2xhc3ModGlsZVNpemUsIHRpbGVTaXplKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGNvbnN0IGJyaWRnZSA9IG1ha2VQaXhlbERhdGEobmV3IEltYWdlRGF0YSh0aWxlU2l6ZSwgdGlsZVNpemUpKTtcbiAgY29uc3QgdmlldzMyID0gYnJpZGdlLmRhdGE7XG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIodGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGNvbG9yOiBDb2xvcjMyLCBhbHBoYSA9IDI1NSwgY29tcE9wZXJhdGlvbjogR2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJyk6IHZvaWQge1xuICAgIGlmIChhbHBoYSA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNDtcbiAgICBjb25zdCBjb2xvclJHQiA9IGNvbG9yICYgMHgwMGZmZmZmZjtcbiAgICBpZiAoYmFzZVNyY0FscGhhID09PSAwKSByZXR1cm47XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gYWxwaGEgLyAyNTU7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBPcGVyYXRpb247XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkYXRhOCA9IHRpbGUuZGF0YTtcbiAgICAgICAgdmlldzMyLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgdGlsZUFyZWE7IHArKykge1xuICAgICAgICAgIGNvbnN0IG1hc2tBID0gZGF0YThbcF07XG4gICAgICAgICAgaWYgKG1hc2tBID09PSAwKSBjb250aW51ZTtcblxuICAgICAgICAgIC8vIElmIG1hc2sgaXMgc29saWQsIHRoZSBmaW5hbCBwaXhlbCBpcyBqdXN0IHRoZSB1bm1vZGlmaWVkIGNvbG9yXG4gICAgICAgICAgaWYgKG1hc2tBID09PSAyNTUpIHtcbiAgICAgICAgICAgIHZpZXczMltwXSA9IGNvbG9yO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlcndpc2UsIGJsZW5kIHRoZSBjb2xvcidzIGluaGVyZW50IGFscGhhIHdpdGggdGhlIG1hc2sncyBhbHBoYVxuICAgICAgICAgICAgY29uc3QgdCA9IGJhc2VTcmNBbHBoYSAqIG1hc2tBICsgMTI4O1xuICAgICAgICAgICAgY29uc3QgZmluYWxBID0gdCArICh0ID4+IDgpID4+IDg7XG4gICAgICAgICAgICB2aWV3MzJbcF0gPSAoY29sb3JSR0IgfCBmaW5hbEEgPDwgMjQpID4+PiAwIGFzIENvbG9yMzI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGNvbnN0IGR5ID0gdGlsZS50eSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEoYnJpZGdlLmltYWdlRGF0YSwgMCwgMCk7XG4gICAgICAgIHRhcmdldEN0eC5kcmF3SW1hZ2UoY2FudmFzLCBkeCwgZHkpO1xuICAgICAgfVxuICAgIH1cbiAgICB0YXJnZXRDdHguZ2xvYmFsQWxwaGEgPSAxO1xuICAgIHRhcmdldEN0eC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSAnc291cmNlLW92ZXInO1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { blendColorPixelDataBinaryMask } from '../PixelData/blendColorPixelDataBinaryMask';\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 blendColorPixelDataBinaryMaskFn = blendColorPixelDataBinaryMask;\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(brushWidth: number, brushHeight: number, x: number, y: number): boolean;\n paintRect(brushWidth: number, brushHeight: number, startX: number, startY: number, endX: number, endY: number): boolean;\n paintRect(brushWidth: number, brushHeight: number, 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 centerOffsetX = (-(brushWidth - 1 >> 1));\n const centerOffsetY = (-(brushHeight - 1 >> 1));\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 private opts = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n commit(accumulator: PixelAccumulator, color: Color32, alpha = 255, blendFn = sourceOverPerfect) {\n const blendColorPixelDataBinaryMaskFn = this.blendColorPixelDataBinaryMaskFn;\n const tileShift = this.config.tileShift;\n const lookup = this.lookup;\n const opts = this.opts;\n opts.alpha = alpha;\n 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 opts.x = dx;\n opts.y = dy;\n opts.w = tile.w;\n opts.h = tile.h;\n didChange(blendColorPixelDataBinaryMaskFn(this.config.target, color, tile, opts));\n }\n }\n this.clear();\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBmb3JFYWNoTGluZVBvaW50IH0gZnJvbSAnLi4vQWxnb3JpdGhtL2ZvckVhY2hMaW5lUG9pbnQnO1xuaW1wb3J0IHsgc291cmNlT3ZlclBlcmZlY3QgfSBmcm9tICcuLi9CbGVuZE1vZGVzL2JsZW5kLW1vZGVzLXBlcmZlY3QnO1xuaW1wb3J0IHsgYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2sgfSBmcm9tICcuLi9QaXhlbERhdGEvYmxlbmRDb2xvclBpeGVsRGF0YUJpbmFyeU1hc2snO1xuaW1wb3J0IHsgdHJpbVJlY3RCb3VuZHMgfSBmcm9tICcuLi9SZWN0L3RyaW1SZWN0Qm91bmRzJztcbmltcG9ydCB7IGVhY2hUaWxlSW5Cb3VuZHMgfSBmcm9tICcuL2VhY2hUaWxlSW5Cb3VuZHMnO1xuZXhwb3J0IGNsYXNzIEJpbmFyeU1hc2tQYWludEJ1ZmZlciB7XG4gIHJlYWRvbmx5IGxvb2t1cDogKEJpbmFyeU1hc2tUaWxlIHwgdW5kZWZpbmVkKVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcmF0Y2hCb3VuZHM6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMFxuICB9O1xuICBwcml2YXRlIGJsZW5kQ29sb3JQaXhlbERhdGFCaW5hcnlNYXNrRm4gPSBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFzaztcbiAgcHJpdmF0ZSBmb3JFYWNoTGluZVBvaW50Rm4gPSBmb3JFYWNoTGluZVBvaW50O1xuICBwcml2YXRlIHRyaW1SZWN0Qm91bmRzRm4gPSB0cmltUmVjdEJvdW5kcztcbiAgcHJpdmF0ZSBlYWNoVGlsZUluQm91bmRzRm4gPSBlYWNoVGlsZUluQm91bmRzO1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLCByZWFkb25seSB0aWxlUG9vbDogVGlsZVBvb2w8QmluYXJ5TWFza1RpbGU+KSB7XG4gICAgdGhpcy5sb29rdXAgPSBbXTtcbiAgfVxuICBwYWludEJpbmFyeU1hc2soYnJ1c2g6IFBhaW50QmluYXJ5TWFzaywgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludEJpbmFyeU1hc2soYnJ1c2g6IFBhaW50QmluYXJ5TWFzaywgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRYOiBudW1iZXIsIGVuZFk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50QmluYXJ5TWFzayhicnVzaDogUGFpbnRCaW5hcnlNYXNrLCB4MDogbnVtYmVyLCB5MDogbnVtYmVyLCB4MTogbnVtYmVyID0geDAsIHkxOiBudW1iZXIgPSB5MCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLnNjcmF0Y2hCb3VuZHM7XG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5sb29rdXA7XG4gICAgY29uc3QgdGlsZVBvb2wgPSB0aGlzLnRpbGVQb29sO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnQ7XG4gICAgY29uc3QgdGlsZU1hc2sgPSBjb25maWcudGlsZU1hc2s7XG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCB7XG4gICAgICB3OiBiVyxcbiAgICAgIGg6IGJILFxuICAgICAgZGF0YTogYkQsXG4gICAgICBjZW50ZXJPZmZzZXRYLFxuICAgICAgY2VudGVyT2Zmc2V0WVxuICAgIH0gPSBicnVzaDtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGNvbnN0IHRyaW1SZWN0Qm91bmRzRm4gPSB0aGlzLnRyaW1SZWN0Qm91bmRzRm47XG4gICAgY29uc3QgZWFjaFRpbGVJbkJvdW5kc0ZuID0gdGhpcy5lYWNoVGlsZUluQm91bmRzRm47XG4gICAgdGhpcy5mb3JFYWNoTGluZVBvaW50Rm4oeDAsIHkwLCB4MSwgeTEsIChweCwgcHkpID0+IHtcbiAgICAgIGNvbnN0IHRvcExlZnRYID0gTWF0aC5mbG9vcihweCArIGNlbnRlck9mZnNldFgpO1xuICAgICAgY29uc3QgdG9wTGVmdFkgPSBNYXRoLmZsb29yKHB5ICsgY2VudGVyT2Zmc2V0WSk7XG4gICAgICB0cmltUmVjdEJvdW5kc0ZuKHRvcExlZnRYLCB0b3BMZWZ0WSwgYlcsIGJILCB0YXJnZXQudywgdGFyZ2V0LmgsIHNjcmF0Y2gpO1xuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm47XG4gICAgICBlYWNoVGlsZUluQm91bmRzRm4oY29uZmlnLCBsb29rdXAsIHRpbGVQb29sLCBzY3JhdGNoLCAodGlsZSwgYlgsIGJZLCBiV190LCBiSF90KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aWxlLmRhdGE7XG4gICAgICAgIGxldCB0aWxlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJIX3Q7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGk7XG4gICAgICAgICAgY29uc3QgYk9mZiA9IChjYW52YXNZIC0gdG9wTGVmdFkpICogYlc7XG4gICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdDtcbiAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzayk7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBiV190OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbnZhc1ggPSBiWCArIGo7XG4gICAgICAgICAgICBpZiAoYkRbYk9mZiArIChjYW52YXNYIC0gdG9wTGVmdFgpXSkge1xuICAgICAgICAgICAgICBjb25zdCBpZHggPSBkUyArIGo7XG5cbiAgICAgICAgICAgICAgLy8gT25seSB3cml0ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IFwib25cIlxuICAgICAgICAgICAgICBpZiAoZGF0YVtpZHhdID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtpZHhdID0gMTtcbiAgICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRpbGVDaGFuZ2VkKSBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHJldHVybiBjaGFuZ2VkO1xuICB9XG4gIHBhaW50UmVjdChicnVzaFdpZHRoOiBudW1iZXIsIGJydXNoSGVpZ2h0OiBudW1iZXIsIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRSZWN0KGJydXNoV2lkdGg6IG51bWJlciwgYnJ1c2hIZWlnaHQ6IG51bWJlciwgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRYOiBudW1iZXIsIGVuZFk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50UmVjdChicnVzaFdpZHRoOiBudW1iZXIsIGJydXNoSGVpZ2h0OiBudW1iZXIsIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFggPSAoLShicnVzaFdpZHRoIC0gMSA+PiAxKSk7XG4gICAgY29uc3QgY2VudGVyT2Zmc2V0WSA9ICgtKGJydXNoSGVpZ2h0IC0gMSA+PiAxKSk7XG4gICAgY29uc3QgdHJpbVJlY3RCb3VuZHNGbiA9IHRoaXMudHJpbVJlY3RCb3VuZHNGbjtcbiAgICBjb25zdCBlYWNoVGlsZUluQm91bmRzRm4gPSB0aGlzLmVhY2hUaWxlSW5Cb3VuZHNGbjtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9yRWFjaExpbmVQb2ludEZuKHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKTtcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpO1xuICAgICAgdHJpbVJlY3RCb3VuZHNGbih0b3BMZWZ0WCwgdG9wTGVmdFksIGJydXNoV2lkdGgsIGJydXNoSGVpZ2h0LCB0YXJnZXQudywgdGFyZ2V0LmgsIHNjcmF0Y2gpO1xuICAgICAgaWYgKHNjcmF0Y2gudyA8PSAwIHx8IHNjcmF0Y2guaCA8PSAwKSByZXR1cm47XG4gICAgICBlYWNoVGlsZUluQm91bmRzRm4oY29uZmlnLCBsb29rdXAsIHRpbGVQb29sLCBzY3JhdGNoLCAodGlsZSwgYlgsIGJZLCBiV190LCBiSF90KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aWxlLmRhdGE7XG4gICAgICAgIGxldCB0aWxlQ2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJIX3Q7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGNhbnZhc1kgPSBiWSArIGk7XG4gICAgICAgICAgY29uc3QgdE9mZiA9IChjYW52YXNZICYgdGlsZU1hc2spIDw8IHRpbGVTaGlmdDtcbiAgICAgICAgICBjb25zdCBkUyA9IHRPZmYgKyAoYlggJiB0aWxlTWFzayk7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBiV190OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcblxuICAgICAgICAgICAgLy8gT25seSB3cml0ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IFwib25cIlxuICAgICAgICAgICAgaWYgKGRhdGFbaWR4XSA9PT0gMCkge1xuICAgICAgICAgICAgICBkYXRhW2lkeF0gPSAxO1xuICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuICBwcml2YXRlIG9wdHMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwXG4gIH07XG4gIGNvbW1pdChhY2N1bXVsYXRvcjogUGl4ZWxBY2N1bXVsYXRvciwgY29sb3I6IENvbG9yMzIsIGFscGhhID0gMjU1LCBibGVuZEZuID0gc291cmNlT3ZlclBlcmZlY3QpIHtcbiAgICBjb25zdCBibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFza0ZuID0gdGhpcy5ibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFza0ZuO1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRzO1xuICAgIG9wdHMuYWxwaGEgPSBhbHBoYTtcbiAgICBvcHRzLmJsZW5kRm4gPSBibGVuZEZuO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9va3VwLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB0aWxlID0gbG9va3VwW2ldO1xuICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgY29uc3QgZGlkQ2hhbmdlID0gYWNjdW11bGF0b3Iuc3RvcmVUaWxlQmVmb3JlU3RhdGUodGlsZS5pZCwgdGlsZS50eCwgdGlsZS50eSk7XG4gICAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGNvbnN0IGR5ID0gdGlsZS50eSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIG9wdHMueCA9IGR4O1xuICAgICAgICBvcHRzLnkgPSBkeTtcbiAgICAgICAgb3B0cy53ID0gdGlsZS53O1xuICAgICAgICBvcHRzLmggPSB0aWxlLmg7XG4gICAgICAgIGRpZENoYW5nZShibGVuZENvbG9yUGl4ZWxEYXRhQmluYXJ5TWFza0ZuKHRoaXMuY29uZmlnLnRhcmdldCwgY29sb3IsIHRpbGUsIG9wdHMpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhcigpO1xuICB9XG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMudGlsZVBvb2wucmVsZWFzZVRpbGVzKHRoaXMubG9va3VwKTtcbiAgfVxufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","import { CANVAS_CTX_FAILED } from '../Internal/_errors';\nimport { makePixelData } from '../PixelData/PixelData';\nexport type BinaryMaskPaintBufferCanvasRenderer = ReturnType<typeof makeBinaryMaskPaintBufferCanvasRenderer>;\nexport function makeBinaryMaskPaintBufferCanvasRenderer(paintBuffer: BinaryMaskPaintBuffer, offscreenCanvasClass = OffscreenCanvas) {\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 = new offscreenCanvasClass(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, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uL0ludGVybmFsL19lcnJvcnMnO1xuaW1wb3J0IHsgbWFrZVBpeGVsRGF0YSB9IGZyb20gJy4uL1BpeGVsRGF0YS9QaXhlbERhdGEnO1xuZXhwb3J0IHR5cGUgQmluYXJ5TWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQmluYXJ5TWFza1BhaW50QnVmZmVyQ2FudmFzUmVuZGVyZXI+O1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VCaW5hcnlNYXNrUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcihwYWludEJ1ZmZlcjogQmluYXJ5TWFza1BhaW50QnVmZmVyLCBvZmZzY3JlZW5DYW52YXNDbGFzcyA9IE9mZnNjcmVlbkNhbnZhcykge1xuICBjb25zdCBjb25maWcgPSBwYWludEJ1ZmZlci5jb25maWc7XG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICBjb25zdCB0aWxlQXJlYSA9IGNvbmZpZy50aWxlQXJlYTtcbiAgY29uc3QgbG9va3VwID0gcGFpbnRCdWZmZXIubG9va3VwO1xuICBjb25zdCBjYW52YXMgPSBuZXcgb2Zmc2NyZWVuQ2FudmFzQ2xhc3ModGlsZVNpemUsIHRpbGVTaXplKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGNvbnN0IGJyaWRnZSA9IG1ha2VQaXhlbERhdGEobmV3IEltYWdlRGF0YSh0aWxlU2l6ZSwgdGlsZVNpemUpKTtcbiAgY29uc3QgdmlldzMyID0gYnJpZGdlLmRhdGE7XG4gIHJldHVybiBmdW5jdGlvbiBkcmF3UGFpbnRCdWZmZXIodGFyZ2V0Q3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQsIGNvbG9yOiBDb2xvcjMyLCBhbHBoYSA9IDI1NSwgY29tcE9wZXJhdGlvbjogR2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJyk6IHZvaWQge1xuICAgIGlmIChhbHBoYSA9PT0gMCkgcmV0dXJuO1xuICAgIGNvbnN0IGJhc2VTcmNBbHBoYSA9IGNvbG9yID4+PiAyNDtcbiAgICBpZiAoYmFzZVNyY0FscGhhID09PSAwKSByZXR1cm47XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gYWxwaGEgLyAyNTU7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGNvbXBPcGVyYXRpb247XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkYXRhOCA9IHRpbGUuZGF0YTtcbiAgICAgICAgdmlldzMyLmZpbGwoMCk7XG4gICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgdGlsZUFyZWE7IHArKykge1xuICAgICAgICAgIC8vIElmIG1hc2sgaXMgc29saWQsIHRoZSBmaW5hbCBwaXhlbCBpcyBqdXN0IHRoZSB1bm1vZGlmaWVkIGNvbG9yXG4gICAgICAgICAgaWYgKGRhdGE4W3BdID09PSAxKSB7XG4gICAgICAgICAgICB2aWV3MzJbcF0gPSBjb2xvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZHggPSB0aWxlLnR4IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgY3R4LnB1dEltYWdlRGF0YShicmlkZ2UuaW1hZ2VEYXRhLCAwLCAwKTtcbiAgICAgICAgdGFyZ2V0Q3R4LmRyYXdJbWFnZShjYW52YXMsIGR4LCBkeSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRhcmdldEN0eC5nbG9iYWxBbHBoYSA9IDE7XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3Zlcic7XG4gIH07XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","import type { Color32 } from '../_types';\nimport { forEachLinePoint } from '../Algorithm/forEachLinePoint';\nimport { sourceOverPerfect } from '../BlendModes/blend-modes-perfect';\nimport { blendPixelData } from '../PixelData/blendPixelData';\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>, private blendPixelDataFn = blendPixelData) {\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, brushWidth: number, brushHeight: number, x: number, y: number): boolean;\n paintRect(color: Color32, brushWidth: number, brushHeight: number, startX: number, startY: number, endX: number, endY: number): boolean;\n paintRect(color: Color32, brushWidth: number, brushHeight: number, 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 centerOffsetX = (-(brushWidth - 1 >> 1));\n const centerOffsetY = (-(brushHeight - 1 >> 1));\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 private opts = {\n alpha: 255,\n blendFn: sourceOverPerfect,\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n commit(accumulator: PixelAccumulator, alpha = 255, blendFn = sourceOverPerfect) {\n const tileShift = this.config.tileShift;\n const lookup = this.lookup;\n const opts = this.opts;\n const blendPixelDataFn = this.blendPixelDataFn;\n opts.alpha = alpha;\n 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 opts.x = dx;\n opts.y = dy;\n opts.w = tile.w;\n opts.h = tile.h;\n didChange(blendPixelDataFn(this.config.target, tile, opts));\n }\n }\n this.clear();\n }\n clear(): void {\n this.tilePool.releaseTiles(this.lookup);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENvbG9yMzIgfSBmcm9tICcuLi9fdHlwZXMnO1xuaW1wb3J0IHsgZm9yRWFjaExpbmVQb2ludCB9IGZyb20gJy4uL0FsZ29yaXRobS9mb3JFYWNoTGluZVBvaW50JztcbmltcG9ydCB7IHNvdXJjZU92ZXJQZXJmZWN0IH0gZnJvbSAnLi4vQmxlbmRNb2Rlcy9ibGVuZC1tb2Rlcy1wZXJmZWN0JztcbmltcG9ydCB7IGJsZW5kUGl4ZWxEYXRhIH0gZnJvbSAnLi4vUGl4ZWxEYXRhL2JsZW5kUGl4ZWxEYXRhJztcbmltcG9ydCB7IHRyaW1SZWN0Qm91bmRzIH0gZnJvbSAnLi4vUmVjdC90cmltUmVjdEJvdW5kcyc7XG5pbXBvcnQgeyBlYWNoVGlsZUluQm91bmRzIH0gZnJvbSAnLi9lYWNoVGlsZUluQm91bmRzJztcbmV4cG9ydCBjbGFzcyBDb2xvclBhaW50QnVmZmVyIHtcbiAgcmVhZG9ubHkgbG9va3VwOiAoUGl4ZWxUaWxlIHwgdW5kZWZpbmVkKVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjcmF0Y2hCb3VuZHM6IFJlY3QgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMFxuICB9O1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBjb25maWc6IFBpeGVsRW5naW5lQ29uZmlnLCByZWFkb25seSB0aWxlUG9vbDogVGlsZVBvb2w8UGl4ZWxUaWxlPiwgcHJpdmF0ZSBibGVuZFBpeGVsRGF0YUZuID0gYmxlbmRQaXhlbERhdGEpIHtcbiAgICB0aGlzLmxvb2t1cCA9IFtdO1xuICB9XG4gIHBhaW50QWxwaGFNYXNrKGNvbG9yOiBDb2xvcjMyLCBicnVzaDogUGFpbnRBbHBoYU1hc2ssIHg6IG51bWJlciwgeTogbnVtYmVyKTogYm9vbGVhbjtcbiAgcGFpbnRBbHBoYU1hc2soY29sb3I6IENvbG9yMzIsIGJydXNoOiBQYWludEFscGhhTWFzaywgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRYOiBudW1iZXIsIGVuZFk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50QWxwaGFNYXNrKGNvbG9yOiBDb2xvcjMyLCBicnVzaDogUGFpbnRBbHBoYU1hc2ssIHgwOiBudW1iZXIsIHkwOiBudW1iZXIsIHgxOiBudW1iZXIgPSB4MCwgeTE6IG51bWJlciA9IHkwKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY0EgPSBjb2xvciA+Pj4gMjQ7XG4gICAgaWYgKGNBID09PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgY29uc3Qgc2NyYXRjaCA9IHRoaXMuc2NyYXRjaEJvdW5kcztcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCB0aWxlUG9vbCA9IHRoaXMudGlsZVBvb2w7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWc7XG4gICAgY29uc3QgdGlsZVNoaWZ0ID0gY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCB0aWxlTWFzayA9IGNvbmZpZy50aWxlTWFzaztcbiAgICBjb25zdCB0YXJnZXQgPSBjb25maWcudGFyZ2V0O1xuICAgIGNvbnN0IHtcbiAgICAgIHc6IGJXLFxuICAgICAgaDogYkgsXG4gICAgICBkYXRhOiBiRCxcbiAgICAgIGNlbnRlck9mZnNldFgsXG4gICAgICBjZW50ZXJPZmZzZXRZXG4gICAgfSA9IGJydXNoO1xuICAgIGNvbnN0IGNSR0IgPSBjb2xvciAmIDB4MDBmZmZmZmY7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3JFYWNoTGluZVBvaW50KHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKTtcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpO1xuICAgICAgdHJpbVJlY3RCb3VuZHModG9wTGVmdFgsIHRvcExlZnRZLCBiVywgYkgsIHRhcmdldC53LCB0YXJnZXQuaCwgc2NyYXRjaCk7XG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVybjtcbiAgICAgIGVhY2hUaWxlSW5Cb3VuZHMoY29uZmlnLCBsb29rdXAsIHRpbGVQb29sLCBzY3JhdGNoLCAodGlsZSwgYlgsIGJZLCBiV190LCBiSF90KSA9PiB7XG4gICAgICAgIGNvbnN0IGQzMiA9IHRpbGUuZGF0YTtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiVztcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzWCA9IGJYICsgajtcbiAgICAgICAgICAgIGNvbnN0IGJydXNoQSA9IGJEW2JPZmYgKyAoY2FudmFzWCAtIHRvcExlZnRYKV07XG4gICAgICAgICAgICBpZiAoYnJ1c2hBID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGNvbnN0IHQgPSBjQSAqIGJydXNoQSArIDEyODtcbiAgICAgICAgICAgIGNvbnN0IGJsZW5kZWRBID0gdCArICh0ID4+IDgpID4+IDg7XG4gICAgICAgICAgICBjb25zdCBpZHggPSBkUyArIGo7XG4gICAgICAgICAgICBjb25zdCBjdXIgPSBkMzJbaWR4XTtcbiAgICAgICAgICAgIGlmIChicnVzaEEgPiBjdXIgPj4+IDI0KSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5leHQgPSAoY1JHQiB8IGJsZW5kZWRBIDw8IDI0KSA+Pj4gMDtcbiAgICAgICAgICAgICAgaWYgKGN1ciAhPT0gbmV4dCkge1xuICAgICAgICAgICAgICAgIGQzMltpZHhdID0gbmV4dCBhcyBDb2xvcjMyO1xuICAgICAgICAgICAgICAgIHRpbGVDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGlsZUNoYW5nZWQpIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGNoYW5nZWQ7XG4gIH1cbiAgcGFpbnRCaW5hcnlNYXNrKGNvbG9yOiBDb2xvcjMyLCBicnVzaDogUGFpbnRCaW5hcnlNYXNrLCB4OiBudW1iZXIsIHk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50QmluYXJ5TWFzayhjb2xvcjogQ29sb3IzMiwgYnJ1c2g6IFBhaW50QmluYXJ5TWFzaywgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRYOiBudW1iZXIsIGVuZFk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50QmluYXJ5TWFzayhjb2xvcjogQ29sb3IzMiwgYnJ1c2g6IFBhaW50QmluYXJ5TWFzaywgeDA6IG51bWJlciwgeTA6IG51bWJlciwgeDE6IG51bWJlciA9IHgwLCB5MTogbnVtYmVyID0geTApOiBib29sZWFuIHtcbiAgICBjb25zdCBhbHBoYUlzWmVybyA9IGNvbG9yID4+PiAyNCA9PT0gMDtcbiAgICBpZiAoYWxwaGFJc1plcm8pIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBzY3JhdGNoID0gdGhpcy5zY3JhdGNoQm91bmRzO1xuICAgIGNvbnN0IGxvb2t1cCA9IHRoaXMubG9va3VwO1xuICAgIGNvbnN0IHRpbGVQb29sID0gdGhpcy50aWxlUG9vbDtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZztcbiAgICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICAgIGNvbnN0IHRpbGVNYXNrID0gY29uZmlnLnRpbGVNYXNrO1xuICAgIGNvbnN0IHRhcmdldCA9IGNvbmZpZy50YXJnZXQ7XG4gICAgY29uc3Qge1xuICAgICAgdzogYlcsXG4gICAgICBoOiBiSCxcbiAgICAgIGRhdGE6IGJELFxuICAgICAgY2VudGVyT2Zmc2V0WCxcbiAgICAgIGNlbnRlck9mZnNldFlcbiAgICB9ID0gYnJ1c2g7XG4gICAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgICBmb3JFYWNoTGluZVBvaW50KHgwLCB5MCwgeDEsIHkxLCAocHgsIHB5KSA9PiB7XG4gICAgICBjb25zdCB0b3BMZWZ0WCA9IE1hdGguZmxvb3IocHggKyBjZW50ZXJPZmZzZXRYKTtcbiAgICAgIGNvbnN0IHRvcExlZnRZID0gTWF0aC5mbG9vcihweSArIGNlbnRlck9mZnNldFkpO1xuICAgICAgdHJpbVJlY3RCb3VuZHModG9wTGVmdFgsIHRvcExlZnRZLCBiVywgYkgsIHRhcmdldC53LCB0YXJnZXQuaCwgc2NyYXRjaCk7XG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVybjtcbiAgICAgIGVhY2hUaWxlSW5Cb3VuZHMoY29uZmlnLCBsb29rdXAsIHRpbGVQb29sLCBzY3JhdGNoLCAodGlsZSwgYlgsIGJZLCBiV190LCBiSF90KSA9PiB7XG4gICAgICAgIGNvbnN0IGQzMiA9IHRpbGUuZGF0YTtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCBiT2ZmID0gKGNhbnZhc1kgLSB0b3BMZWZ0WSkgKiBiVztcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgY2FudmFzWCA9IGJYICsgajtcbiAgICAgICAgICAgIGlmIChiRFtiT2ZmICsgKGNhbnZhc1ggLSB0b3BMZWZ0WCldKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGRTICsgajtcbiAgICAgICAgICAgICAgaWYgKGQzMltpZHhdICE9PSBjb2xvcikge1xuICAgICAgICAgICAgICAgIGQzMltpZHhdID0gY29sb3I7XG4gICAgICAgICAgICAgICAgdGlsZUNoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuICBwYWludFJlY3QoY29sb3I6IENvbG9yMzIsIGJydXNoV2lkdGg6IG51bWJlciwgYnJ1c2hIZWlnaHQ6IG51bWJlciwgeDogbnVtYmVyLCB5OiBudW1iZXIpOiBib29sZWFuO1xuICBwYWludFJlY3QoY29sb3I6IENvbG9yMzIsIGJydXNoV2lkdGg6IG51bWJlciwgYnJ1c2hIZWlnaHQ6IG51bWJlciwgc3RhcnRYOiBudW1iZXIsIHN0YXJ0WTogbnVtYmVyLCBlbmRYOiBudW1iZXIsIGVuZFk6IG51bWJlcik6IGJvb2xlYW47XG4gIHBhaW50UmVjdChjb2xvcjogQ29sb3IzMiwgYnJ1c2hXaWR0aDogbnVtYmVyLCBicnVzaEhlaWdodDogbnVtYmVyLCB4MDogbnVtYmVyLCB5MDogbnVtYmVyLCB4MTogbnVtYmVyID0geDAsIHkxOiBudW1iZXIgPSB5MCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFscGhhSXNaZXJvID0gY29sb3IgPj4+IDI0ID09PSAwO1xuICAgIGlmIChhbHBoYUlzWmVybykgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHNjcmF0Y2ggPSB0aGlzLnNjcmF0Y2hCb3VuZHM7XG4gICAgY29uc3QgbG9va3VwID0gdGhpcy5sb29rdXA7XG4gICAgY29uc3QgdGlsZVBvb2wgPSB0aGlzLnRpbGVQb29sO1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IGNvbmZpZy50aWxlU2hpZnQ7XG4gICAgY29uc3QgdGlsZU1hc2sgPSBjb25maWcudGlsZU1hc2s7XG4gICAgY29uc3QgdGFyZ2V0ID0gY29uZmlnLnRhcmdldDtcbiAgICBjb25zdCBjZW50ZXJPZmZzZXRYID0gKC0oYnJ1c2hXaWR0aCAtIDEgPj4gMSkpO1xuICAgIGNvbnN0IGNlbnRlck9mZnNldFkgPSAoLShicnVzaEhlaWdodCAtIDEgPj4gMSkpO1xuICAgIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yRWFjaExpbmVQb2ludCh4MCwgeTAsIHgxLCB5MSwgKHB4LCBweSkgPT4ge1xuICAgICAgY29uc3QgdG9wTGVmdFggPSBNYXRoLmZsb29yKHB4ICsgY2VudGVyT2Zmc2V0WCk7XG4gICAgICBjb25zdCB0b3BMZWZ0WSA9IE1hdGguZmxvb3IocHkgKyBjZW50ZXJPZmZzZXRZKTtcbiAgICAgIHRyaW1SZWN0Qm91bmRzKHRvcExlZnRYLCB0b3BMZWZ0WSwgYnJ1c2hXaWR0aCwgYnJ1c2hIZWlnaHQsIHRhcmdldC53LCB0YXJnZXQuaCwgc2NyYXRjaCk7XG4gICAgICBpZiAoc2NyYXRjaC53IDw9IDAgfHwgc2NyYXRjaC5oIDw9IDApIHJldHVybjtcbiAgICAgIGVhY2hUaWxlSW5Cb3VuZHMoY29uZmlnLCBsb29rdXAsIHRpbGVQb29sLCBzY3JhdGNoLCAodGlsZSwgYlgsIGJZLCBiV190LCBiSF90KSA9PiB7XG4gICAgICAgIGNvbnN0IGQzMiA9IHRpbGUuZGF0YTtcbiAgICAgICAgbGV0IHRpbGVDaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYkhfdDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgY2FudmFzWSA9IGJZICsgaTtcbiAgICAgICAgICBjb25zdCB0T2ZmID0gKGNhbnZhc1kgJiB0aWxlTWFzaykgPDwgdGlsZVNoaWZ0O1xuICAgICAgICAgIGNvbnN0IGRTID0gdE9mZiArIChiWCAmIHRpbGVNYXNrKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGJXX3Q7IGorKykge1xuICAgICAgICAgICAgY29uc3QgaWR4ID0gZFMgKyBqO1xuICAgICAgICAgICAgaWYgKGQzMltpZHhdICE9PSBjb2xvcikge1xuICAgICAgICAgICAgICBkMzJbaWR4XSA9IGNvbG9yO1xuICAgICAgICAgICAgICB0aWxlQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aWxlQ2hhbmdlZCkge1xuICAgICAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2hhbmdlZDtcbiAgfVxuICBwcml2YXRlIG9wdHMgPSB7XG4gICAgYWxwaGE6IDI1NSxcbiAgICBibGVuZEZuOiBzb3VyY2VPdmVyUGVyZmVjdCxcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwXG4gIH07XG4gIGNvbW1pdChhY2N1bXVsYXRvcjogUGl4ZWxBY2N1bXVsYXRvciwgYWxwaGEgPSAyNTUsIGJsZW5kRm4gPSBzb3VyY2VPdmVyUGVyZmVjdCkge1xuICAgIGNvbnN0IHRpbGVTaGlmdCA9IHRoaXMuY29uZmlnLnRpbGVTaGlmdDtcbiAgICBjb25zdCBsb29rdXAgPSB0aGlzLmxvb2t1cDtcbiAgICBjb25zdCBvcHRzID0gdGhpcy5vcHRzO1xuICAgIGNvbnN0IGJsZW5kUGl4ZWxEYXRhRm4gPSB0aGlzLmJsZW5kUGl4ZWxEYXRhRm47XG4gICAgb3B0cy5hbHBoYSA9IGFscGhhO1xuICAgIG9wdHMuYmxlbmRGbiA9IGJsZW5kRm47XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb29rdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHRpbGUgPSBsb29rdXBbaV07XG4gICAgICBpZiAodGlsZSkge1xuICAgICAgICBjb25zdCBkaWRDaGFuZ2UgPSBhY2N1bXVsYXRvci5zdG9yZVRpbGVCZWZvcmVTdGF0ZSh0aWxlLmlkLCB0aWxlLnR4LCB0aWxlLnR5KTtcbiAgICAgICAgY29uc3QgZHggPSB0aWxlLnR4IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgY29uc3QgZHkgPSB0aWxlLnR5IDw8IHRpbGVTaGlmdDtcbiAgICAgICAgb3B0cy54ID0gZHg7XG4gICAgICAgIG9wdHMueSA9IGR5O1xuICAgICAgICBvcHRzLncgPSB0aWxlLnc7XG4gICAgICAgIG9wdHMuaCA9IHRpbGUuaDtcbiAgICAgICAgZGlkQ2hhbmdlKGJsZW5kUGl4ZWxEYXRhRm4odGhpcy5jb25maWcudGFyZ2V0LCB0aWxlLCBvcHRzKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY2xlYXIoKTtcbiAgfVxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnRpbGVQb29sLnJlbGVhc2VUaWxlcyh0aGlzLmxvb2t1cCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","import { CANVAS_CTX_FAILED } from '../Internal/_errors';\nexport type ColorPaintBufferCanvasRenderer = ReturnType<typeof makeColorPaintBufferCanvasRenderer>;\n\n/**\n *\n * @param paintBuffer\n * @param offscreenCanvasClass - @internal\n */\nexport function makeColorPaintBufferCanvasRenderer(paintBuffer: ColorPaintBuffer, offscreenCanvasClass = OffscreenCanvas) {\n const config = paintBuffer.config;\n const tileSize = config.tileSize;\n const tileShift = config.tileShift;\n const lookup = paintBuffer.lookup;\n const canvas = new offscreenCanvasClass(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, 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uL0ludGVybmFsL19lcnJvcnMnO1xuZXhwb3J0IHR5cGUgQ29sb3JQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZUNvbG9yUGFpbnRCdWZmZXJDYW52YXNSZW5kZXJlcj47XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBwYWludEJ1ZmZlclxuICogQHBhcmFtIG9mZnNjcmVlbkNhbnZhc0NsYXNzIC0gQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQ29sb3JQYWludEJ1ZmZlckNhbnZhc1JlbmRlcmVyKHBhaW50QnVmZmVyOiBDb2xvclBhaW50QnVmZmVyLCBvZmZzY3JlZW5DYW52YXNDbGFzcyA9IE9mZnNjcmVlbkNhbnZhcykge1xuICBjb25zdCBjb25maWcgPSBwYWludEJ1ZmZlci5jb25maWc7XG4gIGNvbnN0IHRpbGVTaXplID0gY29uZmlnLnRpbGVTaXplO1xuICBjb25zdCB0aWxlU2hpZnQgPSBjb25maWcudGlsZVNoaWZ0O1xuICBjb25zdCBsb29rdXAgPSBwYWludEJ1ZmZlci5sb29rdXA7XG4gIGNvbnN0IGNhbnZhcyA9IG5ldyBvZmZzY3JlZW5DYW52YXNDbGFzcyh0aWxlU2l6ZSwgdGlsZVNpemUpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgaWYgKCFjdHgpIHRocm93IG5ldyBFcnJvcihDQU5WQVNfQ1RYX0ZBSUxFRCk7XG4gIGN0eC5pbWFnZVNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRyYXdQYWludEJ1ZmZlcih0YXJnZXRDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgYWxwaGEgPSAyNTUsIGNvbXBPcGVyYXRpb246IEdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdzb3VyY2Utb3ZlcicpOiB2b2lkIHtcbiAgICB0YXJnZXRDdHguZ2xvYmFsQWxwaGEgPSBhbHBoYSAvIDI1NTtcbiAgICB0YXJnZXRDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gY29tcE9wZXJhdGlvbjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvb2t1cC5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGlsZSA9IGxvb2t1cFtpXTtcbiAgICAgIGlmICh0aWxlKSB7XG4gICAgICAgIGNvbnN0IGR4ID0gdGlsZS50eCA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGNvbnN0IGR5ID0gdGlsZS50eSA8PCB0aWxlU2hpZnQ7XG4gICAgICAgIGN0eC5wdXRJbWFnZURhdGEodGlsZS5pbWFnZURhdGEsIDAsIDApO1xuICAgICAgICB0YXJnZXRDdHguZHJhd0ltYWdlKGNhbnZhcywgZHgsIGR5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGFyZ2V0Q3R4Lmdsb2JhbEFscGhhID0gMTtcbiAgICB0YXJnZXRDdHguZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ3NvdXJjZS1vdmVyJztcbiAgfTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 { 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 type { CanvasContext } from '../Canvas/_canvas-types';\nimport { packColor } from '../color';\nimport { CANVAS_CTX_FAILED } from '../Internal/_errors';\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>(factory: CanvasObjectFactory<T> = (w, h) => new OffscreenCanvas(w, h) as T) {\n const canvas = factory(1, 1);\n const ctx = canvas.getContext('2d')! as CanvasContext<T>;\n if (!ctx) throw new Error(CANVAS_CTX_FAILED);\n ctx.imageSmoothingEnabled = false;\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 canvas.width = currentMask.w * _scale + 2 * _scale;\n canvas.height = 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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhbnZhc0NvbnRleHQgfSBmcm9tICcuLi9DYW52YXMvX2NhbnZhcy10eXBlcyc7XG5pbXBvcnQgeyBwYWNrQ29sb3IgfSBmcm9tICcuLi9jb2xvcic7XG5pbXBvcnQgeyBDQU5WQVNfQ1RYX0ZBSUxFRCB9IGZyb20gJy4uL0ludGVybmFsL19lcnJvcnMnO1xuaW1wb3J0IHsgTWFza1R5cGUgfSBmcm9tICcuLi9NYXNrL19tYXNrLXR5cGVzJztcbmltcG9ydCB7IG1ha2VCaW5hcnlNYXNrRnJvbUFscGhhTWFzayB9IGZyb20gJy4uL01hc2svQmluYXJ5TWFzay9tYWtlQmluYXJ5TWFza0Zyb21BbHBoYU1hc2snO1xuaW1wb3J0IHsgbWFrZUJpbmFyeU1hc2tPdXRsaW5lIH0gZnJvbSAnLi4vTWFzay9CaW5hcnlNYXNrL21ha2VCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBtYWtlQ2lyY2xlQmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi9NYXNrL0JpbmFyeU1hc2svbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lJztcbmltcG9ydCB7IG1ha2VSZWN0QmluYXJ5TWFza091dGxpbmUgfSBmcm9tICcuLi9NYXNrL0JpbmFyeU1hc2svbWFrZVJlY3RCaW5hcnlNYXNrT3V0bGluZSc7XG5pbXBvcnQgeyBmaWxsUGl4ZWxEYXRhQmluYXJ5TWFzayB9IGZyb20gJy4uL1BpeGVsRGF0YS9maWxsUGl4ZWxEYXRhQmluYXJ5TWFzayc7XG5pbXBvcnQgeyBtYWtlUmV1c2FibGVQaXhlbERhdGEgfSBmcm9tICcuLi9QaXhlbERhdGEvUmV1c2FibGVQaXhlbERhdGEnO1xuaW1wb3J0IHsgdHlwZSBQYWludE1hc2ssIFBhaW50TWFza091dGxpbmUgfSBmcm9tICcuL19wYWludC10eXBlcyc7XG5leHBvcnQgdHlwZSBQYWludEN1cnNvclJlbmRlcmVyID0gUmV0dXJuVHlwZTx0eXBlb2YgbWFrZVBhaW50Q3Vyc29yUmVuZGVyZXI+O1xuZXhwb3J0IGZ1bmN0aW9uIG1ha2VQYWludEN1cnNvclJlbmRlcmVyPFQgZXh0ZW5kcyBIVE1MQ2FudmFzRWxlbWVudCB8IE9mZnNjcmVlbkNhbnZhcz4oZmFjdG9yeTogQ2FudmFzT2JqZWN0RmFjdG9yeTxUPiA9ICh3LCBoKSA9PiBuZXcgT2Zmc2NyZWVuQ2FudmFzKHcsIGgpIGFzIFQpIHtcbiAgY29uc3QgY2FudmFzID0gZmFjdG9yeSgxLCAxKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJykhIGFzIENhbnZhc0NvbnRleHQ8VD47XG4gIGlmICghY3R4KSB0aHJvdyBuZXcgRXJyb3IoQ0FOVkFTX0NUWF9GQUlMRUQpO1xuICBjdHguaW1hZ2VTbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7XG4gIGNvbnN0IGdldFBpeGVsRGF0YSA9IG1ha2VSZXVzYWJsZVBpeGVsRGF0YSgpO1xuICBsZXQgX2NvbG9yID0gcGFja0NvbG9yKDAsIDI1NSwgMjU1LCAyNTUpO1xuICBsZXQgX3NjYWxlID0gMTtcbiAgbGV0IGN1cnJlbnRNYXNrOiBQYWludE1hc2sgPSB7XG4gICAgdHlwZTogTWFza1R5cGUuQklOQVJZLFxuICAgIG91dGxpbmVUeXBlOiBQYWludE1hc2tPdXRsaW5lLlJFQ1QsXG4gICAgdzogMSxcbiAgICBoOiAxLFxuICAgIGNlbnRlck9mZnNldFg6ICgtKDEwIC0gMSA+PiAxKSksXG4gICAgY2VudGVyT2Zmc2V0WTogKC0oMTAgLSAxID4+IDEpKVxuICB9IGFzIFBhaW50TWFzaztcbiAgbGV0IG91dGxpbmU6IEJpbmFyeU1hc2s7XG4gIGZ1bmN0aW9uIHVwZGF0ZShwYWludE1hc2s/OiBQYWludE1hc2ssIHNjYWxlPzogbnVtYmVyLCBjb2xvcj86IENvbG9yMzIsIGFscGhhVGhyZXNob2xkID0gMTI3KSB7XG4gICAgY3VycmVudE1hc2sgPSBwYWludE1hc2sgPz8gY3VycmVudE1hc2s7XG4gICAgX3NjYWxlID0gc2NhbGUgPz8gX3NjYWxlO1xuICAgIF9jb2xvciA9IGNvbG9yID8/IF9jb2xvcjtcbiAgICBjYW52YXMud2lkdGggPSBjdXJyZW50TWFzay53ICogX3NjYWxlICsgMiAqIF9zY2FsZTtcbiAgICBjYW52YXMuaGVpZ2h0ID0gY3VycmVudE1hc2suaCAqIF9zY2FsZSArIDIgKiBfc2NhbGU7XG4gICAgaWYgKGN1cnJlbnRNYXNrLnR5cGUgPT09IE1hc2tUeXBlLkJJTkFSWSkge1xuICAgICAgaWYgKGN1cnJlbnRNYXNrLm91dGxpbmVUeXBlID09PSBQYWludE1hc2tPdXRsaW5lLkNJUkNMRSkge1xuICAgICAgICBvdXRsaW5lID0gbWFrZUNpcmNsZUJpbmFyeU1hc2tPdXRsaW5lKGN1cnJlbnRNYXNrLncsIF9zY2FsZSk7XG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRNYXNrLm91dGxpbmVUeXBlID09PSBQYWludE1hc2tPdXRsaW5lLlJFQ1QpIHtcbiAgICAgICAgb3V0bGluZSA9IG1ha2VSZWN0QmluYXJ5TWFza091dGxpbmUoY3VycmVudE1hc2sudywgY3VycmVudE1hc2suaCwgX3NjYWxlKTtcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudE1hc2sub3V0bGluZVR5cGUgPT09IFBhaW50TWFza091dGxpbmUuTUFTS0VEKSB7XG4gICAgICAgIG91dGxpbmUgPSBtYWtlQmluYXJ5TWFza091dGxpbmUoY3VycmVudE1hc2ssIF9zY2FsZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjdXJyZW50TWFzay50eXBlID09PSBNYXNrVHlwZS5BTFBIQSkge1xuICAgICAgY29uc3QgbWFzayA9IG1ha2VCaW5hcnlNYXNrRnJvbUFscGhhTWFzayhjdXJyZW50TWFzaywgYWxwaGFUaHJlc2hvbGQpO1xuICAgICAgb3V0bGluZSA9IG1ha2VCaW5hcnlNYXNrT3V0bGluZShtYXNrLCBfc2NhbGUpO1xuICAgIH1cbiAgICBjb25zdCBwaXhlbERhdGEgPSBnZXRQaXhlbERhdGEob3V0bGluZS53LCBvdXRsaW5lLmgpO1xuICAgIGZpbGxQaXhlbERhdGFCaW5hcnlNYXNrKHBpeGVsRGF0YSwgX2NvbG9yLCBvdXRsaW5lKTtcbiAgICBjdHgucHV0SW1hZ2VEYXRhKHBpeGVsRGF0YS5pbWFnZURhdGEsIDAsIDApO1xuICB9XG4gIGNvbnN0IGJvdW5kc1NjcmF0Y2ggPSB7XG4gICAgeDogMCxcbiAgICB5OiAwLFxuICAgIHc6IDAsXG4gICAgaDogMFxuICB9O1xuICBmdW5jdGlvbiBnZXRCb3VuZHMoY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIpOiBSZWN0IHtcbiAgICBib3VuZHNTY3JhdGNoLnggPSBjZW50ZXJYICsgY3VycmVudE1hc2suY2VudGVyT2Zmc2V0WDtcbiAgICBib3VuZHNTY3JhdGNoLnkgPSBjZW50ZXJZICsgY3VycmVudE1hc2suY2VudGVyT2Zmc2V0WTtcbiAgICBib3VuZHNTY3JhdGNoLncgPSBjdXJyZW50TWFzay53O1xuICAgIGJvdW5kc1NjcmF0Y2guaCA9IGN1cnJlbnRNYXNrLmg7XG4gICAgcmV0dXJuIGJvdW5kc1NjcmF0Y2g7XG4gIH1cbiAgY29uc3QgYm91bmRzU2NhbGVkU2NyYXRjaCA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDAsXG4gICAgdzogMCxcbiAgICBoOiAwXG4gIH07XG4gIGZ1bmN0aW9uIGdldE91dGxpbmVCb3VuZHNTY2FsZWQoY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIpOiBSZWN0IHtcbiAgICBib3VuZHNTY2FsZWRTY3JhdGNoLnggPSBjZW50ZXJYICogX3NjYWxlICsgY3VycmVudE1hc2suY2VudGVyT2Zmc2V0WCAqIF9zY2FsZSAtIDE7XG4gICAgYm91bmRzU2NhbGVkU2NyYXRjaC55ID0gY2VudGVyWSAqIF9zY2FsZSArIGN1cnJlbnRNYXNrLmNlbnRlck9mZnNldFkgKiBfc2NhbGUgLSAxO1xuICAgIGJvdW5kc1NjYWxlZFNjcmF0Y2gudyA9IGN1cnJlbnRNYXNrLncgKiBfc2NhbGU7XG4gICAgYm91bmRzU2NhbGVkU2NyYXRjaC5oID0gY3VycmVudE1hc2suaCAqIF9zY2FsZTtcbiAgICByZXR1cm4gYm91bmRzU2NhbGVkU2NyYXRjaDtcbiAgfVxuICBmdW5jdGlvbiBkcmF3KGRyYXdDdHg6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCB8IE9mZnNjcmVlbkNhbnZhc1JlbmRlcmluZ0NvbnRleHQyRCwgY2VudGVyWDogbnVtYmVyLCBjZW50ZXJZOiBudW1iZXIpIHtcbiAgICBjb25zdCBkeCA9IGNlbnRlclggKiBfc2NhbGUgKyBjdXJyZW50TWFzay5jZW50ZXJPZmZzZXRYICogX3NjYWxlIC0gMTtcbiAgICBjb25zdCBkeSA9IGNlbnRlclkgKiBfc2NhbGUgKyBjdXJyZW50TWFzay5jZW50ZXJPZmZzZXRZICogX3NjYWxlIC0gMTtcbiAgICBkcmF3Q3R4LmRyYXdJbWFnZShjYW52YXMsIE1hdGguZmxvb3IoZHgpLCBNYXRoLmZsb29yKGR5KSk7XG4gIH1cbiAgZnVuY3Rpb24gZ2V0U2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbG9yOiBfY29sb3IsXG4gICAgICBzY2FsZTogX3NjYWxlLFxuICAgICAgY3VycmVudE1hc2tcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgdXBkYXRlLFxuICAgIGdldEJvdW5kcyxcbiAgICBnZXRCb3VuZHNTY2FsZWQ6IGdldE91dGxpbmVCb3VuZHNTY2FsZWQsXG4gICAgZHJhdyxcbiAgICBnZXRTZXR0aW5nc1xuICB9O1xufSJdLCJtYXBwaW5ncyI6IiIsImlnbm9yZUxpc3QiOltdfQ==","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","import { makeClippedRect, resolveRectClipping } from '../Rect/resolveClipping';\nconst SCRATCH_RECT = makeClippedRect();\n\n/**\n * Fills a region or the {@link PixelData32} buffer with a solid color.\n * This function is faster than {@link fillPixelData} but does not\n * return a boolean value indicating changes were made.\n *\n * @param target - The target to modify.\n * @param color - The color to apply.\n * @param rect - Defines the area to fill. If omitted, the entire\n * buffer is filled.\n */\nexport function fillPixelDataFast(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 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 const clip = resolveRectClipping(x, y, w, h, dst.w, dst.h, SCRATCH_RECT);\n if (!clip.inBounds) return;\n\n // Use the clipped values\n const {\n x: finalX,\n y: finalY,\n w: actualW,\n h: actualH\n } = clip;\n const dst32 = dst.data;\n const dw = dst.w;\n\n // Optimization: If filling the entire buffer, use the native .fill()\n if (actualW === dw && actualH === dst.h && finalX === 0 && finalY === 0) {\n dst32.fill(color);\n return;\n }\n\n // Row-by-row fill for partial rectangles\n for (let iy = 0; iy < actualH; iy++) {\n const start = (finalY + iy) * dw + finalX;\n const end = start + actualW;\n dst32.fill(color, start, end);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZFJlY3QsIHJlc29sdmVSZWN0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX1JFQ1QgPSBtYWtlQ2xpcHBlZFJlY3QoKTtcblxuLyoqXG4gKiBGaWxscyBhIHJlZ2lvbiBvciB0aGUge0BsaW5rIFBpeGVsRGF0YTMyfSBidWZmZXIgd2l0aCBhIHNvbGlkIGNvbG9yLlxuICogVGhpcyBmdW5jdGlvbiBpcyBmYXN0ZXIgdGhhbiB7QGxpbmsgZmlsbFBpeGVsRGF0YX0gYnV0IGRvZXMgbm90XG4gKiByZXR1cm4gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgY2hhbmdlcyB3ZXJlIG1hZGUuXG4gKlxuICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGNvbG9yIC0gVGhlIGNvbG9yIHRvIGFwcGx5LlxuICogQHBhcmFtIHJlY3QgLSBEZWZpbmVzIHRoZSBhcmVhIHRvIGZpbGwuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmVcbiAqIGJ1ZmZlciBpcyBmaWxsZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhRmFzdCh0YXJnZXQ6IFBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgcmVjdD86IFBhcnRpYWw8UmVjdD4pOiB2b2lkO1xuLyoqXG4gKiBAcGFyYW0gZHN0IC0gVGhlIHRhcmdldCB0byBtb2RpZnkuXG4gKiBAcGFyYW0gY29sb3IgLSBUaGUgY29sb3IgdG8gYXBwbHkuXG4gKiBAcGFyYW0geCAtIFN0YXJ0aW5nIGhvcml6b250YWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB5IC0gU3RhcnRpbmcgdmVydGljYWwgY29vcmRpbmF0ZS5cbiAqIEBwYXJhbSB3IC0gV2lkdGggb2YgdGhlIGZpbGwgYXJlYS5cbiAqIEBwYXJhbSBoIC0gSGVpZ2h0IG9mIHRoZSBmaWxsIGFyZWEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhRmFzdChkc3Q6IFBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgeDogbnVtYmVyLCB5OiBudW1iZXIsIHc6IG51bWJlciwgaDogbnVtYmVyKTogdm9pZDtcbmV4cG9ydCBmdW5jdGlvbiBmaWxsUGl4ZWxEYXRhRmFzdChkc3Q6IFBpeGVsRGF0YTMyLCBjb2xvcjogQ29sb3IzMiwgX3g/OiBQYXJ0aWFsPFJlY3Q+IHwgbnVtYmVyLCBfeT86IG51bWJlciwgX3c/OiBudW1iZXIsIF9oPzogbnVtYmVyKTogdm9pZCB7XG4gIGxldCB4OiBudW1iZXI7XG4gIGxldCB5OiBudW1iZXI7XG4gIGxldCB3OiBudW1iZXI7XG4gIGxldCBoOiBudW1iZXI7XG4gIGlmICh0eXBlb2YgX3ggPT09ICdvYmplY3QnKSB7XG4gICAgeCA9IF94LnggPz8gMDtcbiAgICB5ID0gX3gueSA/PyAwO1xuICAgIHcgPSBfeC53ID8/IGRzdC53O1xuICAgIGggPSBfeC5oID8/IGRzdC5oO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBfeCA9PT0gJ251bWJlcicpIHtcbiAgICB4ID0gX3g7XG4gICAgeSA9IF95ITtcbiAgICB3ID0gX3chO1xuICAgIGggPSBfaCE7XG4gIH0gZWxzZSB7XG4gICAgeCA9IDA7XG4gICAgeSA9IDA7XG4gICAgdyA9IGRzdC53O1xuICAgIGggPSBkc3QuaDtcbiAgfVxuICBjb25zdCBjbGlwID0gcmVzb2x2ZVJlY3RDbGlwcGluZyh4LCB5LCB3LCBoLCBkc3QudywgZHN0LmgsIFNDUkFUQ0hfUkVDVCk7XG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuO1xuXG4gIC8vIFVzZSB0aGUgY2xpcHBlZCB2YWx1ZXNcbiAgY29uc3Qge1xuICAgIHg6IGZpbmFsWCxcbiAgICB5OiBmaW5hbFksXG4gICAgdzogYWN0dWFsVyxcbiAgICBoOiBhY3R1YWxIXG4gIH0gPSBjbGlwO1xuICBjb25zdCBkc3QzMiA9IGRzdC5kYXRhO1xuICBjb25zdCBkdyA9IGRzdC53O1xuXG4gIC8vIE9wdGltaXphdGlvbjogSWYgZmlsbGluZyB0aGUgZW50aXJlIGJ1ZmZlciwgdXNlIHRoZSBuYXRpdmUgLmZpbGwoKVxuICBpZiAoYWN0dWFsVyA9PT0gZHcgJiYgYWN0dWFsSCA9PT0gZHN0LmggJiYgZmluYWxYID09PSAwICYmIGZpbmFsWSA9PT0gMCkge1xuICAgIGRzdDMyLmZpbGwoY29sb3IpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFJvdy1ieS1yb3cgZmlsbCBmb3IgcGFydGlhbCByZWN0YW5nbGVzXG4gIGZvciAobGV0IGl5ID0gMDsgaXkgPCBhY3R1YWxIOyBpeSsrKSB7XG4gICAgY29uc3Qgc3RhcnQgPSAoZmluYWxZICsgaXkpICogZHcgKyBmaW5hbFg7XG4gICAgY29uc3QgZW5kID0gc3RhcnQgKyBhY3R1YWxXO1xuICAgIGRzdDMyLmZpbGwoY29sb3IsIHN0YXJ0LCBlbmQpO1xuICB9XG59Il0sIm1hcHBpbmdzIjoiIiwiaWdub3JlTGlzdCI6W119","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 { makeClippedBlit, resolveBlitClipping } from '../Rect/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Extracts a rectangular region of pixels from PixelData.\n * Returns a new Uint32Array containing the extracted pixels.\n */\nexport function extractPixelDataBuffer(source: 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 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 srcW = source.w;\n const srcH = source.h;\n const srcData = source.data;\n\n // Safety check for empty or invalid dimensions\n if (w <= 0 || h <= 0) {\n return new Uint32Array(0);\n }\n const dstData = new Uint32Array(w * h);\n\n // We map from Source (srcW, srcH) at (x,y)\n // To Dest (w, h) at (0,0)\n // Note: resolveBlitClipping usually takes (dstX, dstY, srcX, srcY...)\n // Here we are \"blitting\" FROM x,y TO 0,0.\n const clip = resolveBlitClipping(0, 0, x, y, w, h, w, h, srcW, srcH, SCRATCH_BLIT);\n if (!clip.inBounds) return dstData;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const srcStart = (srcY + row) * srcW + srcX;\n const dstStart = (dstY + row) * w + dstX;\n\n // Perform the high-speed 32-bit bulk copy\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,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKTtcblxuLyoqXG4gKiBFeHRyYWN0cyBhIHJlY3Rhbmd1bGFyIHJlZ2lvbiBvZiBwaXhlbHMgZnJvbSBQaXhlbERhdGEuXG4gKiBSZXR1cm5zIGEgbmV3IFVpbnQzMkFycmF5IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCBwaXhlbHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZTogUGl4ZWxEYXRhMzIsIHJlY3Q6IFJlY3QpOiBVaW50MzJBcnJheTtcbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0UGl4ZWxEYXRhQnVmZmVyKHNvdXJjZTogUGl4ZWxEYXRhMzIsIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IFVpbnQzMkFycmF5O1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RQaXhlbERhdGFCdWZmZXIoc291cmNlOiBQaXhlbERhdGEzMiwgX3g6IFJlY3QgfCBudW1iZXIsIF95PzogbnVtYmVyLCBfdz86IG51bWJlciwgX2g/OiBudW1iZXIpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoXG4gIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnID8gX3ggOiB7XG4gICAgeDogX3gsXG4gICAgeTogX3khLFxuICAgIHc6IF93ISxcbiAgICBoOiBfaCFcbiAgfTtcbiAgY29uc3Qgc3JjVyA9IHNvdXJjZS53O1xuICBjb25zdCBzcmNIID0gc291cmNlLmg7XG4gIGNvbnN0IHNyY0RhdGEgPSBzb3VyY2UuZGF0YTtcblxuICAvLyBTYWZldHkgY2hlY2sgZm9yIGVtcHR5IG9yIGludmFsaWQgZGltZW5zaW9uc1xuICBpZiAodyA8PSAwIHx8IGggPD0gMCkge1xuICAgIHJldHVybiBuZXcgVWludDMyQXJyYXkoMCk7XG4gIH1cbiAgY29uc3QgZHN0RGF0YSA9IG5ldyBVaW50MzJBcnJheSh3ICogaCk7XG5cbiAgLy8gV2UgbWFwIGZyb20gU291cmNlIChzcmNXLCBzcmNIKSBhdCAoeCx5KVxuICAvLyBUbyBEZXN0ICh3LCBoKSBhdCAoMCwwKVxuICAvLyBOb3RlOiByZXNvbHZlQmxpdENsaXBwaW5nIHVzdWFsbHkgdGFrZXMgKGRzdFgsIGRzdFksIHNyY1gsIHNyY1kuLi4pXG4gIC8vIEhlcmUgd2UgYXJlIFwiYmxpdHRpbmdcIiBGUk9NIHgseSBUTyAwLDAuXG4gIGNvbnN0IGNsaXAgPSByZXNvbHZlQmxpdENsaXBwaW5nKDAsIDAsIHgsIHksIHcsIGgsIHcsIGgsIHNyY1csIHNyY0gsIFNDUkFUQ0hfQkxJVCk7XG4gIGlmICghY2xpcC5pbkJvdW5kcykgcmV0dXJuIGRzdERhdGE7XG4gIGNvbnN0IHtcbiAgICB4OiBkc3RYLFxuICAgIHk6IGRzdFksXG4gICAgc3g6IHNyY1gsXG4gICAgc3k6IHNyY1ksXG4gICAgdzogY29weVcsXG4gICAgaDogY29weUhcbiAgfSA9IGNsaXA7XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGNvcHlIOyByb3crKykge1xuICAgIGNvbnN0IHNyY1N0YXJ0ID0gKHNyY1kgKyByb3cpICogc3JjVyArIHNyY1g7XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoZHN0WSArIHJvdykgKiB3ICsgZHN0WDtcblxuICAgIC8vIFBlcmZvcm0gdGhlIGhpZ2gtc3BlZWQgMzItYml0IGJ1bGsgY29weVxuICAgIGNvbnN0IGNodW5rID0gc3JjRGF0YS5zdWJhcnJheShzcmNTdGFydCwgc3JjU3RhcnQgKyBjb3B5Vyk7XG4gICAgZHN0RGF0YS5zZXQoY2h1bmssIGRzdFN0YXJ0KTtcbiAgfVxuICByZXR1cm4gZHN0RGF0YTtcbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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 { 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","import { makeClippedBlit, resolveBlitClipping } from '../Rect/resolveClipping';\nconst SCRATCH_BLIT = makeClippedBlit();\n\n/**\n * Copies a pixel buffer into a specific region of a {@link PixelData32} object.\n *\n * This function performs a direct memory copy from a {@link Uint32Array}\n * into the target buffer.\n */\nexport function writePixelDataBuffer(target: PixelData32, data: Uint32Array, rect: Rect): void;\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 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 dstW = target.w;\n const dstH = target.h;\n const dstData = target.data;\n\n // treat the source buffer as a Source Image starting at 0,0 with size w,h\n const clip = resolveBlitClipping(x, y, 0, 0, w, h, dstW, dstH, w, h, SCRATCH_BLIT);\n if (!clip.inBounds) return;\n const {\n x: dstX,\n y: dstY,\n sx: srcX,\n sy: srcY,\n w: copyW,\n h: copyH\n } = clip;\n for (let row = 0; row < copyH; row++) {\n const dstStart = (dstY + row) * dstW + dstX;\n const srcStart = (srcY + row) * w + srcX;\n dstData.set(data.subarray(srcStart, srcStart + copyW), dstStart);\n }\n}\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6W10sInNvdXJjZXMiOltdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtYWtlQ2xpcHBlZEJsaXQsIHJlc29sdmVCbGl0Q2xpcHBpbmcgfSBmcm9tICcuLi9SZWN0L3Jlc29sdmVDbGlwcGluZyc7XG5jb25zdCBTQ1JBVENIX0JMSVQgPSBtYWtlQ2xpcHBlZEJsaXQoKTtcblxuLyoqXG4gKiBDb3BpZXMgYSBwaXhlbCBidWZmZXIgaW50byBhIHNwZWNpZmljIHJlZ2lvbiBvZiBhIHtAbGluayBQaXhlbERhdGEzMn0gb2JqZWN0LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgYSBkaXJlY3QgbWVtb3J5IGNvcHkgZnJvbSBhIHtAbGluayBVaW50MzJBcnJheX1cbiAqIGludG8gdGhlIHRhcmdldCBidWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cml0ZVBpeGVsRGF0YUJ1ZmZlcih0YXJnZXQ6IFBpeGVsRGF0YTMyLCBkYXRhOiBVaW50MzJBcnJheSwgcmVjdDogUmVjdCk6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGFCdWZmZXIodGFyZ2V0OiBQaXhlbERhdGEzMiwgZGF0YTogVWludDMyQXJyYXksIHg6IG51bWJlciwgeTogbnVtYmVyLCB3OiBudW1iZXIsIGg6IG51bWJlcik6IHZvaWQ7XG5leHBvcnQgZnVuY3Rpb24gd3JpdGVQaXhlbERhdGFCdWZmZXIodGFyZ2V0OiBQaXhlbERhdGEzMiwgZGF0YTogVWludDMyQXJyYXksIF94OiBSZWN0IHwgbnVtYmVyLCBfeT86IG51bWJlciwgX3c/OiBudW1iZXIsIF9oPzogbnVtYmVyKTogdm9pZCB7XG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgdyxcbiAgICBoXG4gIH0gPSB0eXBlb2YgX3ggPT09ICdvYmplY3QnID8gX3ggOiB7XG4gICAgeDogX3gsXG4gICAgeTogX3khLFxuICAgIHc6IF93ISxcbiAgICBoOiBfaCFcbiAgfTtcbiAgY29uc3QgZHN0VyA9IHRhcmdldC53O1xuICBjb25zdCBkc3RIID0gdGFyZ2V0Lmg7XG4gIGNvbnN0IGRzdERhdGEgPSB0YXJnZXQuZGF0YTtcblxuICAvLyB0cmVhdCB0aGUgc291cmNlIGJ1ZmZlciBhcyBhIFNvdXJjZSBJbWFnZSBzdGFydGluZyBhdCAwLDAgd2l0aCBzaXplIHcsaFxuICBjb25zdCBjbGlwID0gcmVzb2x2ZUJsaXRDbGlwcGluZyh4LCB5LCAwLCAwLCB3LCBoLCBkc3RXLCBkc3RILCB3LCBoLCBTQ1JBVENIX0JMSVQpO1xuICBpZiAoIWNsaXAuaW5Cb3VuZHMpIHJldHVybjtcbiAgY29uc3Qge1xuICAgIHg6IGRzdFgsXG4gICAgeTogZHN0WSxcbiAgICBzeDogc3JjWCxcbiAgICBzeTogc3JjWSxcbiAgICB3OiBjb3B5VyxcbiAgICBoOiBjb3B5SFxuICB9ID0gY2xpcDtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgY29weUg7IHJvdysrKSB7XG4gICAgY29uc3QgZHN0U3RhcnQgPSAoZHN0WSArIHJvdykgKiBkc3RXICsgZHN0WDtcbiAgICBjb25zdCBzcmNTdGFydCA9IChzcmNZICsgcm93KSAqIHcgKyBzcmNYO1xuICAgIGRzdERhdGEuc2V0KGRhdGEuc3ViYXJyYXkoc3JjU3RhcnQsIHNyY1N0YXJ0ICsgY29weVcpLCBkc3RTdGFydCk7XG4gIH1cbn0iXSwibWFwcGluZ3MiOiIiLCJpZ25vcmVMaXN0IjpbXX0=","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==","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="],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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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","SCRATCH_RECT","defaults","fillPixelDataBinaryMask","SCRATCH_RECT","defaults","invertPixelData","SCRATCH_BLIT","SCRATCH_BLIT","r","g","b","a","PaintMaskOutline","SCRATCH_OPTS","SCRATCH_OPTS","SCRATCH_OPTS","SCRATCH_RECT","SCRATCH_BLIT","SCRATCH_BLIT"]}