@pixerate/editor 0.267.0 → 0.268.1

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 (83) hide show
  1. package/dist/animation-editor/index.cjs +62 -62
  2. package/dist/animation-editor/index.js +6 -6
  3. package/dist/brushes/index.cjs +198 -72
  4. package/dist/brushes/index.d.cts +4 -3
  5. package/dist/brushes/index.d.ts +4 -3
  6. package/dist/brushes/index.js +136 -10
  7. package/dist/brushes/library.d.cts +27 -1
  8. package/dist/brushes/library.d.ts +27 -1
  9. package/dist/brushes/profiles.d.cts +4 -0
  10. package/dist/brushes/profiles.d.ts +4 -0
  11. package/dist/brushes/schema.d.cts +4 -0
  12. package/dist/brushes/schema.d.ts +4 -0
  13. package/dist/brushes/sources.d.cts +114 -0
  14. package/dist/brushes/sources.d.ts +114 -0
  15. package/dist/brushes/types.d.cts +37 -5
  16. package/dist/brushes/types.d.ts +37 -5
  17. package/dist/brushes/ui.d.cts +40 -4
  18. package/dist/brushes/ui.d.ts +40 -4
  19. package/dist/{brushstrokeRender-NLFPEBGI.js → brushstrokeRender-A727TTNQ.js} +6 -6
  20. package/dist/{brushstrokeRender-L7JYRR2R.cjs → brushstrokeRender-WR2N5HHY.cjs} +22 -22
  21. package/dist/canvas/index.cjs +13 -13
  22. package/dist/canvas/index.js +1 -1
  23. package/dist/{chunk-J2TNIZ55.cjs → chunk-2WOGXEDX.cjs} +1 -1
  24. package/dist/{chunk-JGWVZPT6.js → chunk-3XDSNIGF.js} +72 -5
  25. package/dist/{chunk-EXB2EGBE.cjs → chunk-62MFUHSI.cjs} +16 -16
  26. package/dist/{chunk-GCVFEPJG.js → chunk-ACTHSQOI.js} +182 -0
  27. package/dist/{chunk-EF7LZAXQ.js → chunk-BAZMCFVL.js} +1 -1
  28. package/dist/{chunk-HIO6E7LC.cjs → chunk-BPJSI4NT.cjs} +2 -2
  29. package/dist/{chunk-XVOP3CGQ.cjs → chunk-EU2ZZA6L.cjs} +393 -62
  30. package/dist/{chunk-YIC6MAJ2.js → chunk-HFY5LG5J.js} +1 -1
  31. package/dist/{chunk-7UKFXXWL.js → chunk-HVO6XCI4.js} +1 -1
  32. package/dist/{chunk-LHPEG5AU.cjs → chunk-J4GXP53R.cjs} +140 -91
  33. package/dist/{chunk-OKHKA43L.cjs → chunk-JBB3GDBB.cjs} +330 -216
  34. package/dist/{chunk-AGNUD5BI.js → chunk-KZI3YWKW.js} +351 -20
  35. package/dist/{chunk-FGJHJIMN.js → chunk-LDOD7VCT.js} +59 -10
  36. package/dist/{chunk-EYSHTYLG.js → chunk-LETF75CA.js} +1 -1
  37. package/dist/{chunk-FQPUF2W2.cjs → chunk-NIBFKXMD.cjs} +217 -35
  38. package/dist/{chunk-G7NHE2VD.cjs → chunk-NPWWSCWT.cjs} +35 -35
  39. package/dist/{chunk-OSEXT7JL.js → chunk-QNY7BDFP.js} +1 -1
  40. package/dist/{chunk-PXDIAYB6.cjs → chunk-STLTOISW.cjs} +34 -214
  41. package/dist/{chunk-4IDUYB45.js → chunk-UVTO3D4E.js} +130 -16
  42. package/dist/{chunk-TXFWZ5ZJ.js → chunk-W6JDUXP3.js} +4 -184
  43. package/dist/{chunk-LA5Y4ETA.cjs → chunk-YOVXQHA3.cjs} +23 -23
  44. package/dist/{chunk-DT4YQUGT.cjs → chunk-YXP6X3SY.cjs} +101 -34
  45. package/dist/image-editor/adjustment-layers.d.cts +8 -0
  46. package/dist/image-editor/adjustment-layers.d.ts +8 -0
  47. package/dist/image-editor/index.cjs +857 -853
  48. package/dist/image-editor/index.js +30 -26
  49. package/dist/paint/index.cjs +5 -5
  50. package/dist/paint/index.js +11 -11
  51. package/dist/paint-editor/brush-library-tools.d.cts +12 -2
  52. package/dist/paint-editor/brush-library-tools.d.ts +12 -2
  53. package/dist/paint-editor/brush-model.d.cts +29 -1
  54. package/dist/paint-editor/brush-model.d.ts +29 -1
  55. package/dist/paint-editor/brush-source-art.d.cts +32 -0
  56. package/dist/paint-editor/brush-source-art.d.ts +32 -0
  57. package/dist/paint-editor/controller.d.cts +6 -1
  58. package/dist/paint-editor/controller.d.ts +6 -1
  59. package/dist/paint-editor/dab-stroke.d.cts +2 -0
  60. package/dist/paint-editor/dab-stroke.d.ts +2 -0
  61. package/dist/paint-editor/engine.d.cts +11 -2
  62. package/dist/paint-editor/engine.d.ts +11 -2
  63. package/dist/paint-editor/index.cjs +576 -481
  64. package/dist/paint-editor/index.d.cts +3 -1
  65. package/dist/paint-editor/index.d.ts +3 -1
  66. package/dist/paint-editor/index.js +127 -32
  67. package/dist/paint-editor/stamp-tip.d.cts +8 -5
  68. package/dist/paint-editor/stamp-tip.d.ts +8 -5
  69. package/dist/paint-editor/thumbnails.d.cts +6 -0
  70. package/dist/paint-editor/thumbnails.d.ts +6 -0
  71. package/dist/paint-editor/tip-grain.d.cts +34 -0
  72. package/dist/paint-editor/tip-grain.d.ts +34 -0
  73. package/dist/raster/index.cjs +2 -2
  74. package/dist/raster/index.js +9 -9
  75. package/dist/vector/index.cjs +1002 -1002
  76. package/dist/vector/index.js +7 -7
  77. package/package.json +110 -1
  78. package/skills/pixerate-brushes/SKILL.md +35 -8
  79. package/skills/pixerate-brushes-design/SKILL.md +8 -1
  80. package/skills/pixerate-image-editor/SKILL.md +1 -1
  81. package/skills/pixerate-paint-editor/SKILL.md +6 -0
  82. package/skills/pixerate-paint-editor/references/brush-facets.md +3 -1
  83. package/skills/pixerate-paint-sketch-to-finish/SKILL.md +1 -0
@@ -8,7 +8,7 @@ import {
8
8
  parseOpenTypeFont,
9
9
  removeAnchorsKeepingShape,
10
10
  traceField
11
- } from "../chunk-YIC6MAJ2.js";
11
+ } from "../chunk-HFY5LG5J.js";
12
12
  import {
13
13
  ADJUSTMENT_KEYS,
14
14
  ADJUSTMENT_KINDS,
@@ -110,6 +110,7 @@ import {
110
110
  applyProcess2Adjustments,
111
111
  applyProcess2Float,
112
112
  applySmartFilters,
113
+ assertAdjustmentParams,
113
114
  backgroundLayer,
114
115
  blackWhiteGray,
115
116
  blurFilter,
@@ -408,7 +409,7 @@ import {
408
409
  writePsd,
409
410
  xyToTempTint,
410
411
  xyToUv
411
- } from "../chunk-FGJHJIMN.js";
412
+ } from "../chunk-LDOD7VCT.js";
412
413
  import {
413
414
  flattenPath,
414
415
  rasterizeCoverage
@@ -604,7 +605,7 @@ import {
604
605
  spotHealPixels,
605
606
  spotHealWindow,
606
607
  toneOf
607
- } from "../chunk-7UKFXXWL.js";
608
+ } from "../chunk-HVO6XCI4.js";
608
609
  import {
609
610
  bestOffset,
610
611
  contentAwareFill,
@@ -682,14 +683,14 @@ import {
682
683
  warpMeshParamAt,
683
684
  warpMeshRows,
684
685
  warpPresetMesh
685
- } from "../chunk-4IDUYB45.js";
686
+ } from "../chunk-UVTO3D4E.js";
686
687
  import {
687
688
  IMAGE_PROFILE,
688
689
  checkBrush,
689
690
  closest,
690
691
  createBrushLibrary,
691
692
  resolveBrush
692
- } from "../chunk-AGNUD5BI.js";
693
+ } from "../chunk-KZI3YWKW.js";
693
694
  import "../chunk-JL6YH5WD.js";
694
695
  import "../chunk-M6DNZNVY.js";
695
696
  import {
@@ -810,23 +811,17 @@ import {
810
811
  } from "../chunk-GSTSZPSR.js";
811
812
  import {
812
813
  BrushstrokeCache,
813
- GRAIN_PATTERNS,
814
- GRAIN_TILE,
815
- PaperGrain,
816
814
  brushstrokeDataUrl,
817
815
  brushstrokeKey,
818
816
  brushstrokeSamples,
819
817
  brushstrokeStrokeOptions,
820
818
  brushstrokeToCanvas,
821
- grainCatch,
822
- grainHeights,
823
819
  isBrushstrokeBrush,
824
820
  paintPathStroke,
825
821
  pathStrokeCoverage,
826
822
  pathStrokeDabs,
827
- renderBrushstroke,
828
- strokeGrainCatch
829
- } from "../chunk-TXFWZ5ZJ.js";
823
+ renderBrushstroke
824
+ } from "../chunk-W6JDUXP3.js";
830
825
  import {
831
826
  CoverageMap,
832
827
  DEFAULT_BLENDER,
@@ -837,6 +832,8 @@ import {
837
832
  DEFAULT_SMUDGE,
838
833
  DabWalker,
839
834
  EMPTY_MIXER_LOAD,
835
+ GRAIN_PATTERNS,
836
+ GRAIN_TILE,
840
837
  MAX_BRUSH_SIZE,
841
838
  MIXER_DRAIN,
842
839
  MIXER_PICKUP_RATE,
@@ -857,6 +854,7 @@ import {
857
854
  PaintExchange,
858
855
  PaintGradientSampler,
859
856
  PaintSourceError,
857
+ PaperGrain,
860
858
  SmudgeTip,
861
859
  StrokeCoverage,
862
860
  TIP_GRADIENT_STEPS,
@@ -873,6 +871,8 @@ import {
873
871
  dabRect,
874
872
  exchangeRates,
875
873
  gradientDabColor,
874
+ grainCatch,
875
+ grainHeights,
876
876
  hexToPaintRgb,
877
877
  isGradientPaint,
878
878
  loadMixer,
@@ -895,12 +895,13 @@ import {
895
895
  scalePaintGradient,
896
896
  smoothPoints,
897
897
  solidPaint,
898
+ strokeGrainCatch,
898
899
  tipFalloff,
899
900
  tipReach,
900
901
  tipShape,
901
902
  updatePaintGradientStop,
902
903
  walkDabs
903
- } from "../chunk-GCVFEPJG.js";
904
+ } from "../chunk-ACTHSQOI.js";
904
905
  import {
905
906
  TileableNoise,
906
907
  hash2,
@@ -914,15 +915,6 @@ import {
914
915
  BRUSHSTROKE_MIN_SCALE,
915
916
  brushstrokeScaleBucket
916
917
  } from "../chunk-ODBT55Q7.js";
917
- import {
918
- base64ToBytes,
919
- bytesToBase64,
920
- decodePng,
921
- encodePng,
922
- isPng,
923
- parseDataUrl,
924
- pngDataUrl
925
- } from "../chunk-OTTT5N3K.js";
926
918
  import {
927
919
  BIT_DEPTHS,
928
920
  BLEND_MODES,
@@ -977,6 +969,15 @@ import {
977
969
  to8From32,
978
970
  writeDeepRegion
979
971
  } from "../chunk-IRSTHLQQ.js";
972
+ import {
973
+ base64ToBytes,
974
+ bytesToBase64,
975
+ decodePng,
976
+ encodePng,
977
+ isPng,
978
+ parseDataUrl,
979
+ pngDataUrl
980
+ } from "../chunk-OTTT5N3K.js";
980
981
  import {
981
982
  SurfaceDraft,
982
983
  TILE,
@@ -14005,7 +14006,7 @@ function createImageSelectionTools(controller) {
14005
14006
  properties: {
14006
14007
  layerId: { type: "string", description: "Existing adjustment layer to mask." },
14007
14008
  kind: { type: "string", enum: ADJUSTMENT_KINDS.map((k) => k.kind), description: "Kind of a new layer to add and mask (instead of layerId)." },
14008
- params: { type: "object", description: "Parameters for the new layer (see list_controls)." },
14009
+ params: { type: "object", description: 'Parameters for the new layer, nested as in add_adjustment_layer: {"master":{"gamma":1.2}}, not dotted control ids.' },
14009
14010
  density: { type: "number", minimum: 0, maximum: 1, description: "Mask density 0-1." },
14010
14011
  feather: { type: "number", minimum: 0, maximum: 1e3, description: "Mask feather in pixels." }
14011
14012
  },
@@ -14025,6 +14026,7 @@ function createImageSelectionTools(controller) {
14025
14026
  controller.applySelectionAsLayerMask(layerId, props);
14026
14027
  id = layerId;
14027
14028
  } else if (isAdjustmentKind(kind)) {
14029
+ assertAdjustmentParams(kind, params);
14028
14030
  id = controller.addAdjustmentLayer({
14029
14031
  kind,
14030
14032
  params,
@@ -18554,12 +18556,12 @@ function createImageEditorToolProvider(controller, options = {}) {
18554
18556
  const addLayer = {
18555
18557
  name: "add_adjustment_layer",
18556
18558
  title: "Add an adjustment layer",
18557
- description: "Adds a non-destructive adjustment layer on top of the stack (one undoable step) and returns it; with a selection it is masked by it (useSelection, default true; masked in the result says so). clipped clips it to the layer directly below in the same step, so it adjusts only that layer (clipped in the result). Kinds: " + ADJUSTMENT_KINDS.map((k) => k.kind).join(", ") + ". Omitted params are neutral.",
18559
+ description: "Adds a non-destructive adjustment layer on top of the stack (one undoable step) and returns it; with a selection it is masked by it (useSelection, default true; masked in the result says so). clipped clips it to the layer directly below in the same step, so it adjusts only that layer (clipped in the result). Kinds: " + ADJUSTMENT_KINDS.map((k) => k.kind).join(", ") + ". Omitted params are neutral; an unknown or mistyped key is refused with the accepted shape.",
18558
18560
  inputSchema: {
18559
18561
  type: "object",
18560
18562
  properties: {
18561
18563
  kind: { type: "string", enum: ADJUSTMENT_KINDS.map((k) => k.kind), description: "Adjustment kind." },
18562
- params: { type: "object", description: "Initial parameters (see list_controls); merged with neutral defaults." },
18564
+ params: { type: "object", description: 'Initial parameters, merged with neutral defaults. Nested, not dotted control ids: levels gamma is {"master":{"gamma":1.2}}, not {"master.gamma":1.2}. See list_controls for the ranges.' },
18563
18565
  opacity: { type: "number", minimum: 0, maximum: 1, description: "Layer opacity 0-1 (default 1)." },
18564
18566
  blend: { type: "string", enum: BLEND_MODES.map((m) => m.id), description: "Blend mode (default normal)." },
18565
18567
  name: { type: "string", description: "Layer name shown in the layers panel." },
@@ -18586,6 +18588,7 @@ function createImageEditorToolProvider(controller, options = {}) {
18586
18588
  if (ref !== void 0 && !controller.getLayer(ref)) throw new Error(`Unknown layer "${ref}". Call list_layers for ids.`);
18587
18589
  }
18588
18590
  if (parentId !== void 0 && controller.getLayer(parentId)?.type !== "group") throw new Error(`Layer "${parentId}" is not a group.`);
18591
+ assertAdjustmentParams(kind, params);
18589
18592
  const id = controller.addAdjustmentLayer({ kind, params, opacity, blend, name, aboveId, parentId, useSelection: useSelection !== false, clipped: clipped === true });
18590
18593
  const layer = controller.getAdjustmentLayer(id);
18591
18594
  return { layer: JSON.parse(JSON.stringify(layer)), index: controller.getAdjustmentLayers().findIndex((l) => l.id === id), masked: Boolean(layer.mask), clipped: Boolean(controller.getLayer(id)?.clipped) };
@@ -21836,6 +21839,7 @@ export {
21836
21839
  applyStrokeToDeepTile,
21837
21840
  applyStrokeToTile,
21838
21841
  applyToneToDeepTile,
21842
+ assertAdjustmentParams,
21839
21843
  backgroundLayer,
21840
21844
  base64ToBytes,
21841
21845
  baseProjection,
@@ -33,7 +33,7 @@
33
33
 
34
34
 
35
35
 
36
- var _chunkEXB2EGBEcjs = require('../chunk-EXB2EGBE.cjs');
36
+ var _chunk62MFUHSIcjs = require('../chunk-62MFUHSI.cjs');
37
37
 
38
38
 
39
39
 
@@ -147,13 +147,13 @@ var _chunkJ5VQYK7Tcjs = require('../chunk-J5VQYK7T.cjs');
147
147
 
148
148
 
149
149
 
150
+ var _chunkSTLTOISWcjs = require('../chunk-STLTOISW.cjs');
150
151
 
151
152
 
152
153
 
153
154
 
154
155
 
155
156
 
156
- var _chunkPXDIAYB6cjs = require('../chunk-PXDIAYB6.cjs');
157
157
 
158
158
 
159
159
 
@@ -227,7 +227,7 @@ var _chunkPXDIAYB6cjs = require('../chunk-PXDIAYB6.cjs');
227
227
 
228
228
 
229
229
 
230
- var _chunkFQPUF2W2cjs = require('../chunk-FQPUF2W2.cjs');
230
+ var _chunkNIBFKXMDcjs = require('../chunk-NIBFKXMD.cjs');
231
231
 
232
232
 
233
233
 
@@ -241,7 +241,6 @@ var _chunk3K6HWEXZcjs = require('../chunk-3K6HWEXZ.cjs');
241
241
 
242
242
 
243
243
  var _chunkYQGCPL5Xcjs = require('../chunk-YQGCPL5X.cjs');
244
- require('../chunk-W5M3J7PV.cjs');
245
244
 
246
245
 
247
246
 
@@ -255,6 +254,7 @@ require('../chunk-W5M3J7PV.cjs');
255
254
 
256
255
 
257
256
  var _chunk2VX55NFMcjs = require('../chunk-2VX55NFM.cjs');
257
+ require('../chunk-W5M3J7PV.cjs');
258
258
  require('../chunk-474IQG74.cjs');
259
259
  require('../chunk-XFM3OCHU.cjs');
260
260
 
@@ -498,4 +498,4 @@ require('../chunk-XFM3OCHU.cjs');
498
498
 
499
499
 
500
500
 
501
- exports.BODY_SCATTER = _chunkJ5VQYK7Tcjs.BODY_SCATTER; exports.BRUSHSTROKE_MAX_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MAX_SCALE; exports.BRUSHSTROKE_MIN_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MIN_SCALE; exports.BrushstrokeCache = _chunkPXDIAYB6cjs.BrushstrokeCache; exports.CoverageMap = _chunkFQPUF2W2cjs.CoverageMap; exports.DEFAULT_BLENDER = _chunkFQPUF2W2cjs.DEFAULT_BLENDER; exports.DEFAULT_BRUSH = _chunkFQPUF2W2cjs.DEFAULT_BRUSH; exports.DEFAULT_FLOW = _chunkJ5VQYK7Tcjs.DEFAULT_FLOW; exports.DEFAULT_MIXER = _chunkFQPUF2W2cjs.DEFAULT_MIXER; exports.DEFAULT_PAINT_GRADIENT = _chunkFQPUF2W2cjs.DEFAULT_PAINT_GRADIENT; exports.DEFAULT_PAINT_GRADIENT_MAPPING = _chunkFQPUF2W2cjs.DEFAULT_PAINT_GRADIENT_MAPPING; exports.DEFAULT_RETOUCH = _chunkEXB2EGBEcjs.DEFAULT_RETOUCH; exports.DEFAULT_SMUDGE = _chunkFQPUF2W2cjs.DEFAULT_SMUDGE; exports.DEFAULT_WET_PAPER = _chunkJ5VQYK7Tcjs.DEFAULT_WET_PAPER; exports.DEFAULT_WET_PARAMS = _chunkJ5VQYK7Tcjs.DEFAULT_WET_PARAMS; exports.DRY_EPS = _chunkJ5VQYK7Tcjs.DRY_EPS; exports.DabWalker = _chunkFQPUF2W2cjs.DabWalker; exports.EMPTY_MIXER_LOAD = _chunkFQPUF2W2cjs.EMPTY_MIXER_LOAD; exports.EX = _chunkJ5VQYK7Tcjs.EX; exports.EY = _chunkJ5VQYK7Tcjs.EY; exports.FLAG_ALIVE = _chunkJ5VQYK7Tcjs.FLAG_ALIVE; exports.FLAG_BOTTOM = _chunkJ5VQYK7Tcjs.FLAG_BOTTOM; exports.FLAG_LEFT = _chunkJ5VQYK7Tcjs.FLAG_LEFT; exports.FLAG_RIGHT = _chunkJ5VQYK7Tcjs.FLAG_RIGHT; exports.FLAG_TOP = _chunkJ5VQYK7Tcjs.FLAG_TOP; exports.FLAG_WET = _chunkJ5VQYK7Tcjs.FLAG_WET; exports.FLAT = _chunkJ5VQYK7Tcjs.FLAT; exports.FREE_INTERVAL = _chunkJ5VQYK7Tcjs.FREE_INTERVAL; exports.GRAIN_PATTERNS = _chunkPXDIAYB6cjs.GRAIN_PATTERNS; exports.GRAIN_TILE = _chunkPXDIAYB6cjs.GRAIN_TILE; exports.HIDE = _chunkJ5VQYK7Tcjs.HIDE; exports.IDENTITY_CLONE_TRANSFORM = _chunkEXB2EGBEcjs.IDENTITY_CLONE_TRANSFORM; exports.MASS_CHANNELS = _chunkJ5VQYK7Tcjs.MASS_CHANNELS; exports.MAX_BATCH = _chunkJ5VQYK7Tcjs.MAX_BATCH; exports.MAX_BRUSH_SIZE = _chunkFQPUF2W2cjs.MAX_BRUSH_SIZE; exports.MAX_TILT_ACCEL = _chunkJ5VQYK7Tcjs.MAX_TILT_ACCEL; exports.MAX_WET_LANES = _chunkJ5VQYK7Tcjs.MAX_WET_LANES; exports.MAX_WET_SLOTS = _chunkJ5VQYK7Tcjs.MAX_WET_SLOTS; exports.MIXER_DRAIN = _chunkFQPUF2W2cjs.MIXER_DRAIN; exports.MIXER_PICKUP_RATE = _chunkFQPUF2W2cjs.MIXER_PICKUP_RATE; exports.MIXING_MODELS = _chunkFQPUF2W2cjs.MIXING_MODELS; exports.MixerStroke = _chunkFQPUF2W2cjs.MixerStroke; exports.OPP = _chunkJ5VQYK7Tcjs.OPP; exports.PAINT_COLOR_JSON_SCHEMA = _chunkFQPUF2W2cjs.PAINT_COLOR_JSON_SCHEMA; exports.PAINT_GRADIENT_FULL_SPEED = _chunkFQPUF2W2cjs.PAINT_GRADIENT_FULL_SPEED; exports.PAINT_GRADIENT_JSON_SCHEMA = _chunkFQPUF2W2cjs.PAINT_GRADIENT_JSON_SCHEMA; exports.PAINT_GRADIENT_KIT = _chunkFQPUF2W2cjs.PAINT_GRADIENT_KIT; exports.PAINT_GRADIENT_MAPPINGS = _chunkFQPUF2W2cjs.PAINT_GRADIENT_MAPPINGS; exports.PAINT_GRADIENT_MAPPING_LABELS = _chunkFQPUF2W2cjs.PAINT_GRADIENT_MAPPING_LABELS; exports.PAINT_GRADIENT_PRESETS = _chunkFQPUF2W2cjs.PAINT_GRADIENT_PRESETS; exports.PAINT_GRADIENT_REPEATS = _chunkFQPUF2W2cjs.PAINT_GRADIENT_REPEATS; exports.PAINT_GRADIENT_REPEAT_LABELS = _chunkFQPUF2W2cjs.PAINT_GRADIENT_REPEAT_LABELS; exports.PAINT_GRADIENT_SPACES = _chunkFQPUF2W2cjs.PAINT_GRADIENT_SPACES; exports.PAINT_GRADIENT_SPACE_LABELS = _chunkFQPUF2W2cjs.PAINT_GRADIENT_SPACE_LABELS; exports.PAINT_SOURCE_JSON_SCHEMA = _chunkFQPUF2W2cjs.PAINT_SOURCE_JSON_SCHEMA; exports.PAPER_CAPACITY = _chunkJ5VQYK7Tcjs.PAPER_CAPACITY; exports.PARAM = _chunkJ5VQYK7Tcjs.PARAM; exports.PARAM_FLOATS = _chunkJ5VQYK7Tcjs.PARAM_FLOATS; exports.PIGMENT_BANDS = _chunk2VX55NFMcjs.PIGMENT_BANDS; exports.PIGMENT_CHANNELS = _chunkJ5VQYK7Tcjs.PIGMENT_CHANNELS; exports.PIGMENT_LAMBDA_MIN = _chunk2VX55NFMcjs.PIGMENT_LAMBDA_MIN; exports.PIGMENT_LAMBDA_STEP = _chunk2VX55NFMcjs.PIGMENT_LAMBDA_STEP; exports.PIGMENT_UNIT = _chunkJ5VQYK7Tcjs.PIGMENT_UNIT; exports.PIGMENT_WAVELENGTHS = _chunk2VX55NFMcjs.PIGMENT_WAVELENGTHS; exports.PLANE = _chunkJ5VQYK7Tcjs.PLANE; exports.PLANE_BYTES = _chunkJ5VQYK7Tcjs.PLANE_BYTES; exports.P_D0 = _chunkJ5VQYK7Tcjs.P_D0; exports.P_DL = _chunkJ5VQYK7Tcjs.P_DL; exports.P_EDGE = _chunkJ5VQYK7Tcjs.P_EDGE; exports.P_FX = _chunkJ5VQYK7Tcjs.P_FX; exports.P_FY = _chunkJ5VQYK7Tcjs.P_FY; exports.P_H = _chunkJ5VQYK7Tcjs.P_H; exports.P_L = _chunkJ5VQYK7Tcjs.P_L; exports.P_P0 = _chunkJ5VQYK7Tcjs.P_P0; exports.P_RHO = _chunkJ5VQYK7Tcjs.P_RHO; exports.P_SW = _chunkJ5VQYK7Tcjs.P_SW; exports.P_UX = _chunkJ5VQYK7Tcjs.P_UX; exports.P_UY = _chunkJ5VQYK7Tcjs.P_UY; exports.PaintExchange = _chunkFQPUF2W2cjs.PaintExchange; exports.PaintGradientSampler = _chunkFQPUF2W2cjs.PaintGradientSampler; exports.PaintSourceError = _chunkFQPUF2W2cjs.PaintSourceError; exports.PaperGrain = _chunkPXDIAYB6cjs.PaperGrain; exports.RETOUCH_SAMPLES = _chunkEXB2EGBEcjs.RETOUCH_SAMPLES; exports.RegionPixelSource = _chunkEXB2EGBEcjs.RegionPixelSource; exports.RetouchDabStroke = _chunkEXB2EGBEcjs.RetouchDabStroke; exports.SET_PLANES = _chunkJ5VQYK7Tcjs.SET_PLANES; exports.SLOT_BYTES = _chunkJ5VQYK7Tcjs.SLOT_BYTES; exports.SLOT_PLANES = _chunkJ5VQYK7Tcjs.SLOT_PLANES; exports.SLOT_SIDE = _chunkJ5VQYK7Tcjs.SLOT_SIDE; exports.SPOT_HEAL_TYPES = _chunkEXB2EGBEcjs.SPOT_HEAL_TYPES; exports.SRGB_TO_LINEAR = _chunkJ5VQYK7Tcjs.SRGB_TO_LINEAR; exports.STRIP = _chunkJ5VQYK7Tcjs.STRIP; exports.SmudgeTip = _chunkFQPUF2W2cjs.SmudgeTip; exports.StrokeCoverage = _chunkFQPUF2W2cjs.StrokeCoverage; exports.TIP_GRADIENT_STEPS = _chunkFQPUF2W2cjs.TIP_GRADIENT_STEPS; exports.TONE_RANGES = _chunkEXB2EGBEcjs.TONE_RANGES; exports.TileMedium = _chunkFQPUF2W2cjs.TileMedium; exports.TilePixelSource = _chunkEXB2EGBEcjs.TilePixelSource; exports.TileableNoise = _chunk3K6HWEXZcjs.TileableNoise; exports.TransformedPixelSource = _chunkEXB2EGBEcjs.TransformedPixelSource; exports.U_MAX = _chunkJ5VQYK7Tcjs.U_MAX; exports.W9 = _chunkJ5VQYK7Tcjs.W9; exports.WET_FLOW_KINDS = _chunkJ5VQYK7Tcjs.WET_FLOW_KINDS; exports.WET_PARAM_KEYS = _chunkJ5VQYK7Tcjs.WET_PARAM_KEYS; exports.WET_TILE = _chunkJ5VQYK7Tcjs.WET_TILE; exports.WGSL_HALO = _chunkJ5VQYK7Tcjs.WGSL_HALO; exports.WGSL_SHADE = _chunkJ5VQYK7Tcjs.WGSL_SHADE; exports.WGSL_STEP = _chunkJ5VQYK7Tcjs.WGSL_STEP; exports.WetGpuEngine = _chunkJ5VQYK7Tcjs.WetGpuEngine; exports.WetMedium = _chunkJ5VQYK7Tcjs.WetMedium; exports.WetWorkerPool = _chunkJ5VQYK7Tcjs.WetWorkerPool; exports.WetWorld = _chunkJ5VQYK7Tcjs.WetWorld; exports.WetWorldError = _chunkJ5VQYK7Tcjs.WetWorldError; exports.addPaintGradientStop = _chunkFQPUF2W2cjs.addPaintGradientStop; exports.applyRetouchToTile = _chunkEXB2EGBEcjs.applyRetouchToTile; exports.applyStrokeToDeepTile = _chunkFQPUF2W2cjs.applyStrokeToDeepTile; exports.applyStrokeToTile = _chunkFQPUF2W2cjs.applyStrokeToTile; exports.applyToneToDeepTile = _chunkEXB2EGBEcjs.applyToneToDeepTile; exports.bestOffset = _chunkBB6TR422cjs.bestOffset; exports.blendRadius = _chunkFQPUF2W2cjs.blendRadius; exports.blenderDab = _chunkFQPUF2W2cjs.blenderDab; exports.boxBlurPixels = _chunkEXB2EGBEcjs.boxBlurPixels; exports.brushstrokeDataUrl = _chunkPXDIAYB6cjs.brushstrokeDataUrl; exports.brushstrokeKey = _chunkPXDIAYB6cjs.brushstrokeKey; exports.brushstrokeSamples = _chunkPXDIAYB6cjs.brushstrokeSamples; exports.brushstrokeScaleBucket = _chunkYQGCPL5Xcjs.brushstrokeScaleBucket; exports.brushstrokeStrokeOptions = _chunkPXDIAYB6cjs.brushstrokeStrokeOptions; exports.brushstrokeToCanvas = _chunkPXDIAYB6cjs.brushstrokeToCanvas; exports.canShareMemory = _chunkJ5VQYK7Tcjs.canShareMemory; exports.cleanMixer = _chunkFQPUF2W2cjs.cleanMixer; exports.cloneSamplePoint = _chunkEXB2EGBEcjs.cloneSamplePoint; exports.contentAwareFill = _chunkBB6TR422cjs.contentAwareFill; exports.coverageTileCoord = _chunkFQPUF2W2cjs.coverageTileCoord; exports.createBlenderScratch = _chunkFQPUF2W2cjs.createBlenderScratch; exports.createPigment = _chunk2VX55NFMcjs.createPigment; exports.createPigmentTools = _chunkEXB2EGBEcjs.createPigmentTools; exports.createWetGpuEngine = _chunkJ5VQYK7Tcjs.createWetGpuEngine; exports.dabCoverage = _chunkFQPUF2W2cjs.dabCoverage; exports.dabRect = _chunkFQPUF2W2cjs.dabRect; exports.dexp = _chunkJ5VQYK7Tcjs.dexp; exports.dilateMask = _chunkBB6TR422cjs.dilateMask; exports.dlog = _chunkJ5VQYK7Tcjs.dlog; exports.dodgeBurn = _chunkEXB2EGBEcjs.dodgeBurn; exports.dodgeBurnCurve = _chunkEXB2EGBEcjs.dodgeBurnCurve; exports.dpow = _chunkJ5VQYK7Tcjs.dpow; exports.dsincos = _chunkJ5VQYK7Tcjs.dsincos; exports.edgeBits = _chunkJ5VQYK7Tcjs.edgeBits; exports.exchangeRates = _chunkFQPUF2W2cjs.exchangeRates; exports.expNeg = _chunkJ5VQYK7Tcjs.expNeg; exports.filmPixel = _chunkJ5VQYK7Tcjs.filmPixel; exports.filmReflectance = _chunkJ5VQYK7Tcjs.filmReflectance; exports.findWebGpu = _chunkJ5VQYK7Tcjs.findWebGpu; exports.flowField = _chunkJ5VQYK7Tcjs.flowField; exports.gradientDabColor = _chunkFQPUF2W2cjs.gradientDabColor; exports.grainCatch = _chunkPXDIAYB6cjs.grainCatch; exports.grainHeights = _chunkPXDIAYB6cjs.grainHeights; exports.hash2 = _chunk3K6HWEXZcjs.hash2; exports.healPixels = _chunkEXB2EGBEcjs.healPixels; exports.hexToPaintRgb = _chunkFQPUF2W2cjs.hexToPaintRgb; exports.isBrushstrokeBrush = _chunkPXDIAYB6cjs.isBrushstrokeBrush; exports.isGradientPaint = _chunkFQPUF2W2cjs.isGradientPaint; exports.isIdentityCloneTransform = _chunkEXB2EGBEcjs.isIdentityCloneTransform; exports.latticeViscosity = _chunkJ5VQYK7Tcjs.latticeViscosity; exports.lerpPigment = _chunk2VX55NFMcjs.lerpPigment; exports.lerpPigmentInto = _chunk2VX55NFMcjs.lerpPigmentInto; exports.linearToSrgb8 = _chunkJ5VQYK7Tcjs.linearToSrgb8; exports.loadMixer = _chunkFQPUF2W2cjs.loadMixer; exports.loadWetKernel = _chunkJ5VQYK7Tcjs.loadWetKernel; exports.luma = _chunkEXB2EGBEcjs.luma; exports.maskBounds = _chunkBB6TR422cjs.maskBounds; exports.membraneFill = _chunkBB6TR422cjs.membraneFill; exports.mix32 = _chunk3K6HWEXZcjs.mix32; exports.mixPigments = _chunk2VX55NFMcjs.mixPigments; exports.mixerRates = _chunkFQPUF2W2cjs.mixerRates; exports.moveWetSnapshot = _chunkJ5VQYK7Tcjs.moveWetSnapshot; exports.normalizeBlender = _chunkFQPUF2W2cjs.normalizeBlender; exports.normalizeBrush = _chunkFQPUF2W2cjs.normalizeBrush; exports.normalizeFlow = _chunkJ5VQYK7Tcjs.normalizeFlow; exports.normalizeHexColor = _chunkFQPUF2W2cjs.normalizeHexColor; exports.normalizeMixer = _chunkFQPUF2W2cjs.normalizeMixer; exports.normalizeRetouch = _chunkEXB2EGBEcjs.normalizeRetouch; exports.normalizeSmudge = _chunkFQPUF2W2cjs.normalizeSmudge; exports.normalizeTilt = _chunkJ5VQYK7Tcjs.normalizeTilt; exports.normalizeWetParams = _chunkJ5VQYK7Tcjs.normalizeWetParams; exports.packWetParams = _chunkJ5VQYK7Tcjs.packWetParams; exports.paintGradientMappingFor = _chunkFQPUF2W2cjs.paintGradientMappingFor; exports.paintPathStroke = _chunkPXDIAYB6cjs.paintPathStroke; exports.paintSourceColor = _chunkFQPUF2W2cjs.paintSourceColor; exports.paintSourceCss = _chunkFQPUF2W2cjs.paintSourceCss; exports.parsePaintSource = _chunkFQPUF2W2cjs.parsePaintSource; exports.pathStrokeCoverage = _chunkPXDIAYB6cjs.pathStrokeCoverage; exports.pathStrokeDabs = _chunkPXDIAYB6cjs.pathStrokeDabs; exports.perDabStrength = _chunkEXB2EGBEcjs.perDabStrength; exports.pigmentColor = _chunkJ5VQYK7Tcjs.pigmentColor; exports.pigmentOf = _chunkJ5VQYK7Tcjs.pigmentOf; exports.pixelPigment = _chunkJ5VQYK7Tcjs.pixelPigment; exports.pointerPressure = _chunkEXB2EGBEcjs.pointerPressure; exports.pointerStrokeSample = _chunkEXB2EGBEcjs.pointerStrokeSample; exports.pointerStrokeSamples = _chunkEXB2EGBEcjs.pointerStrokeSamples; exports.put255 = _chunkFQPUF2W2cjs.put255; exports.rand01 = _chunk3K6HWEXZcjs.rand01; exports.randSigned = _chunk3K6HWEXZcjs.randSigned; exports.rasterizeDab = _chunkFQPUF2W2cjs.rasterizeDab; exports.readPaintSource = _chunkFQPUF2W2cjs.readPaintSource; exports.readSourceRegion = _chunkEXB2EGBEcjs.readSourceRegion; exports.reflectanceToRgb = _chunk2VX55NFMcjs.reflectanceToRgb; exports.removePaintGradientStop = _chunkFQPUF2W2cjs.removePaintGradientStop; exports.renderBrushstroke = _chunkPXDIAYB6cjs.renderBrushstroke; exports.resolvePaintGradient = _chunkFQPUF2W2cjs.resolvePaintGradient; exports.retouchFilter = _chunkEXB2EGBEcjs.retouchFilter; exports.reversePaintGradient = _chunkFQPUF2W2cjs.reversePaintGradient; exports.rgbToReflectance = _chunk2VX55NFMcjs.rgbToReflectance; exports.rgbaViewOfGrey = _chunkEXB2EGBEcjs.rgbaViewOfGrey; exports.saturationOf = _chunkEXB2EGBEcjs.saturationOf; exports.scalePaintGradient = _chunkFQPUF2W2cjs.scalePaintGradient; exports.seamlessClone = _chunkBB6TR422cjs.seamlessClone; exports.seedFromString = _chunk3K6HWEXZcjs.seedFromString; exports.setPigmentColor = _chunk2VX55NFMcjs.setPigmentColor; exports.shadeLightTile = _chunkJ5VQYK7Tcjs.shadeLightTile; exports.shadeTile = _chunkJ5VQYK7Tcjs.shadeTile; exports.smoothPoints = _chunkFQPUF2W2cjs.smoothPoints; exports.smudgeEffect = _chunkEXB2EGBEcjs.smudgeEffect; exports.solidPaint = _chunkFQPUF2W2cjs.solidPaint; exports.solveMembrane = _chunkBB6TR422cjs.solveMembrane; exports.sponge = _chunkEXB2EGBEcjs.sponge; exports.spongeEffect = _chunkEXB2EGBEcjs.spongeEffect; exports.spotHealPixels = _chunkEXB2EGBEcjs.spotHealPixels; exports.spotHealWindow = _chunkEXB2EGBEcjs.spotHealWindow; exports.srgbByteToLinear = _chunkJ5VQYK7Tcjs.srgbByteToLinear; exports.stepSlotTs = _chunkJ5VQYK7Tcjs.stepSlotTs; exports.strokeGrainCatch = _chunkPXDIAYB6cjs.strokeGrainCatch; exports.tipFalloff = _chunkFQPUF2W2cjs.tipFalloff; exports.tipReach = _chunkFQPUF2W2cjs.tipReach; exports.tipShape = _chunkFQPUF2W2cjs.tipShape; exports.toneOf = _chunkEXB2EGBEcjs.toneOf; exports.updatePaintGradientStop = _chunkFQPUF2W2cjs.updatePaintGradientStop; exports.walkDabs = _chunkFQPUF2W2cjs.walkDabs; exports.wetGpuSupport = _chunkJ5VQYK7Tcjs.wetGpuSupport; exports.wetSimdSupported = _chunkJ5VQYK7Tcjs.wetSimdSupported; exports.wetSupport = _chunkJ5VQYK7Tcjs.wetSupport;
501
+ exports.BODY_SCATTER = _chunkJ5VQYK7Tcjs.BODY_SCATTER; exports.BRUSHSTROKE_MAX_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MAX_SCALE; exports.BRUSHSTROKE_MIN_SCALE = _chunkYQGCPL5Xcjs.BRUSHSTROKE_MIN_SCALE; exports.BrushstrokeCache = _chunkSTLTOISWcjs.BrushstrokeCache; exports.CoverageMap = _chunkNIBFKXMDcjs.CoverageMap; exports.DEFAULT_BLENDER = _chunkNIBFKXMDcjs.DEFAULT_BLENDER; exports.DEFAULT_BRUSH = _chunkNIBFKXMDcjs.DEFAULT_BRUSH; exports.DEFAULT_FLOW = _chunkJ5VQYK7Tcjs.DEFAULT_FLOW; exports.DEFAULT_MIXER = _chunkNIBFKXMDcjs.DEFAULT_MIXER; exports.DEFAULT_PAINT_GRADIENT = _chunkNIBFKXMDcjs.DEFAULT_PAINT_GRADIENT; exports.DEFAULT_PAINT_GRADIENT_MAPPING = _chunkNIBFKXMDcjs.DEFAULT_PAINT_GRADIENT_MAPPING; exports.DEFAULT_RETOUCH = _chunk62MFUHSIcjs.DEFAULT_RETOUCH; exports.DEFAULT_SMUDGE = _chunkNIBFKXMDcjs.DEFAULT_SMUDGE; exports.DEFAULT_WET_PAPER = _chunkJ5VQYK7Tcjs.DEFAULT_WET_PAPER; exports.DEFAULT_WET_PARAMS = _chunkJ5VQYK7Tcjs.DEFAULT_WET_PARAMS; exports.DRY_EPS = _chunkJ5VQYK7Tcjs.DRY_EPS; exports.DabWalker = _chunkNIBFKXMDcjs.DabWalker; exports.EMPTY_MIXER_LOAD = _chunkNIBFKXMDcjs.EMPTY_MIXER_LOAD; exports.EX = _chunkJ5VQYK7Tcjs.EX; exports.EY = _chunkJ5VQYK7Tcjs.EY; exports.FLAG_ALIVE = _chunkJ5VQYK7Tcjs.FLAG_ALIVE; exports.FLAG_BOTTOM = _chunkJ5VQYK7Tcjs.FLAG_BOTTOM; exports.FLAG_LEFT = _chunkJ5VQYK7Tcjs.FLAG_LEFT; exports.FLAG_RIGHT = _chunkJ5VQYK7Tcjs.FLAG_RIGHT; exports.FLAG_TOP = _chunkJ5VQYK7Tcjs.FLAG_TOP; exports.FLAG_WET = _chunkJ5VQYK7Tcjs.FLAG_WET; exports.FLAT = _chunkJ5VQYK7Tcjs.FLAT; exports.FREE_INTERVAL = _chunkJ5VQYK7Tcjs.FREE_INTERVAL; exports.GRAIN_PATTERNS = _chunkNIBFKXMDcjs.GRAIN_PATTERNS; exports.GRAIN_TILE = _chunkNIBFKXMDcjs.GRAIN_TILE; exports.HIDE = _chunkJ5VQYK7Tcjs.HIDE; exports.IDENTITY_CLONE_TRANSFORM = _chunk62MFUHSIcjs.IDENTITY_CLONE_TRANSFORM; exports.MASS_CHANNELS = _chunkJ5VQYK7Tcjs.MASS_CHANNELS; exports.MAX_BATCH = _chunkJ5VQYK7Tcjs.MAX_BATCH; exports.MAX_BRUSH_SIZE = _chunkNIBFKXMDcjs.MAX_BRUSH_SIZE; exports.MAX_TILT_ACCEL = _chunkJ5VQYK7Tcjs.MAX_TILT_ACCEL; exports.MAX_WET_LANES = _chunkJ5VQYK7Tcjs.MAX_WET_LANES; exports.MAX_WET_SLOTS = _chunkJ5VQYK7Tcjs.MAX_WET_SLOTS; exports.MIXER_DRAIN = _chunkNIBFKXMDcjs.MIXER_DRAIN; exports.MIXER_PICKUP_RATE = _chunkNIBFKXMDcjs.MIXER_PICKUP_RATE; exports.MIXING_MODELS = _chunkNIBFKXMDcjs.MIXING_MODELS; exports.MixerStroke = _chunkNIBFKXMDcjs.MixerStroke; exports.OPP = _chunkJ5VQYK7Tcjs.OPP; exports.PAINT_COLOR_JSON_SCHEMA = _chunkNIBFKXMDcjs.PAINT_COLOR_JSON_SCHEMA; exports.PAINT_GRADIENT_FULL_SPEED = _chunkNIBFKXMDcjs.PAINT_GRADIENT_FULL_SPEED; exports.PAINT_GRADIENT_JSON_SCHEMA = _chunkNIBFKXMDcjs.PAINT_GRADIENT_JSON_SCHEMA; exports.PAINT_GRADIENT_KIT = _chunkNIBFKXMDcjs.PAINT_GRADIENT_KIT; exports.PAINT_GRADIENT_MAPPINGS = _chunkNIBFKXMDcjs.PAINT_GRADIENT_MAPPINGS; exports.PAINT_GRADIENT_MAPPING_LABELS = _chunkNIBFKXMDcjs.PAINT_GRADIENT_MAPPING_LABELS; exports.PAINT_GRADIENT_PRESETS = _chunkNIBFKXMDcjs.PAINT_GRADIENT_PRESETS; exports.PAINT_GRADIENT_REPEATS = _chunkNIBFKXMDcjs.PAINT_GRADIENT_REPEATS; exports.PAINT_GRADIENT_REPEAT_LABELS = _chunkNIBFKXMDcjs.PAINT_GRADIENT_REPEAT_LABELS; exports.PAINT_GRADIENT_SPACES = _chunkNIBFKXMDcjs.PAINT_GRADIENT_SPACES; exports.PAINT_GRADIENT_SPACE_LABELS = _chunkNIBFKXMDcjs.PAINT_GRADIENT_SPACE_LABELS; exports.PAINT_SOURCE_JSON_SCHEMA = _chunkNIBFKXMDcjs.PAINT_SOURCE_JSON_SCHEMA; exports.PAPER_CAPACITY = _chunkJ5VQYK7Tcjs.PAPER_CAPACITY; exports.PARAM = _chunkJ5VQYK7Tcjs.PARAM; exports.PARAM_FLOATS = _chunkJ5VQYK7Tcjs.PARAM_FLOATS; exports.PIGMENT_BANDS = _chunk2VX55NFMcjs.PIGMENT_BANDS; exports.PIGMENT_CHANNELS = _chunkJ5VQYK7Tcjs.PIGMENT_CHANNELS; exports.PIGMENT_LAMBDA_MIN = _chunk2VX55NFMcjs.PIGMENT_LAMBDA_MIN; exports.PIGMENT_LAMBDA_STEP = _chunk2VX55NFMcjs.PIGMENT_LAMBDA_STEP; exports.PIGMENT_UNIT = _chunkJ5VQYK7Tcjs.PIGMENT_UNIT; exports.PIGMENT_WAVELENGTHS = _chunk2VX55NFMcjs.PIGMENT_WAVELENGTHS; exports.PLANE = _chunkJ5VQYK7Tcjs.PLANE; exports.PLANE_BYTES = _chunkJ5VQYK7Tcjs.PLANE_BYTES; exports.P_D0 = _chunkJ5VQYK7Tcjs.P_D0; exports.P_DL = _chunkJ5VQYK7Tcjs.P_DL; exports.P_EDGE = _chunkJ5VQYK7Tcjs.P_EDGE; exports.P_FX = _chunkJ5VQYK7Tcjs.P_FX; exports.P_FY = _chunkJ5VQYK7Tcjs.P_FY; exports.P_H = _chunkJ5VQYK7Tcjs.P_H; exports.P_L = _chunkJ5VQYK7Tcjs.P_L; exports.P_P0 = _chunkJ5VQYK7Tcjs.P_P0; exports.P_RHO = _chunkJ5VQYK7Tcjs.P_RHO; exports.P_SW = _chunkJ5VQYK7Tcjs.P_SW; exports.P_UX = _chunkJ5VQYK7Tcjs.P_UX; exports.P_UY = _chunkJ5VQYK7Tcjs.P_UY; exports.PaintExchange = _chunkNIBFKXMDcjs.PaintExchange; exports.PaintGradientSampler = _chunkNIBFKXMDcjs.PaintGradientSampler; exports.PaintSourceError = _chunkNIBFKXMDcjs.PaintSourceError; exports.PaperGrain = _chunkNIBFKXMDcjs.PaperGrain; exports.RETOUCH_SAMPLES = _chunk62MFUHSIcjs.RETOUCH_SAMPLES; exports.RegionPixelSource = _chunk62MFUHSIcjs.RegionPixelSource; exports.RetouchDabStroke = _chunk62MFUHSIcjs.RetouchDabStroke; exports.SET_PLANES = _chunkJ5VQYK7Tcjs.SET_PLANES; exports.SLOT_BYTES = _chunkJ5VQYK7Tcjs.SLOT_BYTES; exports.SLOT_PLANES = _chunkJ5VQYK7Tcjs.SLOT_PLANES; exports.SLOT_SIDE = _chunkJ5VQYK7Tcjs.SLOT_SIDE; exports.SPOT_HEAL_TYPES = _chunk62MFUHSIcjs.SPOT_HEAL_TYPES; exports.SRGB_TO_LINEAR = _chunkJ5VQYK7Tcjs.SRGB_TO_LINEAR; exports.STRIP = _chunkJ5VQYK7Tcjs.STRIP; exports.SmudgeTip = _chunkNIBFKXMDcjs.SmudgeTip; exports.StrokeCoverage = _chunkNIBFKXMDcjs.StrokeCoverage; exports.TIP_GRADIENT_STEPS = _chunkNIBFKXMDcjs.TIP_GRADIENT_STEPS; exports.TONE_RANGES = _chunk62MFUHSIcjs.TONE_RANGES; exports.TileMedium = _chunkNIBFKXMDcjs.TileMedium; exports.TilePixelSource = _chunk62MFUHSIcjs.TilePixelSource; exports.TileableNoise = _chunk3K6HWEXZcjs.TileableNoise; exports.TransformedPixelSource = _chunk62MFUHSIcjs.TransformedPixelSource; exports.U_MAX = _chunkJ5VQYK7Tcjs.U_MAX; exports.W9 = _chunkJ5VQYK7Tcjs.W9; exports.WET_FLOW_KINDS = _chunkJ5VQYK7Tcjs.WET_FLOW_KINDS; exports.WET_PARAM_KEYS = _chunkJ5VQYK7Tcjs.WET_PARAM_KEYS; exports.WET_TILE = _chunkJ5VQYK7Tcjs.WET_TILE; exports.WGSL_HALO = _chunkJ5VQYK7Tcjs.WGSL_HALO; exports.WGSL_SHADE = _chunkJ5VQYK7Tcjs.WGSL_SHADE; exports.WGSL_STEP = _chunkJ5VQYK7Tcjs.WGSL_STEP; exports.WetGpuEngine = _chunkJ5VQYK7Tcjs.WetGpuEngine; exports.WetMedium = _chunkJ5VQYK7Tcjs.WetMedium; exports.WetWorkerPool = _chunkJ5VQYK7Tcjs.WetWorkerPool; exports.WetWorld = _chunkJ5VQYK7Tcjs.WetWorld; exports.WetWorldError = _chunkJ5VQYK7Tcjs.WetWorldError; exports.addPaintGradientStop = _chunkNIBFKXMDcjs.addPaintGradientStop; exports.applyRetouchToTile = _chunk62MFUHSIcjs.applyRetouchToTile; exports.applyStrokeToDeepTile = _chunkNIBFKXMDcjs.applyStrokeToDeepTile; exports.applyStrokeToTile = _chunkNIBFKXMDcjs.applyStrokeToTile; exports.applyToneToDeepTile = _chunk62MFUHSIcjs.applyToneToDeepTile; exports.bestOffset = _chunkBB6TR422cjs.bestOffset; exports.blendRadius = _chunkNIBFKXMDcjs.blendRadius; exports.blenderDab = _chunkNIBFKXMDcjs.blenderDab; exports.boxBlurPixels = _chunk62MFUHSIcjs.boxBlurPixels; exports.brushstrokeDataUrl = _chunkSTLTOISWcjs.brushstrokeDataUrl; exports.brushstrokeKey = _chunkSTLTOISWcjs.brushstrokeKey; exports.brushstrokeSamples = _chunkSTLTOISWcjs.brushstrokeSamples; exports.brushstrokeScaleBucket = _chunkYQGCPL5Xcjs.brushstrokeScaleBucket; exports.brushstrokeStrokeOptions = _chunkSTLTOISWcjs.brushstrokeStrokeOptions; exports.brushstrokeToCanvas = _chunkSTLTOISWcjs.brushstrokeToCanvas; exports.canShareMemory = _chunkJ5VQYK7Tcjs.canShareMemory; exports.cleanMixer = _chunkNIBFKXMDcjs.cleanMixer; exports.cloneSamplePoint = _chunk62MFUHSIcjs.cloneSamplePoint; exports.contentAwareFill = _chunkBB6TR422cjs.contentAwareFill; exports.coverageTileCoord = _chunkNIBFKXMDcjs.coverageTileCoord; exports.createBlenderScratch = _chunkNIBFKXMDcjs.createBlenderScratch; exports.createPigment = _chunk2VX55NFMcjs.createPigment; exports.createPigmentTools = _chunk62MFUHSIcjs.createPigmentTools; exports.createWetGpuEngine = _chunkJ5VQYK7Tcjs.createWetGpuEngine; exports.dabCoverage = _chunkNIBFKXMDcjs.dabCoverage; exports.dabRect = _chunkNIBFKXMDcjs.dabRect; exports.dexp = _chunkJ5VQYK7Tcjs.dexp; exports.dilateMask = _chunkBB6TR422cjs.dilateMask; exports.dlog = _chunkJ5VQYK7Tcjs.dlog; exports.dodgeBurn = _chunk62MFUHSIcjs.dodgeBurn; exports.dodgeBurnCurve = _chunk62MFUHSIcjs.dodgeBurnCurve; exports.dpow = _chunkJ5VQYK7Tcjs.dpow; exports.dsincos = _chunkJ5VQYK7Tcjs.dsincos; exports.edgeBits = _chunkJ5VQYK7Tcjs.edgeBits; exports.exchangeRates = _chunkNIBFKXMDcjs.exchangeRates; exports.expNeg = _chunkJ5VQYK7Tcjs.expNeg; exports.filmPixel = _chunkJ5VQYK7Tcjs.filmPixel; exports.filmReflectance = _chunkJ5VQYK7Tcjs.filmReflectance; exports.findWebGpu = _chunkJ5VQYK7Tcjs.findWebGpu; exports.flowField = _chunkJ5VQYK7Tcjs.flowField; exports.gradientDabColor = _chunkNIBFKXMDcjs.gradientDabColor; exports.grainCatch = _chunkNIBFKXMDcjs.grainCatch; exports.grainHeights = _chunkNIBFKXMDcjs.grainHeights; exports.hash2 = _chunk3K6HWEXZcjs.hash2; exports.healPixels = _chunk62MFUHSIcjs.healPixels; exports.hexToPaintRgb = _chunkNIBFKXMDcjs.hexToPaintRgb; exports.isBrushstrokeBrush = _chunkSTLTOISWcjs.isBrushstrokeBrush; exports.isGradientPaint = _chunkNIBFKXMDcjs.isGradientPaint; exports.isIdentityCloneTransform = _chunk62MFUHSIcjs.isIdentityCloneTransform; exports.latticeViscosity = _chunkJ5VQYK7Tcjs.latticeViscosity; exports.lerpPigment = _chunk2VX55NFMcjs.lerpPigment; exports.lerpPigmentInto = _chunk2VX55NFMcjs.lerpPigmentInto; exports.linearToSrgb8 = _chunkJ5VQYK7Tcjs.linearToSrgb8; exports.loadMixer = _chunkNIBFKXMDcjs.loadMixer; exports.loadWetKernel = _chunkJ5VQYK7Tcjs.loadWetKernel; exports.luma = _chunk62MFUHSIcjs.luma; exports.maskBounds = _chunkBB6TR422cjs.maskBounds; exports.membraneFill = _chunkBB6TR422cjs.membraneFill; exports.mix32 = _chunk3K6HWEXZcjs.mix32; exports.mixPigments = _chunk2VX55NFMcjs.mixPigments; exports.mixerRates = _chunkNIBFKXMDcjs.mixerRates; exports.moveWetSnapshot = _chunkJ5VQYK7Tcjs.moveWetSnapshot; exports.normalizeBlender = _chunkNIBFKXMDcjs.normalizeBlender; exports.normalizeBrush = _chunkNIBFKXMDcjs.normalizeBrush; exports.normalizeFlow = _chunkJ5VQYK7Tcjs.normalizeFlow; exports.normalizeHexColor = _chunkNIBFKXMDcjs.normalizeHexColor; exports.normalizeMixer = _chunkNIBFKXMDcjs.normalizeMixer; exports.normalizeRetouch = _chunk62MFUHSIcjs.normalizeRetouch; exports.normalizeSmudge = _chunkNIBFKXMDcjs.normalizeSmudge; exports.normalizeTilt = _chunkJ5VQYK7Tcjs.normalizeTilt; exports.normalizeWetParams = _chunkJ5VQYK7Tcjs.normalizeWetParams; exports.packWetParams = _chunkJ5VQYK7Tcjs.packWetParams; exports.paintGradientMappingFor = _chunkNIBFKXMDcjs.paintGradientMappingFor; exports.paintPathStroke = _chunkSTLTOISWcjs.paintPathStroke; exports.paintSourceColor = _chunkNIBFKXMDcjs.paintSourceColor; exports.paintSourceCss = _chunkNIBFKXMDcjs.paintSourceCss; exports.parsePaintSource = _chunkNIBFKXMDcjs.parsePaintSource; exports.pathStrokeCoverage = _chunkSTLTOISWcjs.pathStrokeCoverage; exports.pathStrokeDabs = _chunkSTLTOISWcjs.pathStrokeDabs; exports.perDabStrength = _chunk62MFUHSIcjs.perDabStrength; exports.pigmentColor = _chunkJ5VQYK7Tcjs.pigmentColor; exports.pigmentOf = _chunkJ5VQYK7Tcjs.pigmentOf; exports.pixelPigment = _chunkJ5VQYK7Tcjs.pixelPigment; exports.pointerPressure = _chunk62MFUHSIcjs.pointerPressure; exports.pointerStrokeSample = _chunk62MFUHSIcjs.pointerStrokeSample; exports.pointerStrokeSamples = _chunk62MFUHSIcjs.pointerStrokeSamples; exports.put255 = _chunkNIBFKXMDcjs.put255; exports.rand01 = _chunk3K6HWEXZcjs.rand01; exports.randSigned = _chunk3K6HWEXZcjs.randSigned; exports.rasterizeDab = _chunkNIBFKXMDcjs.rasterizeDab; exports.readPaintSource = _chunkNIBFKXMDcjs.readPaintSource; exports.readSourceRegion = _chunk62MFUHSIcjs.readSourceRegion; exports.reflectanceToRgb = _chunk2VX55NFMcjs.reflectanceToRgb; exports.removePaintGradientStop = _chunkNIBFKXMDcjs.removePaintGradientStop; exports.renderBrushstroke = _chunkSTLTOISWcjs.renderBrushstroke; exports.resolvePaintGradient = _chunkNIBFKXMDcjs.resolvePaintGradient; exports.retouchFilter = _chunk62MFUHSIcjs.retouchFilter; exports.reversePaintGradient = _chunkNIBFKXMDcjs.reversePaintGradient; exports.rgbToReflectance = _chunk2VX55NFMcjs.rgbToReflectance; exports.rgbaViewOfGrey = _chunk62MFUHSIcjs.rgbaViewOfGrey; exports.saturationOf = _chunk62MFUHSIcjs.saturationOf; exports.scalePaintGradient = _chunkNIBFKXMDcjs.scalePaintGradient; exports.seamlessClone = _chunkBB6TR422cjs.seamlessClone; exports.seedFromString = _chunk3K6HWEXZcjs.seedFromString; exports.setPigmentColor = _chunk2VX55NFMcjs.setPigmentColor; exports.shadeLightTile = _chunkJ5VQYK7Tcjs.shadeLightTile; exports.shadeTile = _chunkJ5VQYK7Tcjs.shadeTile; exports.smoothPoints = _chunkNIBFKXMDcjs.smoothPoints; exports.smudgeEffect = _chunk62MFUHSIcjs.smudgeEffect; exports.solidPaint = _chunkNIBFKXMDcjs.solidPaint; exports.solveMembrane = _chunkBB6TR422cjs.solveMembrane; exports.sponge = _chunk62MFUHSIcjs.sponge; exports.spongeEffect = _chunk62MFUHSIcjs.spongeEffect; exports.spotHealPixels = _chunk62MFUHSIcjs.spotHealPixels; exports.spotHealWindow = _chunk62MFUHSIcjs.spotHealWindow; exports.srgbByteToLinear = _chunkJ5VQYK7Tcjs.srgbByteToLinear; exports.stepSlotTs = _chunkJ5VQYK7Tcjs.stepSlotTs; exports.strokeGrainCatch = _chunkNIBFKXMDcjs.strokeGrainCatch; exports.tipFalloff = _chunkNIBFKXMDcjs.tipFalloff; exports.tipReach = _chunkNIBFKXMDcjs.tipReach; exports.tipShape = _chunkNIBFKXMDcjs.tipShape; exports.toneOf = _chunk62MFUHSIcjs.toneOf; exports.updatePaintGradientStop = _chunkNIBFKXMDcjs.updatePaintGradientStop; exports.walkDabs = _chunkNIBFKXMDcjs.walkDabs; exports.wetGpuSupport = _chunkJ5VQYK7Tcjs.wetGpuSupport; exports.wetSimdSupported = _chunkJ5VQYK7Tcjs.wetSimdSupported; exports.wetSupport = _chunkJ5VQYK7Tcjs.wetSupport;
@@ -33,7 +33,7 @@ import {
33
33
  spotHealPixels,
34
34
  spotHealWindow,
35
35
  toneOf
36
- } from "../chunk-7UKFXXWL.js";
36
+ } from "../chunk-HVO6XCI4.js";
37
37
  import {
38
38
  bestOffset,
39
39
  contentAwareFill,
@@ -137,23 +137,17 @@ import {
137
137
  } from "../chunk-GSTSZPSR.js";
138
138
  import {
139
139
  BrushstrokeCache,
140
- GRAIN_PATTERNS,
141
- GRAIN_TILE,
142
- PaperGrain,
143
140
  brushstrokeDataUrl,
144
141
  brushstrokeKey,
145
142
  brushstrokeSamples,
146
143
  brushstrokeStrokeOptions,
147
144
  brushstrokeToCanvas,
148
- grainCatch,
149
- grainHeights,
150
145
  isBrushstrokeBrush,
151
146
  paintPathStroke,
152
147
  pathStrokeCoverage,
153
148
  pathStrokeDabs,
154
- renderBrushstroke,
155
- strokeGrainCatch
156
- } from "../chunk-TXFWZ5ZJ.js";
149
+ renderBrushstroke
150
+ } from "../chunk-W6JDUXP3.js";
157
151
  import {
158
152
  CoverageMap,
159
153
  DEFAULT_BLENDER,
@@ -164,6 +158,8 @@ import {
164
158
  DEFAULT_SMUDGE,
165
159
  DabWalker,
166
160
  EMPTY_MIXER_LOAD,
161
+ GRAIN_PATTERNS,
162
+ GRAIN_TILE,
167
163
  MAX_BRUSH_SIZE,
168
164
  MIXER_DRAIN,
169
165
  MIXER_PICKUP_RATE,
@@ -184,6 +180,7 @@ import {
184
180
  PaintExchange,
185
181
  PaintGradientSampler,
186
182
  PaintSourceError,
183
+ PaperGrain,
187
184
  SmudgeTip,
188
185
  StrokeCoverage,
189
186
  TIP_GRADIENT_STEPS,
@@ -200,6 +197,8 @@ import {
200
197
  dabRect,
201
198
  exchangeRates,
202
199
  gradientDabColor,
200
+ grainCatch,
201
+ grainHeights,
203
202
  hexToPaintRgb,
204
203
  isGradientPaint,
205
204
  loadMixer,
@@ -222,12 +221,13 @@ import {
222
221
  scalePaintGradient,
223
222
  smoothPoints,
224
223
  solidPaint,
224
+ strokeGrainCatch,
225
225
  tipFalloff,
226
226
  tipReach,
227
227
  tipShape,
228
228
  updatePaintGradientStop,
229
229
  walkDabs
230
- } from "../chunk-GCVFEPJG.js";
230
+ } from "../chunk-ACTHSQOI.js";
231
231
  import {
232
232
  TileableNoise,
233
233
  hash2,
@@ -241,7 +241,6 @@ import {
241
241
  BRUSHSTROKE_MIN_SCALE,
242
242
  brushstrokeScaleBucket
243
243
  } from "../chunk-ODBT55Q7.js";
244
- import "../chunk-OTTT5N3K.js";
245
244
  import {
246
245
  PIGMENT_BANDS,
247
246
  PIGMENT_LAMBDA_MIN,
@@ -255,6 +254,7 @@ import {
255
254
  rgbToReflectance,
256
255
  setPigmentColor
257
256
  } from "../chunk-IRSTHLQQ.js";
257
+ import "../chunk-OTTT5N3K.js";
258
258
  import "../chunk-HVVR5PZW.js";
259
259
  import "../chunk-QGHEDC7B.js";
260
260
  export {
@@ -2,17 +2,27 @@
2
2
  * The shared brush library's agent tools for a paint editor (`createPaintBrushLibraryToolProvider`),
3
3
  * with `preview_brush` painted by this editor.
4
4
  */
5
+ import type { BrushLibrary } from '../brushes/library.cjs';
6
+ import type { StickerArtLookup } from './sticker-art.cjs';
5
7
  import { type BrushLibraryToolProviderOptions, type BrushPreviewRenderer } from '../brushes/tools.cjs';
6
8
  import type { AgentToolProvider } from '../tools/registry.cjs';
7
9
  import type { PaintEditorController } from './controller.cjs';
8
10
  import { type PaperSettings } from './paper.cjs';
9
11
  export type PaintBrushLibraryToolProviderOptions = Omit<BrushLibraryToolProviderOptions, 'renderPreview'>;
12
+ /** Where a preview renderer finds a brush's image sources (and sticker art). */
13
+ export interface PaintBrushPreviewOptions {
14
+ /** Image sources are read from this library before each preview that needs them. */
15
+ library?: Pick<BrushLibrary, 'getSource'>;
16
+ /** Art for sticker stamp tips (and anything else not in the library), read on every call. */
17
+ stampArt?: () => StickerArtLookup | undefined;
18
+ }
10
19
  /**
11
20
  * A brush preview renderer (`BrushPreviewRenderer`, as `preview_brush` and `BrushLibraryEditor`
12
21
  * take) that paints the test stroke with the paint engine on `paper` (read on every call; default
13
- * the default paper). Any brush the paint editor renders, so also the image editor's.
22
+ * the default paper). Any brush the paint editor renders, so also the image editor's. With
23
+ * `options.library`, image tips and image grain are drawn from its sources.
14
24
  */
15
- export declare function paintBrushPreviewRenderer(paper?: () => PaperSettings): BrushPreviewRenderer;
25
+ export declare function paintBrushPreviewRenderer(paper?: () => PaperSettings, options?: PaintBrushPreviewOptions): BrushPreviewRenderer;
16
26
  /**
17
27
  * The brush library tools for a paint editor (`@pixerate/editor/brushes`' provider on the
18
28
  * editor's `brushLibrary`, `PAINT_PROFILE`), with `preview_brush` painting the test stroke on the
@@ -2,17 +2,27 @@
2
2
  * The shared brush library's agent tools for a paint editor (`createPaintBrushLibraryToolProvider`),
3
3
  * with `preview_brush` painted by this editor.
4
4
  */
5
+ import type { BrushLibrary } from '../brushes/library.js';
6
+ import type { StickerArtLookup } from './sticker-art.js';
5
7
  import { type BrushLibraryToolProviderOptions, type BrushPreviewRenderer } from '../brushes/tools.js';
6
8
  import type { AgentToolProvider } from '../tools/registry.js';
7
9
  import type { PaintEditorController } from './controller.js';
8
10
  import { type PaperSettings } from './paper.js';
9
11
  export type PaintBrushLibraryToolProviderOptions = Omit<BrushLibraryToolProviderOptions, 'renderPreview'>;
12
+ /** Where a preview renderer finds a brush's image sources (and sticker art). */
13
+ export interface PaintBrushPreviewOptions {
14
+ /** Image sources are read from this library before each preview that needs them. */
15
+ library?: Pick<BrushLibrary, 'getSource'>;
16
+ /** Art for sticker stamp tips (and anything else not in the library), read on every call. */
17
+ stampArt?: () => StickerArtLookup | undefined;
18
+ }
10
19
  /**
11
20
  * A brush preview renderer (`BrushPreviewRenderer`, as `preview_brush` and `BrushLibraryEditor`
12
21
  * take) that paints the test stroke with the paint engine on `paper` (read on every call; default
13
- * the default paper). Any brush the paint editor renders, so also the image editor's.
22
+ * the default paper). Any brush the paint editor renders, so also the image editor's. With
23
+ * `options.library`, image tips and image grain are drawn from its sources.
14
24
  */
15
- export declare function paintBrushPreviewRenderer(paper?: () => PaperSettings): BrushPreviewRenderer;
25
+ export declare function paintBrushPreviewRenderer(paper?: () => PaperSettings, options?: PaintBrushPreviewOptions): BrushPreviewRenderer;
16
26
  /**
17
27
  * The brush library tools for a paint editor (`@pixerate/editor/brushes`' provider on the
18
28
  * editor's `brushLibrary`, `PAINT_PROFILE`), with `preview_brush` painting the test stroke on the
@@ -156,7 +156,31 @@ export interface BrushDynamics {
156
156
  opacityJitter: number;
157
157
  /** Random offset across the stroke in diameters, 0..4 (default 0). */
158
158
  scatter: number;
159
+ /** Dabs laid at each spacing step, 1..16, each with its own jitter (missing: 1). */
160
+ count?: number;
161
+ /** Mirror each dab at random across these axes (missing: `none`). */
162
+ flip?: DabFlip;
159
163
  }
164
+ /** Random mirroring of dabs. */
165
+ export type DabFlip = 'none' | 'x' | 'y' | 'xy';
166
+ export declare const DAB_FLIPS: readonly DabFlip[];
167
+ export type TipGrainMode = 'moving' | 'texturised';
168
+ export declare const TIP_GRAIN_MODES: readonly TipGrainMode[];
169
+ /** Texture inside the tip (dab engines): each dab's coverage is multiplied by it. */
170
+ export interface TipGrainSettings {
171
+ /** A grain pattern (`rough`, `canvas`…) or an image source `source:<id>`. */
172
+ source: string;
173
+ /** `texturised` (default): fixed to the canvas; `moving`: rolls along with the tip. */
174
+ mode: TipGrainMode;
175
+ /** 0.05..20: 1 the source's own size (default 1). */
176
+ scale: number;
177
+ /** 0..1: how much it takes out of the dab (default 0.6). */
178
+ depth: number;
179
+ /** 0..3 around the middle (default 1). */
180
+ contrast: number;
181
+ invert: boolean;
182
+ }
183
+ export declare const DEFAULT_TIP_GRAIN: Readonly<Omit<TipGrainSettings, 'source'>>;
160
184
  export declare const DEFAULT_DYNAMICS: Readonly<BrushDynamics>;
161
185
  export interface PaintBrush {
162
186
  /** Library id (lowercase letters, digits and dashes). */
@@ -202,6 +226,8 @@ export interface PaintBrush {
202
226
  stamp: string | null;
203
227
  /** Dab engine: spray marks. Each dab lays a seeded scatter of droplets across the tip; `null` (default): one mark per dab. */
204
228
  spray: SpraySettings | null;
229
+ /** Dab engines: texture inside the tip (missing: none). Recorded with the stroke, source ref included, so replays match. */
230
+ tipGrain?: TipGrainSettings;
205
231
  /**
206
232
  * The brush's own gradient paint (`@pixerate/editor/paint` `PaintGradientSource`), used instead
207
233
  * of the editor's paint; `null` (default): the editor's paint. Stops may be `paint` / `secondary`
@@ -228,8 +254,10 @@ export interface SpraySettings {
228
254
  size: number;
229
255
  }
230
256
  export declare const DEFAULT_SPRAY: Readonly<SpraySettings>;
231
- export type PaintBrushInput = Partial<Omit<PaintBrush, 'tip' | 'dynamics' | 'mixer' | 'behavior' | 'blender' | 'smudge' | 'wet' | 'impasto' | 'particle' | 'bristle' | 'sticker' | 'paint' | 'light' | 'spray'>> & {
257
+ export type PaintBrushInput = Partial<Omit<PaintBrush, 'tip' | 'dynamics' | 'mixer' | 'behavior' | 'blender' | 'smudge' | 'wet' | 'impasto' | 'particle' | 'bristle' | 'sticker' | 'paint' | 'light' | 'spray' | 'tipGrain'>> & {
232
258
  spray?: Partial<SpraySettings> | null;
259
+ /** Tip grain (`null` removes it). */
260
+ tipGrain?: Partial<TipGrainSettings> | null;
233
261
  light?: Partial<LightSettings>;
234
262
  /** A gradient (or `null` for the editor's paint); a plain colour source clears it. */
235
263
  paint?: PaintSource | null;
@@ -156,7 +156,31 @@ export interface BrushDynamics {
156
156
  opacityJitter: number;
157
157
  /** Random offset across the stroke in diameters, 0..4 (default 0). */
158
158
  scatter: number;
159
+ /** Dabs laid at each spacing step, 1..16, each with its own jitter (missing: 1). */
160
+ count?: number;
161
+ /** Mirror each dab at random across these axes (missing: `none`). */
162
+ flip?: DabFlip;
159
163
  }
164
+ /** Random mirroring of dabs. */
165
+ export type DabFlip = 'none' | 'x' | 'y' | 'xy';
166
+ export declare const DAB_FLIPS: readonly DabFlip[];
167
+ export type TipGrainMode = 'moving' | 'texturised';
168
+ export declare const TIP_GRAIN_MODES: readonly TipGrainMode[];
169
+ /** Texture inside the tip (dab engines): each dab's coverage is multiplied by it. */
170
+ export interface TipGrainSettings {
171
+ /** A grain pattern (`rough`, `canvas`…) or an image source `source:<id>`. */
172
+ source: string;
173
+ /** `texturised` (default): fixed to the canvas; `moving`: rolls along with the tip. */
174
+ mode: TipGrainMode;
175
+ /** 0.05..20: 1 the source's own size (default 1). */
176
+ scale: number;
177
+ /** 0..1: how much it takes out of the dab (default 0.6). */
178
+ depth: number;
179
+ /** 0..3 around the middle (default 1). */
180
+ contrast: number;
181
+ invert: boolean;
182
+ }
183
+ export declare const DEFAULT_TIP_GRAIN: Readonly<Omit<TipGrainSettings, 'source'>>;
160
184
  export declare const DEFAULT_DYNAMICS: Readonly<BrushDynamics>;
161
185
  export interface PaintBrush {
162
186
  /** Library id (lowercase letters, digits and dashes). */
@@ -202,6 +226,8 @@ export interface PaintBrush {
202
226
  stamp: string | null;
203
227
  /** Dab engine: spray marks. Each dab lays a seeded scatter of droplets across the tip; `null` (default): one mark per dab. */
204
228
  spray: SpraySettings | null;
229
+ /** Dab engines: texture inside the tip (missing: none). Recorded with the stroke, source ref included, so replays match. */
230
+ tipGrain?: TipGrainSettings;
205
231
  /**
206
232
  * The brush's own gradient paint (`@pixerate/editor/paint` `PaintGradientSource`), used instead
207
233
  * of the editor's paint; `null` (default): the editor's paint. Stops may be `paint` / `secondary`
@@ -228,8 +254,10 @@ export interface SpraySettings {
228
254
  size: number;
229
255
  }
230
256
  export declare const DEFAULT_SPRAY: Readonly<SpraySettings>;
231
- export type PaintBrushInput = Partial<Omit<PaintBrush, 'tip' | 'dynamics' | 'mixer' | 'behavior' | 'blender' | 'smudge' | 'wet' | 'impasto' | 'particle' | 'bristle' | 'sticker' | 'paint' | 'light' | 'spray'>> & {
257
+ export type PaintBrushInput = Partial<Omit<PaintBrush, 'tip' | 'dynamics' | 'mixer' | 'behavior' | 'blender' | 'smudge' | 'wet' | 'impasto' | 'particle' | 'bristle' | 'sticker' | 'paint' | 'light' | 'spray' | 'tipGrain'>> & {
232
258
  spray?: Partial<SpraySettings> | null;
259
+ /** Tip grain (`null` removes it). */
260
+ tipGrain?: Partial<TipGrainSettings> | null;
233
261
  light?: Partial<LightSettings>;
234
262
  /** A gradient (or `null` for the editor's paint); a plain colour source clears it. */
235
263
  paint?: PaintSource | null;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Brush sources the paint engine can draw with: the brush library's and the open painting's, by
3
+ * id. Strokes read them synchronously, as they read sticker art (`StickerArtLookup`): a stamp tip
4
+ * `source:<id>` and an image tip grain both take the source's mask as alpha. Each mask is decoded
5
+ * the first time it is drawn.
6
+ */
7
+ import { type BrushSource } from '../brushes/sources.cjs';
8
+ import type { StickerArtLookup } from './sticker-art.cjs';
9
+ export declare class BrushSourceArtCache {
10
+ private readonly sources;
11
+ private readonly art;
12
+ /** Adds or replaces sources (a replaced image is decoded again). */
13
+ set(sources: Iterable<BrushSource>): void;
14
+ /** The source of an id, if known. */
15
+ source(id: string): BrushSource | undefined;
16
+ /** Every known source. */
17
+ all(): BrushSource[];
18
+ /** The art of a `source:<id>` ref (alpha = the mask), or `undefined` when the source is unknown or its image can't be read. */
19
+ get: StickerArtLookup;
20
+ /** A lookup that reads sources from here and every other ref from `stickers`. */
21
+ with(stickers: StickerArtLookup): StickerArtLookup;
22
+ }
23
+ /** The ids of the sources an engine brush draws with: its stamp tip, its tip grain and its particle stamps. */
24
+ export declare function engineBrushSourceIds(brush: {
25
+ stamp: string | null;
26
+ tipGrain?: {
27
+ source: string;
28
+ };
29
+ particle?: {
30
+ dotTextures: readonly string[];
31
+ };
32
+ }): string[];
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Brush sources the paint engine can draw with: the brush library's and the open painting's, by
3
+ * id. Strokes read them synchronously, as they read sticker art (`StickerArtLookup`): a stamp tip
4
+ * `source:<id>` and an image tip grain both take the source's mask as alpha. Each mask is decoded
5
+ * the first time it is drawn.
6
+ */
7
+ import { type BrushSource } from '../brushes/sources.js';
8
+ import type { StickerArtLookup } from './sticker-art.js';
9
+ export declare class BrushSourceArtCache {
10
+ private readonly sources;
11
+ private readonly art;
12
+ /** Adds or replaces sources (a replaced image is decoded again). */
13
+ set(sources: Iterable<BrushSource>): void;
14
+ /** The source of an id, if known. */
15
+ source(id: string): BrushSource | undefined;
16
+ /** Every known source. */
17
+ all(): BrushSource[];
18
+ /** The art of a `source:<id>` ref (alpha = the mask), or `undefined` when the source is unknown or its image can't be read. */
19
+ get: StickerArtLookup;
20
+ /** A lookup that reads sources from here and every other ref from `stickers`. */
21
+ with(stickers: StickerArtLookup): StickerArtLookup;
22
+ }
23
+ /** The ids of the sources an engine brush draws with: its stamp tip, its tip grain and its particle stamps. */
24
+ export declare function engineBrushSourceIds(brush: {
25
+ stamp: string | null;
26
+ tipGrain?: {
27
+ source: string;
28
+ };
29
+ particle?: {
30
+ dotTextures: readonly string[];
31
+ };
32
+ }): string[];
@@ -39,7 +39,8 @@ import { type PaintGuides, type PerspectiveGuide, type ReferenceImage, type Symm
39
39
  import { MixingPad, type MixingPadTool, type PadMixOptions } from './mixing-pad.cjs';
40
40
  import { type Stencil, type StencilInput } from './stencils.cjs';
41
41
  import { type Sticker } from './stickers.cjs';
42
- import { type StickerRasterizer } from './sticker-art.cjs';
42
+ import { type StickerArtLookup, type StickerRasterizer } from './sticker-art.cjs';
43
+ import { BrushSourceArtCache } from './brush-source-art.cjs';
43
44
  import { StickersSlot } from '../stickers/helpers.cjs';
44
45
  import type { StickerProvider, StickerRef } from '../stickers/types.cjs';
45
46
  import { type LightSpill } from './light.cjs';
@@ -445,6 +446,10 @@ export declare class PaintEditorController {
445
446
  /** The sticker library slot (see `setStickersProvider`). */
446
447
  readonly stickers: StickersSlot;
447
448
  private readonly stickerArt;
449
+ /** Image sources strokes draw with: the brush library's and the open painting's (saved with it). */
450
+ readonly brushSources: BrushSourceArtCache;
451
+ /** Art for stamp tips and tip grain: image sources from `brushSources`, stickers from the sticker library. */
452
+ readonly stampArt: StickerArtLookup;
448
453
  private readonly rasterizeSticker;
449
454
  private readonly effectsRenderer;
450
455
  private paperEffectNodeCache;