]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
detect horizontal overflow in wxHtmlPrintout and warn the user about it
[wxWidgets.git] / src / msw / dc.cpp
index 5a8608840b557b41ed29bf66f6f06143aa4e7a3f..55724274f74fce94ed8dd520e7bc582b2f41a39c 100644 (file)
@@ -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(),