Various update to Blit() SetBackground() Clear() etc.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1664 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1999-02-10 11:56:15 +00:00
parent 616c87c9b7
commit f234c60c4a
11 changed files with 146 additions and 66 deletions

View File

@@ -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
mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/cube mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/cube
mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/isosurf
mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin mkdir ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin
cd samples/cube 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 cp cube.cpp ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/cube
cd .. 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 cd penguin
cp Makefile ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin cp Makefile ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin
cp penguin.h ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin cp penguin.h ~/wxgtk_dist/wxGTK/utils/glcanvas/samples/penguin

View File

@@ -171,7 +171,7 @@ void Card::Erase(wxDC& dc, int x, int y)
//+-------------------------------------------------------------+ //+-------------------------------------------------------------+
void Card::Draw(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.SetBrush(* wxWHITE_BRUSH);
dc.SetPen(* wxBLACK_PEN); dc.SetPen(* wxBLACK_PEN);
dc.DrawRoundedRectangle(x, y, CardWidth, CardHeight, 4); 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() } // Card:Draw()

View File

@@ -167,6 +167,7 @@ void wxColour::CalcPixel( GdkColormap *cmap )
if (!Ok()) return; if (!Ok()) return;
if ((M_COLDATA->m_hasPixel) && (M_COLDATA->m_colormap == cmap)) return; if ((M_COLDATA->m_hasPixel) && (M_COLDATA->m_colormap == cmap)) return;
M_COLDATA->FreeColour(); M_COLDATA->FreeColour();
GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) cmap; GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) cmap;

View File

@@ -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 /* we use the "XCopyArea" way to copy a memory dc into
y different window if the memory dc BOTH y different window if the memory dc BOTH
a) doesn't have any mask or its mask isn't used a) doesn't have any mask or its mask isn't used
b) it is clipped. b) it is clipped
we HAVE TO use the direct way for memory dcs c) is not 1-bit */
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 */
use_bitmap_method = ( (useMask && (memDC->m_selected.GetMask())) || if (useMask && (memDC->m_selected.GetMask()))
((xsrc == 0) && (ysrc == 0) && {
(width == memDC->m_selected.GetWidth()) && /* we HAVE TO use the direct way for memory dcs
(height == memDC->m_selected.GetHeight()) ) 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 ); 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)) if ((bm_width != bm_ww) || (bm_height != bm_hh))
{ {
printf( "scaling.\n" );
wxImage image( memDC->m_selected ); wxImage image( memDC->m_selected );
image = image.Scale( bm_ww, bm_hh ); 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(); GdkPixmap *pm = use_bitmap.GetPixmap();
if (pm) 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 else
{ {
GdkBitmap *bm = use_bitmap.GetBitmap(); GdkBitmap *bm = use_bitmap.GetBitmap();
if (bm) 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" ); 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; int width,height;
GetSize( &width, &height ); GetSize( &width, &height );
gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, 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_backgroundBrush.Ok()) return;
if (m_owner)
{
m_owner->SetBackgroundColour( m_backgroundBrush.GetColour() );
}
m_backgroundBrush.GetColour().CalcPixel( m_cmap ); m_backgroundBrush.GetColour().CalcPixel( m_cmap );
gdk_gc_set_background( m_brushGC, m_backgroundBrush.GetColour().GetColor() ); gdk_gc_set_background( m_brushGC, m_backgroundBrush.GetColour().GetColor() );
gdk_gc_set_background( m_penGC, m_backgroundBrush.GetColour().GetColor() ); gdk_gc_set_background( m_penGC, m_backgroundBrush.GetColour().GetColor() );

View File

@@ -433,7 +433,7 @@ int wxDialog::ShowModal()
wxFAIL_MSG( "wxDialog:ShowModal called twice" ); wxFAIL_MSG( "wxDialog:ShowModal called twice" );
return GetReturnCode(); return GetReturnCode();
} }
Show( TRUE ); Show( TRUE );
m_modalShowing = TRUE; m_modalShowing = TRUE;

View File

@@ -2424,12 +2424,11 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
{ {
gdk_window_clear_area( m_wxwindow->window, gdk_window_clear_area( m_wxwindow->window,
rect->x, rect->y, rect->x, rect->y,
rect->width, rect->width, rect->height );
rect->height );
} }
else else
{ {
Clear(); gdk_window_clear( m_wxwindow->window );
} }
} }
@@ -2484,7 +2483,10 @@ void wxWindow::Clear()
{ {
wxCHECK_RET( m_widget != NULL, "invalid window" ); 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 #if wxUSE_TOOLTIPS
@@ -2537,14 +2539,18 @@ void wxWindow::SetBackgroundColour( const wxColour &colour )
m_backgroundColour = colour; m_backgroundColour = colour;
if (!m_backgroundColour.Ok()) return; if (!m_backgroundColour.Ok()) return;
if (m_wxwindow) if (m_wxwindow && m_wxwindow->window)
{ {
GdkWindow *window = m_wxwindow->window; /* wxMSW doesn't clear the window here. I don't do that
m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); either to provide compatibility. call Clear() to do
gdk_window_set_background( window, m_backgroundColour.GetColor() ); 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 ); wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if (sysbg.Red() == colour.Red() && if (sysbg.Red() == colour.Red() &&
sysbg.Green() == colour.Green() && sysbg.Green() == colour.Green() &&
sysbg.Blue() == colour.Blue()) sysbg.Blue() == colour.Blue())

View File

@@ -167,6 +167,7 @@ void wxColour::CalcPixel( GdkColormap *cmap )
if (!Ok()) return; if (!Ok()) return;
if ((M_COLDATA->m_hasPixel) && (M_COLDATA->m_colormap == cmap)) return; if ((M_COLDATA->m_hasPixel) && (M_COLDATA->m_colormap == cmap)) return;
M_COLDATA->FreeColour(); M_COLDATA->FreeColour();
GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) cmap; GdkColormapPrivate *private_colormap = (GdkColormapPrivate*) cmap;

View File

@@ -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 /* we use the "XCopyArea" way to copy a memory dc into
y different window if the memory dc BOTH y different window if the memory dc BOTH
a) doesn't have any mask or its mask isn't used a) doesn't have any mask or its mask isn't used
b) it is clipped. b) it is clipped
we HAVE TO use the direct way for memory dcs c) is not 1-bit */
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 */
use_bitmap_method = ( (useMask && (memDC->m_selected.GetMask())) || if (useMask && (memDC->m_selected.GetMask()))
((xsrc == 0) && (ysrc == 0) && {
(width == memDC->m_selected.GetWidth()) && /* we HAVE TO use the direct way for memory dcs
(height == memDC->m_selected.GetHeight()) ) 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 ); 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)) if ((bm_width != bm_ww) || (bm_height != bm_hh))
{ {
printf( "scaling.\n" );
wxImage image( memDC->m_selected ); wxImage image( memDC->m_selected );
image = image.Scale( bm_ww, bm_hh ); 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(); GdkPixmap *pm = use_bitmap.GetPixmap();
if (pm) 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 else
{ {
GdkBitmap *bm = use_bitmap.GetBitmap(); GdkBitmap *bm = use_bitmap.GetBitmap();
if (bm) 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" ); 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; int width,height;
GetSize( &width, &height ); GetSize( &width, &height );
gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, 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_backgroundBrush.Ok()) return;
if (m_owner)
{
m_owner->SetBackgroundColour( m_backgroundBrush.GetColour() );
}
m_backgroundBrush.GetColour().CalcPixel( m_cmap ); m_backgroundBrush.GetColour().CalcPixel( m_cmap );
gdk_gc_set_background( m_brushGC, m_backgroundBrush.GetColour().GetColor() ); gdk_gc_set_background( m_brushGC, m_backgroundBrush.GetColour().GetColor() );
gdk_gc_set_background( m_penGC, m_backgroundBrush.GetColour().GetColor() ); gdk_gc_set_background( m_penGC, m_backgroundBrush.GetColour().GetColor() );

View File

@@ -433,7 +433,7 @@ int wxDialog::ShowModal()
wxFAIL_MSG( "wxDialog:ShowModal called twice" ); wxFAIL_MSG( "wxDialog:ShowModal called twice" );
return GetReturnCode(); return GetReturnCode();
} }
Show( TRUE ); Show( TRUE );
m_modalShowing = TRUE; m_modalShowing = TRUE;

View File

@@ -2424,12 +2424,11 @@ void wxWindow::Refresh( bool eraseBackground, const wxRect *rect )
{ {
gdk_window_clear_area( m_wxwindow->window, gdk_window_clear_area( m_wxwindow->window,
rect->x, rect->y, rect->x, rect->y,
rect->width, rect->width, rect->height );
rect->height );
} }
else else
{ {
Clear(); gdk_window_clear( m_wxwindow->window );
} }
} }
@@ -2484,7 +2483,10 @@ void wxWindow::Clear()
{ {
wxCHECK_RET( m_widget != NULL, "invalid window" ); 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 #if wxUSE_TOOLTIPS
@@ -2537,14 +2539,18 @@ void wxWindow::SetBackgroundColour( const wxColour &colour )
m_backgroundColour = colour; m_backgroundColour = colour;
if (!m_backgroundColour.Ok()) return; if (!m_backgroundColour.Ok()) return;
if (m_wxwindow) if (m_wxwindow && m_wxwindow->window)
{ {
GdkWindow *window = m_wxwindow->window; /* wxMSW doesn't clear the window here. I don't do that
m_backgroundColour.CalcPixel( gdk_window_get_colormap( window ) ); either to provide compatibility. call Clear() to do
gdk_window_set_background( window, m_backgroundColour.GetColor() ); 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 ); wxColour sysbg = wxSystemSettings::GetSystemColour( wxSYS_COLOUR_BTNFACE );
if (sysbg.Red() == colour.Red() && if (sysbg.Red() == colour.Red() &&
sysbg.Green() == colour.Green() && sysbg.Green() == colour.Green() &&
sysbg.Blue() == colour.Blue()) sysbg.Blue() == colour.Blue())

View File

@@ -1,10 +1,10 @@
Summary: The GTK+ 1.0 port of wxWindows library Summary: The GTK+ 1.0 port of wxWindows library
Name: wxGTK Name: wxGTK
Version: 1.99.3 Version: 1.99.4
Release: 1 Release: 1
Copyright: wxWindows Licence Copyright: wxWindows Licence
Group: X11/Libraries 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 URL: http://www.freiburg.linux.de/~wxxt/docs.html
Packager: Robert Roebling <roebling@ruf.uni-freiburg.de> Packager: Robert Roebling <roebling@ruf.uni-freiburg.de>
Requires: gtk+ >= 1.0.4 Requires: gtk+ >= 1.0.4