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
This commit is contained in:
Vadim Zeitlin
2004-07-22 11:43:57 +00:00
parent 0ca3b64f14
commit dd779a9e66
2 changed files with 29 additions and 10 deletions

View File

@@ -41,6 +41,10 @@ public:
wxDIB(const wxBitmap& bmp) wxDIB(const wxBitmap& bmp)
{ Init(); (void)Create(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) // load a DIB from file (any depth is supoprted here unlike above)
// //
// as above, use IsOk() to see if the bitmap was loaded successfully // 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 // same as the corresponding ctors but with return value
bool Create(int width, int height, int depth); bool Create(int width, int height, int depth);
bool Create(const wxBitmap& bmp); bool Create(const wxBitmap& bmp);
bool Create(HBITMAP hbmp);
bool Load(const wxString& filename); bool Load(const wxString& filename);
// dtor is not virtual, this class is not meant to be used polymorphically // dtor is not virtual, this class is not meant to be used polymorphically
@@ -60,7 +65,7 @@ public:
// ---------- // ----------
#ifndef __WXWINCE__ #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 // return its handle, the caller is responsible for freeing it (using
// DeleteObject()) // DeleteObject())
HBITMAP CreateDDB(HDC hdc = 0) const; 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 // get raw pointer to bitmap bits, you should know what you do if you
// decide to use it // decide to use it
void *GetData() const { DoGetObject(); return m_data; } unsigned char *GetData() const
{ DoGetObject(); return (unsigned char *)m_data; }
// HBITMAP conversion // HBITMAP conversion

View File

@@ -151,10 +151,18 @@ bool wxDIB::Create(const wxBitmap& bmp)
{ {
wxCHECK_MSG( bmp.Ok(), false, _T("wxDIB::Create(): invalid bitmap") ); 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 // this bitmap could already be a DIB section in which case we don't need
// to convert it to DIB // to convert it to DIB
HBITMAP hbmp = GetHbitmapOf(bmp);
DIBSECTION ds; DIBSECTION ds;
if ( GetDIBSection(hbmp, &ds) ) if ( GetDIBSection(hbmp, &ds) )
{ {
@@ -172,17 +180,22 @@ bool wxDIB::Create(const wxBitmap& bmp)
} }
else // no, it's a DDB -- convert it to DIB else // no, it's a DDB -- convert it to DIB
{ {
const int w = bmp.GetWidth(); // prepare all the info we need
const int h = bmp.GetHeight(); BITMAP bm;
int d = bmp.GetDepth(); if ( !::GetObject(hbmp, sizeof(bm), &bm) )
if ( d <= 0 ) {
d = wxDisplayDepth(); wxLogLastError(wxT("GetObject(bitmap)"));
if ( !Create(w, h, d) || !CopyFromDDB(hbmp) )
return false; return false;
} }
m_hasAlpha = bmp.HasAlpha(); int d = bm.bmBitsPixel;
if ( d <= 0 )
d = wxDisplayDepth();
if ( !Create(bm.bmWidth, bm.bmHeight, d) || !CopyFromDDB(hbmp) )
return false;
}
return true; return true;
} }