X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/e7003166c3bf8f8cbca313addc9d07fa7c21f484..eeccd5d94ce6b11f36af95db4ac528a2e2e0c4c5:/src/msw/bitmap.cpp diff --git a/src/msw/bitmap.cpp b/src/msw/bitmap.cpp index cbb71c3f2e..948d339184 100644 --- a/src/msw/bitmap.cpp +++ b/src/msw/bitmap.cpp @@ -27,21 +27,16 @@ #include "wx/utils.h" #include "wx/app.h" #include "wx/palette.h" +#include "wx/dcmemory.h" #include "wx/bitmap.h" #include "wx/icon.h" #endif -#include "wx/image.h" #include "wx/msw/private.h" #include "wx/log.h" #include "assert.h" -#if wxUSE_XPM_IN_MSW -#define FOR_MSW 1 -#include "../src/xpm/xpm34.h" -#endif - #include "wx/msw/dib.h" #if !USE_SHARED_LIBRARIES @@ -77,7 +72,7 @@ wxBitmapRefData::~wxBitmapRefData(void) m_hBitmap = 0 ; if (m_bitmapMask) -// delete m_bitmapMask; // this line cause an exception + delete m_bitmapMask; m_bitmapMask = NULL; } @@ -96,7 +91,7 @@ wxBitmap::~wxBitmap(void) wxTheBitmapList->DeleteObject(this); } -bool wxBitmap::FreeResource(bool force) +bool wxBitmap::FreeResource(bool WXUNUSED(force)) { if ( !M_BITMAPDATA ) return FALSE; @@ -146,6 +141,12 @@ wxBitmap::wxBitmap(const char bits[], int the_width, int the_height, int no_bits wxTheBitmapList->AddBitmap(this); } +// Create from XPM data +wxBitmap::wxBitmap(char **data, wxItem *WXUNUSED(anItem)) +{ + (void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); +} + wxBitmap::wxBitmap(int w, int h, int d) { (void)Create(w, h, d); @@ -170,14 +171,6 @@ wxBitmap::wxBitmap(const wxString& filename, long type) wxTheBitmapList->AddBitmap(this); } -#if wxUSE_XPM_IN_MSW -// Create from data -wxBitmap::wxBitmap(char **data, wxItem *WXUNUSED(anItem)) -{ - (void) Create((void *)data, wxBITMAP_TYPE_XPM_DATA, 0, 0, 0); -} -#endif - bool wxBitmap::Create(int w, int h, int d) { UnRef(); @@ -194,9 +187,9 @@ bool wxBitmap::Create(int w, int h, int d) } else { - HDC dc = GetDC(NULL); + HDC dc = GetDC((HWND) NULL); M_BITMAPDATA->m_hBitmap = (WXHBITMAP) CreateCompatibleBitmap(dc, w, h); - ReleaseDC(NULL, dc); + ReleaseDC((HWND) NULL, dc); M_BITMAPDATA->m_depth = wxDisplayDepth(); } if (M_BITMAPDATA->m_hBitmap) @@ -345,7 +338,7 @@ wxBitmapHandler *wxBitmap::FindHandler(const wxString& name) while ( node ) { wxBitmapHandler *handler = (wxBitmapHandler *)node->Data(); - if ( handler->GetName() == name ) + if ( (handler->GetName().Cmp(name) == 0) ) return handler; node = node->Next(); } @@ -358,8 +351,8 @@ wxBitmapHandler *wxBitmap::FindHandler(const wxString& extension, long bitmapTyp while ( node ) { wxBitmapHandler *handler = (wxBitmapHandler *)node->Data(); - if ( handler->GetExtension() == extension && - (bitmapType == -1 || handler->GetType() == bitmapType) ) + if ( (handler->GetExtension().Cmp(extension) == 0) && + (bitmapType == -1 || (handler->GetType() == bitmapType)) ) return handler; node = node->Next(); } @@ -392,9 +385,9 @@ wxBitmap wxBitmap::GetBitmapForDC(wxDC& dc) const { wxMemoryDC memDC; wxBitmap tmpBitmap(this->GetWidth(), this->GetHeight(), dc.GetDepth()); - HPALETTE hPal = NULL; + HPALETTE hPal = (HPALETTE) NULL; LPBITMAPINFO lpDib; - void *lpBits = NULL; + void *lpBits = (void*) NULL; /* wxASSERT( this->GetPalette() && this->GetPalette()->Ok() && (this->GetPalette()->GetHPALETTE() != 0) ); @@ -584,18 +577,18 @@ bool wxMask::Create(const wxBitmap& bitmap, const wxColour& colour) IMPLEMENT_DYNAMIC_CLASS(wxBitmapHandler, wxObject) -bool wxBitmapHandler::Create(wxBitmap *bitmap, void *data, long type, int width, int height, int depth) +bool wxBitmapHandler::Create(wxBitmap *WXUNUSED(bitmap), void *WXUNUSED(data), long WXUNUSED(type), int WXUNUSED(width), int WXUNUSED(height), int WXUNUSED(depth)) { return FALSE; } -bool wxBitmapHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long type, - int desiredWidth, int desiredHeight) +bool wxBitmapHandler::LoadFile(wxBitmap *WXUNUSED(bitmap), const wxString& WXUNUSED(name), long WXUNUSED(type), + int WXUNUSED(desiredWidth), int WXUNUSED(desiredHeight)) { return FALSE; } -bool wxBitmapHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette) +bool wxBitmapHandler::SaveFile(wxBitmap *WXUNUSED(bitmap), const wxString& WXUNUSED(name), int WXUNUSED(type), const wxPalette *WXUNUSED(palette)) { return FALSE; } @@ -620,8 +613,8 @@ public: }; IMPLEMENT_DYNAMIC_CLASS(wxBMPResourceHandler, wxBitmapHandler) -bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth, int desiredHeight) +bool wxBMPResourceHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long WXUNUSED(flags), + int WXUNUSED(desiredWidth), int WXUNUSED(desiredHeight)) { // TODO: load colourmap. M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ::LoadBitmap(wxGetInstance(), name); @@ -659,8 +652,8 @@ public: }; IMPLEMENT_DYNAMIC_CLASS(wxBMPFileHandler, wxBitmapHandler) -bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth, int desiredHeight) +bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long WXUNUSED(flags), + int WXUNUSED(desiredWidth), int WXUNUSED(desiredHeight)) { #if wxUSE_IMAGE_LOADING_IN_MSW wxPalette *palette = NULL; @@ -684,7 +677,7 @@ bool wxBMPFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long fla #endif } -bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *pal) +bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int WXUNUSED(type), const wxPalette *pal) { #if wxUSE_IMAGE_LOADING_IN_MSW wxPalette *actualPalette = (wxPalette *)pal; @@ -696,169 +689,6 @@ bool wxBMPFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type #endif } -class WXDLLEXPORT wxXPMFileHandler: public wxBitmapHandler -{ - DECLARE_DYNAMIC_CLASS(wxXPMFileHandler) -public: - inline wxXPMFileHandler(void) - { - m_name = "XPM bitmap file"; - m_extension = "xpm"; - m_type = wxBITMAP_TYPE_XPM; - }; - - virtual bool LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth = -1, int desiredHeight = -1); - virtual bool SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette = NULL); -}; -IMPLEMENT_DYNAMIC_CLASS(wxXPMFileHandler, wxBitmapHandler) - -bool wxXPMFileHandler::LoadFile(wxBitmap *bitmap, const wxString& name, long flags, - int desiredWidth, int desiredHeight) -{ -#if wxUSE_XPM_IN_MSW - XImage *ximage; - XpmAttributes xpmAttr; - HDC dc; - - M_BITMAPHANDLERDATA->m_ok = FALSE; - dc = CreateCompatibleDC(NULL); - if (dc) - { - xpmAttr.valuemask = XpmReturnPixels; - int errorStatus = XpmReadFileToImage(&dc, WXSTRINGCAST name, &ximage, (XImage **) NULL, &xpmAttr); - DeleteDC(dc); - if (errorStatus == XpmSuccess) - { - M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ximage->bitmap; - - BITMAP bm; - GetObject((HBITMAP)M_BITMAPHANDLERDATA->m_hBitmap, sizeof(bm), (LPSTR) & bm); - - M_BITMAPHANDLERDATA->m_width = (bm.bmWidth); - M_BITMAPHANDLERDATA->m_height = (bm.bmHeight); - M_BITMAPHANDLERDATA->m_depth = (bm.bmPlanes * bm.bmBitsPixel); - M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels; - XpmFreeAttributes(&xpmAttr); - XImageFree(ximage); - - M_BITMAPHANDLERDATA->m_ok = TRUE; - return TRUE; - } - else - { - M_BITMAPHANDLERDATA->m_ok = FALSE; - return FALSE; - } - } -#endif - - return FALSE; -} - -bool wxXPMFileHandler::SaveFile(wxBitmap *bitmap, const wxString& name, int type, const wxPalette *palette) -{ -#if wxUSE_XPM_IN_MSW - HDC dc = NULL; - - XImage ximage; - - dc = CreateCompatibleDC(NULL); - if (dc) - { - if (SelectObject(dc, (HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap)) - { - /* for following SetPixel */ - /* fill the XImage struct 'by hand' */ - ximage.width = M_BITMAPHANDLERDATA->m_width; - ximage.height = M_BITMAPHANDLERDATA->m_height; - ximage.depth = M_BITMAPHANDLERDATA->m_depth; - ximage.bitmap = (HBITMAP)M_BITMAPHANDLERDATA->m_hBitmap; - int errorStatus = XpmWriteFileFromImage(&dc, WXSTRINGCAST name, - &ximage, (XImage *) NULL, (XpmAttributes *) NULL); - - if (dc) - DeleteDC(dc); - - if (errorStatus == XpmSuccess) - return TRUE; /* no error */ - else - return FALSE; - } else return FALSE; - } else return FALSE; -#else - return FALSE; -#endif -} - -class WXDLLEXPORT wxXPMDataHandler: public wxBitmapHandler -{ - DECLARE_DYNAMIC_CLASS(wxXPMDataHandler) -public: - inline wxXPMDataHandler(void) - { - m_name = "XPM bitmap data"; - m_extension = "xpm"; - m_type = wxBITMAP_TYPE_XPM_DATA; - }; - - virtual bool Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth = 1); -}; -IMPLEMENT_DYNAMIC_CLASS(wxXPMDataHandler, wxBitmapHandler) - -bool wxXPMDataHandler::Create(wxBitmap *bitmap, void *data, long flags, int width, int height, int depth) -{ -#if wxUSE_XPM_IN_MSW - XImage *ximage; - int ErrorStatus; - XpmAttributes xpmAttr; - HDC dc; - - M_BITMAPHANDLERDATA->m_ok = FALSE; - M_BITMAPHANDLERDATA->m_numColors = 0; - - dc = CreateCompatibleDC(NULL); /* memory DC */ - - if (dc) - { - xpmAttr.valuemask = XpmReturnInfos; /* get infos back */ - ErrorStatus = XpmCreateImageFromData(&dc, (char **)data, - &ximage, (XImage **) NULL, &xpmAttr); - - if (ErrorStatus == XpmSuccess) - { - /* ximage is malloced and contains bitmap and attributes */ - M_BITMAPHANDLERDATA->m_hBitmap = (WXHBITMAP) ximage->bitmap; - - BITMAP bm; - GetObject((HBITMAP) M_BITMAPHANDLERDATA->m_hBitmap, sizeof(bm), (LPSTR) & bm); - - M_BITMAPHANDLERDATA->m_width = (bm.bmWidth); - M_BITMAPHANDLERDATA->m_height = (bm.bmHeight); - M_BITMAPHANDLERDATA->m_depth = (bm.bmPlanes * bm.bmBitsPixel); - M_BITMAPHANDLERDATA->m_numColors = xpmAttr.npixels; - XpmFreeAttributes(&xpmAttr); - - XImageFree(ximage); // releases the malloc, but does not detroy - // the bitmap - M_BITMAPHANDLERDATA->m_ok = TRUE; - DeleteDC(dc); - - return TRUE; - } - else - { - M_BITMAPHANDLERDATA->m_ok = FALSE; -// XpmDebugError(ErrorStatus, NULL); - DeleteDC(dc); - return FALSE; - } - } -#endif - - return FALSE; -} - void wxBitmap::CleanUpHandlers(void) { wxNode *node = sm_handlers.First(); @@ -876,8 +706,12 @@ void wxBitmap::InitStandardHandlers(void) { AddHandler(new wxBMPResourceHandler); AddHandler(new wxBMPFileHandler); - AddHandler(new wxXPMFileHandler); - AddHandler(new wxXPMDataHandler); + + // Not added by default: include xpmhand.h in your app + // and call these in your wxApp::OnInit. +// AddHandler(new wxXPMFileHandler); +// AddHandler(new wxXPMDataHandler); + AddHandler(new wxICOResourceHandler); AddHandler(new wxICOFileHandler); } @@ -943,230 +777,3 @@ static long freeDIB(LPBITMAPINFO lpDIBHeader) } -//----------------------------------------------------------------------------- -// also implemented here from wxImage -//----------------------------------------------------------------------------- - -/* -class wxImage : wxGDIObject -{ - wxImage( const wxBitmap &bitmap ); - wxBitmap ConvertToBitmap() const; -} -*/ - - -wxBitmap wxImage::ConvertToBitmap() const -{ - - wxBitmap bitmap; - wxCHECK_MSG( Ok(), bitmap, "invalid image" ); - int width = GetWidth(); - int height = GetHeight(); - bitmap.SetWidth( width ); - bitmap.SetHeight( height ); - bitmap.SetDepth( wxDisplayDepth() ); - - int headersize = sizeof(BITMAPINFOHEADER); - LPBITMAPINFO lpDIBh = (BITMAPINFO *) malloc( headersize ); - wxCHECK_MSG( lpDIBh, bitmap, "could not allocate memory for DIB header" ); - -// Fill in the DIB header - lpDIBh->bmiHeader.biSize = headersize; - lpDIBh->bmiHeader.biWidth = width; - lpDIBh->bmiHeader.biHeight = -height; - lpDIBh->bmiHeader.biSizeImage = width * height * 3; - - lpDIBh->bmiHeader.biPlanes = 1; - lpDIBh->bmiHeader.biBitCount = 24; - lpDIBh->bmiHeader.biCompression = BI_RGB; - lpDIBh->bmiHeader.biClrUsed = 0; - -// These seem not needed for our purpose here. -// lpDIBh->bmiHeader.biClrImportant = 0; -// lpDIBh->bmiHeader.biXPelsPerMeter = 0; -// lpDIBh->bmiHeader.biYPelsPerMeter = 0; - - unsigned char *lpBits = (unsigned char *) malloc( width*height*3 ); - if( !lpBits ) - { - wxFAIL_MSG( "could not allocate memory for DIB" ); - free( lpDIBh ); - return bitmap; - } - - unsigned char *data = GetData(); - - unsigned char *ptdata = data, *ptbits = lpBits; - for( int i=0; ibmiHeader), 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 ); - - bitmap.SetHBITMAP( (WXHBITMAP) hbitmap ); - - if( HasMask() ) - { - unsigned char r = GetMaskRed(); - unsigned char g = GetMaskGreen(); - unsigned char b = GetMaskBlue(); - unsigned char zero = 0, one = 255; - ptdata = data; - ptbits = lpBits; - for( int i=0; ibmiHeader.biSize = headersize; - lpDIBh->bmiHeader.biWidth = width; - lpDIBh->bmiHeader.biHeight = -height; - lpDIBh->bmiHeader.biSizeImage = width * height * 3; - - lpDIBh->bmiHeader.biPlanes = 1; - lpDIBh->bmiHeader.biBitCount = 24; - lpDIBh->bmiHeader.biCompression = BI_RGB; - lpDIBh->bmiHeader.biClrUsed = 0; - -// These seem not needed for our purpose here. -// lpDIBh->bmiHeader.biClrImportant = 0; -// lpDIBh->bmiHeader.biXPelsPerMeter = 0; -// lpDIBh->bmiHeader.biYPelsPerMeter = 0; - - unsigned char *lpBits = (unsigned char *) malloc( width*height*3 ); - if( !lpBits ) - { - wxFAIL_MSG( "could not allocate data for DIB" ); - free( data ); - free( lpDIBh ); - return; - } - - HBITMAP hbitmap; - hbitmap = (HBITMAP) bitmap.GetHBITMAP(); - HDC hdc = ::GetDC(NULL); - ::GetDIBits( hdc, hbitmap, 0, height, lpBits, lpDIBh, DIB_RGB_COLORS ); - - unsigned char *ptdata = data, *ptbits = lpBits; - for( int i=0; iGetMaskBitmap() ) - { - hbitmap = (HBITMAP) bitmap.GetMask()->GetMaskBitmap(); - 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 ); - unsigned char r=16, g=16, b=16; // background set to RGB(16,16,16) - ptdata = data; - ptbits = lpBits; - for( int i=0; i