Version 1.4.8
Categories:
Version 1.4.8 - April 13, 2026
RawCull changes summary — v1.4.6 → v1.4.8
User-visible changes
Sharpness scoring significantly reworked (likely biggest user impact):
- Better handling of blurry/silhouette-heavy subjects.
- New scoring path that can use AF focus point metadata when available.
- Revised saliency gating and weighting behavior.
- More conservative fallback when no subject region is found.
Two shooting presets introduced in scoring config:
birdsInFlightperchedWildlife
These change blur/threshold/weighting defaults and AF region radius.
Zoom/pan behavior refactor in main image view:
- Scale/offset state moved into the view model in
MainThumbnailImageView. - Bindings for
scale/lastScale/offsetremoved from several container/detail views. - Should reduce plumbing complexity and may improve UI state consistency.
- Scale/offset state moved into the view model in
Technical / developer-facing changes
AF-point pipeline integration
ScanFiles.swiftnow parses Sony focus-location once and stores a normalized AF point.FileItemgainsafFocusNormalized: CGPoint?.SharpnessScoringModelpasses the AF point intocomputeSharpnessScore.
Scoring algorithm overhaul (
FocusMaskModel.swift)- Added
Accelerateand replaced the prior quickselect percentile approach withvDSP.sort-based robust tail scoring. - Added:
robustTailScore(_:)microContrast(_:)- Region analysis with
borderFraction(silhouette penalty signal)
- Added a blur gate:
- If subject micro-detail is too low, aggressively down-weight score.
- Added AF-region scoring path with configurable radius (
afRegionRadius). - Fusion logic changed:
- Uses AF region score when available, else saliency region.
- Applies silhouette penalty.
- Applies subject-size bonus only for Vision saliency region (not AF).
- Stronger penalty when no salient region exists.
- Added
RAW thumbnail decode behavior changed
kCGImageSourceCreateThumbnailFromImageIfAbsentswitched tofalse.- Added binary fallback decode for ARW 6.0 (RA16) by extracting embedded JPEG directly via
SonyMakerNoteParser. - Added sRGB normalization pass to stabilize downstream Metal pipeline input format.
Saliency threshold tightened
- Minimum saliency union area check increased from
0.01to0.03(unless high confidence).
- Minimum saliency union area check increased from
Small-set score normalization fix
maxScorelogic now uses max directly when score count < 10 (avoids pathological p90 behavior on tiny sets).
Hashability fix for
FileItem- Explicit
Hashable/Equatablekeyed on UUID becauseCGPointis non-Hashable.
- Explicit
Tests
- New
RawCullTests/SharpnessScoringTests.swiftwith:- Diagnostic scoring run test harness.
- Unit tests for small/large set max score behavior.
- Numeric helper tests (
robustTailScore,microContrast).
- Added new test tag:
.smoke. - Updated compatibility test thumbnail decode option to match new behavior.
- New
Net impact (practical)
- Most likely improvement: better ranking of truly sharp frames (especially wildlife), fewer false “sharp” scores on silhouette/noise-heavy images.
- Compatibility hardening: improved handling for problematic ARW/RA16 thumbnail decode cases.
- Potential behavior shift: some images may now rank lower/higher than before due to stricter saliency area gate + new blur/silhouette penalties + AF-point-weighted scoring.