X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a23692f070dc2682defb005bd7287ad18091732a..1978421a6d8b81c1f8a961da4b8ddf544fec7b1b:/src/os2/utils.cpp?ds=sidebyside diff --git a/src/os2/utils.cpp b/src/os2/utils.cpp index 6710cdf97c..1611b06941 100644 --- a/src/os2/utils.cpp +++ b/src/os2/utils.cpp @@ -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 #ifdef __EMX__ @@ -282,7 +283,7 @@ void wxUsleep( unsigned long ulMilliseconds ) { - ::DosSleep(ulMilliseconds/1000l); + ::DosSleep(ulMilliseconds); } void wxSleep( @@ -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