#endif
#include "wx/msw/private.h"
+#include "wx/msw/dc.h"
#if wxUSE_WXDIB
#include "wx/msw/dib.h"
m_bitmapMask = new wxMask(*data.m_bitmapMask);
// FIXME: we don't copy m_hBitmap currently but we should, see wxBitmap::
- // CloneRefData()
+ // CloneGDIRefData()
wxASSERT_MSG( !data.m_isDIB,
_T("can't copy bitmap locked for raw access!") );
return new wxBitmapRefData;
}
-wxObjectRefData *wxBitmap::CloneRefData(const wxObjectRefData *dataOrig) const
+wxGDIRefData *wxBitmap::CloneGDIRefData(const wxGDIRefData *dataOrig) const
{
const wxBitmapRefData *
data = wx_static_cast(const wxBitmapRefData *, dataOrig);
self->m_refData = new wxBitmapRefData(*data);
}
+ wxBitmapRefData * const
+ selfdata = wx_static_cast(wxBitmapRefData *, m_refData);
+
// copy also the mask
wxMask * const maskSrc = data->GetMask();
if ( maskSrc )
{
- wxBitmapRefData *selfdata = wx_static_cast(wxBitmapRefData *, m_refData);
-
selfdata->SetMask(new wxMask(*maskSrc));
}
- return m_refData;
+ return selfdata;
}
-#ifdef __WIN32__
-
-bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon)
+bool wxBitmap::CopyFromIconOrCursor(const wxGDIImage& icon,
+ wxBitmapTransparency transp)
{
#if !defined(__WXMICROWIN__) && !defined(__WXWINCE__)
// it may be either HICON or HCURSOR
refData->m_hBitmap = (WXHBITMAP)iconInfo.hbmColor;
+ switch ( transp )
+ {
+ default:
+ wxFAIL_MSG( _T("unknown wxBitmapTransparency value") );
+
+ case wxBitmapTransparency_None:
+ // nothing to do, refData->m_hasAlpha is false by default
+ break;
+
+ case wxBitmapTransparency_Auto:
#if wxUSE_WXDIB
- // If the icon is 32 bits per pixel then it may have alpha channel data,
- // although there are some icons that are 32 bpp but have no alpha... So
- // convert to a DIB and manually check the 4th byte for each pixel.
- BITMAP bm;
- if ( ::GetObject(iconInfo.hbmColor, sizeof(BITMAP), (LPVOID)&bm)
- && bm.bmBitsPixel == 32)
- {
- wxDIB dib(iconInfo.hbmColor);
- if (dib.IsOk())
- {
- unsigned char* pixels = dib.GetData();
- for (int idx=0; idx<w*h*4; idx+=4)
+ // If the icon is 32 bits per pixel then it may have alpha channel
+ // data, although there are some icons that are 32 bpp but have no
+ // alpha... So convert to a DIB and manually check the 4th byte for
+ // each pixel.
{
- if (pixels[idx+3] != 0)
+ BITMAP bm;
+ if ( ::GetObject(iconInfo.hbmColor, sizeof(bm), &bm) &&
+ (bm.bmBitsPixel == 32) )
{
- // If there is an alpha byte that is non-zero then set the
- // alpha flag and bail out of the loop.
- refData->m_hasAlpha = true;
- break;
+ wxDIB dib(iconInfo.hbmColor);
+ if (dib.IsOk())
+ {
+ const unsigned char* pixels = dib.GetData();
+ for (int idx = 0; idx < w*h*4; idx+=4)
+ {
+ if (pixels[idx+3] != 0)
+ {
+ // If there is an alpha byte that is non-zero
+ // then set the alpha flag and stop checking
+ refData->m_hasAlpha = true;
+ break;
+ }
+ }
+ }
}
}
- }
+ break;
+#endif // wxUSE_WXDIB
+
+ case wxBitmapTransparency_Always:
+ refData->m_hasAlpha = true;
+ break;
}
-#endif
+
if ( !refData->m_hasAlpha )
{
// the mask returned by GetIconInfo() is inverted compared to the usual
::DeleteObject(iconInfo.hbmMask);
return true;
-#else
+#else // __WXMICROWIN__ || __WXWINCE__
wxUnusedVar(icon);
+ wxUnusedVar(transp);
+
return false;
-#endif
+#endif // !__WXWINCE__/__WXWINCE__
}
-#endif // Win32
-
-bool wxBitmap::CopyFromCursor(const wxCursor& cursor)
+bool wxBitmap::CopyFromCursor(const wxCursor& cursor, wxBitmapTransparency transp)
{
UnRef();
if ( !cursor.Ok() )
return false;
- return CopyFromIconOrCursor(cursor);
+ return CopyFromIconOrCursor(cursor, transp);
}
-bool wxBitmap::CopyFromIcon(const wxIcon& icon)
+bool wxBitmap::CopyFromIcon(const wxIcon& icon, wxBitmapTransparency transp)
{
UnRef();
if ( !icon.Ok() )
return false;
- return CopyFromIconOrCursor(icon);
+ return CopyFromIconOrCursor(icon, transp);
}
#ifndef NEVER_USE_DIB
bool wxBitmap::Create(int width, int height, const wxDC& dc)
{
- wxCHECK_MSG( dc.Ok(), false, _T("invalid HDC in wxBitmap::Create()") );
+ wxCHECK_MSG( dc.IsOk(), false, _T("invalid HDC in wxBitmap::Create()") );
- return DoCreate(width, height, -1, dc.GetHDC());
+ const wxMSWDCImpl *impl = wxDynamicCast( dc.GetImpl(), wxMSWDCImpl );
+
+ if (impl)
+ return DoCreate(width, height, -1, impl->GetHDC());
+ else
+ return false;
}
bool wxBitmap::DoCreate(int w, int h, int d, WXHDC hdc)
bool wxBitmap::CreateFromImage(const wxImage& image, const wxDC& dc)
{
- wxCHECK_MSG( dc.Ok(), false,
+ wxCHECK_MSG( dc.IsOk(), false,
_T("invalid HDC in wxBitmap::CreateFromImage()") );
- return CreateFromImage(image, -1, dc.GetHDC());
+ const wxMSWDCImpl *impl = wxDynamicCast( dc.GetImpl(), wxMSWDCImpl );
+
+ if (impl)
+ return CreateFromImage(image, -1, impl->GetHDC());
+ else
+ return false;
}
#if wxUSE_WXDIB
// ----------------------------------------------------------------------------
// sub bitmap extraction
// ----------------------------------------------------------------------------
+wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect ) const
+{
+ MemoryHDC dcSrc;
+ SelectInHDC selectSrc(dcSrc, GetHbitmap());
+ return GetSubBitmapOfHDC( rect, (WXHDC)dcSrc );
+}
-wxBitmap wxBitmap::GetSubBitmap( const wxRect& rect) const
+wxBitmap wxBitmap::GetSubBitmapOfHDC( const wxRect& rect, WXHDC hdc ) const
{
wxCHECK_MSG( Ok() &&
(rect.x >= 0) && (rect.y >= 0) &&
dcDst;
{
- SelectInHDC selectSrc(dcSrc, GetHbitmap()),
- selectDst(dcDst, GetHbitmapOf(ret));
-
- if ( !selectSrc || !selectDst )
+ SelectInHDC selectDst(dcDst, GetHbitmapOf(ret));
+
+ if ( !selectDst )
{
- wxLogLastError(_T("SelectObjct(hBitmap)"));
+ wxLogLastError(_T("SelectObject(destBitmap)"));
}
if ( !::BitBlt(dcDst, 0, 0, rect.width, rect.height,
- dcSrc, rect.x, rect.y, SRCCOPY) )
+ (HDC)hdc, rect.x, rect.y, SRCCOPY) )
{
wxLogLastError(_T("BitBlt"));
}
return false;
}
-// ----------------------------------------------------------------------------
-// DIB functions
-// ----------------------------------------------------------------------------
-
-#ifndef __WXMICROWIN__
-bool wxCreateDIB(long xSize, long ySize, long bitsPerPixel,
- HPALETTE hPal, LPBITMAPINFO* lpDIBHeader)
-{
- unsigned long i, headerSize;
-
- // Allocate space for a DIB header
- headerSize = (sizeof(BITMAPINFOHEADER) + (256 * sizeof(PALETTEENTRY)));
- LPBITMAPINFO lpDIBheader = (BITMAPINFO *) malloc(headerSize);
- LPPALETTEENTRY lpPe = (PALETTEENTRY *)((BYTE*)lpDIBheader + sizeof(BITMAPINFOHEADER));
-
- GetPaletteEntries(hPal, 0, 256, lpPe);
-
- memset(lpDIBheader, 0x00, sizeof(BITMAPINFOHEADER));
-
- // Fill in the static parts of the DIB header
- lpDIBheader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- lpDIBheader->bmiHeader.biWidth = xSize;
- lpDIBheader->bmiHeader.biHeight = ySize;
- lpDIBheader->bmiHeader.biPlanes = 1;
-
- // 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.biClrUsed = 256;
-
-
- // Initialize the DIB palette
- for (i = 0; i < 256; i++) {
- lpDIBheader->bmiColors[i].rgbReserved = lpPe[i].peFlags;
- lpDIBheader->bmiColors[i].rgbRed = lpPe[i].peRed;
- lpDIBheader->bmiColors[i].rgbGreen = lpPe[i].peGreen;
- lpDIBheader->bmiColors[i].rgbBlue = lpPe[i].peBlue;
- }
-
- *lpDIBHeader = lpDIBheader;
-
- return true;
-}
-
-void wxFreeDIB(LPBITMAPINFO lpDIBHeader)
-{
- free(lpDIBHeader);
-}
-#endif
-
// ----------------------------------------------------------------------------
// global helper functions implemented here
// ----------------------------------------------------------------------------