From 0180d5daae8187ca9d938a1aa07e54ac16a12d1a Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Mon, 13 Jul 1998 17:00:29 +0000 Subject: [PATCH] memdc and bitmap fixes git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@260 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/gtk/dcclient.h | 1 + include/wx/gtk/dcmemory.h | 2 +- include/wx/gtk1/dcclient.h | 1 + include/wx/gtk1/dcmemory.h | 2 +- src/gtk/bitmap.cpp | 15 +++++++++++---- src/gtk/dcclient.cpp | 16 +++++++++++++++- src/gtk/dcmemory.cpp | 4 +++- src/gtk1/bitmap.cpp | 15 +++++++++++---- src/gtk1/dcclient.cpp | 16 +++++++++++++++- src/gtk1/dcmemory.cpp | 4 +++- user/wxTest/wxTest.cpp | 1 + 11 files changed, 63 insertions(+), 14 deletions(-) diff --git a/include/wx/gtk/dcclient.h b/include/wx/gtk/dcclient.h index 7ae3e3099c..b85fb317d1 100644 --- a/include/wx/gtk/dcclient.h +++ b/include/wx/gtk/dcclient.h @@ -99,6 +99,7 @@ class wxPaintDC: public wxDC GdkGC *m_textGC; GdkGC *m_bgGC; GdkColormap *m_cmap; + bool m_isDrawable; void SetUpDC(void); GdkWindow *GetWindow(void); diff --git a/include/wx/gtk/dcmemory.h b/include/wx/gtk/dcmemory.h index 7afbb3295d..c5854c5110 100644 --- a/include/wx/gtk/dcmemory.h +++ b/include/wx/gtk/dcmemory.h @@ -38,7 +38,7 @@ class WXDLLEXPORT wxMemoryDC: public wxPaintDC wxMemoryDC( wxDC *dc ); // Create compatible DC ~wxMemoryDC(void); virtual void SelectObject( const wxBitmap& bitmap ); - void GetSize( int *width, int *height ); + void GetSize( int *width, int *height ) const; private: friend wxPaintDC; diff --git a/include/wx/gtk1/dcclient.h b/include/wx/gtk1/dcclient.h index 7ae3e3099c..b85fb317d1 100644 --- a/include/wx/gtk1/dcclient.h +++ b/include/wx/gtk1/dcclient.h @@ -99,6 +99,7 @@ class wxPaintDC: public wxDC GdkGC *m_textGC; GdkGC *m_bgGC; GdkColormap *m_cmap; + bool m_isDrawable; void SetUpDC(void); GdkWindow *GetWindow(void); diff --git a/include/wx/gtk1/dcmemory.h b/include/wx/gtk1/dcmemory.h index 7afbb3295d..c5854c5110 100644 --- a/include/wx/gtk1/dcmemory.h +++ b/include/wx/gtk1/dcmemory.h @@ -38,7 +38,7 @@ class WXDLLEXPORT wxMemoryDC: public wxPaintDC wxMemoryDC( wxDC *dc ); // Create compatible DC ~wxMemoryDC(void); virtual void SelectObject( const wxBitmap& bitmap ); - void GetSize( int *width, int *height ); + void GetSize( int *width, int *height ) const; private: friend wxPaintDC; diff --git a/src/gtk/bitmap.cpp b/src/gtk/bitmap.cpp index 05c3136acc..7ae387a2f5 100644 --- a/src/gtk/bitmap.cpp +++ b/src/gtk/bitmap.cpp @@ -89,6 +89,9 @@ wxBitmapRefData::wxBitmapRefData(void) m_height = 0; m_bpp = 0; m_palette = NULL; +#ifdef USE_GDK_IMLIB + m_image = NULL; +#endif }; wxBitmapRefData::~wxBitmapRefData(void) @@ -121,7 +124,8 @@ wxBitmap::wxBitmap( int width, int height, int depth ) M_BMPDATA->m_mask = NULL; M_BMPDATA->m_pixmap = gdk_pixmap_new( (GdkWindow*) &gdk_root_parent, width, height, depth ); - gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); + M_BMPDATA->m_width = width; + M_BMPDATA->m_height = height; M_BMPDATA->m_bpp = depth; if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); @@ -144,6 +148,8 @@ wxBitmap::wxBitmap( char **bits ) M_BMPDATA->m_mask->m_bitmap = mask; }; + gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); + #else M_BMPDATA->m_image = gdk_imlib_create_image_from_xpm_data( bits ); @@ -151,7 +157,6 @@ wxBitmap::wxBitmap( char **bits ) #endif - gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); M_BMPDATA->m_bpp = 24; // ? if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); @@ -184,7 +189,8 @@ wxBitmap::wxBitmap( const char bits[], int width, int height, int WXUNUSED(depth M_BMPDATA->m_mask = NULL; M_BMPDATA->m_bitmap = gdk_bitmap_create_from_data( (GdkWindow*) &gdk_root_parent, (gchar *) bits, width, height ); - gdk_window_get_size( M_BMPDATA->m_bitmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); + M_BMPDATA->m_width = width; + M_BMPDATA->m_height = height; M_BMPDATA->m_bpp = 1; if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); @@ -377,7 +383,8 @@ void wxBitmap::Render(void) #ifdef USE_GDK_IMLIB gdk_imlib_render( M_BMPDATA->m_image, M_BMPDATA->m_image->rgb_width, M_BMPDATA->m_image->rgb_height ); - + M_BMPDATA->m_width = M_BMPDATA->m_image->rgb_width; + M_BMPDATA->m_height = M_BMPDATA->m_image->rgb_height; M_BMPDATA->m_pixmap = gdk_imlib_move_image( M_BMPDATA->m_image ); GdkBitmap *mask = gdk_imlib_move_mask( M_BMPDATA->m_image ); if (mask) diff --git a/src/gtk/dcclient.cpp b/src/gtk/dcclient.cpp index ee102dc06a..6f44374a4b 100644 --- a/src/gtk/dcclient.cpp +++ b/src/gtk/dcclient.cpp @@ -100,6 +100,9 @@ wxPaintDC::wxPaintDC( wxWindow *window ) m_cmap = gtk_widget_get_colormap( window->m_wxwindow ); else m_cmap = gtk_widget_get_colormap( window->m_widget ); + + m_isDrawable = TRUE; + SetUpDC(); long x = 0; @@ -517,7 +520,18 @@ void wxPaintDC::Clear(void) if (!Ok()) return; DestroyClippingRegion(); - gdk_window_clear( m_window ); + + if (m_isDrawable) + { + gdk_window_clear( m_window ); + } + else + { + int width = 0; + int height = 0; + GetSize( &width, &height ); + gdk_draw_rectangle( m_window, m_brushGC, TRUE, 0, 0, width, height ); + }; }; void wxPaintDC::SetFont( const wxFont &font ) diff --git a/src/gtk/dcmemory.cpp b/src/gtk/dcmemory.cpp index e947cd2ca7..66c5549f52 100644 --- a/src/gtk/dcmemory.cpp +++ b/src/gtk/dcmemory.cpp @@ -51,6 +51,8 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) } SetUpDC(); + + m_isDrawable = FALSE; } else { @@ -59,7 +61,7 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) }; }; -void wxMemoryDC::GetSize( int *width, int *height ) +void wxMemoryDC::GetSize( int *width, int *height ) const { if (m_selected.Ok()) { diff --git a/src/gtk1/bitmap.cpp b/src/gtk1/bitmap.cpp index 05c3136acc..7ae387a2f5 100644 --- a/src/gtk1/bitmap.cpp +++ b/src/gtk1/bitmap.cpp @@ -89,6 +89,9 @@ wxBitmapRefData::wxBitmapRefData(void) m_height = 0; m_bpp = 0; m_palette = NULL; +#ifdef USE_GDK_IMLIB + m_image = NULL; +#endif }; wxBitmapRefData::~wxBitmapRefData(void) @@ -121,7 +124,8 @@ wxBitmap::wxBitmap( int width, int height, int depth ) M_BMPDATA->m_mask = NULL; M_BMPDATA->m_pixmap = gdk_pixmap_new( (GdkWindow*) &gdk_root_parent, width, height, depth ); - gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); + M_BMPDATA->m_width = width; + M_BMPDATA->m_height = height; M_BMPDATA->m_bpp = depth; if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); @@ -144,6 +148,8 @@ wxBitmap::wxBitmap( char **bits ) M_BMPDATA->m_mask->m_bitmap = mask; }; + gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); + #else M_BMPDATA->m_image = gdk_imlib_create_image_from_xpm_data( bits ); @@ -151,7 +157,6 @@ wxBitmap::wxBitmap( char **bits ) #endif - gdk_window_get_size( M_BMPDATA->m_pixmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); M_BMPDATA->m_bpp = 24; // ? if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); @@ -184,7 +189,8 @@ wxBitmap::wxBitmap( const char bits[], int width, int height, int WXUNUSED(depth M_BMPDATA->m_mask = NULL; M_BMPDATA->m_bitmap = gdk_bitmap_create_from_data( (GdkWindow*) &gdk_root_parent, (gchar *) bits, width, height ); - gdk_window_get_size( M_BMPDATA->m_bitmap, &(M_BMPDATA->m_width), &(M_BMPDATA->m_height) ); + M_BMPDATA->m_width = width; + M_BMPDATA->m_height = height; M_BMPDATA->m_bpp = 1; if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); @@ -377,7 +383,8 @@ void wxBitmap::Render(void) #ifdef USE_GDK_IMLIB gdk_imlib_render( M_BMPDATA->m_image, M_BMPDATA->m_image->rgb_width, M_BMPDATA->m_image->rgb_height ); - + M_BMPDATA->m_width = M_BMPDATA->m_image->rgb_width; + M_BMPDATA->m_height = M_BMPDATA->m_image->rgb_height; M_BMPDATA->m_pixmap = gdk_imlib_move_image( M_BMPDATA->m_image ); GdkBitmap *mask = gdk_imlib_move_mask( M_BMPDATA->m_image ); if (mask) diff --git a/src/gtk1/dcclient.cpp b/src/gtk1/dcclient.cpp index ee102dc06a..6f44374a4b 100644 --- a/src/gtk1/dcclient.cpp +++ b/src/gtk1/dcclient.cpp @@ -100,6 +100,9 @@ wxPaintDC::wxPaintDC( wxWindow *window ) m_cmap = gtk_widget_get_colormap( window->m_wxwindow ); else m_cmap = gtk_widget_get_colormap( window->m_widget ); + + m_isDrawable = TRUE; + SetUpDC(); long x = 0; @@ -517,7 +520,18 @@ void wxPaintDC::Clear(void) if (!Ok()) return; DestroyClippingRegion(); - gdk_window_clear( m_window ); + + if (m_isDrawable) + { + gdk_window_clear( m_window ); + } + else + { + int width = 0; + int height = 0; + GetSize( &width, &height ); + gdk_draw_rectangle( m_window, m_brushGC, TRUE, 0, 0, width, height ); + }; }; void wxPaintDC::SetFont( const wxFont &font ) diff --git a/src/gtk1/dcmemory.cpp b/src/gtk1/dcmemory.cpp index e947cd2ca7..66c5549f52 100644 --- a/src/gtk1/dcmemory.cpp +++ b/src/gtk1/dcmemory.cpp @@ -51,6 +51,8 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) } SetUpDC(); + + m_isDrawable = FALSE; } else { @@ -59,7 +61,7 @@ void wxMemoryDC::SelectObject( const wxBitmap& bitmap ) }; }; -void wxMemoryDC::GetSize( int *width, int *height ) +void wxMemoryDC::GetSize( int *width, int *height ) const { if (m_selected.Ok()) { diff --git a/user/wxTest/wxTest.cpp b/user/wxTest/wxTest.cpp index c9d48c2045..e6e58613dd 100644 --- a/user/wxTest/wxTest.cpp +++ b/user/wxTest/wxTest.cpp @@ -348,6 +348,7 @@ void MyCanvas::OnPaint( wxPaintEvent &WXUNUSED(event) ) wxMemoryDC memDC; memDC.SelectObject( *my_backstore ); + memDC.Clear(); memDC.SetBrush( *wxBLACK_BRUSH ); memDC.SetPen( *wxWHITE_PEN ); memDC.DrawRectangle( 0, 0, 150, 150 );