Version 1.4.5

Version 1.4.5 - April 10, 2026

A new version of RawCull, version 1.4.6, will be submitted to the Apple App Store at the beginning of next week after further testing and quality assurance. I have commenced working on this version and have implemented enhancements such as multiple selection in the Grid View and the application of functions to multiple selected images.

This release addresses a bug in sorting and selecting culled images within the Grid View. In the previous version, a restart of RawCull resolved the issue. However, in this release, the internal refresh mechanism has been implemented.

Changes since v1.4.3

Sharpness/Saliency Score Persistence

  • Persist scores to SavedFiles: Added sharpnessScore (Float) and saliencySubject (String) fields to DecodeSavedFiles / SavedFiles / FileRecord so scores survive app restarts.
  • Load scores at launch: Added loadPersistedScoringandSaliency() and applyPreloadedScores() to restore saved scores into the model before thumbnails are created, so sort-by-sharpness order is immediately available.
  • Conditional sort: sortBySharpness now only activates when preloaded scores are actually present.
  • Write scores on completion: calibrateAndScoreCurrentCatalog now persists results only on successful (non-cancelled) runs via a new persistScoringResultsInMemory() helper.

Focus Mask Parameter Persistence

  • Added 6 configurable FocusMaskConfig parameters to SettingsViewModel (preBlurRadius, threshold, energyMultiplier, erosionRadius, dilationRadius, featherRadius) with defaults and Codable persistence.
  • FocusMaskControlsView now saves settings on hide/reset and restores defaults from FocusDetectorConfig.

UI Improvements

  • Sharpness analysis in file detail view: SavedFilesView now shows a “Sharpness Analysis” section with formatted score and saliency subject badge when data is available.
  • Thumbnail selection affordance: Stronger selection border, accent shadow, and overlay stroke in ImageItemView.
  • Rating filter: RatingFilter.minimum(Int) renamed to RatingFilter.stars(Int) — semantics changer from >= n to == n (exact match).
  • Grid view reset: Opening the grid now resets ratingFilter to .all and refreshes sort order.
  • Tagged grid refresh: TaggedPhotoHorisontalGridView now uses viewModel.filteredFiles for lookups and gains a Refresh button.

Architecture / Cleanup

  • SettingsViewModel singleton: Replaced @Environment-driven injection with SettingsViewModel.shared throughout — single source of truth, no duplicate instances.
  • Dead code removal: Deleted unused selectedSource parameter from ImageItemView and callers; removed lastEstimatedSeconds ETA tracking from ScanAndCreateThumbnails and ExtractAndSaveJPGs.
  • Swift style fixes: switch return modernization, trailing comma cleanup, removed redundant = nil defaults, Sendable trimmed from internal structs.

Version

  • Bumped to 1.4.5 (CURRENT_PROJECT_VERSION 45).

ARW body compatibility diagnostic

The following Sony bodies successfully extract EXIF, focus points, sharpness, and saliency, except for the ILCE-7RM5, which failed to extract saliency on one of its three files. The ILCE-1M2 is the only body tested across all three Sony RAW size variants (S/M/L). All files use compressed RAW, and every body achieves full-resolution L-size output, ranging from 12.4 MP (ILCE-1M2 S-crop) to 60.2 MP (ILCE-7RM5). The ILCE-7M5 and ILCE-7RM5 are the next bodies to focus on, but I depend on test ARW files to properly test them before officially concluding support for these two bodies.

Camera BodyEXIFFocusPtSharpnessSaliencyRAW TypesDimensions
ILCE-1M2Compressed4320 × 2880 (12.4 MP, S), 5616 × 3744 (21.0 MP, M), 8640 × 5760 (49.8 MP, L)
ILCE-1Compressed8640 × 5760 (49.8 MP, L)
ILCE-7M5Compressed7008 × 4672 (32.7 MP, L)
ILCE-7RM5Compressed9504 × 6336 (60.2 MP, L)
ILCE-9M3Compressed6000 × 4000 (24.0 MP, L)
Last modified April 10, 2026: Update version-1.4.5.md (27ef74e)