]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
configure changes
[wxWidgets.git] / src / gtk / dcclient.cpp
index 5b39956468b3cb5d1fb802fc324188f63e574cb1..4a06916eefb9a867f0ee4ba41700c52bf7b1fca5 100644 (file)
@@ -126,6 +126,15 @@ wxWindowDC::wxWindowDC( wxWindow *window )
 
     GtkWidget *widget = window->m_wxwindow;
 
+    // some controls don't have m_wxwindow - like wxStaticBox, but the user
+    // code should still be able to create wxClientDCs for them, so we will
+    // use the parent window here then
+    if ( !widget )
+    {
+        window = window->GetParent();
+        widget = window->m_wxwindow;
+    }
+
     wxASSERT_MSG( widget, wxT("DC needs a widget") );
 
     GtkPizza *pizza = GTK_PIZZA( widget );
@@ -140,10 +149,7 @@ wxWindowDC::wxWindowDC( wxWindow *window )
          return;
     }
 
-    if (window->m_wxwindow)
-        m_cmap = gtk_widget_get_colormap( window->m_wxwindow );
-    else
-        m_cmap = gtk_widget_get_colormap( window->m_widget );
+    m_cmap = gtk_widget_get_colormap( widget ? widget : window->m_widget );
 
     SetUpDC();
 
@@ -339,8 +345,16 @@ void wxWindowDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoor
         CalcBoundingBox( points[i].x + xoffset, points[i].y + yoffset );
     }
 
-    if ((m_brush.GetStyle() != wxTRANSPARENT) && m_window)
-        gdk_draw_polygon (m_window, m_brushGC, TRUE, gdkpoints, n);
+    if (m_window)
+    {
+        if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
+            gdk_draw_polygon (m_window, m_textGC, TRUE, gdkpoints, n);
+        else
+        {
+            if ((m_brush.GetStyle() != wxTRANSPARENT))
+                gdk_draw_polygon (m_window, m_brushGC, TRUE, gdkpoints, n);
+        }
+    }
 
     // To do: Fillstyle
 
@@ -377,11 +391,19 @@ void wxWindowDC::DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord h
 
     if (m_window)
     {
-        if (m_brush.GetStyle() != wxTRANSPARENT)
-            gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx, yy, ww, hh );
-
-        if (m_pen.GetStyle() != wxTRANSPARENT)
+        if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
+        {
+            gdk_draw_rectangle( m_window, m_textGC, TRUE, xx, yy, ww, hh );
             gdk_draw_rectangle( m_window, m_penGC, FALSE, xx, yy, ww-1, hh-1 );
+        }
+        else
+        {
+            if (m_brush.GetStyle() != wxTRANSPARENT)
+                gdk_draw_rectangle( m_window, m_brushGC, TRUE, xx, yy, ww, hh );
+
+            if (m_pen.GetStyle() != wxTRANSPARENT)
+                gdk_draw_rectangle( m_window, m_penGC, FALSE, xx, yy, ww-1, hh-1 );
+        }
     }
 
     CalcBoundingBox( x, y );
@@ -561,7 +583,7 @@ void wxWindowDC::DoDrawBitmap( const wxBitmap &bitmap,
         gdk_draw_bitmap( m_window, m_textGC, use_bitmap.GetBitmap(), 0, 0, xx, yy, -1, -1 );
     else
         gdk_draw_pixmap( m_window, m_penGC, use_bitmap.GetPixmap(), 0, 0, xx, yy, -1, -1 );
-        
+
     /* remove mask again if any */
 
     if (useMask && mask)
@@ -871,7 +893,7 @@ void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y,
     double x3 = x4 + x2,
            y3 = y4 + y2;
 
-    // calc max and min 
+    // calc max and min
     wxCoord maxX = (wxCoord)(dmax(x2, dmax(x3, x4)) + 0.5),
             maxY = (wxCoord)(dmax(y2, dmax(y3, y4)) + 0.5),
             minX = (wxCoord)(dmin(x2, dmin(x3, x4)) - 0.5),
@@ -882,7 +904,7 @@ void wxWindowDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y,
 
     GdkColor *colText = m_textForegroundColour.GetColor(),
              *colBack = m_textBackgroundColour.GetColor();
-    
+
     bool textColSet = TRUE;
 
     unsigned char *data = image.GetData();
@@ -1083,6 +1105,7 @@ void wxWindowDC::SetPen( const wxPen &pen )
         }
 
         case wxTRANSPARENT:
+        case wxSTIPPLE_MASK_OPAQUE:
         case wxSTIPPLE:
         case wxSOLID:
         default:
@@ -1116,17 +1139,31 @@ void wxWindowDC::SetPen( const wxPen &pen )
     GdkCapStyle capStyle = GDK_CAP_ROUND;
     switch (m_pen.GetCap())
     {
-        case wxCAP_ROUND:      { capStyle = (width <= 1) ? GDK_CAP_NOT_LAST : GDK_CAP_ROUND; break; }
         case wxCAP_PROJECTING: { capStyle = GDK_CAP_PROJECTING; break; }
         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;
     switch (m_pen.GetJoin())
     {
         case wxJOIN_BEVEL: { joinStyle = GDK_JOIN_BEVEL; break; }
-        case wxJOIN_ROUND: { joinStyle = GDK_JOIN_ROUND; break; }
         case wxJOIN_MITER: { joinStyle = GDK_JOIN_MITER; break; }
+        case wxJOIN_ROUND:
+        default:           { joinStyle = GDK_JOIN_ROUND; break; }
     }
 
     gdk_gc_set_line_attributes( m_penGC, width, lineStyle, capStyle, joinStyle );
@@ -1166,6 +1203,12 @@ void wxWindowDC::SetBrush( const wxBrush &brush )
         }
     }
 
+    if ((m_brush.GetStyle() == wxSTIPPLE_MASK_OPAQUE) && (m_brush.GetStipple()->GetMask()))
+    {
+            gdk_gc_set_fill( m_textGC, GDK_OPAQUE_STIPPLED);
+            gdk_gc_set_stipple( m_textGC, m_brush.GetStipple()->GetMask()->GetBitmap() );
+    }
+
     if (IS_HATCH(m_brush.GetStyle()))
     {
         gdk_gc_set_fill( m_brushGC, GDK_STIPPLED );
@@ -1223,7 +1266,12 @@ void wxWindowDC::SetLogicalFunction( int function )
 {
     wxCHECK_RET( Ok(), wxT("invalid window dc") );
 
-    if (m_logicalFunction == function) return;
+    if (m_logicalFunction == function)
+        return;
+
+    // VZ: shouldn't this be a CHECK?
+    if (!m_window)
+        return;
 
     GdkFunction mode = GDK_COPY;
     switch (function)
@@ -1236,9 +1284,7 @@ void wxWindowDC::SetLogicalFunction( int function )
         case wxCLEAR:        mode = GDK_CLEAR;         break;
         case wxSET:          mode = GDK_SET;           break;
         case wxOR_INVERT:    mode = GDK_OR_INVERT;     break;
-        case wxSRC_AND:
         case wxAND:          mode = GDK_AND;           break;
-        case wxSRC_OR:
         case wxOR:           mode = GDK_OR;            break;
         case wxEQUIV:        mode = GDK_EQUIV;         break;
         case wxNAND:         mode = GDK_NAND;          break;
@@ -1246,6 +1292,9 @@ void wxWindowDC::SetLogicalFunction( int function )
         case wxCOPY:         mode = GDK_COPY;          break;
         case wxNO_OP:        mode = GDK_NOOP;          break;
         case wxSRC_INVERT:   mode = GDK_COPY_INVERT;   break;
+
+        // unsupported by GTK
+        case wxNOR:          mode = GDK_COPY;          break;
 #endif
         default:
         {
@@ -1256,11 +1305,12 @@ void wxWindowDC::SetLogicalFunction( int function )
 
     m_logicalFunction = function;
 
-    if (!m_window) return;
-
     gdk_gc_set_function( m_penGC, mode );
     gdk_gc_set_function( m_brushGC, mode );
-    gdk_gc_set_function( m_textGC, mode );
+
+    // to stay compatible with wxMSW, we don't apply ROPs to the text
+    // operations (i.e. DrawText/DrawRotatedText)
+    //  gdk_gc_set_function( m_textGC, mode );
 }
 
 void wxWindowDC::SetTextForeground( const wxColour &col )
@@ -1345,6 +1395,11 @@ void wxWindowDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
         return;
     }
 
+    wxCoord x,y,w,h;
+    region.GetBox( x, y, w, h );
+
+    wxDC::DoSetClippingRegion( x, y, w, h );
+
     if (!m_window) return;
 
     gdk_gc_set_clip_region( m_penGC, region.GetRegion() );