Add getEffectiveConfig function that only considers values affecting output.
Toggling a property on at its neutral value (e.g., gamma at 1.0) no longer
triggers a reprocess since the output would be identical.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Split processing into geometry phase (crop/resize) and adjustment phase.
Cache the post-geometry pixels keyed by image fingerprint + crop/resize config.
When only adjustments change, skip expensive decode/crop/resize operations.
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- Fix corner resize handles to use scale factor instead of direct delta
- Store initial region state on resize start to prevent compounding errors
- Add ArrayBuffer caching in worker pool to avoid re-reading files
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
- CropOverlay component with draggable/resizable region
- Maintains target device aspect ratio
- Rule of thirds grid overlay
- Dark mask outside crop area
- Updates ImagePreview to show overlay in manual mode
- Updates photonWorker to handle manual crop regions
- Also fixes top/bottom crop modes
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- PipelinePanel: full pipeline configuration UI
- PipelineStep: reusable step toggle with controls
- EditImageModal: per-image pipeline editing with preview
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- ImageCard: image preview with comparison slider
- ImageGrid: responsive grid layout for cards
- ImagePreview: live preview with pipeline processing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- DropZone: drag & drop file upload with visual feedback
- DeviceSelector: device dropdown grouped by brand
- CustomDeviceModal: form for custom device creation
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Global pipeline configuration
- Built-in and user presets
- localStorage persistence
- Preset CRUD operations
Co-Authored-By: Claude <noreply@anthropic.com>
- processImageWithPipeline for full pipeline processing
- ZIP archive creation with JSZip
- File download helpers
- Output filename generation
Co-Authored-By: Claude <noreply@anthropic.com>
- Dynamic pool sizing based on CPU cores
- Job queue with automatic worker assignment
- Strips Svelte proxies before sending to workers
- Graceful error handling and cleanup
Co-Authored-By: Claude <noreply@anthropic.com>
- Full pipeline processing off main thread
- Image decoding via createImageBitmap + OffscreenCanvas
- All adjustments and dithering algorithms
- Blob output with data URL conversion
Co-Authored-By: Claude <noreply@anthropic.com>