X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bbbbe360a81bab2ce9bc83aed4719765fd46d297..16bcc879d96712f9acf4bcc1236096251a1b7586:/src/gtk/dcclient.cpp diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index 2dec4c304d..b6044d4b6c 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -611,19 +611,37 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, /* we use the "XCopyArea" way to copy a memory dc into y different window if the memory dc BOTH a) doesn't have any mask or its mask isn't used - b) it is clipped. - we HAVE TO use the direct way for memory dcs - that have mask since the XCopyArea doesn't know - about masks and we SHOULD use the direct way if - all of the bitmap in the memory dc is copied in - which case XCopyArea wouldn't be able able to - boost performace by reducing the area to be scaled */ + b) it is clipped + c) is not 1-bit */ - use_bitmap_method = ( (useMask && (memDC->m_selected.GetMask())) || - ((xsrc == 0) && (ysrc == 0) && - (width == memDC->m_selected.GetWidth()) && - (height == memDC->m_selected.GetHeight()) ) - ); + if (useMask && (memDC->m_selected.GetMask())) + { + /* we HAVE TO use the direct way for memory dcs + that have mask since the XCopyArea doesn't know + about masks and */ + use_bitmap_method = TRUE; + } + else if (memDC->m_selected.GetDepth() == 1) + { + /* we HAVE TO use the direct way for memory dcs + that are bitmaps because XCopyArea doesn't copy + with different bit depths */ + use_bitmap_method = TRUE; + } + else if ((xsrc == 0) && (ysrc == 0) && + (width == memDC->m_selected.GetWidth()) && + (height == memDC->m_selected.GetHeight())) + { + /* we SHOULD use the direct way if all of the bitmap + in the memory dc is copied in which case XCopyArea + wouldn't be able able to boost performace by reducing + the area to be scaled */ + use_bitmap_method = TRUE; + } + else + { + use_bitmap_method = FALSE; + } } CalcBoundingBox( xdest, ydest ); @@ -648,6 +666,8 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, if ((bm_width != bm_ww) || (bm_height != bm_hh)) { + printf( "scaling.\n" ); + wxImage image( memDC->m_selected ); image = image.Scale( bm_ww, bm_hh ); @@ -682,14 +702,16 @@ bool wxWindowDC::Blit( long xdest, long ydest, long width, long height, GdkPixmap *pm = use_bitmap.GetPixmap(); if (pm) { - gdk_draw_pixmap( m_window, m_penGC, pm, 0, 0, xx, yy, ww, hh ); + gdk_draw_pixmap( m_window, m_penGC, pm, xsrc, ysrc, xx, yy, ww, hh ); } else { GdkBitmap *bm = use_bitmap.GetBitmap(); if (bm) { - gdk_draw_bitmap( m_window, m_penGC, bm, 0, 0, xx, yy, ww, hh ); + /* we use the textGC here because blitting a bitmap is done + using the current text colour */ + gdk_draw_bitmap( m_window, m_textGC, bm, xsrc, ysrc, xx, yy, ww, hh ); } } @@ -837,15 +859,27 @@ void wxWindowDC::Clear() { wxCHECK_RET( Ok(), "invalid window dc" ); - if (!m_isMemDC) + /* - we either are a memory dc or have a window as the + owner. anything else shouldn't happen. + - we don't use gdk_window_clear() as we don't set + the window's background colour anymore. it is too + much pain to keep the DC's and the window's back- + ground colour in synch. */ + + if (m_owner) { - gdk_window_clear( m_window ); + int width,height; + m_owner->GetSize( &width, &height ); + gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height ); + return; } - else + + if (m_isMemDC) { int width,height; GetSize( &width, &height ); gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height ); + return; } } @@ -937,9 +971,12 @@ void wxWindowDC::SetBrush( const wxBrush &brush ) gdk_gc_set_fill( m_brushGC, fillStyle ); - if (m_brush.GetStyle() == wxSTIPPLE) + if ((m_brush.GetStyle() == wxSTIPPLE) && (m_brush.GetStipple()->Ok())) { - gdk_gc_set_stipple( m_brushGC, m_brush.GetStipple()->GetPixmap() ); + if (m_brush.GetStipple()->GetPixmap()) + gdk_gc_set_stipple( m_brushGC, m_brush.GetStipple()->GetPixmap() ); + else + gdk_gc_set_stipple( m_brushGC, m_brush.GetStipple()->GetBitmap() ); } if (IS_HATCH(m_brush.GetStyle())) @@ -962,11 +999,6 @@ void wxWindowDC::SetBackground( const wxBrush &brush ) if (!m_backgroundBrush.Ok()) return; - if (m_owner) - { - m_owner->SetBackgroundColour( m_backgroundBrush.GetColour() ); - } - m_backgroundBrush.GetColour().CalcPixel( m_cmap ); gdk_gc_set_background( m_brushGC, m_backgroundBrush.GetColour().GetColor() ); gdk_gc_set_background( m_penGC, m_backgroundBrush.GetColour().GetColor() ); @@ -1338,6 +1370,11 @@ void wxWindowDC::DrawSpline( wxList *points ) wx_spline_draw_point_array( this ); } +// Resolution in pixels per logical inch +wxSize wxWindowDC::GetPPI(void) const +{ + return wxSize(100, 100); +} //----------------------------------------------------------------------------- // wxPaintDC