]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
Don't need to use wxHAVE_RAW_BITMAP any more.
[wxWidgets.git] / src / gtk / dcclient.cpp
index feb5484b63686efd616ec365b36dd74245f3d068..0341e8e3134deb4ac71cd01af1c2063268067758 100644 (file)
@@ -53,9 +53,6 @@
 #include "verti.xbm"
 #include "cross.xbm"
 
-#define IS_15_PIX_HATCH(s) ((s)==wxCROSSDIAG_HATCH || (s)==wxHORIZONTAL_HATCH || (s)==wxVERTICAL_HATCH)
-#define IS_16_PIX_HATCH(s) ((s)!=wxCROSSDIAG_HATCH && (s)!=wxHORIZONTAL_HATCH && (s)!=wxVERTICAL_HATCH)
-
 static GdkPixmap* hatches[wxLAST_HATCH - wxFIRST_HATCH + 1];
 
 extern GtkWidget *wxGetRootWindow();
@@ -535,6 +532,46 @@ void wxWindowDCImpl::DoCrossHair( wxCoord x, wxCoord y )
     }
 }
 
+void wxWindowDCImpl::DrawingSetup(GdkGC*& gc, bool& originChanged)
+{
+    gc = m_brushGC;
+    GdkPixmap* pixmap = NULL;
+    const int style = m_brush.GetStyle();
+
+    if (style == wxSTIPPLE || style == wxSTIPPLE_MASK_OPAQUE)
+    {
+        const wxBitmap* stipple = m_brush.GetStipple();
+        if (stipple->IsOk())
+        {
+            if (style == wxSTIPPLE)
+                pixmap = stipple->GetPixmap();
+            else if (stipple->GetMask())
+            {
+                pixmap = stipple->GetPixmap();
+                gc = m_textGC;
+            }
+        }
+    }
+    else if (m_brush.IsHatch())
+    {
+        pixmap = GetHatch(style);
+    }
+
+    int origin_x = 0;
+    int origin_y = 0;
+    if (pixmap)
+    {
+        int w, h;
+        gdk_drawable_get_size(pixmap, &w, &h);
+        origin_x = m_deviceOriginX % w;
+        origin_y = m_deviceOriginY % h;
+    }
+
+    originChanged = origin_x || origin_y;
+    if (originChanged)
+        gdk_gc_set_ts_origin(gc, origin_x, origin_y);
+}
+
 void wxWindowDCImpl::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
                             wxCoord xc, wxCoord yc )
 {
@@ -580,38 +617,14 @@ void wxWindowDCImpl::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
     {
         if (m_brush.GetStyle() != wxTRANSPARENT)
         {
-            if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
-            {
-                gdk_gc_set_ts_origin( m_textGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_arc( m_gdkwindow, m_textGC, TRUE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
-                gdk_gc_set_ts_origin( m_textGC, 0, 0 );
-            } else
-            if (IS_15_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 15, m_deviceOriginY % 15 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (IS_16_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 16, m_deviceOriginY % 16 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (m_brush.GetStyle() == wxSTIPPLE)
-            {
-                gdk_gc_set_ts_origin( m_brushGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            }
-            else
-            {
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xxc-r, yyc-r, 2*r,2*r, alpha1, alpha2 );
-            }
+            GdkGC* gc;
+            bool originChanged;
+            DrawingSetup(gc, originChanged);
+
+            gdk_draw_arc(m_gdkwindow, gc, true, xxc-r, yyc-r, 2*r, 2*r, alpha1, alpha2);
+
+            if (originChanged)
+                gdk_gc_set_ts_origin(gc, 0, 0);
         }
 
         if (m_pen.GetStyle() != wxTRANSPARENT)
@@ -650,38 +663,14 @@ void wxWindowDCImpl::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord width, wxC
 
         if (m_brush.GetStyle() != wxTRANSPARENT)
         {
-            if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
-            {
-                gdk_gc_set_ts_origin( m_textGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_arc( m_gdkwindow, m_textGC, TRUE, xx, yy, ww, hh, start, end );
-                gdk_gc_set_ts_origin( m_textGC, 0, 0 );
-            } else
-            if (IS_15_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 15, m_deviceOriginY % 15 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, start, end );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (IS_16_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 16, m_deviceOriginY % 16 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, start, end );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (m_brush.GetStyle() == wxSTIPPLE)
-            {
-                gdk_gc_set_ts_origin( m_brushGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, start, end );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            }
-            else
-            {
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, start, end );
-            }
+            GdkGC* gc;
+            bool originChanged;
+            DrawingSetup(gc, originChanged);
+
+            gdk_draw_arc(m_gdkwindow, gc, true, xx, yy, ww, hh, start, end);
+
+            if (originChanged)
+                gdk_gc_set_ts_origin(gc, 0, 0);
         }
 
         if (m_pen.GetStyle() != wxTRANSPARENT)
@@ -767,38 +756,14 @@ void wxWindowDCImpl::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wx
     {
         if (m_brush.GetStyle() != wxTRANSPARENT)
         {
-            if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
-            {
-                gdk_gc_set_ts_origin( m_textGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_polygon( m_gdkwindow, m_textGC, TRUE, gdkpoints, n );
-                gdk_gc_set_ts_origin( m_textGC, 0, 0 );
-            } else
-            if (IS_15_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 15, m_deviceOriginY % 15 );
-                gdk_draw_polygon( m_gdkwindow, m_brushGC, TRUE, gdkpoints, n );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (IS_16_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 16, m_deviceOriginY % 16 );
-                gdk_draw_polygon( m_gdkwindow, m_brushGC, TRUE, gdkpoints, n );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (m_brush.GetStyle() == wxSTIPPLE)
-            {
-                gdk_gc_set_ts_origin( m_brushGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_polygon( m_gdkwindow, m_brushGC, TRUE, gdkpoints, n );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            }
-            else
-            {
-                gdk_draw_polygon( m_gdkwindow, m_brushGC, TRUE, gdkpoints, n );
-            }
+            GdkGC* gc;
+            bool originChanged;
+            DrawingSetup(gc, originChanged);
+
+            gdk_draw_polygon(m_gdkwindow, gc, true, gdkpoints, n);
+
+            if (originChanged)
+                gdk_gc_set_ts_origin(gc, 0, 0);
         }
 
         if (m_pen.GetStyle() != wxTRANSPARENT)
@@ -842,38 +807,14 @@ void wxWindowDCImpl::DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoo
     {
         if (m_brush.GetStyle() != wxTRANSPARENT)
         {
-            if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
-            {
-                gdk_gc_set_ts_origin( m_textGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_rectangle( m_gdkwindow, m_textGC, TRUE, xx, yy, ww, hh );
-                gdk_gc_set_ts_origin( m_textGC, 0, 0 );
-            } else
-            if (IS_15_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 15, m_deviceOriginY % 15 );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (IS_16_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 16, m_deviceOriginY % 16 );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (m_brush.GetStyle() == wxSTIPPLE)
-            {
-                gdk_gc_set_ts_origin( m_brushGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            }
-            else
-            {
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh );
-            }
+            GdkGC* gc;
+            bool originChanged;
+            DrawingSetup(gc, originChanged);
+
+            gdk_draw_rectangle(m_gdkwindow, gc, true, xx, yy, ww, hh);
+
+            if (originChanged)
+                gdk_gc_set_ts_origin(gc, 0, 0);
         }
 
         if (m_pen.GetStyle() != wxTRANSPARENT)
@@ -959,63 +900,19 @@ void wxWindowDCImpl::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord width
 
         if (m_brush.GetStyle() != wxTRANSPARENT)
         {
-            if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
-            {
-                gdk_gc_set_ts_origin( m_textGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_rectangle( m_gdkwindow, m_textGC, TRUE, xx+rr, yy, ww-dd+1, hh );
-                gdk_draw_rectangle( m_gdkwindow, m_textGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
-                gdk_draw_arc( m_gdkwindow, m_textGC, TRUE, xx, yy, dd, dd, 90*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_textGC, TRUE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_textGC, TRUE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_textGC, TRUE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
-                gdk_gc_set_ts_origin( m_textGC, 0, 0 );
-            } else
-            if (IS_15_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 15, m_deviceOriginY % 15 );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx+rr, yy, ww-dd+1, hh );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, dd, dd, 90*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (IS_16_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 16, m_deviceOriginY % 16 );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx+rr, yy, ww-dd+1, hh );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, dd, dd, 90*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (m_brush.GetStyle() == wxSTIPPLE)
-            {
-                gdk_gc_set_ts_origin( m_brushGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx+rr, yy, ww-dd+1, hh );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, dd, dd, 90*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            }
-            else
-            {
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx+rr, yy, ww-dd+1, hh );
-                gdk_draw_rectangle( m_gdkwindow, m_brushGC, TRUE, xx, yy+rr, ww, hh-dd+1 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, dd, dd, 90*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy, dd, dd, 0, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy+hh-dd, dd, dd, 180*64, 90*64 );
-            }
+            GdkGC* gc;
+            bool originChanged;
+            DrawingSetup(gc, originChanged);
+
+            gdk_draw_rectangle(m_gdkwindow, gc, true, xx+rr, yy, ww-dd+1, hh);
+            gdk_draw_rectangle(m_gdkwindow, gc, true, xx, yy+rr, ww, hh-dd+1);
+            gdk_draw_arc(m_gdkwindow, gc, true, xx, yy, dd, dd, 90*64, 90*64);
+            gdk_draw_arc(m_gdkwindow, gc, true, xx+ww-dd, yy, dd, dd, 0, 90*64);
+            gdk_draw_arc(m_gdkwindow, gc, true, xx+ww-dd, yy+hh-dd, dd, dd, 270*64, 90*64);
+            gdk_draw_arc(m_gdkwindow, gc, true, xx, yy+hh-dd, dd, dd, 180*64, 90*64);
+
+            if (originChanged)
+                gdk_gc_set_ts_origin(gc, 0, 0);
         }
 
         if (m_pen.GetStyle() != wxTRANSPARENT)
@@ -1053,38 +950,14 @@ void wxWindowDCImpl::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord
     {
         if (m_brush.GetStyle() != wxTRANSPARENT)
         {
-            if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
-            {
-                gdk_gc_set_ts_origin( m_textGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_arc( m_gdkwindow, m_textGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
-                gdk_gc_set_ts_origin( m_textGC, 0, 0 );
-            } else
-            if (IS_15_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 15, m_deviceOriginY % 15 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (IS_16_PIX_HATCH(m_brush.GetStyle()))
-            {
-                gdk_gc_set_ts_origin( m_brushGC, m_deviceOriginX % 16, m_deviceOriginY % 16 );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            } else
-            if (m_brush.GetStyle() == wxSTIPPLE)
-            {
-                gdk_gc_set_ts_origin( m_brushGC,
-                                      m_deviceOriginX % m_brush.GetStipple()->GetWidth(),
-                                      m_deviceOriginY % m_brush.GetStipple()->GetHeight() );
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
-                gdk_gc_set_ts_origin( m_brushGC, 0, 0 );
-            }
-            else
-            {
-                gdk_draw_arc( m_gdkwindow, m_brushGC, TRUE, xx, yy, ww, hh, 0, 360*64 );
-            }
+            GdkGC* gc;
+            bool originChanged;
+            DrawingSetup(gc, originChanged);
+
+            gdk_draw_arc(m_gdkwindow, gc, true, xx, yy, ww, hh, 0, 360*64);
+
+            if (originChanged)
+                gdk_gc_set_ts_origin(gc, 0, 0);
         }
 
         if (m_pen.GetStyle() != wxTRANSPARENT)
@@ -1740,7 +1613,7 @@ void wxWindowDCImpl::DoGetTextExtent(const wxString &string,
 
     // ensure that theFont is always non-NULL
     if ( !theFont || !theFont->IsOk() )
-        theFont = wx_const_cast(wxFont *, &m_font);
+        theFont = &m_font;
 
     // and use it if it's valid
     if ( theFont->IsOk() )
@@ -1760,24 +1633,19 @@ void wxWindowDCImpl::DoGetTextExtent(const wxString &string,
         return;
     }
 
-    pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) );
+    pango_layout_set_text(m_layout, dataUTF8, -1);
 
+    int h;
+    pango_layout_get_pixel_size(m_layout, width, &h);
     if (descent)
     {
-        int h;
-        pango_layout_get_pixel_size( m_layout, width, &h );
         PangoLayoutIter *iter = pango_layout_get_iter(m_layout);
         int baseline = pango_layout_iter_get_baseline(iter);
         pango_layout_iter_free(iter);
         *descent = h - PANGO_PIXELS(baseline);
-
-        if (height)
-            *height = (wxCoord) h;
-    }
-    else
-    {
-        pango_layout_get_pixel_size( m_layout, width, height );
     }
+    if (height)
+        *height = h;
 
     // Reset old font description
     if (theFont->IsOk())
@@ -1804,7 +1672,7 @@ bool wxWindowDCImpl::DoGetPartialTextExtents(const wxString& text,
         return false;
     }
 
-    pango_layout_set_text( m_layout, dataUTF8, strlen(dataUTF8) );
+    pango_layout_set_text(m_layout, dataUTF8, -1);
 
     // Calculate the position of each character based on the widths of
     // the previous characters
@@ -1936,57 +1804,39 @@ void wxWindowDCImpl::SetPen( const wxPen &pen )
     int req_nb_dash;
     const wxGTKDash *req_dash;
 
-    GdkLineStyle lineStyle = GDK_LINE_SOLID;
+    GdkLineStyle lineStyle = GDK_LINE_ON_OFF_DASH;
     switch (m_pen.GetStyle())
     {
         case wxUSER_DASH:
-        {
-            lineStyle = GDK_LINE_ON_OFF_DASH;
             req_nb_dash = m_pen.GetDashCount();
             req_dash = (wxGTKDash*)m_pen.GetDash();
             break;
-        }
         case wxDOT:
-        {
-            lineStyle = GDK_LINE_ON_OFF_DASH;
             req_nb_dash = 2;
             req_dash = dotted;
             break;
-        }
         case wxLONG_DASH:
-        {
-            lineStyle = GDK_LINE_ON_OFF_DASH;
             req_nb_dash = 2;
             req_dash = wxCoord_dashed;
             break;
-        }
         case wxSHORT_DASH:
-        {
-            lineStyle = GDK_LINE_ON_OFF_DASH;
             req_nb_dash = 2;
             req_dash = short_dashed;
             break;
-        }
         case wxDOT_DASH:
-        {
-//            lineStyle = GDK_LINE_DOUBLE_DASH;
-            lineStyle = GDK_LINE_ON_OFF_DASH;
             req_nb_dash = 4;
             req_dash = dotted_dashed;
             break;
-        }
 
         case wxTRANSPARENT:
         case wxSTIPPLE_MASK_OPAQUE:
         case wxSTIPPLE:
         case wxSOLID:
         default:
-        {
             lineStyle = GDK_LINE_SOLID;
             req_dash = (wxGTKDash*)NULL;
             req_nb_dash = 0;
             break;
-        }
     }
 
     if (req_dash && req_nb_dash)
@@ -2013,18 +1863,12 @@ void wxWindowDCImpl::SetPen( const wxPen &pen )
         case wxCAP_BUTT:       { capStyle = GDK_CAP_BUTT;       break; }
         case wxCAP_ROUND:
         default:
-        {
             if (width <= 1)
             {
                 width = 0;
                 capStyle = GDK_CAP_NOT_LAST;
             }
-            else
-            {
-                capStyle = GDK_CAP_ROUND;
-            }
             break;
-        }
     }
 
     GdkJoinStyle joinStyle = GDK_JOIN_ROUND;
@@ -2101,29 +1945,35 @@ void wxWindowDCImpl::SetBackground( const wxBrush &brush )
 
     if (!m_gdkwindow) return;
 
-    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() );
-    gdk_gc_set_background( m_bgGC, m_backgroundBrush.GetColour().GetColor() );
-    gdk_gc_set_foreground( m_bgGC, m_backgroundBrush.GetColour().GetColor() );
+    wxColor color = m_backgroundBrush.GetColour();
+    color.CalcPixel(m_cmap);
+    const GdkColor* gdkColor = color.GetColor();
+    gdk_gc_set_background(m_brushGC, gdkColor);
+    gdk_gc_set_background(m_penGC,   gdkColor);
+    gdk_gc_set_background(m_bgGC,    gdkColor);
+    gdk_gc_set_foreground(m_bgGC,    gdkColor);
+
 
     gdk_gc_set_fill( m_bgGC, GDK_SOLID );
 
-    if ((m_backgroundBrush.GetStyle() == wxSTIPPLE) && (m_backgroundBrush.GetStipple()->IsOk()))
+    if (m_backgroundBrush.GetStyle() == wxSTIPPLE)
     {
-        if (m_backgroundBrush.GetStipple()->GetDepth() != 1)
-        {
-            gdk_gc_set_fill( m_bgGC, GDK_TILED );
-            gdk_gc_set_tile( m_bgGC, m_backgroundBrush.GetStipple()->GetPixmap() );
-        }
-        else
+        const wxBitmap* stipple = m_backgroundBrush.GetStipple();
+        if (stipple->IsOk())
         {
-            gdk_gc_set_fill( m_bgGC, GDK_STIPPLED );
-            gdk_gc_set_stipple( m_bgGC, m_backgroundBrush.GetStipple()->GetPixmap() );
+            if (stipple->GetDepth() != 1)
+            {
+                gdk_gc_set_fill(m_bgGC, GDK_TILED);
+                gdk_gc_set_tile(m_bgGC, stipple->GetPixmap());
+            }
+            else
+            {
+                gdk_gc_set_fill(m_bgGC, GDK_STIPPLED);
+                gdk_gc_set_stipple(m_bgGC, stipple->GetPixmap());
+            }
         }
     }
-
-    if (m_backgroundBrush.IsHatch())
+    else if (m_backgroundBrush.IsHatch())
     {
         gdk_gc_set_fill( m_bgGC, GDK_STIPPLED );
         gdk_gc_set_stipple(m_bgGC, GetHatch(m_backgroundBrush.GetStyle()));
@@ -2273,10 +2123,11 @@ void wxWindowDCImpl::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, w
     wxDC::DoSetClippingRegion( xx, yy, ww, hh );
 #endif
 
-    gdk_gc_set_clip_region( m_penGC, m_currentClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_brushGC, m_currentClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_textGC, m_currentClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_bgGC, m_currentClippingRegion.GetRegion() );
+    GdkRegion* gdkRegion = m_currentClippingRegion.GetRegion();
+    gdk_gc_set_clip_region(m_penGC,   gdkRegion);
+    gdk_gc_set_clip_region(m_brushGC, gdkRegion);
+    gdk_gc_set_clip_region(m_textGC,  gdkRegion);
+    gdk_gc_set_clip_region(m_bgGC,    gdkRegion);
 }
 
 void wxWindowDCImpl::DoSetClippingRegionAsRegion( const wxRegion &region  )
@@ -2309,10 +2160,11 @@ void wxWindowDCImpl::DoSetClippingRegionAsRegion( const wxRegion &region  )
     wxDC::DoSetClippingRegion( xx, yy, ww, hh );
 #endif
 
-    gdk_gc_set_clip_region( m_penGC, m_currentClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_brushGC, m_currentClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_textGC, m_currentClippingRegion.GetRegion() );
-    gdk_gc_set_clip_region( m_bgGC, m_currentClippingRegion.GetRegion() );
+    GdkRegion* gdkRegion = m_currentClippingRegion.GetRegion();
+    gdk_gc_set_clip_region(m_penGC,   gdkRegion);
+    gdk_gc_set_clip_region(m_brushGC, gdkRegion);
+    gdk_gc_set_clip_region(m_textGC,  gdkRegion);
+    gdk_gc_set_clip_region(m_bgGC,    gdkRegion);
 }
 
 void wxWindowDCImpl::DestroyClippingRegion()
@@ -2334,20 +2186,14 @@ void wxWindowDCImpl::DestroyClippingRegion()
 
     if (!m_gdkwindow) return;
 
-    if (m_currentClippingRegion.IsEmpty())
-    {
-        gdk_gc_set_clip_rectangle( m_penGC, (GdkRectangle *) NULL );
-        gdk_gc_set_clip_rectangle( m_brushGC, (GdkRectangle *) NULL );
-        gdk_gc_set_clip_rectangle( m_textGC, (GdkRectangle *) NULL );
-        gdk_gc_set_clip_rectangle( m_bgGC, (GdkRectangle *) NULL );
-    }
-    else
-    {
-        gdk_gc_set_clip_region( m_penGC, m_currentClippingRegion.GetRegion() );
-        gdk_gc_set_clip_region( m_brushGC, m_currentClippingRegion.GetRegion() );
-        gdk_gc_set_clip_region( m_textGC, m_currentClippingRegion.GetRegion() );
-        gdk_gc_set_clip_region( m_bgGC, m_currentClippingRegion.GetRegion() );
-    }
+    GdkRegion* gdkRegion = NULL;
+    if (!m_currentClippingRegion.IsEmpty())
+        gdkRegion = m_currentClippingRegion.GetRegion();
+
+    gdk_gc_set_clip_region(m_penGC,   gdkRegion);
+    gdk_gc_set_clip_region(m_brushGC, gdkRegion);
+    gdk_gc_set_clip_region(m_textGC,  gdkRegion);
+    gdk_gc_set_clip_region(m_bgGC,    gdkRegion);
 }
 
 void wxWindowDCImpl::Destroy()