@pixerate/editor 0.208.0 → 0.210.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 (30) hide show
  1. package/dist/{chunk-X4LUGTQX.cjs → chunk-L52VMQZS.cjs} +21 -10
  2. package/dist/{chunk-DWYQPL2A.js → chunk-LQ5SALHK.js} +13 -2
  3. package/dist/chunk-MQDIP4CF.cjs +462 -0
  4. package/dist/chunk-XI2NV5U7.js +462 -0
  5. package/dist/{chunk-3EHPLDFQ.cjs → chunk-YF3YZZ6G.cjs} +16 -453
  6. package/dist/{chunk-USQCKRZG.js → chunk-ZGJGSCUW.js} +8 -445
  7. package/dist/image-editor/content-aware-fill-session.d.cts +109 -0
  8. package/dist/image-editor/content-aware-fill-session.d.ts +109 -0
  9. package/dist/image-editor/controller.d.cts +85 -3
  10. package/dist/image-editor/controller.d.ts +85 -3
  11. package/dist/image-editor/index.cjs +847 -396
  12. package/dist/image-editor/index.d.cts +1 -0
  13. package/dist/image-editor/index.d.ts +1 -0
  14. package/dist/image-editor/index.js +492 -41
  15. package/dist/image-editor/selection/tool-options.d.cts +3 -1
  16. package/dist/image-editor/selection/tool-options.d.ts +3 -1
  17. package/dist/image-editor/selection/worker.d.cts +10 -0
  18. package/dist/image-editor/selection/worker.d.ts +10 -0
  19. package/dist/image-editor/selection-worker.cjs +4 -3
  20. package/dist/image-editor/selection-worker.js +2 -1
  21. package/dist/image-editor/types.d.cts +14 -0
  22. package/dist/image-editor/types.d.ts +14 -0
  23. package/dist/paint/heal.d.cts +3 -1
  24. package/dist/paint/heal.d.ts +3 -1
  25. package/dist/paint/index.cjs +4 -2
  26. package/dist/paint/index.js +10 -8
  27. package/package.json +1 -1
  28. package/skills/pixerate-image-editor/SKILL.md +21 -23
  29. package/skills/pixerate-image-editor/references/layer-effects.md +24 -0
  30. package/skills/pixerate-image-selection-masking/SKILL.md +2 -1
@@ -81,8 +81,10 @@ export interface RefineEdgeControl {
81
81
  export declare const REFINE_EDGE_CONTROLS: readonly RefineEdgeControl[];
82
82
  /** Select and Mask's outputs, in menu order. */
83
83
  export declare const REFINE_OUTPUTS: readonly {
84
- id: 'selection' | 'layer-mask' | 'new-layer' | 'new-layer-with-mask';
84
+ id: 'selection' | 'layer-mask' | 'new-layer' | 'new-layer-with-mask' | 'new-document' | 'new-document-with-mask';
85
85
  label: string;
86
+ /** Needs a host that can open documents (`controller.canOpenDocuments`). */
87
+ needsDocuments?: boolean;
86
88
  }[];
87
89
  /** A one-line status: "No selection" or "W × H px selected (n % of the image)". */
88
90
  export declare function describeSelection(mask: SelectionMask | null | undefined): string;
@@ -81,8 +81,10 @@ export interface RefineEdgeControl {
81
81
  export declare const REFINE_EDGE_CONTROLS: readonly RefineEdgeControl[];
82
82
  /** Select and Mask's outputs, in menu order. */
83
83
  export declare const REFINE_OUTPUTS: readonly {
84
- id: 'selection' | 'layer-mask' | 'new-layer' | 'new-layer-with-mask';
84
+ id: 'selection' | 'layer-mask' | 'new-layer' | 'new-layer-with-mask' | 'new-document' | 'new-document-with-mask';
85
85
  label: string;
86
+ /** Needs a host that can open documents (`controller.canOpenDocuments`). */
87
+ needsDocuments?: boolean;
86
88
  }[];
87
89
  /** A one-line status: "No selection" or "W × H px selected (n % of the image)". */
88
90
  export declare function describeSelection(mask: SelectionMask | null | undefined): string;
@@ -52,6 +52,13 @@ export type SelectionJob = {
52
52
  base: SerializedMask | null;
53
53
  edits: RefineEdit[];
54
54
  params: RefineEdgeParams;
55
+ }
56
+ /** Content-Aware Fill's synthesis on a window (the pixels): `hole` to fill, `exclude` not to copy from. */
57
+ | {
58
+ op: 'fill';
59
+ hole: Uint8Array;
60
+ exclude: Uint8Array | null;
61
+ seed: number;
55
62
  };
56
63
  /** What a job found: a selection of the whole image, and the job's notes. */
57
64
  export interface SelectionJobResult {
@@ -60,6 +67,8 @@ export interface SelectionJobResult {
60
67
  reason?: string;
61
68
  /** Focus Area: the noise level it measured. */
62
69
  noiseLevel?: number;
70
+ /** Content-Aware Fill: the window's pixels with the hole filled (RGBA). */
71
+ pixels?: Uint8ClampedArray;
63
72
  }
64
73
  /** Runs `job` on `pixels` here and now. */
65
74
  export declare function runSelectionJob(job: SelectionJob, pixels: PixelBuffer, onProgress?: SelectionProgress): SelectionJobResult;
@@ -86,6 +95,7 @@ export type SelectionWorkerResponse = {
86
95
  mask: SerializedMask;
87
96
  reason?: string;
88
97
  noiseLevel?: number;
98
+ pixels?: Uint8ClampedArray;
89
99
  } | {
90
100
  type: 'error';
91
101
  id: number;
@@ -52,6 +52,13 @@ export type SelectionJob = {
52
52
  base: SerializedMask | null;
53
53
  edits: RefineEdit[];
54
54
  params: RefineEdgeParams;
55
+ }
56
+ /** Content-Aware Fill's synthesis on a window (the pixels): `hole` to fill, `exclude` not to copy from. */
57
+ | {
58
+ op: 'fill';
59
+ hole: Uint8Array;
60
+ exclude: Uint8Array | null;
61
+ seed: number;
55
62
  };
56
63
  /** What a job found: a selection of the whole image, and the job's notes. */
57
64
  export interface SelectionJobResult {
@@ -60,6 +67,8 @@ export interface SelectionJobResult {
60
67
  reason?: string;
61
68
  /** Focus Area: the noise level it measured. */
62
69
  noiseLevel?: number;
70
+ /** Content-Aware Fill: the window's pixels with the hole filled (RGBA). */
71
+ pixels?: Uint8ClampedArray;
63
72
  }
64
73
  /** Runs `job` on `pixels` here and now. */
65
74
  export declare function runSelectionJob(job: SelectionJob, pixels: PixelBuffer, onProgress?: SelectionProgress): SelectionJobResult;
@@ -86,6 +95,7 @@ export type SelectionWorkerResponse = {
86
95
  mask: SerializedMask;
87
96
  reason?: string;
88
97
  noiseLevel?: number;
98
+ pixels?: Uint8ClampedArray;
89
99
  } | {
90
100
  type: 'error';
91
101
  id: number;
@@ -1,14 +1,15 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
2
 
3
- var _chunkX4LUGTQXcjs = require('../chunk-X4LUGTQX.cjs');
3
+ var _chunkL52VMQZScjs = require('../chunk-L52VMQZS.cjs');
4
4
  require('../chunk-QYLWG22N.cjs');
5
5
  require('../chunk-K6PXS6DO.cjs');
6
+ require('../chunk-MQDIP4CF.cjs');
6
7
  require('../chunk-474IQG74.cjs');
7
8
 
8
9
  // src/image-editor/selection-worker.ts
9
10
  if (typeof self !== "undefined" && typeof window === "undefined" && typeof self.postMessage === "function") {
10
- _chunkX4LUGTQXcjs.startSelectionWorker.call(void 0, self);
11
+ _chunkL52VMQZScjs.startSelectionWorker.call(void 0, self);
11
12
  }
12
13
 
13
14
 
14
- exports.startSelectionWorker = _chunkX4LUGTQXcjs.startSelectionWorker;
15
+ exports.startSelectionWorker = _chunkL52VMQZScjs.startSelectionWorker;
@@ -1,8 +1,9 @@
1
1
  import {
2
2
  startSelectionWorker
3
- } from "../chunk-DWYQPL2A.js";
3
+ } from "../chunk-LQ5SALHK.js";
4
4
  import "../chunk-L3G23N5Y.js";
5
5
  import "../chunk-ZIF4UJJ6.js";
6
+ import "../chunk-XI2NV5U7.js";
6
7
  import "../chunk-HVVR5PZW.js";
7
8
 
8
9
  // src/image-editor/selection-worker.ts
@@ -456,7 +456,21 @@ export interface ImageEditorOptions {
456
456
  * Without one they run on the page. Change it later with `setSelectionWorker`.
457
457
  */
458
458
  selectionWorker?: SelectionWorkerFactory | null;
459
+ /**
460
+ * Opens a new image document the editor made (Select and Mask's New Document outputs) the way
461
+ * the host shows documents: a tab, a window, a file. Without it those outputs are unavailable.
462
+ * Change it later with `setDocumentOpener`.
463
+ */
464
+ openDocument?: DocumentOpener | null;
459
465
  }
466
+ /**
467
+ * Opens a new image document for the host: `document` loads with `loadJSON`; `info.name` is a
468
+ * suggested name. May return the new document's id (handed back to the caller and to agents).
469
+ */
470
+ export type DocumentOpener = (document: SerializedImageEditorState, info: {
471
+ name: string;
472
+ from: 'select-and-mask';
473
+ }) => string | void | Promise<string | void>;
460
474
  export interface InpaintOptions {
461
475
  prompt: string;
462
476
  imageDataUrl: string;
@@ -456,7 +456,21 @@ export interface ImageEditorOptions {
456
456
  * Without one they run on the page. Change it later with `setSelectionWorker`.
457
457
  */
458
458
  selectionWorker?: SelectionWorkerFactory | null;
459
+ /**
460
+ * Opens a new image document the editor made (Select and Mask's New Document outputs) the way
461
+ * the host shows documents: a tab, a window, a file. Without it those outputs are unavailable.
462
+ * Change it later with `setDocumentOpener`.
463
+ */
464
+ openDocument?: DocumentOpener | null;
459
465
  }
466
+ /**
467
+ * Opens a new image document for the host: `document` loads with `loadJSON`; `info.name` is a
468
+ * suggested name. May return the new document's id (handed back to the caller and to agents).
469
+ */
470
+ export type DocumentOpener = (document: SerializedImageEditorState, info: {
471
+ name: string;
472
+ from: 'select-and-mask';
473
+ }) => string | void | Promise<string | void>;
460
474
  export interface InpaintOptions {
461
475
  prompt: string;
462
476
  imageDataUrl: string;
@@ -29,9 +29,11 @@ export declare function bestOffset(w: number, h: number, ch: number, img: ArrayL
29
29
  * continue across it: PatchMatch nearest-neighbour fields over 7 × 7 patches with patch voting
30
30
  * (Wexler et al. / Barnes et al.), run coarse to fine from a smooth fill. Deterministic for the
31
31
  * same input. Returns the filled image; pixels outside `hole` are unchanged. Falls back to a
32
- * smooth fill when there is no whole patch to copy from.
32
+ * smooth fill when there is no whole patch to copy from. `exclude` marks pixels no source patch
33
+ * may include (Content-Aware Fill's sampling area is everything else).
33
34
  */
34
35
  export declare function contentAwareFill(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>, options?: {
35
36
  iterations?: number;
36
37
  seed?: number;
38
+ exclude?: ArrayLike<boolean | number> | null;
37
39
  }): Float32Array;
@@ -29,9 +29,11 @@ export declare function bestOffset(w: number, h: number, ch: number, img: ArrayL
29
29
  * continue across it: PatchMatch nearest-neighbour fields over 7 × 7 patches with patch voting
30
30
  * (Wexler et al. / Barnes et al.), run coarse to fine from a smooth fill. Deterministic for the
31
31
  * same input. Returns the filled image; pixels outside `hole` are unchanged. Falls back to a
32
- * smooth fill when there is no whole patch to copy from.
32
+ * smooth fill when there is no whole patch to copy from. `exclude` marks pixels no source patch
33
+ * may include (Content-Aware Fill's sampling area is everything else).
33
34
  */
34
35
  export declare function contentAwareFill(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>, options?: {
35
36
  iterations?: number;
36
37
  seed?: number;
38
+ exclude?: ArrayLike<boolean | number> | null;
37
39
  }): Float32Array;
@@ -29,6 +29,7 @@
29
29
 
30
30
 
31
31
 
32
+ var _chunkYF3YZZ6Gcjs = require('../chunk-YF3YZZ6G.cjs');
32
33
 
33
34
 
34
35
 
@@ -36,7 +37,8 @@
36
37
 
37
38
 
38
39
 
39
- var _chunk3EHPLDFQcjs = require('../chunk-3EHPLDFQ.cjs');
40
+
41
+ var _chunkMQDIP4CFcjs = require('../chunk-MQDIP4CF.cjs');
40
42
 
41
43
 
42
44
 
@@ -481,4 +483,4 @@ require('../chunk-XFM3OCHU.cjs');
481
483
 
482
484
 
483
485
 
484
- exports.BODY_SCATTER = _chunkKWNMBMKGcjs.BODY_SCATTER; exports.BRUSHSTROKE_MAX_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MAX_SCALE; exports.BRUSHSTROKE_MIN_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MIN_SCALE; exports.BrushstrokeCache = _chunkPQ3H2AANcjs.BrushstrokeCache; exports.CoverageMap = _chunkPQ3H2AANcjs.CoverageMap; exports.DEFAULT_BLENDER = _chunkPQ3H2AANcjs.DEFAULT_BLENDER; exports.DEFAULT_BRUSH = _chunkPQ3H2AANcjs.DEFAULT_BRUSH; exports.DEFAULT_FLOW = _chunkKWNMBMKGcjs.DEFAULT_FLOW; exports.DEFAULT_MIXER = _chunkPQ3H2AANcjs.DEFAULT_MIXER; exports.DEFAULT_PAINT_GRADIENT = _chunkPQ3H2AANcjs.DEFAULT_PAINT_GRADIENT; exports.DEFAULT_PAINT_GRADIENT_MAPPING = _chunkPQ3H2AANcjs.DEFAULT_PAINT_GRADIENT_MAPPING; exports.DEFAULT_RETOUCH = _chunk3EHPLDFQcjs.DEFAULT_RETOUCH; exports.DEFAULT_SMUDGE = _chunkPQ3H2AANcjs.DEFAULT_SMUDGE; exports.DEFAULT_WET_PAPER = _chunkKWNMBMKGcjs.DEFAULT_WET_PAPER; exports.DEFAULT_WET_PARAMS = _chunkKWNMBMKGcjs.DEFAULT_WET_PARAMS; exports.DRY_EPS = _chunkKWNMBMKGcjs.DRY_EPS; exports.DabWalker = _chunkPQ3H2AANcjs.DabWalker; exports.EMPTY_MIXER_LOAD = _chunkPQ3H2AANcjs.EMPTY_MIXER_LOAD; exports.EX = _chunkKWNMBMKGcjs.EX; exports.EY = _chunkKWNMBMKGcjs.EY; exports.FLAG_ALIVE = _chunkKWNMBMKGcjs.FLAG_ALIVE; exports.FLAG_BOTTOM = _chunkKWNMBMKGcjs.FLAG_BOTTOM; exports.FLAG_LEFT = _chunkKWNMBMKGcjs.FLAG_LEFT; exports.FLAG_RIGHT = _chunkKWNMBMKGcjs.FLAG_RIGHT; exports.FLAG_TOP = _chunkKWNMBMKGcjs.FLAG_TOP; exports.FLAG_WET = _chunkKWNMBMKGcjs.FLAG_WET; exports.FLAT = _chunkKWNMBMKGcjs.FLAT; exports.FREE_INTERVAL = _chunkKWNMBMKGcjs.FREE_INTERVAL; exports.GRAIN_PATTERNS = _chunkPQ3H2AANcjs.GRAIN_PATTERNS; exports.GRAIN_TILE = _chunkPQ3H2AANcjs.GRAIN_TILE; exports.HIDE = _chunkKWNMBMKGcjs.HIDE; exports.IDENTITY_CLONE_TRANSFORM = _chunk3EHPLDFQcjs.IDENTITY_CLONE_TRANSFORM; exports.MAX_BATCH = _chunkKWNMBMKGcjs.MAX_BATCH; exports.MAX_BRUSH_SIZE = _chunkPQ3H2AANcjs.MAX_BRUSH_SIZE; exports.MAX_TILT_ACCEL = _chunkKWNMBMKGcjs.MAX_TILT_ACCEL; exports.MAX_WET_LANES = _chunkKWNMBMKGcjs.MAX_WET_LANES; exports.MAX_WET_SLOTS = _chunkKWNMBMKGcjs.MAX_WET_SLOTS; exports.MIXER_DRAIN = _chunkPQ3H2AANcjs.MIXER_DRAIN; exports.MIXER_PICKUP_RATE = _chunkPQ3H2AANcjs.MIXER_PICKUP_RATE; exports.MIXING_MODELS = _chunkPQ3H2AANcjs.MIXING_MODELS; exports.MixerStroke = _chunkPQ3H2AANcjs.MixerStroke; exports.OPP = _chunkKWNMBMKGcjs.OPP; exports.PAINT_COLOR_JSON_SCHEMA = _chunkPQ3H2AANcjs.PAINT_COLOR_JSON_SCHEMA; exports.PAINT_GRADIENT_FULL_SPEED = _chunkPQ3H2AANcjs.PAINT_GRADIENT_FULL_SPEED; exports.PAINT_GRADIENT_JSON_SCHEMA = _chunkPQ3H2AANcjs.PAINT_GRADIENT_JSON_SCHEMA; exports.PAINT_GRADIENT_KIT = _chunkPQ3H2AANcjs.PAINT_GRADIENT_KIT; exports.PAINT_GRADIENT_MAPPINGS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_MAPPINGS; exports.PAINT_GRADIENT_MAPPING_LABELS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_MAPPING_LABELS; exports.PAINT_GRADIENT_PRESETS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_PRESETS; exports.PAINT_GRADIENT_REPEATS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_REPEATS; exports.PAINT_GRADIENT_REPEAT_LABELS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_REPEAT_LABELS; exports.PAINT_GRADIENT_SPACES = _chunkPQ3H2AANcjs.PAINT_GRADIENT_SPACES; exports.PAINT_GRADIENT_SPACE_LABELS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_SPACE_LABELS; exports.PAINT_SOURCE_JSON_SCHEMA = _chunkPQ3H2AANcjs.PAINT_SOURCE_JSON_SCHEMA; exports.PAPER_CAPACITY = _chunkKWNMBMKGcjs.PAPER_CAPACITY; exports.PARAM = _chunkKWNMBMKGcjs.PARAM; exports.PARAM_FLOATS = _chunkKWNMBMKGcjs.PARAM_FLOATS; exports.PIGMENT_BANDS = _chunkOLNIPTB3cjs.PIGMENT_BANDS; exports.PIGMENT_CHANNELS = _chunkKWNMBMKGcjs.PIGMENT_CHANNELS; exports.PIGMENT_LAMBDA_MIN = _chunkOLNIPTB3cjs.PIGMENT_LAMBDA_MIN; exports.PIGMENT_LAMBDA_STEP = _chunkOLNIPTB3cjs.PIGMENT_LAMBDA_STEP; exports.PIGMENT_UNIT = _chunkKWNMBMKGcjs.PIGMENT_UNIT; exports.PIGMENT_WAVELENGTHS = _chunkOLNIPTB3cjs.PIGMENT_WAVELENGTHS; exports.PLANE = _chunkKWNMBMKGcjs.PLANE; exports.PLANE_BYTES = _chunkKWNMBMKGcjs.PLANE_BYTES; exports.P_D0 = _chunkKWNMBMKGcjs.P_D0; exports.P_EDGE = _chunkKWNMBMKGcjs.P_EDGE; exports.P_FX = _chunkKWNMBMKGcjs.P_FX; exports.P_FY = _chunkKWNMBMKGcjs.P_FY; exports.P_H = _chunkKWNMBMKGcjs.P_H; exports.P_P0 = _chunkKWNMBMKGcjs.P_P0; exports.P_RHO = _chunkKWNMBMKGcjs.P_RHO; exports.P_SW = _chunkKWNMBMKGcjs.P_SW; exports.P_UX = _chunkKWNMBMKGcjs.P_UX; exports.P_UY = _chunkKWNMBMKGcjs.P_UY; exports.PaintExchange = _chunkPQ3H2AANcjs.PaintExchange; exports.PaintGradientSampler = _chunkPQ3H2AANcjs.PaintGradientSampler; exports.PaintSourceError = _chunkPQ3H2AANcjs.PaintSourceError; exports.PaperGrain = _chunkPQ3H2AANcjs.PaperGrain; exports.RETOUCH_SAMPLES = _chunk3EHPLDFQcjs.RETOUCH_SAMPLES; exports.RegionPixelSource = _chunk3EHPLDFQcjs.RegionPixelSource; exports.RetouchDabStroke = _chunk3EHPLDFQcjs.RetouchDabStroke; exports.SET_PLANES = _chunkKWNMBMKGcjs.SET_PLANES; exports.SLOT_BYTES = _chunkKWNMBMKGcjs.SLOT_BYTES; exports.SLOT_PLANES = _chunkKWNMBMKGcjs.SLOT_PLANES; exports.SLOT_SIDE = _chunkKWNMBMKGcjs.SLOT_SIDE; exports.SPOT_HEAL_TYPES = _chunk3EHPLDFQcjs.SPOT_HEAL_TYPES; exports.SRGB_TO_LINEAR = _chunkKWNMBMKGcjs.SRGB_TO_LINEAR; exports.STRIP = _chunkKWNMBMKGcjs.STRIP; exports.SmudgeTip = _chunkPQ3H2AANcjs.SmudgeTip; exports.StrokeCoverage = _chunkPQ3H2AANcjs.StrokeCoverage; exports.TIP_GRADIENT_STEPS = _chunkPQ3H2AANcjs.TIP_GRADIENT_STEPS; exports.TONE_RANGES = _chunk3EHPLDFQcjs.TONE_RANGES; exports.TileMedium = _chunkPQ3H2AANcjs.TileMedium; exports.TilePixelSource = _chunk3EHPLDFQcjs.TilePixelSource; exports.TileableNoise = _chunkPQ3H2AANcjs.TileableNoise; exports.TransformedPixelSource = _chunk3EHPLDFQcjs.TransformedPixelSource; exports.U_MAX = _chunkKWNMBMKGcjs.U_MAX; exports.W9 = _chunkKWNMBMKGcjs.W9; exports.WET_FLOW_KINDS = _chunkKWNMBMKGcjs.WET_FLOW_KINDS; exports.WET_PARAM_KEYS = _chunkKWNMBMKGcjs.WET_PARAM_KEYS; exports.WET_TILE = _chunkKWNMBMKGcjs.WET_TILE; exports.WGSL_HALO = _chunkKWNMBMKGcjs.WGSL_HALO; exports.WGSL_SHADE = _chunkKWNMBMKGcjs.WGSL_SHADE; exports.WGSL_STEP = _chunkKWNMBMKGcjs.WGSL_STEP; exports.WetGpuEngine = _chunkKWNMBMKGcjs.WetGpuEngine; exports.WetMedium = _chunkKWNMBMKGcjs.WetMedium; exports.WetWorkerPool = _chunkKWNMBMKGcjs.WetWorkerPool; exports.WetWorld = _chunkKWNMBMKGcjs.WetWorld; exports.WetWorldError = _chunkKWNMBMKGcjs.WetWorldError; exports.addPaintGradientStop = _chunkPQ3H2AANcjs.addPaintGradientStop; exports.applyRetouchToTile = _chunk3EHPLDFQcjs.applyRetouchToTile; exports.applyStrokeToDeepTile = _chunkPQ3H2AANcjs.applyStrokeToDeepTile; exports.applyStrokeToTile = _chunkPQ3H2AANcjs.applyStrokeToTile; exports.applyToneToDeepTile = _chunk3EHPLDFQcjs.applyToneToDeepTile; exports.bestOffset = _chunk3EHPLDFQcjs.bestOffset; exports.blendRadius = _chunkPQ3H2AANcjs.blendRadius; exports.blenderDab = _chunkPQ3H2AANcjs.blenderDab; exports.boxBlurPixels = _chunk3EHPLDFQcjs.boxBlurPixels; exports.brushstrokeDataUrl = _chunkPQ3H2AANcjs.brushstrokeDataUrl; exports.brushstrokeKey = _chunkPQ3H2AANcjs.brushstrokeKey; exports.brushstrokeSamples = _chunkPQ3H2AANcjs.brushstrokeSamples; exports.brushstrokeScaleBucket = _chunkYQGCPL5Xcjs.brushstrokeScaleBucket; exports.brushstrokeStrokeOptions = _chunkPQ3H2AANcjs.brushstrokeStrokeOptions; exports.brushstrokeToCanvas = _chunkPQ3H2AANcjs.brushstrokeToCanvas; exports.canShareMemory = _chunkKWNMBMKGcjs.canShareMemory; exports.cleanMixer = _chunkPQ3H2AANcjs.cleanMixer; exports.cloneSamplePoint = _chunk3EHPLDFQcjs.cloneSamplePoint; exports.contentAwareFill = _chunk3EHPLDFQcjs.contentAwareFill; exports.coverageTileCoord = _chunkPQ3H2AANcjs.coverageTileCoord; exports.createBlenderScratch = _chunkPQ3H2AANcjs.createBlenderScratch; exports.createPigment = _chunkOLNIPTB3cjs.createPigment; exports.createPigmentTools = _chunkKWNMBMKGcjs.createPigmentTools; exports.createWetGpuEngine = _chunkKWNMBMKGcjs.createWetGpuEngine; exports.dabCoverage = _chunkPQ3H2AANcjs.dabCoverage; exports.dabRect = _chunkPQ3H2AANcjs.dabRect; exports.dexp = _chunkKWNMBMKGcjs.dexp; exports.dilateMask = _chunk3EHPLDFQcjs.dilateMask; exports.dlog = _chunkKWNMBMKGcjs.dlog; exports.dodgeBurn = _chunk3EHPLDFQcjs.dodgeBurn; exports.dodgeBurnCurve = _chunk3EHPLDFQcjs.dodgeBurnCurve; exports.dpow = _chunkKWNMBMKGcjs.dpow; exports.dsincos = _chunkKWNMBMKGcjs.dsincos; exports.edgeBits = _chunkKWNMBMKGcjs.edgeBits; exports.exchangeRates = _chunkPQ3H2AANcjs.exchangeRates; exports.expNeg = _chunkKWNMBMKGcjs.expNeg; exports.filmPixel = _chunkKWNMBMKGcjs.filmPixel; exports.filmReflectance = _chunkKWNMBMKGcjs.filmReflectance; exports.findWebGpu = _chunkKWNMBMKGcjs.findWebGpu; exports.flowField = _chunkKWNMBMKGcjs.flowField; exports.gradientDabColor = _chunkPQ3H2AANcjs.gradientDabColor; exports.grainCatch = _chunkPQ3H2AANcjs.grainCatch; exports.grainHeights = _chunkPQ3H2AANcjs.grainHeights; exports.hash2 = _chunkPQ3H2AANcjs.hash2; exports.healPixels = _chunk3EHPLDFQcjs.healPixels; exports.hexToPaintRgb = _chunkPQ3H2AANcjs.hexToPaintRgb; exports.isBrushstrokeBrush = _chunkPQ3H2AANcjs.isBrushstrokeBrush; exports.isGradientPaint = _chunkPQ3H2AANcjs.isGradientPaint; exports.isIdentityCloneTransform = _chunk3EHPLDFQcjs.isIdentityCloneTransform; exports.latticeViscosity = _chunkKWNMBMKGcjs.latticeViscosity; exports.lerpPigment = _chunkOLNIPTB3cjs.lerpPigment; exports.lerpPigmentInto = _chunkOLNIPTB3cjs.lerpPigmentInto; exports.linearToSrgb8 = _chunkKWNMBMKGcjs.linearToSrgb8; exports.loadMixer = _chunkPQ3H2AANcjs.loadMixer; exports.loadWetKernel = _chunkKWNMBMKGcjs.loadWetKernel; exports.luma = _chunk3EHPLDFQcjs.luma; exports.maskBounds = _chunk3EHPLDFQcjs.maskBounds; exports.membraneFill = _chunk3EHPLDFQcjs.membraneFill; exports.mix32 = _chunkPQ3H2AANcjs.mix32; exports.mixPigments = _chunkOLNIPTB3cjs.mixPigments; exports.mixerRates = _chunkPQ3H2AANcjs.mixerRates; exports.normalizeBlender = _chunkPQ3H2AANcjs.normalizeBlender; exports.normalizeBrush = _chunkPQ3H2AANcjs.normalizeBrush; exports.normalizeFlow = _chunkKWNMBMKGcjs.normalizeFlow; exports.normalizeHexColor = _chunkPQ3H2AANcjs.normalizeHexColor; exports.normalizeMixer = _chunkPQ3H2AANcjs.normalizeMixer; exports.normalizeRetouch = _chunk3EHPLDFQcjs.normalizeRetouch; exports.normalizeSmudge = _chunkPQ3H2AANcjs.normalizeSmudge; exports.normalizeTilt = _chunkKWNMBMKGcjs.normalizeTilt; exports.normalizeWetParams = _chunkKWNMBMKGcjs.normalizeWetParams; exports.packWetParams = _chunkKWNMBMKGcjs.packWetParams; exports.paintGradientMappingFor = _chunkPQ3H2AANcjs.paintGradientMappingFor; exports.paintPathStroke = _chunkPQ3H2AANcjs.paintPathStroke; exports.paintSourceColor = _chunkPQ3H2AANcjs.paintSourceColor; exports.paintSourceCss = _chunkPQ3H2AANcjs.paintSourceCss; exports.parsePaintSource = _chunkPQ3H2AANcjs.parsePaintSource; exports.pathStrokeCoverage = _chunkPQ3H2AANcjs.pathStrokeCoverage; exports.pathStrokeDabs = _chunkPQ3H2AANcjs.pathStrokeDabs; exports.perDabStrength = _chunk3EHPLDFQcjs.perDabStrength; exports.pigmentColor = _chunkKWNMBMKGcjs.pigmentColor; exports.pigmentOf = _chunkKWNMBMKGcjs.pigmentOf; exports.pixelPigment = _chunkKWNMBMKGcjs.pixelPigment; exports.pointerPressure = _chunkKWNMBMKGcjs.pointerPressure; exports.pointerStrokeSample = _chunkKWNMBMKGcjs.pointerStrokeSample; exports.pointerStrokeSamples = _chunkKWNMBMKGcjs.pointerStrokeSamples; exports.put255 = _chunkPQ3H2AANcjs.put255; exports.rand01 = _chunkPQ3H2AANcjs.rand01; exports.randSigned = _chunkPQ3H2AANcjs.randSigned; exports.rasterizeDab = _chunkPQ3H2AANcjs.rasterizeDab; exports.readPaintSource = _chunkPQ3H2AANcjs.readPaintSource; exports.readSourceRegion = _chunk3EHPLDFQcjs.readSourceRegion; exports.reflectanceToRgb = _chunkOLNIPTB3cjs.reflectanceToRgb; exports.removePaintGradientStop = _chunkPQ3H2AANcjs.removePaintGradientStop; exports.renderBrushstroke = _chunkPQ3H2AANcjs.renderBrushstroke; exports.resolvePaintGradient = _chunkPQ3H2AANcjs.resolvePaintGradient; exports.retouchFilter = _chunk3EHPLDFQcjs.retouchFilter; exports.reversePaintGradient = _chunkPQ3H2AANcjs.reversePaintGradient; exports.rgbToReflectance = _chunkOLNIPTB3cjs.rgbToReflectance; exports.rgbaViewOfGrey = _chunk3EHPLDFQcjs.rgbaViewOfGrey; exports.saturationOf = _chunk3EHPLDFQcjs.saturationOf; exports.scalePaintGradient = _chunkPQ3H2AANcjs.scalePaintGradient; exports.seamlessClone = _chunk3EHPLDFQcjs.seamlessClone; exports.seedFromString = _chunkPQ3H2AANcjs.seedFromString; exports.setPigmentColor = _chunkOLNIPTB3cjs.setPigmentColor; exports.shadeTile = _chunkKWNMBMKGcjs.shadeTile; exports.smoothPoints = _chunkPQ3H2AANcjs.smoothPoints; exports.smudgeEffect = _chunk3EHPLDFQcjs.smudgeEffect; exports.solidPaint = _chunkPQ3H2AANcjs.solidPaint; exports.solveMembrane = _chunk3EHPLDFQcjs.solveMembrane; exports.sponge = _chunk3EHPLDFQcjs.sponge; exports.spongeEffect = _chunk3EHPLDFQcjs.spongeEffect; exports.spotHealPixels = _chunk3EHPLDFQcjs.spotHealPixels; exports.spotHealWindow = _chunk3EHPLDFQcjs.spotHealWindow; exports.srgbByteToLinear = _chunkKWNMBMKGcjs.srgbByteToLinear; exports.stepSlotTs = _chunkKWNMBMKGcjs.stepSlotTs; exports.strokeGrainCatch = _chunkPQ3H2AANcjs.strokeGrainCatch; exports.tipFalloff = _chunkPQ3H2AANcjs.tipFalloff; exports.tipReach = _chunkPQ3H2AANcjs.tipReach; exports.tipShape = _chunkPQ3H2AANcjs.tipShape; exports.toneOf = _chunk3EHPLDFQcjs.toneOf; exports.updatePaintGradientStop = _chunkPQ3H2AANcjs.updatePaintGradientStop; exports.walkDabs = _chunkPQ3H2AANcjs.walkDabs; exports.wetGpuSupport = _chunkKWNMBMKGcjs.wetGpuSupport; exports.wetSimdSupported = _chunkKWNMBMKGcjs.wetSimdSupported; exports.wetSupport = _chunkKWNMBMKGcjs.wetSupport;
486
+ exports.BODY_SCATTER = _chunkKWNMBMKGcjs.BODY_SCATTER; exports.BRUSHSTROKE_MAX_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MAX_SCALE; exports.BRUSHSTROKE_MIN_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MIN_SCALE; exports.BrushstrokeCache = _chunkPQ3H2AANcjs.BrushstrokeCache; exports.CoverageMap = _chunkPQ3H2AANcjs.CoverageMap; exports.DEFAULT_BLENDER = _chunkPQ3H2AANcjs.DEFAULT_BLENDER; exports.DEFAULT_BRUSH = _chunkPQ3H2AANcjs.DEFAULT_BRUSH; exports.DEFAULT_FLOW = _chunkKWNMBMKGcjs.DEFAULT_FLOW; exports.DEFAULT_MIXER = _chunkPQ3H2AANcjs.DEFAULT_MIXER; exports.DEFAULT_PAINT_GRADIENT = _chunkPQ3H2AANcjs.DEFAULT_PAINT_GRADIENT; exports.DEFAULT_PAINT_GRADIENT_MAPPING = _chunkPQ3H2AANcjs.DEFAULT_PAINT_GRADIENT_MAPPING; exports.DEFAULT_RETOUCH = _chunkYF3YZZ6Gcjs.DEFAULT_RETOUCH; exports.DEFAULT_SMUDGE = _chunkPQ3H2AANcjs.DEFAULT_SMUDGE; exports.DEFAULT_WET_PAPER = _chunkKWNMBMKGcjs.DEFAULT_WET_PAPER; exports.DEFAULT_WET_PARAMS = _chunkKWNMBMKGcjs.DEFAULT_WET_PARAMS; exports.DRY_EPS = _chunkKWNMBMKGcjs.DRY_EPS; exports.DabWalker = _chunkPQ3H2AANcjs.DabWalker; exports.EMPTY_MIXER_LOAD = _chunkPQ3H2AANcjs.EMPTY_MIXER_LOAD; exports.EX = _chunkKWNMBMKGcjs.EX; exports.EY = _chunkKWNMBMKGcjs.EY; exports.FLAG_ALIVE = _chunkKWNMBMKGcjs.FLAG_ALIVE; exports.FLAG_BOTTOM = _chunkKWNMBMKGcjs.FLAG_BOTTOM; exports.FLAG_LEFT = _chunkKWNMBMKGcjs.FLAG_LEFT; exports.FLAG_RIGHT = _chunkKWNMBMKGcjs.FLAG_RIGHT; exports.FLAG_TOP = _chunkKWNMBMKGcjs.FLAG_TOP; exports.FLAG_WET = _chunkKWNMBMKGcjs.FLAG_WET; exports.FLAT = _chunkKWNMBMKGcjs.FLAT; exports.FREE_INTERVAL = _chunkKWNMBMKGcjs.FREE_INTERVAL; exports.GRAIN_PATTERNS = _chunkPQ3H2AANcjs.GRAIN_PATTERNS; exports.GRAIN_TILE = _chunkPQ3H2AANcjs.GRAIN_TILE; exports.HIDE = _chunkKWNMBMKGcjs.HIDE; exports.IDENTITY_CLONE_TRANSFORM = _chunkYF3YZZ6Gcjs.IDENTITY_CLONE_TRANSFORM; exports.MAX_BATCH = _chunkKWNMBMKGcjs.MAX_BATCH; exports.MAX_BRUSH_SIZE = _chunkPQ3H2AANcjs.MAX_BRUSH_SIZE; exports.MAX_TILT_ACCEL = _chunkKWNMBMKGcjs.MAX_TILT_ACCEL; exports.MAX_WET_LANES = _chunkKWNMBMKGcjs.MAX_WET_LANES; exports.MAX_WET_SLOTS = _chunkKWNMBMKGcjs.MAX_WET_SLOTS; exports.MIXER_DRAIN = _chunkPQ3H2AANcjs.MIXER_DRAIN; exports.MIXER_PICKUP_RATE = _chunkPQ3H2AANcjs.MIXER_PICKUP_RATE; exports.MIXING_MODELS = _chunkPQ3H2AANcjs.MIXING_MODELS; exports.MixerStroke = _chunkPQ3H2AANcjs.MixerStroke; exports.OPP = _chunkKWNMBMKGcjs.OPP; exports.PAINT_COLOR_JSON_SCHEMA = _chunkPQ3H2AANcjs.PAINT_COLOR_JSON_SCHEMA; exports.PAINT_GRADIENT_FULL_SPEED = _chunkPQ3H2AANcjs.PAINT_GRADIENT_FULL_SPEED; exports.PAINT_GRADIENT_JSON_SCHEMA = _chunkPQ3H2AANcjs.PAINT_GRADIENT_JSON_SCHEMA; exports.PAINT_GRADIENT_KIT = _chunkPQ3H2AANcjs.PAINT_GRADIENT_KIT; exports.PAINT_GRADIENT_MAPPINGS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_MAPPINGS; exports.PAINT_GRADIENT_MAPPING_LABELS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_MAPPING_LABELS; exports.PAINT_GRADIENT_PRESETS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_PRESETS; exports.PAINT_GRADIENT_REPEATS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_REPEATS; exports.PAINT_GRADIENT_REPEAT_LABELS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_REPEAT_LABELS; exports.PAINT_GRADIENT_SPACES = _chunkPQ3H2AANcjs.PAINT_GRADIENT_SPACES; exports.PAINT_GRADIENT_SPACE_LABELS = _chunkPQ3H2AANcjs.PAINT_GRADIENT_SPACE_LABELS; exports.PAINT_SOURCE_JSON_SCHEMA = _chunkPQ3H2AANcjs.PAINT_SOURCE_JSON_SCHEMA; exports.PAPER_CAPACITY = _chunkKWNMBMKGcjs.PAPER_CAPACITY; exports.PARAM = _chunkKWNMBMKGcjs.PARAM; exports.PARAM_FLOATS = _chunkKWNMBMKGcjs.PARAM_FLOATS; exports.PIGMENT_BANDS = _chunkOLNIPTB3cjs.PIGMENT_BANDS; exports.PIGMENT_CHANNELS = _chunkKWNMBMKGcjs.PIGMENT_CHANNELS; exports.PIGMENT_LAMBDA_MIN = _chunkOLNIPTB3cjs.PIGMENT_LAMBDA_MIN; exports.PIGMENT_LAMBDA_STEP = _chunkOLNIPTB3cjs.PIGMENT_LAMBDA_STEP; exports.PIGMENT_UNIT = _chunkKWNMBMKGcjs.PIGMENT_UNIT; exports.PIGMENT_WAVELENGTHS = _chunkOLNIPTB3cjs.PIGMENT_WAVELENGTHS; exports.PLANE = _chunkKWNMBMKGcjs.PLANE; exports.PLANE_BYTES = _chunkKWNMBMKGcjs.PLANE_BYTES; exports.P_D0 = _chunkKWNMBMKGcjs.P_D0; exports.P_EDGE = _chunkKWNMBMKGcjs.P_EDGE; exports.P_FX = _chunkKWNMBMKGcjs.P_FX; exports.P_FY = _chunkKWNMBMKGcjs.P_FY; exports.P_H = _chunkKWNMBMKGcjs.P_H; exports.P_P0 = _chunkKWNMBMKGcjs.P_P0; exports.P_RHO = _chunkKWNMBMKGcjs.P_RHO; exports.P_SW = _chunkKWNMBMKGcjs.P_SW; exports.P_UX = _chunkKWNMBMKGcjs.P_UX; exports.P_UY = _chunkKWNMBMKGcjs.P_UY; exports.PaintExchange = _chunkPQ3H2AANcjs.PaintExchange; exports.PaintGradientSampler = _chunkPQ3H2AANcjs.PaintGradientSampler; exports.PaintSourceError = _chunkPQ3H2AANcjs.PaintSourceError; exports.PaperGrain = _chunkPQ3H2AANcjs.PaperGrain; exports.RETOUCH_SAMPLES = _chunkYF3YZZ6Gcjs.RETOUCH_SAMPLES; exports.RegionPixelSource = _chunkYF3YZZ6Gcjs.RegionPixelSource; exports.RetouchDabStroke = _chunkYF3YZZ6Gcjs.RetouchDabStroke; exports.SET_PLANES = _chunkKWNMBMKGcjs.SET_PLANES; exports.SLOT_BYTES = _chunkKWNMBMKGcjs.SLOT_BYTES; exports.SLOT_PLANES = _chunkKWNMBMKGcjs.SLOT_PLANES; exports.SLOT_SIDE = _chunkKWNMBMKGcjs.SLOT_SIDE; exports.SPOT_HEAL_TYPES = _chunkYF3YZZ6Gcjs.SPOT_HEAL_TYPES; exports.SRGB_TO_LINEAR = _chunkKWNMBMKGcjs.SRGB_TO_LINEAR; exports.STRIP = _chunkKWNMBMKGcjs.STRIP; exports.SmudgeTip = _chunkPQ3H2AANcjs.SmudgeTip; exports.StrokeCoverage = _chunkPQ3H2AANcjs.StrokeCoverage; exports.TIP_GRADIENT_STEPS = _chunkPQ3H2AANcjs.TIP_GRADIENT_STEPS; exports.TONE_RANGES = _chunkYF3YZZ6Gcjs.TONE_RANGES; exports.TileMedium = _chunkPQ3H2AANcjs.TileMedium; exports.TilePixelSource = _chunkYF3YZZ6Gcjs.TilePixelSource; exports.TileableNoise = _chunkPQ3H2AANcjs.TileableNoise; exports.TransformedPixelSource = _chunkYF3YZZ6Gcjs.TransformedPixelSource; exports.U_MAX = _chunkKWNMBMKGcjs.U_MAX; exports.W9 = _chunkKWNMBMKGcjs.W9; exports.WET_FLOW_KINDS = _chunkKWNMBMKGcjs.WET_FLOW_KINDS; exports.WET_PARAM_KEYS = _chunkKWNMBMKGcjs.WET_PARAM_KEYS; exports.WET_TILE = _chunkKWNMBMKGcjs.WET_TILE; exports.WGSL_HALO = _chunkKWNMBMKGcjs.WGSL_HALO; exports.WGSL_SHADE = _chunkKWNMBMKGcjs.WGSL_SHADE; exports.WGSL_STEP = _chunkKWNMBMKGcjs.WGSL_STEP; exports.WetGpuEngine = _chunkKWNMBMKGcjs.WetGpuEngine; exports.WetMedium = _chunkKWNMBMKGcjs.WetMedium; exports.WetWorkerPool = _chunkKWNMBMKGcjs.WetWorkerPool; exports.WetWorld = _chunkKWNMBMKGcjs.WetWorld; exports.WetWorldError = _chunkKWNMBMKGcjs.WetWorldError; exports.addPaintGradientStop = _chunkPQ3H2AANcjs.addPaintGradientStop; exports.applyRetouchToTile = _chunkYF3YZZ6Gcjs.applyRetouchToTile; exports.applyStrokeToDeepTile = _chunkPQ3H2AANcjs.applyStrokeToDeepTile; exports.applyStrokeToTile = _chunkPQ3H2AANcjs.applyStrokeToTile; exports.applyToneToDeepTile = _chunkYF3YZZ6Gcjs.applyToneToDeepTile; exports.bestOffset = _chunkMQDIP4CFcjs.bestOffset; exports.blendRadius = _chunkPQ3H2AANcjs.blendRadius; exports.blenderDab = _chunkPQ3H2AANcjs.blenderDab; exports.boxBlurPixels = _chunkYF3YZZ6Gcjs.boxBlurPixels; exports.brushstrokeDataUrl = _chunkPQ3H2AANcjs.brushstrokeDataUrl; exports.brushstrokeKey = _chunkPQ3H2AANcjs.brushstrokeKey; exports.brushstrokeSamples = _chunkPQ3H2AANcjs.brushstrokeSamples; exports.brushstrokeScaleBucket = _chunkYQGCPL5Xcjs.brushstrokeScaleBucket; exports.brushstrokeStrokeOptions = _chunkPQ3H2AANcjs.brushstrokeStrokeOptions; exports.brushstrokeToCanvas = _chunkPQ3H2AANcjs.brushstrokeToCanvas; exports.canShareMemory = _chunkKWNMBMKGcjs.canShareMemory; exports.cleanMixer = _chunkPQ3H2AANcjs.cleanMixer; exports.cloneSamplePoint = _chunkYF3YZZ6Gcjs.cloneSamplePoint; exports.contentAwareFill = _chunkMQDIP4CFcjs.contentAwareFill; exports.coverageTileCoord = _chunkPQ3H2AANcjs.coverageTileCoord; exports.createBlenderScratch = _chunkPQ3H2AANcjs.createBlenderScratch; exports.createPigment = _chunkOLNIPTB3cjs.createPigment; exports.createPigmentTools = _chunkKWNMBMKGcjs.createPigmentTools; exports.createWetGpuEngine = _chunkKWNMBMKGcjs.createWetGpuEngine; exports.dabCoverage = _chunkPQ3H2AANcjs.dabCoverage; exports.dabRect = _chunkPQ3H2AANcjs.dabRect; exports.dexp = _chunkKWNMBMKGcjs.dexp; exports.dilateMask = _chunkMQDIP4CFcjs.dilateMask; exports.dlog = _chunkKWNMBMKGcjs.dlog; exports.dodgeBurn = _chunkYF3YZZ6Gcjs.dodgeBurn; exports.dodgeBurnCurve = _chunkYF3YZZ6Gcjs.dodgeBurnCurve; exports.dpow = _chunkKWNMBMKGcjs.dpow; exports.dsincos = _chunkKWNMBMKGcjs.dsincos; exports.edgeBits = _chunkKWNMBMKGcjs.edgeBits; exports.exchangeRates = _chunkPQ3H2AANcjs.exchangeRates; exports.expNeg = _chunkKWNMBMKGcjs.expNeg; exports.filmPixel = _chunkKWNMBMKGcjs.filmPixel; exports.filmReflectance = _chunkKWNMBMKGcjs.filmReflectance; exports.findWebGpu = _chunkKWNMBMKGcjs.findWebGpu; exports.flowField = _chunkKWNMBMKGcjs.flowField; exports.gradientDabColor = _chunkPQ3H2AANcjs.gradientDabColor; exports.grainCatch = _chunkPQ3H2AANcjs.grainCatch; exports.grainHeights = _chunkPQ3H2AANcjs.grainHeights; exports.hash2 = _chunkPQ3H2AANcjs.hash2; exports.healPixels = _chunkYF3YZZ6Gcjs.healPixels; exports.hexToPaintRgb = _chunkPQ3H2AANcjs.hexToPaintRgb; exports.isBrushstrokeBrush = _chunkPQ3H2AANcjs.isBrushstrokeBrush; exports.isGradientPaint = _chunkPQ3H2AANcjs.isGradientPaint; exports.isIdentityCloneTransform = _chunkYF3YZZ6Gcjs.isIdentityCloneTransform; exports.latticeViscosity = _chunkKWNMBMKGcjs.latticeViscosity; exports.lerpPigment = _chunkOLNIPTB3cjs.lerpPigment; exports.lerpPigmentInto = _chunkOLNIPTB3cjs.lerpPigmentInto; exports.linearToSrgb8 = _chunkKWNMBMKGcjs.linearToSrgb8; exports.loadMixer = _chunkPQ3H2AANcjs.loadMixer; exports.loadWetKernel = _chunkKWNMBMKGcjs.loadWetKernel; exports.luma = _chunkYF3YZZ6Gcjs.luma; exports.maskBounds = _chunkMQDIP4CFcjs.maskBounds; exports.membraneFill = _chunkMQDIP4CFcjs.membraneFill; exports.mix32 = _chunkPQ3H2AANcjs.mix32; exports.mixPigments = _chunkOLNIPTB3cjs.mixPigments; exports.mixerRates = _chunkPQ3H2AANcjs.mixerRates; exports.normalizeBlender = _chunkPQ3H2AANcjs.normalizeBlender; exports.normalizeBrush = _chunkPQ3H2AANcjs.normalizeBrush; exports.normalizeFlow = _chunkKWNMBMKGcjs.normalizeFlow; exports.normalizeHexColor = _chunkPQ3H2AANcjs.normalizeHexColor; exports.normalizeMixer = _chunkPQ3H2AANcjs.normalizeMixer; exports.normalizeRetouch = _chunkYF3YZZ6Gcjs.normalizeRetouch; exports.normalizeSmudge = _chunkPQ3H2AANcjs.normalizeSmudge; exports.normalizeTilt = _chunkKWNMBMKGcjs.normalizeTilt; exports.normalizeWetParams = _chunkKWNMBMKGcjs.normalizeWetParams; exports.packWetParams = _chunkKWNMBMKGcjs.packWetParams; exports.paintGradientMappingFor = _chunkPQ3H2AANcjs.paintGradientMappingFor; exports.paintPathStroke = _chunkPQ3H2AANcjs.paintPathStroke; exports.paintSourceColor = _chunkPQ3H2AANcjs.paintSourceColor; exports.paintSourceCss = _chunkPQ3H2AANcjs.paintSourceCss; exports.parsePaintSource = _chunkPQ3H2AANcjs.parsePaintSource; exports.pathStrokeCoverage = _chunkPQ3H2AANcjs.pathStrokeCoverage; exports.pathStrokeDabs = _chunkPQ3H2AANcjs.pathStrokeDabs; exports.perDabStrength = _chunkYF3YZZ6Gcjs.perDabStrength; exports.pigmentColor = _chunkKWNMBMKGcjs.pigmentColor; exports.pigmentOf = _chunkKWNMBMKGcjs.pigmentOf; exports.pixelPigment = _chunkKWNMBMKGcjs.pixelPigment; exports.pointerPressure = _chunkKWNMBMKGcjs.pointerPressure; exports.pointerStrokeSample = _chunkKWNMBMKGcjs.pointerStrokeSample; exports.pointerStrokeSamples = _chunkKWNMBMKGcjs.pointerStrokeSamples; exports.put255 = _chunkPQ3H2AANcjs.put255; exports.rand01 = _chunkPQ3H2AANcjs.rand01; exports.randSigned = _chunkPQ3H2AANcjs.randSigned; exports.rasterizeDab = _chunkPQ3H2AANcjs.rasterizeDab; exports.readPaintSource = _chunkPQ3H2AANcjs.readPaintSource; exports.readSourceRegion = _chunkYF3YZZ6Gcjs.readSourceRegion; exports.reflectanceToRgb = _chunkOLNIPTB3cjs.reflectanceToRgb; exports.removePaintGradientStop = _chunkPQ3H2AANcjs.removePaintGradientStop; exports.renderBrushstroke = _chunkPQ3H2AANcjs.renderBrushstroke; exports.resolvePaintGradient = _chunkPQ3H2AANcjs.resolvePaintGradient; exports.retouchFilter = _chunkYF3YZZ6Gcjs.retouchFilter; exports.reversePaintGradient = _chunkPQ3H2AANcjs.reversePaintGradient; exports.rgbToReflectance = _chunkOLNIPTB3cjs.rgbToReflectance; exports.rgbaViewOfGrey = _chunkYF3YZZ6Gcjs.rgbaViewOfGrey; exports.saturationOf = _chunkYF3YZZ6Gcjs.saturationOf; exports.scalePaintGradient = _chunkPQ3H2AANcjs.scalePaintGradient; exports.seamlessClone = _chunkMQDIP4CFcjs.seamlessClone; exports.seedFromString = _chunkPQ3H2AANcjs.seedFromString; exports.setPigmentColor = _chunkOLNIPTB3cjs.setPigmentColor; exports.shadeTile = _chunkKWNMBMKGcjs.shadeTile; exports.smoothPoints = _chunkPQ3H2AANcjs.smoothPoints; exports.smudgeEffect = _chunkYF3YZZ6Gcjs.smudgeEffect; exports.solidPaint = _chunkPQ3H2AANcjs.solidPaint; exports.solveMembrane = _chunkMQDIP4CFcjs.solveMembrane; exports.sponge = _chunkYF3YZZ6Gcjs.sponge; exports.spongeEffect = _chunkYF3YZZ6Gcjs.spongeEffect; exports.spotHealPixels = _chunkYF3YZZ6Gcjs.spotHealPixels; exports.spotHealWindow = _chunkYF3YZZ6Gcjs.spotHealWindow; exports.srgbByteToLinear = _chunkKWNMBMKGcjs.srgbByteToLinear; exports.stepSlotTs = _chunkKWNMBMKGcjs.stepSlotTs; exports.strokeGrainCatch = _chunkPQ3H2AANcjs.strokeGrainCatch; exports.tipFalloff = _chunkPQ3H2AANcjs.tipFalloff; exports.tipReach = _chunkPQ3H2AANcjs.tipReach; exports.tipShape = _chunkPQ3H2AANcjs.tipShape; exports.toneOf = _chunkYF3YZZ6Gcjs.toneOf; exports.updatePaintGradientStop = _chunkPQ3H2AANcjs.updatePaintGradientStop; exports.walkDabs = _chunkPQ3H2AANcjs.walkDabs; exports.wetGpuSupport = _chunkKWNMBMKGcjs.wetGpuSupport; exports.wetSimdSupported = _chunkKWNMBMKGcjs.wetSimdSupported; exports.wetSupport = _chunkKWNMBMKGcjs.wetSupport;
@@ -10,33 +10,35 @@ import {
10
10
  TransformedPixelSource,
11
11
  applyRetouchToTile,
12
12
  applyToneToDeepTile,
13
- bestOffset,
14
13
  boxBlurPixels,
15
14
  cloneSamplePoint,
16
- contentAwareFill,
17
- dilateMask,
18
15
  dodgeBurn,
19
16
  dodgeBurnCurve,
20
17
  healPixels,
21
18
  isIdentityCloneTransform,
22
19
  luma,
23
- maskBounds,
24
- membraneFill,
25
20
  normalizeRetouch,
26
21
  perDabStrength,
27
22
  readSourceRegion,
28
23
  retouchFilter,
29
24
  rgbaViewOfGrey,
30
25
  saturationOf,
31
- seamlessClone,
32
26
  smudgeEffect,
33
- solveMembrane,
34
27
  sponge,
35
28
  spongeEffect,
36
29
  spotHealPixels,
37
30
  spotHealWindow,
38
31
  toneOf
39
- } from "../chunk-USQCKRZG.js";
32
+ } from "../chunk-ZGJGSCUW.js";
33
+ import {
34
+ bestOffset,
35
+ contentAwareFill,
36
+ dilateMask,
37
+ maskBounds,
38
+ membraneFill,
39
+ seamlessClone,
40
+ solveMembrane
41
+ } from "../chunk-XI2NV5U7.js";
40
42
  import {
41
43
  BODY_SCATTER,
42
44
  DEFAULT_FLOW,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor",
3
- "version": "0.208.0",
3
+ "version": "0.210.0",
4
4
  "description": "UI-agnostic rich text and media editing core library",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -96,25 +96,13 @@ drawing or editing either.
96
96
 
97
97
  ### Layer effects
98
98
 
99
- 1. **Effects are live and per layer**: drop and inner shadows, outer and inner glows,
100
- bevel & emboss, satin, colour / gradient / pattern overlays and strokes go on pixel,
101
- annotation and group layers (not adjustment layers) and follow the layer's pixels as they
102
- change. Add them with `add_layer_effect` (`kind` plus only the `settings` that differ from
103
- Photoshop's defaults), tune them with `update_layer_effect` and read them back with
104
- `list_layer_effects`. Each call is one undo step and returns the layer's effects. In the UI
105
- they are the **Layer Style** section of **Layer Properties**; the separate **Effects** panel is
106
- for provider effects (effect layers and filters), so say "layer style" when you tell the user
107
- where a drop shadow or stroke lives.
108
- 2. **Keep the ids**: `add_layer_effect` returns `effectId`; `update_layer_effect` and
109
- `remove_layer_effect` need it. `list_layers` shows which layers have effects (ids and kinds
110
- only).
111
- 3. **Light consistently**: shadows and bevels follow the document's global light while
112
- `useGlobalLight` is true (the default). Change the light for all of them with
113
- `set_global_light`; give one effect its own `angle` only when it must differ.
114
- 4. **Compare and size as a whole**: `set_layer_effects_enabled` with `enabled: false` hides
115
- every effect of a layer (each keeps its own `enabled`); `scale` resizes them all (Scale
116
- Effects), e.g. after resizing a layer's content.
117
- 5. **Look after each change**: `render_preview` (with `layerId` for one layer alone).
99
+ Live per-layer effects (shadows, glows, bevel, overlays, strokes): see `references/layer-effects.md`.
100
+
101
+ ### Paths
102
+
103
+ 1. **Keep outlines as paths**: `make_work_path` turns the selection into the Work Path (the next
104
+ one replaces it; `rename_path` saves it), `add_path` adds one from geometry.
105
+ 2. **Use them**: `path_to_selection` / `add_vector_mask` with `pathId`, `fill_path`, `stroke_path`.
118
106
 
119
107
  ### Painting
120
108
 
@@ -269,7 +257,7 @@ in the source frame at the document's bit depth, colour mode and profile. Read
269
257
  | `grow_selection` | Select › Grow: add connected pixels within `tolerance` (default 32) of a selected colour; follows colour, not distance. `sample`, `sampleMerged`. Fails when nothing is selected. Returns the summary. |
270
258
  | `select_similar` | Select › Similar: add every pixel in the image within `tolerance` of a selected colour, connected or not. Fails when nothing is selected. Returns the summary. |
271
259
  | `reselect` | Bring back the last selection `deselect` cleared (one undo step). Fails when there is none. Returns the summary. |
272
- | `refine_selection` | Select and Mask: snap the selection edge to image edges within `radius` px (0..64, default 8), with `smartRadius`, `smooth` 0..100, `feather` px, `contrast` 0..100 and `shiftEdge` -100..100 %, then `output` to `selection` (default), `layer-mask`, `new-layer` or `new-layer-with-mask` (on `layerId`, default active; new layers hide the source), with `decontaminate` 0..100 for new layers. `edits` (`quick-select`, `brush`, `lasso`, `object` add/subtract; `refine-brush` over hair) apply first; `refineMode: "object"` uses the host model. One step; returns `refineMode`, `layerId` / `newLayerId`. Use on hair, fur, foliage or a coarse AI mask. |
260
+ | `refine_selection` | Select and Mask: snap the selection edge to image edges within `radius` px (0..64, default 8), with `smartRadius`, `smooth` 0..100, `feather` px, `contrast` 0..100 and `shiftEdge` -100..100 %, then `output` to `selection` (default), `layer-mask`, `new-layer`, `new-layer-with-mask` (on `layerId`, default active; new layers hide the source), or `new-document` / `new-document-with-mask` (host must open documents; returns `documentId`), with `decontaminate` 0..100 for new layers and documents. `edits` (`quick-select`, `brush`, `lasso`, `object` add/subtract; `refine-brush` over hair) apply first; `refineMode: "object"` uses the host model. One step; returns `refineMode`, `layerId` / `newLayerId`. Use on hair, fur, foliage or a coarse AI mask. |
273
261
  | `update_adjustment_layer` | Change a layer's `enabled` (false hides it without deleting), `blend`, `opacity` (0..1) or `name` in one undo step. Returns the layer. Its parameters change with `set_adjustments`. Toggle `enabled` to compare a layer's effect before and after. |
274
262
  | `move_adjustment_layer` | Move a layer to index `to` (0 = bottom, applied first; past the top means top). Order matters: a curves layer above a hue/saturation layer works on its output. Fails when the layer is already there. Returns the ids bottom to top. |
275
263
  | `remove_adjustment_layer` | Delete a layer and its mask. Prefer hiding it with `update_adjustment_layer` when the user may want it back. Returns the remaining ids. |
@@ -320,13 +308,23 @@ in the source frame at the document's bit depth, colour mode and profile. Read
320
308
  | `remove_shape_component` | Delete one component (not the last: delete the layer instead). Returns the shape. |
321
309
  | `merge_shape_components` | Merge Shape Components: the combined area becomes one plain component (live shapes become paths); the look does not change. Returns the shape. |
322
310
  | `get_vector_mask` | Read-only. A layer's vector mask: enabled, linked, inverted, fill rule, density, feather, bounds and components (subpaths in document px), or null. Read it before editing the path. |
323
- | `add_vector_mask` | Layer › Vector Mask on any layer but a shape: `from` `path` (a `shape`, `subpaths` or `components`, like `add_shape_layer`), `selection` (traced, `tolerance` px), `reveal-all` or `hide-all` (empty path). Reveals inside the path, sharp at any size; it combines with the raster mask. Returns the vector mask. |
311
+ | `add_vector_mask` | Layer › Vector Mask on any layer but a shape: `from` `path` (a `shape`, `subpaths` or `components`, like `add_shape_layer`, or a document path's `pathId`), `selection` (traced, `tolerance` px), `reveal-all` or `hide-all` (empty path). Reveals inside the path, sharp at any size; it combines with the raster mask. Returns the vector mask. |
324
312
  | `set_vector_mask_path` | Replace the vector mask's path (properties kept). Returns the vector mask. |
325
313
  | `set_vector_mask_properties` | `enabled`, `linked` (false: stays put when the layer moves), `inverted`, `density`, `feather` px; the path is kept. Returns the vector mask. |
326
314
  | `rasterize_vector_mask` | Multiply the path into the raster mask (adding one) and drop the vector mask, so it can be painted. Returns the mask summary. |
327
315
  | `remove_vector_mask` | Delete the vector mask (the raster mask stays). |
328
316
  | `selection_to_path` | Read-only. Make Work Path: the selection's outline as closed Bézier subpaths (`tolerance` px, `cornerRoundness`, `minArea`); returns `svg` and `fillRule: "evenodd"` to pass to `add_vector_mask`, `set_vector_mask_path` or `add_shape_layer`. |
329
- | `path_to_selection` | Make Selection: fill a path (`shape`, `subpaths`, `components`) into the selection by `mode`, with `feather` and `antiAlias`. Returns the selection. |
317
+ | `path_to_selection` | Make Selection: fill a path (`shape`, `subpaths`, `components`, or a document path's `pathId`) into the selection by `mode`, with `feather` and `antiAlias`. Returns the selection. |
318
+ | `list_paths` | Paths panel: saved paths and the Work Path (`work: true`) with ids, names, anchor counts and bounds. Read before the other path tools. |
319
+ | `get_path` | One document path: summary, `svg` and `components` (anchors with handles) to edit and pass to `set_path_geometry`. |
320
+ | `make_work_path` | Paths › Make Work Path: trace the selection into the Work Path (replacing the last one); `tolerance` px. Returns the path. |
321
+ | `add_path` | A saved path from `shape`, `subpaths` (or SVG data) or `components`, with `name`. Returns the path. |
322
+ | `set_path_geometry` | Replace a path's geometry (name kept). Returns the path. |
323
+ | `rename_path` | Rename a path; renaming the Work Path saves it. Returns the path. |
324
+ | `duplicate_path` | Copy a path as a saved path. Returns the copy. |
325
+ | `delete_path` | Delete a path (undo brings it back). Returns the remaining paths. |
326
+ | `fill_path` | Paths › Fill Path: fill a path's area on a pixel layer (`layerId`, `color`, `opacity`); the selection is untouched. |
327
+ | `stroke_path` | Paths › Stroke Path: stroke along a path, `width` px centred, on a pixel layer; the selection is untouched. |
330
328
  | `convert_to_smart_object` | Convert sibling `layerIds` (default the active layer) to one smart object at the top one's position, optional `name`. One pixel layer keeps its id, look and properties (filters become smart filters); several layers, groups or adjustments nest as a layer document. Returns the `layer` and the `smartObject` summary. |
331
329
  | `rasterize_smart_object` | Turn a smart object into a pixel layer holding what it shows now (smart filters baked; same id, mask, effects, opacity, blend). Destructive: the contents and filters are gone. Returns the layer. |
332
330
  | `set_smart_object_transform` | Set a smart object's transform absolutely: `corners`, `matrix` (contents → document), or `scaleX` / `scaleY` (percent of the contents), `rotate`, `skewX`, `skewY`, `x`, `y` (where the contents' centre goes; unset numbers keep their values); `warp` preset or mesh in contents px, `null` removes it; `interpolation`. Re-renders from the contents. Returns `placement`, `masksMoved` and `bounds`. |
@@ -386,7 +384,7 @@ in the source frame at the document's bit depth, colour mode and profile. Read
386
384
  | `apply_selection_as_mask` | Mask a layer with the current selection: pass `layerId` to mask an existing layer, or `kind` (plus optional `params`) to create a new masked layer in one step. `density` 0..1 and `feather` px soften the mask non-destructively. Returns `layerId`, kind, mask info and the selection summary. |
387
385
  | `stroke_selection` | Edit › Stroke: a band `width` px (≤ 250) `outside` (default), `inside` or `center` on the selection edge, with `color`, `opacity`, `blend`, on a layer's pixels or mask (`channel`). One undo step. Returns the changed `bounds`. |
388
386
  | `crop_to_selection` | Set the crop box to the selection's bounds (non-destructive; `reset_crop` undoes it). Returns the `crop`. |
389
- | `content_aware_fill` | Remove what is selected by synthesising texture from around it on a pixel layer; `output` `new-layer` (keeps the fill separate, recommended) or `current`; `sampleRadius`, `seed` (another seed, another fill). Select with a 2–4 px margin. 8-bit only. Returns `layerId` and `bounds`. |
387
+ | `content_aware_fill` | Remove what is selected by synthesising texture from around it on a pixel layer; `output` `new-layer` (keeps the fill separate, recommended) or `current`; `sampleRadius`, `seed` (another seed, another fill); the sampling area with `sampleRects`, `samplingChannelId` and `excludeRects` (never copy from these). Select with a 2–4 px margin. 8-bit only. Returns `layerId` and `bounds`. |
390
388
  | `copy_pixels` | Copy the selected pixels of a layer (or with `merged` the visible image) to the editor clipboard, cropped to the selection with its soft edge. No undo step. Returns `width`, `height`, `x`, `y`. |
391
389
  | `cut_pixels` | Copy, then clear the selected pixels (one undo step). Returns the size and position. |
392
390
  | `paste_pixels` | Paste the clipboard as a new layer: `mode` `new-layer` (centred on the selection or canvas), `in-place`, `into` (masked by the selection) or `outside` (masked by its inverse). One undo step. Returns `layerId`, `bounds`, `masked`. |
@@ -0,0 +1,24 @@
1
+ # Layer effects: drop shadows, glows, bevels, overlays and strokes
2
+
3
+ Read this before `add_layer_effect`, `update_layer_effect`, `set_global_light` or
4
+ `set_layer_effects_enabled`.
5
+
6
+ 1. **Effects are live and per layer**: drop and inner shadows, outer and inner glows,
7
+ bevel & emboss, satin, colour / gradient / pattern overlays and strokes go on pixel,
8
+ annotation and group layers (not adjustment layers) and follow the layer's pixels as they
9
+ change. Add them with `add_layer_effect` (`kind` plus only the `settings` that differ from
10
+ Photoshop's defaults), tune them with `update_layer_effect` and read them back with
11
+ `list_layer_effects`. Each call is one undo step and returns the layer's effects. In the UI
12
+ they are the **Layer Style** section of **Layer Properties**; the separate **Effects** panel is
13
+ for provider effects (effect layers and filters), so say "layer style" when you tell the user
14
+ where a drop shadow or stroke lives.
15
+ 2. **Keep the ids**: `add_layer_effect` returns `effectId`; `update_layer_effect` and
16
+ `remove_layer_effect` need it. `list_layers` shows which layers have effects (ids and kinds
17
+ only).
18
+ 3. **Light consistently**: shadows and bevels follow the document's global light while
19
+ `useGlobalLight` is true (the default). Change the light for all of them with
20
+ `set_global_light`; give one effect its own `angle` only when it must differ.
21
+ 4. **Compare and size as a whole**: `set_layer_effects_enabled` with `enabled: false` hides
22
+ every effect of a layer (each keeps its own `enabled`); `scale` resizes them all (Scale
23
+ Effects), e.g. after resizing a layer's content.
24
+ 5. **Look after each change**: `render_preview` (with `layerId` for one layer alone).
@@ -151,7 +151,8 @@ This skill is the method. `pixerate-image-editor` has the full tool reference.
151
151
  `set_layer_properties`; no selection is needed.
152
152
  - **Remove an object:** select it with a 2–4 px margin (`modify_selection` `expand`), then
153
153
  `content_aware_fill` `output: "new-layer"`; try another `seed` if the fill repeats texture,
154
- and mask out what is wrong.
154
+ and mask out what is wrong. If it copies in something it shouldn't (a person, a sign), pass
155
+ `excludeRects` over that, or `sampleRects` over the background it should continue.
155
156
  - **Outline a cutout:** `select_layer_transparency` on it, then `stroke_selection`
156
157
  `location: "outside"` on a new layer below it.
157
158
  - **Crop to a subject:** select it, then `crop_to_selection` (non-destructive).