]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/dc.cpp
rtti api mods added
[wxWidgets.git] / src / os2 / dc.cpp
index daa44afdece941369e9f036f8572adeeac43f1cd..b3532167a849955e8831bec9e636ec81b4d98cfe 100644 (file)
     #include "wx/log.h"
     #include "wx/icon.h"
     #include "wx/msgdlg.h"
     #include "wx/log.h"
     #include "wx/icon.h"
     #include "wx/msgdlg.h"
-    #include "wx/module.h"
+#if wxUSE_STATUSBAR
+    #include "wx/statusbr.h"
+#endif
 #endif
 
 #endif
 
+#include "wx/module.h"
 #include "wx/dcprint.h"
 
 #include <string.h>
 #include "wx/dcprint.h"
 
 #include <string.h>
@@ -659,14 +662,38 @@ void wxDC::DoDrawLine(
 )
 {
     POINTL                          vPoint[2];
 )
 {
     POINTL                          vPoint[2];
+    COLORREF                        vColor = 0x00ffffff;
 
 
-    vY1 = OS2Y(vY1,0);
-    vY2 = OS2Y(vY2,0);
-
+    //
+    // Might be a memory DC with no Paint rect.
+    //
+    if (!(m_vRclPaint.yTop == 0 &&
+          m_vRclPaint.yBottom == 0 &&
+          m_vRclPaint.xRight == 0 &&
+          m_vRclPaint.xLeft == 0))
+    {
+        vY1 = OS2Y(vY1,0);
+        vY2 = OS2Y(vY2,0);
+    }
+    else
+    {
+        if (m_vSelectedBitmap != wxNullBitmap)
+        {
+            m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
+            m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
+            vY1 = OS2Y(vY1,0);
+            vY2 = OS2Y(vY2,0);
+        }
+    }
     vPoint[0].x = vX1;
     vPoint[0].y = vY1;
     vPoint[1].x = vX2;
     vPoint[1].y = vY2;
     vPoint[0].x = vX1;
     vPoint[0].y = vY1;
     vPoint[1].x = vX2;
     vPoint[1].y = vY2;
+    if (m_pen.Ok())
+    {
+        vColor = m_pen.GetColour().GetPixel();
+    }
+    ::GpiSetColor(m_hPS, vColor);
     ::GpiMove(m_hPS, &vPoint[0]);
     ::GpiLine(m_hPS, &vPoint[1]);
     CalcBoundingBox(vX1, vY1);
     ::GpiMove(m_hPS, &vPoint[0]);
     ::GpiLine(m_hPS, &vPoint[1]);
     CalcBoundingBox(vX1, vY1);
@@ -979,13 +1006,22 @@ void wxDC::DoDrawRectangle(
     int                             nIsTRANSPARENT = 0;
 
     //
     int                             nIsTRANSPARENT = 0;
 
     //
-    // Might be a memory DC with no Paint rect
+    // Might be a memory DC with no Paint rect.
     //
     if (!(m_vRclPaint.yTop == 0 &&
           m_vRclPaint.yBottom == 0 &&
           m_vRclPaint.xRight == 0 &&
           m_vRclPaint.xLeft == 0))
         vY = OS2Y(vY,vHeight);
     //
     if (!(m_vRclPaint.yTop == 0 &&
           m_vRclPaint.yBottom == 0 &&
           m_vRclPaint.xRight == 0 &&
           m_vRclPaint.xLeft == 0))
         vY = OS2Y(vY,vHeight);
+    else
+    {
+        if (m_vSelectedBitmap != wxNullBitmap)
+        {
+            m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
+            m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
+            vY = OS2Y(vY,vHeight);
+        }
+    }
 
     wxCoord                         vX2 = vX + vWidth;
     wxCoord                         vY2 = vY + vHeight;
 
     wxCoord                         vX2 = vX + vWidth;
     wxCoord                         vY2 = vY + vHeight;
@@ -1005,7 +1041,7 @@ void wxDC::DoDrawRectangle(
         if(m_brush.GetStyle() == wxTRANSPARENT)
             lControl = DRO_OUTLINE;
 
         if(m_brush.GetStyle() == wxTRANSPARENT)
             lControl = DRO_OUTLINE;
 
-        ::GpiSetColor(m_hPS, lColor);
+        ::GpiSetColor(m_hPS, lBorderColor);
         ::GpiBox( m_hPS       // handle to a presentation space
                  ,lControl   // draw the box outline ? or ?
                  ,&vPoint[1]  // address of the corner
         ::GpiBox( m_hPS       // handle to a presentation space
                  ,lControl   // draw the box outline ? or ?
                  ,&vPoint[1]  // address of the corner
@@ -1055,27 +1091,85 @@ void wxDC::DoDrawRoundedRectangle(
 {
     POINTL                          vPoint[2];
     LONG                            lControl;
 {
     POINTL                          vPoint[2];
     LONG                            lControl;
+    LONG                            lColor;
+    LONG                            lBorderColor;
+    int                             nIsTRANSPARENT = 0;
 
 
-    vY = OS2Y(vY,vHeight);
+    //
+    // Might be a memory DC with no Paint rect.
+    //
+    if (!(m_vRclPaint.yTop == 0 &&
+          m_vRclPaint.yBottom == 0 &&
+          m_vRclPaint.xRight == 0 &&
+          m_vRclPaint.xLeft == 0))
+        vY = OS2Y(vY,vHeight);
+    else
+    {
+        if (m_vSelectedBitmap != wxNullBitmap)
+        {
+            m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
+            m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
+            vY = OS2Y(vY,vHeight);
+        }
+    }
 
     wxCoord                         vX2 = (vX + vWidth);
     wxCoord                         vY2 = (vY + vHeight);
 
     vPoint[0].x = vX;
 
     wxCoord                         vX2 = (vX + vWidth);
     wxCoord                         vY2 = (vY + vHeight);
 
     vPoint[0].x = vX;
-    vPoint[0].y = YLOG2DEV(vY) - vHeight;
-    vPoint[1].x = vX + vWidth;
-    vPoint[1].y = vY;
+    vPoint[0].y = vY;
+    vPoint[1].x = vX + vWidth - 1;
+    vPoint[1].y = vY + vHeight - 1;
     ::GpiMove(m_hPS, &vPoint[0]);
 
     ::GpiMove(m_hPS, &vPoint[0]);
 
+    lColor       = m_brush.GetColour().GetPixel();
+    lBorderColor = m_pen.GetColour().GetPixel();
     lControl = DRO_OUTLINEFILL; //DRO_FILL;
     if (m_brush.GetStyle() == wxTRANSPARENT)
     lControl = DRO_OUTLINEFILL; //DRO_FILL;
     if (m_brush.GetStyle() == wxTRANSPARENT)
+        nIsTRANSPARENT = 1;
+    if(lColor == lBorderColor || nIsTRANSPARENT)
+    {
+        lControl = DRO_OUTLINEFILL; //DRO_FILL;
+        if(m_brush.GetStyle() == wxTRANSPARENT)
+            lControl = DRO_OUTLINE;
+
+        ::GpiSetColor(m_hPS, lColor);
+        ::GpiBox( m_hPS         // handle to a presentation space
+                 ,lControl      // draw the box outline ? or ?
+                 ,&vPoint[1]    // address of the corner
+                 ,(LONG)dRadius // horizontal corner radius
+                 ,(LONG)dRadius // vertical corner radius
+                );
+    }
+    else
+    {
         lControl = DRO_OUTLINE;
         lControl = DRO_OUTLINE;
-    ::GpiBox( m_hPS         // handle to a presentation space
-             ,DRO_OUTLINE   // draw the box outline ? or ?
-             ,&vPoint[1]    // address of the corner
-             ,(LONG)dRadius // horizontal corner radius
-             ,(LONG)dRadius // vertical corner radius
-            );
+        ::GpiSetColor( m_hPS
+                      ,lBorderColor
+                     );
+        ::GpiBox( m_hPS
+                 ,lControl
+                 ,&vPoint[1]
+                 ,(LONG)dRadius
+                 ,(LONG)dRadius
+                );
+        lControl = DRO_FILL;
+        ::GpiSetColor( m_hPS
+                      ,lColor
+                     );
+        vPoint[0].x = vX + 1;
+        vPoint[0].y = vY + 1;
+        vPoint[1].x = vX + vWidth - 2;
+        vPoint[1].y = vY + vHeight - 2;
+        ::GpiMove(m_hPS, &vPoint[0]);
+        ::GpiBox( m_hPS
+                 ,lControl
+                 ,&vPoint[1]
+                 ,(LONG)dRadius
+                 ,(LONG)dRadius
+                );
+    }
+
     CalcBoundingBox(vX, vY);
     CalcBoundingBox(vX2, vY2);
 } // end of wxDC::DoDrawRoundedRectangle
     CalcBoundingBox(vX, vY);
     CalcBoundingBox(vX2, vY2);
 } // end of wxDC::DoDrawRoundedRectangle
@@ -1189,15 +1283,21 @@ void wxDC::DoDrawIcon(
 , wxCoord                           vY
 )
 {
 , wxCoord                           vY
 )
 {
-    vY = OS2Y(vY,rIcon.GetHeight());
-    wxCHECK_RET( rIcon.Ok(), wxT("invalid icon in DrawIcon") );
+    //
+    // Need to copy back into a bitmap.  ::WinDrawPointer uses device coords
+    // and I don't feel like figuring those out for scrollable windows so
+    // just convert to a bitmap then let the DoDrawBitmap routing display it
+    //
+    if (rIcon.IsXpm())
+    {
+        DoDrawBitmap(rIcon.GetXpmSrc(), vX, vY, TRUE);
+    }
+    else
+    {
+        wxBitmap                        vBitmap(rIcon);
 
 
-    ::WinDrawPointer( GetHPS()
-                     ,vX
-                     ,vY
-                     ,(HPOINTER)GetHiconOf(rIcon)
-                     ,DP_NORMAL
-                    );
+        DoDrawBitmap(vBitmap, vX, vY, FALSE);
+    }
     CalcBoundingBox(vX, vY);
     CalcBoundingBox(vX + rIcon.GetWidth(), vY + rIcon.GetHeight());
 } // end of wxDC::DoDrawIcon
     CalcBoundingBox(vX, vY);
     CalcBoundingBox(vX + rIcon.GetWidth(), vY + rIcon.GetHeight());
 } // end of wxDC::DoDrawIcon
@@ -1213,17 +1313,18 @@ void wxDC::DoDrawBitmap(
     {
         HBITMAP                         hBitmap =  (HBITMAP)rBmp.GetHBITMAP();
         HBITMAP                         hBitmapOld;
     {
         HBITMAP                         hBitmap =  (HBITMAP)rBmp.GetHBITMAP();
         HBITMAP                         hBitmapOld;
+        POINTL                          vPoint[4];
 
         vY = OS2Y(vY,rBmp.GetHeight());
 
 
         vY = OS2Y(vY,rBmp.GetHeight());
 
-        //
-        // Flip the picture as OS/2 is upside-down
-        //
-        POINTL                      vPoint[4] = { vX, vY + rBmp.GetHeight()
-                                                 ,vX + rBmp.GetWidth(), vY
-                                                 ,0, 0
-                                                 ,rBmp.GetWidth(), rBmp.GetHeight()
-                                                };
+        vPoint[0].x = vX;
+        vPoint[0].y = vY + rBmp.GetHeight();
+        vPoint[1].x = vX + rBmp.GetWidth();
+        vPoint[1].y = vY;
+        vPoint[2].x = 0;
+        vPoint[2].y = 0;
+        vPoint[3].x = rBmp.GetWidth();
+        vPoint[3].y = rBmp.GetHeight();
         if (bUseMask)
         {
             wxMask*                     pMask = rBmp.GetMask();
         if (bUseMask)
         {
             wxMask*                     pMask = rBmp.GetMask();
@@ -1242,6 +1343,7 @@ void wxDC::DoDrawBitmap(
                 // 5) Blit this to the screen PS
                 //
                 HBITMAP                 hMask = (HBITMAP)pMask->GetMaskBitmap();
                 // 5) Blit this to the screen PS
                 //
                 HBITMAP                 hMask = (HBITMAP)pMask->GetMaskBitmap();
+                HBITMAP                 hOldMask   = NULLHANDLE;
                 HBITMAP                 hOldBitmap = NULLHANDLE;
                 HBITMAP                 hNewBitmap = NULLHANDLE;
                 unsigned char*          pucBits;     // buffer that will contain the bitmap data
                 HBITMAP                 hOldBitmap = NULLHANDLE;
                 HBITMAP                 hNewBitmap = NULLHANDLE;
                 unsigned char*          pucBits;     // buffer that will contain the bitmap data
@@ -1268,10 +1370,6 @@ void wxDC::DoDrawBitmap(
 
                 memset(&vHeader, '\0', 16);
                 vHeader.cbFix           = 16;
 
                 memset(&vHeader, '\0', 16);
                 vHeader.cbFix           = 16;
-                vHeader.cx              = (ULONG)rBmp.GetWidth();
-                vHeader.cy              = (ULONG)rBmp.GetHeight();
-                vHeader.cPlanes         = 1L;
-                vHeader.cBitCount       = 24;
 
                 memset(&vInfo, '\0', 16);
                 vInfo.cbFix           = 16;
 
                 memset(&vInfo, '\0', 16);
                 vInfo.cbFix           = 16;
@@ -1295,11 +1393,11 @@ void wxDC::DoDrawBitmap(
                 //
                 // Need to get a background color for mask blitting
                 //
                 //
                 // Need to get a background color for mask blitting
                 //
-                if (IsKindOf(CLASSINFO(wxPaintDC)))
+                if (IsKindOf(CLASSINFO(wxWindowDC)))
                 {
                 {
-                    wxPaintDC*              pPaintDC = wxDynamicCast(this, wxPaintDC);
+                    wxWindowDC*             pWindowDC = wxDynamicCast(this, wxWindowDC);
 
 
-                    lColor = pPaintDC->m_pCanvas->GetBackgroundColour().GetPixel();
+                    lColor = pWindowDC->m_pCanvas->GetBackgroundColour().GetPixel();
                 }
                 else if (GetBrush() != wxNullBrush)
                     lColor = GetBrush().GetColour().GetPixel();
                 }
                 else if (GetBrush() != wxNullBrush)
                     lColor = GetBrush().GetColour().GetPixel();
@@ -1328,6 +1426,8 @@ void wxDC::DoDrawBitmap(
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
+                ::GpiQueryBitmapInfoHeader(hBitmap, &vHeader);
+                vInfo.cBitCount = 24;
                 if ((lScans = ::GpiQueryBitmapBits( hPS
                                                    ,0L
                                                    ,(LONG)rBmp.GetHeight()
                 if ((lScans = ::GpiQueryBitmapBits( hPS
                                                    ,0L
                                                    ,(LONG)rBmp.GetHeight()
@@ -1338,11 +1438,13 @@ void wxDC::DoDrawBitmap(
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
-                if ((hOldBitmap = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR)
+                if ((hOldMask = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR)
                 {
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
                 {
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
+                ::GpiQueryBitmapInfoHeader(hMask, &vHeader);
+                vInfo.cBitCount = 24;
                 if ((lScans = ::GpiQueryBitmapBits( hPS
                                                    ,0L
                                                    ,(LONG)rBmp.GetHeight()
                 if ((lScans = ::GpiQueryBitmapBits( hPS
                                                    ,0L
                                                    ,(LONG)rBmp.GetHeight()
@@ -1353,6 +1455,11 @@ void wxDC::DoDrawBitmap(
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
                     vError = ::WinGetLastError(vHabmain);
                     sError = wxPMErrorToStr(vError);
                 }
+                if (( hMask = ::GpiSetBitmap(hPS, hOldMask)) == HBM_ERROR)
+                {
+                    vError = ::WinGetLastError(vHabmain);
+                    sError = wxPMErrorToStr(vError);
+                }
 
                 //
                 // Now set the bytes(bits) according to the mask values
 
                 //
                 // Now set the bytes(bits) according to the mask values
@@ -1361,33 +1468,45 @@ void wxDC::DoDrawBitmap(
                 pucData     = pucBits;
                 pucDataMask = pucBitsMask;
 
                 pucData     = pucBits;
                 pucDataMask = pucBitsMask;
 
+                //
+                // 16 bit kludge really only kinda works.  The mask gets applied
+                // where needed but the original bitmap bits are dorked sometimes
+                //
+                bool                    bpp16 = (wxDisplayDepth() == 16);
+
                 for (i = 0; i < rBmp.GetHeight(); i++)
                 {
                     for (j = 0; j < rBmp.GetWidth(); j++)
                     {
                         // Byte 1
                 for (i = 0; i < rBmp.GetHeight(); i++)
                 {
                     for (j = 0; j < rBmp.GetWidth(); j++)
                     {
                         // Byte 1
-                        if (*pucDataMask == 0x00) // leave bitmap byte alone
+                        if (bpp16 && *pucDataMask == 0xF8) // 16 bit display gobblygook
+                            pucData++;
+                        else if (*pucDataMask == 0xFF) // leave bitmap byte alone
                             pucData++;
                         else
                         {
                             pucData++;
                         else
                         {
-                            *pucData = (unsigned char)lColor;
+                            *pucData = ((unsigned char)(lColor >> 16));
                             pucData++;
                         }
                         // Byte 2
                             pucData++;
                         }
                         // Byte 2
-                        if (*(pucDataMask + 1) == 0x00) // leave bitmap byte alone
+                        if (bpp16 && *(pucDataMask + 1) == 0xFC) // 16 bit display gobblygook
+                            pucData++;
+                        else if (*(pucDataMask + 1) == 0xFF) // leave bitmap byte alone
                             pucData++;
                         else
                         {
                             pucData++;
                         else
                         {
-                            *pucData = (unsigned char)lColor >> 8;
+                            *pucData = ((unsigned char)(lColor >> 8));
                             pucData++;
                         }
 
                         // Byte 3
                             pucData++;
                         }
 
                         // Byte 3
-                        if (*(pucDataMask + 2) == 0x00) // leave bitmap byte alone
+                        if (bpp16 && *(pucDataMask + 2) == 0xF8) // 16 bit display gobblygook
+                            pucData++;
+                        else if (*(pucDataMask + 2) == 0xFF) // leave bitmap byte alone
                             pucData++;
                         else
                         {
                             pucData++;
                         else
                         {
-                            *pucData = (unsigned char)lColor >> 16;
+                            *pucData = ((unsigned char)lColor);
                             pucData++;
                         }
                         pucDataMask += 3;
                             pucData++;
                         }
                         pucDataMask += 3;
@@ -1398,10 +1517,13 @@ void wxDC::DoDrawBitmap(
                         pucDataMask++;
                     }
                 }
                         pucDataMask++;
                     }
                 }
-
                 //
                 // Create a new bitmap
                 //
                 //
                 // Create a new bitmap
                 //
+                vHeader.cx              = (ULONG)rBmp.GetWidth();
+                vHeader.cy              = (ULONG)rBmp.GetHeight();
+                vHeader.cPlanes         = 1L;
+                vHeader.cBitCount       = 24;
                 if ((hNewBitmap = ::GpiCreateBitmap( hPS
                                                     ,&vHeader
                                                     ,CBM_INIT
                 if ((hNewBitmap = ::GpiCreateBitmap( hPS
                                                     ,&vHeader
                                                     ,CBM_INIT
@@ -1434,14 +1556,15 @@ void wxDC::DoDrawBitmap(
                 free(pucBits);
                 free(pucBitsMask);
                 ::GpiSetBitmap(hPS, NULLHANDLE);
                 free(pucBits);
                 free(pucBitsMask);
                 ::GpiSetBitmap(hPS, NULLHANDLE);
+                ::GpiDeleteBitmap(hNewBitmap);
                 ::GpiDestroyPS(hPS);
                 ::DevCloseDC(hDC);
             }
         }
         else
         {
                 ::GpiDestroyPS(hPS);
                 ::DevCloseDC(hDC);
             }
         }
         else
         {
-            LONG                        lOldTextground = ::GpiQueryColor((HPS)GetHPS());
-            LONG                        lOldBackground = ::GpiQueryBackColor((HPS)GetHPS());
+            LONG                        lOldForeGround = ::GpiQueryColor((HPS)GetHPS());
+            LONG                        lOldBackGround = ::GpiQueryBackColor((HPS)GetHPS());
 
             if (m_textForegroundColour.Ok())
             {
 
             if (m_textForegroundColour.Ok())
             {
@@ -1455,6 +1578,123 @@ void wxDC::DoDrawBitmap(
                                   ,m_textBackgroundColour.GetPixel()
                                  );
             }
                                   ,m_textBackgroundColour.GetPixel()
                                  );
             }
+            //
+            // Need to alter bits in a mono bitmap to match the new
+            // background-foreground if it is different.
+            //
+            if (rBmp.IsMono() &&
+               ((m_textForegroundColour.GetPixel() != lOldForeGround) ||
+                (m_textBackgroundColour.GetPixel() != lOldBackGround)))
+            {
+                DEVOPENSTRUC        vDop  = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L};
+                SIZEL               vSize = {0, 0};
+                HDC                 hDC   = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE);
+                HPS                 hPS   = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC);
+
+                int                 nBytesPerLine = rBmp.GetWidth() * 3;
+                int                 i, j;
+                LONG                lForeGround = m_textForegroundColour.GetPixel();
+                LONG                lBackGround = m_textBackgroundColour.GetPixel();
+                LONG                lScans;
+                HBITMAP             hOldBitmap = NULLHANDLE;
+                BITMAPINFO2         vInfo;
+                ERRORID             vError;
+                wxString            sError;
+
+
+                memset(&vInfo, '\0', 16);
+                vInfo.cbFix           = 16;
+                vInfo.cx              = (ULONG)rBmp.GetWidth();
+                vInfo.cy              = (ULONG)rBmp.GetHeight();
+                vInfo.cPlanes         = 1;
+                vInfo.cBitCount       = 24;
+
+                unsigned char*          pucBits;     // buffer that will contain the bitmap data
+                unsigned char*          pucData;     // pointer to use to traverse bitmap data
+
+                pucBits = new unsigned char[nBytesPerLine * rBmp.GetHeight()];
+                memset(pucBits, '\0', (nBytesPerLine * rBmp.GetHeight()));
+
+                if ((hOldBitmap = ::GpiSetBitmap(hPS, hBitmap)) == HBM_ERROR)
+                {
+                    vError = ::WinGetLastError(vHabmain);
+                    sError = wxPMErrorToStr(vError);
+                    return;
+                }
+                if ((lScans = ::GpiQueryBitmapBits( hPS
+                                                   ,0L
+                                                   ,(LONG)rBmp.GetHeight()
+                                                   ,(PBYTE)pucBits
+                                                   ,&vInfo
+                                                  )) == GPI_ALTERROR)
+                {
+                    vError = ::WinGetLastError(vHabmain);
+                    sError = wxPMErrorToStr(vError);
+                    return;
+                }
+                unsigned char           cOldRedFore   = (unsigned char)(lOldForeGround >> 16);
+                unsigned char           cOldGreenFore = (unsigned char)(lOldForeGround >> 8);
+                unsigned char           cOldBlueFore  = (unsigned char)lOldForeGround;
+
+                unsigned char           cOldRedBack   = (unsigned char)(lOldBackGround >> 16);
+                unsigned char           cOldGreenBack = (unsigned char)(lOldBackGround >> 8);
+                unsigned char           cOldBlueBack  = (unsigned char)lOldBackGround;
+
+                unsigned char           cRedFore   = (unsigned char)(lForeGround >> 16);
+                unsigned char           cGreenFore = (unsigned char)(lForeGround >> 8);
+                unsigned char           cBlueFore  = (unsigned char)lForeGround;
+
+                unsigned char           cRedBack   = (unsigned char)(lBackGround >> 16);
+                unsigned char           cGreenBack = (unsigned char)(lBackGround >> 8);
+                unsigned char           cBlueBack  = (unsigned char)lBackGround;
+
+                pucData = pucBits;
+                for (i = 0; i < rBmp.GetHeight(); i++)
+                {
+                    for (j = 0; j < rBmp.GetWidth(); j++)
+                    {
+                        unsigned char    cBmpRed   = *pucData;
+                        unsigned char    cBmpGreen = *(pucData + 1);
+                        unsigned char    cBmpBlue  = *(pucData + 2);
+
+                        if ((cBmpRed == cOldRedFore) &&
+                            (cBmpGreen == cOldGreenFore) &&
+                            (cBmpBlue == cOldBlueFore))
+                        {
+                            *pucData = cBlueFore;
+                            pucData++;
+                            *pucData = cGreenFore;
+                            pucData++;
+                            *pucData = cRedFore;
+                            pucData++;
+                        }
+                        else
+                        {
+                            *pucData = cBlueBack;
+                            pucData++;
+                            *pucData = cGreenBack;
+                            pucData++;
+                            *pucData = cRedBack;
+                            pucData++;
+                        }
+                    }
+                }
+                if ((lScans = ::GpiSetBitmapBits( hPS
+                                                 ,0L
+                                                 ,(LONG)rBmp.GetHeight()
+                                                 ,(PBYTE)pucBits
+                                                 ,&vInfo
+                                                )) == GPI_ALTERROR)
+                {
+                    vError = ::WinGetLastError(vHabmain);
+                    sError = wxPMErrorToStr(vError);
+                    return;
+                }
+                delete [] pucBits;
+                ::GpiSetBitmap(hPS, NULLHANDLE);
+                ::GpiDestroyPS(hPS);
+                ::DevCloseDC(hDC);
+            }
             ::GpiWCBitBlt( (HPS)GetHPS()
                           ,hBitmap
                           ,4
             ::GpiWCBitBlt( (HPS)GetHPS()
                           ,hBitmap
                           ,4
@@ -1463,8 +1703,8 @@ void wxDC::DoDrawBitmap(
                           ,BBO_IGNORE
                          );
             ::GpiSetBitmap((HPS)GetHPS(), hBitmapOld);
                           ,BBO_IGNORE
                          );
             ::GpiSetBitmap((HPS)GetHPS(), hBitmapOld);
-            ::GpiSetColor((HPS)GetHPS(), lOldTextground);
-            ::GpiSetBackColor((HPS)GetHPS(), lOldBackground);
+            ::GpiSetColor((HPS)GetHPS(), lOldForeGround);
+            ::GpiSetBackColor((HPS)GetHPS(), lOldBackGround);
         }
     }
 } // end of wxDC::DoDrawBitmap
         }
     }
 } // end of wxDC::DoDrawBitmap
@@ -1528,13 +1768,41 @@ void wxDC::DrawAnyText(
                   ,&vTextY
                  );
     vPtlStart.x = vX;
                   ,&vTextY
                  );
     vPtlStart.x = vX;
-    vPtlStart.y = OS2Y(vY,vTextY);
+    if (!(m_vRclPaint.yTop == 0 &&
+          m_vRclPaint.yBottom == 0 &&
+          m_vRclPaint.xRight == 0 &&
+          m_vRclPaint.xLeft == 0))
+    {
+        //
+        // Position Text a little differently in the Statusbar from other panels
+        //
+        if (m_pCanvas && m_pCanvas->IsKindOf(CLASSINFO(wxStatusBar)))
+            vPtlStart.y = OS2Y(vY,vTextY);
+        else
+            vPtlStart.y = OS2Y(vY,vTextY/1.5); // Full extent is a bit much
+    }
+    else
+    {
+        if (m_vSelectedBitmap != wxNullBitmap)
+        {
+            m_vRclPaint.yTop = m_vSelectedBitmap.GetHeight();
+            m_vRclPaint.xRight = m_vSelectedBitmap.GetWidth();
+            if (m_pCanvas && m_pCanvas->IsKindOf(CLASSINFO(wxStatusBar)))
+                vPtlStart.y = OS2Y(vY,vTextY);
+            else
+                vPtlStart.y = OS2Y(vY,vTextY/1.5);
+        }
+        else
+            vPtlStart.y = vY;
+    }
+
+    PCH                             pzStr = (PCH)rsText.c_str();
 
 
-    lHits = ::GpiCharStringAt( m_hPS
-                              ,&vPtlStart
-                              ,rsText.length()
-                              ,(PCH)rsText.c_str()
-                             );
+    ::GpiMove(m_hPS, &vPtlStart);
+    lHits = ::GpiCharString( m_hPS
+                            ,rsText.length()
+                            ,pzStr
+                           );
     if (lHits != GPI_OK)
     {
         wxLogLastError(wxT("TextOut"));
     if (lHits != GPI_OK)
     {
         wxLogLastError(wxT("TextOut"));
@@ -1757,6 +2025,7 @@ void wxDC::SetPen(
             if (!m_hOldPen)
                 m_hOldPen = m_pen.GetPS();
         }
             if (!m_hOldPen)
                 m_hOldPen = m_pen.GetPS();
         }
+        ::GpiSetColor(m_hPS, m_pen.GetColour().GetPixel());
     }
 }
 
     }
 }
 
@@ -2618,18 +2887,5 @@ void wxDC::SetLogicalScale(
     m_logicalScaleY = dY;
 }; // end of wxDC::SetLogicalScale
 
     m_logicalScaleY = dY;
 }; // end of wxDC::SetLogicalScale
 
-#if WXWIN_COMPATIBILITY
-void wxDC::DoGetTextExtent(const wxString& string, float *x, float *y,
-                         float *descent, float *externalLeading,
-                         wxFont *theFont, bool use16bit) const
-{
-    wxCoord x1, y1, descent1, externalLeading1;
-    GetTextExtent(string, & x1, & y1, & descent1, & externalLeading1, theFont, use16bit);
-    *x = x1; *y = y1;
-    if (descent)
-        *descent = descent1;
-    if (externalLeading)
-        *externalLeading = externalLeading1;
-}
-#endif
+