X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fec19ea9ff590f401ad17b1e2109b1e95d2f5e91..7a82dabcc7be89b73f1b15ac890ae776dd6f2bd2:/src/os2/bitmap.cpp diff --git a/src/os2/bitmap.cpp b/src/os2/bitmap.cpp index eb52b51de1..3b86f1c669 100644 --- a/src/os2/bitmap.cpp +++ b/src/os2/bitmap.cpp @@ -33,6 +33,7 @@ //#include "wx/msw/dib.h" #include "wx/image.h" +#include "wx/xpmdecod.h" // ---------------------------------------------------------------------------- // macros @@ -62,12 +63,13 @@ 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) ) + if (!::GpiDeleteBitmap((HBITMAP)m_hBitmap)) { wxLogLastError("GpiDeleteBitmap(hbitmap)"); } @@ -84,10 +86,6 @@ void wxBitmapRefData::Free() // this function should be called from all wxBitmap ctors void wxBitmap::Init() { - // m_refData = NULL; done in the base class ctor - - if (wxTheBitmapList) - wxTheBitmapList->AddBitmap(this); } // end of wxBitmap::Init bool wxBitmap::CopyFromIconOrCursor( @@ -146,15 +144,13 @@ bool wxBitmap::CopyFromIcon( wxBitmap::~wxBitmap() { - if (wxTheBitmapList) - wxTheBitmapList->DeleteObject(this); } // end of wxBitmap::~wxBitmap wxBitmap::wxBitmap( const char zBits[] -, int nTheWidth -, int nTheHeight -, int nNoBits +, int nWidth +, int nHeight +, int nDepth ) { Init(); @@ -166,80 +162,95 @@ wxBitmap::wxBitmap( HPS hPs; DEVOPENSTRUC vDop = { NULL, "DISPLAY", NULL, NULL, NULL, NULL, NULL, NULL, NULL }; SIZEL vSize = {0, 0}; + char* pzData; wxASSERT(vHabmain != NULL); - hDc = ::DevOpenDC(vHabmain, OD_MEMORY, (PSZ)"*", 1L, (PDEVOPENDATA)&vDop, 0L); + m_refData = pRefData; - vHeader.cbFix = sizeof(vHeader); - vHeader.cx = (USHORT)nTheWidth; - vHeader.cy = (USHORT)nTheHeight; - vHeader.cPlanes = 1L; - vHeader.cBitCount = nNoBits; - vHeader.ulCompression = BCA_UNCOMP; - vHeader.cxResolution = 0; - vHeader.cyResolution = 0; - vHeader.cclrUsed = 0; - vHeader.cclrImportant = 0; - vHeader.usUnits = BRU_METRIC; - vHeader.usRecording = BRA_BOTTOMUP; - vHeader.usRendering = BRH_NOTHALFTONED; - vHeader.cSize1 = 0; - vHeader.cSize2 = 0; - vHeader.ulColorEncoding = 0; - vHeader.ulIdentifier = 0; + pRefData->m_nWidth = nWidth; + pRefData->m_nHeight = nHeight; + pRefData->m_nDepth = nDepth; + pRefData->m_nNumColors = 0; + pRefData->m_pSelectedInto = NULL; + hDc = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); hPs = ::GpiCreatePS(vHabmain, hDc, &vSize, GPIA_ASSOC | PU_PELS); if (hPs == 0) { wxLogLastError("GpiCreatePS Failure"); } - m_refData = pRefData; - - pRefData->m_nWidth = nTheWidth; - pRefData->m_nHeight = nTheHeight; - pRefData->m_nDepth = nNoBits; - pRefData->m_nNumColors = 0; - pRefData->m_pSelectedInto = NULL; + if (nDepth == 1) + { + // + // We assume that it is in XBM format which is not quite the same as + // the format CreateBitmap() wants because the order of bytes in the + // line is inversed! + // + const size_t nBytesPerLine = (nWidth + 7) / 8; + const size_t nPadding = nBytesPerLine % 2; + const size_t nLen = nHeight * (nPadding + nBytesPerLine); + const char* pzSrc = zBits; + int nRows; + size_t nCols; + + pzData = (char *)malloc(nLen); + + char* pzDst = pzData; + + for (nRows = 0; nRows < nHeight; nRows++) + { + for (nCols = 0; nCols < nBytesPerLine; nCols++) + { + unsigned char ucVal = *pzSrc++; + unsigned char ucReversed = 0; + int nBits; - HBITMAP hBmp = ::GpiCreateBitmap(hPs, &vHeader, 0L, NULL, &vInfo); - if (!hBmp) + for (nBits = 0; nBits < 8; nBits++) + { + ucReversed <<= 1; + ucReversed |= (ucVal & 0x01); + ucVal >>= 1; + } + *pzDst++ = ucReversed; + } + if (nPadding) + *pzDst++ = 0; + } + } + else { - wxLogLastError("CreateBitmap"); + // + // Bits should already be in Windows standard format + // + pzData = (char *)zBits; // const_cast is harmless } - SetHBITMAP((WXHBITMAP)hBmp); -} // end of wxBitmap::wxBitmap -// -// Create from XPM data -// -wxBitmap::wxBitmap( - char** ppData -) -{ - Init(); + memset(&vHeader, '\0', 16); + vHeader.cbFix = 16; + vHeader.cx = (USHORT)nWidth; + vHeader.cy = (USHORT)nHeight; + vHeader.cPlanes = 1L; + vHeader.cBitCount = nDepth; + vHeader.usReserved = 0; - (void)Create( (void *)ppData - ,wxBITMAP_TYPE_XPM_DATA - ,0 - ,0 - ,0 - ); -} // end of wxBitmap::wxBitmap + memset(&vInfo, '\0', 16); + vInfo.cbFix = 16; + vInfo.cx = (USHORT)nWidth; + vInfo.cy = (USHORT)nHeight; + vInfo.cPlanes = 1L; + vInfo.cBitCount = nDepth; -wxBitmap::wxBitmap( - const char** ppData -) -{ - Init(); + HBITMAP hBmp = ::GpiCreateBitmap(hPs, &vHeader, CBM_INIT, (PBYTE)pzData, &vInfo); - (void)Create( (void *)ppData - ,wxBITMAP_TYPE_XPM_DATA - ,0 - ,0 - ,0 - ); + if (!hBmp) + { + wxLogLastError("CreateBitmap"); + } + ::GpiDestroyPS(hPs); + ::DevCloseDC(hDc); + SetHBITMAP((WXHBITMAP)hBmp); } // end of wxBitmap::wxBitmap wxBitmap::wxBitmap( @@ -309,8 +320,8 @@ bool wxBitmap::Create( HDC hDC = ::DevOpenDC(vHabmain, OD_MEMORY, "*", 5L, (PDEVOPENDATA)&vDop, NULLHANDLE); HPS hPS = ::GpiCreatePS(vHabmain, hDC, &vSize, PU_PELS | GPIA_ASSOC); - memset(&vHeader, '\0', sizeof(BITMAPINFOHEADER2)); - vHeader.cbFix = sizeof(BITMAPINFOHEADER2); + memset(&vHeader, '\0', 16); + vHeader.cbFix = 16; vHeader.cx = nW; vHeader.cy = nH; vHeader.cPlanes = 1; @@ -335,8 +346,8 @@ bool wxBitmap::Create( hDCScreen = ::GpiQueryDevice(hPSScreen); ::DevQueryCaps(hDCScreen, CAPS_COLOR_BITCOUNT, 1L, &lBitCount); - memset(&vHeader, '\0', sizeof(BITMAPINFOHEADER2)); - vHeader.cbFix = sizeof(BITMAPINFOHEADER2); + memset(&vHeader, '\0', 16); + vHeader.cbFix = 16; vHeader.cx = nW; vHeader.cy = nH; vHeader.cPlanes = 1; @@ -361,6 +372,27 @@ bool wxBitmap::Create( return Ok(); } // end of wxBitmap::Create +bool wxBitmap::CreateFromXpm( + const char** ppData +) +{ +#if wxUSE_IMAGE && wxUSE_XPM + Init(); + + wxCHECK_MSG(ppData != NULL, FALSE, wxT("invalid bitmap data")) + + wxXPMDecoder vDecoder; + wxImage vImg = vDecoder.ReadData(ppData); + + wxCHECK_MSG(vImg.Ok(), FALSE, wxT("invalid bitmap data")) + + *this = wxBitmap(vImg); + return TRUE; +#else + return FALSE; +#endif +} // end of wxBitmap::CreateFromXpm + bool wxBitmap::LoadFile( const wxString& rFilename , long lType @@ -393,7 +425,7 @@ bool wxBitmap::LoadFile( if (!vImage.LoadFile(rFilename, lType) || !vImage.Ok() ) return(FALSE); - *this = vImage.ConvertToBitmap(); + *this = wxBitmap(vImage); return(TRUE); } @@ -453,7 +485,7 @@ bool wxBitmap::SaveFile( else { // FIXME what about palette? shouldn't we use it? - wxImage vImage(*this); + wxImage vImage = ConvertToImage(); if (!vImage.Ok()) return(FALSE); @@ -469,335 +501,511 @@ bool wxBitmap::SaveFile( // wxImage-wxBitmap convertion // ---------------------------------------------------------------------------- -bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) +bool wxBitmap::CreateFromImage ( + const wxImage& rImage +, int nDepth +) { - wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") ) - -// TODO: -/* - int sizeLimit = 1024*768*3; - - // width and height of the device-dependent bitmap - int width = GetWidth(); - int bmpHeight = GetHeight(); - - // calc the number of bytes per scanline and padding - int bytePerLine = width*3; - int sizeDWORD = sizeof( DWORD ); - int lineBoundary = bytePerLine % sizeDWORD; - int padding = 0; - if( lineBoundary > 0 ) + 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(); + int nBytePerLine = nWidth * 3; + int nSizeDWORD = sizeof(DWORD); + int nLineBoundary = nBytePerLine % nSizeDWORD; + int nPadding = 0; + + if (nLineBoundary > 0) { - padding = sizeDWORD - lineBoundary; - bytePerLine += padding; + nPadding = nSizeDWORD - nLineBoundary; + nBytePerLine += nPadding; } - // calc the number of DIBs and heights of DIBs - int numDIB = 1; - int hRemain = 0; - int height = sizeLimit/bytePerLine; - if( height >= bmpHeight ) - height = bmpHeight; + + // + // Calc the number of DIBs and heights of DIBs + // + int nNumDIB = 1; + int nHRemain = 0; + int nHeight = nSizeLimit / nBytePerLine; + + if (nHeight >= nBmpHeight) + nHeight = nBmpHeight; else { - numDIB = bmpHeight / height; - hRemain = bmpHeight % height; - if( hRemain >0 ) numDIB++; + nNumDIB = nBmpHeight / nHeight; + nHRemain = nBmpHeight % nHeight; + if (nHRemain > 0) + nNumDIB++; } - // set bitmap parameters - wxBitmap bitmap; - wxCHECK_MSG( Ok(), bitmap, wxT("invalid image") ); - bitmap.SetWidth( width ); - bitmap.SetHeight( bmpHeight ); - bitmap.SetDepth( wxDisplayDepth() ); - - // create a DIB header - int headersize = sizeof(BITMAPINFOHEADER); - LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); - wxCHECK_MSG( lpDIBh, bitmap, wxT("could not allocate memory for DIB header") ); + // + // Set bitmap parameters + // + wxCHECK_MSG(rImage.Ok(), FALSE, wxT("invalid image")); + SetWidth(nWidth); + SetHeight(nBmpHeight); + if (nDepth == -1) + nDepth = 16; // wxDisplayDepth(); + SetDepth(nDepth); + +#if wxUSE_PALETTE + // + // Copy the palette from the source image + // + SetPalette(rImage.GetPalette()); +#endif // wxUSE_PALETTE + + // + // Create a DIB header + // + BITMAPINFOHEADER2 vHeader; + BITMAPINFO2 vInfo; + + // // Fill in the DIB header - lpDIBh->bmiHeader.biSize = headersize; - lpDIBh->bmiHeader.biWidth = (DWORD)width; - lpDIBh->bmiHeader.biHeight = (DWORD)(-height); - lpDIBh->bmiHeader.biSizeImage = bytePerLine*height; - // the general formula for biSizeImage: - // ( ( ( ((DWORD)width*24) +31 ) & ~31 ) >> 3 ) * height; - lpDIBh->bmiHeader.biPlanes = 1; - lpDIBh->bmiHeader.biBitCount = 24; - lpDIBh->bmiHeader.biCompression = BI_RGB; - lpDIBh->bmiHeader.biClrUsed = 0; - // These seem not really needed for our purpose here. - lpDIBh->bmiHeader.biClrImportant = 0; - lpDIBh->bmiHeader.biXPelsPerMeter = 0; - lpDIBh->bmiHeader.biYPelsPerMeter = 0; - // memory for DIB data - unsigned char *lpBits; - lpBits = (unsigned char *)malloc( lpDIBh->bmiHeader.biSizeImage ); - if( !lpBits ) + // + memset(&vHeader, '\0', 16); + vHeader.cbFix = 16; + vHeader.cx = (ULONG)nWidth; + vHeader.cy = (ULONG)nHeight; + 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 + // + unsigned char* pucBits; + + pucBits = (unsigned char *)malloc(nBytePerLine * nHeight); + if(!pucBits) + { + wxFAIL_MSG(wxT("could not allocate memory for DIB")); + return FALSE; + } + + // + // Create and set the device-dependent bitmap + // + 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); + LONG lScans; + HDC hDCScreen = ::WinOpenWindowDC(HWND_DESKTOP); + HPS hPSScreen; + HBITMAP hBmp; + HBITMAP hBmpOld; + + hBmp = ::GpiCreateBitmap( hPS + ,&vHeader + ,0L + ,NULL + ,NULL + ); + hBmpOld = ::GpiSetBitmap(hPS, hBmp); +#if wxUSE_PALETTE + HPAL hOldPalette = NULLHANDLE; + if (rImage.GetPalette().Ok()) { - wxFAIL_MSG( wxT("could not allocate memory for DIB") ); - free( lpDIBh ); - return bitmap; + hOldPalette = ::GpiSelectPalette(hPS, (HPAL)rImage.GetPalette().GetHPALETTE()); } +#endif // wxUSE_PALETTE - // create and set the device-dependent bitmap - HDC hdc = ::GetDC(NULL); - HDC memdc = ::CreateCompatibleDC( hdc ); - HBITMAP hbitmap; - hbitmap = ::CreateCompatibleBitmap( hdc, width, bmpHeight ); - ::SelectObject( memdc, hbitmap); - - // copy image data into DIB data and then into DDB (in a loop) - unsigned char *data = GetData(); - int i, j, n; - int origin = 0; - unsigned char *ptdata = data; - unsigned char *ptbits; - - for( n=0; n 1 && n == numDIB-1 && hRemain > 0 ) + if (nNumDIB > 1 && n == nNumDIB - 1 && nHRemain > 0) { - // redefine height and size of the (possibly) last smaller DIB + // + // Redefine height and size of the (possibly) last smaller DIB // memory is not reallocated - height = hRemain; - lpDIBh->bmiHeader.biHeight = (DWORD)(-height); - lpDIBh->bmiHeader.biSizeImage = bytePerLine*height; + // + nHeight = nHRemain; + vHeader.cy = (DWORD)(nHeight); + vHeader.cbImage = nBytePerLine * nHeight; } - ptbits = lpBits; - - for( j=0; jbmiHeader), CBM_INIT, lpBits, lpDIBh, DIB_RGB_COLORS ); - // The above line is equivalent to the following two lines. - // hbitmap = ::CreateCompatibleBitmap( hdc, width, height ); - // ::SetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS); - // or the following lines - // hbitmap = ::CreateCompatibleBitmap( hdc, width, height ); - // HDC memdc = ::CreateCompatibleDC( hdc ); - // ::SelectObject( memdc, hbitmap); - // ::SetDIBitsToDevice( memdc, 0, 0, width, height, - // 0, 0, 0, height, (void *)lpBits, lpDIBh, DIB_RGB_COLORS); - // ::SelectObject( memdc, 0 ); - // ::DeleteDC( memdc ); + + // + // 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 + ); + hPSScreen = ::GpiCreatePS( vHabmain + ,hDCScreen + ,&vSize + ,PU_PELS | GPIA_ASSOC + ); + + POINTL vPoint[4] = { 0, nOrigin, + nWidth, nHeight, + 0, 0, nWidth, nHeight + }; + + + ::GpiBitBlt( hPSScreen + ,hPS + ,4 + ,vPoint + ,ROP_SRCCOPY + ,BBO_IGNORE + ); + ::GpiDestroyPS(hPSScreen); + nOrigin += nHeight; } - bitmap.SetHBITMAP( (WXHBITMAP) hbitmap ); + SetHBITMAP((WXHBITMAP)hBmp); +#if wxUSE_PALETTE + if (hOldPalette) + ::GpiSelectPalette(hPS, hOldPalette); +#endif // wxUSE_PALETTE - // similarly, created an mono-bitmap for the possible mask - if( HasMask() ) + // + // Similarly, created an mono-bitmap for the possible mask + // + if (rImage.HasMask()) { - hbitmap = ::CreateBitmap( (WORD)width, (WORD)bmpHeight, 1, 1, NULL ); - ::SelectObject( memdc, hbitmap); - if( numDIB == 1 ) height = bmpHeight; - else height = sizeLimit/bytePerLine; - lpDIBh->bmiHeader.biHeight = (DWORD)(-height); - lpDIBh->bmiHeader.biSizeImage = bytePerLine*height; - origin = 0; - unsigned char r = GetMaskRed(); - unsigned char g = GetMaskGreen(); - unsigned char b = GetMaskBlue(); - unsigned char zero = 0, one = 255; - ptdata = data; - for( n=0; n 1 && n == numDIB - 1 && hRemain > 0 ) + if (nNumDIB > 1 && n == nNumDIB - 1 && nHRemain > 0) { - // redefine height and size of the (possibly) last smaller DIB + // + // Redefine height and size of the (possibly) last smaller DIB // memory is not reallocated - height = hRemain; - lpDIBh->bmiHeader.biHeight = (DWORD)(-height); - lpDIBh->bmiHeader.biSizeImage = bytePerLine*height; + // + nHeight = nHRemain; + vHeader.cy = (DWORD)(nHeight); + vHeader.cbImage = nBytePerLine * nHeight; } - ptbits = lpBits; - for( int j=0; jSetMaskBitmap( (WXHBITMAP) hbitmap ); - bitmap.SetMask( mask ); - } - // free allocated resources - ::SelectObject( memdc, 0 ); - ::DeleteDC( memdc ); - ::ReleaseDC(NULL, hdc); - free(lpDIBh); - free(lpBits); + // + // Create a wxMask object + // + wxMask* pMask = new wxMask(); - // check the wxBitmap object - if( bitmap.GetHBITMAP() ) - bitmap.SetOk( TRUE ); - else - bitmap.SetOk( FALSE ); -*/ + pMask->SetMaskBitmap((WXHBITMAP)hBmp); + SetMask(pMask); + hBmpOld = ::GpiSetBitmap(hPS, hBmp); + } + // + // Free allocated resources + // + ::GpiSetBitmap(hPS, NULLHANDLE); + ::GpiDestroyPS(hPS); + ::DevCloseDC(hDC); + free(pucBits); return TRUE; -} +} // end of wxBitmap::CreateFromImage wxImage wxBitmap::ConvertToImage() const { - wxImage image; - + wxImage vImage; + wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") ); - // create an wxImage object - int width = GetWidth(); - int height = GetHeight(); - image.Create( width, height ); - unsigned char *data = image.GetData(); - if( !data ) + // + // Create an wxImage object + // + int nWidth = GetWidth(); + int nHeight = GetHeight(); + int nDevWidth; + int nDevHeight; + int nBytePerLine = nWidth * 3; + int nSizeDWORD = sizeof(DWORD); + int nLineBoundary = nBytePerLine % nSizeDWORD; + int nPadding = 0; + unsigned char* pData; + unsigned char* lpBits; + 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; + + vImage.Create( nWidth + ,nHeight + ); + pData = vImage.GetData(); + if(!pData) { wxFAIL_MSG( wxT("could not allocate data for image") ); return wxNullImage; } - - // calc the number of bytes per scanline and padding in the DIB - int bytePerLine = width*3; - int sizeDWORD = sizeof( DWORD ); - int lineBoundary = bytePerLine % sizeDWORD; - int padding = 0; - if( lineBoundary > 0 ) + if(nLineBoundary > 0) { - padding = sizeDWORD - lineBoundary; - bytePerLine += padding; + nPadding = nSizeDWORD - nLineBoundary; + nBytePerLine += nPadding; } -// TODO: -/* - // create a DIB header - int headersize = sizeof(BITMAPINFOHEADER); - LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); - if( !lpDIBh ) - { - wxFAIL_MSG( wxT("could not allocate data for DIB header") ); - free( data ); - return; - } - // Fill in the DIB header - lpDIBh->bmiHeader.biSize = headersize; - lpDIBh->bmiHeader.biWidth = width; - lpDIBh->bmiHeader.biHeight = -height; - lpDIBh->bmiHeader.biSizeImage = bytePerLine * height; - lpDIBh->bmiHeader.biPlanes = 1; - lpDIBh->bmiHeader.biBitCount = 24; - lpDIBh->bmiHeader.biCompression = BI_RGB; - lpDIBh->bmiHeader.biClrUsed = 0; - // These seem not really needed for our purpose here. - lpDIBh->bmiHeader.biClrImportant = 0; - lpDIBh->bmiHeader.biXPelsPerMeter = 0; - lpDIBh->bmiHeader.biYPelsPerMeter = 0; - // memory for DIB data - unsigned char *lpBits; - lpBits = (unsigned char *) malloc( lpDIBh->bmiHeader.biSizeImage ); - if( !lpBits ) + wxDisplaySize( &nDevWidth + ,&nDevHeight + ); + // + // Create and fill a DIB header + // + memset(&vDIBh, '\0', 16); + vDIBh.cbFix = 16; + vDIBh.cx = nWidth; + vDIBh.cy = nHeight; + vDIBh.cPlanes = 1; + vDIBh.cBitCount = 24; + + memset(&vDIBInfo, '\0', 16); + vDIBInfo.cbFix = 16; + vDIBInfo.cx = nWidth; + vDIBInfo.cy = nHeight; + vDIBInfo.cPlanes = 1; + vDIBInfo.cBitCount = 24; + + lpBits = (unsigned char *)malloc(nBytePerLine * nHeight); + if (!lpBits) { - wxFAIL_MSG( wxT("could not allocate data for DIB") ); - free( data ); - free( lpDIBh ); - return; + wxFAIL_MSG(wxT("could not allocate data for DIB")); + free(pData); + return wxNullImage; } - // copy data from the device-dependent bitmap to the DIB - HDC hdc = ::GetDC(NULL); - HBITMAP hbitmap; - hbitmap = (HBITMAP) bitmap.GetHBITMAP(); - ::GetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS ); - - // copy DIB data into the wxImage object - int i, j; - unsigned char *ptdata = data; - unsigned char *ptbits = lpBits; - for( i=0; iGetMaskBitmap() ) + // + // Similarly, set data according to the possible mask bitmap + // + if (GetMask() && GetMask()->GetMaskBitmap()) { - hbitmap = (HBITMAP) bitmap.GetMask()->GetMaskBitmap(); - // memory DC created, color set, data copied, and memory DC deleted - HDC memdc = ::CreateCompatibleDC( hdc ); - ::SetTextColor( memdc, RGB( 0, 0, 0 ) ); - ::SetBkColor( memdc, RGB( 255, 255, 255 ) ); - ::GetDIBits( memdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS ); - ::DeleteDC( memdc ); - // background color set to RGB(16,16,16) in consistent with wxGTK - unsigned char r=16, g=16, b=16; - ptdata = data; + hBitmap = (HBITMAP)GetMask()->GetMaskBitmap(); + + // + // Memory DC/PS created, color set, data copied, and memory DC/PS deleted + // + HDC hMemDC = ::DevOpenDC( vHabmain + ,OD_MEMORY + ,"*" + ,4 + ,(PDEVOPENDATA)pszData + ,NULLHANDLE + ); + HPS hMemPS = ::GpiCreatePS( vHabmain + ,hMemDC + ,&vSizlPage + ,PU_PELS | GPIA_ASSOC | GPIT_MICRO + ); + ::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); + + // + // Background color set to RGB(16,16,16) in consistent with wxGTK + // + unsigned char ucRed = 16; + unsigned char ucGreen = 16; + unsigned char ucBlue = 16; + + ptdata = pData; ptbits = lpBits; - for( i=0; im_pBitmapMask = pMask; } // end of wxBitmap::SetMask -// -// Will try something for OS/2 but not really sure how close -// to the msw intent this is. -// wxBitmap wxBitmap::GetBitmapForDC( wxDC& rDc ) const { - wxMemoryDC vMemDC; - wxBitmap vTmpBitmap( this->GetWidth() - ,this->GetHeight() - ,rDc.GetDepth() - ); - WXHBITMAP vOldBitmap; - HPS hMemoryPS; - HPS hPs; - POINTL vPoint[4]; - SIZEL vSize = {0,0}; - - hMemoryPS = ::GpiCreatePS(vHabmain, (HDC)vMemDC.GetHDC(), &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC); - hPs = ::GpiCreatePS(vHabmain, (HDC)rDc.GetHDC(), &vSize, PU_PELS | GPIT_MICRO | GPIA_ASSOC); - - // TODO: Set the points - - vOldBitmap = (WXHBITMAP)::GpiSetBitmap(hPs, (HBITMAP)vTmpBitmap.GetHBITMAP()); - ::GpiBitBlt(hPs, hMemoryPS, 4L, vPoint, ROP_SRCCOPY, BBO_IGNORE); - - return(vTmpBitmap); + return(*this); } // end of wxBitmap::GetBitmapForDC // ---------------------------------------------------------------------------- @@ -1370,3 +1555,4 @@ HBITMAP wxInvertMask( return hBmpInvMask; } // end of WxWinGdi_InvertMask +