fix collison of draw-bitmap with GC bitmap under Windows; merge to 5.0.1

(cherry picked from commit 5cfd52d224)
This commit is contained in:
Matthew Flatt 2010-07-20 21:19:08 -06:00 committed by Eli Barzilay
parent 6634eb3f0b
commit 83224e6596

View File

@ -25,7 +25,15 @@
// Declarations local to this file // Declarations local to this file
static wxMemoryDC *blit_dc, *blit_mdc; /* We need two temporary DCs for the Blit method. One would be
enough, except that some forms of Blit can allocate,
which can trigger a GC and a GC-icon blit that also
needs a temporary DC. */
static wxMemoryDC *blit1_dc;
static int blit1_in_use;
static wxMemoryDC *blit2_dc;
static int blit2_in_use;
static wxMemoryDC *blit_mdc; /* GC Blit cannot use a mask */
#define wxPI 3.141592653589793 #define wxPI 3.141592653589793
@ -2518,6 +2526,7 @@ Bool wxDC::Blit(double xdest, double ydest, double width, double height,
wxBitmap *invented = NULL; wxBitmap *invented = NULL;
Bool success = 1, invented_col = 0, use_alpha = 0; Bool success = 1, invented_col = 0, use_alpha = 0;
DWORD op = 0; DWORD op = 0;
wxMemoryDC *blit_dc = NULL;
dc = ThisDC(); dc = ThisDC();
@ -2546,9 +2555,11 @@ Bool wxDC::Blit(double xdest, double ydest, double width, double height,
iw = (int)floor(xsrc + width) - xsrc1; iw = (int)floor(xsrc + width) - xsrc1;
ih = (int)floor(ysrc + height) - ysrc1; ih = (int)floor(ysrc + height) - ysrc1;
if (!blit_dc) { if (!blit1_dc) {
wxREGGLOB(blit_dc); wxREGGLOB(blit1_dc);
blit_dc = new wxMemoryDC(1); wxREGGLOB(blit2_dc);
blit1_dc = new wxMemoryDC(1);
blit2_dc = new wxMemoryDC(1);
} }
sel = (wxMemoryDC *)source->selectedInto; sel = (wxMemoryDC *)source->selectedInto;
@ -2556,6 +2567,13 @@ Bool wxDC::Blit(double xdest, double ydest, double width, double height,
sel->SetScaleMode(wxWX_SCALE); sel->SetScaleMode(wxWX_SCALE);
dc_src = sel->ThisDC(FALSE); dc_src = sel->ThisDC(FALSE);
} else { } else {
if (blit1_in_use) {
blit2_in_use++;
blit_dc = blit2_dc;
} else {
blit1_in_use++;
blit_dc = blit1_dc;
}
blit_dc->SelectObject(source); blit_dc->SelectObject(source);
dc_src = blit_dc->ThisDC(FALSE); dc_src = blit_dc->ThisDC(FALSE);
} }
@ -2705,6 +2723,10 @@ Bool wxDC::Blit(double xdest, double ydest, double width, double height,
} else { } else {
blit_dc->DoneDC(dc_src); blit_dc->DoneDC(dc_src);
blit_dc->SelectObject(NULL); blit_dc->SelectObject(NULL);
if (blit_dc == blit1_dc)
blit1_in_use--;
else
blit2_in_use--;
} }
return 0; return 0;
} }
@ -2838,6 +2860,10 @@ Bool wxDC::Blit(double xdest, double ydest, double width, double height,
} else { } else {
blit_dc->DoneDC(dc_src); blit_dc->DoneDC(dc_src);
blit_dc->SelectObject(NULL); blit_dc->SelectObject(NULL);
if (blit_dc == blit1_dc)
blit1_in_use--;
else
blit2_in_use--;
} }
if (mdc && (mdc != dc_src)) { if (mdc && (mdc != dc_src)) {
if (msel) { if (msel) {
@ -2971,7 +2997,8 @@ void wxCanvasDC::TryColour(wxColour *src, wxColour *dest)
Bool wxCanvasDC::GCBlit(double xdest, double ydest, double width, double height, Bool wxCanvasDC::GCBlit(double xdest, double ydest, double width, double height,
wxBitmap *source, double xsrc, double ysrc) wxBitmap *source, double xsrc, double ysrc)
{ {
if (blit_dc) if ((blit1_dc && !blit1_in_use)
|| (blit2_dc && !blit2_in_use))
return Blit(xdest, ydest, width, height, source, xsrc, ysrc, wxSTIPPLE, NULL); return Blit(xdest, ydest, width, height, source, xsrc, ysrc, wxSTIPPLE, NULL);
else else
return FALSE; return FALSE;