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/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

View File

@@ -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()

View File

@@ -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;

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
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) &&
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() );

View File

@@ -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())

View File

@@ -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;

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
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) &&
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() );

View File

@@ -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())

View File

@@ -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 <roebling@ruf.uni-freiburg.de>
Requires: gtk+ >= 1.0.4