@pixerate/editor 0.103.0 → 0.104.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.
@@ -517,6 +517,8 @@ interface StrokeSessionInit {
517
517
  /** The stroke's extra copies as affine maps (recorded with the stroke); `copies` holds all of them as engine copies. */
518
518
  affineCopies: readonly Affine[];
519
519
  copies: readonly StrokeCopy[];
520
+ /** Applied to each raw sample before it is painted and recorded (perspective snapping). */
521
+ inputFilter?: (p: PenPoint) => PenPoint;
520
522
  /** Mixer engine: the brush load at the start of the stroke. */
521
523
  mixerLoad: MixerLoad;
522
524
  }
@@ -657,6 +659,9 @@ interface SerializeOptions {
657
659
  strokes?: boolean;
658
660
  /** Later-phase fields to write as they were read. */
659
661
  extensions?: PaintDocumentExtensions;
662
+ /** Painting guides (symmetry, perspective, tracing and reference images as PNG data URLs). */
663
+ guides?: unknown;
664
+ swatches?: unknown;
660
665
  }
661
666
  /** The document as JSON with inline PNG data URLs. */
662
667
  declare function serializePaintDocument(state: PaintDocumentState, options?: SerializeOptions): SerializedPaintDocument;
@@ -665,6 +670,9 @@ declare function serializePaintDocumentExternal(state: PaintDocumentState, store
665
670
  interface LoadedPaintDocument {
666
671
  state: PaintDocumentState;
667
672
  extensions: PaintDocumentExtensions;
673
+ /** The saved guides and swatches, as stored (the controller validates them). */
674
+ guides?: unknown;
675
+ swatches?: unknown;
668
676
  /** What could not be read (the rest still loads). */
669
677
  problems: string[];
670
678
  }
@@ -837,6 +845,213 @@ declare function renderBrushThumbnail(brush: PaintBrush, options: {
837
845
  color: string;
838
846
  }): BrushThumbnail;
839
847
 
848
+ /**
849
+ * Painting guides: mirror and kaleidoscope symmetry (every stroke paints its reflected or rotated
850
+ * copies as one stroke), perspective guides with one to three vanishing points that strokes snap
851
+ * to, a tracing image under the paint (optionally the source of the stroke colour), and floating
852
+ * reference images to pick colours from. Geometry only: no pixels, no DOM.
853
+ */
854
+
855
+ type SymmetryMode = 'off' | 'vertical' | 'horizontal' | 'dual' | 'diagonal' | 'kaleidoscope';
856
+ declare const SYMMETRY_MODES: readonly SymmetryMode[];
857
+ interface SymmetryGuide {
858
+ mode: SymmetryMode;
859
+ /** Centre of the axes in document pixels (default the canvas centre). */
860
+ center: {
861
+ x: number;
862
+ y: number;
863
+ };
864
+ /** Turns the axes, degrees clockwise (default 0). */
865
+ rotation: number;
866
+ /** Kaleidoscope: number of segments, 2..32 (default 6). */
867
+ segments: number;
868
+ /** Kaleidoscope: reflect every other segment as well as rotating (default true), like a real kaleidoscope. */
869
+ mirror: boolean;
870
+ }
871
+ interface Point2 {
872
+ x: number;
873
+ y: number;
874
+ }
875
+ interface PerspectiveGuide {
876
+ enabled: boolean;
877
+ /** One to three vanishing points in document pixels (they may lie outside the canvas). */
878
+ points: Point2[];
879
+ /** Strokes snap to the guide lines (default true when enabled). */
880
+ snap: boolean;
881
+ }
882
+ /** A view-only image under the paint, placed over the canvas. */
883
+ interface TracingImage {
884
+ /** PNG or JPEG data URL. */
885
+ src: string;
886
+ /** Natural size of the image in pixels. */
887
+ width: number;
888
+ height: number;
889
+ /** Where it is drawn, in document pixels (default: fitted to the canvas). */
890
+ rect: {
891
+ x: number;
892
+ y: number;
893
+ width: number;
894
+ height: number;
895
+ };
896
+ /** 0..1 (default 0.35). */
897
+ opacity: number;
898
+ visible: boolean;
899
+ /** Strokes without an explicit colour take the tracing image's colour where they start. */
900
+ sampleColors: boolean;
901
+ }
902
+ /** A floating image to look at and pick colours from (shown beside the canvas, never painted). */
903
+ interface ReferenceImage {
904
+ id: string;
905
+ name: string;
906
+ src: string;
907
+ width: number;
908
+ height: number;
909
+ /** Where the panel floats over the viewport, in screen pixels, and its displayed width. */
910
+ x: number;
911
+ y: number;
912
+ displayWidth: number;
913
+ visible: boolean;
914
+ }
915
+ interface PaintGuides {
916
+ symmetry: SymmetryGuide;
917
+ perspective: PerspectiveGuide;
918
+ tracing: TracingImage | null;
919
+ references: ReferenceImage[];
920
+ }
921
+ declare function defaultGuides(canvas: {
922
+ width: number;
923
+ height: number;
924
+ }): PaintGuides;
925
+ declare const MAX_COORDINATE = 1000000;
926
+ declare function normalizeSymmetry(raw: Partial<SymmetryGuide> | Record<string, unknown>, base: SymmetryGuide): SymmetryGuide;
927
+ /** The axis directions of a mirror mode (radians), as photocraft's `directions`. */
928
+ declare function symmetryAxisAngles(g: SymmetryGuide): number[];
929
+ /**
930
+ * The extra copies a stroke paints under the symmetry guide, as affine maps (the stroke itself is
931
+ * not included). Vertical, horizontal and diagonal: one reflection. Dual: two reflections and the
932
+ * point reflection. Kaleidoscope: rotations by 360°/n, and with `mirror` the reflections between them.
933
+ */
934
+ declare function symmetryCopies(g: SymmetryGuide): Affine[];
935
+ /** The axes clipped to the canvas, for drawing (photocraft's `segments`). */
936
+ declare function symmetryAxisSegments(g: SymmetryGuide, size: {
937
+ width: number;
938
+ height: number;
939
+ }): Array<[Point2, Point2]>;
940
+ declare function normalizePerspective(raw: Partial<PerspectiveGuide> | Record<string, unknown>, base: PerspectiveGuide): PerspectiveGuide;
941
+ /** The line families a perspective guide snaps to at `p`: unit directions. */
942
+ declare function perspectiveDirections(g: PerspectiveGuide, p: Point2): Point2[];
943
+ /** How far the pen must move before a stroke chooses its perspective line (document pixels). */
944
+ declare const SNAP_DECIDE_DISTANCE = 6;
945
+ /**
946
+ * Snaps one stroke to a perspective guide: once the pen has moved `SNAP_DECIDE_DISTANCE` from
947
+ * where it started, the stroke picks the guide line through its start that best matches its
948
+ * direction, and every sample after that is projected onto the line.
949
+ */
950
+ declare class PerspectiveSnapper {
951
+ private readonly guide;
952
+ private start;
953
+ private dir;
954
+ constructor(guide: PerspectiveGuide);
955
+ /** The line the stroke follows, once chosen. */
956
+ get line(): {
957
+ from: Point2;
958
+ direction: Point2;
959
+ } | null;
960
+ snap<P extends Point2>(p: P): P;
961
+ }
962
+ /** Guide lines to draw for a perspective guide: rays from each vanishing point through the canvas. */
963
+ declare function perspectiveGuideLines(g: PerspectiveGuide, size: {
964
+ width: number;
965
+ height: number;
966
+ }, count?: number): Array<[Point2, Point2]>;
967
+
968
+ /**
969
+ * Colour for painters: hex / RGB / HSV / HSL conversions, a colour wheel that is either the
970
+ * painter's red-yellow-blue wheel (where red's complement is green) or the RGB wheel (where it is
971
+ * cyan), harmonies on it, and swatches.
972
+ */
973
+ type Rgb255 = [number, number, number];
974
+ declare function parseHexColor(value: unknown, what?: string): Rgb255;
975
+ declare function rgbToHexColor(r: number, g: number, b: number): string;
976
+ /** RGB 0..255 → HSV with h in degrees 0..360, s and v 0..1. */
977
+ declare function rgbToHsv(r: number, g: number, b: number): {
978
+ h: number;
979
+ s: number;
980
+ v: number;
981
+ };
982
+ declare function hsvToRgb(h: number, s: number, v: number): Rgb255;
983
+ /** RGB 0..255 → HSL with h in degrees, s and l 0..1. */
984
+ declare function rgbToHsl(r: number, g: number, b: number): {
985
+ h: number;
986
+ s: number;
987
+ l: number;
988
+ };
989
+ declare function hslToRgb(h: number, s: number, l: number): Rgb255;
990
+ /** Which wheel hues live on: `ryb` (painter's: red ↔ green complements) or `rgb` (red ↔ cyan). */
991
+ type ColorWheel = 'ryb' | 'rgb';
992
+ /** A wheel angle (degrees) → an RGB hue. */
993
+ declare function wheelToHue(angle: number, wheel: ColorWheel): number;
994
+ /** An RGB hue → its wheel angle (degrees). */
995
+ declare function hueToWheel(hue: number, wheel: ColorWheel): number;
996
+ type HarmonyKind = 'complementary' | 'split-complementary' | 'analogous' | 'triadic' | 'tetradic' | 'square' | 'monochromatic';
997
+ declare const HARMONY_KINDS: readonly HarmonyKind[];
998
+ interface HarmonyColor {
999
+ color: string;
1000
+ /** Position on the wheel, degrees. */
1001
+ angle: number;
1002
+ }
1003
+ /**
1004
+ * The colours of a harmony around `base`, the base first. Hue-based harmonies keep the base's
1005
+ * saturation and value and turn it around the wheel; `analogous` spreads by `spread` degrees
1006
+ * (default 30); `monochromatic` keeps the hue and steps the lightness.
1007
+ */
1008
+ declare function colorHarmony(base: string, kind: HarmonyKind, options?: {
1009
+ wheel?: ColorWheel;
1010
+ spread?: number;
1011
+ }): HarmonyColor[];
1012
+ interface Swatch {
1013
+ color: string;
1014
+ name?: string;
1015
+ }
1016
+ /** A starting palette of our own generic paint colours. */
1017
+ declare const DEFAULT_SWATCHES: readonly Swatch[];
1018
+
1019
+ /**
1020
+ * The mixing pad: a small canvas beside the painting to put paint on, smear it with a palette
1021
+ * knife and pick the mixed colour from. Paint is laid with the Mixer Brush in pigment mode and the
1022
+ * knife is a pigment smudge, so blue and yellow pushed together make green. It is scratch space:
1023
+ * not part of the painting and not in its undo history.
1024
+ */
1025
+
1026
+ type MixingPadTool = 'paint' | 'knife';
1027
+ declare const MIXING_PAD_WIDTH = 360;
1028
+ declare const MIXING_PAD_HEIGHT = 220;
1029
+ declare class MixingPad {
1030
+ readonly width = 360;
1031
+ readonly height = 220;
1032
+ private surface;
1033
+ /** Increments on every change (for redrawing). */
1034
+ version: number;
1035
+ /** Paints (`paint`, with `color`) or smears (`knife`) through `points` in pad pixels. */
1036
+ stroke(points: readonly PenPoint[], options: {
1037
+ tool: MixingPadTool;
1038
+ color: string;
1039
+ size?: number;
1040
+ }): {
1041
+ bounds: {
1042
+ x: number;
1043
+ y: number;
1044
+ width: number;
1045
+ height: number;
1046
+ } | null;
1047
+ };
1048
+ /** The average colour within `radius` pixels of (x, y), or `null` where the pad is bare. */
1049
+ pick(x: number, y: number, radius?: number): string | null;
1050
+ clear(): void;
1051
+ /** The pad over white, `width × height` RGBA. */
1052
+ pixels(): Uint8ClampedArray;
1053
+ }
1054
+
840
1055
  /**
841
1056
  * `PaintEditorController`: the natural-media paint editor's state, framework-free.
842
1057
  *
@@ -887,6 +1102,12 @@ interface PaintEditorState {
887
1102
  canRedo: boolean;
888
1103
  undoLabel: string | null;
889
1104
  redoLabel: string | null;
1105
+ /** Mirror / kaleidoscope, perspective, tracing image and reference images (saved with the document, not undo steps). */
1106
+ guides: PaintGuides;
1107
+ /** The colour swatches (saved with the document, not undo steps). */
1108
+ swatches: readonly Swatch[];
1109
+ /** Changes whenever the mixing pad does. */
1110
+ mixingPadVersion: number;
890
1111
  /** A stroke is in progress. */
891
1112
  stroking: boolean;
892
1113
  /** Increments on every change. */
@@ -919,8 +1140,15 @@ interface PaintStrokeInit {
919
1140
  brush?: Parameters<typeof normalizePaintBrush>[0];
920
1141
  /** Jitter seed (default: a new one per stroke). */
921
1142
  seed?: number;
922
- /** Extra copies of the stroke as affine maps (mirror / kaleidoscope). */
1143
+ /** Extra copies of the stroke as affine maps (default: the symmetry guide's). */
923
1144
  copies?: readonly Affine[];
1145
+ /** Snap the samples to the perspective guide (default true for `beginStroke`, false for `paintStroke`). */
1146
+ snapToPerspective?: boolean;
1147
+ /** Where the stroke starts, for taking its colour from the tracing image before the first sample (`beginStroke`). */
1148
+ start?: {
1149
+ x: number;
1150
+ y: number;
1151
+ };
924
1152
  }
925
1153
  interface LayerUpdate {
926
1154
  name?: string;
@@ -988,6 +1216,13 @@ declare class PaintEditorController {
988
1216
  private dirty;
989
1217
  private seedCounter;
990
1218
  private strokeCounter;
1219
+ private guides;
1220
+ private swatches;
1221
+ private readonly pad;
1222
+ private tracingVersion;
1223
+ private tracingCache;
1224
+ private readonly imagePixels;
1225
+ private nextReferenceId;
991
1226
  private readonly viewCompositor;
992
1227
  private readonly exportCompositor;
993
1228
  constructor(options?: PaintEditorOptions);
@@ -1154,6 +1389,8 @@ declare class PaintEditorController {
1154
1389
  private currentLayers;
1155
1390
  /** View-only layers between the paper and the paint (the painting guides add the tracing image). */
1156
1391
  protected underlayLayers(): ViewLayer[];
1392
+ /** The tracing image resampled onto the canvas (cached until it or the canvas changes). */
1393
+ private tracingNode;
1157
1394
  private renderLayers;
1158
1395
  /**
1159
1396
  * Composites the viewport stack (paper, view-only underlays, layers with the live stroke) tile by
@@ -1210,10 +1447,79 @@ declare class PaintEditorController {
1210
1447
  width: number;
1211
1448
  height: number;
1212
1449
  };
1450
+ private setGuides;
1451
+ /** Mirror and kaleidoscope painting: every new stroke paints its copies too (one stroke, one undo step). */
1452
+ setSymmetry(update: Partial<SymmetryGuide>): SymmetryGuide;
1453
+ /** Perspective guides with one to three vanishing points that pointer strokes snap to. */
1454
+ setPerspective(update: Partial<PerspectiveGuide>): PerspectiveGuide;
1455
+ /** An image from a PNG (base64 or data URL) or from RGBA pixels, stored as a PNG data URL. */
1456
+ private importImage;
1457
+ private decodeImage;
1458
+ /**
1459
+ * Puts an image under the paint to trace over: view only, never in exports. Placed to fit the
1460
+ * canvas unless `rect` is given; `sampleColors` makes strokes take their colour from it.
1461
+ */
1462
+ setTracingImage(options: {
1463
+ png?: string;
1464
+ pixels?: PixelImage;
1465
+ rect?: TracingImage['rect'];
1466
+ opacity?: number;
1467
+ sampleColors?: boolean;
1468
+ }): TracingImage;
1469
+ /** Changes the tracing image's opacity, visibility, placement or colour sampling. */
1470
+ updateTracing(update: Partial<Pick<TracingImage, 'opacity' | 'visible' | 'sampleColors' | 'rect'>>, base?: TracingImage | null): TracingImage;
1471
+ clearTracingImage(): void;
1472
+ /** The tracing image's colour at a document pixel, or `null` outside it or where it is clear. */
1473
+ sampleTracingColor(x: number, y: number): string | null;
1474
+ /** Adds a floating reference image to look at and pick colours from. */
1475
+ addReferenceImage(options: {
1476
+ png?: string;
1477
+ pixels?: PixelImage;
1478
+ name?: string;
1479
+ x?: number;
1480
+ y?: number;
1481
+ displayWidth?: number;
1482
+ }): ReferenceImage;
1483
+ private requireReference;
1484
+ /** Moves, resizes, renames, shows or hides a reference image. */
1485
+ updateReferenceImage(id: string, update: Partial<Pick<ReferenceImage, 'name' | 'x' | 'y' | 'displayWidth' | 'visible'>>): ReferenceImage;
1486
+ removeReferenceImage(id: string): void;
1487
+ /** A reference image's pixels (decoded once). */
1488
+ referencePixels(id: string): PixelImage;
1489
+ /** The colour of a reference image at its pixel (x, y). */
1490
+ pickReferenceColor(id: string, x: number, y: number): string;
1491
+ private readGuides;
1492
+ /** Colour harmonies around a colour (default the paint colour) on the painter's RYB wheel or the RGB wheel. */
1493
+ harmony(kind: HarmonyKind, options?: {
1494
+ color?: string;
1495
+ wheel?: ColorWheel;
1496
+ spread?: number;
1497
+ }): HarmonyColor[];
1498
+ addSwatch(color: string, name?: string): Swatch[];
1499
+ removeSwatch(index: number): Swatch[];
1500
+ setSwatches(swatches: readonly Swatch[]): Swatch[];
1501
+ get mixingPad(): MixingPad;
1502
+ /** Paints (`paint`) or smears with the palette knife (`knife`) on the mixing pad, in pad pixels. */
1503
+ mixingPadStroke(points: readonly PenPoint[], options?: {
1504
+ tool?: MixingPadTool;
1505
+ color?: string;
1506
+ size?: number;
1507
+ }): {
1508
+ bounds: RasterRect | null;
1509
+ };
1510
+ /** Picks the mixed colour on the pad (averaged over `radius` px); with `setColor` it becomes the paint colour. */
1511
+ mixingPadPick(x: number, y: number, options?: {
1512
+ radius?: number;
1513
+ setColor?: boolean;
1514
+ }): string | null;
1515
+ clearMixingPad(): void;
1213
1516
  /** A layer's tile surface (live while stroking), for thumbnails. */
1214
1517
  layerSurface(id: string): TiledSurface | null;
1215
1518
  }
1216
1519
 
1520
+ /** Largest tracing or reference image side, in pixels. */
1521
+ declare const MAX_IMAGE_SIDE = 8192;
1522
+
1217
1523
  /**
1218
1524
  * Agent tools for the paint editor (`createPaintEditorToolProvider`). Strict schemas, every
1219
1525
  * argument described, all four annotations. Each write is one undo step (or editor state, said so)
@@ -1230,4 +1536,4 @@ interface PaintEditorToolProviderOptions {
1230
1536
  /** Agent tools for one paint editor. */
1231
1537
  declare function createPaintEditorToolProvider(controller: PaintEditorController, options?: PaintEditorToolProviderOptions): AgentToolProvider;
1232
1538
 
1233
- export { type Affine, BRUSH_ID, BRUSH_ROTATIONS, BUILTIN_BRUSHES, type BrushDynamics, type BrushLibraryFile, type BrushRotation, type BrushThumbnail, DEFAULT_BRUSH_ID, DEFAULT_DPI, DEFAULT_DYNAMICS, DEFAULT_PAPER, DEFAULT_VIEW, DryStroke, type DryStrokeOptions, type FillLayerOptions, GRAIN_PATTERNS, GRAIN_TILE, type GrainPattern, type GrainTuning, type Hand, IDENTITY_AFFINE, IDENTITY_COPY, type ImageEncoder, type ImageFormat, type ImageNode, type LayerUpdate, type Linear2, type LoadedPaintDocument, MAX_CANVAS_SIDE, MAX_ZOOM, MIN_CANVAS_SIDE, MIN_ZOOM, PAINT_BRUSH_CATEGORIES, PAINT_BRUSH_ENGINES, PAINT_FORMAT, PAINT_SCHEMA_VERSION, PAPER_FAMILIES, PAPER_LIBRARY, PAPER_NODE_ID, type PaintAssetStore, type PaintBrush, type PaintBrushCategory, type PaintBrushEngine, type PaintCanvas, PaintDocumentError, type PaintDocumentExtensions, type PaintDocumentState, PaintEditorController, PaintEditorError, type PaintEditorOptions, type PaintEditorState, type PaintEditorToolProviderOptions, type PaintGroupLayer, type PaintLayer, type PaintLayerInfo, type PaintPixelLayer, type PaintStrokeInit, type PaintStrokeResult, PaintStrokeSession, type PaintView, type PaperFamily, PaperGrain, type PaperNode, type PaperSettings, type PaperTiling, type PenDab, PenDabWalker, type PenPoint, PenSmoother, type PixelImage, type PointerSample, type RecordedStroke, type RenderOptions, type ReplayOptions, type SerializeOptions, type SerializedPaintDocument, type StrokeCopy, type StrokeSessionHost, type StrokeSessionInit, type StrokeVariation, TRACING_NODE_ID, TileableNoise, type ViewLayer, affineCopy, applyAffine, brushToJSON, clonePaper, composeAffine, createPaintCompositor, createPaintDocument, createPaintEditorToolProvider, createPaintLayer, defaultImageEncoder, deserializePaintDocument, deserializePaintDocumentAsync, documentExtensions, documentToScreen, downsampleRgba, fitZoom, grainCatch, grainHeights, hash2, hexToRgb8, invertAffine, isPalmTouch, mapPenPoint, mix32, mixerLoadForStroke, mixerTip, newPaintLayerId, normalizeBrushStroke, normalizeCanvas, normalizeDynamics, normalizePaintBrush, normalizePaper, normalizeRotation, normalizeView, paperGrain, paperKey, paperNode, paperPreset, parseBrushLibrary, penOrientation, pointerToPenPoint, rand01, randSigned, renderBrushThumbnail, renderPaper, samplePressure, screenToDocument, seedFromString, serializePaintDocument, serializePaintDocumentExternal, strokeBounds, thumbnailStroke, tiltToOrientation, toStrokePoint, variationAffine, varyStroke, viewCssTransform, viewMatrix, viewPenToDocument };
1539
+ export { type Affine, BRUSH_ID, BRUSH_ROTATIONS, BUILTIN_BRUSHES, type BrushDynamics, type BrushLibraryFile, type BrushRotation, type BrushThumbnail, type ColorWheel, DEFAULT_BRUSH_ID, DEFAULT_DPI, DEFAULT_DYNAMICS, DEFAULT_PAPER, DEFAULT_SWATCHES, DEFAULT_VIEW, DryStroke, type DryStrokeOptions, type FillLayerOptions, GRAIN_PATTERNS, GRAIN_TILE, type GrainPattern, type GrainTuning, HARMONY_KINDS, type Hand, type HarmonyColor, type HarmonyKind, IDENTITY_AFFINE, IDENTITY_COPY, type ImageEncoder, type ImageFormat, type ImageNode, type LayerUpdate, type Linear2, type LoadedPaintDocument, MAX_CANVAS_SIDE, MAX_COORDINATE, MAX_IMAGE_SIDE, MAX_ZOOM, MIN_CANVAS_SIDE, MIN_ZOOM, MIXING_PAD_HEIGHT, MIXING_PAD_WIDTH, MixingPad, type MixingPadTool, PAINT_BRUSH_CATEGORIES, PAINT_BRUSH_ENGINES, PAINT_FORMAT, PAINT_SCHEMA_VERSION, PAPER_FAMILIES, PAPER_LIBRARY, PAPER_NODE_ID, type PaintAssetStore, type PaintBrush, type PaintBrushCategory, type PaintBrushEngine, type PaintCanvas, PaintDocumentError, type PaintDocumentExtensions, type PaintDocumentState, PaintEditorController, PaintEditorError, type PaintEditorOptions, type PaintEditorState, type PaintEditorToolProviderOptions, type PaintGroupLayer, type PaintGuides, type PaintLayer, type PaintLayerInfo, type PaintPixelLayer, type PaintStrokeInit, type PaintStrokeResult, PaintStrokeSession, type PaintView, type PaperFamily, PaperGrain, type PaperNode, type PaperSettings, type PaperTiling, type PenDab, PenDabWalker, type PenPoint, PenSmoother, type PerspectiveGuide, PerspectiveSnapper, type PixelImage, type Point2, type PointerSample, type RecordedStroke, type ReferenceImage, type RenderOptions, type ReplayOptions, type Rgb255, SNAP_DECIDE_DISTANCE, SYMMETRY_MODES, type SerializeOptions, type SerializedPaintDocument, type StrokeCopy, type StrokeSessionHost, type StrokeSessionInit, type StrokeVariation, type Swatch, type SymmetryGuide, type SymmetryMode, TRACING_NODE_ID, TileableNoise, type TracingImage, type ViewLayer, affineCopy, applyAffine, brushToJSON, clonePaper, colorHarmony, composeAffine, createPaintCompositor, createPaintDocument, createPaintEditorToolProvider, createPaintLayer, defaultGuides, defaultImageEncoder, deserializePaintDocument, deserializePaintDocumentAsync, documentExtensions, documentToScreen, downsampleRgba, fitZoom, grainCatch, grainHeights, hash2, hexToRgb8, hslToRgb, hsvToRgb, hueToWheel, invertAffine, isPalmTouch, mapPenPoint, mix32, mixerLoadForStroke, mixerTip, newPaintLayerId, normalizeBrushStroke, normalizeCanvas, normalizeDynamics, normalizePaintBrush, normalizePaper, normalizePerspective, normalizeRotation, normalizeSymmetry, normalizeView, paperGrain, paperKey, paperNode, paperPreset, parseBrushLibrary, parseHexColor, penOrientation, perspectiveDirections, perspectiveGuideLines, pointerToPenPoint, rand01, randSigned, renderBrushThumbnail, renderPaper, rgbToHexColor, rgbToHsl, rgbToHsv, samplePressure, screenToDocument, seedFromString, serializePaintDocument, serializePaintDocumentExternal, strokeBounds, symmetryAxisAngles, symmetryAxisSegments, symmetryCopies, thumbnailStroke, tiltToOrientation, toStrokePoint, variationAffine, varyStroke, viewCssTransform, viewMatrix, viewPenToDocument, wheelToHue };