From f234c60c4aac2e077b16b8fbb3009ad45a84c73b Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Wed, 10 Feb 1999 11:56:15 +0000 Subject: [PATCH] Various update to Blit() SetBackground() Clear() etc. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1664 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- distrib/gtk/copy_src | 8 +++++ samples/forty/card.cpp | 4 +-- src/gtk/colour.cpp | 1 + src/gtk/dcclient.cpp | 73 +++++++++++++++++++++++++++++------------- src/gtk/dialog.cpp | 2 +- src/gtk/window.cpp | 22 ++++++++----- src/gtk1/colour.cpp | 1 + src/gtk1/dcclient.cpp | 73 +++++++++++++++++++++++++++++------------- src/gtk1/dialog.cpp | 2 +- src/gtk1/window.cpp | 22 ++++++++----- wxGTK.spec | 4 +-- 11 files changed, 146 insertions(+), 66 deletions(-) diff --git a/distrib/gtk/copy_src b/distrib/gtk/copy_src index 0a532c00c8..1233b6aa07 100755 --- a/distrib/gtk/copy_src +++ b/distrib/gtk/copy_src @@ -190,6 +190,7 @@ cp ./gtk/glcanvas.h ~/wxgtk_dist/wxGTK/utils/glcanvas/gtk mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/cube +mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/isosurf mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin cd samples/cube @@ -198,6 +199,13 @@ cp cube.h ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/cube cp cube.cpp ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/cube cd .. +cd isosurf +cp Makefile ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/isosurf +cp isosurf.h ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/isosurf +cp isosurf.cpp ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/isosurf +cp isosurf.dat.gz ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/isosurf +cd .. + cd penguin cp Makefile ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin cp penguin.h ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin diff --git a/samples/forty/card.cpp b/samples/forty/card.cpp index 691347254c..5b5af43963 100644 --- a/samples/forty/card.cpp +++ b/samples/forty/card.cpp @@ -171,7 +171,7 @@ void Card::Erase(wxDC& dc, int x, int y) //+-------------------------------------------------------------+ void Card::Draw(wxDC& dc, int x, int y) { - wxBrush* backgroundBrush = & dc.GetBackground(); + wxBrush backgroundBrush( dc.GetBackground() ); dc.SetBrush(* wxWHITE_BRUSH); dc.SetPen(* wxBLACK_PEN); dc.DrawRoundedRectangle(x, y, CardWidth, CardHeight, 4); @@ -336,7 +336,7 @@ void Card::Draw(wxDC& dc, int x, int y) } } - dc.SetBackground(* backgroundBrush); + dc.SetBackground( backgroundBrush ); } // Card:Draw() diff --git a/src/gtk/colour.cpp b/src/gtk/colour.cpp index a3292d450d..88a76bba56 100644 --- a/src/gtk/colour.cpp +++ b/src/gtk/colour.cpp @@ -167,6 +167,7 @@ void wxColour::CalcPixel( GdkColormap *cmap ) if (!Ok()) return; if ((M_COLDATA->m_hasPixel) && (M_COLDATA->m_colormap == cmap)) return; + M_COLDATA->FreeColour(); GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) cmap; diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index 2dec4c304d..f03ce148a9 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; } } @@ -962,11 +996,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() ); diff --git a/src/gtk/dialog.cpp b/src/gtk/dialog.cpp index b64413f338..b8c54679b7 100644 --- a/src/gtk/dialog.cpp +++ b/src/gtk/dialog.cpp @@ -433,7 +433,7 @@ int wxDialog::ShowModal() wxFAIL_MSG( "wxDialog:ShowModal called twice" ); return GetReturnCode(); } - + Show( TRUE ); m_modalShowing = TRUE; diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 7f2da39fec..d450141f21 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -2424,12 +2424,11 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) { gdk_window_clear_area( m_wxwindow->window, rect->x, rect->y, - rect->width, - rect->height ); + rect->width, rect->height ); } else { - Clear(); + gdk_window_clear( m_wxwindow->window ); } } @@ -2484,7 +2483,10 @@ void wxWindow::Clear() { wxCHECK_RET( m_widget != NULL, "invalid window" ); - if (m_wxwindow && m_wxwindow->window) gdk_window_clear( m_wxwindow->window ); + if (m_wxwindow && m_wxwindow->window) + { + gdk_window_clear( m_wxwindow->window ); + } } #if wxUSE_TOOLTIPS @@ -2537,14 +2539,18 @@ void wxWindow::SetBackgroundColour( const wxColour &colour ) m_backgroundColour = colour; if (!m_backgroundColour.Ok()) return; - if (m_wxwindow) + if (m_wxwindow && m_wxwindow->window) { - GdkWindow *window = m_wxwindow->window; - m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); - gdk_window_set_background( window, m_backgroundColour.GetColor() ); + /* wxMSW doesn't clear the window here. I don't do that + either to provide compatibility. call Clear() to do + the job. */ + + m_backgroundColour.CalcPixel( gdk_window_get_colormap( m_wxwindow->window ) ); + gdk_window_set_background( m_wxwindow->window, m_backgroundColour.GetColor() ); } wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); + if (sysbg.Red() == colour.Red() && sysbg.Green() == colour.Green() && sysbg.Blue() == colour.Blue()) diff --git a/src/gtk1/colour.cpp b/src/gtk1/colour.cpp index a3292d450d..88a76bba56 100644 --- a/src/gtk1/colour.cpp +++ b/src/gtk1/colour.cpp @@ -167,6 +167,7 @@ void wxColour::CalcPixel( GdkColormap *cmap ) if (!Ok()) return; if ((M_COLDATA->m_hasPixel) && (M_COLDATA->m_colormap == cmap)) return; + M_COLDATA->FreeColour(); GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) cmap; diff --git a/src/gtk1/dcclient.cpp b/src/gtk1/dcclient.cpp index 2dec4c304d..f03ce148a9 100644 --- a/src/gtk1/dcclient.cpp +++ b/src/gtk1/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; } } @@ -962,11 +996,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() ); diff --git a/src/gtk1/dialog.cpp b/src/gtk1/dialog.cpp index b64413f338..b8c54679b7 100644 --- a/src/gtk1/dialog.cpp +++ b/src/gtk1/dialog.cpp @@ -433,7 +433,7 @@ int wxDialog::ShowModal() wxFAIL_MSG( "wxDialog:ShowModal called twice" ); return GetReturnCode(); } - + Show( TRUE ); m_modalShowing = TRUE; diff --git a/src/gtk1/window.cpp b/src/gtk1/window.cpp index 7f2da39fec..d450141f21 100644 --- a/src/gtk1/window.cpp +++ b/src/gtk1/window.cpp @@ -2424,12 +2424,11 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect ) { gdk_window_clear_area( m_wxwindow->window, rect->x, rect->y, - rect->width, - rect->height ); + rect->width, rect->height ); } else { - Clear(); + gdk_window_clear( m_wxwindow->window ); } } @@ -2484,7 +2483,10 @@ void wxWindow::Clear() { wxCHECK_RET( m_widget != NULL, "invalid window" ); - if (m_wxwindow && m_wxwindow->window) gdk_window_clear( m_wxwindow->window ); + if (m_wxwindow && m_wxwindow->window) + { + gdk_window_clear( m_wxwindow->window ); + } } #if wxUSE_TOOLTIPS @@ -2537,14 +2539,18 @@ void wxWindow::SetBackgroundColour( const wxColour &colour ) m_backgroundColour = colour; if (!m_backgroundColour.Ok()) return; - if (m_wxwindow) + if (m_wxwindow && m_wxwindow->window) { - GdkWindow *window = m_wxwindow->window; - m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); - gdk_window_set_background( window, m_backgroundColour.GetColor() ); + /* wxMSW doesn't clear the window here. I don't do that + either to provide compatibility. call Clear() to do + the job. */ + + m_backgroundColour.CalcPixel( gdk_window_get_colormap( m_wxwindow->window ) ); + gdk_window_set_background( m_wxwindow->window, m_backgroundColour.GetColor() ); } wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE ); + if (sysbg.Red() == colour.Red() && sysbg.Green() == colour.Green() && sysbg.Blue() == colour.Blue()) diff --git a/wxGTK.spec b/wxGTK.spec index 0c91a27c3e..2485a714d5 100644 --- a/wxGTK.spec +++ b/wxGTK.spec @@ -1,10 +1,10 @@ Summary: The GTK+ 1.0 port of wxWindows library Name: wxGTK -Version: 1.99.3 +Version: 1.99.4 Release: 1 Copyright: wxWindows Licence Group: X11/Libraries -Source: ftp://wesley.informatik.uni-freiburg.de/pub/linux/wxxt/source/wxGTK2b3.tgz +Source: ftp://wesley.informatik.uni-freiburg.de/pub/linux/wxxt/source/wxGTK2b4.tgz URL: http://www.freiburg.linux.de/~wxxt/docs.html Packager: Robert Roebling Requires: gtk+ >= 1.0.4 -- 2.45.2