X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/68f36a2ca14a0005874f3343391f85f4aa084f99..54a96d029f6864182e5e49e7d5b2e133be6d3d51:/src/msw/bitmap.cpp?ds=inline diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index 4f60c09474..97a886aff9 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -88,6 +88,7 @@ void wxBitmapRefData::Free() if ( m_hBitmap) { + // printf("About to delete bitmap %d\n", (int) (HBITMAP) m_hBitmap); if ( !::DeleteObject((HBITMAP)m_hBitmap) ) { wxLogLastError(wxT("DeleteObject(hbitmap)")); @@ -107,8 +108,6 @@ void wxBitmap::Init() { // m_refData = NULL; done in the base class ctor - if ( wxTheBitmapList ) - wxTheBitmapList->AddBitmap(this); } #ifdef __WIN32__ @@ -222,8 +221,6 @@ bool wxBitmap::CopyFromIcon(const wxIcon& icon) wxBitmap::~wxBitmap() { - if (wxTheBitmapList) - wxTheBitmapList->DeleteObject(this); } wxBitmap::wxBitmap(const char bits[], int width, int height, int depth) @@ -336,7 +333,6 @@ wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type) bool wxBitmap::Create(int w, int h, int d) { -#ifndef __WXMICROWIN__ UnRef(); m_refData = new wxBitmapRefData; @@ -346,7 +342,7 @@ bool wxBitmap::Create(int w, int h, int d) GetBitmapData()->m_depth = d; HBITMAP hbmp; - +#ifndef __WXMICROWIN__ if ( d > 0 ) { hbmp = ::CreateBitmap(w, h, 1, d, NULL); @@ -356,6 +352,7 @@ bool wxBitmap::Create(int w, int h, int d) } } else +#endif { ScreenHDC dc; hbmp = ::CreateCompatibleBitmap(dc, w, h); @@ -373,9 +370,6 @@ bool wxBitmap::Create(int w, int h, int d) GetBitmapData()->m_ok = hbmp != 0; #endif // WXWIN_COMPATIBILITY_2 return Ok(); -#else - return FALSE; -#endif } // ---------------------------------------------------------------------------- @@ -387,8 +381,61 @@ bool wxBitmap::Create(int w, int h, int d) bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) { #ifdef __WXMICROWIN__ - // TODO - return FALSE; + m_refData = new wxBitmapRefData(); + + // Initial attempt at a simple-minded implementation. + // The bitmap will always be created at the screen depth, + // so the 'depth' argument is ignored. + // TODO: transparency (create a mask image) + + HDC hScreenDC = ::GetDC(NULL); + int screenDepth = ::GetDeviceCaps(hScreenDC, BITSPIXEL); + + HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC, image.GetWidth(), image.GetHeight()); + // printf("Created bitmap %d\n", (int) hBitmap); + if (hBitmap == NULL) + { + ::ReleaseDC(NULL, hScreenDC); + return FALSE; + } + HDC hMemDC = ::CreateCompatibleDC(hScreenDC); + ::ReleaseDC(NULL, hScreenDC); + + HBITMAP hOldBitmap = ::SelectObject(hMemDC, hBitmap); + + int i, j; + for (i = 0; i < image.GetWidth(); i++) + { + for (j = 0; j < image.GetHeight(); j++) + { + unsigned char red = image.GetRed(i, j); + unsigned char green = image.GetGreen(i, j); + unsigned char blue = image.GetBlue(i, j); + + ::SetPixel(hMemDC, i, j, PALETTERGB(red, green, blue)); + } + } + + ::SelectObject(hMemDC, hOldBitmap); + ::DeleteDC(hMemDC); + + SetWidth(image.GetWidth()); + SetHeight(image.GetHeight()); + SetDepth(screenDepth); + SetHBITMAP( (WXHBITMAP) hBitmap ); + +#if wxUSE_PALETTE + // Copy the palette from the source image + SetPalette(image.GetPalette()); +#endif // wxUSE_PALETTE + +#if WXWIN_COMPATIBILITY_2 + // check the wxBitmap object + GetBitmapData()->SetOk(); +#endif // WXWIN_COMPATIBILITY_2 + + return TRUE; + #else wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") ) @@ -435,8 +482,10 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) if (depth == -1) depth = wxDisplayDepth(); SetDepth( depth ); +#if wxUSE_PALETTE // Copy the palette from the source image SetPalette(image.GetPalette()); +#endif // wxUSE_PALETTE // create a DIB header int headersize = sizeof(BITMAPINFOHEADER); @@ -616,8 +665,6 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) GetBitmapData()->SetOk(); #endif // WXWIN_COMPATIBILITY_2 - if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this); - return TRUE; #endif } @@ -625,9 +672,68 @@ bool wxBitmap::CreateFromImage( const wxImage& image, int depth ) wxImage wxBitmap::ConvertToImage() const { #ifdef __WXMICROWIN__ - // TODO - return wxImage(); -#else + // Initial attempt at a simple-minded implementation. + // The bitmap will always be created at the screen depth, + // so the 'depth' argument is ignored. + // TODO: transparency (create a mask image) + + if (!Ok()) + { + wxFAIL_MSG( wxT("bitmap is invalid") ); + return wxNullImage; + } + + wxImage image; + + 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 ) + { + wxFAIL_MSG( wxT("could not allocate data for image") ); + return wxNullImage; + } + + HDC hScreenDC = ::GetDC(NULL); + + HDC hMemDC = ::CreateCompatibleDC(hScreenDC); + ::ReleaseDC(NULL, hScreenDC); + + HBITMAP hBitmap = (HBITMAP) GetHBITMAP(); + + HBITMAP hOldBitmap = ::SelectObject(hMemDC, hBitmap); + + int i, j; + for (i = 0; i < GetWidth(); i++) + { + for (j = 0; j < GetHeight(); j++) + { + COLORREF color = ::GetPixel(hMemDC, i, j); + unsigned char red = GetRValue(color); + unsigned char green = GetGValue(color); + unsigned char blue = GetBValue(color); + + image.SetRGB(i, j, red, green, blue); + } + } + + ::SelectObject(hMemDC, hOldBitmap); + ::DeleteDC(hMemDC); + +#if wxUSE_PALETTE + // Copy the palette from the source image + if (GetPalette()) + image.SetPalette(* GetPalette()); +#endif // wxUSE_PALETTE + + return image; + +#else // __MICROWIN__ + wxImage image; wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") ); @@ -920,7 +1026,7 @@ void wxBitmap::SetMask(wxMask *mask) wxBitmap wxBitmap::GetBitmapForDC(wxDC& dc) const { #ifdef __WXMICROWIN__ - return wxBitmap(); + return *this; #else wxMemoryDC memDC; wxBitmap tmpBitmap(GetWidth(), GetHeight(), dc.GetDepth()); @@ -1087,7 +1193,7 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) // scan the bitmap for the transparent colour and set the corresponding // pixels in the mask to BLACK and the rest to WHITE - COLORREF maskColour = wxColourToRGB(colour); + COLORREF maskColour = RGB(colour.Red(), colour.Green(), colour.Blue()); m_maskBitmap = (WXHBITMAP)::CreateBitmap(width, height, 1, 1, 0); HDC srcDC = ::CreateCompatibleDC(NULL);