X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b1b054dad6ca9a0407f4fc2c6c87763a7dfe3888..fdbb06ba2cf7e82e5a9c325c60da1772050cbf33:/src/os2/bitmap.cpp diff --git a/src/os2/bitmap.cpp b/src/os2/bitmap.cpp index 99264e0611..92ca4c551e 100644 --- a/src/os2/bitmap.cpp +++ b/src/os2/bitmap.cpp @@ -86,6 +86,10 @@ void wxBitmapRefData::Free() // this function should be called from all wxBitmap ctors void wxBitmap::Init() { + m_bIsMono = FALSE; + // + // True for all bitmaps created from bits, wxImages, Xpms + // } // end of wxBitmap::Init bool wxBitmap::CopyFromIconOrCursor( @@ -113,9 +117,11 @@ bool wxBitmap::CopyFromIconOrCursor( pRefData->m_hBitmap = (WXHBITMAP)SIconInfo.hbmColor; - // - // No mask in the Info struct in OS/2 - // + wxMask* pMask = new wxMask(SIconInfo.hbmPointer); + + pMask->SetMaskBitmap(GetHBITMAP()); + SetMask(pMask); + return(TRUE); } // end of wxBitmap::CopyFromIconOrCursor @@ -227,6 +233,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; @@ -260,7 +268,6 @@ wxBitmap::wxBitmap( ) { Init(); - (void)Create( nW ,nH ,nD @@ -291,7 +298,6 @@ wxBitmap::wxBitmap( ) { Init(); - LoadFile( rFilename ,(int)lType ); @@ -313,6 +319,10 @@ bool wxBitmap::Create( GetBitmapData()->m_nHeight = nH; GetBitmapData()->m_nDepth = nD; + // + // Xpms and bitmaps from other images can also be mono's, but only + // mono's need help changing their colors with MemDC changes + // if (nD > 0) { DEVOPENSTRUC vDop = {0L, "DISPLAY", NULL, 0L, 0L, 0L, 0L, 0L, 0L}; @@ -320,12 +330,14 @@ bool wxBitmap::Create( HDC hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); HPS hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC); + if (nD == 1) + m_bIsMono = TRUE; memset(&vHeader, '\0', 16); vHeader.cbFix = 16; vHeader.cx = nW; vHeader.cy = nH; vHeader.cPlanes = 1; - vHeader.cBitCount = nD; + vHeader.cBitCount = 24; //nD; hBmp = ::GpiCreateBitmap( hPS ,&vHeader @@ -346,6 +358,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; @@ -509,7 +524,6 @@ bool wxBitmap::CreateFromImage ( wxCHECK_MSG(rImage.Ok(), FALSE, wxT("invalid image")); m_refData = new wxBitmapRefData(); - int nSizeLimit = 1024 * 768 * 3; int nWidth = rImage.GetWidth(); int nBmpHeight = rImage.GetHeight(); @@ -547,6 +561,10 @@ bool wxBitmap::CreateFromImage ( wxCHECK_MSG(rImage.Ok(), FALSE, wxT("invalid image")); SetWidth(nWidth); SetHeight(nBmpHeight); + if (nDepth == 1) + m_bIsMono = TRUE; + else + m_bIsMono = FALSE; if (nDepth == -1) nDepth = wxDisplayDepth(); SetDepth(nDepth); @@ -574,12 +592,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 // @@ -591,6 +603,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 @@ -605,13 +618,19 @@ bool wxBitmap::CreateFromImage ( 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 ,NULL ,NULL ); - hBmpOld = ::GpiSetBitmap(hPS, hBmp); #if wxUSE_PALETTE HPAL hOldPalette = NULLHANDLE; if (rImage.GetPalette().Ok()) @@ -631,6 +650,14 @@ bool wxBitmap::CreateFromImage ( unsigned char* ptdata = pData; unsigned char* ptbits; + if ((hBmpOld = ::GpiSetBitmap(hPS, hBmp)) == HBM_ERROR) + { + ERRORID vError; + wxString sError; + + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); + } for (n = 0; n < nNumDIB; n++) { if (nNumDIB > 1 && n == nNumDIB - 1 && nHRemain > 0) @@ -661,7 +688,6 @@ bool wxBitmap::CreateFromImage ( // Have to do something similar to WIN32's StretchDIBits, use GpiBitBlt // in combination with setting the bits into the selected bitmap // - vInfo.cBitCount = 16; if ((lScans = ::GpiSetBitmapBits( hPS ,0 // Start at the bottom ,(LONG)nHeight // One line per scan @@ -675,26 +701,6 @@ bool wxBitmap::CreateFromImage ( 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 @@ -764,13 +770,18 @@ if ((lScans = ::GpiQueryBitmapBits( hPS // nHeight = nHRemain; vHeader.cy = (DWORD)(nHeight); + vHeader.cbImage = nBytePerLine * nHeight; } ptbits = pucBits; for (int j = 0; j < nHeight; j++) { for (i = 0; i < nWidth; i++) { - if ((*(ptdata++) != cRed) || (*(ptdata++) != cGreen) || (*(ptdata++) != cBlue)) + unsigned char cRedImage = (*(ptdata++)) ; + unsigned char cGreenImage = (*(ptdata++)) ; + unsigned char cBlueImage = (*(ptdata++)) ; + + if ((cRedImage != cRed) || (cGreenImage != cGreen) || (cBlueImage != cBlue)) { *(ptbits++) = cOne; *(ptbits++) = cOne; @@ -827,6 +838,7 @@ if ((lScans = ::GpiQueryBitmapBits( hPS // ::GpiSetBitmap(hPS, NULLHANDLE); ::GpiDestroyPS(hPS); + ::DevCloseDC(hDCScreen); ::DevCloseDC(hDC); free(pucBits); return TRUE; @@ -904,6 +916,8 @@ wxImage wxBitmap::ConvertToImage() const free(pData); return wxNullImage; } + memset(lpBits, '\0', (nBytePerLine * nHeight)); + hBitmap = (HBITMAP)GetHBITMAP(); // // May already be selected into a PS @@ -926,15 +940,14 @@ wxImage wxBitmap::ConvertToImage() const ,&vSizlPage ,PU_PELS | GPIA_ASSOC ); - hBitmap = (HBITMAP)GetHBITMAP(); - if ((hOldBitmap = ::GpiSetBitmap(hPSMem, hBitmap)) == HBM_ERROR) - { - ERRORID vError; - wxString sError; + } + if ((hOldBitmap = ::GpiSetBitmap(hPSMem, hBitmap)) == HBM_ERROR) + { + ERRORID vError; + wxString sError; - vError = ::WinGetLastError(vHabmain); - sError = wxPMErrorToStr(vError); - } + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); } // @@ -1115,7 +1128,7 @@ wxBitmap wxBitmap::GetSubBitmap( vBmih.cx = rRect.width; vBmih.cy = rRect.height; vBmih.cPlanes = 1; - vBmih.cBitCount = 1; + vBmih.cBitCount = 24; HBITMAP hBmpMask = ::GpiCreateBitmap( hPSDst ,&vBmih @@ -1280,7 +1293,7 @@ bool wxMask::Create( vBmih.cx = rBitmap.GetWidth(); vBmih.cy = rBitmap.GetHeight(); vBmih.cPlanes = 1; - vBmih.cBitCount = 1; + vBmih.cBitCount = 24; m_hMaskBitmap = ::GpiCreateBitmap( hPSDst ,&vBmih @@ -1574,12 +1587,12 @@ HBITMAP wxInvertMask( 0, 0, nWidth, nHeight }; - memset(&vBmih, '\0', sizeof(BITMAPINFOHEADER2)); - vBmih.cbFix = sizeof(BITMAPINFOHEADER2); + memset(&vBmih, '\0', 16); + vBmih.cbFix = 16; vBmih.cx = nWidth; vBmih.cy = nHeight; vBmih.cPlanes = 1; - vBmih.cBitCount = 1; + vBmih.cBitCount = 24; hBmpInvMask = ::GpiCreateBitmap( hPSDst ,&vBmih