Merge branch 'port-a'

This commit is contained in:
ZacharyZhang-NY committed 2026-10-01 20:03:04 -04:00
commit 76dad20b63
6 files changed
+101 -62

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.22)
project(omaphoto VERSION 1.3.3 LANGUAGES C CXX)
project(omaphoto VERSION 1.4.5 LANGUAGES C CXX)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
+7 -6
View File
@@ -6,19 +6,20 @@ It is a Linux port of [Compositor](https://github.com/robbietilton/Compositor) b
## What it does
- Layers, folders, masks, clipping masks, blend modes and opacity; whole layers copy between projects
- Selections: marquee, lasso, magic wand and its object mode, Select › Subject, load from a layer, feather, expand and contract
- Brush, eraser, spot healing, clone stamp, smudge, blur and liquify, gradient, shapes, type with colour on selected letters
- Move, transform and distort layers and selections; rulers, guides, a grid with adjustable spacing and subdivisions, and snapping
- Layers, folders, masks, clipping masks, blend modes and opacity; whole layers copy between projects; Ungroup Layers
- Selections: marquee, lasso, magic wand and its object mode, Select › Subject, Select › Color Range, load from a layer, feather, expand and contract
- Brush, eraser, spot healing, clone stamp, smudge, blur and liquify, gradient, shapes, type with colour and fonts on selected letters
- Move, transform and distort layers and selections; rulers, guides, a grid with its own settings, and snapping for layers, selections and shapes
- Levels, Curves, Hue/Saturation, Exposure, Black & White, Color Balance, Gradient Map, Grain, Invert, blur and noise, as edits or as adjustment layers
- Camera Raw Filter, docked beside the canvas
- Camera Raw Filter, docked beside the canvas, with Photoshop's curves
- Layer effects: stroke, drop shadow, outer and inner glow, color overlay, inner shadow
- Filters: Gaussian and motion blur, noise, lens correction, Vignette, Bloom / Glow, Tonal Contrast, Dither, Content-Aware Fill and Remove Background (U²-Net on ONNX Runtime, offline)
- Crop, trim, canvas size, image size; PNG and JPEG export
- Crop, trim, canvas size, image size; PNG and JPEG export with a zoomable preview; New Canvas presets for screens and social formats
- Imports JPEG, PNG, TIFF, HEIC, SVG, Photoshop files (PSD and PSB) and camera RAW
- Open Recent, and a Keyboard Shortcuts window
- Drag a number's label to scrub its value
- Keep working while a project saves
- Project tabs that drag to reorder; those that do not fit gather in a menu
- A project another app changes on disk reloads in place; unsaved work is never replaced without asking
The [acceptance run](docs/acceptance.md) checks each of these in the app's own window, with screenshots.
+43 -21
View File
@@ -1,6 +1,6 @@
# OmaPhoto 1.3.3 acceptance
# OmaPhoto 1.4.5 acceptance
The MVP acceptance table for OmaPhoto 1.3.3, the Linux port of Compositor 1.3.3. Each row is a feature from the README.
The acceptance table for OmaPhoto 1.4.5, the Linux port of Compositor 1.4.5. Each row is a feature from the README. The rows under "New in 1.4.5" cover what changed since 1.3.3. A "pending" result waits for the 1.4.5 run.
The acceptance run drives the app's own window, the way a person uses it. It chooses menu entries, drags on the canvas, types into sheets and answers the real file panels. Then it checks concrete results: pixels, layers, sizes and files on disk. The run is three test programs: `AcceptanceTests`, `AcceptanceColorTests` and `AcceptanceProjectTests`. They take the screenshots below when `ACCEPTANCE_SHOTS` names a folder.
@@ -14,25 +14,47 @@ The screenshots come from Qt's offscreen platform, so floating panels appear wit
## Table
| Feature | What the run does and checks | Screenshot | Suites that hold the details |
| --- | --- | --- | --- |
| Layers, folders, masks, clipping masks, blend modes, opacity | Imports a photo and paints a layer. Clips it to the photo and sets Multiply at 60%. Masks the photo and groups both in a folder. Undo takes a step back. | [01](acceptance/01-layers.png) | `GroupTests`, `LayerMaskTests`, `LiveMaskTests`, `LayerAppearanceTests`, `LayerRendererTests`, `HistoryTests` |
| Selections | Drags a marquee to within 2 px. The wand takes the flat ground. Select › Subject finds the red disc with the U²-Net model. | [02](acceptance/02-selections.png) | `SelectionTests`, `MagicWandTests`, `SelectSubjectTests`, `SelectionEditTests`, `ObjectSelectionTests`, `SelectionFeatherTests` |
| Painting tools | Drags a gradient that fades to clear, a rectangle shape and a soft white brush stroke. Types "Hello OmaPhoto" on the canvas and colours "Hello" red. That leaves one colour run, committed with Ctrl+Return. | [03](acceptance/03-painting.png) | `BrushTests`, `GradientTests`, `ShapeToolTests`, `TypeToolTests`, `TextColorRunsTests`, `SpotHealingTests`, `CloneStampTests`, `SmudgeLiquifyTests` |
| Move, transform, distort; rulers, guides, grid | Drags the layer with the Move tool. Transform Layer halves it, and Return applies. Rulers, a guide and the grid are shown. | [04](acceptance/04-transform-guides-grid.png) | `TransformSessionTests`, `DistortTests`, `GuideTests`, `FloatingSelectionTests` |
| Adjustments as edits and as layers | Hue/Saturation turns the red disc green. An Invert layer inverts the view and leaves the pixels alone. A Curves layer opens its editor. | [05](acceptance/05-adjustments.png) | `HueSaturationTests`, `LevelsTests`, `CurvesControlsTests`, `AdjustmentLayerTests`, `AdjustmentEditorTests`, `ImageAdjustmentTests` |
| Camera Raw Filter, docked | Opens in the dock beside the canvas. One stop of exposure previews, commits and brightens the ground. | [06](acceptance/06-camera-raw.png) | `CameraRawTests`, `CameraRawSessionTests`, `CameraRawPanelTests`, `CameraRawCanvasTests` |
| Layer effects | A 12 px red stroke rings a shape outside its edge, and a drop shadow's sheet shows. The shape keeps its fill. | [07](acceptance/07-effects.png) | `LayerEffectsTests`, `LayerEffectsKernelTests`, `EffectsPanelTests`, `EffectsCanvasTests`, `InnerGlowTests` |
| Filters | Dither leaves only black and white dots. Remove Background masks the photo around its subject: the centre stays opaque and a corner turns clear. | [08](acceptance/08-filters-dither.png), [09](acceptance/09-remove-background.png) | `DitherTests`, `FilterTests`, `FinishingFilterTests`, `SubjectRemovalTests`, `RemoveBackgroundTests` |
| Crop, trim, canvas size, image size; PNG and JPEG export | Crops to 1000 × 600. Canvas Size widens it to 1400. Trim finds the photo's own 1200 again. Image Size halves it. Exports a PNG through the save panel and a JPEG through its sheet and panel, then reads both back at 600 × 300. | [10](acceptance/10-canvas-size.png), [11](acceptance/11-export-jpeg.png) | `CropTests`, `ImageTrimTests`, `ProjectResizeTests`, `ProjectExportTests`, `JPEGExportTests` |
| Imports | Takes JPEG, PNG, TIFF, HEIC, SVG, a layered Photoshop file (it arrives as a folder) and a camera RAW file, which asks how to develop it. That makes eight layers with no import error. | [12](acceptance/12-raw-develop.png), [13](acceptance/13-imports.png) | `ImageImportTests`, `PSDImportTests`, `RawImporterTests`, `RawDevelopTests`, `SVGImportTests` |
| Open Recent; Keyboard Shortcuts window | Saves a project, and Open Recent lists it. The shortcuts window opens over the editor. | [15](acceptance/15-shortcuts.png) | `OpenRecentTests`, `RecentProjectsCoreTests`, `KeyboardShortcutsTests`, `KeyboardShortcutsSheetTests` |
| Scrub a number by its label | Dragging the Opacity title 40 points left lowers the layer's opacity. | [14](acceptance/14-scrub.png) | `NumericScrubTests`, `ScrubbableLabelsTests`, `ScrubbableSheetsTests` |
| Keep working while a project saves | Another layer is added while a save runs. The file holds the state the save began with. | — | `ProjectSaveWhileEditingTests` |
| Reload a project changed on disk | With unsaved edits open, another program renames a layer on disk. The app's alert asks, Revert is chosen, and the saved state shows with the new name. | [15](acceptance/15-shortcuts.png) | `ExternalChangeTests` |
| Follows the Omarchy theme | Starts in the built-in dark. A Catppuccin Latte `colors.toml` written while the app runs retints the window. | [16](acceptance/16-omarchy-light.png) | `OmarchyThemeTests` |
| Builds and tests on each system | The full suite passed on Ubuntu 24.04 (Qt 6.4.2), Ubuntu 26.04, Arch (Qt 6.11), Fedora 43 and 44, and NixOS. Warnings count as errors. | — | `scripts/distro-check.sh` |
| Packages and install scripts | Each install script ran from GitHub in a fresh container. On Ubuntu 24.04 and 26.04, Fedora 43 and 44 and Arch, it checked its package against `SHA256SUMS`, installed it and started 1.3.3. On NixOS, `nixos.sh` resolved `v1.3.3`, built its flake and started 1.3.3. Debian 13 was refused, as intended. | — | `DesktopIntegrationTests`, `.github/workflows/release.yml` |
| Feature | What the run does and checks | Screenshot | Suites that hold the details | Result |
| --- | --- | --- | --- | --- |
| Layers, folders, masks, clipping masks, blend modes, opacity | Imports a photo and paints a layer. Clips it to the photo and sets Multiply at 60%. Masks the photo and groups both in a folder. Undo takes a step back. | [01](acceptance/01-layers.png) | `GroupTests`, `LayerMaskTests`, `LiveMaskTests`, `LayerAppearanceTests`, `LayerRendererTests`, `HistoryTests` | pending |
| Selections | Drags a marquee to within 2 px. The wand takes the flat ground. Select › Subject finds the red disc with the U²-Net model. | [02](acceptance/02-selections.png) | `SelectionTests`, `MagicWandTests`, `SelectSubjectTests`, `SelectionEditTests`, `ObjectSelectionTests`, `SelectionFeatherTests` | pending |
| Painting tools | Drags a gradient that fades to clear, a rectangle shape and a soft white brush stroke. Types "Hello OmaPhoto" on the canvas and colours "Hello" red. That leaves one colour run, committed with Ctrl+Return. | [03](acceptance/03-painting.png) | `BrushTests`, `GradientTests`, `ShapeToolTests`, `TypeToolTests`, `TextColorRunsTests`, `SpotHealingTests`, `CloneStampTests`, `SmudgeLiquifyTests` | pending |
| Move, transform, distort; rulers, guides, grid | Drags the layer with the Move tool. Transform Layer halves it, and Return applies. Rulers, a guide and the grid are shown. | [04](acceptance/04-transform-guides-grid.png) | `TransformSessionTests`, `DistortTests`, `GuideTests`, `FloatingSelectionTests` | pending |
| Adjustments as edits and as layers | Hue/Saturation turns the red disc green. An Invert layer inverts the view and leaves the pixels alone. A Curves layer opens its editor. | [05](acceptance/05-adjustments.png) | `HueSaturationTests`, `LevelsTests`, `CurvesControlsTests`, `AdjustmentLayerTests`, `AdjustmentEditorTests`, `ImageAdjustmentTests` | pending |
| Camera Raw Filter, docked | Opens in the dock beside the canvas. One stop of exposure previews, commits and brightens the ground. | [06](acceptance/06-camera-raw.png) | `CameraRawTests`, `CameraRawSessionTests`, `CameraRawPanelTests`, `CameraRawCanvasTests` | pending |
| Layer effects | A 12 px red stroke rings a shape outside its edge, and a drop shadow's sheet shows. The shape keeps its fill. | [07](acceptance/07-effects.png) | `LayerEffectsTests`, `LayerEffectsKernelTests`, `EffectsPanelTests`, `EffectsCanvasTests`, `InnerGlowTests` | pending |
| Filters | Dither leaves only black and white dots. Remove Background masks the photo around its subject: the centre stays opaque and a corner turns clear. | [08](acceptance/08-filters-dither.png), [09](acceptance/09-remove-background.png) | `DitherTests`, `FilterTests`, `FinishingFilterTests`, `SubjectRemovalTests`, `RemoveBackgroundTests` | pending |
| Crop, trim, canvas size, image size; PNG and JPEG export | Crops to 1000 × 600. Canvas Size widens it to 1400. Trim finds the photo's own 1200 again. Image Size halves it. Exports a PNG through the save panel and a JPEG through its sheet and panel, then reads both back at 600 × 300. | [10](acceptance/10-canvas-size.png), [11](acceptance/11-export-jpeg.png) | `CropTests`, `ImageTrimTests`, `ProjectResizeTests`, `ProjectExportTests`, `JPEGExportTests` | pending |
| Imports | Takes JPEG, PNG, TIFF, HEIC, SVG, a layered Photoshop file (it arrives as a folder) and a camera RAW file, which asks how to develop it. That makes eight layers with no import error. | [12](acceptance/12-raw-develop.png), [13](acceptance/13-imports.png) | `ImageImportTests`, `PSDImportTests`, `RawImporterTests`, `RawDevelopTests`, `SVGImportTests` | pending |
| Open Recent; Keyboard Shortcuts window | Saves a project, and Open Recent lists it. The shortcuts window opens over the editor. | [15](acceptance/15-shortcuts.png) | `OpenRecentTests`, `RecentProjectsCoreTests`, `KeyboardShortcutsTests`, `KeyboardShortcutsSheetTests` | pending |
| Scrub a number by its label | Dragging the Opacity title 40 points left lowers the layer's opacity. | [14](acceptance/14-scrub.png) | `NumericScrubTests`, `ScrubbableLabelsTests`, `ScrubbableSheetsTests` | pending |
| Keep working while a project saves | Another layer is added while a save runs. The file holds the state the save began with. | — | `ProjectSaveWhileEditingTests` | pending |
| Reload a project changed on disk | With unsaved edits open, another program renames a layer on disk. The app's alert asks, Revert is chosen, and the saved state shows with the new name. | [15](acceptance/15-shortcuts.png) | `ExternalChangeTests` | pending |
| Follows the Omarchy theme | Starts in the built-in dark. A Catppuccin Latte `colors.toml` written while the app runs retints the window. | [16](acceptance/16-omarchy-light.png) | `OmarchyThemeTests` | pending |
| Builds and tests on each system | The full suite runs on Ubuntu 24.04 (Qt 6.4.2), Ubuntu 26.04, Arch, Fedora 43 and 44, and NixOS. Warnings count as errors. | — | `scripts/distro-check.sh` | pending |
| Packages and install scripts | Each install script runs from GitHub in a fresh container. On Ubuntu 24.04 and 26.04, Fedora 43 and 44 and Arch, it checks its package against `SHA256SUMS`, installs it and starts 1.4.5. On NixOS, `nixos.sh` resolves `v1.4.5`, builds its flake and starts 1.4.5. Debian 13 is refused, as intended. | — | `DesktopIntegrationTests`, `.github/workflows/release.yml` | pending |
## New in 1.4.5
| Feature | What the run checks | Screenshot | Suites that hold the details | Result |
| --- | --- | --- | --- | --- |
| Select › Color Range | Samples the red disc; the selection covers the disc and leaves the ground. | — | `ColorRangeTests`, `ColorRangeSheetTests`, `ColorRangeCanvasTests` | pending |
| View › Grid Settings | Sets spacing, subdivisions, colour and style; the grid redraws; Restore Defaults puts them back. | — | `GridSettingsSheetTests`, `GuideGridTests` | pending |
| Snapping for selections and shapes | A marquee and a rectangle shape drawn near a guide land on it; with Ctrl they do not. | — | `SnapDrawingCanvasTests`, `TransformSnapTests` | pending |
| New Canvas presets | Chooses 1080p and Instagram Story from the ⋮ menu; the fields and the check follow. | — | `NewCanvasSheetTests` | pending |
| Quick Look preview | A saved project holds `QuickLook/Preview.jpg`, 1024 px on the long side, and reopens unchanged. | — | `QuickLookPreviewTests` | pending |
| Ungroup Layers | Ctrl+Shift+G on a folder puts its layers in its place; Undo brings the folder back. | — | `GroupSessionTests`, `LayerContextMenuTests` | pending |
| Project tabs reorder and overflow | Drags a tab past its neighbour; with many tabs, the "more tabs" menu switches to a hidden one. | — | `ProjectTabDragTests`, `ProjectTabLayoutTests` | pending |
| Fonts on selected letters and previews | Changes the face of one word; hovering a face in the menu previews it; Ctrl+Z takes back typing. | — | `TextFontRunsTests`, `TypeFontPreviewTests`, `InlineTextDrawTests` | pending |
| Painting at the layer's resolution | Paints on a scaled-down layer; the stroke is smooth at the layer's own pixels. A hidden layer says why it cannot paint. | — | `NativeResolutionPaintTests`, `PaintRefusalTests` | pending |
| Liquify, Smudge and Blur | Liquify keeps edges sharp; Smudge leaves no copies; the Blur brush's Radius applies. | — | `SmudgeLiquifyTests`, `BlurToolTests` | pending |
| Masks as Photoshop's | The mask button reveals the selection, Alt hides it; Alt-click on a mask thumbnail shows the mask alone. | — | `MaskAloneTests`, `SelectionEditTests` | pending |
| Move tool keys and values | Held Ctrl flips Auto Select; a typed width applies as one step; a resize handle snaps. | — | `TransformInspectorTests`, `TransformSnapTests` | pending |
| Blending and a sharper canvas | Soft Light, clipping stacks and adjustment layers draw as the export does. | — | `SharpCanvasTests`, `BlendModeTests`, `ClippingStackTests` | pending |
| Camera Raw curves | Drags a region of the parametric curve and a point on a channel's curve; the image follows. | — | `CameraRawCurveMixerTests`, `CameraRawTests` | pending |
| Dither ASCII and Scanlines | ASCII draws letters at the chosen size; Scanlines (CRT) applies. | — | `DitherTests`, `ScanlinesTests` | pending |
| Export JPEG preview | Zooms the preview to 100% and back to Fit; the View menu's zoom keys work on it. | — | `JPEGPreviewTests`, `JPEGExportSheetTests` | pending |
| Quit mid-edit | Quits with a gradient pending and a dialog open; the app asks once and closes. | — | `QuitPendingEditsTests`, `WindowTeardownTests` | pending |
## Known differences from Compositor
+1 -1
View File
@@ -13,7 +13,7 @@
in {
packages.x86_64-linux.default = pkgs.stdenv.mkDerivation {
pname = "omaphoto";
version = "1.3.3";
version = "1.4.5";
# dev.sh builds in ./build; the package starts clean.
src = pkgs.lib.cleanSourceWith {
src = self;
+1 -1
View File
@@ -1,6 +1,6 @@
# Built from this checkout: run makepkg in packaging/arch.
pkgname=omaphoto
pkgver=1.3.3
pkgver=1.4.5
pkgrel=1
pkgdesc='Layered image editing for Linux, a port of Compositor'
arch=('x86_64')
+48 -32
View File
@@ -1,50 +1,66 @@
# OmaPhoto 1.3.3
# OmaPhoto 1.4.5
OmaPhoto 1.3.3 catches up with Compositor 1.3.3. It follows 1.2.3.
OmaPhoto 1.4.5 catches up with Compositor 1.4.5. It follows 1.3.3.
## New tools and commands
- **Filter › Dither.** Error diffusion (Atkinson, Floyd–Steinberg), ordered Bayer, halftone dots, lines and diamonds, patterns and ASCII. Chunky pixels, square or round. Black and white, two colours from the picker, or the image's own.
- **Finishing filters:** Vignette, Bloom / Glow and Tonal Contrast. Vignette also paints across an empty layer.
- **File › Open Recent**, with Clear Menu.
- **Reload on change.** A project changed on disk by another program reloads. With unsaved edits it asks first: revert, or keep what you have.
- **Photoshop:** Large Documents (PSB), files with only a merged image, oversized layers cropped to the canvas, and simple text layers as editable text.
- **SVG import.**
- **Whole layers on the clipboard**, within a project and between projects. Ctrl+J duplicates every selected layer, folders included.
- **A layer context menu** in the Layers panel.
- **Scrubbing.** Drag a number's title to change it, in the tool bars, the layer opacity, the sheets and the panels.
- **Crop ratios** 3:4 and 9:16, and a crop that starts at the selection.
- **Select › Color Range.** Pick colours on the canvas and widen or narrow the match. The selection follows them.
- **View › Grid Settings.** Set the grid's spacing, subdivisions, colour, style and opacity. Restore Defaults puts them back. The settings last across launches.
- **Snapping for selections and shapes.** The Marquee, the Shape tool and a moved selection snap to what View › Snap To names. Hold Ctrl to draw freely.
- **New Canvas presets.** A ⋮ button beside the title offers common sizes: 4K, 1440p, 1080p, Apple screens and social formats. The size the fields hold is checked.
- **Layer › Ungroup Layers** (Ctrl+Shift+G), also in a folder's right-click menu. The folder's layers take its place, in order.
- **Project tabs drag to reorder.** Tabs that do not fit gather under a "3 more tabs" pill. Its menu lists them and switches to the one chosen. The tab in front always shows.
## Painting and editing
- A brush paints at the layer's own resolution. Clone Stamp and Blur sample there too. A blank layer paints at the document's resolution.
- When a brush cannot paint, the status line says why: a hidden layer, a folder, a mask turned off, an empty selection and so on.
- Liquify keeps pixels sharp. Smudge leaves no ghost copies. The Blur brush has its own Radius. Blur, Smudge and Liquify work on big canvases.
- Shift keeps moved pixels on a straight line.
- Select All, then Inverse, deselects.
- Ctrl+A selects the canvas from the Layers panel too.
- In the Move tool, Ctrl flips Auto Select and Shift the aspect lock while held, and the bar shows it. Values typed in the bar apply at once, as one undo step. Resize handles snap.
- Cancel and Apply show only when an edit waits for them. A scaled layer shows its scale.
## Text
- Colour only the selected letters of the text being edited. The swatch follows the caret, and the selection stays see-through under the picker.
- Text being typed shows as the pixels it will commit to.
- A click places text on its first baseline. The Move tool's double click opens live text.
- Closing or quitting while text is edited applies it first.
- Filters, adjustments and Invert wait until text editing ends. Closing the colour picker gives open text the keys back.
- A font change applies to the selected letters. A mixed selection shows (Multiple).
- The Type bar's font menu draws each name in its own face. Hovering a face previews it on the text.
- Ctrl+Z while typing takes back what was typed.
## Layers, masks and panels
## Masks and layers
- Masks can be painted anywhere on the canvas. A moved, unlinked mask stays in place under layer effects. Mask thumbnails show a white or black ground, as the canvas treats it.
- Layer effects stay on screen while text is edited, masks are painted and steps are undone.
- Coloured slider tracks with double-click reset in Black & White, Color Balance and Hue/Saturation. Filter sliders line up under the widest title.
- Camera Raw's Color Grading sits under Color and starts open.
- Image Size keeps print sizes through an invalid resolution.
- Stepped keyboard zoom and a steady tab strip.
- Marching ants stay smooth when zoomed out. The document's pixel budget follows the machine's memory.
- Masks work as in Photoshop. The mask button reveals the selection, and Alt-click hides it. Alt-click on a mask thumbnail shows the mask alone. Alt over a mask thumbnail shows a pointer with an eye.
- The canvas is sharper with adjustment layers. An upright layer at 1:1 draws pixel for pixel.
- Clipping stacks blend in their base's mode everywhere: on the canvas, in export and in Copy Merged.
- Soft Light follows Photoshop's formula. Soft, partly clear layers blend alike in Soft Light, Overlay, Multiply and Color Dodge.
- Positive Saturation matches Photoshop. Levels and Hue/Saturation use every core.
- Grain and Add Noise stay put while you pan and zoom.
- Photoshop files keep their adjustments and masks better.
## Filters and adjustments
- Camera Raw's curves work as Photoshop's: a smooth parametric curve and point curves for each channel. Drag a region of the graph to lift or lower it. Refine Saturation has its new meaning.
- Dither's ASCII draws readable text, with its own text size. Dither › Scanlines (CRT) runs on every core.
- A blur's preview stays while the layer grows.
## Export and sheets
- Export JPEG has a zoomable preview at full size, with Fit and zoom steps. The View menu's zoom keys work on it.
- Export JPEG and Canvas Size use the app's own colour picker.
- An import error has one OK.
## Projects
- Editing goes on while a project saves. Saves, reloads and opens wait their turn behind one writer.
- OmaPhoto 1.3.3 saves project format 10 and opens formats 1 to 10, as Compositor 1.3.3 does. Projects saved here cannot be reopened in OmaPhoto 1.2.3 or Compositor 1.3.1.
- `docs/writing-comp-files.md` guides AI agents that write projects.
- Every save writes `QuickLook/Preview.jpg` into the project folder, as Compositor does. On a Mac, Finder's Space-bar preview shows it. Loading ignores it.
- OmaPhoto 1.4.5 saves project format 11 and opens formats 1 to 11, as Compositor 1.4.5 does. Projects saved here cannot be reopened in OmaPhoto 1.3.3.
## Fixes
- A sheet or Camera Raw group closed while one of its fields held the keys no longer writes into freed memory.
- Export failure tests are steady: a project snapshot no longer holds two layer lists while it grows.
- Overlapping writes, and a quit before a write finished, can no longer lose a save.
- Quit works in the middle of a gradient or with a dialog open. Pending edits are applied or cancelled first.
- Two crashes when a window closed are fixed.
- On NVIDIA with Hyprland at a fractional scale, OmaPhoto's own cursors can show garbled. The README names the workaround: software cursors.
## Packages
DEB (Ubuntu 24.04 and 26.04), RPM (Fedora), Arch (PKGBUILD) and Nix (flake) are built from the same install.
DEB (Ubuntu 24.04 and 26.04), RPM (Fedora 43 and 44), Arch (PKGBUILD) and Nix (flake) are built from the same install.