////////////////////////////////////////////////////////////////////////////
-// Name: bitmap.cpp
+// Name: src/msw/bitmap.cpp
// Purpose: wxBitmap
// Author: Julian Smart
// Modified by:
// headers
// ----------------------------------------------------------------------------
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "bitmap.h"
-#endif
-
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#pragma hdrstop
#endif
+#include "wx/bitmap.h"
+
#ifndef WX_PRECOMP
#include <stdio.h>
#include "wx/app.h"
#include "wx/palette.h"
#include "wx/dcmemory.h"
- #include "wx/bitmap.h"
#include "wx/icon.h"
+ #include "wx/log.h"
#endif
#include "wx/msw/private.h"
-#include "wx/log.h"
#if wxUSE_WXDIB
#include "wx/msw/dib.h"
// wxBitmap creation
// ----------------------------------------------------------------------------
-// this function should be called from all wxBitmap ctors
-void wxBitmap::Init()
-{
- // m_refData = NULL; done in the base class ctor
-}
-
wxGDIImageRefData *wxBitmap::CreateData() const
{
return new wxBitmapRefData;
unsigned char* pixels = dib.GetData();
for (int idx=0; idx<w*h*4; idx+=4)
{
- if (pixels[idx+3] != 0)
+ if (pixels[idx+3] != 0)
{
// If there is an alpha byte that is non-zero then set the
// alpha flag and bail out of the loop.
// wxWin convention
refData->SetMask(wxInvertMask(iconInfo.hbmMask, w, h));
}
-
+
// delete the old one now as we don't need it any more
::DeleteObject(iconInfo.hbmMask);
wxBitmap::wxBitmap(const char bits[], int width, int height, int depth)
{
- Init();
-
#ifndef __WXMICROWIN__
wxBitmapRefData *refData = new wxBitmapRefData;
m_refData = refData;
// Create from XPM data
bool wxBitmap::CreateFromXpm(const char **data)
{
-#if wxUSE_IMAGE && wxUSE_XPM
- Init();
-
- wxCHECK_MSG( data != NULL, false, wxT("invalid bitmap data") )
+#if wxUSE_IMAGE && wxUSE_XPM && wxUSE_WXDIB
+ wxCHECK_MSG( data != NULL, false, wxT("invalid bitmap data") );
wxXPMDecoder decoder;
wxImage img = decoder.ReadData(data);
- wxCHECK_MSG( img.Ok(), false, wxT("invalid bitmap data") )
+ wxCHECK_MSG( img.Ok(), false, wxT("invalid bitmap data") );
*this = wxBitmap(img);
return true;
wxBitmap::wxBitmap(int w, int h, int d)
{
- Init();
-
(void)Create(w, h, d);
}
wxBitmap::wxBitmap(int w, int h, const wxDC& dc)
{
- Init();
-
(void)Create(w, h, dc);
}
wxBitmap::wxBitmap(void *data, long type, int width, int height, int depth)
{
- Init();
-
(void)Create(data, type, width, height, depth);
}
wxBitmap::wxBitmap(const wxString& filename, wxBitmapType type)
{
- Init();
-
LoadFile(filename, (int)type);
}
// wxImage to/from conversions
// ----------------------------------------------------------------------------
-#if wxUSE_WXDIB
-
bool wxBitmap::CreateFromImage(const wxImage& image, int depth)
{
return CreateFromImage(image, depth, 0);
return CreateFromImage(image, -1, dc.GetHDC());
}
+#if wxUSE_WXDIB
+
bool wxBitmap::CreateFromImage(const wxImage& image, int depth, WXHDC hdc)
{
wxCHECK_MSG( image.Ok(), false, wxT("invalid image") );
if ( !dib.IsOk() )
return false;
+ if ( depth == -1 )
+ depth = dib.GetDepth(); // Get depth from image if none specified
// store the bitmap parameters
wxBitmapRefData *refData = new wxBitmapRefData;
hbitmap = dib.Detach();
refData->m_isDIB = true;
- refData->m_depth = dib.GetDepth();
+ refData->m_depth = depth;
}
#ifndef ALWAYS_USE_DIB
else // we need to convert DIB to DDB
{
hbitmap = dib.CreateDDB((HDC)hdc);
- refData->m_depth = depth == -1 ? dib.GetDepth() : depth;
+ refData->m_depth = depth;
}
#endif // !ALWAYS_USE_DIB
SetMask(new wxMask((WXHBITMAP)hbitmap));
}
- delete data;
+ delete[] data;
}
return true;
return image;
}
-#endif // wxUSE_WXDIB
+#else // !wxUSE_WXDIB
+
+bool
+wxBitmap::CreateFromImage(const wxImage& WXUNUSED(image),
+ int WXUNUSED(depth),
+ WXHDC WXUNUSED(hdc))
+{
+ return false;
+}
+
+wxImage wxBitmap::ConvertToImage() const
+{
+ return wxImage();
+}
+
+#endif // wxUSE_WXDIB/!wxUSE_WXDIB
#endif // wxUSE_IMAGE
return handler->LoadFile(this, filename, type, -1, -1);
}
-#if wxUSE_IMAGE
+#if wxUSE_IMAGE && wxUSE_WXDIB
else // no bitmap handler found
{
wxImage image;
{
return handler->SaveFile(this, filename, type, palette);
}
-#if wxUSE_IMAGE
+#if wxUSE_IMAGE && wxUSE_WXDIB
else // no bitmap handler found
{
// FIXME what about palette? shouldn't we use it?
#ifndef __WXMICROWIN__
// handle alpha channel, if any
if (HasAlpha())
- ret.UseAlpha();
+ ret.UseAlpha();
// copy bitmap data
MemoryHDC dcSrc,
HBITMAP hDIB;
if ( !GetBitmapData()->m_isDIB )
{
- wxCHECK_MSG( !GetBitmapData()->m_dib, FALSE,
+ wxCHECK_MSG( !GetBitmapData()->m_dib, NULL,
_T("GetRawData() may be called only once") );
wxDIB *dib = new wxDIB(*this);
// this value must be 1, 4, 8 or 24 so PixelDepth can only be
lpDIBheader->bmiHeader.biBitCount = (WORD)(bitsPerPixel);
lpDIBheader->bmiHeader.biCompression = BI_RGB;
- lpDIBheader->bmiHeader.biSizeImage = xSize * abs(ySize) * bitsPerPixel >> 3;
+ lpDIBheader->bmiHeader.biSizeImage = (xSize * abs(ySize) * bitsPerPixel) >> 3;
lpDIBheader->bmiHeader.biClrUsed = 256;
return 0;
}
- wxMask* mask;
- wxBitmap newbmp;
if ( bmp.HasAlpha() )
{
- // Convert alpha to a mask. NOTE: It would be better to actually put
- // the alpha into the icon instead of making a mask, but I don't have
- // time to figure that out today.
- wxImage img = bmp.ConvertToImage();
- img.ConvertAlphaToMask();
- newbmp = wxBitmap(img);
- mask = newbmp.GetMask();
- }
- else
- {
- mask = bmp.GetMask();
+ // Create an empty mask bitmap.
+ // it doesn't seem to work if we mess with the mask at all.
+ HBITMAP hMonoBitmap = CreateBitmap(bmp.GetWidth(),bmp.GetHeight(),1,1,NULL);
+
+ ICONINFO iconInfo;
+ wxZeroMemory(iconInfo);
+ iconInfo.fIcon = iconWanted; // do we want an icon or a cursor?
+ if ( !iconWanted )
+ {
+ iconInfo.xHotspot = hotSpotX;
+ iconInfo.yHotspot = hotSpotY;
+ }
+
+ iconInfo.hbmMask = hMonoBitmap;
+ iconInfo.hbmColor = GetHbitmapOf(bmp);
+
+ HICON hicon = ::CreateIconIndirect(&iconInfo);
+
+ ::DeleteObject(hMonoBitmap);
+
+ return hicon;
}
-
+
+ wxMask* mask = bmp.GetMask();
+
if ( !mask )
{
// we must have a mask for an icon, so even if it's probably incorrect,