File size: 2,173 Bytes
80bcac8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
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
}