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:
@@ -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)"));
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user