diff --git a/src/render/symbol/viewer.cpp b/src/render/symbol/viewer.cpp index 300e2ffc..882ff9cc 100644 --- a/src/render/symbol/viewer.cpp +++ b/src/render/symbol/viewer.cpp @@ -78,76 +78,63 @@ 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);/ -//} -static void bitwiseBlitOr(Image& dst, const Image& src) { - int w = dst.GetWidth(); - int h = dst.GetHeight(); - if (src.GetWidth() != w || src.GetHeight() != h) return; +void combineBuffers(DC& dc, DC* borders, DC* interior) { + if (!borders && !interior) return; - Byte* dd = dst.GetData(); - const Byte* sd = src.GetData(); + 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; - size_t count = (size_t)w * (size_t)h * 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) { - dd[i] = dd[i] | sd[i]; + outData[i] = outData[i] | borderData[i]; } -} - -static void bitwiseBlitAndInvert(Image& dst, const Image& src) { - int w = dst.GetWidth(); - int h = dst.GetHeight(); - if (src.GetWidth() != w || src.GetHeight() != h) return; - - Byte* dd = dst.GetData(); - const Byte* sd = src.GetData(); - - size_t count = (size_t)w * (size_t)h * 3; + } + + // 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) { - dd[i] = dd[i] & (Byte)~sd[i]; + outData[i] = outData[i] & (Byte)~interiorData[i]; } -} + } -void combineBuffers(DC& dc, DC* borders, DC* interior) { - wxSize s = dc.GetSize(); + Bitmap finalBmp(outImg); + dc.DrawBitmap(finalBmp, 0, 0, false); +#endif + +} - // Copy base DC into an image - Bitmap outBmp(s.GetWidth(), s.GetHeight(), 24); - wxMemoryDC outDC; - outDC.SelectObject(outBmp); - outDC.Blit(0, 0, s.GetWidth(), s.GetHeight(), &dc, 0, 0, wxCOPY); - outDC.SelectObject(wxNullBitmap); - - Image out = outBmp.ConvertToImage(); - - if (borders) { - Bitmap borderBmp(s.GetWidth(), s.GetHeight(), 24); - wxMemoryDC borderCopy; - borderCopy.SelectObject(borderBmp); - borderCopy.Blit(0, 0, s.GetWidth(), s.GetHeight(), borders, 0, 0, wxCOPY); - borderCopy.SelectObject(wxNullBitmap); - - Image borderImg = borderBmp.ConvertToImage(); - bitwiseBlitOr(out, borderImg); - } - - if (interior) { - Bitmap interiorBmp(s.GetWidth(), s.GetHeight(), 24); - wxMemoryDC interiorCopy; - interiorCopy.SelectObject(interiorBmp); - interiorCopy.Blit(0, 0, s.GetWidth(), s.GetHeight(), interior, 0, 0, wxCOPY); - interiorCopy.SelectObject(wxNullBitmap); - - Image interiorImg = interiorBmp.ConvertToImage(); - bitwiseBlitAndInvert(out, interiorImg); - } - - Bitmap finalBmp(out); - dc.DrawBitmap(finalBmp, 0, 0, false); -} void SymbolViewer::draw(DC& dc) { bool paintedSomething = false; bool buffersFilled = false;