]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/dc.cpp
Clean up memory if have to exit early
[wxWidgets.git] / src / msw / dc.cpp
index 6b33f33f7467ab78738edc3357e1e66e56846071..79b1b5e14f4fd5191e3f841f4f34c5b135976803 100644 (file)
     #include <print.h>
 #endif
 
+/* Quaternary raster codes */
+#ifndef MAKEROP4
+#define MAKEROP4(fore,back) (DWORD)((((back) << 8) & 0xFF000000) | (fore))
+#endif
+
 IMPLEMENT_ABSTRACT_CLASS(wxDC, wxDCBase)
 
 // ---------------------------------------------------------------------------
@@ -127,6 +132,30 @@ private:
     bool m_changed;
 };
 
+// this class saves the old stretch blit mode during its life time
+class StretchBltModeChanger
+{
+public:
+    StretchBltModeChanger(HDC hdc, int mode)
+        : m_hdc(hdc)
+    {
+        m_modeOld = ::SetStretchBltMode(m_hdc, mode);
+        if ( !m_modeOld )
+            wxLogLastError(_T("SetStretchBltMode"));
+    }
+
+    ~StretchBltModeChanger()
+    {
+        if ( !::SetStretchBltMode(m_hdc, m_modeOld) )
+            wxLogLastError(_T("SetStretchBltMode"));
+    }
+
+private:
+    const HDC m_hdc;
+
+    int m_modeOld;
+};
+
 // ===========================================================================
 // implementation
 // ===========================================================================
@@ -1803,10 +1832,16 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
         if (wxSystemOptions::GetOptionInt(wxT("no-maskblt")) == 0)
 #endif
         {
-           success = ::MaskBlt(GetHdc(), xdest, ydest, width, height,
-                            GetHdcOf(*source), xsrc, ysrc,
-                            (HBITMAP)mask->GetMaskBitmap(), xsrcMask, ysrcMask,
-                            MAKEROP4(dwRop, DSTCOPY)) != 0;
+           success = ::MaskBlt
+                       (
+                            GetHdc(),
+                            xdest, ydest, width, height,
+                            GetHdcOf(*source),
+                            xsrc, ysrc,
+                            (HBITMAP)mask->GetMaskBitmap(),
+                            xsrcMask, ysrcMask,
+                            MAKEROP4(dwRop, DSTCOPY)
+                        ) != 0;
         }
 
         if ( !success )
@@ -1896,14 +1931,39 @@ bool wxDC::DoBlit(wxCoord xdest, wxCoord ydest,
     }
     else // no mask, just BitBlt() it
     {
-        success = ::BitBlt(GetHdc(), xdest, ydest,
-                           (int)width, (int)height,
-                           GetHdcOf(*source), xsrc, ysrc, dwRop) != 0;
+        // use StretchBlt() if available
+        if ( ::GetDeviceCaps(GetHdc(), RASTERCAPS) & RC_STRETCHBLT )
+        {
+            StretchBltModeChanger changeMode(GetHdc(), COLORONCOLOR);
+
+            success = ::StretchBlt
+                        (
+                            GetHdc(),
+                            xdest, ydest, width, height,
+                            GetHdcOf(*source),
+                            xsrc, ysrc, width, height,
+                            dwRop
+                        ) != 0;
+        }
+        else
+        {
+            success = ::BitBlt
+                        (
+                            GetHdc(),
+                            xdest, ydest,
+                            (int)width, (int)height,
+                            GetHdcOf(*source),
+                            xsrc, ysrc,
+                            dwRop
+                        ) != 0;
+        }
+
         if ( !success )
         {
-            wxLogLastError(wxT("BitBlt"));
+            wxLogLastError(wxT("BitBlt/StretchBlt"));
         }
     }
+
     ::SetTextColor(GetHdc(), old_textground);
     ::SetBkColor(GetHdc(), old_background);