]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
appearance box drawing
[wxWidgets.git] / src / gtk / dcclient.cpp
index 0f66d18b6db7492c0210c84b1c5ddff32802c853..736b8a1332fa4f1a7f3e59b2351a4c82f569d79c 100644 (file)
@@ -19,6 +19,7 @@
 #include "wx/dcmemory.h"
 #include "wx/image.h"
 #include "wx/module.h"
+#include "wx/log.h"
 
 #include "wx/gtk/win_gtk.h"
 
@@ -246,6 +247,8 @@ wxWindowDC::wxWindowDC()
 
 wxWindowDC::wxWindowDC( wxWindow *window )
 {
+    wxASSERT_MSG( window, wxT("DC needs a window") );
+
     m_penGC = (GdkGC *) NULL;
     m_brushGC = (GdkGC *) NULL;
     m_textGC = (GdkGC *) NULL;
@@ -256,8 +259,6 @@ wxWindowDC::wxWindowDC( wxWindow *window )
     m_isScreenDC = FALSE;
     m_font = window->GetFont();
 
-    wxASSERT_MSG( window, wxT("DC needs a window") );
-
     GtkWidget *widget = window->m_wxwindow;
 
     // some controls don't have m_wxwindow - like wxStaticBox, but the user
@@ -400,10 +401,13 @@ void wxWindowDC::DoGetSize( int* width, int* height ) const
     m_owner->GetSize(width, height);
 }
 
-void wxWindowDC::DoFloodFill( wxCoord WXUNUSED(x), wxCoord WXUNUSED(y),
-                           const wxColour &WXUNUSED(col), int WXUNUSED(style) )
+extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y, 
+                          const wxColour & col, int style);
+
+bool wxWindowDC::DoFloodFill(wxCoord x, wxCoord y,
+                             const wxColour& col, int style)
 {
-    wxFAIL_MSG( wxT("wxWindowDC::DoFloodFill not implemented") );
+    return wxDoFloodFill(this, x, y, col, style);
 }
 
 bool wxWindowDC::DoGetPixel( wxCoord x1, wxCoord y1, wxColour *col ) const
@@ -416,7 +420,7 @@ bool wxWindowDC::DoGetPixel( wxCoord x1, wxCoord y1, wxColour *col ) const
     memdc.Blit(0, 0, 1, 1, (wxDC*) this, x1, y1);
     memdc.SelectObject(wxNullBitmap);
 
-    wxImage image(bitmap);
+    wxImage image = bitmap.ConvertToImage();
     col->Set(image.GetRed(0, 0), image.GetGreen(0, 0), image.GetBlue(0, 0));
     return TRUE;
 }
@@ -999,18 +1003,18 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
     wxBitmap use_bitmap;
     if ((w != ww) || (h != hh))
     {
-        wxImage image( bitmap );
+        wxImage image = bitmap.ConvertToImage();
         image.Rescale( ww, hh );
         if (is_mono)
-            use_bitmap = image.ConvertToMonoBitmap(255,255,255);
+            use_bitmap = wxBitmap(image.ConvertToMono(255,255,255), 1);
         else
-            use_bitmap = image.ConvertToBitmap();
+            use_bitmap = wxBitmap(image);
     }
     else
     {
         use_bitmap = bitmap;
     }
-
+    
     /* apply mask if any */
     GdkBitmap *mask = (GdkBitmap *) NULL;
     if (use_bitmap.GetMask()) mask = use_bitmap.GetMask()->GetBitmap();
@@ -1018,6 +1022,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
         if (useMask && mask)
         {
             GdkBitmap *new_mask = (GdkBitmap*) NULL;
+#ifndef __WXGTK20__  // TODO fix crash
             if (!m_currentClippingRegion.IsNull())
             {
                 GdkColor col;
@@ -1037,7 +1042,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
                 gdk_draw_rectangle( new_mask, gc, TRUE, 0, 0, ww, hh );
                 gdk_gc_unref( gc );
             }
-
+#endif
             if (is_mono)
             {
                 if (new_mask)
@@ -1054,6 +1059,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
                     gdk_gc_set_clip_mask( m_penGC, mask );
                 gdk_gc_set_clip_origin( m_penGC, xx, yy );
             }
+            
             if (new_mask)
                 gdk_bitmap_unref( new_mask );
         }
@@ -1199,13 +1205,13 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
 
         if ((bm_width != bm_ww) || (bm_height != bm_hh))
         {
-            wxImage image( memDC->m_selected );
+            wxImage image = memDC->m_selected.ConvertToImage();
             image = image.Scale( bm_ww, bm_hh );
 
             if (is_mono)
-                use_bitmap = image.ConvertToMonoBitmap(255,255,255);
+                use_bitmap = wxBitmap(image.ConvertToMono(255,255,255), 1);
             else
-                use_bitmap = image.ConvertToBitmap();
+                use_bitmap = wxBitmap(image);
         }
         else
         {
@@ -1219,6 +1225,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
         if (useMask && mask)
         {
             GdkBitmap *new_mask = (GdkBitmap*) NULL;
+#ifndef __WXGTK20__  // TODO fix crash
             if (!m_currentClippingRegion.IsNull())
             {
                 GdkColor col;
@@ -1238,7 +1245,7 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
                 gdk_draw_rectangle( new_mask, gc, TRUE, 0, 0, bm_ww, bm_hh );
                 gdk_gc_unref( gc );
             }
-
+#endif
             if (is_mono)
             {
                 if (new_mask)
@@ -1313,11 +1320,11 @@ bool wxWindowDC::DoBlit( wxCoord xdest, wxCoord ydest,
             gdk_gc_set_subwindow( m_penGC, GDK_CLIP_BY_CHILDREN );
 
             /* scale image */
-            wxImage image( bitmap );
+            wxImage image = bitmap.ConvertToImage();
             image = image.Scale( ww, hh );
 
             /* convert to bitmap */
-            bitmap = image.ConvertToBitmap();
+            bitmap = wxBitmap(image);
 
             /* draw scaled bitmap */
             gdk_draw_pixmap( m_window, m_penGC, bitmap.GetPixmap(), 0, 0, xx, yy, -1, -1 );
@@ -1358,11 +1365,11 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
     y = YLOG2DEV(y);
 
 #if defined(__WXGTK20__) && wxUSE_WCHAR_T
-    /* FIXME: the layout engine should probably be abstracted at a higher level in wxDC... */
+    // TODO: the layout engine should be abstracted at a higher level!
     PangoLayout *layout = pango_layout_new(m_context);
     pango_layout_set_font_description(layout, m_fontdesc);
     {
-        wxWX2MBbuf data = text.mb_str(wxConvUTF8);
+        const wxWX2MBbuf data = text.mb_str(wxConvUTF8);
         pango_layout_set_text(layout, data, strlen(data));
     }
     PangoLayoutLine *line = (PangoLayoutLine *)pango_layout_get_lines(layout)->data;
@@ -1371,7 +1378,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
     wxCoord width = rect.width;
     wxCoord height = rect.height;
     gdk_draw_layout( m_window, m_textGC, x, y, layout );
-#else
+#else // GTK+ 1.x
     wxCoord width = gdk_string_width( font, text.mbc_str() );
     wxCoord height = font->ascent + font->descent;
 
@@ -1382,7 +1389,7 @@ void wxWindowDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
         gdk_gc_set_foreground( m_textGC, m_textForegroundColour.GetColor() );
     }
     gdk_draw_string( m_window, font, m_textGC, x, y + font->ascent, text.mbc_str() );
-#endif
+#endif // GTK+ 2.0/1.x
 
     /* CMB 17/7/98: simple underline: ignores scaling and underlying
        X font's XA_UNDERLINE_POSITION and XA_UNDERLINE_THICKNESS
@@ -1456,7 +1463,7 @@ void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y,
             minY = (wxCoord)(dmin(y2, dmin(y3, y4)) - 0.5);
 
     // prepare to blit-with-rotate the bitmap to the DC
-    wxImage image(src);
+    wxImage image = src.ConvertToImage();
 
     GdkColor *colText = m_textForegroundColour.GetColor(),
              *colBack = m_textBackgroundColour.GetColor();
@@ -1553,6 +1560,11 @@ void wxWindowDC::Clear()
 
     if (!m_window) return;
 
+    // VZ: the code below results in infinite recursion and crashes when
+    //     dc.Clear() is done from OnPaint() so I disable it for now.
+    //     I don't know what the correct fix is but Clear() surely should not
+    //     reenter OnPaint()!
+#if 0
     /* - 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
@@ -1562,9 +1574,7 @@ void wxWindowDC::Clear()
 
     if (m_owner)
     {
-        int width,height;
-        m_owner->GetSize( &width, &height );
-        gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
+        m_owner->Clear();
         return;
     }
 
@@ -1575,6 +1585,11 @@ void wxWindowDC::Clear()
         gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
         return;
     }
+#else // 1
+    int width,height;
+    GetSize( &width, &height );
+    gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
+#endif // 0/1
 }
 
 void wxWindowDC::SetFont( const wxFont &font )