@pixerate/editor 0.49.0 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/canvas/index.cjs +151 -25
- package/dist/canvas/index.cjs.map +1 -1
- package/dist/canvas/index.d.cts +109 -3
- package/dist/canvas/index.d.ts +109 -3
- package/dist/canvas/index.js +127 -1
- package/dist/canvas/index.js.map +1 -1
- package/dist/{chunk-3LHWTGHW.js → chunk-TO22LX34.js} +11 -1
- package/dist/chunk-TO22LX34.js.map +1 -0
- package/dist/{chunk-VNYRI265.cjs → chunk-YNSK4MGT.cjs} +12 -2
- package/dist/chunk-YNSK4MGT.cjs.map +1 -0
- package/dist/image-editor/index.cjs +141 -1
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +42 -1
- package/dist/image-editor/index.d.ts +42 -1
- package/dist/image-editor/index.js +140 -0
- package/dist/image-editor/index.js.map +1 -1
- package/dist/{pathfinder-D98S2lV5.d.ts → pathfinder-B9xh_pCZ.d.ts} +2 -1
- package/dist/{pathfinder-DKRcXiLS.d.cts → pathfinder-QdG70sr9.d.cts} +2 -1
- package/dist/vector/index.cjs +153 -153
- package/dist/vector/index.d.cts +1 -1
- package/dist/vector/index.d.ts +1 -1
- package/dist/vector/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-3LHWTGHW.js.map +0 -1
- package/dist/chunk-VNYRI265.cjs.map +0 -1
|
@@ -1768,4 +1768,45 @@ declare class SelectionGesture {
|
|
|
1768
1768
|
*/
|
|
1769
1769
|
declare function createImageSelectionTools(controller: ImageEditorController): AgentTool[];
|
|
1770
1770
|
|
|
1771
|
-
|
|
1771
|
+
/**
|
|
1772
|
+
* Region-based mosaic (pixelation) and box-blur filters for redacting or anonymizing
|
|
1773
|
+
* rectangular bounding boxes on an ImageData-like buffer.
|
|
1774
|
+
*/
|
|
1775
|
+
interface MosaicRegion {
|
|
1776
|
+
x: number;
|
|
1777
|
+
y: number;
|
|
1778
|
+
width: number;
|
|
1779
|
+
height: number;
|
|
1780
|
+
/**
|
|
1781
|
+
* When true, coordinates are interpreted as normalized values:
|
|
1782
|
+
* - [0..1] when all values are <= 1
|
|
1783
|
+
* - [0..1000] when any value is > 1 (e.g. Gemini 0..1000 bounding boxes)
|
|
1784
|
+
*/
|
|
1785
|
+
normalized?: boolean;
|
|
1786
|
+
}
|
|
1787
|
+
interface MosaicImageDataLike {
|
|
1788
|
+
data: Uint8ClampedArray;
|
|
1789
|
+
width: number;
|
|
1790
|
+
height: number;
|
|
1791
|
+
}
|
|
1792
|
+
/**
|
|
1793
|
+
* Resolves a MosaicRegion to clamped integer pixel bounds [x0, y0, x1, y1] within the image dimensions.
|
|
1794
|
+
*/
|
|
1795
|
+
declare function resolveMosaicRegionBounds(region: MosaicRegion, imgWidth: number, imgHeight: number): {
|
|
1796
|
+
x0: number;
|
|
1797
|
+
y0: number;
|
|
1798
|
+
x1: number;
|
|
1799
|
+
y1: number;
|
|
1800
|
+
} | null;
|
|
1801
|
+
/**
|
|
1802
|
+
* Pixelates each rectangular region by averaging `blockSize x blockSize` blocks.
|
|
1803
|
+
* Mutates `imageData.data` in-place and returns `imageData`.
|
|
1804
|
+
*/
|
|
1805
|
+
declare function applyRegionMosaic<T extends MosaicImageDataLike>(imageData: T, regions: MosaicRegion[], blockSize?: number): T;
|
|
1806
|
+
/**
|
|
1807
|
+
* Applies a separable 2-pass box blur to each rectangular region.
|
|
1808
|
+
* Mutates `imageData.data` in-place and returns `imageData`.
|
|
1809
|
+
*/
|
|
1810
|
+
declare function applyRegionBlur<T extends MosaicImageDataLike>(imageData: T, regions: MosaicRegion[], radius?: number): T;
|
|
1811
|
+
|
|
1812
|
+
export { ADJUSTMENT_KINDS, ADJUSTMENT_LAYER_CONTROLS, ADJUSTMENT_LAYER_OPACITY_CONTROL, ADJUSTMENT_LUT_SIZE, AS_SHOT_KELVIN, type AdjustmentKind, type AdjustmentKindInfo, type AdjustmentLayer, type AdjustmentLayerBase, type AdjustmentLayerInit, type AdjustmentLayerMask, type AdjustmentLayerOf, type AdjustmentLayerUpdate, type AdjustmentParamsMap, type Annotation, type AnnotationType, type ArrowAnnotation, type AspectRatio, BLEND_MODES, type BaseAnnotation, type BlackWhiteParams, type BlendMode, type BlendModeInfo, type Chromaticity, type CircleAnnotation, type ColorBalanceParams, type ColorBalanceTone, type ColorDistance, type ColorRangeOptions, type ColorRangeSample, type ControlSection, type ControlSpec, type ControlTrack, type CreateAnnotationPayload, type CropBox, type CropHandle, type CurvePoint, type CurvesParams, D65, DEFAULT_ADJUSTMENTS, DEFAULT_DEPTH_MASK, DEFAULT_REFINE_EDGE_PARAMS, DEFAULT_SELECTION_TOOL_OPTIONS, DEFAULT_TRANSFORM, DIRECT_GAUSSIAN_MAX_SIGMA, type DepthMaskOptions, EMPTY_DISTANCE, type ExportOptions, GUIDED_FILTER_EPS, type GestureModifiers, HISTOGRAM_BINS, HUE_RANGE_LABELS, type HistogramChannel, type HueRange, type HueSaturationParams, IDENTITY_MATRIX3, IMAGE_ADJUSTMENT_CONTROLS, IMAGE_EDITOR_SCHEMA_VERSION, IMAGE_EDITOR_STATE_VERSION, type ImageAdjustments, type ImageAnnotation, type ImageDimensions, type ImageEditorAIHooks, ImageEditorController, type ImageEditorDocumentLoad, type ImageEditorOptions, ImageEditorRenderer, type ImageEditorState, type ImageEditorTool, type ImageEditorToolProviderOptions, type ImageHistogram, type ImagePoint, type ImageProcessVersion, type ImageProjection, type ImageTransform, type InpaintHook, type InpaintOptions, type InvertParams, LATEST_PROCESS_VERSION, LEGACY_PROCESS_VERSION, LUMA_709, type LayerMaskProps, type LevelsChannel, type LevelsParams, type LineAnnotation, MAX_KELVIN, MIN_KELVIN, MIRED_PER_TEMPERATURE_UNIT, type MagicWandOptions, type Matrix3, type MosaicImageDataLike, type MosaicRegion, type PenAnnotation, type PhotoFilterParams, type PixelBuffer, type PixelOp, type PosterizeParams, type QuickMaskStyle, REFINE_EDGE_CONTROLS, type RectAnnotation, type RefineEdgeControl, type RefineEdgeParams, type RemoveBackgroundHook, type RemoveBackgroundOptions, type RenderOptions, type Rgb$1 as Rgb, type Rgba, SELECTION_MODES, SELECTION_MODE_LABELS, SELECTION_MODIFY_OPS, SELECTION_TOOLS, type SampleOptions, type SelectionChannel, type SelectionCommandOptions, SelectionGesture, type SelectionMask, type SelectionMode, type SelectionModifyOp, type SelectionToolKind, type SelectionToolOptions, type SerializedImageEditorState, type SerializedSelection, type ShapeSelectionOptions, TINT_SCALE, TONE_LUT_SIZE, TONE_RANGE_PRESETS, type TextAnnotation, type ThresholdParams, type ToneRangePreset, type UnitLevels, VIBRANCE_GREY, type VibranceParams, type ViewportMetrics, activeAdjustmentLayers, adjustmentKindLabel, adjustmentLayersKey, applyAdjustmentLayers, applyAdjustments, applyDepthMask, applyImageProjectionToContext, applyLegacyAdjustments, applyMatrix3, applyProcess2Adjustments, applyRegionBlur, applyRegionMosaic, blackWhiteGray, blendChannel, blendImageData, blendLum, blendPixel, blendRgb, borderCoverage, boxMean, boxToCurvePoint, bradfordAdaptation, buildLayerMaskPlanes, buildToneLut, calculateCropDrag, canvasCompositeOperation, canvasToImagePoint, clampControlValue, clampCropToImage, colorBalanceChannel, colorRange, combineSelections, compileAdjustmentLayer, computeHistogram, computeSelectionBounds, contractCoverage, controlPosition, controlTrackBackground, coverageToByte, createAdjustmentLayer, createImageEditorToolProvider, createImageSelectionTools, createSelectionMask, curveLut, curveLutFromLevels, curvePointToBox, curveSvgPath, decodeLayerMask, decodeSelectionRle, defaultAdjustmentParams, describeSelection, deserializeSelection, distanceTransform, edgeWidth, ellipsePoints, ellipseSelection, encodeSelectionRle, evaluateAdjustmentLayers, expandCoverage, featherCoverage, findAdjustmentControl, findLayerControl, formatControlValue, fullSelection, gaussianBlur, getAnnotationBounds, getControlPath, getCropCursor, getRotatedSize, getViewportMetrics, getViewportProjection, globalImageCache, greyMorphology, guidePlanes, guidedFilterColor, hashMaskContent, hexToRgb, histogramPath, hitTestAnnotation, hitTestCrop, hitTestCurvePoint, hslToRgb, hueRange, hueRangeTables, hueRangeWeight, hueSaturation, identityCurve, identityLevels, imageEditorStateMigrations, imageToCanvasPoint, insertCurvePoint, invertMatrix3, invertSelection, isAdjustmentKind, isBlendMode, isQuarterTurnSwapped, isSelectionEmpty, isSelectionMode, isSeparableBlendMode, kelvinToTemperature, layerMaskCoverage, layerMaskFromSelection, layerMaskKey, levelsValue, linearSrgbToXy, linearToSrgb, loadImageEditorDocument, magicWand, mapCropHandle, migrateSerializedImageEditorState, modifySelection, moveCurvePoint, mulMatrix3, neutralHueRange, normalizeAdjustmentLayer, normalizeAdjustmentLayers, normalizeAngle, normalizeBlendMode, normalizeLayerMask, normalizeProcessVersion, normalizeRect, normalizeRefineEdgeParams, normalizeStoredAdjustments, parseSelectionMode, photoFilterMatrix, polygonCoverage, polygonSelection, posterizeValue, projectImagePoint, projectImageRect, projectMaskCoverage, quickMaskPixels, rangeLightness, readAdjustmentControls, rectSelection, refineCoverage, refineEdgeHalo, refineSelection, removeAlpha, removeCurvePoint, resizeSelection, resolveMosaicRegionBounds, rgbToGray, rgbToHsl, sampleLut, sampleToneLut, selectionArea, selectionFromCoverage, selectionFromPixels, selectionModeFromModifiers, selectionOutline, selectionToCoverage, selectionToPixels, selectionValueAt, serializeSelection, setControlPath, setLum, shiftCoverage, smoothCoverage, srgb8ToLab, srgbToLinear, tempTintToXy, temperatureToKelvin, toneCurve, toneLuts, toneRange, unprojectCanvasPoint, updateLayerMaskProps, uvToXy, vibranceLinear, vibrancePixel, wbMatrix, whiteBalanceFromSample, whiteBalanceMatrix, xyToTempTint, xyToUv };
|
|
@@ -1768,4 +1768,45 @@ declare class SelectionGesture {
|
|
|
1768
1768
|
*/
|
|
1769
1769
|
declare function createImageSelectionTools(controller: ImageEditorController): AgentTool[];
|
|
1770
1770
|
|
|
1771
|
-
|
|
1771
|
+
/**
|
|
1772
|
+
* Region-based mosaic (pixelation) and box-blur filters for redacting or anonymizing
|
|
1773
|
+
* rectangular bounding boxes on an ImageData-like buffer.
|
|
1774
|
+
*/
|
|
1775
|
+
interface MosaicRegion {
|
|
1776
|
+
x: number;
|
|
1777
|
+
y: number;
|
|
1778
|
+
width: number;
|
|
1779
|
+
height: number;
|
|
1780
|
+
/**
|
|
1781
|
+
* When true, coordinates are interpreted as normalized values:
|
|
1782
|
+
* - [0..1] when all values are <= 1
|
|
1783
|
+
* - [0..1000] when any value is > 1 (e.g. Gemini 0..1000 bounding boxes)
|
|
1784
|
+
*/
|
|
1785
|
+
normalized?: boolean;
|
|
1786
|
+
}
|
|
1787
|
+
interface MosaicImageDataLike {
|
|
1788
|
+
data: Uint8ClampedArray;
|
|
1789
|
+
width: number;
|
|
1790
|
+
height: number;
|
|
1791
|
+
}
|
|
1792
|
+
/**
|
|
1793
|
+
* Resolves a MosaicRegion to clamped integer pixel bounds [x0, y0, x1, y1] within the image dimensions.
|
|
1794
|
+
*/
|
|
1795
|
+
declare function resolveMosaicRegionBounds(region: MosaicRegion, imgWidth: number, imgHeight: number): {
|
|
1796
|
+
x0: number;
|
|
1797
|
+
y0: number;
|
|
1798
|
+
x1: number;
|
|
1799
|
+
y1: number;
|
|
1800
|
+
} | null;
|
|
1801
|
+
/**
|
|
1802
|
+
* Pixelates each rectangular region by averaging `blockSize x blockSize` blocks.
|
|
1803
|
+
* Mutates `imageData.data` in-place and returns `imageData`.
|
|
1804
|
+
*/
|
|
1805
|
+
declare function applyRegionMosaic<T extends MosaicImageDataLike>(imageData: T, regions: MosaicRegion[], blockSize?: number): T;
|
|
1806
|
+
/**
|
|
1807
|
+
* Applies a separable 2-pass box blur to each rectangular region.
|
|
1808
|
+
* Mutates `imageData.data` in-place and returns `imageData`.
|
|
1809
|
+
*/
|
|
1810
|
+
declare function applyRegionBlur<T extends MosaicImageDataLike>(imageData: T, regions: MosaicRegion[], radius?: number): T;
|
|
1811
|
+
|
|
1812
|
+
export { ADJUSTMENT_KINDS, ADJUSTMENT_LAYER_CONTROLS, ADJUSTMENT_LAYER_OPACITY_CONTROL, ADJUSTMENT_LUT_SIZE, AS_SHOT_KELVIN, type AdjustmentKind, type AdjustmentKindInfo, type AdjustmentLayer, type AdjustmentLayerBase, type AdjustmentLayerInit, type AdjustmentLayerMask, type AdjustmentLayerOf, type AdjustmentLayerUpdate, type AdjustmentParamsMap, type Annotation, type AnnotationType, type ArrowAnnotation, type AspectRatio, BLEND_MODES, type BaseAnnotation, type BlackWhiteParams, type BlendMode, type BlendModeInfo, type Chromaticity, type CircleAnnotation, type ColorBalanceParams, type ColorBalanceTone, type ColorDistance, type ColorRangeOptions, type ColorRangeSample, type ControlSection, type ControlSpec, type ControlTrack, type CreateAnnotationPayload, type CropBox, type CropHandle, type CurvePoint, type CurvesParams, D65, DEFAULT_ADJUSTMENTS, DEFAULT_DEPTH_MASK, DEFAULT_REFINE_EDGE_PARAMS, DEFAULT_SELECTION_TOOL_OPTIONS, DEFAULT_TRANSFORM, DIRECT_GAUSSIAN_MAX_SIGMA, type DepthMaskOptions, EMPTY_DISTANCE, type ExportOptions, GUIDED_FILTER_EPS, type GestureModifiers, HISTOGRAM_BINS, HUE_RANGE_LABELS, type HistogramChannel, type HueRange, type HueSaturationParams, IDENTITY_MATRIX3, IMAGE_ADJUSTMENT_CONTROLS, IMAGE_EDITOR_SCHEMA_VERSION, IMAGE_EDITOR_STATE_VERSION, type ImageAdjustments, type ImageAnnotation, type ImageDimensions, type ImageEditorAIHooks, ImageEditorController, type ImageEditorDocumentLoad, type ImageEditorOptions, ImageEditorRenderer, type ImageEditorState, type ImageEditorTool, type ImageEditorToolProviderOptions, type ImageHistogram, type ImagePoint, type ImageProcessVersion, type ImageProjection, type ImageTransform, type InpaintHook, type InpaintOptions, type InvertParams, LATEST_PROCESS_VERSION, LEGACY_PROCESS_VERSION, LUMA_709, type LayerMaskProps, type LevelsChannel, type LevelsParams, type LineAnnotation, MAX_KELVIN, MIN_KELVIN, MIRED_PER_TEMPERATURE_UNIT, type MagicWandOptions, type Matrix3, type MosaicImageDataLike, type MosaicRegion, type PenAnnotation, type PhotoFilterParams, type PixelBuffer, type PixelOp, type PosterizeParams, type QuickMaskStyle, REFINE_EDGE_CONTROLS, type RectAnnotation, type RefineEdgeControl, type RefineEdgeParams, type RemoveBackgroundHook, type RemoveBackgroundOptions, type RenderOptions, type Rgb$1 as Rgb, type Rgba, SELECTION_MODES, SELECTION_MODE_LABELS, SELECTION_MODIFY_OPS, SELECTION_TOOLS, type SampleOptions, type SelectionChannel, type SelectionCommandOptions, SelectionGesture, type SelectionMask, type SelectionMode, type SelectionModifyOp, type SelectionToolKind, type SelectionToolOptions, type SerializedImageEditorState, type SerializedSelection, type ShapeSelectionOptions, TINT_SCALE, TONE_LUT_SIZE, TONE_RANGE_PRESETS, type TextAnnotation, type ThresholdParams, type ToneRangePreset, type UnitLevels, VIBRANCE_GREY, type VibranceParams, type ViewportMetrics, activeAdjustmentLayers, adjustmentKindLabel, adjustmentLayersKey, applyAdjustmentLayers, applyAdjustments, applyDepthMask, applyImageProjectionToContext, applyLegacyAdjustments, applyMatrix3, applyProcess2Adjustments, applyRegionBlur, applyRegionMosaic, blackWhiteGray, blendChannel, blendImageData, blendLum, blendPixel, blendRgb, borderCoverage, boxMean, boxToCurvePoint, bradfordAdaptation, buildLayerMaskPlanes, buildToneLut, calculateCropDrag, canvasCompositeOperation, canvasToImagePoint, clampControlValue, clampCropToImage, colorBalanceChannel, colorRange, combineSelections, compileAdjustmentLayer, computeHistogram, computeSelectionBounds, contractCoverage, controlPosition, controlTrackBackground, coverageToByte, createAdjustmentLayer, createImageEditorToolProvider, createImageSelectionTools, createSelectionMask, curveLut, curveLutFromLevels, curvePointToBox, curveSvgPath, decodeLayerMask, decodeSelectionRle, defaultAdjustmentParams, describeSelection, deserializeSelection, distanceTransform, edgeWidth, ellipsePoints, ellipseSelection, encodeSelectionRle, evaluateAdjustmentLayers, expandCoverage, featherCoverage, findAdjustmentControl, findLayerControl, formatControlValue, fullSelection, gaussianBlur, getAnnotationBounds, getControlPath, getCropCursor, getRotatedSize, getViewportMetrics, getViewportProjection, globalImageCache, greyMorphology, guidePlanes, guidedFilterColor, hashMaskContent, hexToRgb, histogramPath, hitTestAnnotation, hitTestCrop, hitTestCurvePoint, hslToRgb, hueRange, hueRangeTables, hueRangeWeight, hueSaturation, identityCurve, identityLevels, imageEditorStateMigrations, imageToCanvasPoint, insertCurvePoint, invertMatrix3, invertSelection, isAdjustmentKind, isBlendMode, isQuarterTurnSwapped, isSelectionEmpty, isSelectionMode, isSeparableBlendMode, kelvinToTemperature, layerMaskCoverage, layerMaskFromSelection, layerMaskKey, levelsValue, linearSrgbToXy, linearToSrgb, loadImageEditorDocument, magicWand, mapCropHandle, migrateSerializedImageEditorState, modifySelection, moveCurvePoint, mulMatrix3, neutralHueRange, normalizeAdjustmentLayer, normalizeAdjustmentLayers, normalizeAngle, normalizeBlendMode, normalizeLayerMask, normalizeProcessVersion, normalizeRect, normalizeRefineEdgeParams, normalizeStoredAdjustments, parseSelectionMode, photoFilterMatrix, polygonCoverage, polygonSelection, posterizeValue, projectImagePoint, projectImageRect, projectMaskCoverage, quickMaskPixels, rangeLightness, readAdjustmentControls, rectSelection, refineCoverage, refineEdgeHalo, refineSelection, removeAlpha, removeCurvePoint, resizeSelection, resolveMosaicRegionBounds, rgbToGray, rgbToHsl, sampleLut, sampleToneLut, selectionArea, selectionFromCoverage, selectionFromPixels, selectionModeFromModifiers, selectionOutline, selectionToCoverage, selectionToPixels, selectionValueAt, serializeSelection, setControlPath, setLum, shiftCoverage, smoothCoverage, srgb8ToLab, srgbToLinear, tempTintToXy, temperatureToKelvin, toneCurve, toneLuts, toneRange, unprojectCanvasPoint, updateLayerMaskProps, uvToXy, vibranceLinear, vibrancePixel, wbMatrix, whiteBalanceFromSample, whiteBalanceMatrix, xyToTempTint, xyToUv };
|
|
@@ -5733,6 +5733,143 @@ var SelectionGesture = class {
|
|
|
5733
5733
|
this.points = [];
|
|
5734
5734
|
}
|
|
5735
5735
|
};
|
|
5736
|
+
|
|
5737
|
+
// src/image-editor/mosaic-filter.ts
|
|
5738
|
+
function resolveMosaicRegionBounds(region, imgWidth, imgHeight) {
|
|
5739
|
+
if (imgWidth <= 0 || imgHeight <= 0 || region.width <= 0 || region.height <= 0) {
|
|
5740
|
+
return null;
|
|
5741
|
+
}
|
|
5742
|
+
let rx = region.x;
|
|
5743
|
+
let ry = region.y;
|
|
5744
|
+
let rw = region.width;
|
|
5745
|
+
let rh = region.height;
|
|
5746
|
+
const isZeroToOne = rx >= 0 && ry >= 0 && rw > 0 && rh > 0 && rx <= 1 && ry <= 1 && rw <= 1 && rh <= 1 && (region.normalized === true || region.normalized === void 0 && (imgWidth > 1 || imgHeight > 1) && (!Number.isInteger(rx) || !Number.isInteger(ry) || !Number.isInteger(rw) || !Number.isInteger(rh)));
|
|
5747
|
+
if (isZeroToOne) {
|
|
5748
|
+
rx = rx * imgWidth;
|
|
5749
|
+
ry = ry * imgHeight;
|
|
5750
|
+
rw = rw * imgWidth;
|
|
5751
|
+
rh = rh * imgHeight;
|
|
5752
|
+
} else if (region.normalized === true) {
|
|
5753
|
+
rx = rx / 1e3 * imgWidth;
|
|
5754
|
+
ry = ry / 1e3 * imgHeight;
|
|
5755
|
+
rw = rw / 1e3 * imgWidth;
|
|
5756
|
+
rh = rh / 1e3 * imgHeight;
|
|
5757
|
+
}
|
|
5758
|
+
const x0 = Math.max(0, Math.min(imgWidth, Math.floor(rx)));
|
|
5759
|
+
const y0 = Math.max(0, Math.min(imgHeight, Math.floor(ry)));
|
|
5760
|
+
const x1 = Math.max(0, Math.min(imgWidth, Math.ceil(rx + rw)));
|
|
5761
|
+
const y1 = Math.max(0, Math.min(imgHeight, Math.ceil(ry + rh)));
|
|
5762
|
+
if (x1 <= x0 || y1 <= y0) return null;
|
|
5763
|
+
return { x0, y0, x1, y1 };
|
|
5764
|
+
}
|
|
5765
|
+
function applyRegionMosaic(imageData, regions, blockSize = 12) {
|
|
5766
|
+
const { data, width, height } = imageData;
|
|
5767
|
+
const step = Math.max(2, Math.round(blockSize));
|
|
5768
|
+
for (const region of regions) {
|
|
5769
|
+
const bounds = resolveMosaicRegionBounds(region, width, height);
|
|
5770
|
+
if (!bounds) continue;
|
|
5771
|
+
const { x0, y0, x1, y1 } = bounds;
|
|
5772
|
+
for (let by = y0; by < y1; by += step) {
|
|
5773
|
+
const bh = Math.min(step, y1 - by);
|
|
5774
|
+
for (let bx = x0; bx < x1; bx += step) {
|
|
5775
|
+
const bw = Math.min(step, x1 - bx);
|
|
5776
|
+
let rSum = 0;
|
|
5777
|
+
let gSum = 0;
|
|
5778
|
+
let bSum = 0;
|
|
5779
|
+
let aSum = 0;
|
|
5780
|
+
const count = bw * bh;
|
|
5781
|
+
for (let py = by; py < by + bh; py++) {
|
|
5782
|
+
const rowOffset = py * width;
|
|
5783
|
+
for (let px = bx; px < bx + bw; px++) {
|
|
5784
|
+
const idx = (rowOffset + px) * 4;
|
|
5785
|
+
rSum += data[idx];
|
|
5786
|
+
gSum += data[idx + 1];
|
|
5787
|
+
bSum += data[idx + 2];
|
|
5788
|
+
aSum += data[idx + 3];
|
|
5789
|
+
}
|
|
5790
|
+
}
|
|
5791
|
+
const rAvg = Math.round(rSum / count);
|
|
5792
|
+
const gAvg = Math.round(gSum / count);
|
|
5793
|
+
const bAvg = Math.round(bSum / count);
|
|
5794
|
+
const aAvg = Math.round(aSum / count);
|
|
5795
|
+
for (let py = by; py < by + bh; py++) {
|
|
5796
|
+
const rowOffset = py * width;
|
|
5797
|
+
for (let px = bx; px < bx + bw; px++) {
|
|
5798
|
+
const idx = (rowOffset + px) * 4;
|
|
5799
|
+
data[idx] = rAvg;
|
|
5800
|
+
data[idx + 1] = gAvg;
|
|
5801
|
+
data[idx + 2] = bAvg;
|
|
5802
|
+
data[idx + 3] = aAvg;
|
|
5803
|
+
}
|
|
5804
|
+
}
|
|
5805
|
+
}
|
|
5806
|
+
}
|
|
5807
|
+
}
|
|
5808
|
+
return imageData;
|
|
5809
|
+
}
|
|
5810
|
+
function applyRegionBlur(imageData, regions, radius = 10) {
|
|
5811
|
+
const { data, width, height } = imageData;
|
|
5812
|
+
const rad = Math.max(1, Math.min(64, Math.round(radius)));
|
|
5813
|
+
for (const region of regions) {
|
|
5814
|
+
const bounds = resolveMosaicRegionBounds(region, width, height);
|
|
5815
|
+
if (!bounds) continue;
|
|
5816
|
+
const { x0, y0, x1, y1 } = bounds;
|
|
5817
|
+
const rw = x1 - x0;
|
|
5818
|
+
const rh = y1 - y0;
|
|
5819
|
+
const temp = new Uint8ClampedArray(rw * rh * 4);
|
|
5820
|
+
for (let y = 0; y < rh; y++) {
|
|
5821
|
+
const srcY = y0 + y;
|
|
5822
|
+
for (let x = 0; x < rw; x++) {
|
|
5823
|
+
let rSum = 0;
|
|
5824
|
+
let gSum = 0;
|
|
5825
|
+
let bSum = 0;
|
|
5826
|
+
let aSum = 0;
|
|
5827
|
+
let count = 0;
|
|
5828
|
+
const kStart = Math.max(0, x - rad);
|
|
5829
|
+
const kEnd = Math.min(rw - 1, x + rad);
|
|
5830
|
+
for (let kx = kStart; kx <= kEnd; kx++) {
|
|
5831
|
+
const srcIdx = (srcY * width + (x0 + kx)) * 4;
|
|
5832
|
+
rSum += data[srcIdx];
|
|
5833
|
+
gSum += data[srcIdx + 1];
|
|
5834
|
+
bSum += data[srcIdx + 2];
|
|
5835
|
+
aSum += data[srcIdx + 3];
|
|
5836
|
+
count++;
|
|
5837
|
+
}
|
|
5838
|
+
const dstIdx = (y * rw + x) * 4;
|
|
5839
|
+
temp[dstIdx] = Math.round(rSum / count);
|
|
5840
|
+
temp[dstIdx + 1] = Math.round(gSum / count);
|
|
5841
|
+
temp[dstIdx + 2] = Math.round(bSum / count);
|
|
5842
|
+
temp[dstIdx + 3] = Math.round(aSum / count);
|
|
5843
|
+
}
|
|
5844
|
+
}
|
|
5845
|
+
for (let y = 0; y < rh; y++) {
|
|
5846
|
+
const dstY = y0 + y;
|
|
5847
|
+
for (let x = 0; x < rw; x++) {
|
|
5848
|
+
let rSum = 0;
|
|
5849
|
+
let gSum = 0;
|
|
5850
|
+
let bSum = 0;
|
|
5851
|
+
let aSum = 0;
|
|
5852
|
+
let count = 0;
|
|
5853
|
+
const kStart = Math.max(0, y - rad);
|
|
5854
|
+
const kEnd = Math.min(rh - 1, y + rad);
|
|
5855
|
+
for (let ky = kStart; ky <= kEnd; ky++) {
|
|
5856
|
+
const srcIdx = (ky * rw + x) * 4;
|
|
5857
|
+
rSum += temp[srcIdx];
|
|
5858
|
+
gSum += temp[srcIdx + 1];
|
|
5859
|
+
bSum += temp[srcIdx + 2];
|
|
5860
|
+
aSum += temp[srcIdx + 3];
|
|
5861
|
+
count++;
|
|
5862
|
+
}
|
|
5863
|
+
const dstIdx = (dstY * width + (x0 + x)) * 4;
|
|
5864
|
+
data[dstIdx] = Math.round(rSum / count);
|
|
5865
|
+
data[dstIdx + 1] = Math.round(gSum / count);
|
|
5866
|
+
data[dstIdx + 2] = Math.round(bSum / count);
|
|
5867
|
+
data[dstIdx + 3] = Math.round(aSum / count);
|
|
5868
|
+
}
|
|
5869
|
+
}
|
|
5870
|
+
}
|
|
5871
|
+
return imageData;
|
|
5872
|
+
}
|
|
5736
5873
|
export {
|
|
5737
5874
|
ADJUSTMENT_KINDS,
|
|
5738
5875
|
ADJUSTMENT_LAYER_CONTROLS,
|
|
@@ -5783,6 +5920,8 @@ export {
|
|
|
5783
5920
|
applyLegacyAdjustments,
|
|
5784
5921
|
applyMatrix3,
|
|
5785
5922
|
applyProcess2Adjustments,
|
|
5923
|
+
applyRegionBlur,
|
|
5924
|
+
applyRegionMosaic,
|
|
5786
5925
|
blackWhiteGray,
|
|
5787
5926
|
blendChannel,
|
|
5788
5927
|
blendImageData,
|
|
@@ -5912,6 +6051,7 @@ export {
|
|
|
5912
6051
|
removeAlpha,
|
|
5913
6052
|
removeCurvePoint,
|
|
5914
6053
|
resizeSelection,
|
|
6054
|
+
resolveMosaicRegionBounds,
|
|
5915
6055
|
rgbToGray,
|
|
5916
6056
|
rgbToHsl,
|
|
5917
6057
|
sampleLut,
|