X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1d0edc0f7306aac10a75c545f9cace25d3cee83d..82cf15a4d43b1db7106641aaa544efdcdfd48302:/src/os2/bitmap.cpp?ds=sidebyside diff --git a/src/os2/bitmap.cpp b/src/os2/bitmap.cpp index 3b86f1c669..99264e0611 100644 --- a/src/os2/bitmap.cpp +++ b/src/os2/bitmap.cpp @@ -548,7 +548,7 @@ bool wxBitmap::CreateFromImage ( SetWidth(nWidth); SetHeight(nBmpHeight); if (nDepth == -1) - nDepth = 16; // wxDisplayDepth(); + nDepth = wxDisplayDepth(); SetDepth(nDepth); #if wxUSE_PALETTE @@ -600,7 +600,7 @@ 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; @@ -661,12 +661,40 @@ 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 - ); + vInfo.cBitCount = 16; + 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); + } + + // + // for debugging---- + // +LONG alFormats[24]; +::GpiQueryDeviceBitmapFormats(hPS, 24, alFormats); +if ((lScans = ::GpiQueryBitmapBits( hPS + ,0L + ,(LONG)nHeight + ,(PBYTE)pucBits + ,&vInfo + )) == GPI_ALTERROR) +{ + ERRORID vError; + wxString sError; + + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); +} + hPSScreen = ::GpiCreatePS( vHabmain ,hDCScreen ,&vSize @@ -700,11 +728,11 @@ bool wxBitmap::CreateFromImage ( // if (rImage.HasMask()) { - 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 @@ -717,7 +745,6 @@ bool wxBitmap::CreateFromImage ( else nHeight = nSizeLimit / nBytePerLine; vHeader.cy = (DWORD)(nHeight); - vHeader.cbImage = nBytePerLine * nHeight; nOrigin = 0; unsigned char cRed = rImage.GetMaskRed(); @@ -737,7 +764,6 @@ bool wxBitmap::CreateFromImage ( // nHeight = nHRemain; vHeader.cy = (DWORD)(nHeight); - vHeader.cbImage = nBytePerLine * nHeight; } ptbits = pucBits; for (int j = 0; j < nHeight; j++) @@ -793,7 +819,7 @@ bool wxBitmap::CreateFromImage ( pMask->SetMaskBitmap((WXHBITMAP)hBmp); SetMask(pMask); - hBmpOld = ::GpiSetBitmap(hPS, hBmp); + hBmpOld = ::GpiSetBitmap(hPS, hBmpOld); } // @@ -809,6 +835,7 @@ bool wxBitmap::CreateFromImage ( wxImage wxBitmap::ConvertToImage() const { wxImage vImage; + wxDC* pDC; wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") ); @@ -828,12 +855,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 @@ -877,34 +905,54 @@ wxImage wxBitmap::ConvertToImage() const return wxNullImage; } + // + // 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 + ); + hBitmap = (HBITMAP)GetHBITMAP(); + 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 - ); - ::GpiSetBitmap(hPSMem, hBitmap); - 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 @@ -925,7 +973,12 @@ wxImage wxBitmap::ConvertToImage() const } ptbits += nPadding; } - ::GpiSetBitmap(hPSMem, NULLHANDLE); + if ((pDC = GetSelectedInto()) == NULL) + { + ::GpiSetBitmap(hPSMem, NULLHANDLE); + ::GpiDestroyPS(hPSMem); + ::DevCloseDC(hDCMem); + } // // Similarly, set data according to the possible mask bitmap @@ -937,17 +990,17 @@ 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) ); @@ -1001,8 +1054,6 @@ wxImage wxBitmap::ConvertToImage() const // // Free allocated resources // - ::GpiDestroyPS(hPSMem); - ::DevCloseDC(hDCMem); free(lpBits); return vImage; } // end of wxBitmap::ConvertToImage