Version 1.4.8

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:

    • birdsInFlight
    • perchedWildlife
      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/offset removed from several container/detail views.
    • Should reduce plumbing complexity and may improve UI state consistency.

Technical / developer-facing changes

  • AF-point pipeline integration

    • ScanFiles.swift now parses Sony focus-location once and stores a normalized AF point.
    • FileItem gains afFocusNormalized: CGPoint?.
    • SharpnessScoringModel passes the AF point into computeSharpnessScore.
  • Scoring algorithm overhaul (FocusMaskModel.swift)

    • Added Accelerate and replaced the prior quickselect percentile approach with vDSP.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.
  • RAW thumbnail decode behavior changed

    • kCGImageSourceCreateThumbnailFromImageIfAbsent switched to false.
    • 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.01 to 0.03 (unless high confidence).
  • Small-set score normalization fix

    • maxScore logic now uses max directly when score count < 10 (avoids pathological p90 behavior on tiny sets).
  • Hashability fix for FileItem

    • Explicit Hashable / Equatable keyed on UUID because CGPoint is non-Hashable.
  • Tests

    • New RawCullTests/SharpnessScoringTests.swift with:
      • 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.

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.
Last modified April 13, 2026: update (8229af6)