A long overdue dev log. The last one was for September 2023. That's a
year. Stuff in life has happened.
Compiano
In November I switched Compiano to use pipewire directly for
sound. This mean removing bits of UI too.
I should look at a release, but I have a few blockers I need to
tackle. One key element is that there is a mechanism to download the
soundbanks and for now it doesn't ask consent to do so. I don't want a
release without this.
Raw thumbnailer
I already posted about it.
libopenraw
Lot has happened on that front. I want it to be a foundation of Niepce
and others.
First adding it to glycin triggered an alpha release on
crates.io. There started a long cycle of alpha release, we are at
alpha 8 as of now. Various changes:
- Added the mp4parse crate directly as a module. A key reason is that
I already used a fork so it complicate things. Maybe I should make
these few bits upstreamable and use upstream.
- Added a mime types API
- Save up a lot of RAM when doing colour interpolation: it's done in
place instead of allocating a new buffer. This is significant as
this is done using a 64-bit float per component.
- Fixed the rendering in many ways. The only thing it needs it to
apply the colour balance.
- Fixed unpack or decompression of Olympus and Fuji files.
- Got an external contribution: Panasonic
decompression. This
made me fix the loading of uncompressed Panasonic raw too. The more
recent Panasonic cameras are still failing though, there is a subtle
variant that needs to be handled.
Still missing from rendering: recent Nikon and all their exotic
variants and compression scheme, Canon CR3, GoPro, Sony.
Niepce
Not so much work directly done on Niepce in the last few month, but
still.
Ongoing features
Started a while ago some work towards the import and a rework of the
catalog (the main data storage).
The former is the implementation of a workflow that allow immporting
images into the catalog.
The latter involve reworking the catalog to become a self contained
storage as a sqlite3 database. One step I already did was to use it to
store the catalog preferences instead of a separate file. This should
also include fixing the UI open, creating, switching.
This big two things are user visible and are a stop forward what I
want to happen as an internal milestone. Then I can start pluging the
library import and maybe import my picture vault. A good starting
point towards managing the collection, but not really for photo
editing yet. Gotta make choices.
Images
Implemented support for HEIF which is being adopted by camera
manufacturers.
I updated the RT engine to 5.11 which came with RawTherapee 5.11. This
is still a soft work of the code base to use strip out Gtk3 and a more
recent version of glibmm. The latter patch might no longer be needed
as I have since removed gtkmm from Niepce.
I also implemented the GEGL pipeline using
gegl-rs, which I took
over to make it useful. At one I shall try to figure out how to write
a loader in Rust to use libopenraw with GEGL.
Cleanups
The UI is slowly moving to use blueprint, and I removed all the
first-party C++ code outside of bindings, no more Gtkmm and Glibmm is
only here because RT engine needs it.
Other
Stuff I contributed to.
STF
I took part to the STF effort and worked on fixing issues with
the desktop portal. The big chunk of the work related to the USB
portal, taking over code by Georges that is itself based on code by
Ryan. It spreads through multiple component of the stack: flatpak,
xdg-desktop-portal, xdg-desktop-portal-gnome, libportal and ashpd.
I also did a bunch of bug fixes, crashes, memory leaks, etc in
flatpak, flatpak-builder, and the rest of the stack.
I also implemented issue
#1 for
flatpak-builder: easy renaming of MIME files and icons, and also
properly fixing the id
in the appstream file, a common problem in
flatpak.
Glycin
Glycin is a sandboxed image loader. I did implement the raw camera
loader
using libopenraw. It's written in Rust, so is libopenraw now. Thank
you Sophie for merging it.
Poppler
Jeff was complaining about a file being super
slow,
with sysprof flamegraph. That picked my curiosity and looked at
it. The peculiarity of the document is that it has 16000 pages and a
lot of cross references.
This lead to two patches:
-
The first
one
is in 24.06. There was a loop, calling for the length of the
container at each iteration. Turns out this is protected by a mutex
and that's a lot of time spend for nothing since the value is
immutable. Call it once before the loop and voila.
-
The other
one,
merged for 24.09 change that loop to be a hash table lookup. The
problem is that it want to locate the page by object reference, but
iterate through the page list. Lots of ref and lots of a page mean
even more iterator. The more complex approach is when building the
page cache (it's done on demand), we build a reference to page index
map. And the slow code is no longer slow and almost disappear from
the flamegraphs.
This make Evince and Okular faster to open that document and any
presenting similar attribute: a lot of bookmarks.