From 623c116b7a7401e04ce6674eabaf1ccb4ca328cf Mon Sep 17 00:00:00 2001 From: Daniel Kulp Date: Mon, 13 Jul 2020 15:57:59 +0200 Subject: [PATCH] Honour the colour alpha channel in wxAuiBitmapFromBits() This fixes creating wrong bitmaps for system colours with alpha and allows to use the correct wxSYS_COLOUR_INACTIVECAPTIONTEXT constant in wxAuiGenericTabArt instead of a wrong but, due to the loss of alpha, better looking wxSYS_COLOUR_INACTIVECAPTION which was used before. --- src/aui/dockart.cpp | 35 ++++++++++++++++++++++++++++++++--- src/aui/tabart.cpp | 8 ++++---- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/src/aui/dockart.cpp b/src/aui/dockart.cpp index c4a328459e..22f0f65e11 100644 --- a/src/aui/dockart.cpp +++ b/src/aui/dockart.cpp @@ -95,9 +95,38 @@ wxBitmap wxAuiBitmapFromBits(const unsigned char bits[], int w, int h, const wxColour& color) { wxImage img = wxBitmap((const char*)bits, w, h).ConvertToImage(); - img.Replace(0,0,0,123,123,123); - img.Replace(255,255,255,color.Red(),color.Green(),color.Blue()); - img.SetMaskColour(123,123,123); + if (color.Alpha() == wxALPHA_OPAQUE) + { + img.Replace(0,0,0,123,123,123); + img.Replace(255,255,255,color.Red(),color.Green(),color.Blue()); + img.SetMaskColour(123,123,123); + } + else + { + img.InitAlpha(); + const int newr = color.Red(); + const int newg = color.Green(); + const int newb = color.Blue(); + const int newa = color.Alpha(); + for (int x = 0; x < w; x++) + { + for (int y = 0; y < h; y++) + { + int r = img.GetRed(x, y); + int g = img.GetGreen(x, y); + int b = img.GetBlue(x, y); + if (r == 0 && g == 0 && b == 0) + { + img.SetAlpha(x, y, wxALPHA_TRANSPARENT); + } + else + { + img.SetRGB(x, y, newr, newg, newb); + img.SetAlpha(x, y, newa); + } + } + } + } return wxBitmap(img); } diff --git a/src/aui/tabart.cpp b/src/aui/tabart.cpp index 497ea8ba86..95a7a2bd5c 100644 --- a/src/aui/tabart.cpp +++ b/src/aui/tabart.cpp @@ -217,13 +217,13 @@ void wxAuiGenericTabArt::UpdateColoursFromSystem() m_baseColourBrush = wxBrush(m_baseColour); m_activeCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_CAPTIONTEXT)); - m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTION)); + m_disabledCloseBmp = wxAuiBitmapFromBits(close_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTIONTEXT)); m_activeLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_CAPTIONTEXT)); - m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTION)); + m_disabledLeftBmp = wxAuiBitmapFromBits(left_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTIONTEXT)); m_activeRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_CAPTIONTEXT)); - m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTION)); + m_disabledRightBmp = wxAuiBitmapFromBits(right_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTIONTEXT)); m_activeWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_CAPTIONTEXT)); - m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTION)); + m_disabledWindowListBmp = wxAuiBitmapFromBits(list_bits, 16, 16, wxSystemSettings::GetColour(wxSYS_COLOUR_INACTIVECAPTIONTEXT)); } wxAuiTabArt* wxAuiGenericTabArt::Clone()