SetWidth(nWidth);
SetHeight(nBmpHeight);
if (nDepth == -1)
- nDepth = 16; // wxDisplayDepth();
+ nDepth = wxDisplayDepth();
SetDepth(nDepth);
#if wxUSE_PALETTE
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;
// 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
//
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
else
nHeight = nSizeLimit / nBytePerLine;
vHeader.cy = (DWORD)(nHeight);
- vHeader.cbImage = nBytePerLine * nHeight;
nOrigin = 0;
unsigned char cRed = rImage.GetMaskRed();
//
nHeight = nHRemain;
vHeader.cy = (DWORD)(nHeight);
- vHeader.cbImage = nBytePerLine * nHeight;
}
ptbits = pucBits;
for (int j = 0; j < nHeight; j++)
pMask->SetMaskBitmap((WXHBITMAP)hBmp);
SetMask(pMask);
- hBmpOld = ::GpiSetBitmap(hPS, hBmp);
+ hBmpOld = ::GpiSetBitmap(hPS, hBmpOld);
}
//
wxImage wxBitmap::ConvertToImage() const
{
wxImage vImage;
+ wxDC* pDC;
wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") );
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
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
}
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
//
// 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) );
//
// Free allocated resources
//
- ::GpiDestroyPS(hPSMem);
- ::DevCloseDC(hDCMem);
free(lpBits);
return vImage;
} // end of wxBitmap::ConvertToImage