X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3e9db38eafb71bbbfeaf92654c992d2f41faaf1a..cac1cfce376de6ed10098eb85b5a6fb355c8c47e:/src/msw/dc.cpp diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp index e4b14e7c81..b47befb24e 100644 --- a/src/msw/dc.cpp +++ b/src/msw/dc.cpp @@ -43,7 +43,7 @@ #include "wx/sysopt.h" #include "wx/dynlib.h" -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP #include "wx/rawbmp.h" #endif @@ -133,7 +133,7 @@ static bool AlphaBlt(HDC hdcDst, HDC hdcSrc, const wxBitmap& bmp); -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP // our (limited) AlphaBlend() replacement for Windows versions not providing it static void @@ -143,7 +143,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, int srcWidth, int srcHeight, const wxBitmap& bmpSrc); -#endif // wxHAVE_RAW_BITMAP +#endif // wxHAS_RAW_BITMAP // ---------------------------------------------------------------------------- // private classes @@ -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 // --------------------------------------------------------------------------- @@ -525,7 +535,7 @@ wxMSWDCImpl::DoGetClippingBox(wxCoord *x, wxCoord *y, wxCoord *w, wxCoord *h) co wxDCImpl::DoGetClippingBox(x, y, w, h); } -// common part of DoSetClippingRegion() and DoSetClippingRegionAsRegion() +// common part of DoSetClippingRegion() and DoSetDeviceClippingRegion() void wxMSWDCImpl::SetClippingHrgn(WXHRGN hrgn) { wxCHECK_RET( hrgn, wxT("invalid clipping region") ); @@ -593,7 +603,7 @@ void wxMSWDCImpl::DoSetClippingRegion(wxCoord x, wxCoord y, wxCoord w, wxCoord h } } -void wxMSWDCImpl::DoSetClippingRegionAsRegion(const wxRegion& region) +void wxMSWDCImpl::DoSetDeviceClippingRegion(const wxRegion& region) { SetClippingHrgn(region.GetHRGN()); } @@ -695,7 +705,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 +785,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 +803,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 +816,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 +890,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 +939,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 +1086,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; - (void)Ellipse(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2)); + // Problem: Windows GDI Ellipse() with x2-x == y2-y == 3 and transparent + // pen doesn't draw anything. Should we provide a workaround? + + ::Ellipse(GetHdc(), XLOG2DEV(x), YLOG2DEV(y), XLOG2DEV(x2), YLOG2DEV(y2)); CalcBoundingBox(x, y); CalcBoundingBox(x2, y2); @@ -1693,7 +1710,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 +1744,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 +1937,7 @@ void wxMSWDCImpl::RealizeScaleAndOrigin() #endif } -void wxMSWDCImpl::SetMapMode(int mode) +void wxMSWDCImpl::SetMapMode(wxMappingMode mode) { WXMICROWIN_CHECK_HDC @@ -2017,9 +2033,15 @@ void wxMSWDCImpl::SetLogicalOrigin(wxCoord x, wxCoord y) wxDCImpl::SetLogicalOrigin( x, y ); -#ifndef __WXWINCE__ - ::SetWindowOrgEx(GetHdc(), (int)m_logicalOriginX, (int)m_logicalOriginY, NULL); -#endif + RealizeScaleAndOrigin(); +} + +// For use by wxWidgets only, unless custom units are required. +void wxMSWDCImpl::SetLogicalScale(double x, double y) +{ + WXMICROWIN_CHECK_HDC + + wxDCImpl::SetLogicalScale(x,y); } void wxMSWDCImpl::SetDeviceOrigin(wxCoord x, wxCoord y) @@ -2042,7 +2064,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); @@ -2053,7 +2075,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") ); @@ -2270,7 +2292,7 @@ bool wxMSWDCImpl::DoStretchBlit(wxCoord xdest, wxCoord ydest, if ( hDIB > 0 ) { // reflect ysrc - ysrc = hDIB - (ysrc + dstHeight); + ysrc = hDIB - (ysrc + srcHeight); } if ( ::StretchDIBits(GetHdc(), @@ -2389,14 +2411,6 @@ wxSize wxMSWDCImpl::GetPPI() const return wxSize(x, y); } -// For use by wxWidgets only, unless custom units are required. -void wxMSWDCImpl::SetLogicalScale(double x, double y) -{ - WXMICROWIN_CHECK_HDC - - wxDCImpl::SetLogicalScale(x,y); -} - // ---------------------------------------------------------------------------- // DC caching // ---------------------------------------------------------------------------- @@ -2581,21 +2595,21 @@ static bool AlphaBlt(HDC hdcDst, // AlphaBlend() unavailable of failed: use our own (probably much slower) // implementation -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP wxAlphaBlend(hdcDst, x, y, dstWidth, dstHeight, srcX, srcY, srcWidth, srcHeight, bmp); return true; -#else // !wxHAVE_RAW_BITMAP +#else // !wxHAS_RAW_BITMAP // no wxAlphaBlend() neither, fall back to using simple BitBlt() (we lose // alpha but at least something will be shown like this) wxUnusedVar(bmp); return false; -#endif // wxHAVE_RAW_BITMAP +#endif // wxHAS_RAW_BITMAP/!wxHAS_RAW_BITMAP } // wxAlphaBlend: our fallback if ::AlphaBlend() is unavailable -#ifdef wxHAVE_RAW_BITMAP +#ifdef wxHAS_RAW_BITMAP static void wxAlphaBlend(HDC hdcDst, int xDst, int yDst, @@ -2657,7 +2671,7 @@ wxAlphaBlend(HDC hdcDst, int xDst, int yDst, } } -#endif // #ifdef wxHAVE_RAW_BITMAP +#endif // wxHAS_RAW_BITMAP void wxMSWDCImpl::DoGradientFillLinear (const wxRect& rect, const wxColour& initialColour,