From 17c34d41babe5af4efa59eb06abc58c36582a953 Mon Sep 17 00:00:00 2001 From: Tim Eliseo <667606+teliseo@users.noreply.github.com> Date: Tue, 21 Nov 2023 19:45:57 -0800 Subject: [PATCH] Don't premultiply pixels from wxBitmapBundle::FromSVG() on wxGTK. See #24064. --- src/generic/bmpsvg.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/generic/bmpsvg.cpp b/src/generic/bmpsvg.cpp index 18f5f7bac9..dd6672cad8 100644 --- a/src/generic/bmpsvg.cpp +++ b/src/generic/bmpsvg.cpp @@ -189,11 +189,25 @@ wxBitmap wxBitmapBundleImplSVG::DoRasterize(const wxSize& size) for ( int x = 0; x < size.x; ++x ) { const unsigned char a = src[3]; +#if defined (__WXMSW__) || defined(__WXOSX__) || defined(__WXQT__) + // MSW, OSX, and Qt bitmaps require premultiplication by alpha. dst.Red() = src[0] * a / 255; dst.Green() = src[1] * a / 255; dst.Blue() = src[2] * a / 255; dst.Alpha() = a; - +#else + // Other platforms (esp. GTK) store bitmaps with straight alpha. + dst.Alpha() = a; + if ( a ) + { + dst.Red() = src[0]; + dst.Green() = src[1]; + dst.Blue() = src[2]; + } + else + // A more canonical form for completely transparent pixels + dst.Red() = dst.Green() = dst.Blue() = 0; +#endif ++dst; src += 4; }