export type PaddingMode = 'zero' | 'reflect' | 'replicate' | 'wrap' export type KernelCategory = 'blur' | 'sharpen' | 'edge' | 'emboss' | 'custom' | 'other' export interface Kernel { id: string name: string category: KernelCategory matrix: number[][] size: number normalize: boolean description: string formula?: string reference?: string } export interface ImageDataExtended { data: Uint8ClampedArray width: number height: number channels: number } export interface ConvolutionStep { x: number y: number channel: number inputPatch: number[][] kernel: number[][] multiplications: number[][] sum: number outputValue: number normalizedValue: number progress: number } export interface ConvolutionProgress { currentStep: ConvolutionStep | null progress: number processedPixels: number totalPixels: number elapsedTime: number estimatedTimeRemaining: number } export interface ConvolutionState { status: 'idle' | 'running' | 'paused' | 'completed' | 'error' currentStep: ConvolutionStep | null progress: number startTime: number elapsedTime: number processedPixels: number totalPixels: number outputImageData: ImageData | null error: string | null } export interface AppSettings { animationSpeed: number showOverlay: { kernelBoundary: boolean pixelValues: boolean multiplications: boolean summation: boolean } padding: PaddingMode zoomLevel: number panOffset: { x: number; y: number } comparisonMode: 'side-by-side' | 'split' | 'overlay' stepMode: boolean } export interface ComparisonState { mode: 'side-by-side' | 'split' | 'overlay' splitPosition: number synchronizedZoom: boolean synchronizedPan: boolean activeTab: string } export interface KernelComparisonResult { kernelId: string kernelName: string imageData: ImageData processingTime: number timestamp: number } export interface ExportOptions { format: 'png' | 'jpeg' | 'webp' quality: number includeOriginal: boolean includeComparison: boolean } export interface AnimationExportOptions { format: 'gif' | 'webm' fps: number duration: number showOverlays: boolean }