From 211b81f45956ba7939d371d72048d6eca81bcdff Mon Sep 17 00:00:00 2001 From: New Pagodi Date: Sat, 30 Mar 2019 03:44:09 +0100 Subject: [PATCH] Restore handling of XPMs with a mask in wxStyledTextCtrl Fix XPM to RGBA conversion code for Scintilla markers to handle mask correctly. Closes #18374. --- src/stc/ScintillaWX.cpp | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/stc/ScintillaWX.cpp b/src/stc/ScintillaWX.cpp index 20b155069f..208743fef4 100644 --- a/src/stc/ScintillaWX.cpp +++ b/src/stc/ScintillaWX.cpp @@ -1346,12 +1346,32 @@ void ScintillaWX::DoMarkerDefineBitmap(int markerNumber, const wxBitmap& bmp) { wxImage img = bmp.ConvertToImage(); int curRGBALoc = 0, curDataLoc = 0, curAlphaLoc = 0; - for ( int i = 0; i < totalPixels; ++i ) { - rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; - rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; - rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; - rgba[curRGBALoc++] = - img.HasAlpha() ? img.GetAlpha()[curAlphaLoc++] : wxALPHA_OPAQUE ; + if ( img.HasMask() ) { + for ( int y = 0; y < bmp.GetHeight(); ++y ) { + for ( int x = 0 ; x < bmp.GetWidth(); ++x ) { + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.IsTransparent(x,y) + ? wxALPHA_TRANSPARENT : wxALPHA_OPAQUE ; + } + } + } + else if ( img.HasAlpha() ) { + for ( int i = 0; i < totalPixels; ++i ) { + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.GetAlpha()[curAlphaLoc++]; + } + } + else { + for ( int i = 0; i < totalPixels; ++i ) { + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = img.GetData()[curDataLoc++]; + rgba[curRGBALoc++] = wxALPHA_OPAQUE ; + } } // Now follow the same procedure used for handling the