X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/c0c133e13b36a923c65f94499554e432bc3a0daa..f7008bad873d18e389109f1e2c3af51323d16556:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index fcb7e82281..8c7adc9768 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -278,27 +278,31 @@ private: wxDECLARE_NO_COPY_CLASS(wxBrushAttrsSetter); }; -// this class saves the old stretch blit mode during its life time +#ifdef __WXWINCE__ + +#define SET_STRETCH_BLT_MODE(hdc) + +#else // !__WXWINCE__ + +// this class sets the stretch blit mode to COLORONCOLOR during its lifetime +// +// don't use it directly, use SET_STRETCH_BLT_MODE() macro instead as it +// expands to nothing under WinCE which doesn't have SetStretchBltMode() class StretchBltModeChanger { public: - StretchBltModeChanger(HDC hdc, - int WXUNUSED_IN_WINCE(mode)) + StretchBltModeChanger(HDC hdc) : m_hdc(hdc) { -#ifndef __WXWINCE__ - m_modeOld = ::SetStretchBltMode(m_hdc, mode); + m_modeOld = ::SetStretchBltMode(m_hdc, COLORONCOLOR); if ( !m_modeOld ) wxLogLastError(_T("SetStretchBltMode")); -#endif } ~StretchBltModeChanger() { -#ifndef __WXWINCE__ if ( !::SetStretchBltMode(m_hdc, m_modeOld) ) wxLogLastError(_T("SetStretchBltMode")); -#endif } private: @@ -309,6 +313,11 @@ private: wxDECLARE_NO_COPY_CLASS(StretchBltModeChanger); }; +#define SET_STRETCH_BLT_MODE(hdc) \ + StretchBltModeChanger wxMAKE_UNIQUE_NAME(stretchModeChanger)(hdc) + +#endif // __WXWINCE__/!__WXWINCE__ + #if wxUSE_DYNLIB_CLASS // helper class to cache dynamically loaded libraries and not attempt reloading @@ -457,12 +466,10 @@ void wxMSWDCImpl::SelectOldObjects(WXHDC dc) if (m_oldBitmap) { ::SelectObject((HDC) dc, (HBITMAP) m_oldBitmap); -#ifdef __WXDEBUG__ if (m_selectedBitmap.IsOk()) { m_selectedBitmap.SetSelectedInto(NULL); } -#endif } m_oldBitmap = 0; if (m_oldPen) @@ -785,11 +792,16 @@ void wxMSWDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord x2, wxCoord y2, wxCoord xc, wxCoord yc) { + double dx = xc - x1; + double dy = yc - y1; + wxCoord r = (wxCoord)sqrt(dx*dx + dy*dy); + + #ifdef __WXWINCE__ // Slower emulation since WinCE doesn't support Pie and Arc - double r = sqrt( (x1-xc)*(x1-xc) + (y1-yc)*(y1-yc) ); double sa = acos((x1-xc)/r)/M_PI*180; // between 0 and 180 - if( y1>yc ) sa = -sa; // below center + if( y1>yc ) + sa = -sa; // below center double ea = atan2(yc-y2, x2-xc)/M_PI*180; DoDrawEllipticArcRot( xc-r, yc-r, 2*r, 2*r, sa, ea ); #else @@ -798,11 +810,6 @@ void wxMSWDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling - double dx = xc - x1; - double dy = yc - y1; - double radius = (double)sqrt(dx*dx+dy*dy); - wxCoord r = (wxCoord)radius; - // treat the special case of full circle separately if ( x1 == x2 && y1 == y2 ) { @@ -816,7 +823,9 @@ void wxMSWDCImpl::DoDrawArc(wxCoord x1, wxCoord y1, wxCoord yy2 = YLOG2DEV(y2); wxCoord xxc = XLOG2DEV(xc); wxCoord yyc = YLOG2DEV(yc); - wxCoord ray = (wxCoord) sqrt(double((xxc-xx1)*(xxc-xx1)+(yyc-yy1)*(yyc-yy1))); + dx = xxc - xx1; + dy = yyc - yy1; + wxCoord ray = (wxCoord)sqrt(dx*dx + dy*dy); wxCoord xxx1 = (wxCoord) (xxc-ray); wxCoord yyy1 = (wxCoord) (yyc-ray); @@ -1294,6 +1303,8 @@ void wxMSWDCImpl::DoDrawBitmap( const wxBitmap &bmp, wxCoord x, wxCoord y, bool return; } + SET_STRETCH_BLT_MODE(GetHdc()); + if ( useMask ) { wxMask *mask = bmp.GetMask(); @@ -1722,7 +1733,7 @@ void wxMSWDCImpl::SetRop(WXHDC dc) if ( !dc || m_logicalFunction < 0 ) return; - int rop wxDUMMY_INITIALIZE(0); + int rop; switch (m_logicalFunction) { @@ -1742,6 +1753,9 @@ void wxMSWDCImpl::SetRop(WXHDC dc) case wxNAND: rop = R2_NOTMASKPEN; break; case wxOR: rop = R2_MERGEPEN; break; case wxSET: rop = R2_WHITE; break; + default: + wxFAIL_MSG( wxS("unknown logical function") ); + return; } SetROP2(GetHdc(), rop); @@ -2209,9 +2223,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, wxLogLastError(wxT("BitBlt")); } -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(dc_buffer, COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); // copy src to buffer using selected raster op if ( !::StretchBlt(dc_buffer, 0, 0, dstWidth, dstHeight, @@ -2279,7 +2291,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, sizeof(ds), &ds) == sizeof(ds) ) { - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); + SET_STRETCH_BLT_MODE(GetHdc()); // Figure out what co-ordinate system we're supposed to specify // ysrc in. @@ -2287,7 +2299,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, if ( hDIB > 0 ) { // reflect ysrc - ysrc = hDIB - (ysrc + dstHeight); + ysrc = hDIB - (ysrc + srcHeight); } if ( ::StretchDIBits(GetHdc(), @@ -2318,9 +2330,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, #endif // __WXWINCE__ { -#ifndef __WXWINCE__ - StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR); -#endif + SET_STRETCH_BLT_MODE(GetHdc()); if ( !::StretchBlt (