3 Commits

Author SHA1 Message Date
Amy Markey 2f83850b60 Developer list addition
Adding myself to the developer list for vanity purposes.
2026-04-19 07:36:08 -04:00
GenevensiS 968ad5f196 change background to system 2026-04-19 11:26:20 +02:00
Valyth fc95960734 This fixes incorrect expansion symbol rendering on Linux/wxGTK.
Expansion symbol rendering relied on wxDC logical raster ops
(wxOR / wxAND_INVERT) during buffer composition. On wxGTK this
produced incorrect symbol/background inversion, likely due to
backend differences in logical-function handling.

This replaces the logical blits in combineBuffers() with explicit
per-pixel compositing that preserves the intended bitwise behavior
while producing consistent results across platforms.

Tested:
- Linux: fixes incorrect expansion symbol rendering/export
- Windows: no regression observed in rendering/export
2026-04-19 10:12:23 +02:00
3 changed files with 59 additions and 7 deletions
+2 -1
View File
@@ -40,7 +40,8 @@ const char* MSE_AUTHORS[] = {
"Olivier Bocksberger (G-e-n-e-v-e-n-s-i-S)",
"Brendan Hagan (haganbmj)",
"Thomas Tkacz (TomTkacz)",
"CaiCai (247321453)"
"CaiCai (247321453)",
"Amy Markey (amyinspace)"
};
void AboutWindow::draw(DC& dc) {
+1 -1
View File
@@ -50,7 +50,7 @@ SetWindow::SetWindow(Window* parent, const SetP& set)
SetIcon(load_resource_icon(_("app")));
// avoid flicker
SetBackgroundStyle(wxBG_STYLE_PAINT);
SetBackgroundStyle(wxBG_STYLE_SYSTEM);
// initialize menu bar
auto menuBar = new wxMenuBar();
+56 -5
View File
@@ -78,11 +78,62 @@ MemoryDCP getTempDC(DC& dc) {
}
// Combine the temporary DCs used in the drawing with the main dc
void combineBuffers(DC& dc, DC* borders, DC* interior) {
wxSize s = dc.GetSize();
if (borders) dc.Blit(0, 0, s.GetWidth(), s.GetHeight(), borders, 0, 0, wxOR);
if (interior) dc.Blit(0, 0, s.GetWidth(), s.GetHeight(), interior, 0, 0, wxAND_INVERT);
}
void combineBuffers(DC& dc, DC* borders, DC* interior) {
if (!borders && !interior) return;
wxSize size = dc.GetSize();
int width = size.GetWidth();
int height = size.GetHeight();
#ifdef __WXMSW__
if (borders) dc.Blit(0, 0, width, height, borders, 0, 0, wxOR);
if (interior) dc.Blit(0, 0, width, height, interior, 0, 0, wxAND_INVERT);
#else
// wxOR and wxAND_INVERT are currently only implemented on Windows, so we have to do them manually
size_t count = (size_t)width * (size_t)height * 3;
// Copy base DC into an image
Bitmap outBmp(width, height, 24);
wxMemoryDC outDC;
outDC.SelectObject(outBmp);
outDC.Blit(0, 0, width, height, &dc, 0, 0, wxCOPY);
outDC.SelectObject(wxNullBitmap);
Image outImg = outBmp.ConvertToImage();
Byte* outData = outImg.GetData();
// wxOR border
if (borders) {
Bitmap borderBmp(width, height, 24);
wxMemoryDC borderDC;
borderDC.SelectObject(borderBmp);
borderDC.Blit(0, 0, width, height, borders, 0, 0, wxCOPY);
borderDC.SelectObject(wxNullBitmap);
Image borderImg = borderBmp.ConvertToImage();
Byte* borderData = borderImg.GetData();
for (size_t i = 0; i < count; ++i) {
outData[i] = outData[i] | borderData[i];
}
}
// wxAND_INVERT interior
if (interior) {
Bitmap interiorBmp(width, height, 24);
wxMemoryDC interiorDC;
interiorDC.SelectObject(interiorBmp);
interiorDC.Blit(0, 0, width, height, interior, 0, 0, wxCOPY);
interiorDC.SelectObject(wxNullBitmap);
Image interiorImg = interiorBmp.ConvertToImage();
Byte* interiorData = interiorImg.GetData();
for (size_t i = 0; i < count; ++i) {
outData[i] = outData[i] & (Byte)~interiorData[i];
}
}
Bitmap finalBmp(outImg);
dc.DrawBitmap(finalBmp, 0, 0, false);
#endif
}
void SymbolViewer::draw(DC& dc) {
bool paintedSomething = false;