]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
use wxBusyCursor class instead of wxBeginBusyCursor and several (mismatched and thus...
[wxWidgets.git] / src / msw / dc.cpp
index f3c558bf1195832ee43e05b5afba0d800c0a8d58..0dc13d5a1f171185ae2eb8809a8f57f4829ecd3f 100644 (file)
@@ -793,6 +793,50 @@ void wxDC::DoDrawPolygon(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffs
     }
 }
 
+void
+wxDC::DoDrawPolyPolygon(int n,
+                        int start[],
+                        wxPoint points[],
+                        wxCoord xoffset,
+                        wxCoord yoffset,
+                        int fillStyle)
+{
+#ifdef __WXMICROWIN__
+    if (!GetHDC()) return;
+#endif
+
+    wxColourChanger cc(*this); // needed for wxSTIPPLE_MASK_OPAQUE handling
+    int i, cnt;
+    for (i = cnt = 0; i < n; i++)
+        cnt += start[i];
+
+    // Do things less efficiently if we have offsets
+    if (xoffset != 0 || yoffset != 0)
+    {
+        POINT *cpoints = new POINT[cnt];
+        for (i = 0; i < cnt; i++)
+        {
+            cpoints[i].x = (int)(points[i].x + xoffset);
+            cpoints[i].y = (int)(points[i].y + yoffset);
+
+            CalcBoundingBox(cpoints[i].x, cpoints[i].y);
+        }
+        int prev = SetPolyFillMode(GetHdc(),fillStyle==wxODDEVEN_RULE?ALTERNATE:WINDING);
+        (void)PolyPolygon(GetHdc(), cpoints, start, n);
+        SetPolyFillMode(GetHdc(),prev);
+        delete[] cpoints;
+    }
+    else
+    {
+        for (i = 0; i < cnt; i++)
+            CalcBoundingBox(points[i].x, points[i].y);
+
+        int prev = SetPolyFillMode(GetHdc(),fillStyle==wxODDEVEN_RULE?ALTERNATE:WINDING);
+        (void)PolyPolygon(GetHdc(), (POINT*) points, start, n);
+        SetPolyFillMode(GetHdc(),prev);
+    }
+}
+
 void wxDC::DoDrawLines(int n, wxPoint points[], wxCoord xoffset, wxCoord yoffset)
 {
 #ifdef __WXMICROWIN__
@@ -878,11 +922,7 @@ void wxDC::DoDrawRoundedRectangle(wxCoord x, wxCoord y, wxCoord width, wxCoord h
 
     if (radius < 0.0)
     {
-        double smallest = 0.0;
-        if (width < height)
-            smallest = width;
-        else
-            smallest = height;
+        double smallest = (width < height) ? width : height;
         radius = (- radius * smallest);
     }
 
@@ -1432,8 +1472,7 @@ void wxDC::SetBrush(const wxBrush& brush)
 
         if ( m_brush.GetResourceHandle() )
         {
-            HBRUSH b = 0;
-            b = (HBRUSH) ::SelectObject(GetHdc(), (HBRUSH)m_brush.GetResourceHandle());
+            HBRUSH b = (HBRUSH) ::SelectObject(GetHdc(), (HBRUSH)m_brush.GetResourceHandle());
             if (!m_oldBrush)
                 m_oldBrush = (WXHBRUSH) b;
         }
@@ -1869,7 +1908,7 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
         ::SetBkColor(GetHdc(), m_textBackgroundColour.GetPixel() );
     }
 
-    DWORD dwRop = SRCCOPY;
+    DWORD dwRop;
     switch (rop)
     {
         case wxXOR:          dwRop = SRCINVERT;        break;
@@ -2026,10 +2065,19 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
             {
                 StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR);
 
+                // Figure out what co-ordinate system we're supposed to specify
+                // ysrc in.
+                const LONG hDIB = ds.dsBmih.biHeight;
+                if ( hDIB > 0 )
+                {
+                    // reflect ysrc
+                    ysrc = hDIB - (ysrc + height);
+                }
+
                 if ( ::StretchDIBits(GetHdc(),
                                      xdest, ydest,
                                      width, height,
-                                     0, 0,
+                                     xsrc, ysrc,
                                      width, height,
                                      ds.dsBm.bmBits,
                                      (LPBITMAPINFO)&ds.dsBmih,