X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/fdaad94e75273fa586ec9af9d53518222f9699d0..4209475ced5240eb3ce516767e7c9a0a74d12bc7:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index 5a8608840b..55724274f7 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -219,7 +219,7 @@ private: COLORREF m_oldColFg, m_oldColBg; - DECLARE_NO_COPY_CLASS(wxTextColoursChanger) + wxDECLARE_NO_COPY_CLASS(wxTextColoursChanger); }; // background mode @@ -259,7 +259,7 @@ private: const HDC m_hdc; int m_oldMode; - DECLARE_NO_COPY_CLASS(wxBkModeChanger) + wxDECLARE_NO_COPY_CLASS(wxBkModeChanger); }; // instead of duplicating the same code which sets and then restores text @@ -275,7 +275,7 @@ public: wxBrushAttrsSetter(wxMSWDCImpl& dc); private: - DECLARE_NO_COPY_CLASS(wxBrushAttrsSetter) + wxDECLARE_NO_COPY_CLASS(wxBrushAttrsSetter); }; // this class saves the old stretch blit mode during its life time @@ -306,7 +306,7 @@ private: int m_modeOld; - DECLARE_NO_COPY_CLASS(StretchBltModeChanger) + wxDECLARE_NO_COPY_CLASS(StretchBltModeChanger); }; #if wxUSE_DYNLIB_CLASS @@ -399,6 +399,16 @@ wxBrushAttrsSetter::wxBrushAttrsSetter(wxMSWDCImpl& dc) } } +// ---------------------------------------------------------------------------- +// wxDC MSW-specific methods +// ---------------------------------------------------------------------------- + +WXHDC wxDC::GetHDC() const +{ + wxMSWDCImpl * const impl = wxDynamicCast(GetImpl(), wxMSWDCImpl); + return impl ? impl->GetHDC() : 0; +} + // --------------------------------------------------------------------------- // wxMSWDCImpl // --------------------------------------------------------------------------- @@ -447,12 +457,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) @@ -695,7 +703,7 @@ void wxMSWDCImpl::Clear() bool wxMSWDCImpl::DoFloodFill(wxCoord WXUNUSED_IN_WINCE(x), wxCoord WXUNUSED_IN_WINCE(y), const wxColour& WXUNUSED_IN_WINCE(col), - int WXUNUSED_IN_WINCE(style)) + wxFloodFillStyle WXUNUSED_IN_WINCE(style)) { #ifdef __WXWINCE__ return false; @@ -775,11 +783,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 @@ -788,11 +801,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 ) { @@ -806,7 +814,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); @@ -878,7 +888,7 @@ void wxMSWDCImpl::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, - int WXUNUSED_IN_WINCE(fillStyle)) + wxPolygonFillMode WXUNUSED_IN_WINCE(fillStyle)) { WXMICROWIN_CHECK_HDC @@ -927,7 +937,7 @@ wxMSWDCImpl::DoDrawPolyPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset, - int fillStyle) + wxPolygonFillMode fillStyle) { #ifdef __WXWINCE__ wxDCImpl::DoDrawPolyPolygon(n, count, points, xoffset, yoffset, fillStyle); @@ -1074,10 +1084,15 @@ void wxMSWDCImpl::DoDrawEllipse(wxCoord x, wxCoord y, wxCoord width, wxCoord hei wxBrushAttrsSetter cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling - wxCoord x2 = (x+width); - wxCoord y2 = (y+height); + // +1 below makes the ellipse more similar to other platforms. + // In particular, DoDrawEllipse(x,y,1,1) should draw one point. + wxCoord x2 = x + width + 1; + wxCoord y2 = y + height + 1; + + // Problem: Windows GDI Ellipse() with x2-x == y2-y == 3 and transparent + // pen doesn't draw anything. Should we provide a workaround? - (void)Ellipse(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2)); + ::Ellipse(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2)); CalcBoundingBox(x, y); CalcBoundingBox(x2, y2); @@ -1693,7 +1708,7 @@ void wxMSWDCImpl::SetBackgroundMode(int mode) // and m_backgroundMode is used there } -void wxMSWDCImpl::SetLogicalFunction(int function) +void wxMSWDCImpl::SetLogicalFunction(wxRasterOperationMode function) { WXMICROWIN_CHECK_HDC @@ -1727,10 +1742,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( wxT("unsupported logical function") ); - return; + wxFAIL_MSG( wxS("unknown logical function") ); + return; } SetROP2(GetHdc(), rop); @@ -1921,7 +1935,7 @@ void wxMSWDCImpl::RealizeScaleAndOrigin() #endif } -void wxMSWDCImpl::SetMapMode(int mode) +void wxMSWDCImpl::SetMapMode(wxMappingMode mode) { WXMICROWIN_CHECK_HDC @@ -2048,7 +2062,7 @@ bool wxMSWDCImpl::DoBlit(wxCoord dstX, wxCoord dstY, wxCoord dstWidth, wxCoord dstHeight, wxDC *source, wxCoord srcX, wxCoord srcY, - int rop, bool useMask, + wxRasterOperationMode rop, bool useMask, wxCoord srcMaskX, wxCoord srcMaskY) { return DoStretchBlit(dstX, dstY, dstWidth, dstHeight, source, srcX, srcY, dstWidth, dstHeight, rop, useMask, srcMaskX, srcMaskY); @@ -2059,7 +2073,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, wxDC *source, wxCoord xsrc, wxCoord ysrc, wxCoord srcWidth, wxCoord srcHeight, - int rop, bool useMask, + wxRasterOperationMode rop, bool useMask, wxCoord xsrcMask, wxCoord ysrcMask) { wxCHECK_MSG( source, false, _T("wxMSWDCImpl::Blit(): NULL wxDC pointer") ); @@ -2276,7 +2290,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, if ( hDIB > 0 ) { // reflect ysrc - ysrc = hDIB - (ysrc + dstHeight); + ysrc = hDIB - (ysrc + srcHeight); } if ( ::StretchDIBits(GetHdc(),