Closed lboklin closed 5 years ago
This seems to apply for all applications, regardless of whether run in XWayland or native Wayland.
Red is blue, and blue is red:
So I experimented with swapping red and blue, and the colours are more correct but they appear washed out:
Simula:
vs desktop:
So it doesn't appear to just be an BGRA8 -> RGBA8 issue.
Maybe something transparency related? Hmm.
I tried messing with the alpha channel too but the only alpha value was around the border.
When alpha is set to 1:
Should be noted that the only thing I'm doing is manipulating the colour of the pixels in the image after it has been created from the byte array.
Don't mind the insane performance implications since it's only for testing, but here's the code I'm using:
colorCorrect img = do
width <- G.get_width img
height <- G.get_height img
-- walk through every pixel - SUPER SLOW
let pixels = [ (x,y) | x <- [0..(width-1)], y <- [0..(height-1)] ]
bracket
(G.lock img)
(const $ G.unlock img)
$ const $ flip mapM_ pixels $ \(x,y) -> do
clr <- G.get_pixel img x y :: IO GodotColor
r <- godot_color_get_r clr :: IO CFloat
b <- godot_color_get_b clr :: IO CFloat
godot_color_set_r clr b
godot_color_set_b clr r
godot_color_set_a clr (fromRational 1)
G.set_pixel img x y clr
I've been ignoring the apparent ARGB8888 vs RGBA8 discrepancy here since it doesn't seem to be an issue of A->R, R->G, G->B, B->A, but maybe I'm not understanding the implications correctly.
WlShmFormatArgb8888 -> Image.FORMAT_RGBA8
Maybe qt is using a different color space, like sRGB vs RGBA? That would be one cause for "washed out" colors.
It happens with any toolkit though.
Chromium in Simula (forgot to disable the alpha manipulation so ignore the black borders):
and on desktop:
Regarding sRGB and RGBA, this is what the Godot docs have to say about the format conversion:
FORMAT_RGBA8 = 5 — OpenGL texture format RGBA with four components, each with a bitdepth of 8. Note that when creating an ImageTexture, an sRGB to linear color space conversion is performed.
For no particularly informed reason I tested with G.srgb_to_linear img
(in addition to the R<->B swap) as well and it looked surprisingly close to correct, with the exception that very light pixels became green. Maybe that makes sense to someone who knows more about colour formats than me.
Also for completeness sake, here's what it says in the header file about the Wayland format:
/**
* 32-bit ARGB format, [31:0] A:R:G:B 8:8:8:8 little endian
*/
WL_SHM_FORMAT_ARGB8888 = 0,
Fixed in d103d920fc72b87a298f28df2818fdb85d1fb222
With or without HDR enabled, this happens: