From dd779a9e66c640907048ab02cb4a853ae45ea94c Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Thu, 22 Jul 2004 11:43:57 +0000 Subject: [PATCH] added wxDIB(HBITMAP) ctor and corresponding Create(); made GetData() return uchar * and not void * git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@28390 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/msw/dib.h | 10 ++++++++-- src/msw/dib.cpp | 29 +++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 10 deletions(-) diff --git a/include/wx/msw/dib.h b/include/wx/msw/dib.h index 48f9382010..0a9fd4587a 100644 --- a/include/wx/msw/dib.h +++ b/include/wx/msw/dib.h @@ -41,6 +41,10 @@ public: wxDIB(const wxBitmap& bmp) { Init(); (void)Create(bmp); } + // create a DIB from the Windows DDB + wxDIB(HBITMAP hbmp) + { Init(); (void)Create(hbmp); } + // load a DIB from file (any depth is supoprted here unlike above) // // as above, use IsOk() to see if the bitmap was loaded successfully @@ -50,6 +54,7 @@ public: // same as the corresponding ctors but with return value bool Create(int width, int height, int depth); bool Create(const wxBitmap& bmp); + bool Create(HBITMAP hbmp); bool Load(const wxString& filename); // dtor is not virtual, this class is not meant to be used polymorphically @@ -60,7 +65,7 @@ public: // ---------- #ifndef __WXWINCE__ - // create a bitmap compatiblr with the given HDC (or screen by default) and + // create a bitmap compatible with the given HDC (or screen by default) and // return its handle, the caller is responsible for freeing it (using // DeleteObject()) HBITMAP CreateDDB(HDC hdc = 0) const; @@ -98,7 +103,8 @@ public: // get raw pointer to bitmap bits, you should know what you do if you // decide to use it - void *GetData() const { DoGetObject(); return m_data; } + unsigned char *GetData() const + { DoGetObject(); return (unsigned char *)m_data; } // HBITMAP conversion diff --git a/src/msw/dib.cpp b/src/msw/dib.cpp index 2e0eeddd7b..a7eebe54f2 100644 --- a/src/msw/dib.cpp +++ b/src/msw/dib.cpp @@ -151,10 +151,18 @@ bool wxDIB::Create(const wxBitmap& bmp) { wxCHECK_MSG( bmp.Ok(), false, _T("wxDIB::Create(): invalid bitmap") ); + if ( !Create(GetHbitmapOf(bmp)) ) + return false; + + m_hasAlpha = bmp.HasAlpha(); + + return true; +} + +bool wxDIB::Create(HBITMAP hbmp) +{ // this bitmap could already be a DIB section in which case we don't need // to convert it to DIB - HBITMAP hbmp = GetHbitmapOf(bmp); - DIBSECTION ds; if ( GetDIBSection(hbmp, &ds) ) { @@ -172,18 +180,23 @@ bool wxDIB::Create(const wxBitmap& bmp) } else // no, it's a DDB -- convert it to DIB { - const int w = bmp.GetWidth(); - const int h = bmp.GetHeight(); - int d = bmp.GetDepth(); + // prepare all the info we need + BITMAP bm; + if ( !::GetObject(hbmp, sizeof(bm), &bm) ) + { + wxLogLastError(wxT("GetObject(bitmap)")); + + return false; + } + + int d = bm.bmBitsPixel; if ( d <= 0 ) d = wxDisplayDepth(); - if ( !Create(w, h, d) || !CopyFromDDB(hbmp) ) + if ( !Create(bm.bmWidth, bm.bmHeight, d) || !CopyFromDDB(hbmp) ) return false; } - m_hasAlpha = bmp.HasAlpha(); - return true; } -- 2.45.2