From 77ca4ae9db0b8adb80536eabffb5d65893990b66 Mon Sep 17 00:00:00 2001 From: Moonchild Date: Thu, 24 Nov 2022 12:37:28 +0000 Subject: [PATCH] Issue #2033 - Temporary fix of R<->B channel swap. We have a BGR/RGB channel ordering mismatch here. to at least provide proper display, a quick&dirty byte swap on the output buffer will fix this for now, but we should look into seeing where the surface mismatch is caused. std::swap() should optimize pretty well in any of the used compilers, but if necessary, a full buffer ASM routine can be slotted in (although on current hardware I doubt this will be even noticeable as it is) --- image/decoders/nsJXLDecoder.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/image/decoders/nsJXLDecoder.cpp b/image/decoders/nsJXLDecoder.cpp index 07a7849e28..fa4f6e77de 100644 --- a/image/decoders/nsJXLDecoder.cpp +++ b/image/decoders/nsJXLDecoder.cpp @@ -141,6 +141,11 @@ nsJXLDecoder::ReadJXLData(const char* aData, size_t aLength) Nothing(), SurfacePipeFlags()); for (uint8_t* rowPtr = mOutBuffer.begin(); rowPtr < mOutBuffer.end(); rowPtr += mInfo.xsize * 4) { + // FIXME: Quick and dirty BGRA to RGBA conversion. + // We currently have a channel ordering mis-match here. + for (uint8_t* pixPtr = rowPtr; pixPtr < rowPtr + mInfo.xsize * 4; pixPtr+=4){ + std::swap(pixPtr[0], pixPtr[2]); + } pipe->WriteBuffer(reinterpret_cast(rowPtr)); }