]> git.saurik.com Git - wxWidgets.git/commitdiff
Converted wxGTK's basic DC classes to new DC code
authorRobert Roebling <robert@roebling.de>
Sun, 23 Sep 2007 11:27:41 +0000 (11:27 +0000)
committerRobert Roebling <robert@roebling.de>
Sun, 23 Sep 2007 11:27:41 +0000 (11:27 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48910 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

16 files changed:
include/wx/dc.h
include/wx/dcmemory.h
include/wx/dcscreen.h
include/wx/gtk/bitmap.h
include/wx/gtk/dc.h
include/wx/gtk/dcclient.h
include/wx/gtk/dcmemory.h
include/wx/gtk/dcscreen.h
src/common/dcbase.cpp
src/common/overlaycmn.cpp
src/gtk/dc.cpp
src/gtk/dcclient.cpp
src/gtk/dcmemory.cpp
src/gtk/dcscreen.cpp
src/gtk/minifram.cpp
src/gtk/renderer.cpp

index 84f9b5f4d545e257d1b266b5b82d57f9977ee308..58bb92bb830b74ccf81ec005b52e46309eedb0df 100644 (file)
 
 #if wxUSE_NEW_DC
 class WXDLLIMPEXP_FWD_CORE wxDC;
+class WXDLLIMPEXP_FWD_CORE wxClientDC;
+class WXDLLIMPEXP_FWD_CORE wxPaintDC;
+class WXDLLIMPEXP_FWD_CORE wxWindowDC;
+class WXDLLIMPEXP_FWD_CORE wxScreenDC;
+class WXDLLIMPEXP_FWD_CORE wxMemoryDC;
 #else
 class WXDLLIMPEXP_FWD_CORE wxDCBase;
 #endif
@@ -117,15 +122,16 @@ public:
     wxDCFactory() {}
     virtual ~wxDCFactory() {}
     
-    virtual wxImplDC* CreateWindowDC() = 0;
-    virtual wxImplDC* CreateWindowDC( wxWindow *window ) = 0;
-    virtual wxImplDC* CreateClientDC() = 0;
-    virtual wxImplDC* CreateClientDC( wxWindow *window ) = 0;
-    virtual wxImplDC* CreatePaintDC() = 0;
-    virtual wxImplDC* CreatePaintDC( wxWindow *window ) = 0;
-    virtual wxImplDC* CreateMemoryDC() = 0;
-    virtual wxImplDC* CreateMemoryDC( wxBitmap &bitmap ) = 0;
-    virtual wxImplDC* CreateMemoryDC( wxDC *dc ) = 0;
+    virtual wxImplDC* CreateWindowDC( wxWindowDC *owner ) = 0;
+    virtual wxImplDC* CreateWindowDC( wxWindowDC *owner, wxWindow *window ) = 0;
+    virtual wxImplDC* CreateClientDC( wxClientDC *owner ) = 0;
+    virtual wxImplDC* CreateClientDC( wxClientDC *owner, wxWindow *window ) = 0;
+    virtual wxImplDC* CreatePaintDC( wxPaintDC *owner ) = 0;
+    virtual wxImplDC* CreatePaintDC( wxPaintDC *owner, wxWindow *window ) = 0;
+    virtual wxImplDC* CreateMemoryDC( wxMemoryDC *owner ) = 0;
+    virtual wxImplDC* CreateMemoryDC( wxMemoryDC *owner, wxBitmap &bitmap ) = 0;
+    virtual wxImplDC* CreateMemoryDC( wxMemoryDC *owner, wxDC *dc ) = 0;
+    virtual wxImplDC* CreateScreenDC( wxScreenDC *owner ) = 0;
     
     static void SetDCFactory( wxDCFactory *factory );
     static wxDCFactory *GetFactory();
@@ -137,20 +143,21 @@ private:
 // wxNativeDCFactory
 //-----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxNativeDCFactory
+class WXDLLIMPEXP_CORE wxNativeDCFactory: public wxDCFactory
 {
 public:
     wxNativeDCFactory() {}
     
-    virtual wxImplDC* CreateWindowDC();
-    virtual wxImplDC* CreateWindowDC( wxWindow *window );
-    virtual wxImplDC* CreateClientDC();
-    virtual wxImplDC* CreateClientDC( wxWindow *window );
-    virtual wxImplDC* CreatePaintDC();
-    virtual wxImplDC* CreatePaintDC( wxWindow *window );
-    virtual wxImplDC* CreateMemoryDC();
-    virtual wxImplDC* CreateMemoryDC( wxBitmap &bitmap );
-    virtual wxImplDC* CreateMemoryDC( wxDC *dc );
+    virtual wxImplDC* CreateWindowDC( wxWindowDC *owner );
+    virtual wxImplDC* CreateWindowDC( wxWindowDC *owner, wxWindow *window );
+    virtual wxImplDC* CreateClientDC( wxClientDC *owner );
+    virtual wxImplDC* CreateClientDC( wxClientDC *owner, wxWindow *window );
+    virtual wxImplDC* CreatePaintDC( wxPaintDC *owner );
+    virtual wxImplDC* CreatePaintDC( wxPaintDC *owner, wxWindow *window );
+    virtual wxImplDC* CreateMemoryDC( wxMemoryDC *owner );
+    virtual wxImplDC* CreateMemoryDC( wxMemoryDC *owner, wxBitmap &bitmap );
+    virtual wxImplDC* CreateMemoryDC( wxMemoryDC *owner, wxDC *dc );
+    virtual wxImplDC* CreateScreenDC( wxScreenDC *owner );
 };
 
 //-----------------------------------------------------------------------------
@@ -163,7 +170,7 @@ public:
     wxImplDC( wxDC *owner );
     ~wxImplDC();
     
-    wxDC *GetOwner() { return m_owner; }
+    wxDC *GetOwner() const { return m_owner; }
     
     virtual bool IsOk() const { return m_ok; }
 
@@ -507,6 +514,9 @@ class wxDC: public wxObject
 public:
     wxDC()   { m_pimpl = NULL; }
 
+    wxImplDC *GetImpl()
+        { return m_pimpl; }
+
     bool IsOk() const 
         { return m_pimpl && m_pimpl->IsOk(); }
 
@@ -1023,21 +1033,6 @@ private:
     DECLARE_DYNAMIC_CLASS(wxClientDC)
 };
 
-//-----------------------------------------------------------------------------
-// wxMemoryDC
-//-----------------------------------------------------------------------------
-
-class WXDLLIMPEXP_CORE wxMemoryDC: public wxDC
-{
-public:
-    wxMemoryDC();
-    wxMemoryDC( wxBitmap& bitmap );
-    wxMemoryDC( wxDC *dc );
-    
-private:
-    DECLARE_DYNAMIC_CLASS(wxMemoryDC)
-};
-    
 //-----------------------------------------------------------------------------
 // wxPaintDC
 //-----------------------------------------------------------------------------
@@ -1081,6 +1076,8 @@ public:
         CalcBoundingBox(drawobject->MaxX(),drawobject->MaxY());
     }
 
+    wxDC *GetOwner() const { return (wxDC*) this; }
+    
     bool FloodFill(wxCoord x, wxCoord y, const wxColour& col,
                    int style = wxFLOOD_SURFACE)
         { return DoFloodFill(x, y, col, style); }
index 4c76214c2a2fb877989f4061369ae8ec0fde42b1..9618b55a221895e114c39b1dfaa256b84a418fcb 100644 (file)
 #ifndef _WX_DCMEMORY_H_BASE_
 #define _WX_DCMEMORY_H_BASE_
 
+#include "wx/dc.h"
 #include "wx/bitmap.h"
 
+
+#if wxUSE_NEW_DC
+
+//-----------------------------------------------------------------------------
+// wxMemoryDC
+//-----------------------------------------------------------------------------
+
+class WXDLLIMPEXP_CORE wxMemoryImplDCBase
+{
+public:
+    wxMemoryImplDCBase() { }
+
+    virtual void DoSelect(const wxBitmap& bmp) = 0;
+    
+    virtual const wxBitmap& DoGetSelectedBitmap() const = 0;
+    virtual wxBitmap& DoGetSelectedBitmap() = 0;
+};
+
+
+class WXDLLIMPEXP_CORE wxMemoryDC: public wxDC
+{
+public:
+    wxMemoryDC();
+    wxMemoryDC( wxBitmap& bitmap );
+    wxMemoryDC( wxDC *dc );
+    
+    // select the given bitmap to draw on it
+    void SelectObject(wxBitmap& bmp);
+
+    // select the given bitmap for read-only
+    void SelectObjectAsSource(const wxBitmap& bmp);
+    
+    // get selected bitmap
+    const wxBitmap& GetSelectedBitmap() const;
+    wxBitmap& GetSelectedBitmap();
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxMemoryDC)
+};
+    
+
+
+#else
+
 // NOTE: different native implementations of wxMemoryDC will derive from
 //       different wxDC classes (wxPaintDC, wxWindowDC, etc), so that
 //       we cannot derive wxMemoryDCBase from wxDC and then use it as the
@@ -48,6 +93,10 @@ protected:
     virtual void DoSelect(const wxBitmap& bmp) = 0;
 };
 
+
+#endif
+
+
 #if defined(__WXPALMOS__)
 #include "wx/palmos/dcmemory.h"
 #elif defined(__WXMSW__)
index bd6fcb9f52035adc3943e158fee750178e254db3..f320205b8e7f986ffd49991904c9e348dee43579 100644 (file)
 #define _WX_DCSCREEN_H_BASE_
 
 #include "wx/defs.h"
+#include "wx/dc.h"
+
+#if wxUSE_NEW_DC
+
+class WXDLLIMPEXP_CORE wxScreenDC : public wxWindowDC
+{
+public:
+    wxScreenDC();
+
+private:
+    DECLARE_DYNAMIC_CLASS(wxScreenDC)
+};
+
+#endif
 
 #if defined(__WXPALMOS__)
 #include "wx/palmos/dcscreen.h"
index f0c4fe73c607412a57ee2fec40303556a507d2b5..98bc4a8beea942192afda6193e56a176f3049182 100644 (file)
@@ -137,6 +137,8 @@ private:
     bool CreateFromImageAsPixbuf(const wxImage& image);
 #endif // wxUSE_IMAGE
 
+public:
+    // implementation only
     enum Representation
     {
         Pixmap,
@@ -146,9 +148,6 @@ private:
     // (wxBitmap may keep same bitmap e.g. as both pixmap and pixbuf):
     void PurgeOtherRepresentations(Representation keep);
 
-    friend class wxMemoryDC;
-    friend class wxBitmapHandler;
-
 private:
     DECLARE_DYNAMIC_CLASS(wxBitmap)
 };
index 07e9a26851fc9e3091ae1e9df2701c1a3df0c698..a4136609d66f8490cc41aa3420cfb9fb8b86170a 100644 (file)
 //-----------------------------------------------------------------------------
 
 #if wxUSE_NEW_DC
-class WXDLLIMPEXP_CORE wxGTKImplDC : public wxDC
+class WXDLLIMPEXP_CORE wxGTKImplDC : public wxImplDC
 #else
 #define wxGTKImplDC wxDC
-class WXDLLIMPEXP_CORE wxGTKImplDC : public wxDCBase
+class WXDLLIMPEXP_CORE wxDC : public wxDCBase
 #endif
 
 {
 public:
-    wxGTKImplDC();
-    virtual ~wxGTKImplDC() { }
+#if wxUSE_NEW_DC
+    wxGTKImplDC( wxDC *owner );
+#else
+    wxDC();
+#endif
+
+    virtual ~wxGTKImplDC();
 
 #if wxUSE_PALETTE
     void SetColourMap( const wxPalette& palette ) { SetPalette(palette); };
index 369deee2fddc4322581e3f5aa41311777461c3c5..065e32a235280e104f1ebbfcdbb707e3475a6a27 100644 (file)
@@ -27,8 +27,15 @@ class WXDLLIMPEXP_CORE wxWindowDC : public wxDC
 #endif
 {
 public:
-    wxGTKWindowImplDC();
-    wxGTKWindowImplDC( wxWindow *win );
+
+
+#if wxUSE_NEW_DC
+    wxGTKWindowImplDC( wxDC *owner );
+    wxGTKWindowImplDC( wxDC *owner, wxWindow *win );
+#else
+    wxWindowDC();
+    wxWindowDC( wxWindow *win );
+#endif
 
     virtual ~wxGTKWindowImplDC();
 
@@ -115,9 +122,8 @@ public:
     GdkGC        *m_textGC;
     GdkGC        *m_bgGC;
     GdkColormap  *m_cmap;
-    bool          m_isMemDC;
     bool          m_isScreenDC;
-    wxWindow     *m_owner;
+    wxWindow     *m_owningWindow;
     wxRegion      m_currentClippingRegion;
     wxRegion      m_paintClippingRegion;
 
@@ -126,7 +132,7 @@ public:
     PangoLayout *m_layout;
     PangoFontDescription *m_fontdesc;
 
-    void SetUpDC();
+    void SetUpDC( bool ismem = false );
     void Destroy();
     
     virtual void ComputeScaleAndOrigin();
@@ -134,7 +140,7 @@ public:
     virtual GdkWindow *GetGDKWindow() const { return m_window; }
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxGTKWindowImplDC)
+    DECLARE_ABSTRACT_CLASS(wxGTKWindowImplDC)
 };
 
 //-----------------------------------------------------------------------------
@@ -149,14 +155,20 @@ class WXDLLIMPEXP_CORE wxClientDC : public wxWindowDC
 #endif
 {
 public:
-    wxGTKClientImplDC() { }
-    wxGTKClientImplDC( wxWindow *win );
+
+#if wxUSE_NEW_DC
+    wxGTKClientImplDC( wxDC *owner );
+    wxGTKClientImplDC( wxDC *owner, wxWindow *win );
+#else
+    wxClientDC();
+    wxClientDC( wxWindow *win );
+#endif
 
 protected:
     virtual void DoGetSize(int *width, int *height) const;
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxGTKClientImplDC)
+    DECLARE_ABSTRACT_CLASS(wxGTKClientImplDC)
 };
 
 //-----------------------------------------------------------------------------
@@ -171,11 +183,17 @@ class WXDLLIMPEXP_CORE wxPaintDC : public wxClientDC
 #endif
 {
 public:
-    wxGTKPaintImplDC() { }
-    wxGTKPaintImplDC( wxWindow *win );
+
+#if wxUSE_NEW_DC
+    wxGTKPaintImplDC( wxDC *owner );
+    wxGTKPaintImplDC( wxDC *owner, wxWindow *win );
+#else
+    wxPaintDC();
+    wxPaintDC( wxWindow *win );
+#endif
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxGTKPaintImplDC)
+    DECLARE_ABSTRACT_CLASS(wxGTKPaintImplDC)
 };
 
 #endif // __GTKDCCLIENTH__
index a0fb9d6c23b428d246a2f8dda6939b595780ca24..f9e4fcf6640789708511aba5f6b5da6fb88e5673 100644 (file)
 // wxMemoryDC
 //-----------------------------------------------------------------------------
 
+
+#if wxUSE_NEW_DC
+class WXDLLIMPEXP_CORE wxGTKMemoryImplDC : public wxGTKWindowImplDC, public wxMemoryImplDCBase
+#else
+#define wxGTKMemoryImplDC wxMemoryDC
 class WXDLLIMPEXP_CORE wxMemoryDC : public wxWindowDC, public wxMemoryDCBase
+#endif
 {
 public:
-    wxMemoryDC() : wxWindowDC() { Init(); }
-    wxMemoryDC(wxBitmap& bitmap) : wxWindowDC() { Init(); SelectObject(bitmap); }
-    wxMemoryDC( wxDC *dc ); // Create compatible DC
-    virtual ~wxMemoryDC();
+
+#if wxUSE_NEW_DC
+    wxGTKMemoryImplDC( wxMemoryDC *owner );
+    wxGTKMemoryImplDC( wxMemoryDC *owner, wxBitmap& bitmap );
+    wxGTKMemoryImplDC( wxMemoryDC *owner, wxDC *dc );
+#else
+    wxMemoryDC();
+    wxMemoryDC(wxBitmap& bitmap);
+    wxMemoryDC( wxDC *dc );
+#endif
+    
+    virtual ~wxGTKMemoryImplDC();
 
     // these get reimplemented for mono-bitmaps to behave
     // more like their Win32 couterparts. They now interpret
@@ -36,21 +50,24 @@ public:
 
     // implementation
     wxBitmap GetSelectedBitmap() const { return m_selected; }
-    wxBitmap  m_selected;
 
 protected:
-    void DoGetSize( int *width, int *height ) const;
+    // overridden from wxImplDC
+    virtual void DoGetSize( int *width, int *height ) const;
+    virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const;
+
+public:    
+    // overridden from wxMemoryImplDCBase
     virtual void DoSelect(const wxBitmap& bitmap);
-    virtual wxBitmap DoGetAsBitmap(const wxRect *subrect) const
-    {
-        wxBitmap bmp = GetSelectedBitmap();
-        return subrect ? bmp.GetSubBitmap(*subrect) : bmp;
-    }
+    virtual const wxBitmap& DoGetSelectedBitmap() const;
+    virtual wxBitmap& DoGetSelectedBitmap();
 
+    wxBitmap  m_selected;
+    
 private:
     void Init();
 
-    DECLARE_DYNAMIC_CLASS(wxMemoryDC)
+    DECLARE_ABSTRACT_CLASS(wxGTKMemoryImplDC)
 };
 
 #endif // _WX_GTK_DCMEMORY_H_
index 0f8259717f097dce48f0e18079931ca5fc7e2aeb..79ed9959a907b048e5786b07b3fd594fba007788 100644 (file)
 
 #include "wx/dcclient.h"
 
-//-----------------------------------------------------------------------------
-// classes
-//-----------------------------------------------------------------------------
-
-class WXDLLIMPEXP_FWD_CORE wxScreenDC;
-
 //-----------------------------------------------------------------------------
 // wxScreenDC
 //-----------------------------------------------------------------------------
 
-class WXDLLIMPEXP_CORE wxScreenDC : public wxPaintDC
+#if wxUSE_NEW_DC
+class WXDLLIMPEXP_CORE wxGTKScreenImplDC : public wxGTKWindowImplDC
+#else
+#define wxGTKScreenImplDC wxScreenDC
+class WXDLLIMPEXP_CORE wxScreenDC : public wxWindowDC
+#endif
 {
 public:
+
+#if wxUSE_NEW_DC
+    wxGTKScreenImplDC( wxScreenDC *owner );
+#else
     wxScreenDC();
-    virtual ~wxScreenDC();
+#endif
 
-    static bool StartDrawingOnTop( wxWindow *window );
-    static bool StartDrawingOnTop( wxRect *rect = (wxRect *) NULL );
-    static bool EndDrawingOnTop();
+    ~wxGTKScreenImplDC();
 
-    // implementation
+    static bool StartDrawingOnTop( wxWindow *window ) { return true; }
+    static bool StartDrawingOnTop( wxRect *rect = (wxRect *) NULL ) { return true; }
+    static bool EndDrawingOnTop() { return true; }
 
-    static GdkWindow  *sm_overlayWindow;
-    static int         sm_overlayWindowX;
-    static int         sm_overlayWindowY;
 
 protected:
     virtual void DoGetSize(int *width, int *height) const;
+    
+    void Init();
 
 private:
-    DECLARE_DYNAMIC_CLASS(wxScreenDC)
+    DECLARE_ABSTRACT_CLASS(wxGTKScreenImplDC)
 };
 
 #endif
index 9f28a5f0ad6afcfcaf8b12cb100092188205adb3..28f3ab3db7c8f91ef76a4c2d024dbb4ccacbca84 100644 (file)
@@ -25,6 +25,9 @@
 #endif
 
 #include "wx/dc.h"
+#include "wx/dcclient.h"
+#include "wx/dcmemory.h"
+#include "wx/dcscreen.h"
 #include "wx/dcbuffer.h" // for IMPLEMENT_DYNAMIC_CLASS
 
 #ifndef WX_PRECOMP
@@ -61,246 +64,273 @@ wxDCFactory *wxDCFactory::GetFactory()
 // wxNativeDCFactory
 //-----------------------------------------------------------------------------
 
-wxImplDC* wxNativeDCFactory::CreateWindowDC()
+wxImplDC* wxNativeDCFactory::CreateWindowDC( wxWindowDC *owner )
 { 
 #if defined(__WXMSW__)
-    return new wxWindowsWindowImplDC();
+    return new wxWindowsWindowImplDC( owner );
 #elif defined(__WXGTK20__)
-    return new wxGTKWindowImplDC();
+    return new wxGTKWindowImplDC( owner );
 #elif defined(__WXGTK__)
-    return new wxGTKWindowImplDC();
+    return new wxGTKWindowImplDC( owner );
 #elif defined(__WXMAC__)
-    return new wxMacWindowImplDC();
+    return new wxMacWindowImplDC( owner );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaWindowImplDC();
+    return new wxCocoaWindowImplDC( owner );
 #elif defined(__WXMOTIF__)
-    return new wxMotifWindowImplDC();
+    return new wxMotifWindowImplDC( owner );
 #elif defined(__WXX11__)
-    return new wxX11WindowImplDC();
+    return new wxX11WindowImplDC( owner );
 #elif defined(__WXMGL__)
-    return new wxMGLWindowImplDC();
+    return new wxMGLWindowImplDC( owner );
 #elif defined(__WXDFB__)
-    return new wxDFBWindowImplDC();
+    return new wxDFBWindowImplDC( owner );
 #elif defined(__WXPM__)
-    return new wxPMWindowImplDC();
+    return new wxPMWindowImplDC( owner );
 #elif defined(__PALMOS__)
-    return new wxPalmWindowImplDC();
+    return new wxPalmWindowImplDC( owner );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreateWindowDC( wxWindow *window )
+wxImplDC* wxNativeDCFactory::CreateWindowDC( wxWindowDC *owner, wxWindow *window )
 { 
 #if defined(__WXMSW__)
-    return new wxWindowsWindowImplDC( window );
+    return new wxWindowsWindowImplDC( owner, window );
 #elif defined(__WXGTK20__)
-    return new wxGTKWindowImplDC( window );
+    return new wxGTKWindowImplDC( owner, window );
 #elif defined(__WXGTK__)
-    return new wxGTKWindowImplDC( window );
+    return new wxGTKWindowImplDC( owner, window );
 #elif defined(__WXMAC__)
-    return new wxMacWindowImplDC( window );
+    return new wxMacWindowImplDC( owner, window );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaWindowImplDC( window );
+    return new wxCocoaWindowImplDC( owner, window );
 #elif defined(__WXMOTIF__)
-    return new wxMotifWindowImplDC( window );
+    return new wxMotifWindowImplDC( owner, window );
 #elif defined(__WXX11__)
-    return new wxX11WindowImplDC( window );
+    return new wxX11WindowImplDC( owner, window );
 #elif defined(__WXMGL__)
-    return new wxMGLWindowImplDC( window );
+    return new wxMGLWindowImplDC( owner, window );
 #elif defined(__WXDFB__)
-    return new wxDFBWindowImplDC( window );
+    return new wxDFBWindowImplDC( owner, window );
 #elif defined(__WXPM__)
-    return new wxPMWindowImplDC( window );
+    return new wxPMWindowImplDC( owner, window );
 #elif defined(__PALMOS__)
-    return new wxPalmWindowImplDC( window );
+    return new wxPalmWindowImplDC( owner, window );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreateClientDC()
+wxImplDC* wxNativeDCFactory::CreateClientDC( wxClientDC *owner )
 {
 #if defined(__WXMSW__)
-    return new wxWindowsClientImplDC();
+    return new wxWindowsClientImplDC( owner );
 #elif defined(__WXGTK20__)
-    return new wxGTKClientImplDC();
+    return new wxGTKClientImplDC( owner );
 #elif defined(__WXGTK__)
-    return new wxGTKClientImplDC();
+    return new wxGTKClientImplDC( owner );
 #elif defined(__WXMAC__)
-    return new wxMacClientImplDC();
+    return new wxMacClientImplDC( owner );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaClientImplDC();
+    return new wxCocoaClientImplDC( owner );
 #elif defined(__WXMOTIF__)
-    return new wxMotifClientImplDC();
+    return new wxMotifClientImplDC( owner );
 #elif defined(__WXX11__)
-    return new wxX11ClientImplDC();
+    return new wxX11ClientImplDC( owner );
 #elif defined(__WXMGL__)
-    return new wxMGLClientImplDC();
+    return new wxMGLClientImplDC( owner );
 #elif defined(__WXDFB__)
-    return new wxDFBClientImplDC();
+    return new wxDFBClientImplDC( owner );
 #elif defined(__WXPM__)
-    return new wxPMClientImplDC();
+    return new wxPMClientImplDC( owner );
 #elif defined(__PALMOS__)
-    return new wxPalmClientImplDC();
+    return new wxPalmClientImplDC( owner );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreateClientDC( wxWindow *window )
+wxImplDC* wxNativeDCFactory::CreateClientDC( wxClientDC *owner, wxWindow *window )
 {
 #if defined(__WXMSW__)
-    return new wxWindowsClientImplDC( window );
+    return new wxWindowsClientImplDC( owner, window );
 #elif defined(__WXGTK20__)
-    return new wxGTKClientImplDC( window );
+    return new wxGTKClientImplDC( owner, window );
 #elif defined(__WXGTK__)
-    return new wxGTKClientImplDC( window );
+    return new wxGTKClientImplDC( owner, window );
 #elif defined(__WXMAC__)
-    return new wxMacClientImplDC( window );
+    return new wxMacClientImplDC( owner, window );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaClientImplDC( window );
+    return new wxCocoaClientImplDC( owner, window );
 #elif defined(__WXMOTIF__)
-    return new wxMotifClientImplDC( window );
+    return new wxMotifClientImplDC( owner, window );
 #elif defined(__WXX11__)
-    return new wxX11ClientImplDC( window );
+    return new wxX11ClientImplDC( owner, window );
 #elif defined(__WXMGL__)
-    return new wxMGLClientImplDC( window );
+    return new wxMGLClientImplDC( owner, window );
 #elif defined(__WXDFB__)
-    return new wxDFBClientImplDC( window );
+    return new wxDFBClientImplDC( owner, window );
 #elif defined(__WXPM__)
-    return new wxPMClientImplDC( window );
+    return new wxPMClientImplDC( owner, window );
 #elif defined(__PALMOS__)
-    return new wxPalmClientImplDC( window );
+    return new wxPalmClientImplDC( owner, window );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreatePaintDC()
+wxImplDC* wxNativeDCFactory::CreatePaintDC( wxPaintDC *owner )
 {
 #if defined(__WXMSW__)
-    return new wxWindowsPaintImplDC();
+    return new wxWindowsPaintImplDC( owner );
 #elif defined(__WXGTK20__)
-    return new wxGTKPaintImplDC();
+    return new wxGTKPaintImplDC( owner );
 #elif defined(__WXGTK__)
-    return new wxGTKPaintImplDC();
+    return new wxGTKPaintImplDC( owner );
 #elif defined(__WXMAC__)
-    return new wxMacPaintImplDC();
+    return new wxMacPaintImplDC( owner );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaPaintImplDC();
+    return new wxCocoaPaintImplDC( owner );
 #elif defined(__WXMOTIF__)
-    return new wxMotifPaintImplDC();
+    return new wxMotifPaintImplDC( owner );
 #elif defined(__WXX11__)
-    return new wxX11PaintImplDC();
+    return new wxX11PaintImplDC( owner );
 #elif defined(__WXMGL__)
-    return new wxMGLPaintImplDC();
+    return new wxMGLPaintImplDC( owner );
 #elif defined(__WXDFB__)
-    return new wxDFBPaintImplDC();
+    return new wxDFBPaintImplDC( owner );
 #elif defined(__WXPM__)
-    return new wxPMPaintImplDC();
+    return new wxPMPaintImplDC( owner );
 #elif defined(__PALMOS__)
-    return new wxPalmPaintImplDC();
+    return new wxPalmPaintImplDC( owner );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreatePaintDC( wxWindow *window )
+wxImplDC* wxNativeDCFactory::CreatePaintDC( wxPaintDC *owner, wxWindow *window )
 {
 #if defined(__WXMSW__)
-    return new wxWindowsPaintImplDC( window );
+    return new wxWindowsPaintImplDC( owner, window );
 #elif defined(__WXGTK20__)
-    return new wxGTKPaintImplDC( window );
+    return new wxGTKPaintImplDC( owner, window );
 #elif defined(__WXGTK__)
-    return new wxGTKPaintImplDC( window );
+    return new wxGTKPaintImplDC( owner, window );
 #elif defined(__WXMAC__)
-    return new wxMacPaintImplDC( window );
+    return new wxMacPaintImplDC( owner, window );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaPaintImplDC( window );
+    return new wxCocoaPaintImplDC( owner, window );
 #elif defined(__WXMOTIF__)
-    return new wxMotifPaintImplDC( window );
+    return new wxMotifPaintImplDC( owner, window );
 #elif defined(__WXX11__)
-    return new wxX11PaintImplDC( window );
+    return new wxX11PaintImplDC( owner, window );
 #elif defined(__WXMGL__)
-    return new wxMGLPaintImplDC( window );
+    return new wxMGLPaintImplDC( owner, window );
 #elif defined(__WXDFB__)
-    return new wxDFBPaintImplDC( window );
+    return new wxDFBPaintImplDC( owner, window );
 #elif defined(__WXPM__)
-    return new wxPMPaintImplDC( window );
+    return new wxPMPaintImplDC( owner, window );
 #elif defined(__PALMOS__)
-    return new wxPalmPaintImplDC( window );
+    return new wxPalmPaintImplDC( owner, window );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreateMemoryDC()
+wxImplDC* wxNativeDCFactory::CreateMemoryDC( wxMemoryDC *owner )
 {
 #if defined(__WXMSW__)
-    return new wxWindowsMemoryImplDC();
+    return new wxWindowsMemoryImplDC( owner );
 #elif defined(__WXGTK20__)
-    return new wxGTKMemoryImplDC();
+    return new wxGTKMemoryImplDC( owner );
 #elif defined(__WXGTK__)
-    return new wxGTKMemoryImplDC();
+    return new wxGTKMemoryImplDC( owner );
 #elif defined(__WXMAC__)
-    return new wxMacMemoryImplDC();
+    return new wxMacMemoryImplDC( owner );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaMemoryImplDC();
+    return new wxCocoaMemoryImplDC( owner );
 #elif defined(__WXMOTIF__)
-    return new wxMotifMemoryImplDC();
+    return new wxMotifMemoryImplDC( owner );
 #elif defined(__WXX11__)
-    return new wxX11MemoryImplDC();
+    return new wxX11MemoryImplDC( owner );
 #elif defined(__WXMGL__)
-    return new wxMGLMemoryImplDC();
+    return new wxMGLMemoryImplDC( owner );
 #elif defined(__WXDFB__)
-    return new wxDFBMemoryImplDC();
+    return new wxDFBMemoryImplDC( owner );
 #elif defined(__WXPM__)
-    return new wxPMMemoryImplDC();
+    return new wxPMMemoryImplDC( owner );
 #elif defined(__PALMOS__)
-    return new wxPalmMemoryImplDC();
+    return new wxPalmMemoryImplDC( owner );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreateMemoryDC( wxBitmap &bitmap )
+wxImplDC* wxNativeDCFactory::CreateMemoryDC( wxMemoryDC *owner, wxBitmap &bitmap )
 {
 #if defined(__WXMSW__)
-    return new wxWindowsMemoryImplDC( bitmap );
+    return new wxWindowsMemoryImplDC( owner, bitmap );
 #elif defined(__WXGTK20__)
-    return new wxGTKMemoryImplDC( bitmap );
+    return new wxGTKMemoryImplDC( owner, bitmap );
 #elif defined(__WXGTK__)
-    return new wxGTKMemoryImplDC( bitmap );
+    return new wxGTKMemoryImplDC( owner, bitmap );
 #elif defined(__WXMAC__)
-    return new wxMacMemoryImplDC( bitmap );
+    return new wxMacMemoryImplDC( owner, bitmap );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaMemoryImplDC( bitmap );
+    return new wxCocoaMemoryImplDC( owner, bitmap );
 #elif defined(__WXMOTIF__)
-    return new wxMotifMemoryImplDC( bitmap );
+    return new wxMotifMemoryImplDC( owner, bitmap );
 #elif defined(__WXX11__)
-    return new wxX11MemoryImplDC( bitmap );
+    return new wxX11MemoryImplDC( owner, bitmap );
 #elif defined(__WXMGL__)
-    return new wxMGLMemoryImplDC( bitmap );
+    return new wxMGLMemoryImplDC( owner, bitmap );
 #elif defined(__WXDFB__)
-    return new wxDFBMemoryImplDC( bitmap );
+    return new wxDFBMemoryImplDC( owner, bitmap );
 #elif defined(__WXPM__)
-    return new wxPMMemoryImplDC( bitmap );
+    return new wxPMMemoryImplDC( owner, bitmap );
 #elif defined(__PALMOS__)
-    return new wxPalmMemoryImplDC( bitmap );
+    return new wxPalmMemoryImplDC( owner, bitmap );
 #endif
 }
 
-wxImplDC* wxNativeDCFactory::CreateMemoryDC( wxDC *dc )
+wxImplDC* wxNativeDCFactory::CreateMemoryDC( wxMemoryDC *owner, wxDC *dc )
 {
 #if defined(__WXMSW__)
-    return new wxWindowsMemoryImplDC( dc );
+    return new wxWindowsMemoryImplDC( owner, dc );
 #elif defined(__WXGTK20__)
-    return new wxGTKMemoryImplDC( dc );
+    return new wxGTKMemoryImplDC( owner, dc );
 #elif defined(__WXGTK__)
-    return new wxGTKMemoryImplDC( dc );
+    return new wxGTKMemoryImplDC( owner, dc );
 #elif defined(__WXMAC__)
-    return new wxMacMemoryImplDC( dc );
+    return new wxMacMemoryImplDC( owner, dc );
 #elif defined(__WXCOCOA__)
-    return new wxCocoaMemoryImplDC( dc );
+    return new wxCocoaMemoryImplDC( owner, dc );
 #elif defined(__WXMOTIF__)
-    return new wxMotifMemoryImplDC( dc );
+    return new wxMotifMemoryImplDC( owner, dc );
 #elif defined(__WXX11__)
-    return new wxX11MemoryImplDC( dc );
+    return new wxX11MemoryImplDC( owner, dc );
 #elif defined(__WXMGL__)
-    return new wxMGLMemoryImplDC( dc );
+    return new wxMGLMemoryImplDC( owner, dc );
 #elif defined(__WXDFB__)
-    return new wxDFBMemoryImplDC( dc );
+    return new wxDFBMemoryImplDC( owner, dc );
 #elif defined(__WXPM__)
-    return new wxPMMemoryImplDC( dc );
+    return new wxPMMemoryImplDC( owner, dc );
 #elif defined(__PALMOS__)
-    return new wxPalmMemoryImplDC( dc );
+    return new wxPalmMemoryImplDC( owner, dc );
+#endif
+}
+
+wxImplDC* wxNativeDCFactory::CreateScreenDC( wxScreenDC *owner )
+{
+#if defined(__WXMSW__)
+    return new wxWindowsScreenImplDC( owner );
+#elif defined(__WXGTK20__)
+    return new wxGTKScreenImplDC( owner );
+#elif defined(__WXGTK__)
+    return new wxGTKScreenImplDC( owner );
+#elif defined(__WXMAC__)
+    return new wxMacScreenImplDC( owner );
+#elif defined(__WXCOCOA__)
+    return new wxCocoaScreenImplDC( owner );
+#elif defined(__WXMOTIF__)
+    return new wxMotifScreenImplDC( owner );
+#elif defined(__WXX11__)
+    return new wxX11ScreenImplDC( owner );
+#elif defined(__WXMGL__)
+    return new wxMGLScreenImplDC( owner );
+#elif defined(__WXDFB__)
+    return new wxDFBScreenImplDC( owner );
+#elif defined(__WXPM__)
+    return new wxPMScreenImplDC( owner );
+#elif defined(__PALMOS__)
+    return new wxPalmScreenImplDC( owner );
 #endif
 }
 
@@ -310,16 +340,16 @@ wxImplDC* wxNativeDCFactory::CreateMemoryDC( wxDC *dc )
 
 IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
 
-wxWindow::wxWindowDC()
+wxWindowDC::wxWindowDC()
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreateWindowDC();
+    m_pimpl = factory->CreateWindowDC( this );
 }
 
-wxWindow::wxWindowDC( wxWindow *win )
+wxWindowDC::wxWindowDC( wxWindow *win )
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreateWindowDC( win );
+    m_pimpl = factory->CreateWindowDC( this, win );
 }
 
 //-----------------------------------------------------------------------------
@@ -331,13 +361,13 @@ IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxDC)
 wxClientDC::wxClientDC()
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreateClientDC();
+    m_pimpl = factory->CreateClientDC( this );
 }
 
 wxClientDC::wxClientDC( wxWindow *win )
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreateClientDC( win );
+    m_pimpl = factory->CreateClientDC( this, win );
 }
 
 //-----------------------------------------------------------------------------
@@ -349,20 +379,75 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
 wxMemoryDC::wxMemoryDC()
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreateMemoryDC();
+    m_pimpl = factory->CreateMemoryDC( this );
 }
 
 wxMemoryDC::wxMemoryDC( wxBitmap& bitmap )
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreateMemoryDC( bitmap );
+    m_pimpl = factory->CreateMemoryDC( this, bitmap );
 }
 
 wxMemoryDC::wxMemoryDC( wxDC *dc )
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreateMemoryDC( dc );
+    m_pimpl = factory->CreateMemoryDC( this, dc );
+}
+
+void wxMemoryDC::SelectObject(wxBitmap& bmp)
+{
+    // make sure that the given wxBitmap is not sharing its data with other
+    // wxBitmap instances as its contents will be modified by any drawing
+    // operation done on this DC
+    if (bmp.IsOk())
+        bmp.UnShare();
+
+#ifdef __WXGTK__
+    wxGTKMemoryImplDC *mem_pimpl = wxDynamicCast( m_pimpl, wxGTKMemoryImplDC );
+#else
+    // TODO
+#endif
+    if (mem_pimpl)
+        mem_pimpl->DoSelect(bmp);
 }
+
+void wxMemoryDC::SelectObjectAsSource(const wxBitmap& bmp)
+{
+#ifdef __WXGTK__
+    wxGTKMemoryImplDC *mem_pimpl = wxDynamicCast( m_pimpl, wxGTKMemoryImplDC );
+#else
+    // TODO
+#endif
+    mem_pimpl->DoSelect(bmp);
+}
+
+const wxBitmap& wxMemoryDC::GetSelectedBitmap() const
+{
+#ifdef __WXGTK__
+    wxGTKMemoryImplDC *mem_pimpl = wxDynamicCast( m_pimpl, wxGTKMemoryImplDC );
+#else
+    // TODO
+#endif
+    if (mem_pimpl)
+        return mem_pimpl->DoGetSelectedBitmap();
+
+    return wxNullBitmap;    
+}
+
+wxBitmap& wxMemoryDC::GetSelectedBitmap()
+{
+#ifdef __WXGTK__
+    wxGTKMemoryImplDC *mem_pimpl = wxDynamicCast( m_pimpl, wxGTKMemoryImplDC );
+#else
+    // TODO
+#endif
+    
+    if (mem_pimpl)
+        return mem_pimpl->DoGetSelectedBitmap();
+   
+    return wxNullBitmap;    
+}
+
     
 //-----------------------------------------------------------------------------
 // wxPaintDC
@@ -373,13 +458,25 @@ IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxDC)
 wxPaintDC::wxPaintDC()
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreatePaintDC();
+    m_pimpl = factory->CreatePaintDC( this );
 }
 
 wxPaintDC::wxPaintDC( wxWindow *win )
 {
     wxDCFactory *factory = wxDCFactory::GetFactory();
-    m_pimpl = factory->CreatePaintDC( win );
+    m_pimpl = factory->CreatePaintDC( this, win );
+}
+
+//-----------------------------------------------------------------------------
+// wxScreenDC
+//-----------------------------------------------------------------------------
+
+IMPLEMENT_DYNAMIC_CLASS(wxScreenDC, wxWindowDC)
+
+wxScreenDC::wxScreenDC()
+{
+    wxDCFactory *factory = wxDCFactory::GetFactory();
+    m_pimpl = factory->CreateScreenDC( this );
 }
 
 //-----------------------------------------------------------------------------
@@ -432,61 +529,6 @@ wxImplDC::~wxImplDC()
 {
 }
 
-#if WXWIN_COMPATIBILITY_2_8
-    // for compatibility with the old code when wxCoord was long everywhere
-void wxImplDC::GetTextExtent(const wxString& string,
-                       long *x, long *y,
-                       long *descent,
-                       long *externalLeading,
-                       const wxFont *theFont) const
-    {
-        wxCoord x2, y2, descent2, externalLeading2;
-        DoGetTextExtent(string, &x2, &y2,
-                        &descent2, &externalLeading2,
-                        theFont);
-        if ( x )
-            *x = x2;
-        if ( y )
-            *y = y2;
-        if ( descent )
-            *descent = descent2;
-        if ( externalLeading )
-            *externalLeading = externalLeading2;
-    }
-
-void wxImplDC::GetLogicalOrigin(long *x, long *y) const 
-    {
-        wxCoord x2, y2;
-        DoGetLogicalOrigin(&x2, &y2);
-        if ( x )
-            *x = x2;
-        if ( y )
-            *y = y2;
-    }
-
-void wxImplDC::GetDeviceOrigin(long *x, long *y) const 
-    {
-        wxCoord x2, y2;
-        DoGetDeviceOrigin(&x2, &y2);
-        if ( x )
-            *x = x2;
-        if ( y )
-            *y = y2;
-    } 
-    
-void wxImplDC::GetClippingBox(long *x, long *y, long *w, long *h) const 
-    {
-        wxCoord xx,yy,ww,hh;
-        DoGetClippingBox(&xx, &yy, &ww, &hh);
-        if (x) *x = xx;
-        if (y) *y = yy;
-        if (w) *w = ww;
-        if (h) *h = hh;
-    } 
-#endif  // WXWIN_COMPATIBILITY_2_8
-
-
-
 // ----------------------------------------------------------------------------
 // coordinate conversions and transforms
 // ----------------------------------------------------------------------------
@@ -669,7 +711,7 @@ bool wxImplDC::DoGetPartialTextExtents(const wxString& text, wxArrayInt& widths)
         }
         else
         {
-            GetTextExtent(c, &w, &h);
+            DoGetTextExtent(c, &w, &h);
             if (c_int < FWC_SIZE)
                 s_fontWidthCache.m_widths[c_int] = w;
         }
@@ -751,13 +793,13 @@ void wxImplDC::GetMultiLineTextExtent(const wxString& text,
 void wxImplDC::DoDrawCheckMark(wxCoord x1, wxCoord y1,
                                wxCoord width, wxCoord height)
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     wxCoord x2 = x1 + width,
             y2 = y1 + height;
 
     // the pen width is calibrated to give 3 for width == height == 10
-    wxDCPenChanger pen(m_owner, wxPen(GetTextForeground(), (width + height + 1)/7));
+    wxDCPenChanger pen( *m_owner, wxPen(GetTextForeground(), (width + height + 1)/7));
 
     // we're drawing a scaled version of wx/generic/tick.xpm here
     wxCoord x3 = x1 + (4*width) / 10,   // x of the tick bottom
@@ -801,6 +843,7 @@ wxImplDC::DoStretchBlit(wxCoord xdest, wxCoord ydest,
     return rc;
 }
 
+#if 0
 void wxImplDC::DrawLines(const wxList *list, wxCoord xoffset, wxCoord yoffset)
 {
     int n = list->GetCount();
@@ -838,6 +881,7 @@ void wxImplDC::DrawPolygon(const wxList *list,
 
     delete [] points;
 }
+#endif
 
 void
 wxImplDC::DoDrawPolyPolygon(int n,
@@ -885,7 +929,7 @@ wxImplDC::DoDrawPolyPolygon(int n,
 #if wxUSE_SPLINES
 
 // TODO: this API needs fixing (wxPointList, why (!const) "wxList *"?)
-void wxImplDC::DrawSpline(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord x3, wxCoord y3)
+void wxImplDC::DoDrawSpline(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord x3, wxCoord y3)
 {
     wxList point_list;
 
@@ -901,7 +945,7 @@ void wxImplDC::DrawSpline(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoor
     point3->x = x3; point3->y = y3;
     point_list.Append((wxObject*)point3);
 
-    DrawSpline(&point_list);
+    DoDrawSpline(&point_list);
 
     for( wxList::compatibility_iterator node = point_list.GetFirst(); node; node = node->GetNext() )
     {
@@ -910,7 +954,7 @@ void wxImplDC::DrawSpline(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoor
     }
 }
 
-void wxImplDC::DrawSpline(int n, wxPoint points[])
+void wxImplDC::DoDrawSpline(int n, wxPoint points[])
 {
     wxList list;
     for (int i =0; i < n; i++)
@@ -918,7 +962,7 @@ void wxImplDC::DrawSpline(int n, wxPoint points[])
         list.Append((wxObject*)&points[i]);
     }
 
-    DrawSpline(&list);
+    DoDrawSpline(&list);
 }
 
 // ----------------------------------- spline code ----------------------------------------
@@ -931,7 +975,7 @@ int wx_spline_pop(double *x1, double *y1, double *x2, double *y2, double *x3,
 void wx_spline_push(double x1, double y1, double x2, double y2, double x3, double y3,
           double x4, double y4);
 static bool wx_spline_add_point(double x, double y);
-static void wx_spline_draw_point_array(wxDCBase *dc);
+static void wx_spline_draw_point_array(wxDC *dc);
 
 wxList wx_spline_point_list;
 
@@ -1025,7 +1069,7 @@ static bool wx_spline_add_point(double x, double y)
 
 static void wx_spline_draw_point_array(wxDC *dc)
 {
-  dc->DrawLines(&wx_spline_point_list, 0, 0 );
+//  dc->DrawLines(&wx_spline_point_list, 0, 0 );  wxList
   wxList::compatibility_iterator node = wx_spline_point_list.GetFirst();
   while (node)
   {
@@ -1038,7 +1082,7 @@ static void wx_spline_draw_point_array(wxDC *dc)
 
 void wxImplDC::DoDrawSpline( wxList *points )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     wxPoint *p;
     double           cx1, cy1, cx2, cy2, cx3, cy3, cx4, cy4;
@@ -1099,162 +1143,6 @@ void wxImplDC::DoDrawSpline( wxList *points )
 #endif // wxUSE_SPLINES
 
 
-void wxImplDC::DrawLabel(const wxString& text,
-                         const wxBitmap& bitmap,
-                         const wxRect& rect,
-                         int alignment,
-                         int indexAccel,
-                         wxRect *rectBounding)
-{
-    // find the text position
-    wxCoord widthText, heightText, heightLine;
-    GetMultiLineTextExtent(text, &widthText, &heightText, &heightLine);
-
-    wxCoord width, height;
-    if ( bitmap.Ok() )
-    {
-        width = widthText + bitmap.GetWidth();
-        height = bitmap.GetHeight();
-    }
-    else // no bitmap
-    {
-        width = widthText;
-        height = heightText;
-    }
-
-    wxCoord x, y;
-    if ( alignment & wxALIGN_RIGHT )
-    {
-        x = rect.GetRight() - width;
-    }
-    else if ( alignment & wxALIGN_CENTRE_HORIZONTAL )
-    {
-        x = (rect.GetLeft() + rect.GetRight() + 1 - width) / 2;
-    }
-    else // alignment & wxALIGN_LEFT
-    {
-        x = rect.GetLeft();
-    }
-
-    if ( alignment & wxALIGN_BOTTOM )
-    {
-        y = rect.GetBottom() - height;
-    }
-    else if ( alignment & wxALIGN_CENTRE_VERTICAL )
-    {
-        y = (rect.GetTop() + rect.GetBottom() + 1 - height) / 2;
-    }
-    else // alignment & wxALIGN_TOP
-    {
-        y = rect.GetTop();
-    }
-
-    // draw the bitmap first
-    wxCoord x0 = x,
-            y0 = y,
-            width0 = width;
-    if ( bitmap.Ok() )
-    {
-        DoDrawBitmap(bitmap, x, y, true /* use mask */);
-
-        wxCoord offset = bitmap.GetWidth() + 4;
-        x += offset;
-        width -= offset;
-
-        y += (height - heightText) / 2;
-    }
-
-    // we will draw the underscore under the accel char later
-    wxCoord startUnderscore = 0,
-            endUnderscore = 0,
-            yUnderscore = 0;
-
-    // split the string into lines and draw each of them separately
-    wxString curLine;
-    for ( wxString::const_iterator pc = text.begin(); ; ++pc )
-    {
-        if ( *pc == _T('\n') || pc == text.end() )
-        {
-            int xRealStart = x; // init it here to avoid compielr warnings
-
-            if ( !curLine.empty() )
-            {
-                // NB: can't test for !(alignment & wxALIGN_LEFT) because
-                //     wxALIGN_LEFT is 0
-                if ( alignment & (wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL) )
-                {
-                    wxCoord widthLine;
-                    m_owner->GetTextExtent(curLine, &widthLine, NULL);
-
-                    if ( alignment & wxALIGN_RIGHT )
-                    {
-                        xRealStart += width - widthLine;
-                    }
-                    else // if ( alignment & wxALIGN_CENTRE_HORIZONTAL )
-                    {
-                        xRealStart += (width - widthLine) / 2;
-                    }
-                }
-                //else: left aligned, nothing to do
-
-                DoDrawText(curLine, xRealStart, y);
-            }
-
-            y += heightLine;
-
-            // do we have underscore in this line? we can check yUnderscore
-            // because it is set below to just y + heightLine if we do
-            if ( y == yUnderscore )
-            {
-                // adjust the horz positions to account for the shift
-                startUnderscore += xRealStart;
-                endUnderscore += xRealStart;
-            }
-
-            if ( pc == text.end() )
-                break;
-
-            curLine.clear();
-        }
-        else // not end of line
-        {
-            if ( pc - text.begin() == indexAccel )
-            {
-                // remeber to draw underscore here
-                GetTextExtent(curLine, &startUnderscore, NULL);
-                curLine += *pc;
-                GetTextExtent(curLine, &endUnderscore, NULL);
-
-                yUnderscore = y + heightLine;
-            }
-            else
-            {
-                curLine += *pc;
-            }
-        }
-    }
-
-    // draw the underscore if found
-    if ( startUnderscore != endUnderscore )
-    {
-        // it should be of the same colour as text
-        SetPen(wxPen(GetTextForeground(), 0, wxSOLID));
-
-        yUnderscore--;
-
-        DoDrawLine(startUnderscore, yUnderscore, endUnderscore, yUnderscore);
-    }
-
-    // return bounding rect if requested
-    if ( rectBounding )
-    {
-        *rectBounding = wxRect(x, y - heightText, widthText, heightText);
-    }
-
-    CalcBoundingBox(x0, y0);
-    CalcBoundingBox(x0 + width0, y0 + height);
-}
-
 
 void wxImplDC::DoGradientFillLinear(const wxRect& rect,
                                     const wxColour& initialColour,
@@ -1404,7 +1292,7 @@ void wxImplDC::DoGradientFillConcentric(const wxRect& rect,
 
             //set the pixel
             m_pen.SetColour(wxColour(nR,nG,nB));
-            DoDrawPoint(wxPoint(x + rect.GetLeft(), y + rect.GetTop()));
+            DoDrawPoint(x + rect.GetLeft(), y + rect.GetTop());
         }
     }
     //return old pen color
@@ -1417,6 +1305,162 @@ void wxImplDC::DoGradientFillConcentric(const wxRect& rect,
 
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxObject)
 
+void wxDC::DrawLabel(const wxString& text,
+                         const wxBitmap& bitmap,
+                         const wxRect& rect,
+                         int alignment,
+                         int indexAccel,
+                         wxRect *rectBounding)
+{
+    // find the text position
+    wxCoord widthText, heightText, heightLine;
+    GetMultiLineTextExtent(text, &widthText, &heightText, &heightLine);
+
+    wxCoord width, height;
+    if ( bitmap.Ok() )
+    {
+        width = widthText + bitmap.GetWidth();
+        height = bitmap.GetHeight();
+    }
+    else // no bitmap
+    {
+        width = widthText;
+        height = heightText;
+    }
+
+    wxCoord x, y;
+    if ( alignment & wxALIGN_RIGHT )
+    {
+        x = rect.GetRight() - width;
+    }
+    else if ( alignment & wxALIGN_CENTRE_HORIZONTAL )
+    {
+        x = (rect.GetLeft() + rect.GetRight() + 1 - width) / 2;
+    }
+    else // alignment & wxALIGN_LEFT
+    {
+        x = rect.GetLeft();
+    }
+
+    if ( alignment & wxALIGN_BOTTOM )
+    {
+        y = rect.GetBottom() - height;
+    }
+    else if ( alignment & wxALIGN_CENTRE_VERTICAL )
+    {
+        y = (rect.GetTop() + rect.GetBottom() + 1 - height) / 2;
+    }
+    else // alignment & wxALIGN_TOP
+    {
+        y = rect.GetTop();
+    }
+
+    // draw the bitmap first
+    wxCoord x0 = x,
+            y0 = y,
+            width0 = width;
+    if ( bitmap.Ok() )
+    {
+        DrawBitmap(bitmap, x, y, true /* use mask */);
+
+        wxCoord offset = bitmap.GetWidth() + 4;
+        x += offset;
+        width -= offset;
+
+        y += (height - heightText) / 2;
+    }
+
+    // we will draw the underscore under the accel char later
+    wxCoord startUnderscore = 0,
+            endUnderscore = 0,
+            yUnderscore = 0;
+
+    // split the string into lines and draw each of them separately
+    wxString curLine;
+    for ( wxString::const_iterator pc = text.begin(); ; ++pc )
+    {
+        if ( *pc == _T('\n') || pc == text.end() )
+        {
+            int xRealStart = x; // init it here to avoid compielr warnings
+
+            if ( !curLine.empty() )
+            {
+                // NB: can't test for !(alignment & wxALIGN_LEFT) because
+                //     wxALIGN_LEFT is 0
+                if ( alignment & (wxALIGN_RIGHT | wxALIGN_CENTRE_HORIZONTAL) )
+                {
+                    wxCoord widthLine;
+                    GetTextExtent(curLine, &widthLine, NULL);
+
+                    if ( alignment & wxALIGN_RIGHT )
+                    {
+                        xRealStart += width - widthLine;
+                    }
+                    else // if ( alignment & wxALIGN_CENTRE_HORIZONTAL )
+                    {
+                        xRealStart += (width - widthLine) / 2;
+                    }
+                }
+                //else: left aligned, nothing to do
+
+                DrawText(curLine, xRealStart, y);
+            }
+
+            y += heightLine;
+
+            // do we have underscore in this line? we can check yUnderscore
+            // because it is set below to just y + heightLine if we do
+            if ( y == yUnderscore )
+            {
+                // adjust the horz positions to account for the shift
+                startUnderscore += xRealStart;
+                endUnderscore += xRealStart;
+            }
+
+            if ( pc == text.end() )
+                break;
+
+            curLine.clear();
+        }
+        else // not end of line
+        {
+            if ( pc - text.begin() == indexAccel )
+            {
+                // remeber to draw underscore here
+                GetTextExtent(curLine, &startUnderscore, NULL);
+                curLine += *pc;
+                GetTextExtent(curLine, &endUnderscore, NULL);
+
+                yUnderscore = y + heightLine;
+            }
+            else
+            {
+                curLine += *pc;
+            }
+        }
+    }
+
+    // draw the underscore if found
+    if ( startUnderscore != endUnderscore )
+    {
+        // it should be of the same colour as text
+        SetPen(wxPen(GetTextForeground(), 0, wxSOLID));
+
+        yUnderscore--;
+
+        DrawLine(startUnderscore, yUnderscore, endUnderscore, yUnderscore);
+    }
+
+    // return bounding rect if requested
+    if ( rectBounding )
+    {
+        *rectBounding = wxRect(x, y - heightText, widthText, heightText);
+    }
+
+    CalcBoundingBox(x0, y0);
+    CalcBoundingBox(x0 + width0, y0 + height);
+}
+
 #if WXWIN_COMPATIBILITY_2_8
     // for compatibility with the old code when wxCoord was long everywhere
 void wxDC::GetTextExtent(const wxString& string,
index d25a45d77f85d1eea61e179661999dc17ccc9205..acef13cc7712d639ab8b5b62c225c399e3bff7b1 100644 (file)
@@ -147,7 +147,7 @@ bool wxOverlayImpl::IsOk()
 void wxOverlayImpl::Init( wxWindowDC* dc, int x , int y , int width , int height )
 {
 #if defined(__WXGTK__)
-    m_window = dc->m_owner;
+    m_window = dc->m_owningWindow;
 #else
     #if defined (__WXMSW__) 
     m_window = dc->GetWindow();
index 9b2bcee17f75d91edff90cde35294e5bae4c1561..fc3b0012821247a6a286fee7618e7b1590474849 100644 (file)
 //-----------------------------------------------------------------------------
 
 #if wxUSE_NEW_DC
-IMPLEMENT_ABSTRACT_CLASS(wxGTKImplDC, wxDC)
+IMPLEMENT_ABSTRACT_CLASS(wxGTKImplDC, wxImplDC)
 #else
 IMPLEMENT_ABSTRACT_CLASS(wxGTKImplDC, wxDCBase)
 #endif
 
-wxGTKImplDC::wxGTKImplDC()
+#if wxUSE_NEW_DC
+wxGTKImplDC::wxGTKImplDC( wxDC *owner ) 
+   : wxImplDC( owner )
+#else
+wxDC::wxDC()
+#endif
 {
     m_ok = FALSE;
 
@@ -32,6 +37,10 @@ wxGTKImplDC::wxGTKImplDC()
     m_brush = *wxWHITE_BRUSH;
 }
 
+wxGTKImplDC::~wxGTKImplDC()
+{
+}
+
 void wxGTKImplDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
 {
     m_clipping = TRUE;
@@ -49,7 +58,7 @@ void wxGTKImplDC::DoGetSizeMM( int* width, int* height ) const
 {
     int w = 0;
     int h = 0;
-    GetSize( &w, &h );
+    GetOwner()->GetSize( &w, &h );
     if (width) *width = int( double(w) / (m_userScaleX*m_mm_to_pix_x) );
     if (height) *height = int( double(h) / (m_userScaleY*m_mm_to_pix_y) );
 }
index f192e6e05caefabd729f48f35e666ad8025b6f53..feb56a2e036d6e42cdeccc30da2fb1bdfef98888 100644 (file)
@@ -253,27 +253,36 @@ static void wxFreePoolGC( GdkGC *gc )
 //-----------------------------------------------------------------------------
 
 #if wxUSE_NEW_DC
-IMPLEMENT_DYNAMIC_CLASS(wxGTKWindowImplDC, wxGTKImplDC)
+IMPLEMENT_ABSTRACT_CLASS(wxGTKWindowImplDC, wxGTKImplDC)
 #else
-IMPLEMENT_DYNAMIC_CLASS(wxWindowDC, wxDC)
+IMPLEMENT_ABSTRACT_CLASS(wxWindowDC, wxDC)
 #endif
 
-wxGTKWindowImplDC::wxGTKWindowImplDC()
+#if wxUSE_NEW_DC
+wxGTKWindowImplDC::wxGTKWindowImplDC( wxDC *owner ) :
+   wxGTKImplDC( owner )
+#else
+wxWindowDC::wxWindowDC()
+#endif
 {
     m_penGC = (GdkGC *) NULL;
     m_brushGC = (GdkGC *) NULL;
     m_textGC = (GdkGC *) NULL;
     m_bgGC = (GdkGC *) NULL;
     m_cmap = (GdkColormap *) NULL;
-    m_isMemDC = false;
     m_isScreenDC = false;
-    m_owner = (wxWindow *)NULL;
+    m_owningWindow = (wxWindow *)NULL;
     m_context = (PangoContext *)NULL;
     m_layout = (PangoLayout *)NULL;
     m_fontdesc = (PangoFontDescription *)NULL;
 }
 
-wxGTKWindowImplDC::wxGTKWindowImplDC( wxWindow *window )
+#if wxUSE_NEW_DC
+wxGTKWindowImplDC::wxGTKWindowImplDC( wxDC *owner, wxWindow *window ) :
+   wxGTKImplDC( owner )
+#else
+wxWindowDC::wxWindowDC( wxWindow *window )
+#endif
 {
     wxASSERT_MSG( window, wxT("DC needs a window") );
 
@@ -282,8 +291,7 @@ wxGTKWindowImplDC::wxGTKWindowImplDC( wxWindow *window )
     m_textGC = (GdkGC *) NULL;
     m_bgGC = (GdkGC *) NULL;
     m_cmap = (GdkColormap *) NULL;
-    m_owner = (wxWindow *)NULL;
-    m_isMemDC = false;
+    m_owningWindow = (wxWindow *)NULL;
     m_isScreenDC = false;
     m_font = window->GetFont();
 
@@ -327,15 +335,16 @@ wxGTKWindowImplDC::wxGTKWindowImplDC( wxWindow *window )
        is white whereas a window might assume gray to be the
        standard (as e.g. wxStatusBar) */
 
-    m_owner = window;
+    m_owningWindow = window;
 
-    if (m_owner && m_owner->m_wxwindow && (m_owner->GetLayoutDirection() == wxLayout_RightToLeft))
+    if (m_owningWindow && m_owningWindow->m_wxwindow && 
+        (m_owningWindow->GetLayoutDirection() == wxLayout_RightToLeft))
     {
         // reverse sense
         m_signX = -1;
 
         // origin in the upper right corner
-        m_deviceOriginX = m_owner->GetClientSize().x;
+        m_deviceOriginX = m_owningWindow->GetClientSize().x;
     }
 }
 
@@ -349,33 +358,43 @@ wxGTKWindowImplDC::~wxGTKWindowImplDC()
         pango_font_description_free( m_fontdesc );
 }
 
-void wxGTKWindowImplDC::SetUpDC()
+void wxGTKWindowImplDC::SetUpDC( bool isMemDC )
 {
     m_ok = true;
 
     wxASSERT_MSG( !m_penGC, wxT("GCs already created") );
 
-    if (m_isScreenDC)
-    {
-        m_penGC = wxGetPoolGC( m_window, wxPEN_SCREEN );
-        m_brushGC = wxGetPoolGC( m_window, wxBRUSH_SCREEN );
-        m_textGC = wxGetPoolGC( m_window, wxTEXT_SCREEN );
-        m_bgGC = wxGetPoolGC( m_window, wxBG_SCREEN );
-    }
-    else
-    if (m_isMemDC && (((wxMemoryDC*)this)->m_selected.GetDepth() == 1))
+    bool done = false;
+
+    if (isMemDC)
     {
-        m_penGC = wxGetPoolGC( m_window, wxPEN_MONO );
-        m_brushGC = wxGetPoolGC( m_window, wxBRUSH_MONO );
-        m_textGC = wxGetPoolGC( m_window, wxTEXT_MONO );
-        m_bgGC = wxGetPoolGC( m_window, wxBG_MONO );
+        wxGTKMemoryImplDC *mem_dc = (wxGTKMemoryImplDC*) this;
+        if (mem_dc->GetSelectedBitmap().GetDepth() == 1)
+        {
+            m_penGC = wxGetPoolGC( m_window, wxPEN_MONO );
+            m_brushGC = wxGetPoolGC( m_window, wxBRUSH_MONO );
+            m_textGC = wxGetPoolGC( m_window, wxTEXT_MONO );
+            m_bgGC = wxGetPoolGC( m_window, wxBG_MONO );
+            done = true;
+        }
     }
-    else
-    {
-        m_penGC = wxGetPoolGC( m_window, wxPEN_COLOUR );
-        m_brushGC = wxGetPoolGC( m_window, wxBRUSH_COLOUR );
-        m_textGC = wxGetPoolGC( m_window, wxTEXT_COLOUR );
-        m_bgGC = wxGetPoolGC( m_window, wxBG_COLOUR );
+
+    if (!done)
+    {    
+        if (m_isScreenDC)
+        {
+            m_penGC = wxGetPoolGC( m_window, wxPEN_SCREEN );
+            m_brushGC = wxGetPoolGC( m_window, wxBRUSH_SCREEN );
+            m_textGC = wxGetPoolGC( m_window, wxTEXT_SCREEN );
+            m_bgGC = wxGetPoolGC( m_window, wxBG_SCREEN );
+        }
+        else
+        {
+            m_penGC = wxGetPoolGC( m_window, wxPEN_COLOUR );
+            m_brushGC = wxGetPoolGC( m_window, wxBRUSH_COLOUR );
+            m_textGC = wxGetPoolGC( m_window, wxTEXT_COLOUR );
+            m_bgGC = wxGetPoolGC( m_window, wxBG_COLOUR );
+        }
     }
 
     /* background colour */
@@ -443,9 +462,9 @@ void wxGTKWindowImplDC::SetUpDC()
 
 void wxGTKWindowImplDC::DoGetSize( int* width, int* height ) const
 {
-    wxCHECK_RET( m_owner, _T("GetSize() doesn't work without window") );
+    wxCHECK_RET( m_owningWindow, _T("GetSize() doesn't work without window") );
 
-    m_owner->GetSize(width, height);
+    m_owningWindow->GetSize(width, height);
 }
 
 bool wxGTKWindowImplDC::DoFloodFill(wxCoord x, wxCoord y,
@@ -455,7 +474,7 @@ bool wxGTKWindowImplDC::DoFloodFill(wxCoord x, wxCoord y,
     extern bool wxDoFloodFill(wxDC *dc, wxCoord x, wxCoord y,
                               const wxColour & col, int style);
 
-    return wxDoFloodFill(this, x, y, col, style);
+    return wxDoFloodFill( GetOwner(), x, y, col, style);
 #else
     return false;
 #endif
@@ -482,7 +501,7 @@ bool wxGTKWindowImplDC::DoGetPixel( wxCoord x1, wxCoord y1, wxColour *col ) cons
 
 void wxGTKWindowImplDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2 )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
@@ -496,13 +515,13 @@ void wxGTKWindowImplDC::DoDrawLine( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord
 
 void wxGTKWindowImplDC::DoCrossHair( wxCoord x, wxCoord y )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (m_pen.GetStyle() != wxTRANSPARENT)
     {
         int w = 0;
         int h = 0;
-        GetSize( &w, &h );
+        GetOwner()->GetSize( &w, &h );
         wxCoord xx = XLOG2DEV(x);
         wxCoord yy = YLOG2DEV(y);
         if (m_window)
@@ -516,7 +535,7 @@ void wxGTKWindowImplDC::DoCrossHair( wxCoord x, wxCoord y )
 void wxGTKWindowImplDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2,
                             wxCoord xc, wxCoord yc )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     wxCoord xx1 = XLOG2DEV(x1);
     wxCoord yy1 = YLOG2DEV(y1);
@@ -610,7 +629,7 @@ void wxGTKWindowImplDC::DoDrawArc( wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y
 
 void wxGTKWindowImplDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord width, wxCoord height, double sa, double ea )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     wxCoord xx = XLOG2DEV(x);
     wxCoord yy = YLOG2DEV(y);
@@ -672,7 +691,7 @@ void wxGTKWindowImplDC::DoDrawEllipticArc( wxCoord x, wxCoord y, wxCoord width,
 
 void wxGTKWindowImplDC::DoDrawPoint( wxCoord x, wxCoord y )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if ((m_pen.GetStyle() != wxTRANSPARENT) && m_window)
         gdk_draw_point( m_window, m_penGC, XLOG2DEV(x), YLOG2DEV(y) );
@@ -682,7 +701,7 @@ void wxGTKWindowImplDC::DoDrawPoint( wxCoord x, wxCoord y )
 
 void wxGTKWindowImplDC::DoDrawLines( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (m_pen.GetStyle() == wxTRANSPARENT) return;
     if (n <= 0) return;
@@ -716,7 +735,7 @@ void wxGTKWindowImplDC::DoDrawLines( int n, wxPoint points[], wxCoord xoffset, w
 
 void wxGTKWindowImplDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, int WXUNUSED(fillStyle) )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (n <= 0) return;
 
@@ -802,7 +821,7 @@ void wxGTKWindowImplDC::DoDrawPolygon( int n, wxPoint points[], wxCoord xoffset,
 
 void wxGTKWindowImplDC::DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     wxCoord xx = XLOG2DEV(x);
     wxCoord yy = YLOG2DEV(y);
@@ -893,7 +912,7 @@ void wxGTKWindowImplDC::DoDrawRectangle( wxCoord x, wxCoord y, wxCoord width, wx
 
 void wxGTKWindowImplDC::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord width, wxCoord height, double radius )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (radius < 0.0) radius = - radius * ((width < height) ? width : height);
 
@@ -911,7 +930,7 @@ void wxGTKWindowImplDC::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord wi
     // X drawing errors with small radii
     if (rr == 0)
     {
-        DrawRectangle( x, y, width, height );
+        DoDrawRectangle( x, y, width, height );
         return;
     }
 
@@ -1016,7 +1035,7 @@ void wxGTKWindowImplDC::DoDrawRoundedRectangle( wxCoord x, wxCoord y, wxCoord wi
 
 void wxGTKWindowImplDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     wxCoord xx = XLOG2DEV(x);
     wxCoord yy = YLOG2DEV(y);
@@ -1083,9 +1102,9 @@ void wxGTKWindowImplDC::DoDrawBitmap( const wxBitmap &bitmap,
                                wxCoord x, wxCoord y,
                                bool useMask )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
-    wxCHECK_RET( bitmap.Ok(), wxT("invalid bitmap") );
+    wxCHECK_RET( bitmap.IsOk(), wxT("invalid bitmap") );
 
     bool is_mono = bitmap.GetDepth() == 1;
 
@@ -1096,7 +1115,7 @@ void wxGTKWindowImplDC::DoDrawBitmap( const wxBitmap &bitmap,
     int w = bitmap.GetWidth();
     int h = bitmap.GetHeight();
 
-    if (m_owner && m_owner->GetLayoutDirection() == wxLayout_RightToLeft)
+    if (m_owningWindow && m_owningWindow->GetLayoutDirection() == wxLayout_RightToLeft)
         xx -= w;
 
     CalcBoundingBox( x, y );
@@ -1218,7 +1237,7 @@ bool wxGTKWindowImplDC::DoBlit( wxCoord xdest, wxCoord ydest,
                          bool useMask,
                          wxCoord xsrcMask, wxCoord ysrcMask )
 {
-    wxCHECK_MSG( Ok(), false, wxT("invalid window dc") );
+    wxCHECK_MSG( IsOk(), false, wxT("invalid window dc") );
 
     wxCHECK_MSG( source, false, wxT("invalid source dc") );
 
@@ -1246,7 +1265,7 @@ bool wxGTKWindowImplDC::DoBlit( wxCoord xdest, wxCoord ydest,
         ysrcMask = ysrc;
     }
 
-    if (selected.Ok())
+    if (selected.IsOk())
     {
         is_mono = (selected.GetDepth() == 1);
 
@@ -1421,7 +1440,7 @@ bool wxGTKWindowImplDC::DoBlit( wxCoord xdest, wxCoord ydest,
     }
     else // use_bitmap_method
     {
-        if (selected.Ok() && ((width != ww) || (height != hh)))
+        if (selected.IsOk() && ((width != ww) || (height != hh)))
         {
             // get clip coords
             wxRegion tmp( xx,yy,ww,hh );
@@ -1439,8 +1458,15 @@ bool wxGTKWindowImplDC::DoBlit( wxCoord xdest, wxCoord ydest,
         else
         {
             // No scaling and not a memory dc with a mask either
-
+#if wxUSE_NEW_DC
+            GdkWindow* window = NULL;
+            wxImplDC *impl = source->GetImpl();
+            wxGTKWindowImplDC *gtk_impl = wxDynamicCast(impl, wxGTKWindowImplDC);
+            if (gtk_impl)
+                window = gtk_impl->GetGDKWindow();
+#else            
             GdkWindow* window = source->GetGDKWindow();
+#endif
             if ( !window )
                 return false;
 
@@ -1461,7 +1487,7 @@ bool wxGTKWindowImplDC::DoBlit( wxCoord xdest, wxCoord ydest,
 
 void wxGTKWindowImplDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (!m_window) return;
 
@@ -1476,7 +1502,7 @@ void wxGTKWindowImplDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
 
     gdk_pango_context_set_colormap( m_context, m_cmap );
 
-    bool underlined = m_font.Ok() && m_font.GetUnderlined();
+    bool underlined = m_font.IsOk() && m_font.GetUnderlined();
 
     const wxCharBuffer data = wxGTK_CONV( text );
     if ( !data )
@@ -1574,7 +1600,7 @@ void wxGTKWindowImplDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
          }
 
          // Draw layout.
-         if (m_owner && m_owner->GetLayoutDirection() == wxLayout_RightToLeft)
+         if (m_owningWindow && m_owningWindow->GetLayoutDirection() == wxLayout_RightToLeft)
              gdk_draw_layout( m_window, m_textGC, x-w, y, m_layout );
          else
              gdk_draw_layout( m_window, m_textGC, x, y, m_layout );
@@ -1596,7 +1622,7 @@ void wxGTKWindowImplDC::DoDrawText( const wxString &text, wxCoord x, wxCoord y )
         }
 
         // Draw layout.
-        if (m_owner && m_owner->GetLayoutDirection() == wxLayout_RightToLeft)
+        if (m_owningWindow && m_owningWindow->GetLayoutDirection() == wxLayout_RightToLeft)
             gdk_draw_layout( m_window, m_textGC, x-w, y, m_layout );
         else
             gdk_draw_layout( m_window, m_textGC, x, y, m_layout );
@@ -1631,11 +1657,11 @@ void wxGTKWindowImplDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCo
     if (!m_window || text.empty())
         return;
 
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if ( wxIsNullDouble(angle) )
     {
-        DrawText(text, x, y);
+        DoDrawText(text, x, y);
         return;
     }
 
@@ -1643,7 +1669,7 @@ void wxGTKWindowImplDC::DoDrawRotatedText( const wxString &text, wxCoord x, wxCo
     wxCoord h;
 
     // TODO: implement later without GdkFont for GTK 2.0
-    GetTextExtent(text, &w, &h, NULL,NULL, &m_font);
+    DoGetTextExtent(text, &w, &h, NULL,NULL, &m_font);
 
     // draw the string normally
     wxBitmap src(w, h);
@@ -1747,11 +1773,11 @@ void wxGTKWindowImplDC::DoGetTextExtent(const wxString &string,
         return;
 
     // ensure that theFont is always non-NULL
-    if ( !theFont || !theFont->Ok() )
+    if ( !theFont || !theFont->IsOk() )
         theFont = wx_const_cast(wxFont *, &m_font);
 
     // and use it if it's valid
-    if ( theFont->Ok() )
+    if ( theFont->IsOk() )
     {
         pango_layout_set_font_description
         (
@@ -1857,47 +1883,20 @@ wxCoord wxGTKWindowImplDC::GetCharHeight() const
 
 void wxGTKWindowImplDC::Clear()
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     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
-       the window's background colour anymore. it is too
-       much pain to keep the DC's and the window's back-
-       ground colour in synch. */
-
-    if (m_owner)
-    {
-        m_owner->Clear();
-        return;
-    }
-
-    if (m_isMemDC)
-    {
-        int width,height;
-        GetSize( &width, &height );
-        gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
-        return;
-    }
-#else // 1
     int width,height;
-    GetSize( &width, &height );
+    DoGetSize( &width, &height );
     gdk_draw_rectangle( m_window, m_bgGC, TRUE, 0, 0, width, height );
-#endif // 0/1
 }
 
 void wxGTKWindowImplDC::SetFont( const wxFont &font )
 {
     m_font = font;
 
-    if (m_font.Ok())
+    if (m_font.IsOk())
     {
         if (m_fontdesc)
             pango_font_description_free( m_fontdesc );
@@ -1905,11 +1904,11 @@ void wxGTKWindowImplDC::SetFont( const wxFont &font )
         m_fontdesc = pango_font_description_copy( m_font.GetNativeFontInfo()->description );
 
 
-        if (m_owner)
+        if (m_owningWindow)
         {
             PangoContext *oldContext = m_context;
 
-            m_context = m_owner->GtkGetPangoDefaultContext();
+            m_context = m_owningWindow->GtkGetPangoDefaultContext();
 
             // If we switch back/forth between different contexts
             // we also have to create a new layout. I think so,
@@ -1929,13 +1928,13 @@ void wxGTKWindowImplDC::SetFont( const wxFont &font )
 
 void wxGTKWindowImplDC::SetPen( const wxPen &pen )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (m_pen == pen) return;
 
     m_pen = pen;
 
-    if (!m_pen.Ok()) return;
+    if (!m_pen.IsOk()) return;
 
     if (!m_window) return;
 
@@ -2079,13 +2078,13 @@ void wxGTKWindowImplDC::SetPen( const wxPen &pen )
 
 void wxGTKWindowImplDC::SetBrush( const wxBrush &brush )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (m_brush == brush) return;
 
     m_brush = brush;
 
-    if (!m_brush.Ok()) return;
+    if (!m_brush.IsOk()) return;
 
     if (!m_window) return;
 
@@ -2094,7 +2093,7 @@ void wxGTKWindowImplDC::SetBrush( const wxBrush &brush )
 
     gdk_gc_set_fill( m_brushGC, GDK_SOLID );
 
-    if ((m_brush.GetStyle() == wxSTIPPLE) && (m_brush.GetStipple()->Ok()))
+    if ((m_brush.GetStyle() == wxSTIPPLE) && (m_brush.GetStipple()->IsOk()))
     {
         if (m_brush.GetStipple()->GetDepth() != 1)
         {
@@ -2127,13 +2126,13 @@ void wxGTKWindowImplDC::SetBackground( const wxBrush &brush )
    /* CMB 21/7/98: Added SetBackground. Sets background brush
     * for Clear() and bg colour for shapes filled with cross-hatch brush */
 
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (m_backgroundBrush == brush) return;
 
     m_backgroundBrush = brush;
 
-    if (!m_backgroundBrush.Ok()) return;
+    if (!m_backgroundBrush.IsOk()) return;
 
     if (!m_window) return;
 
@@ -2145,7 +2144,7 @@ void wxGTKWindowImplDC::SetBackground( const wxBrush &brush )
 
     gdk_gc_set_fill( m_bgGC, GDK_SOLID );
 
-    if ((m_backgroundBrush.GetStyle() == wxSTIPPLE) && (m_backgroundBrush.GetStipple()->Ok()))
+    if ((m_backgroundBrush.GetStyle() == wxSTIPPLE) && (m_backgroundBrush.GetStipple()->IsOk()))
     {
         if (m_backgroundBrush.GetStipple()->GetDepth() != 1)
         {
@@ -2169,7 +2168,7 @@ void wxGTKWindowImplDC::SetBackground( const wxBrush &brush )
 
 void wxGTKWindowImplDC::SetLogicalFunction( int function )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (m_logicalFunction == function)
         return;
@@ -2217,12 +2216,12 @@ void wxGTKWindowImplDC::SetLogicalFunction( int function )
 
 void wxGTKWindowImplDC::SetTextForeground( const wxColour &col )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     // don't set m_textForegroundColour to an invalid colour as we'd crash
     // later then (we use m_textForegroundColour.GetColor() without checking
     // in a few places)
-    if ( !col.Ok() || (m_textForegroundColour == col) )
+    if ( !col.IsOk() || (m_textForegroundColour == col) )
         return;
 
     m_textForegroundColour = col;
@@ -2236,10 +2235,10 @@ void wxGTKWindowImplDC::SetTextForeground( const wxColour &col )
 
 void wxGTKWindowImplDC::SetTextBackground( const wxColour &col )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     // same as above
-    if ( !col.Ok() || (m_textBackgroundColour == col) )
+    if ( !col.IsOk() || (m_textBackgroundColour == col) )
         return;
 
     m_textBackgroundColour = col;
@@ -2253,7 +2252,7 @@ void wxGTKWindowImplDC::SetTextBackground( const wxColour &col )
 
 void wxGTKWindowImplDC::SetBackgroundMode( int mode )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     m_backgroundMode = mode;
 
@@ -2276,7 +2275,7 @@ void wxGTKWindowImplDC::SetPalette( const wxPalette& WXUNUSED(palette) )
 
 void wxGTKWindowImplDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width, wxCoord height )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (!m_window) return;
 
@@ -2286,7 +2285,8 @@ void wxGTKWindowImplDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width
     rect.width = XLOG2DEVREL(width);
     rect.height = YLOG2DEVREL(height);
 
-    if (m_owner && m_owner->m_wxwindow && (m_owner->GetLayoutDirection() == wxLayout_RightToLeft))
+    if (m_owningWindow && m_owningWindow->m_wxwindow && 
+        (m_owningWindow->GetLayoutDirection() == wxLayout_RightToLeft))
     {
         rect.x -= rect.width;
     }
@@ -2303,7 +2303,11 @@ void wxGTKWindowImplDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width
 
     wxCoord xx, yy, ww, hh;
     m_currentClippingRegion.GetBox( xx, yy, ww, hh );
+#if wxUSE_NEW_DC
+    wxImplDC::DoSetClippingRegion( xx, yy, ww, hh );
+#else
     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() );
@@ -2313,7 +2317,7 @@ void wxGTKWindowImplDC::DoSetClippingRegion( wxCoord x, wxCoord y, wxCoord width
 
 void wxGTKWindowImplDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
     if (region.Empty())
     {
@@ -2335,7 +2339,11 @@ void wxGTKWindowImplDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
 
     wxCoord xx, yy, ww, hh;
     m_currentClippingRegion.GetBox( xx, yy, ww, hh );
+#if wxUSE_NEW_DC
+    wxImplDC::DoSetClippingRegion( xx, yy, ww, hh );
+#else
     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() );
@@ -2345,9 +2353,13 @@ void wxGTKWindowImplDC::DoSetClippingRegionAsRegion( const wxRegion &region  )
 
 void wxGTKWindowImplDC::DestroyClippingRegion()
 {
-    wxCHECK_RET( Ok(), wxT("invalid window dc") );
+    wxCHECK_RET( IsOk(), wxT("invalid window dc") );
 
+#if wxUSE_NEW_DC
+    wxImplDC::DestroyClippingRegion();
+#else
     wxDC::DestroyClippingRegion();
+#endif
 
     m_currentClippingRegion.Clear();
 
@@ -2399,7 +2411,8 @@ void wxGTKWindowImplDC::SetAxisOrientation( bool xLeftRight, bool yBottomUp )
     m_signX = (xLeftRight ?  1 : -1);
     m_signY = (yBottomUp  ? -1 :  1);
 
-    if (m_owner && m_owner->m_wxwindow && (m_owner->GetLayoutDirection() == wxLayout_RightToLeft))
+    if (m_owningWindow && m_owningWindow->m_wxwindow && 
+        (m_owningWindow->GetLayoutDirection() == wxLayout_RightToLeft))
         m_signX = -m_signX;
 
     ComputeScaleAndOrigin();
@@ -2409,10 +2422,14 @@ void wxGTKWindowImplDC::ComputeScaleAndOrigin()
 {
     const wxRealPoint origScale(m_scaleX, m_scaleY);
 
+#if wxUSE_NEW_DC
+    wxImplDC::ComputeScaleAndOrigin();
+#else
     wxDC::ComputeScaleAndOrigin();
+#endif
 
     // if scale has changed call SetPen to recalulate the line width
-    if ( wxRealPoint(m_scaleX, m_scaleY) != origScale && m_pen.Ok() )
+    if ( wxRealPoint(m_scaleX, m_scaleY) != origScale && m_pen.IsOk() )
     {
         // this is a bit artificial, but we need to force wxDC to think the pen
         // has changed
@@ -2434,14 +2451,59 @@ int wxGTKWindowImplDC::GetDepth() const
 }
 
 
+//-----------------------------------------------------------------------------
+// wxClientDC
+//-----------------------------------------------------------------------------
+
+#if wxUSE_NEW_DC
+IMPLEMENT_ABSTRACT_CLASS(wxGTKClientImplDC, wxGTKWindowImplDC)
+#else
+IMPLEMENT_ABSTRACT_CLASS(wxClientDC, wxWindowDC)
+#endif
+
+#if wxUSE_NEW_DC
+wxGTKClientImplDC::wxGTKClientImplDC( wxDC *owner )
+          : wxGTKWindowImplDC( owner )
+{
+}
+
+wxGTKClientImplDC::wxGTKClientImplDC( wxDC *owner, wxWindow *win )
+          : wxGTKWindowImplDC( owner, win )
+#else
+wxClientDC::wxClientDC()
+{
+}
+
+wxClientDC::wxClientDC( wxWindow *win )
+          : wxWindowDC( win )
+#endif          
+          
+{
+    wxCHECK_RET( win, _T("NULL window in wxGTKClientImplDC::wxClientDC") );
+
+#ifdef __WXUNIVERSAL__
+    wxPoint ptOrigin = win->GetClientAreaOrigin();
+    SetDeviceOrigin(ptOrigin.x, ptOrigin.y);
+    wxSize size = win->GetClientSize();
+    SetClippingRegion(wxPoint(0, 0), size);
+#endif // __WXUNIVERSAL__
+}
+
+void wxGTKClientImplDC::DoGetSize(int *width, int *height) const
+{
+    wxCHECK_RET( m_owningWindow, _T("GetSize() doesn't work without window") );
+
+    m_owningWindow->GetClientSize( width, height );
+}
+
 //-----------------------------------------------------------------------------
 // wxPaintDC
 //-----------------------------------------------------------------------------
 
 #if wxUSE_NEW_DC
-IMPLEMENT_DYNAMIC_CLASS(wxGTKPaintImplDC, wxGTKClientImplDC)
+IMPLEMENT_ABSTRACT_CLASS(wxGTKPaintImplDC, wxGTKClientImplDC)
 #else
-IMPLEMENT_DYNAMIC_CLASS(wxPaintDC, wxClientDC)
+IMPLEMENT_ABSTRACT_CLASS(wxPaintDC, wxClientDC)
 #endif
 
 // Limit the paint region to the window size. Sometimes
@@ -2463,8 +2525,23 @@ static void wxLimitRegionToSize(wxRegion& region, const wxSize& sz)
     }
 }
 
-wxGTKPaintImplDC::wxGTKPaintImplDC( wxWindow *win )
-         : wxGTKClientImplDC( win )
+#if wxUSE_NEW_DC
+wxGTKPaintImplDC::wxGTKPaintImplDC( wxDC *owner )
+         : wxGTKClientImplDC( owner )
+{
+}
+
+wxGTKPaintImplDC::wxGTKPaintImplDC( wxDC *owner, wxWindow *win )
+         : wxGTKClientImplDC( owner, win )
+#else
+wxPaintDC::wxPaintDC()
+         : wxClientDC()
+{
+}
+
+wxPaintDC::wxPaintDC( wxWindow *win )
+         : wxClientDC( win )
+#endif
 {
 #if USE_PAINT_REGION
     if (!win->m_clipPaintRegion)
@@ -2491,36 +2568,6 @@ wxGTKPaintImplDC::wxGTKPaintImplDC( wxWindow *win )
 #endif // USE_PAINT_REGION
 }
 
-//-----------------------------------------------------------------------------
-// wxClientDC
-//-----------------------------------------------------------------------------
-
-#if wxUSE_NEW_DC
-IMPLEMENT_DYNAMIC_CLASS(wxGTKClientImplDC, wxGTKWindowImplDC)
-#else
-IMPLEMENT_DYNAMIC_CLASS(wxClientDC, wxWindowDC)
-#endif
-
-wxGTKClientImplDC::wxGTKClientImplDC( wxWindow *win )
-          : wxGTKWindowImplDC( win )
-{
-    wxCHECK_RET( win, _T("NULL window in wxGTKClientImplDC::wxClientDC") );
-
-#ifdef __WXUNIVERSAL__
-    wxPoint ptOrigin = win->GetClientAreaOrigin();
-    SetDeviceOrigin(ptOrigin.x, ptOrigin.y);
-    wxSize size = win->GetClientSize();
-    SetClippingRegion(wxPoint(0, 0), size);
-#endif // __WXUNIVERSAL__
-}
-
-void wxGTKClientImplDC::DoGetSize(int *width, int *height) const
-{
-    wxCHECK_RET( m_owner, _T("GetSize() doesn't work without window") );
-
-    m_owner->GetClientSize( width, height );
-}
-
 // ----------------------------------------------------------------------------
 // wxDCModule
 // ----------------------------------------------------------------------------
index 47c9a673f5c8a7b365793c88f4978276d6ec8d19..2777783ab8ee0a8c70f9d2e3e1641dc333693000 100644 (file)
 // wxMemoryDC
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC,wxWindowDC)
+#if wxUSE_NEW_DC
+IMPLEMENT_ABSTRACT_CLASS(wxGTKMemoryImplDC, wxGTKWindowImplDC)
+#else
+IMPLEMENT_ABSTRACT_CLASS(wxMemoryDC,wxWindowDC)
+#endif
+
+#if wxUSE_NEW_DC
+wxGTKMemoryImplDC::wxGTKMemoryImplDC( wxMemoryDC *owner ) 
+  : wxGTKWindowImplDC( owner )
+{ 
+    Init(); 
+}
 
-void wxMemoryDC::Init()
-{
-    m_ok = false;
+wxGTKMemoryImplDC::wxGTKMemoryImplDC( wxMemoryDC *owner, wxBitmap& bitmap) 
+  : wxGTKWindowImplDC( owner )
+{ 
+    Init(); 
+    owner->SelectObject(bitmap); 
+}
 
-    m_cmap = gtk_widget_get_default_colormap();
+wxGTKMemoryImplDC::wxGTKMemoryImplDC( wxMemoryDC *owner, wxDC *WXUNUSED(dc) )
+  : wxGTKWindowImplDC( owner )
+{
+    Init();
+}
+#else
+wxMemoryDC::wxMemoryDC() 
+{ 
+    Init(); 
+}
 
-    m_context = gdk_pango_context_get();
-    // Note: The Sun customised version of Pango shipping with Solaris 10
-    // crashes if the language is left NULL (see bug 1374114)
-    pango_context_set_language( m_context, gtk_get_default_language() );
-    m_layout = pango_layout_new( m_context );
-    m_fontdesc = pango_font_description_copy( pango_context_get_font_description( m_context ) );
+wxMemoryDC::wxMemoryDC(wxBitmap& bitmap) 
+{ 
+    Init(); 
+    SelectObject(bitmap); 
 }
 
 wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
@@ -40,13 +61,28 @@ wxMemoryDC::wxMemoryDC( wxDC *WXUNUSED(dc) )
 {
     Init();
 }
+#endif
 
-wxMemoryDC::~wxMemoryDC()
+wxGTKMemoryImplDC::~wxGTKMemoryImplDC()
 {
     g_object_unref(m_context);
 }
 
-void wxMemoryDC::DoSelect( const wxBitmap& bitmap )
+void wxGTKMemoryImplDC::Init()
+{
+    m_ok = false;
+
+    m_cmap = gtk_widget_get_default_colormap();
+
+    m_context = gdk_pango_context_get();
+    // Note: The Sun customised version of Pango shipping with Solaris 10
+    // crashes if the language is left NULL (see bug 1374114)
+    pango_context_set_language( m_context, gtk_get_default_language() );
+    m_layout = pango_layout_new( m_context );
+    m_fontdesc = pango_font_description_copy( pango_context_get_font_description( m_context ) );
+}
+
+void wxGTKMemoryImplDC::DoSelect( const wxBitmap& bitmap )
 {
     Destroy();
 
@@ -57,9 +93,7 @@ void wxMemoryDC::DoSelect( const wxBitmap& bitmap )
 
         m_selected.PurgeOtherRepresentations(wxBitmap::Pixmap);
 
-        m_isMemDC = true;
-
-        SetUpDC();
+        SetUpDC( true );
     }
     else
     {
@@ -68,7 +102,7 @@ void wxMemoryDC::DoSelect( const wxBitmap& bitmap )
     }
 }
 
-void wxMemoryDC::SetPen( const wxPen& penOrig )
+void wxGTKMemoryImplDC::SetPen( const wxPen& penOrig )
 {
     wxPen pen( penOrig );
     if ( m_selected.Ok() &&
@@ -78,10 +112,10 @@ void wxMemoryDC::SetPen( const wxPen& penOrig )
         pen.SetColour( pen.GetColour() == *wxWHITE ? *wxBLACK : *wxWHITE );
     }
 
-    wxWindowDC::SetPen( pen );
+    wxGTKWindowImplDC::SetPen( pen );
 }
 
-void wxMemoryDC::SetBrush( const wxBrush& brushOrig )
+void wxGTKMemoryImplDC::SetBrush( const wxBrush& brushOrig )
 {
     wxBrush brush( brushOrig );
     if ( m_selected.Ok() &&
@@ -91,10 +125,10 @@ void wxMemoryDC::SetBrush( const wxBrush& brushOrig )
         brush.SetColour( brush.GetColour() == *wxWHITE ? *wxBLACK : *wxWHITE);
     }
 
-    wxWindowDC::SetBrush( brush );
+    wxGTKWindowImplDC::SetBrush( brush );
 }
 
-void wxMemoryDC::SetBackground( const wxBrush& brushOrig )
+void wxGTKMemoryImplDC::SetBackground( const wxBrush& brushOrig )
 {
     wxBrush brush(brushOrig);
 
@@ -105,34 +139,34 @@ void wxMemoryDC::SetBackground( const wxBrush& brushOrig )
         brush.SetColour( brush.GetColour() == *wxWHITE ? *wxBLACK : *wxWHITE );
     }
 
-    wxWindowDC::SetBackground( brush );
+    wxGTKWindowImplDC::SetBackground( brush );
 }
 
-void wxMemoryDC::SetTextForeground( const wxColour& col )
+void wxGTKMemoryImplDC::SetTextForeground( const wxColour& col )
 {
     if ( m_selected.Ok() && m_selected.GetDepth() == 1 )
     {
-        wxWindowDC::SetTextForeground( col == *wxWHITE ? *wxBLACK : *wxWHITE);
+        wxGTKWindowImplDC::SetTextForeground( col == *wxWHITE ? *wxBLACK : *wxWHITE);
     }
     else
     {
-        wxWindowDC::SetTextForeground( col );
+        wxGTKWindowImplDC::SetTextForeground( col );
     }
 }
 
-void wxMemoryDC::SetTextBackground( const wxColour &col )
+void wxGTKMemoryImplDC::SetTextBackground( const wxColour &col )
 {
     if (m_selected.Ok() && m_selected.GetDepth() == 1)
     {
-        wxWindowDC::SetTextBackground( col == *wxWHITE ? *wxBLACK : *wxWHITE );
+        wxGTKWindowImplDC::SetTextBackground( col == *wxWHITE ? *wxBLACK : *wxWHITE );
     }
     else
     {
-        wxWindowDC::SetTextBackground( col );
+        wxGTKWindowImplDC::SetTextBackground( col );
     }
 }
 
-void wxMemoryDC::DoGetSize( int *width, int *height ) const
+void wxGTKMemoryImplDC::DoGetSize( int *width, int *height ) const
 {
     if (m_selected.Ok())
     {
@@ -145,3 +179,20 @@ void wxMemoryDC::DoGetSize( int *width, int *height ) const
         if (height) (*height) = 0;
     }
 }
+
+wxBitmap wxGTKMemoryImplDC::DoGetAsBitmap(const wxRect *subrect) const
+{
+    wxBitmap bmp = GetSelectedBitmap();
+    return subrect ? bmp.GetSubBitmap(*subrect) : bmp;
+}
+
+const wxBitmap& wxGTKMemoryImplDC::DoGetSelectedBitmap() const
+{
+    return m_selected;
+}
+
+wxBitmap& wxGTKMemoryImplDC::DoGetSelectedBitmap()
+{
+    return m_selected;
+}
+
index 8e00545f96bc17c95d690dbd4e05895e9af073a7..98832256200d0acb9cfbe40a973007f1794ffbb5 100644 (file)
 #include <gdk/gdkx.h>
 #include <gtk/gtk.h>
 
-//-----------------------------------------------------------------------------
-// global data initialization
-//-----------------------------------------------------------------------------
-
-GdkWindow *wxScreenDC::sm_overlayWindow  = (GdkWindow*) NULL;
-int wxScreenDC::sm_overlayWindowX = 0;
-int wxScreenDC::sm_overlayWindowY = 0;
 
 //-----------------------------------------------------------------------------
 // wxScreenDC
 //-----------------------------------------------------------------------------
 
-IMPLEMENT_DYNAMIC_CLASS(wxScreenDC,wxPaintDC)
+#if wxUSE_NEW_DC
+IMPLEMENT_ABSTRACT_CLASS(wxGTKScreenImplDC, wxGTKWindowImplDC)
+#else
+IMPLEMENT_ABSTRACT_CLASS(wxScreenDC,wxWindowDC)
+#endif
+
+#if wxUSE_NEW_DC
+wxGTKScreenImplDC::wxGTKScreenImplDC( wxScreenDC *owner ) 
+  : wxGTKWindowImplDC( owner )
+{ 
+    Init(); 
+}
 
-wxScreenDC::wxScreenDC()
+#else
+wxScreenDC::wxScreenDC() 
+{ 
+    Init(); 
+}
+#endif
+
+void wxGTKScreenImplDC::Init()
 {
     m_ok = false;
     m_cmap = gdk_colormap_get_system();
@@ -57,32 +68,15 @@ wxScreenDC::wxScreenDC()
     gdk_gc_set_subwindow( m_bgGC, GDK_INCLUDE_INFERIORS );
 }
 
-wxScreenDC::~wxScreenDC()
+wxGTKScreenImplDC::~wxGTKScreenImplDC()
 {
     gdk_gc_set_subwindow( m_penGC, GDK_CLIP_BY_CHILDREN );
     gdk_gc_set_subwindow( m_brushGC, GDK_CLIP_BY_CHILDREN );
     gdk_gc_set_subwindow( m_textGC, GDK_CLIP_BY_CHILDREN );
     gdk_gc_set_subwindow( m_bgGC, GDK_CLIP_BY_CHILDREN );
-
-    EndDrawingOnTop();
-}
-
-bool wxScreenDC::StartDrawingOnTop( wxWindow * )
-{
-    return true;
-}
-
-bool wxScreenDC::StartDrawingOnTop( wxRect * )
-{
-    return true;
-}
-
-bool wxScreenDC::EndDrawingOnTop()
-{
-    return true;
 }
 
-void wxScreenDC::DoGetSize(int *width, int *height) const
+void wxGTKScreenImplDC::DoGetSize(int *width, int *height) const
 {
     wxDisplaySize(width, height);
 }
index 6353ca9a7e52bdc032ebff2c2b8b311b4bfc67e9..e162ba9014642673570ce1733cfb4178049e10e5 100644 (file)
@@ -76,8 +76,16 @@ static gboolean gtk_window_own_expose_callback(GtkWidget* widget, GdkEventExpose
     int style = win->GetWindowStyle();
 
     wxClientDC dc(win);
+    
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKClientImplDC *client_impl = wxDynamicCast( impl, wxGTKClientImplDC );
+    // Hack alert
+    client_impl->m_window = pizza->bin_window;
+#else
     // Hack alert
     dc.m_window = pizza->bin_window;
+#endif
 
     if (style & wxRESIZE_BORDER)
     {
index 1eec14354d61deecb977d03052a9ffdab23ab689..0e945d4d1e50399919757c1fbfe4e49ea4f955cb 100644 (file)
@@ -218,8 +218,16 @@ wxRendererGTK::DrawHeaderButton(wxWindow *win,
 {
 
     GtkWidget *button = GetHeaderButtonWidget();
-
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );
 
@@ -249,7 +257,15 @@ wxRendererGTK::DrawTreeItemButton(wxWindow* win,
 {
     GtkWidget *tree = GetTreeWidget();
 
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );
 
@@ -332,7 +348,15 @@ wxRendererGTK::DrawSplitterSash(wxWindow *win,
         return;
     }
 
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );
 
@@ -396,7 +420,15 @@ wxRendererGTK::DrawDropArrow(wxWindow *WXUNUSED(win),
     // work for wxMemoryDC. So that is why we assume wxDC
     // is wxWindowDC (wxClientDC, wxMemoryDC and wxPaintDC
     // are derived from it) and use its m_window.
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );
 
@@ -457,9 +489,16 @@ wxRendererGTK::DrawCheckBox(wxWindow *WXUNUSED(win),
                             int flags )
 {
     GtkWidget *button = GetCheckButtonWidget();
-
-    // for reason why we do this, see DrawDropArrow
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );
 
@@ -497,8 +536,15 @@ wxRendererGTK::DrawPushButton(wxWindow *WXUNUSED(win),
 {
     GtkWidget *button = GetButtonWidget();
 
-    // for reason why we do this, see DrawDropArrow
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );
 
@@ -533,7 +579,15 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win,
                                      const wxRect& rect,
                                      int flags )
 {
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );
 
@@ -582,7 +636,15 @@ wxRendererGTK::DrawItemSelectionRect(wxWindow *win,
 
 void wxRendererGTK::DrawFocusRect(wxWindow* win, wxDC& dc, const wxRect& rect, int flags)
 {
-    GdkWindow* gdk_window = dc.GetGDKWindow();
+    GdkWindow* gdk_window = NULL;
+#if wxUSE_NEW_DC
+    wxImplDC *impl = dc.GetImpl();
+    wxGTKImplDC *gtk_impl = wxDynamicCast( impl, wxGTKImplDC );
+    if (gtk_impl)
+        gdk_window = gtk_impl->GetGDKWindow();
+#else
+    gdk_window = dc.GetGDKWindow();
+#endif
     wxASSERT_MSG( gdk_window,
                   wxT("cannot use wxRendererNative on wxDC of this type") );