X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f96aa4d9eb296b3dfc468a351ce013bf92fab983..e6b5bdedf81232eb4dd80104f3030be7c59a11fc:/src/gtk1/dcclient.cpp diff --git a/src/gtk1/dcclient.cpp b/src/gtk1/dcclient.cpp index 1d46f8b455..516237687e 100644 --- a/src/gtk1/dcclient.cpp +++ b/src/gtk1/dcclient.cpp @@ -119,6 +119,7 @@ wxPaintDC::wxPaintDC( wxWindow *window ) wxPaintDC::~wxPaintDC(void) { + Destroy(); } void wxPaintDC::FloodFill( long WXUNUSED(x1), long WXUNUSED(y1), @@ -475,7 +476,7 @@ void wxPaintDC::DrawIcon( const wxIcon &icon, long x, long y, bool useMask ) } bool wxPaintDC::Blit( long xdest, long ydest, long width, long height, - wxDC *source, long xsrc, long ysrc, int WXUNUSED(logical_func), bool WXUNUSED(useMask) ) + wxDC *source, long xsrc, long ysrc, int WXUNUSED(logical_func), bool useMask ) { if (!Ok()) return FALSE; @@ -484,16 +485,35 @@ bool wxPaintDC::Blit( long xdest, long ydest, long width, long height, if (csrc->m_isMemDC) { wxMemoryDC* srcDC = (wxMemoryDC*)source; - GdkBitmap* bmap = srcDC->m_selected.GetBitmap(); + GdkPixmap* bmap = srcDC->m_selected.GetPixmap(); if (bmap) { - gdk_draw_bitmap( m_window, m_textGC, bmap, + long xx = XLOG2DEV(xdest); + long yy = YLOG2DEV(ydest); + + GdkBitmap *mask = (GdkBitmap *) NULL; + if (srcDC->m_selected.GetMask()) mask = srcDC->m_selected.GetMask()->GetBitmap(); + + if (useMask && mask) + { + gdk_gc_set_clip_mask( m_penGC, mask ); + gdk_gc_set_clip_origin( m_penGC, xx, yy ); + } + + gdk_draw_pixmap( m_window, m_penGC, bmap, source->DeviceToLogicalX(xsrc), source->DeviceToLogicalY(ysrc), - XLOG2DEV(xdest), - YLOG2DEV(ydest), + xx, + yy, source->DeviceToLogicalXRel(width), source->DeviceToLogicalYRel(height) ); + + if (useMask && mask) + { + gdk_gc_set_clip_mask( m_penGC, (GdkBitmap *) NULL ); + gdk_gc_set_clip_origin( m_penGC, 0, 0 ); + } + return TRUE; } } @@ -827,15 +847,12 @@ void wxPaintDC::DestroyClippingRegion(void) void wxPaintDC::SetUpDC(void) { + Destroy(); m_ok = TRUE; m_logicalFunction = wxCOPY; - if (m_penGC) gdk_gc_unref( m_penGC ); m_penGC = gdk_gc_new( m_window ); - if (m_brushGC) gdk_gc_unref( m_brushGC ); m_brushGC = gdk_gc_new( m_window ); - if (m_textGC) gdk_gc_unref( m_textGC ); m_textGC = gdk_gc_new( m_window ); - if (m_bgGC) gdk_gc_unref( m_bgGC ); m_bgGC = gdk_gc_new( m_window ); SetTextForeground( m_textForegroundColour ); SetTextBackground( m_textBackgroundColour ); @@ -857,6 +874,18 @@ void wxPaintDC::SetUpDC(void) } } +void wxPaintDC::Destroy(void) +{ + if (m_penGC) gdk_gc_unref( m_penGC ); + m_penGC = (GdkGC*) NULL; + if (m_brushGC) gdk_gc_unref( m_brushGC ); + m_brushGC = (GdkGC*) NULL; + if (m_textGC) gdk_gc_unref( m_textGC ); + m_textGC = (GdkGC*) NULL; + if (m_bgGC) gdk_gc_unref( m_bgGC ); + m_bgGC = (GdkGC*) NULL; +} + GdkWindow *wxPaintDC::GetWindow(void) { return m_window;