]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/utils.cpp
Added headers that didn't get installed.
[wxWidgets.git] / src / os2 / utils.cpp
index 6710cdf97ce4dfd0ea7f824adf72edd7b778a621..59b47374bbdae5239e9e0830b71c8806e7bf82b9 100644 (file)
@@ -6,7 +6,7 @@
 // Created:     09/17/99
 // RCS-ID:      $Id$
 // Copyright:   (c) David Webster
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 // For compilers that support precompilation, includes "wx.h".
@@ -22,6 +22,7 @@
 #include "wx/os2/private.h"
 #include "wx/timer.h"
 #include "wx/intl.h"
+#include "wx/apptrait.h"
 
 #include <ctype.h>
 #ifdef __EMX__
@@ -360,9 +361,7 @@ void wxBell()
     DosBeep(1000,1000); // 1kHz during 1 sec.
 }
 
-// Chris Breeze 27/5/98: revised WIN32 code to
-// detect WindowsNT correctly
-int wxGetOsVersion(
+int wxGUIAppTraits::GetOSVersion(
   int*                              pMajorVsn
 , int*                              pMinorVsn
 )
@@ -710,7 +709,7 @@ wxChar* wxGetUserHome (
         if ((zHome = wxGetenv(_T("HOME"))) != NULL)
         {
             wxStrcpy(wxBuffer, zHome);
-            Unix2DosFilename(wxBuffer);
+            wxUnix2DosFilename(wxBuffer);
             wxStrcpy(zHome, wxBuffer);
             delete[] wxBuffer;
             return zHome;
@@ -1303,3 +1302,226 @@ 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
+
+COLORREF wxColourToRGB(
+  const wxColour&                   rColor
+)
+{
+    return(OS2RGB(rColor.Red(), rColor.Green(), rColor.Blue()));
+} // end of wxColourToRGB