]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/dcclient.cpp
don't use wxVector<wxDataFormat> from wx/clipbrd.h as wxDataFormat definition is...
[wxWidgets.git] / src / gtk / dcclient.cpp
index f81a7f8bc9247a8536696e05acf31a22c3d3165f..c7b1ce56c6cdff3d53a496ef6f9e6c9866d7fdee 100644 (file)
@@ -1,6 +1,6 @@
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/gtk/dcclient.cpp
 /////////////////////////////////////////////////////////////////////////////
 // Name:        src/gtk/dcclient.cpp
-// Purpose:
+// Purpose:     wxWindowDCImpl implementation
 // Author:      Robert Roebling
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Robert Roebling, Chris Breeze
 // Author:      Robert Roebling
 // RCS-ID:      $Id$
 // Copyright:   (c) 1998 Robert Roebling, Chris Breeze
@@ -276,7 +276,8 @@ wxWindowDCImpl::wxWindowDCImpl( wxDC *owner, wxWindow *window ) :
     if ( !widget )
     {
         window = window->GetParent();
     if ( !widget )
     {
         window = window->GetParent();
-        widget = window->m_wxwindow;
+        if (window)
+            widget = window->m_wxwindow;
     }
 
     wxASSERT_MSG( widget, wxT("DC needs a widget") );
     }
 
     wxASSERT_MSG( widget, wxT("DC needs a widget") );
@@ -309,7 +310,7 @@ wxWindowDCImpl::wxWindowDCImpl( wxDC *owner, wxWindow *window ) :
 
     m_window = window;
 
 
     m_window = window;
 
-    if (m_window && m_window->m_wxwindow && 
+    if (m_window && m_window->m_wxwindow &&
         (m_window->GetLayoutDirection() == wxLayout_RightToLeft))
     {
         // reverse sense
         (m_window->GetLayoutDirection() == wxLayout_RightToLeft))
     {
         // reverse sense
@@ -351,7 +352,7 @@ void wxWindowDCImpl::SetUpDC( bool isMemDC )
     }
 
     if (!done)
     }
 
     if (!done)
-    {    
+    {
         if (m_isScreenDC)
         {
             m_penGC = wxGetPoolGC( m_gdkwindow, wxPEN_SCREEN );
         if (m_isScreenDC)
         {
             m_penGC = wxGetPoolGC( m_gdkwindow, wxPEN_SCREEN );
@@ -424,11 +425,11 @@ void wxWindowDCImpl::DoGetSize( int* width, int* height ) const
 }
 
 bool wxWindowDCImpl::DoFloodFill(wxCoord x, wxCoord y,
 }
 
 bool wxWindowDCImpl::DoFloodFill(wxCoord x, wxCoord y,
-                             const wxColour& col, int style)
+                                 const wxColour& col, wxFloodFillStyle style)
 {
 #if wxUSE_IMAGE
     extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,
 {
 #if wxUSE_IMAGE
     extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,
-                              const wxColour & col, int style);
+                              const wxColour & col, wxFloodFillStyle style);
 
     return wxDoFloodFill( GetOwner(), x, y, col, style);
 #else
 
     return wxDoFloodFill( GetOwner(), x, y, col, style);
 #else
@@ -443,31 +444,39 @@ bool wxWindowDCImpl::DoFloodFill(wxCoord x, wxCoord y,
 
 bool wxWindowDCImpl::DoGetPixel( wxCoord x1, wxCoord y1, wxColour *col ) const
 {
 
 bool wxWindowDCImpl::DoGetPixel( wxCoord x1, wxCoord y1, wxColour *col ) const
 {
-#if wxUSE_IMAGE
-    // Generic (and therefore rather inefficient) method.
-    // Could be improved.
-    wxMemoryDC memdc;
-    wxBitmap bitmap(1, 1);
-    memdc.SelectObject(bitmap);
-    memdc.Blit(0, 0, 1, 1, GetOwner(), x1, y1);
-    memdc.SelectObject(wxNullBitmap);
-
-    wxImage image = bitmap.ConvertToImage();
-    col->Set(image.GetRed(0, 0), image.GetGreen(0, 0), image.GetBlue(0, 0));
+    GdkImage* image = NULL;
+    if (m_gdkwindow)
+    {
+        const int x = LogicalToDeviceX(x1);
+        const int y = LogicalToDeviceY(y1);
+        wxRect rect;
+        gdk_drawable_get_size(m_gdkwindow, &rect.width, &rect.height);
+        if (rect.Contains(x, y))
+            image = gdk_drawable_get_image(m_gdkwindow, x, y, 1, 1);
+    }
+    if (image == NULL)
+    {
+        *col = wxColour();
+        return false;
+    }
+    GdkColormap* colormap = gdk_image_get_colormap(image);
+    const unsigned pixel = gdk_image_get_pixel(image, 0, 0);
+    if (colormap == NULL)
+        *col = pixel ? m_textForegroundColour : m_textBackgroundColour;
+    else
+    {
+        GdkColor c;
+        gdk_colormap_query_color(colormap, pixel, &c);
+        col->Set(c.red >> 8, c.green >> 8, c.blue >> 8);
+    }
+    g_object_unref(image);
     return true;
     return true;
-#else // !wxUSE_IMAGE
-    wxUnusedVar(x1);
-    wxUnusedVar(y1);
-    wxUnusedVar(col);
-
-    return false;
-#endif // wxUSE_IMAGE/!wxUSE_IMAGE
 }
 
 void wxWindowDCImpl::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
 {
     wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 }
 
 void wxWindowDCImpl::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
 {
     wxCHECK_RET( IsOk(), wxT("invalid window dc") );
-    
+
     if (m_pen.GetStyle() != wxPENSTYLE_TRANSPARENT)
     {
         if (m_gdkwindow)
     if (m_pen.GetStyle() != wxPENSTYLE_TRANSPARENT)
     {
         if (m_gdkwindow)
@@ -690,7 +699,9 @@ void wxWindowDCImpl::DoDrawLines( int n, wxPoint points[], wxCoord xoffset, wxCo
         delete[] gpts;
 }
 
         delete[] gpts;
 }
 
-void wxWindowDCImpl::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int WXUNUSED(fillStyle) )
+void wxWindowDCImpl::DoDrawPolygon( int n, wxPoint points[],
+                                    wxCoord xoffset, wxCoord yoffset,
+                                    wxPolygonFillMode WXUNUSED(fillStyle) )
 {
     wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
 {
     wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
@@ -999,7 +1010,7 @@ ScaleMask(GdkPixmap* mask, int x, int y, int w, int h, int dst_w, int dst_h, dou
 // Make a new mask from part of a mask and a clip region.
 // Return new mask, unref old one.
 static GdkPixmap*
 // Make a new mask from part of a mask and a clip region.
 // Return new mask, unref old one.
 static GdkPixmap*
-ClipMask(GdkPixmap* mask, const GdkRegion* clipRegion, int x, int y, int dst_x, int dst_y, int w, int h)
+ClipMask(GdkPixmap* mask, GdkRegion* clipRegion, int x, int y, int dst_x, int dst_y, int w, int h)
 {
     GdkGCValues gcValues;
     gcValues.foreground.pixel = 0;
 {
     GdkGCValues gcValues;
     gcValues.foreground.pixel = 0;
@@ -1060,7 +1071,7 @@ void wxWindowDCImpl::DoDrawBitmap( const wxBitmap &bitmap,
     if (m_window && m_window->GetLayoutDirection() == wxLayout_RightToLeft)
         xx -= ww;
 
     if (m_window && m_window->GetLayoutDirection() == wxLayout_RightToLeft)
         xx -= ww;
 
-    const GdkRegion* const clipRegion = m_currentClippingRegion.GetRegion();
+    GdkRegion* const clipRegion = m_currentClippingRegion.GetRegion();
     // determine clip region overlap
     int overlap = wxInRegion;
     if (clipRegion)
     // determine clip region overlap
     int overlap = wxInRegion;
     if (clipRegion)
@@ -1150,7 +1161,7 @@ bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
                          wxCoord width, wxCoord height,
                          wxDC *source,
                          wxCoord xsrc, wxCoord ysrc,
                          wxCoord width, wxCoord height,
                          wxDC *source,
                          wxCoord xsrc, wxCoord ysrc,
-                         int logical_func,
+                         wxRasterOperationMode logical_func,
                          bool useMask,
                          wxCoord xsrcMask, wxCoord ysrcMask )
 {
                          bool useMask,
                          wxCoord xsrcMask, wxCoord ysrcMask )
 {
@@ -1225,7 +1236,7 @@ bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
     const int dst_w = LogicalToDeviceXRel(width);
     const int dst_h = LogicalToDeviceYRel(height);
 
     const int dst_w = LogicalToDeviceXRel(width);
     const int dst_h = LogicalToDeviceYRel(height);
 
-    const GdkRegion* const clipRegion = m_currentClippingRegion.GetRegion();
+    GdkRegion* const clipRegion = m_currentClippingRegion.GetRegion();
     // determine dest clip region overlap
     int overlap = wxInRegion;
     if (clipRegion)
     // determine dest clip region overlap
     int overlap = wxInRegion;
     if (clipRegion)
@@ -1291,7 +1302,7 @@ bool wxWindowDCImpl::DoBlit( wxCoord xdest, wxCoord ydest,
         src_y = 0;
     }
 
         src_y = 0;
     }
 
-    const int logical_func_save = m_logicalFunction;
+    const wxRasterOperationMode logical_func_save = m_logicalFunction;
     SetLogicalFunction(logical_func);
     if (memDC == NULL)
         gdk_gc_set_subwindow(use_gc, GDK_INCLUDE_INFERIORS);
     SetLogicalFunction(logical_func);
     if (memDC == NULL)
         gdk_gc_set_subwindow(use_gc, GDK_INCLUDE_INFERIORS);
@@ -1429,9 +1440,9 @@ void wxWindowDCImpl::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
         x_rtl -= w;
 
     const GdkColor* bg_col = NULL;
         x_rtl -= w;
 
     const GdkColor* bg_col = NULL;
-    if (m_backgroundMode == wxBRUSHSTYLE_SOLID) 
+    if (m_backgroundMode == wxBRUSHSTYLE_SOLID)
         bg_col = m_textBackgroundColour.GetColor();
         bg_col = m_textBackgroundColour.GetColor();
+
     gdk_draw_layout_with_colors(m_gdkwindow, m_textGC, x_rtl, y, m_layout, NULL, bg_col);
 
     if (isScaled)
     gdk_draw_layout_with_colors(m_gdkwindow, m_textGC, x_rtl, y, m_layout, NULL, bg_col);
 
     if (isScaled)
@@ -1452,7 +1463,7 @@ void wxWindowDCImpl::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
     CalcBoundingBox(x, y);
 }
 
     CalcBoundingBox(x, y);
 }
 
-// TODO: When GTK2.6 is required, merge DoDrawText and DoDrawRotatedText to 
+// TODO: When GTK2.6 is required, merge DoDrawText and DoDrawRotatedText to
 // avoid code duplication
 void wxWindowDCImpl::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y, double angle )
 {
 // avoid code duplication
 void wxWindowDCImpl::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord y, double angle )
 {
@@ -1498,7 +1509,7 @@ void wxWindowDCImpl::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord
         pango_layout_get_pixel_size(m_layout, &w, &h);
 
         const GdkColor* bg_col = NULL;
         pango_layout_get_pixel_size(m_layout, &w, &h);
 
         const GdkColor* bg_col = NULL;
-        if (m_backgroundMode == wxBRUSHSTYLE_SOLID) 
+        if (m_backgroundMode == wxBRUSHSTYLE_SOLID)
             bg_col = m_textBackgroundColour.GetColor();
 
         // rotate the text
             bg_col = m_textBackgroundColour.GetColor();
 
         // rotate the text
@@ -1507,13 +1518,13 @@ void wxWindowDCImpl::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord
         pango_context_set_matrix (m_context, &matrix);
         pango_layout_context_changed (m_layout);
 
         pango_context_set_matrix (m_context, &matrix);
         pango_layout_context_changed (m_layout);
 
-        // To be compatible with MSW, the rotation axis must be in the old 
+        // To be compatible with MSW, the rotation axis must be in the old
         // top-left corner.
         // top-left corner.
-        // Calculate the vertices of the rotated rectangle containing the text, 
+        // Calculate the vertices of the rotated rectangle containing the text,
         // relative to the old top-left vertex.
         // relative to the old top-left vertex.
-        // We could use the matrix for this, but it's simpler with trignonometry. 
+        // We could use the matrix for this, but it's simpler with trignonometry.
         double rad = DegToRad(angle);
         double rad = DegToRad(angle);
-        // the rectangle vertices are counted clockwise with the first one 
+        // the rectangle vertices are counted clockwise with the first one
         // being at (0, 0)
         double x2 = w * cos(rad);
         double y2 = -w * sin(rad);   // y axis points to the bottom, hence minus
         // being at (0, 0)
         double x2 = w * cos(rad);
         double y2 = -w * sin(rad);   // y axis points to the bottom, hence minus
@@ -1527,7 +1538,7 @@ void wxWindowDCImpl::DoDrawRotatedText( const wxString &text, wxCoord x, wxCoord
                 minX = (wxCoord)(dmin(dmin(0, x2), dmin(x3, x4)) - 0.5),
                 minY = (wxCoord)(dmin(dmin(0, y2), dmin(y3, y4)) - 0.5);
 
                 minX = (wxCoord)(dmin(dmin(0, x2), dmin(x3, x4)) - 0.5),
                 minY = (wxCoord)(dmin(dmin(0, y2), dmin(y3, y4)) - 0.5);
 
-        gdk_draw_layout_with_colors(m_gdkwindow, m_textGC, x+minX, y+minY, 
+        gdk_draw_layout_with_colors(m_gdkwindow, m_textGC, x+minX, y+minY,
                                     m_layout, NULL, bg_col);
 
         if (m_font.GetUnderlined())
                                     m_layout, NULL, bg_col);
 
         if (m_font.GetUnderlined())
@@ -2040,7 +2051,7 @@ void wxWindowDCImpl::SetBackground( const wxBrush &brush )
     }
 }
 
     }
 }
 
-void wxWindowDCImpl::SetLogicalFunction( int function )
+void wxWindowDCImpl::SetLogicalFunction( wxRasterOperationMode function )
 {
     wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
 {
     wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
@@ -2070,9 +2081,6 @@ void wxWindowDCImpl::SetLogicalFunction( int function )
         case wxNO_OP:        mode = GDK_NOOP;          break;
         case wxSRC_INVERT:   mode = GDK_COPY_INVERT;   break;
         case wxNOR:          mode = GDK_NOR;           break;
         case wxNO_OP:        mode = GDK_NOOP;          break;
         case wxSRC_INVERT:   mode = GDK_COPY_INVERT;   break;
         case wxNOR:          mode = GDK_NOR;           break;
-        default:
-           wxFAIL_MSG( wxT("unsupported logical function") );
-           mode = GDK_COPY;
     }
 
     m_logicalFunction = function;
     }
 
     m_logicalFunction = function;
@@ -2146,7 +2154,7 @@ void wxWindowDCImpl::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, w
     rect.width = XLOG2DEVREL(width);
     rect.height = YLOG2DEVREL(height);
 
     rect.width = XLOG2DEVREL(width);
     rect.height = YLOG2DEVREL(height);
 
-    if (m_window && m_window->m_wxwindow && 
+    if (m_window && m_window->m_wxwindow &&
         (m_window->GetLayoutDirection() == wxLayout_RightToLeft))
     {
         rect.x -= rect.width;
         (m_window->GetLayoutDirection() == wxLayout_RightToLeft))
     {
         rect.x -= rect.width;
@@ -2238,7 +2246,7 @@ void wxWindowDCImpl::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
     m_signX = (xLeftRight ?  1 : -1);
     m_signY = (yBottomUp  ? -1 :  1);
 
     m_signX = (xLeftRight ?  1 : -1);
     m_signY = (yBottomUp  ? -1 :  1);
 
-    if (m_window && m_window->m_wxwindow && 
+    if (m_window && m_window->m_wxwindow &&
         (m_window->GetLayoutDirection() == wxLayout_RightToLeft))
         m_signX = -m_signX;
 
         (m_window->GetLayoutDirection() == wxLayout_RightToLeft))
         m_signX = -m_signX;
 
@@ -2295,7 +2303,7 @@ wxClientDCImpl::wxClientDCImpl( wxDC *owner, wxWindow *win )
     SetDeviceOrigin(ptOrigin.x, ptOrigin.y);
     wxSize size = win->GetClientSize();
     DoSetClippingRegion(0, 0, size.x, size.y);
     SetDeviceOrigin(ptOrigin.x, ptOrigin.y);
     wxSize size = win->GetClientSize();
     DoSetClippingRegion(0, 0, size.x, size.y);
-#endif 
+#endif
     // __WXUNIVERSAL__
 }
 
     // __WXUNIVERSAL__
 }
 
@@ -2361,7 +2369,7 @@ wxPaintDCImpl::wxPaintDCImpl( wxDC *owner, wxWindow *win )
         gdk_gc_set_clip_region( m_textGC, region );
         gdk_gc_set_clip_region( m_bgGC, region );
     }
         gdk_gc_set_clip_region( m_textGC, region );
         gdk_gc_set_clip_region( m_bgGC, region );
     }
-#endif 
+#endif
 }
 
 // ----------------------------------------------------------------------------
 }
 
 // ----------------------------------------------------------------------------