if ( m_hBitmap)
{
+ // printf("About to delete bitmap %d\n", (int) (HBITMAP) m_hBitmap);
if ( !::DeleteObject((HBITMAP)m_hBitmap) )
{
wxLogLastError(wxT("DeleteObject(hbitmap)"));
{
// m_refData = NULL; done in the base class ctor
- if ( wxTheBitmapList )
- wxTheBitmapList->AddBitmap(this);
}
#ifdef __WIN32__
wxBitmap::~wxBitmap()
{
- if (wxTheBitmapList)
- wxTheBitmapList->DeleteObject(this);
}
wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
bool wxBitmap::Create(int w, int h, int d)
{
-#ifndef __WXMICROWIN__
UnRef();
m_refData = new wxBitmapRefData;
GetBitmapData()->m_depth = d;
HBITMAP hbmp;
-
+#ifndef __WXMICROWIN__
if ( d > 0 )
{
hbmp = ::CreateBitmap(w, h, 1, d, NULL);
}
}
else
+#endif
{
ScreenHDC dc;
hbmp = ::CreateCompatibleBitmap(dc, w, h);
GetBitmapData()->m_ok = hbmp != 0;
#endif // WXWIN_COMPATIBILITY_2
return Ok();
-#else
- return FALSE;
-#endif
}
// ----------------------------------------------------------------------------
bool wxBitmap::CreateFromImage( const wxImage& image, int depth )
{
#ifdef __WXMICROWIN__
- // TODO
- return FALSE;
+ m_refData = new wxBitmapRefData();
+
+ // Initial attempt at a simple-minded implementation.
+ // The bitmap will always be created at the screen depth,
+ // so the 'depth' argument is ignored.
+ // TODO: transparency (create a mask image)
+
+ HDC hScreenDC = ::GetDC(NULL);
+ int screenDepth = ::GetDeviceCaps(hScreenDC, BITSPIXEL);
+
+ HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC, image.GetWidth(), image.GetHeight());
+ // printf("Created bitmap %d\n", (int) hBitmap);
+ if (hBitmap == NULL)
+ {
+ ::ReleaseDC(NULL, hScreenDC);
+ return FALSE;
+ }
+ HDC hMemDC = ::CreateCompatibleDC(hScreenDC);
+ ::ReleaseDC(NULL, hScreenDC);
+
+ HBITMAP hOldBitmap = ::SelectObject(hMemDC, hBitmap);
+
+ int i, j;
+ for (i = 0; i < image.GetWidth(); i++)
+ {
+ for (j = 0; j < image.GetHeight(); j++)
+ {
+ unsigned char red = image.GetRed(i, j);
+ unsigned char green = image.GetGreen(i, j);
+ unsigned char blue = image.GetBlue(i, j);
+
+ ::SetPixel(hMemDC, i, j, PALETTERGB(red, green, blue));
+ }
+ }
+
+ ::SelectObject(hMemDC, hOldBitmap);
+ ::DeleteDC(hMemDC);
+
+ SetWidth(image.GetWidth());
+ SetHeight(image.GetHeight());
+ SetDepth(screenDepth);
+ SetHBITMAP( (WXHBITMAP) hBitmap );
+
+#if wxUSE_PALETTE
+ // Copy the palette from the source image
+ SetPalette(image.GetPalette());
+#endif // wxUSE_PALETTE
+
+#if WXWIN_COMPATIBILITY_2
+ // check the wxBitmap object
+ GetBitmapData()->SetOk();
+#endif // WXWIN_COMPATIBILITY_2
+
+ return TRUE;
+
#else
wxCHECK_MSG( image.Ok(), FALSE, wxT("invalid image") )
if (depth == -1) depth = wxDisplayDepth();
SetDepth( depth );
+#if wxUSE_PALETTE
// Copy the palette from the source image
SetPalette(image.GetPalette());
+#endif // wxUSE_PALETTE
// create a DIB header
int headersize = sizeof(BITMAPINFOHEADER);
GetBitmapData()->SetOk();
#endif // WXWIN_COMPATIBILITY_2
- if (wxTheBitmapList) wxTheBitmapList->AddBitmap(this);
-
return TRUE;
#endif
}
wxImage wxBitmap::ConvertToImage() const
{
#ifdef __WXMICROWIN__
- // TODO
- return wxImage();
-#else
+ // Initial attempt at a simple-minded implementation.
+ // The bitmap will always be created at the screen depth,
+ // so the 'depth' argument is ignored.
+ // TODO: transparency (create a mask image)
+
+ if (!Ok())
+ {
+ wxFAIL_MSG( wxT("bitmap is invalid") );
+ return wxNullImage;
+ }
+
+ wxImage image;
+
+ wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") );
+
+ // create an wxImage object
+ int width = GetWidth();
+ int height = GetHeight();
+ image.Create( width, height );
+ unsigned char *data = image.GetData();
+ if( !data )
+ {
+ wxFAIL_MSG( wxT("could not allocate data for image") );
+ return wxNullImage;
+ }
+
+ HDC hScreenDC = ::GetDC(NULL);
+
+ HDC hMemDC = ::CreateCompatibleDC(hScreenDC);
+ ::ReleaseDC(NULL, hScreenDC);
+
+ HBITMAP hBitmap = (HBITMAP) GetHBITMAP();
+
+ HBITMAP hOldBitmap = ::SelectObject(hMemDC, hBitmap);
+
+ int i, j;
+ for (i = 0; i < GetWidth(); i++)
+ {
+ for (j = 0; j < GetHeight(); j++)
+ {
+ COLORREF color = ::GetPixel(hMemDC, i, j);
+ unsigned char red = GetRValue(color);
+ unsigned char green = GetGValue(color);
+ unsigned char blue = GetBValue(color);
+
+ image.SetRGB(i, j, red, green, blue);
+ }
+ }
+
+ ::SelectObject(hMemDC, hOldBitmap);
+ ::DeleteDC(hMemDC);
+
+#if wxUSE_PALETTE
+ // Copy the palette from the source image
+ if (GetPalette())
+ image.SetPalette(* GetPalette());
+#endif // wxUSE_PALETTE
+
+ return image;
+
+#else // __MICROWIN__
+
wxImage image;
wxCHECK_MSG( Ok(), wxNullImage, wxT("invalid bitmap") );
wxBitmap wxBitmap::GetBitmapForDC(wxDC& dc) const
{
#ifdef __WXMICROWIN__
- return wxBitmap();
+ return *this;
#else
wxMemoryDC memDC;
wxBitmap tmpBitmap(GetWidth(), GetHeight(), dc.GetDepth());
// scan the bitmap for the transparent colour and set the corresponding
// pixels in the mask to BLACK and the rest to WHITE
- COLORREF maskColour = wxColourToRGB(colour);
+ COLORREF maskColour = RGB(colour.Red(), colour.Green(), colour.Blue());
m_maskBitmap = (WXHBITMAP)::CreateBitmap(width, height, 1, 1, 0);
HDC srcDC = ::CreateCompatibleDC(NULL);