/**
 * One pooled brush stamp. `path` is built once at spawn time (seeded, so
 * the shape is stable across the many frames it's redrawn) and reused for
 * the stamp's whole lifetime — avoids rebuilding geometry every frame.
 */
export interface BrushStamp {
  active: boolean;
  x: number;
  y: number;
  baseRadius: number;
  /** Random per-stamp size multiplier (independent of velocity-based radius) so a steady stroke isn't repetitive. */
  baseScale: number;
  /** Random per-stamp base opacity multiplier (BRUSH_CONFIG.opacityJitterMin–1). */
  opacityMultiplier: number;
  /** Random per-stamp lifetime multiplier so stamps along a stroke don't all close in spawn order — see BRUSH_CONFIG.lifetimeVariation. */
  lifetimeMultiplier: number;
  rotation: number;
  spawnTime: number;
  seed: number;
  path: Path2D | null;
}

export interface PointerState {
  x: number;
  y: number;
  targetX: number;
  targetY: number;
  velocity: number;
  active: boolean;
}

/** Source rect (in natural image pixels) that reproduces CSS `object-fit: cover`. */
export interface CoverRect {
  sx: number;
  sy: number;
  sw: number;
  sh: number;
}
