]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/utils.cpp
use wxFileName::MakeAbsolute istead of Normalize
[wxWidgets.git] / src / os2 / utils.cpp
index 816ed527eb14a369c9e7b8aec3a627a702415352..c60c92419b3ac863df5395c47e245b64ca04bc2b 100644 (file)
@@ -198,6 +198,13 @@ bool wxShell(
     return (rc != 0);
 }
 
+// Shutdown or reboot the PC
+bool wxShutdown(wxShutdownFlags wFlags)
+{
+    // TODO
+    return FALSE;
+}
+
 // Get free memory in bytes, or -1 if cannot determine amount (e.g. on UNIX)
 long wxGetFreeMemory()
 {
@@ -291,6 +298,8 @@ void wxFlushEvents()
 //  wxYield();
 }
 
+#if WXWIN_COMPATIBILITY_2_2
+
 // Output a debug mess., in a system dependent fashion.
 void wxDebugMsg(
   const wxChar*                     zFmt ...
@@ -343,6 +352,8 @@ void wxFatalError(
     DosExit(EXIT_PROCESS, ulRc);
 }
 
+#endif // WXWIN_COMPATIBILITY_2_2
+
 // Emit a beeeeeep
 void wxBell()
 {
@@ -699,7 +710,7 @@ wxChar* wxGetUserHome (
         if ((zHome = wxGetenv(_T("HOME"))) != NULL)
         {
             wxStrcpy(wxBuffer, zHome);
-            Unix2DosFilename(wxBuffer);
+            wxUnix2DosFilename(wxBuffer);
             wxStrcpy(zHome, wxBuffer);
             delete[] wxBuffer;
             return zHome;
@@ -1218,28 +1229,38 @@ void wxOS2SetFont(
     char                            zStyle[30];
 
     if (hWnd == NULLHANDLE)
+        return;
 
     //
-    // The fonts available for Presentation Params are just three
+    // The fonts available for Presentation Params are just a few
     // outline fonts, the rest are available to the GPI, so we must
     // map the families to one of these three
     //
     switch(rFont.GetFamily())
     {
         case wxSCRIPT:
+            strcpy(zFacename, "Script");
+            break;
+
         case wxDECORATIVE:
+            strcpy(zFacename, "WarpSans");
+            break;
+
         case wxROMAN:
             strcpy(zFacename,"Times New Roman");
             break;
 
         case wxTELETYPE:
+            strcpy(zFacename, "Courier New");
+            break;
+
         case wxMODERN:
-            strcpy(zFacename, "Courier");
+            strcpy(zFacename, "Courier New");
             break;
 
-        case wxSWISS:
         case wxDEFAULT:
         default:
+        case wxSWISS:
             strcpy(zFacename, "Helvetica");
             break;
     }
@@ -1282,3 +1303,221 @@ void wxOS2SetFont(
     }
     ::WinSetPresParam(hWnd, PP_FONTNAMESIZE, strlen(zFont) + 1, (PVOID)zFont);
 } // end of wxOS2SetFont
+
+// ---------------------------------------------------------------------------
+// Helper for taking a regular bitmap and giving it a disabled look
+// ---------------------------------------------------------------------------
+wxBitmap wxDisableBitmap(
+  const wxBitmap&                   rBmp
+, long                              lColor
+)
+{
+    wxMask*                         pMask = rBmp.GetMask();
+
+    if (!pMask)
+        return(wxNullBitmap);
+
+    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);
+    BITMAPINFOHEADER2               vHeader;
+    BITMAPINFO2                     vInfo;
+    ERRORID                         vError;
+    wxString                        sError;
+    HBITMAP                         hBitmap =  (HBITMAP)rBmp.GetHBITMAP();
+    HBITMAP                         hOldBitmap = NULLHANDLE;
+    HBITMAP                         hOldMask   = NULLHANDLE;
+    HBITMAP                         hMask = (HBITMAP)rBmp.GetMask()->GetMaskBitmap();
+    unsigned char*                  pucBits;     // buffer that will contain the bitmap data
+    unsigned char*                  pucData;     // pointer to use to traverse bitmap data
+    unsigned char*                  pucBitsMask; // buffer that will contain the mask data
+    unsigned char*                  pucDataMask; // pointer to use to traverse mask data
+    LONG                            lScans = 0L;
+    LONG                            lScansSet = 0L;
+    bool                            bpp16 = (wxDisplayDepth() == 16);
+
+    memset(&vHeader, '\0', 16);
+    vHeader.cbFix           = 16;
+
+    memset(&vInfo, '\0', 16);
+    vInfo.cbFix           = 16;
+    vInfo.cx              = (ULONG)rBmp.GetWidth();
+    vInfo.cy              = (ULONG)rBmp.GetHeight();
+    vInfo.cPlanes         = 1;
+    vInfo.cBitCount       = 24; // Set to desired count going in
+
+    //
+    // Create the buffers for data....all wxBitmaps are 24 bit internally
+    //
+    int                             nBytesPerLine = rBmp.GetWidth() * 3;
+    int                             nSizeDWORD    = sizeof(DWORD);
+    int                             nLineBoundary = nBytesPerLine % nSizeDWORD;
+    int                             nPadding = 0;
+    int                             i;
+    int                             j;
+
+    //
+    // Bitmap must be ina double-word alligned address so we may
+    // have some padding to worry about
+    //
+    if (nLineBoundary > 0)
+    {
+        nPadding     = nSizeDWORD - nLineBoundary;
+        nBytesPerLine += nPadding;
+    }
+    pucBits = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight());
+    memset(pucBits, '\0', (nBytesPerLine * rBmp.GetHeight()));
+    pucBitsMask = (unsigned char *)malloc(nBytesPerLine * rBmp.GetHeight());
+    memset(pucBitsMask, '\0', (nBytesPerLine * rBmp.GetHeight()));
+
+    //
+    // Extract the bitmap and mask data
+    //
+    if ((hOldBitmap = ::GpiSetBitmap(hPS, hBitmap)) == HBM_ERROR)
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+    }
+    ::GpiQueryBitmapInfoHeader(hBitmap, &vHeader);
+    vInfo.cBitCount = 24;
+    if ((lScans = ::GpiQueryBitmapBits( hPS
+                                       ,0L
+                                       ,(LONG)rBmp.GetHeight()
+                                       ,(PBYTE)pucBits
+                                       ,&vInfo
+                                      )) == GPI_ALTERROR)
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+    }
+    if ((hOldMask = ::GpiSetBitmap(hPS, hMask)) == HBM_ERROR)
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+    }
+    ::GpiQueryBitmapInfoHeader(hMask, &vHeader);
+    vInfo.cBitCount = 24;
+    if ((lScans = ::GpiQueryBitmapBits( hPS
+                                       ,0L
+                                       ,(LONG)rBmp.GetHeight()
+                                       ,(PBYTE)pucBitsMask
+                                       ,&vInfo
+                                      )) == GPI_ALTERROR)
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+    }
+    if (( hMask = ::GpiSetBitmap(hPS, hOldMask)) == HBM_ERROR)
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+    }
+    pucData     = pucBits;
+    pucDataMask = pucBitsMask;
+
+    //
+    // Get the mask value
+    //
+    for (i = 0; i < rBmp.GetHeight(); i++)
+    {
+        for (j = 0; j < rBmp.GetWidth(); j++)
+        {
+            // Byte 1
+            if (bpp16 && *pucDataMask == 0xF8) // 16 bit display gobblygook
+            {
+                *pucData = 0x7F;
+                pucData++;
+            }
+            else if (*pucDataMask == 0xFF) // set to grey
+            {
+                *pucData = 0x7F;
+                pucData++;
+            }
+            else
+            {
+                *pucData = ((unsigned char)(lColor >> 16));
+                pucData++;
+            }
+
+            // Byte 2
+            if (bpp16 && *(pucDataMask + 1) == 0xFC) // 16 bit display gobblygook
+            {
+                *pucData = 0x7F;
+                pucData++;
+            }
+            else if (*(pucDataMask + 1) == 0xFF) // set to grey
+            {
+                *pucData = 0x7F;
+                pucData++;
+            }
+            else
+            {
+                *pucData = ((unsigned char)(lColor >> 8));
+                pucData++;
+            }
+
+            // Byte 3
+            if (bpp16 && *(pucDataMask + 2) == 0xF8) // 16 bit display gobblygook
+            {
+                *pucData = 0x7F;
+                pucData++;
+            }
+            else if (*(pucDataMask + 2) == 0xFF) // set to grey
+            {
+                *pucData = 0x7F;
+                pucData++;
+            }
+            else
+            {
+                *pucData = ((unsigned char)lColor);
+                pucData++;
+            }
+            pucDataMask += 3;
+        }
+        for (j = 0; j < nPadding; j++)
+        {
+            pucData++;
+            pucDataMask++;
+        }
+    }
+
+    //
+    // Create a new bitmap and set the modified bits
+    //
+    wxBitmap                        vNewBmp( rBmp.GetWidth()
+                                            ,rBmp.GetHeight()
+                                            ,24
+                                           );
+    HBITMAP                         hNewBmp = (HBITMAP)vNewBmp.GetHBITMAP();
+
+    if ((hOldBitmap = ::GpiSetBitmap(hPS, hNewBmp)) == HBM_ERROR)
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+    }
+    if ((lScansSet = ::GpiSetBitmapBits( hPS
+                                        ,0L
+                                        ,(LONG)rBmp.GetHeight()
+                                        ,(PBYTE)pucBits
+                                        ,&vInfo
+                                       )) == GPI_ALTERROR)
+
+    {
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+    }
+    wxMask*                         pNewMask;
+
+    pNewMask = new wxMask(pMask->GetMaskBitmap());
+    vNewBmp.SetMask(pNewMask);
+    free(pucBits);
+    ::GpiSetBitmap(hPS, NULLHANDLE);
+    ::GpiDestroyPS(hPS);
+    ::DevCloseDC(hDC);
+    if (vNewBmp.Ok())
+        return(vNewBmp);
+    return(wxNullBitmap);
+} // end of wxDisableBitmap
+
+