- Fixed dimension mismatch between mask and display image after undo
- Mask was being created at original image size, but displayImage is at
preview scale after undo/redo (renderPreview scales images > 2048px)
- Now create mask at actual displayImage dimensions, ensuring mask and
image sizes match for inpainting
- Also fixed edge refinement gradient to recompute when image changes
- Add LaMaFP16_512.mlpackage (~90MB) for high-quality object removal
- Add LaMaInpainter.swift wrapper with image preprocessing and merging
- Modify InpaintEngine to use LaMa first, gradient fill as fallback
- Fix brush mask size (use scale 1.0 instead of screen scale)
- Fix LaMa output size (use scale 1.0 in merge function)
- Add model loading wait with 5 second timeout
The LaMa model provides significantly better inpainting quality compared
to the gradient fill method, especially for complex backgrounds.
- Fix object selection by correctly calculating bytesPerPixel in mask buffer
- Improve inpainting with 16-direction gradient fill and inverse-square blending
- Add 100 smoothing iterations to eliminate seam artifacts
- Increase mask dilation to 20px to exclude object edge remnants
- Fix brush tool gesture conflict - disable pan while brushing
- Fix image orientation by normalizing EXIF rotation on load
Modified files:
- MaskingService.swift: Fix pixel offset calculation for mask buffers
- Shaders.metal: Add gradient fill with 16 directions and multi-pixel sampling
- PatchMatch.swift: Use gradient fill + smoothing, add encodeGradientFill
- InpaintEngine.swift: Increase iterations to 500, patch radius to 8
- CanvasView.swift: Disable pan gesture when brush tool selected
- EditorViewModel.swift: Normalize image orientation on load
The DragGesture with minimumDistance: 0 for line brush mode was
consuming all touches, preventing tap detection for Object/Person/Wire
tools. Fixed by:
1. Only attaching line brush gesture when in line brush mode
2. Added conditional .if() view modifier extension
3. Added debug logging to tap gesture to track gesture flow
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Scale mask and image to texture dimensions when loading into Metal
textures, fixing crash when brush mask has different dimensions
than the source image.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Edge refinement: Wire toggle to actually snap brush strokes to edges
using Sobel gradient analysis in EdgeRefinement.swift
- Brush preview circle: Show visual cursor following finger during drawing
- PHAsset storage: Capture localIdentifier for Photo Library imports
- Low-confidence mask warning: Show "Does this look right?" for uncertain
detections based on mask coverage and edge sharpness analysis
- Fix Swift 6 concurrency warnings with nonisolated static methods
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update MaskOperation to store mask dimensions for reconstruction.
Implement proper operation rendering in ImagePipeline:
- Apply mask+inpaint operations with proper mask reconstruction
- Handle adjustment operations by type (brightness/contrast/saturation)
- Scale masks when rendering previews at reduced resolution
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Implement GPU-accelerated inpainting using Metal compute shaders:
- Add Shaders.metal with dilateMask, gaussianBlur, diffuseInpaint, edgeAwareBlend kernels
- Add PatchMatchInpainter class for exemplar-based inpainting
- Update InpaintEngine to use Metal with Accelerate fallback
- Add BrushCanvasView for manual brush-based mask painting
- Add LineBrushView for wire removal line drawing
- Update CanvasView to integrate brush canvas overlay
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add ExportView with JPEG, PNG, HEIC format support
- Include quality slider for JPEG compression
- Show image dimensions and estimated file size
- Implement save to Photo Library with proper permissions
- Add share sheet for AirDrop, Messages, etc.
- Wire export button in PhotoEditorView to show ExportView
- Add HEIC encoding extension for UIImage
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add EditorViewModel coordinating masking, contour detection, and inpainting
- Connect PhotoEditorView to viewModel with mask confirmation bar
- Add processing overlay and error toast UI
- Update CanvasView with tap-to-mask functionality
- Add coordinate conversion from view space to image space
- Update ToolbarView to bind to viewModel state
- Wire up undo/redo actions through viewModel
Person, object, and wire removal now flow:
tap -> detect -> preview mask -> confirm -> inpaint
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add project constitution with vision, principles, and autonomy settings
- Add 15 feature specifications covering full app scope
- Configure agent entry points (AGENTS.md, CLAUDE.md)
- Add build prompt and speckit command for spec creation
- Include comprehensive .gitignore for iOS development
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>