fixes for Win95 (where GetObject(DIBSECTION) is broken)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@20209 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2003-04-14 00:59:48 +00:00
parent 30ad0a1469
commit 3692b94818

View File

@@ -12,8 +12,7 @@
/* /*
TODO: support for palettes is very incomplete, several functions simply TODO: support for palettes is very incomplete, several functions simply
ignore them (we should select and realize the palette, if any, before ignore them (we should select and realize the palette, if any, before
caling GetDIBits() in the DC we use with it and we shouldn't use caling GetDIBits() in the DC we use with it.
GetBitmapBits() at all because we can't do it with it)
*/ */
// ============================================================================ // ============================================================================
@@ -60,13 +59,24 @@
// calculate the number of palette entries needed for the bitmap with this // calculate the number of palette entries needed for the bitmap with this
// number of bits per pixel // number of bits per pixel
static WORD wxGetNumOfBitmapColors(WORD bitsPerPixel) static inline WORD wxGetNumOfBitmapColors(WORD bitsPerPixel)
{ {
// only 1, 4 and 8bpp bitmaps use palettes (well, they could be used with // only 1, 4 and 8bpp bitmaps use palettes (well, they could be used with
// 24bpp ones too but we don't support this as I think it's quite uncommon) // 24bpp ones too but we don't support this as I think it's quite uncommon)
return bitsPerPixel <= 8 ? 1 << bitsPerPixel : 0; return bitsPerPixel <= 8 ? 1 << bitsPerPixel : 0;
} }
// wrapper around ::GetObject() for DIB sections
static inline bool GetDIBSection(HBITMAP hbmp, DIBSECTION *ds)
{
// note that at least under Win9x (this doesn't seem to happen under Win2K
// but this doesn't mean anything, of course), GetObject() may return
// sizeof(DIBSECTION) for a bitmap which is *not* a DIB section and the way
// to check for it is by looking at the bits pointer
return ::GetObject(hbmp, sizeof(DIBSECTION), ds) == sizeof(DIBSECTION) &&
ds->dsBm.bmBits;
}
// ============================================================================ // ============================================================================
// implementation // implementation
// ============================================================================ // ============================================================================
@@ -137,7 +147,7 @@ bool wxDIB::Create(const wxBitmap& bmp)
HBITMAP hbmp = GetHbitmapOf(bmp); HBITMAP hbmp = GetHbitmapOf(bmp);
DIBSECTION ds; DIBSECTION ds;
if ( ::GetObject(hbmp, sizeof(ds), &ds) == sizeof(ds) ) if ( GetDIBSection(hbmp, &ds) )
{ {
m_handle = hbmp; m_handle = hbmp;
@@ -162,12 +172,23 @@ bool wxDIB::Create(const wxBitmap& bmp)
if ( !Create(w, h, d) ) if ( !Create(w, h, d) )
return false; return false;
// we could have used GetDIBits() too but GetBitmapBits() is simpler if ( !GetDIBSection(m_handle, &ds) )
if ( !::GetBitmapBits {
// we've just created a new DIB section, why should this fail?
wxFAIL_MSG( _T("GetObject(DIBSECTION) unexpectedly failed") );
return false;
}
if ( !::GetDIBits
( (
GetHbitmapOf(bmp), // the source DDB ScreenHDC(), // the DC to use
GetLineSize(w, d)*h, // the number of bytes to copy hbmp, // the source DDB
m_data // the pixels will be copied here 0, // first scan line
h, // number of lines to copy
ds.dsBm.bmBits, // pointer to the buffer
(BITMAPINFO *)&ds.dsBmih, // bitmap header
DIB_RGB_COLORS // and not DIB_PAL_COLORS
) ) ) )
{ {
wxLogLastError(wxT("GetDIBits()")); wxLogLastError(wxT("GetDIBits()"));
@@ -212,7 +233,7 @@ bool wxDIB::Save(const wxString& filename)
if ( ok ) if ( ok )
{ {
DIBSECTION ds; DIBSECTION ds;
if ( !::GetObject(m_handle, sizeof(ds), &ds) ) if ( !GetDIBSection(m_handle, &ds) )
{ {
wxLogLastError(_T("GetObject(hDIB)")); wxLogLastError(_T("GetObject(hDIB)"));
} }
@@ -261,7 +282,7 @@ void wxDIB::DoGetObject() const
// check for this now rather than trying to find out why it doesn't // check for this now rather than trying to find out why it doesn't
// work later // work later
DIBSECTION ds; DIBSECTION ds;
if ( !::GetObject(m_handle, sizeof(ds), &ds) ) if ( !GetDIBSection(m_handle, &ds) )
{ {
wxLogLastError(_T("GetObject(hDIB)")); wxLogLastError(_T("GetObject(hDIB)"));
return; return;
@@ -285,7 +306,7 @@ HBITMAP wxDIB::CreateDDB(HDC hdc) const
wxCHECK_MSG( m_handle, 0, _T("wxDIB::CreateDDB(): invalid object") ); wxCHECK_MSG( m_handle, 0, _T("wxDIB::CreateDDB(): invalid object") );
DIBSECTION ds; DIBSECTION ds;
if ( !::GetObject(m_handle, sizeof(ds), &ds) ) if ( !GetDIBSection(m_handle, &ds) )
{ {
wxLogLastError(_T("GetObject(hDIB)")); wxLogLastError(_T("GetObject(hDIB)"));
@@ -440,7 +461,7 @@ HGLOBAL wxDIB::ConvertFromBitmap(HBITMAP hbmp)
return NULL; return NULL;
} }
if ( !ConvertFromBitmap((BITMAPINFO *)GlobalPtr(hDIB), hbmp) ) if ( !ConvertFromBitmap((BITMAPINFO *)(void *)GlobalPtr(hDIB), hbmp) )
{ {
// this really shouldn't happen... it worked the first time, why not // this really shouldn't happen... it worked the first time, why not
// now? // now?
@@ -463,7 +484,7 @@ wxPalette *wxDIB::CreatePalette() const
wxCHECK_MSG( m_handle, NULL, _T("wxDIB::CreatePalette(): invalid object") ); wxCHECK_MSG( m_handle, NULL, _T("wxDIB::CreatePalette(): invalid object") );
DIBSECTION ds; DIBSECTION ds;
if ( !::GetObject(m_handle, sizeof(ds), &ds) ) if ( !GetDIBSection(m_handle, &ds) )
{ {
wxLogLastError(_T("GetObject(hDIB)")); wxLogLastError(_T("GetObject(hDIB)"));