antialiasing/compositing in linear light?
Bandi-T
bandit at surfnonstop.com
Tue Dec 26 06:32:21 UTC 2023
Greetings,
Is Cairo antialiasing/compositing in linear light?
I am drawing graphs into onto on-screen areas using Cairo/GTK4
(Gtk::DrawingArea)/Win10, and the edges of my slanted
(non-vertical/horizontal) lines (straight line segments) look jagged...
like they might not have been antialiased in linear light, but in
gamma-space.
If my observation is correct, I am proposing enhancing Cairo to be able
to perform anti-aliasing/compositing in linear light.
This would switch internal pixel representation to linear light (float
or at least 12-13 bits/component – so practically uint16), and then only
upon a snapshotting (outputting the result) would it generate a 8 bit
sRGB representation for legacy environments that still expect sRGB, or
pass through the 16 bit linear representation for more modern
environments (e.g. GPU textures).
Please see this article with visual demonstrations and discussion about
the potential improvements:
https://pixls.us/articles/users-guide-to-high-bit-depth-gimp-2-9-2-part-2/
Conceptually, this would
* convert all incoming legacy color (= color specified in gamma-encoded
spaces, e.g. sRGB – be it from image pixels, or user-speficied pen/fill
colors, etc.) into linear light
* internally, always work (draw/paint/antialias/composite) in linear light
* when a gamma-encoded output is needed, render a gamma-encoded snapshot
of the result
For sRGB (which I assume is going to be the most common case) the needed
maths is elaborated in the Wikipedia article of sRGB.
Because this needs extra buffering, plus implies non-zero computational
cost, it would be behind a higher quality antialias flag, so that users
who don't care would not pay the extra computational costs. (However my
hope is that the cost on modern hardware versus the quality improvement
would eventually make this the default mode.)
This is orthogonal to whole-pixel versus sub-pixel antialiasing, so both
of those modes could/would/should benefit from it.
How viable is this proposal? (For example I am only considering the case
where Cairo is rendering into a pixel-based memory buffer that
eventually gets copied on-screen, and am unaware of what this might mean
for other scenarios.)
Thank you in advance.
More information about the cairo
mailing list