X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/1d63de4a455bde7bad81cb34724cb1df3219cd26..9b58521dc97c069e4e3fc283a6d90497e1bcc80c:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 9f7482b9bd..63f940e5a9 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -131,13 +131,13 @@ static inline double DegToRad(double deg) { return (deg * M_PI) / 180.0; } // otherwise static bool AlphaBlt(HDC hdcDst, int x, int y, int w, int h, - HDC hdcSrc, + int srcX, int srcY, HDC hdcSrc, const wxBitmap& bmpSrc); #ifdef wxHAVE_RAW_BITMAP // our (limited) AlphaBlend() replacement static void -wxAlphaBlend(HDC hdcDst, int x, int y, int w, int h, const wxBitmap& bmp); +wxAlphaBlend(HDC hdcDst, int x, int y, int w, int h, int srcX, int srcY, const wxBitmap& bmp); #endif // ---------------------------------------------------------------------------- @@ -1065,7 +1065,7 @@ void wxDC::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool useMask MemoryHDC hdcMem; SelectInHDC select(hdcMem, GetHbitmapOf(bmp)); - if ( AlphaBlt(GetHdc(), x, y, width, height, hdcMem, bmp) ) + if ( AlphaBlt(GetHdc(), x, y, width, height, 0, 0, hdcMem, bmp) ) return; } @@ -1635,7 +1635,7 @@ void wxDC::DoGetTextExtent(const wxString& string, wxCoord *x, wxCoord *y, SIZE sizeRect; TEXTMETRIC tm; - GetTextExtentPoint(GetHdc(), string, string.length(), &sizeRect); + ::GetTextExtentPoint32(GetHdc(), string, string.length(), &sizeRect); GetTextMetrics(GetHdc(), &tm); if (x) @@ -1913,7 +1913,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest, (m_selectedBitmap.Ok() && m_selectedBitmap.HasAlpha())) ) { if ( AlphaBlt(GetHdc(), xdest, ydest, width, height, - GetHdcOf(*source), bmpSrc) ) + xsrc, ysrc, GetHdcOf(*source), bmpSrc) ) return true; } @@ -2388,7 +2388,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxDCModule, wxModule) static bool AlphaBlt(HDC hdcDst, int x, int y, int width, int height, - HDC hdcSrc, + int srcX, int srcY, HDC hdcSrc, const wxBitmap& bmp) { wxASSERT_MSG( bmp.Ok() && bmp.HasAlpha(), _T("AlphaBlt(): invalid bitmap") ); @@ -2436,7 +2436,7 @@ static bool AlphaBlt(HDC hdcDst, bf.AlphaFormat = AC_SRC_ALPHA; if ( pfnAlphaBlend(hdcDst, x, y, width, height, - hdcSrc, 0, 0, width, height, + hdcSrc, srcX, srcY, width, height, bf) ) { // skip wxAlphaBlend() call below @@ -2450,7 +2450,7 @@ static bool AlphaBlt(HDC hdcDst, // AlphaBlend() unavailable of failed: use our own (probably much slower) // implementation #ifdef wxHAVE_RAW_BITMAP - wxAlphaBlend(hdcDst, x, y, width, height, bmp); + wxAlphaBlend(hdcDst, x, y, width, height, srcX, srcY, bmp); return true; #else // !wxHAVE_RAW_BITMAP @@ -2466,7 +2466,7 @@ static bool AlphaBlt(HDC hdcDst, #ifdef wxHAVE_RAW_BITMAP static void -wxAlphaBlend(HDC hdcDst, int xDst, int yDst, int w, int h, const wxBitmap& bmpSrc) +wxAlphaBlend(HDC hdcDst, int xDst, int yDst, int w, int h, int srcX, int srcY, const wxBitmap& bmpSrc) { // get the destination DC pixels wxBitmap bmpDst(w, h, 32 /* force creating RGBA DIB */); @@ -2488,11 +2488,13 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, int w, int h, const wxBitmap& bmpSr wxAlphaPixelData::Iterator pDst(dataDst), pSrc(dataSrc); + pSrc.Offset(dataSrc, srcX, srcY); + for ( int y = 0; y < h; y++ ) { wxAlphaPixelData::Iterator pDstRowStart = pDst, pSrcRowStart = pSrc; - + for ( int x = 0; x < w; x++ ) { // note that source bitmap uses premultiplied alpha (as required by