From e1a688e45e02b82e0b85001ee5a85d542a9c0acd Mon Sep 17 00:00:00 2001
From: David Webster <Dave.Webster@bhmi.com>
Date: Wed, 11 Apr 2001 18:05:27 +0000
Subject: [PATCH] DC updates and an associated .Def file update

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@9727 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 src/os2/dc.cpp       |  34 +++++++--
 src/os2/dcclient.cpp | 115 ++++++++++++------------------
 src/os2/dcmemory.cpp | 142 ++++++++++++++++---------------------
 src/os2/dcprint.cpp  | 164 ++++++++++++++++++++++++++++---------------
 src/os2/dcscreen.cpp |  10 ++-
 src/os2/wx23.def     |  57 ++++++++-------
 6 files changed, 275 insertions(+), 247 deletions(-)

diff --git a/src/os2/dc.cpp b/src/os2/dc.cpp
index 7b85941824..6644a2f340 100644
--- a/src/os2/dc.cpp
+++ b/src/os2/dc.cpp
@@ -143,16 +143,42 @@ wxDC::wxDC(void)
 
     m_bOwnsDC      = FALSE;
     m_hDC          = 0;
-    m_nDCCount     = 0;
     m_hOldPS       = NULL;
     m_hPS          = NULL;
     m_bIsPaintTime = FALSE; // True at Paint Time
     m_brush.GetColour().Set("WHITE");
-}
+} // end of wxDC::wxDC
 
 wxDC::~wxDC(void)
 {
-}
+    if ( m_hDC != 0 )
+    {
+        SelectOldObjects(m_hDC);
+
+        // if we own the HDC, we delete it, otherwise we just release it
+
+        if (m_bOwnsDC)
+        {
+            if(m_hPS)
+            {
+                ::GpiAssociate(m_hPS, NULLHANDLE);
+                ::GpiDestroyPS(m_hPS);
+            }
+            m_hPS = NULLHANDLE;
+            ::DevCloseDC((HDC)m_hDC);
+        }
+        else
+        {
+            //
+            // Just Dissacociate, not destroy if we don't own the DC
+            //
+            if(m_hPS)
+            {
+                ::GpiAssociate(m_hPS, NULLHANDLE);
+            }
+        }
+    }
+} // end of wxDC::~wxDC
 
 // This will select current objects out of the DC,
 // which is what you have to do before deleting the
@@ -187,7 +213,7 @@ void wxDC::SelectOldObjects(
     m_font            = wxNullFont;
     m_backgroundBrush = wxNullBrush;
     m_vSelectedBitmap = wxNullBitmap;
-}
+} // end of wxDC::SelectOldObjects
 
 // ---------------------------------------------------------------------------
 // clipping
diff --git a/src/os2/dcclient.cpp b/src/os2/dcclient.cpp
index 1875e60cfb..73efcf389a 100644
--- a/src/os2/dcclient.cpp
+++ b/src/os2/dcclient.cpp
@@ -96,21 +96,24 @@ wxWindowDC::wxWindowDC(
 
     m_pCanvas = pTheCanvas;
     m_hDC = (WXHDC) ::WinOpenWindowDC(GetWinHwnd(pTheCanvas) );
-    m_nDCCount++;
+
     //
     // default under PM is that Window and Client DC's are the same
     // so we offer a separate Presentation Space to use for the
     // entire window.  Otherwise, calling BeginPaint will just create
     // chached-micro client presentation space
     //
-     m_hPS = GpiCreatePS( m_hab
-                         ,m_hDC
-                         ,&m_PageSize
-                         ,PU_PELS | GPIF_LONG | GPIA_ASSOC
-                        );
+     m_hPS = ::GpiCreatePS( vHabmain
+                           ,m_hDC
+                           ,&m_PageSize
+                           ,PU_PELS | GPIF_LONG | GPIA_ASSOC
+                          );
     ::GpiAssociate(m_hPS, NULLHANDLE);
     ::GpiAssociate(m_hPS, m_hDC);
+
+    //
     // Set the wxWindows color table
+    //
     if (!::GpiCreateLogColorTable( m_hPS
                                   ,0L
                                   ,LCOLF_CONSECRGB
@@ -130,33 +133,25 @@ wxWindowDC::wxWindowDC(
                              ,0L
                              ,NULL
                             );
-    SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
     ::WinQueryWindowRect( GetWinHwnd(m_pCanvas)
                          ,&m_vRclPaint
                         );
-}
+    InitDC();
+} // end of wxWindowDC::wxWindowDC
 
-wxWindowDC::~wxWindowDC()
+void wxWindowDC::InitDC()
 {
-    if (m_pCanvas && m_hDC)
-    {
-        SelectOldObjects(m_hDC);
+    //
+    // The background mode is only used for text background and is set in
+    // DrawText() to OPAQUE as required, otherwise always TRANSPARENT,
+    //
+    ::GpiSetBackMix(GetHPS(), BM_LEAVEALONE);
 
-        //
-        // In PM one does not explicitly close or release an open WindowDC
-        // They automatically close with the window, unless explicitly detached
-        // but we need to destroy our PS
-        //
-        if(m_hPS)
-        {
-            ::GpiAssociate(m_hPS, NULLHANDLE);
-            ::GpiDestroyPS(m_hPS);
-        }
-        m_hPS = NULLHANDLE;
-        m_hDC = NULLHANDLE;
-    }
-    m_nDCCount--;
-}
+    //
+    // Default bg colour is pne of the window
+    //
+    SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
+} // end of wxWindowDC::InitDC
 
 // ----------------------------------------------------------------------------
 // wxClientDC
@@ -208,54 +203,18 @@ wxClientDC::wxClientDC(
                              ,NULL
                             );
     //
-    // Default mode is BM_LEAVEALONE so we make no call Set the mix
-    //
-    SetBackground(wxBrush( m_pCanvas->GetBackgroundColour()
-                          ,wxSOLID
-                         )
-                 );
-    //
     // Set the DC/PS rectangle
     //
     ::WinQueryWindowRect( GetWinHwnd(m_pCanvas)
                          ,&m_vRclPaint
                         );
+    InitDC();
 } // end of wxClientDC::wxClientDC
 
-wxClientDC::~wxClientDC()
-{
-    if ( m_pCanvas && GetHdc() )
-    {
-        SelectOldObjects(m_hDC);
-
-        //
-        // We don't explicitly release Device contexts in PM and
-        // the cached micro PS is already gone
-        //
-        m_hDC = 0;
-    }
-} // end of wxClientDC::~wxClientDC
-
 // ----------------------------------------------------------------------------
 // wxPaintDC
 // ----------------------------------------------------------------------------
 
-// VZ: initial implementation (by JACS) only remembered the last wxPaintDC
-//     created and tried to reuse - this was supposed to take care of a
-//     situation when a derived class OnPaint() calls base class OnPaint()
-//     because in this case ::BeginPaint() shouldn't be called second time.
-//
-//     I'm not sure how useful this is, however we must remember the HWND
-//     associated with the last HDC as well - otherwise we may (and will!) try
-//     to reuse the HDC for another HWND which is a nice recipe for disaster.
-//
-//     So we store a list of windows for which we already have the DC and not
-//     just one single hDC. This seems to work, but I'm really not sure about
-//     the usefullness of the whole idea - IMHO it's much better to not call
-//     base class OnPaint() at all, or, if we really want to allow it, add a
-//     "wxPaintDC *" parameter to wxPaintEvent which should be used if it's
-//     !NULL instead of creating a new DC.
-
 wxArrayDCInfo wxPaintDC::ms_cache;
 
 wxPaintDC::wxPaintDC()
@@ -269,7 +228,6 @@ wxPaintDC::wxPaintDC(
 )
 {
     wxCHECK_RET(pCanvas, wxT("NULL canvas in wxPaintDC ctor"));
-    RECTL                           vRect;
 
 #ifdef __WXDEBUG__
     if (g_isPainting <= 0)
@@ -301,10 +259,6 @@ wxPaintDC::wxPaintDC(
                              );
         if(hPS)
         {
-            POINTL                          vPoint[2];
-            LONG                            lControl;
-            LONG                            lColor;
-
             m_hOldPS = m_hPS;
             m_hPS = hPS;
             ::GpiCreateLogColorTable( m_hPS
@@ -332,8 +286,8 @@ wxPaintDC::wxPaintDC(
         m_hDC = (WXHDC) -1; // to satisfy those anonizmous efforts
         ms_cache.Add(new wxPaintDCInfo(m_pCanvas, this));
     }
-    SetBackground(wxBrush(m_pCanvas->GetBackgroundColour(), wxSOLID));
-}
+    InitDC();
+} // end of wxPaintDC::wxPaintDC
 
 wxPaintDC::~wxPaintDC()
 {
@@ -380,3 +334,22 @@ wxPaintDCInfo* wxPaintDC::FindInCache(
     return pInfo;
 } // end of wxPaintDC::FindInCache
 
+// find the entry for this DC in the cache (keyed by the window)
+WXHDC wxPaintDC::FindDCInCache(
+  wxWindow*                         pWin
+)
+{
+    wxPaintDCInfo*                  pInfo = NULL;
+    size_t                          nCache = ms_cache.GetCount();
+
+    for (size_t n = 0; n < nCache; n++)
+    {
+        pInfo = &ms_cache[n];
+        if (pInfo->m_hWnd == pWin->GetHWND())
+        {
+            return pInfo->m_hDC;
+        }
+    }
+    return 0;
+} // end of wxPaintDC::FindInCache
+
diff --git a/src/os2/dcmemory.cpp b/src/os2/dcmemory.cpp
index d303b5aa02..e0a572c251 100644
--- a/src/os2/dcmemory.cpp
+++ b/src/os2/dcmemory.cpp
@@ -28,88 +28,46 @@ IMPLEMENT_DYNAMIC_CLASS(wxMemoryDC, wxDC)
 
 wxMemoryDC::wxMemoryDC(void)
 {
-    ERRORID                         vError;
-    wxString                        sError;
-    HDC                             hDC;
-    HPS                             hPS;
-    DEVOPENSTRUC                    vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
-    SIZEL                           vSize = {0, 0};
-
-    //
-    // Create a memory device context
-    //
-    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
-    if (hDC != DEV_ERROR)
-    {
-        hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
-        if (hPS != GPI_ERROR)
-        {
-            m_hPS = hPS;
-            m_hDC = hDC;
-            m_ok = TRUE;
-            m_bOwnsDC = TRUE;
-            SetBrush(*wxWHITE_BRUSH);
-            SetPen(*wxBLACK_PEN);
-            if (!::GpiCreateLogColorTable( m_hPS
-                                          ,0L
-                                          ,LCOLF_CONSECRGB
-                                          ,0L
-                                          ,(LONG)wxTheColourDatabase->m_nSize
-                                          ,(PLONG)wxTheColourDatabase->m_palTable
-                                         ))
-            {
-                vError = ::WinGetLastError(vHabmain);
-                sError = wxPMErrorToStr(vError);
-                wxLogError("Unable to set current color table. Error: %s\n", sError);
-            }
-            //
-            // Set the color table to RGB mode
-            //
-            if (!::GpiCreateLogColorTable( m_hPS
-                                          ,0L
-                                          ,LCOLF_RGB
-                                          ,0L
-                                          ,0L
-                                          ,NULL
-                                         ))
-            {
-                vError = ::WinGetLastError(vHabmain);
-                sError = wxPMErrorToStr(vError);
-                wxLogError("Unable to set current color table. Error: %s\n", sError);
-            }
-        }
-        else
-        {
-            m_hPS = NULLHANDLE;
-            m_hDC = NULLHANDLE;
-            m_ok  = FALSE;
-            m_bOwnsDC = FALSE;
-        }
-    }
-    else
-    {
-        m_hPS = NULLHANDLE;
-        m_hDC = NULLHANDLE;
-        m_ok  = FALSE;
-        m_bOwnsDC = FALSE;
-    }
+    CreateCompatible(NULL);
+    Init();
 } // end of wxMemoryDC::wxMemoryDC
 
 wxMemoryDC::wxMemoryDC(
   wxDC*                             pOldDC
 )
+{
+    pOldDC->BeginDrawing();
+    CreateCompatible(pOldDC);
+    pOldDC->EndDrawing();
+    Init();
+} // end of wxMemoryDC::wxMemoryDC
+
+void wxMemoryDC::Init()
+{
+    if (m_ok)
+    {
+        SetBrush(*wxWHITE_BRUSH);
+        SetPen(*wxBLACK_PEN);
+
+        // the background mode is only used for text background and is set in
+        // DrawText() to OPAQUE as required, otherwise always TRANSPARENT
+        ::GpiSetBackMix( GetHPS(), BM_LEAVEALONE );
+    }
+} // end of wxMemoryDC::Init
+
+bool wxMemoryDC::CreateCompatible(
+  wxDC*                             pDC
+)
 {
     HDC                             hDC;
     HPS                             hPS;
     DEVOPENSTRUC                    vDOP = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
     SIZEL                           vSize = {0, 0};
 
-    pOldDC->BeginDrawing();
-
     //
     // Create a memory device context
     //
-    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, GetHdcOf(*pOldDC));
+    hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDOP, NULLHANDLE);
     if (hDC != DEV_ERROR)
     {
         hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC);
@@ -119,13 +77,26 @@ wxMemoryDC::wxMemoryDC(
             m_hDC = hDC;
             m_ok = TRUE;
             m_bOwnsDC = TRUE;
-            pOldDC->EndDrawing();
-            SetBrush(*wxWHITE_BRUSH);
-            SetPen(*wxBLACK_PEN);
+            //
+            // Set the wxWindows color table
+            //
+            ::GpiCreateLogColorTable( m_hPS
+                                     ,0L
+                                     ,LCOLF_CONSECRGB
+                                     ,0L
+                                     ,(LONG)wxTheColourDatabase->m_nSize
+                                     ,(PLONG)wxTheColourDatabase->m_palTable
+                                    );
+            ::GpiCreateLogColorTable( m_hPS
+                                     ,0L
+                                     ,LCOLF_RGB
+                                     ,0L
+                                     ,0L
+                                     ,NULL
+                                    );
         }
         else
         {
-            pOldDC->EndDrawing();
             m_hPS = NULLHANDLE;
             m_hDC = NULLHANDLE;
             m_ok  = FALSE;
@@ -134,22 +105,19 @@ wxMemoryDC::wxMemoryDC(
     }
     else
     {
-        pOldDC->EndDrawing();
         m_hPS = NULLHANDLE;
         m_hDC = NULLHANDLE;
         m_ok  = FALSE;
         m_bOwnsDC = FALSE;
     }
-} // end of wxMemoryDC::wxMemoryDC
 
-wxMemoryDC::~wxMemoryDC()
-{
-    m_vSelectedBitmap.SetSelectedInto(NULL);
-    if (m_hPS != NULLHANDLE)
-        ::GpiDestroyPS(m_hPS);
-    if (m_hDC != NULLHANDLE)
-        ::DevCloseDC(m_hDC);
-} // end of wxMemoryDC::~wxMemoryDC
+    //
+    // As we created the DC, we must delete it in the dtor
+    //
+    m_bOwnsDC = TRUE;
+    m_ok = m_hDC != 0;
+    return m_ok;
+} // end of wxMemoryDC::CreateCompatible
 
 void wxMemoryDC::SelectObject(
   const wxBitmap&                   rBitmap
@@ -211,4 +179,12 @@ void wxMemoryDC::DoGetSize(
     *pHeight = m_vSelectedBitmap.GetHeight();
 } // end of wxMemoryDC::DoGetSize
 
-
+void wxMemoryDC::DoDrawRectangle(
+  wxCoord                           vX
+, wxCoord                           vY
+, wxCoord                           vWidth
+, wxCoord                           vHeight
+)
+{
+    wxDC::DoDrawRectangle(vX, vY, vWidth, vHeight);
+} // end of wxMemoryDC::DoDrawRectangle
diff --git a/src/os2/dcprint.cpp b/src/os2/dcprint.cpp
index 81c60a30d4..a19603a979 100644
--- a/src/os2/dcprint.cpp
+++ b/src/os2/dcprint.cpp
@@ -33,25 +33,30 @@ IMPLEMENT_CLASS(wxPrinterDC, wxDC)
 
 
 // This form is deprecated
-wxPrinterDC::wxPrinterDC(const wxString& driver_name, const wxString& device_name, const wxString& file, bool interactive, int orientation)
+wxPrinterDC::wxPrinterDC(
+  const wxString&                   rsDriverName
+, const wxString&                   rsDeviceName
+, const wxString&                   rsFile
+, bool                              bInteractive
+, int                               nOrientation
+)
 {
     LONG            lType = 0;
-    HAB             hab = 0;
-    DEVOPENSTRUC    devOpen = { (char*)device_name.c_str()
-                               ,(char*)driver_name.c_str()
-                               ,NULL
-                               ,NULL
-                               ,NULL
-                               ,NULL
-                               ,NULL
-                               ,NULL
-                               ,NULL
-                              };
-
-    m_isInteractive = interactive;
-
-    if (!file.IsNull() && file != wxT(""))
-        m_printData.SetFilename(file);
+    DEVOPENSTRUC    vDevOpen = { (char*)rsDeviceName.c_str()
+                                ,(char*)rsDriverName.c_str()
+                                ,NULL
+                                ,NULL
+                                ,NULL
+                                ,NULL
+                                ,NULL
+                                ,NULL
+                                ,NULL
+                               };
+
+    m_isInteractive = bInteractive;
+
+    if (!rsFile.IsNull() && rsFile != wxT(""))
+        m_printData.SetFilename(rsFile);
 
 /*
     Implement PM's version of this
@@ -88,24 +93,25 @@ wxPrinterDC::wxPrinterDC(const wxString& driver_name, const wxString& device_nam
     else
 #endif
 */
-        if ((!driver_name.IsNull() && driver_name != wxT("")) &&
-            (!device_name.IsNull() && device_name != wxT("")) &&
-            (!file.IsNull() && file != wxT("")))
+        if ((!rsDriverName.IsNull() && rsDriverName != wxT("")) &&
+            (!rsDeviceName.IsNull() && rsDeviceName != wxT("")) &&
+            (!rsFile.IsNull() && rsFile != wxT("")))
         {
-            m_hDC = (WXHDC) ::DevOpenDC( hab
+            m_hDC = (WXHDC) ::DevOpenDC( vHabmain
                                         ,OD_QUEUED
                                         ,"*"
                                         ,5L
-                                        ,(PDEVOPENDATA)&devOpen
+                                        ,(PDEVOPENDATA)&vDevOpen
                                         ,NULLHANDLE
                                        );
             m_ok = m_hDC ? TRUE: FALSE;
         }
         else
         {
-            wxPrintData printData;
-            printData.SetOrientation(orientation);
-            m_hDC = wxGetPrinterDC(printData);
+            wxPrintData             vPrintData;
+
+            vPrintData.SetOrientation(nOrientation);
+            m_hDC = wxGetPrinterDC(vPrintData);
             m_ok = m_hDC ? TRUE: FALSE;
         }
 
@@ -117,46 +123,51 @@ wxPrinterDC::wxPrinterDC(const wxString& driver_name, const wxString& device_nam
         }
         SetBrush(*wxBLACK_BRUSH);
         SetPen(*wxBLACK_PEN);
-}
+} // end of wxPrinterDC::wxPrinterDC
 
-wxPrinterDC::wxPrinterDC(const wxPrintData& printData)
+wxPrinterDC::wxPrinterDC(
+  const wxPrintData&                rPrintData
+)
 {
-    m_printData = printData;
-
+    m_printData = rPrintData;
     m_isInteractive = FALSE;
-
-    m_hDC = wxGetPrinterDC(printData);
+    m_hDC = wxGetPrinterDC(rPrintData);
     m_ok = (m_hDC != 0);
-
     if (m_hDC)
         SetMapMode(wxMM_TEXT);
-
     SetBrush(*wxBLACK_BRUSH);
     SetPen(*wxBLACK_PEN);
-}
+} // end of wxPrinterDC::wxPrinterDC
 
-
-wxPrinterDC::wxPrinterDC(WXHDC theDC)
+wxPrinterDC::wxPrinterDC(
+  WXHDC                             hTheDC
+)
 {
     m_isInteractive = FALSE;
-
-    m_hDC = theDC;
+    m_hDC = hTheDC;
     m_ok = TRUE;
     if (m_hDC)
     {
-        //     int width = GetDeviceCaps(m_hDC, VERTRES);
-        //     int height = GetDeviceCaps(m_hDC, HORZRES);
         SetMapMode(wxMM_TEXT);
     }
     SetBrush(*wxBLACK_BRUSH);
     SetPen(*wxBLACK_PEN);
-}
+} // end of wxPrinterDC::wxPrinterDC
 
-wxPrinterDC::~wxPrinterDC(void)
+void wxPrinterDC::Init()
 {
-}
+    if (m_hDC)
+    {
+        SetMapMode(wxMM_TEXT);
 
-bool wxPrinterDC::StartDoc(const wxString& message)
+        SetBrush(*wxBLACK_BRUSH);
+        SetPen(*wxBLACK_PEN);
+    }
+} // end of wxPrinterDC::Init
+
+bool wxPrinterDC::StartDoc(
+  const wxString&                   rsMessage
+)
 {
 /* TODO:  PM's implementation
    DOCINFO docinfo;
@@ -203,29 +214,32 @@ bool wxPrinterDC::StartDoc(const wxString& message)
     return (ret > 0);
 */
     return(TRUE);
-}
+} // end of wxPrinterDC::StartDoc
 
-void wxPrinterDC::EndDoc(void)
+void wxPrinterDC::EndDoc()
 {
 //    if (m_hDC) ::EndDoc((HDC) m_hDC);
-}
+} // end of wxPrinterDC::EndDoc
 
-void wxPrinterDC::StartPage(void)
+void wxPrinterDC::StartPage()
 {
 //    if (m_hDC)
 //        ::StartPage((HDC) m_hDC);
-}
+} // end of wxPrinterDC::StartPage
 
-void wxPrinterDC::EndPage(void)
+void wxPrinterDC::EndPage()
 {
 //    if (m_hDC)
 //        ::EndPage((HDC) m_hDC);
-}
+} // end of wxPrinterDC::EndPage
 
 // Returns default device and port names
-static bool wxGetDefaultDeviceName(wxString& deviceName, wxString& portName)
+static bool wxGetDefaultDeviceName(
+  wxString&                         rsDeviceName
+, wxString&                         rsPortName
+)
 {
-    deviceName = "";
+    rsDeviceName = "";
 /*
     LPDEVNAMES  lpDevNames;
     LPSTR       lpszDriverName;
@@ -279,10 +293,12 @@ static bool wxGetDefaultDeviceName(wxString& deviceName, wxString& portName)
     return ( deviceName != wxT("") );
 */
     return(TRUE);
-}
+} // end of wxGetDefaultDeviceName
 
 // Gets an HDC for the specified printer configuration
-WXHDC WXDLLEXPORT wxGetPrinterDC(const wxPrintData& printDataConst)
+WXHDC WXDLLEXPORT wxGetPrinterDC(
+  const wxPrintData&                rPrintDataConst
+)
 {
     HDC   hDC = NULLHANDLE;
 /*
@@ -328,6 +344,42 @@ WXHDC WXDLLEXPORT wxGetPrinterDC(const wxPrintData& printDataConst)
         GlobalUnlock(hDevMode);
 */
     return (WXHDC) hDC;
-}
+} // end of wxGetPrinterDC
+
+void wxPrinterDC::DoDrawBitmap(
+  const wxBitmap&                   rBmp
+, wxCoord                           vX
+, wxCoord                           vY
+, bool                              bUseMask
+)
+{
+    wxCHECK_RET( rBmp.Ok(), _T("invalid bitmap in wxPrinterDC::DrawBitmap") );
+
+    int                             nWidth  = rBmp.GetWidth();
+    int                             nHeight = rBmp.GetHeight();
+
+    // TODO:
+
+} // end of wxPrinterDC::DoDrawBitmap
+
+bool wxPrinterDC::DoBlit(
+  wxCoord                           vXdest
+, wxCoord                           vYdest
+, wxCoord                           vWidth
+, wxCoord                           vHeight
+, wxDC*                             pSource
+, wxCoord                           vXsrc
+, wxCoord                           vYsrc
+, int                               nRop
+, bool                              bUseMask
+)
+{
+    bool                            bSuccess = TRUE;
+
+    // TODO:
+
+    return bSuccess;
+} // end of wxPrintDC::DoBlit
+
 
 #endif //wxUSE_PRINTING_ARCHITECTURE
diff --git a/src/os2/dcscreen.cpp b/src/os2/dcscreen.cpp
index 34a7a8c2a7..3b3c6314b8 100644
--- a/src/os2/dcscreen.cpp
+++ b/src/os2/dcscreen.cpp
@@ -35,11 +35,9 @@ IMPLEMENT_DYNAMIC_CLASS(wxScreenDC, wxWindowDC)
 // Create a DC representing the whole screen
 wxScreenDC::wxScreenDC()
 {
-    // TODO
-}
+    m_hDC = ::WinOpenWindowDC(HWND_DESKTOP);
+    m_hPS = ::WinGetScreenPS(HWND_DESKTOP);
+    ::GpiSetBackMix(m_hPS, BM_LEAVEALONE);
+} // end of wxScreenDC::wxScreenDC()
 
-wxScreenDC::~wxScreenDC()
-{
-    // TODO
-}
 
diff --git a/src/os2/wx23.def b/src/os2/wx23.def
index f8d20512be..5f5ea401d6 100644
--- a/src/os2/wx23.def
+++ b/src/os2/wx23.def
@@ -201,10 +201,10 @@ EXPORTS
       __ct__12wxColourDataFRC12wxColourData
       ;wxPrintData::operator=(const wxPrintSetupData&)
       __as__11wxPrintDataFRC16wxPrintSetupData
-      ;wxConstructorForwxPrintDialogData()
-      wxConstructorForwxPrintDialogData__Fv
       ;wxPrintData::~wxPrintData()
       __dt__11wxPrintDataFv
+      ;wxConstructorForwxPrintDialogData()
+      wxConstructorForwxPrintDialogData__Fv
       ;wxPageSetupDialogData::wxPageSetupDialogData()
       __ct__21wxPageSetupDialogDataFv
       ;wxPrintDialogData::wxPrintDialogData()
@@ -6804,16 +6804,12 @@ EXPORTS
       ExtractWildcard__16wxGenericDirCtrlFRC8wxStringiR8wxStringT3
   ;From object file:  ..\generic\dragimgg.cpp
     ;PUBDEFs (Symbols available from object file):
-      ;wxGenericDragImage::Create(const wxBitmap&,const wxCursor&,const wxPoint&)
-      Create__18wxGenericDragImageFRC8wxBitmapRC8wxCursorRC7wxPoint
-      ;wxGenericDragImage::Move(const wxPoint&)
-      Move__18wxGenericDragImageFRC7wxPoint
       ;wxGenericDragImage::BeginDrag(const wxPoint&,wxWindow*,unsigned long,wxRect*)
       BeginDrag__18wxGenericDragImageFRC7wxPointP8wxWindowUlP6wxRect
+      ;wxGenericDragImage::Move(const wxPoint&)
+      Move__18wxGenericDragImageFRC7wxPoint
       ;wxGenericDragImage::~wxGenericDragImage()
       __dt__18wxGenericDragImageFv
-      ;wxGenericDragImage::Create(const wxIcon&,const wxCursor&,const wxPoint&)
-      Create__18wxGenericDragImageFRC6wxIconRC8wxCursorRC7wxPoint
       ;wxGenericDragImage::BeginDrag(const wxPoint&,wxWindow*,wxWindow*)
       BeginDrag__18wxGenericDragImageFRC7wxPointP8wxWindowT2
       ;wxGenericDragImage::Show()
@@ -6823,28 +6819,32 @@ EXPORTS
       ;wxGenericDragImage::Create(const wxTreeCtrl&,wxTreeItemId&)
       Create__18wxGenericDragImageFRC10wxTreeCtrlR12wxTreeItemId
       __vft18wxGenericDragImage8wxObject
+      ;wxGenericDragImage::Create(const wxCursor&)
+      Create__18wxGenericDragImageFRC8wxCursor
       ;wxConstructorForwxGenericDragImage()
       wxConstructorForwxGenericDragImage__Fv
       ;wxGenericDragImage::RedrawImage(const wxPoint&,const wxPoint&,unsigned long,unsigned long)
       RedrawImage__18wxGenericDragImageFRC7wxPointT1UlT3
-      ;wxGenericDragImage::Create(const wxString&,const wxCursor&,const wxPoint&)
-      Create__18wxGenericDragImageFRC8wxStringRC8wxCursorRC7wxPoint
       ;wxGenericDragImage::GetImageRect(const wxPoint&) const
       GetImageRect__18wxGenericDragImageCFRC7wxPoint
       ;wxGenericDragImage::Init()
       Init__18wxGenericDragImageFv
       ;wxGenericDragImage::EndDrag()
       EndDrag__18wxGenericDragImageFv
+      ;wxGenericDragImage::Create(const wxString&,const wxCursor&)
+      Create__18wxGenericDragImageFRC8wxStringRC8wxCursor
+      ;wxGenericDragImage::Create(const wxBitmap&,const wxCursor&)
+      Create__18wxGenericDragImageFRC8wxBitmapRC8wxCursor
       ;wxGenericDragImage::UpdateBackingFromWindow(wxDC&,wxMemoryDC&,const wxRect&,const wxRect&) const
       UpdateBackingFromWindow__18wxGenericDragImageCFR4wxDCR10wxMemoryDCRC6wxRectT3
-      ;wxGenericDragImage::Create(const wxCursor&,const wxPoint&)
-      Create__18wxGenericDragImageFRC8wxCursorRC7wxPoint
-      ;wxGenericDragImage::DoDrawImage(wxDC&,const wxPoint&) const
-      DoDrawImage__18wxGenericDragImageCFR4wxDCRC7wxPoint
       ;wxGenericDragImage::Create(const wxListCtrl&,long)
       Create__18wxGenericDragImageFRC10wxListCtrll
+      ;wxGenericDragImage::DoDrawImage(wxDC&,const wxPoint&) const
+      DoDrawImage__18wxGenericDragImageCFR4wxDCRC7wxPoint
       ;wxGenericDragImage::sm_classwxGenericDragImage
       sm_classwxGenericDragImage__18wxGenericDragImage
+      ;wxGenericDragImage::Create(const wxIcon&,const wxCursor&)
+      Create__18wxGenericDragImageFRC6wxIconRC8wxCursor
   ;From object file:  ..\generic\fontdlgg.cpp
     ;PUBDEFs (Symbols available from object file):
       ;wxGenericFontDialog::OnCloseWindow(wxCloseEvent&)
@@ -11037,6 +11037,8 @@ EXPORTS
     ;PUBDEFs (Symbols available from object file):
       ;wxConstructorForwxPaintDC()
       wxConstructorForwxPaintDC__Fv
+      ;wxWindowDC::InitDC()
+      InitDC__10wxWindowDCFv
       ;wxArrayDCInfo::DoCopy(const wxArrayDCInfo&)
       DoCopy__13wxArrayDCInfoFRC13wxArrayDCInfo
       ;wxArrayDCInfo::Add(const wxPaintDCInfo&)
@@ -11047,7 +11049,8 @@ EXPORTS
       __as__13wxArrayDCInfoFRC13wxArrayDCInfo
       ;wxClientDC::wxClientDC(wxWindow*)
       __ct__10wxClientDCFP8wxWindow
-      __vft10wxWindowDC8wxObject
+      ;wxPaintDC::FindDCInCache(wxWindow*)
+      FindDCInCache__9wxPaintDCFP8wxWindow
       ;wxArrayDCInfo::Insert(const wxPaintDCInfo&,unsigned int)
       Insert__13wxArrayDCInfoFRC13wxPaintDCInfoUi
       ;wxConstructorForwxWindowDC()
@@ -11066,15 +11069,10 @@ EXPORTS
       FindInCache__9wxPaintDCCFPUi
       ;wxArrayDCInfo::DoEmpty()
       DoEmpty__13wxArrayDCInfoFv
-      ;wxWindowDC::~wxWindowDC()
-      __dt__10wxWindowDCFv
-      ;wxClientDC::~wxClientDC()
-      __dt__10wxClientDCFv
       ;wxClientDC::sm_classwxClientDC
       sm_classwxClientDC__10wxClientDC
       ;wxPaintDC::sm_classwxPaintDC
       sm_classwxPaintDC__9wxPaintDC
-      __vft10wxClientDC8wxObject
       __vft9wxPaintDC8wxObject
       ;wxArrayDCInfo::~wxArrayDCInfo()
       __dt__13wxArrayDCInfoFv
@@ -11096,24 +11094,30 @@ EXPORTS
       ;wxMemoryDC::SelectObject(const wxBitmap&)
       SelectObject__10wxMemoryDCFRC8wxBitmap
       __vft10wxMemoryDC8wxObject
+      ;wxMemoryDC::Init()
+      Init__10wxMemoryDCFv
       ;wxMemoryDC::DoGetSize(int*,int*) const
       DoGetSize__10wxMemoryDCCFPiT1
       ;wxMemoryDC::wxMemoryDC(wxDC*)
       __ct__10wxMemoryDCFP4wxDC
+      ;wxMemoryDC::DoDrawRectangle(int,int,int,int)
+      DoDrawRectangle__10wxMemoryDCFiN31
       ;wxMemoryDC::wxMemoryDC()
       __ct__10wxMemoryDCFv
       ;wxMemoryDC::sm_classwxMemoryDC
       sm_classwxMemoryDC__10wxMemoryDC
       ;wxConstructorForwxMemoryDC()
       wxConstructorForwxMemoryDC__Fv
-      ;wxMemoryDC::~wxMemoryDC()
-      __dt__10wxMemoryDCFv
+      ;wxMemoryDC::CreateCompatible(wxDC*)
+      CreateCompatible__10wxMemoryDCFP4wxDC
   ;From object file:  ..\os2\dcprint.cpp
     ;PUBDEFs (Symbols available from object file):
       ;wxPrinterDC::EndDoc()
       EndDoc__11wxPrinterDCFv
       ;wxPrinterDC::EndPage()
       EndPage__11wxPrinterDCFv
+      ;wxPrinterDC::DoBlit(int,int,int,int,wxDC*,int,int,int,unsigned long)
+      DoBlit__11wxPrinterDCFiN31P4wxDCN31Ul
       ;wxGetPrinterDC(const wxPrintData&)
       wxGetPrinterDC__FRC11wxPrintData
       ;wxPrinterDC::sm_classwxPrinterDC
@@ -11127,17 +11131,16 @@ EXPORTS
       StartPage__11wxPrinterDCFv
       ;wxPrinterDC::StartDoc(const wxString&)
       StartDoc__11wxPrinterDCFRC8wxString
+      ;wxPrinterDC::DoDrawBitmap(const wxBitmap&,int,int,unsigned long)
+      DoDrawBitmap__11wxPrinterDCFRC8wxBitmapiT2Ul
       ;wxPrinterDC::wxPrinterDC(const wxPrintData&)
       __ct__11wxPrinterDCFRC11wxPrintData
-      ;wxPrinterDC::~wxPrinterDC()
-      __dt__11wxPrinterDCFv
+      ;wxPrinterDC::Init()
+      Init__11wxPrinterDCFv
   ;From object file:  ..\os2\dcscreen.cpp
     ;PUBDEFs (Symbols available from object file):
-      ;wxScreenDC::~wxScreenDC()
-      __dt__10wxScreenDCFv
       ;wxConstructorForwxScreenDC()
       wxConstructorForwxScreenDC__Fv
-      __vft10wxScreenDC8wxObject
       ;wxScreenDC::sm_classwxScreenDC
       sm_classwxScreenDC__10wxScreenDC
       ;wxScreenDC::wxScreenDC()
-- 
2.50.0

