X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c354beeafacc20831ce76e266703d07f27e826c7..7ee31b00ed1aff56aa22f43f65a8604f6937ca37:/src/os2/bitmap.cpp diff --git a/src/os2/bitmap.cpp b/src/os2/bitmap.cpp index d722dd5ce8..94dcdeaa5d 100644 --- a/src/os2/bitmap.cpp +++ b/src/os2/bitmap.cpp @@ -63,9 +63,10 @@ wxBitmapRefData::wxBitmapRefData() void wxBitmapRefData::Free() { - wxASSERT_MSG( !m_pSelectedInto, - wxT("deleting bitmap still selected into wxMemoryDC") ); - + if ( m_pSelectedInto ) + { + wxLogLastError("GpiDeleteBitmap(hbitmap)"); + } if (m_hBitmap) { if (!::GpiDeleteBitmap((HBITMAP)m_hBitmap)) @@ -226,6 +227,8 @@ wxBitmap::wxBitmap( pzData = (char *)zBits; // const_cast is harmless } + if (nDepth > 24) + nDepth = 24; // MAX supported in PM memset(&vHeader, '\0', 16); vHeader.cbFix = 16; vHeader.cx = (USHORT)nWidth; @@ -345,6 +348,9 @@ bool wxBitmap::Create( hDCScreen = ::GpiQueryDevice(hPSScreen); ::DevQueryCaps(hDCScreen, CAPS_COLOR_BITCOUNT, 1L, &lBitCount); + if (lBitCount > 24) + lBitCount = 24; + memset(&vHeader, '\0', 16); vHeader.cbFix = 16; vHeader.cx = nW; @@ -547,7 +553,7 @@ bool wxBitmap::CreateFromImage ( SetWidth(nWidth); SetHeight(nBmpHeight); if (nDepth == -1) - nDepth = 16; // wxDisplayDepth(); + nDepth = wxDisplayDepth(); SetDepth(nDepth); #if wxUSE_PALETTE @@ -573,12 +579,6 @@ bool wxBitmap::CreateFromImage ( vHeader.cPlanes = 1L; vHeader.cBitCount = 24; - memset(&vInfo, '\0', 16); - vInfo.cbFix = 16; - vInfo.cx = (ULONG)nWidth; - vInfo.cy = (ULONG)nHeight; - vInfo.cPlanes = 1L; - vInfo.cBitCount = 24; // // Memory for DIB data // @@ -590,6 +590,7 @@ bool wxBitmap::CreateFromImage ( wxFAIL_MSG(wxT("could not allocate memory for DIB")); return FALSE; } + memset(pucBits, '\0', (nBytePerLine * nHeight)); // // Create and set the device-dependent bitmap @@ -599,11 +600,18 @@ bool wxBitmap::CreateFromImage ( HDC hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); HPS hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC); LONG lScans; - HDC hDCScreen = ::WinOpenWindowDC(HWND_DESKTOP); + HDC hDCScreen = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); HPS hPSScreen; HBITMAP hBmp; HBITMAP hBmpOld; + memset(&vInfo, '\0', 16); + vInfo.cbFix = 16; + vInfo.cx = (ULONG)nWidth; + vInfo.cy = (ULONG)nHeight; + vInfo.cPlanes = 1; + vInfo.cBitCount = 24; // Set to desired count going in + hBmp = ::GpiCreateBitmap( hPS ,&vHeader ,0L @@ -660,12 +668,23 @@ bool wxBitmap::CreateFromImage ( // Have to do something similar to WIN32's StretchDIBits, use GpiBitBlt // in combination with setting the bits into the selected bitmap // - lScans = ::GpiSetBitmapBits( hPS - ,0 // Start at the bottom - ,(LONG)nHeight // One line per scan - ,(PBYTE)pucBits - ,&vInfo - ); + if ((lScans = ::GpiSetBitmapBits( hPS + ,0 // Start at the bottom + ,(LONG)nHeight // One line per scan + ,(PBYTE)pucBits + ,&vInfo + )) == GPI_ALTERROR) + { + ERRORID vError; + wxString sError; + + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + // + // Debug stuff + // + hPSScreen = ::GpiCreatePS( vHabmain ,hDCScreen ,&vSize @@ -699,32 +718,23 @@ bool wxBitmap::CreateFromImage ( // if (rImage.HasMask()) { - hBmp = ::GpiCreateBitmap( hPS - ,&vHeader - ,0L - ,NULL - ,NULL - ); - memset(&vHeader, '\0', sizeof(BITMAPINFOHEADER2)); - hBmpOld = ::GpiSetBitmap(hPS, hBmp); - - vHeader.cbFix = sizeof(BITMAPINFOHEADER2); + vHeader.cbFix = 16; vHeader.cx = nWidth; vHeader.cy = nHeight; vHeader.cPlanes = 1; - vHeader.cBitCount = 1; + vHeader.cBitCount = 24; hBmp = ::GpiCreateBitmap( hPS ,&vHeader ,0L ,NULL ,NULL ); + hBmpOld = ::GpiSetBitmap(hPS, hBmp); if (nNumDIB == 1) nHeight = nBmpHeight; else nHeight = nSizeLimit / nBytePerLine; vHeader.cy = (DWORD)(nHeight); - vHeader.cbImage = nBytePerLine * nHeight; nOrigin = 0; unsigned char cRed = rImage.GetMaskRed(); @@ -744,7 +754,6 @@ bool wxBitmap::CreateFromImage ( // nHeight = nHRemain; vHeader.cy = (DWORD)(nHeight); - vHeader.cbImage = nBytePerLine * nHeight; } ptbits = pucBits; for (int j = 0; j < nHeight; j++) @@ -800,7 +809,7 @@ bool wxBitmap::CreateFromImage ( pMask->SetMaskBitmap((WXHBITMAP)hBmp); SetMask(pMask); - hBmpOld = ::GpiSetBitmap(hPS, hBmp); + hBmpOld = ::GpiSetBitmap(hPS, hBmpOld); } // @@ -808,6 +817,7 @@ bool wxBitmap::CreateFromImage ( // ::GpiSetBitmap(hPS, NULLHANDLE); ::GpiDestroyPS(hPS); + ::DevCloseDC(hDCScreen); ::DevCloseDC(hDC); free(pucBits); return TRUE; @@ -816,6 +826,7 @@ bool wxBitmap::CreateFromImage ( wxImage wxBitmap::ConvertToImage() const { wxImage vImage; + wxDC* pDC; wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") ); @@ -835,12 +846,13 @@ wxImage wxBitmap::ConvertToImage() const long lScans; BITMAPINFOHEADER2 vDIBh; BITMAPINFO2 vDIBInfo; - HDC hDCMem; - PSZ pszData[4] = { "Display", NULL, NULL, NULL }; HPS hPSMem; HPS hPS; - SIZEL vSizlPage = {0,0}; HBITMAP hBitmap; + HBITMAP hOldBitmap; + DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; + SIZEL vSizlPage = {0,0}; + HDC hDCMem; vImage.Create( nWidth ,nHeight @@ -883,34 +895,56 @@ wxImage wxBitmap::ConvertToImage() const free(pData); return wxNullImage; } + memset(lpBits, '\0', (nBytePerLine * nHeight)); + hBitmap = (HBITMAP)GetHBITMAP(); + + // + // May already be selected into a PS + // + if ((pDC = GetSelectedInto()) != NULL) + { + hPSMem = pDC->GetHPS(); + } + else + { + hDCMem = ::DevOpenDC( vHabmain + ,OD_MEMORY + ,"*" + ,5L + ,(PDEVOPENDATA)&vDop + ,NULLHANDLE + ); + hPSMem = ::GpiCreatePS( vHabmain + ,hDCMem + ,&vSizlPage + ,PU_PELS | GPIA_ASSOC + ); + if ((hOldBitmap = ::GpiSetBitmap(hPSMem, hBitmap)) == HBM_ERROR) + { + ERRORID vError; + wxString sError; + + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } + } // // Copy data from the device-dependent bitmap to the DIB // - hDCMem = ::DevOpenDC( vHabmain - ,OD_MEMORY - ,"*" - ,4 - ,(PDEVOPENDATA)pszData - ,NULLHANDLE - ); - hPSMem = ::GpiCreatePS( vHabmain - ,hDCMem - ,&vSizlPage - ,PU_PELS | GPIA_ASSOC | GPIT_MICRO - ); - hBitmap = ::GpiCreateBitmap( hPSMem - ,&vDIBh - ,0L - ,NULL - ,NULL - ); - lScans = ::GpiQueryBitmapBits( hPSMem - ,0L - ,(LONG)nHeight - ,(PBYTE)lpBits - ,&vDIBInfo - ); + if ((lScans = ::GpiQueryBitmapBits( hPSMem + ,0L + ,(LONG)nHeight + ,(PBYTE)lpBits + ,&vDIBInfo + )) == GPI_ALTERROR) + { + ERRORID vError; + wxString sError; + + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } // // Copy DIB data into the wxImage object @@ -931,6 +965,12 @@ wxImage wxBitmap::ConvertToImage() const } ptbits += nPadding; } + if ((pDC = GetSelectedInto()) == NULL) + { + ::GpiSetBitmap(hPSMem, NULLHANDLE); + ::GpiDestroyPS(hPSMem); + ::DevCloseDC(hDCMem); + } // // Similarly, set data according to the possible mask bitmap @@ -942,26 +982,28 @@ wxImage wxBitmap::ConvertToImage() const // // Memory DC/PS created, color set, data copied, and memory DC/PS deleted // - HDC hMemDC = ::DevOpenDC( vHabmain - ,OD_MEMORY - ,"*" - ,4 - ,(PDEVOPENDATA)pszData - ,NULLHANDLE - ); + HDC hMemDC = ::DevOpenDC( vHabmain + ,OD_MEMORY + ,"*" + ,5L + ,(PDEVOPENDATA)&vDop + ,NULLHANDLE + ); HPS hMemPS = ::GpiCreatePS( vHabmain ,hMemDC ,&vSizlPage - ,PU_PELS | GPIA_ASSOC | GPIT_MICRO + ,PU_PELS | GPIA_ASSOC ); ::GpiSetColor(hMemPS, OS2RGB(0, 0, 0)); ::GpiSetBackColor(hMemPS, OS2RGB(255, 255, 255) ); + ::GpiSetBitmap(hMemPS, hBitmap); ::GpiQueryBitmapBits( hPSMem ,0L ,(LONG)nHeight ,(PBYTE)lpBits ,&vDIBInfo ); + ::GpiSetBitmap(hMemPS, NULLHANDLE); ::GpiDestroyPS(hMemPS); ::DevCloseDC(hMemDC); @@ -1004,8 +1046,6 @@ wxImage wxBitmap::ConvertToImage() const // // Free allocated resources // - ::GpiDestroyPS(hPSMem); - ::DevCloseDC(hDCMem); free(lpBits); return vImage; } // end of wxBitmap::ConvertToImage @@ -1041,7 +1081,7 @@ wxBitmap wxBitmap::GetSubBitmap( HPS hPSSrc = ::GpiCreatePS(vHabmain, hDCSrc, &vSize, PU_PELS | GPIA_ASSOC); HPS hPSDst = ::GpiCreatePS(vHabmain, hDCDst, &vSize, PU_PELS | GPIA_ASSOC); POINTL vPoint[4] = { 0, 0, rRect.width, rRect.height, - rRect.x, rRect.y + rRect.x, rRect.y, rRect.x + rRect.width, rRect.y + rRect.height };