#pragma hdrstop
#endif
+#if wxUSE_WXDIB
+
#ifndef WX_PRECOMP
#include "wx/string.h"
#include "wx/log.h"
+ #include "wx/intl.h"
+ #include "wx/bitmap.h"
+ #include "wx/image.h"
#endif //WX_PRECOMP
-#if wxUSE_WXDIB
-
-#include "wx/bitmap.h"
-#include "wx/intl.h"
#include "wx/file.h"
#include <stdio.h>
#include <memory.h>
#endif
-#include "wx/image.h"
#include "wx/msw/dib.h"
#ifdef __WXWINCE__
return NULL;
}
- if ( !ConvertFromBitmap((BITMAPINFO *)(void *)GlobalPtr(hDIB), hbmp) )
+ if ( !ConvertFromBitmap((BITMAPINFO *)(void *)GlobalPtrLock(hDIB), hbmp) )
{
// this really shouldn't happen... it worked the first time, why not
// now?
// and the colour table
wxCharBuffer rgb(sizeof(RGBQUAD) * biClrUsed);
RGBQUAD *pRGB = (RGBQUAD*)rgb.data();
- SelectInHDC(hDC, m_handle);
+ SelectInHDC selectHandle(hDC, m_handle);
::GetDIBColorTable(hDC, 0, biClrUsed, pRGB);
for ( DWORD i = 0; i < biClrUsed; i++, pRGB++ )
{
dst[1] = *src++;
dst[0] = *src++;
- dst += 3;
-
if ( is32bit )
{
if ( alpha )
- *alpha++ = *src;
+ {
+ // wxImage uses non premultiplied alpha so undo
+ // premultiplication done in Create() above
+ const unsigned char a = *src;
+ *alpha++ = a;
+ if ( a > 0 )
+ {
+ dst[0] = (dst[0] * 255 - 127) / a;
+ dst[1] = (dst[1] * 255 - 127) / a;
+ dst[2] = (dst[2] * 255 - 127) / a;
+ }
+ }
+
src++;
}
+
+ dst += 3;
}
// pass to the previous line in the image
#endif // wxUSE_IMAGE
#endif // wxUSE_WXDIB
-