From f178ab7e82544871ae3e59341c1953d5ce088365 Mon Sep 17 00:00:00 2001
From: Vadim Zeitlin <vadim@wxwidgets.org>
Date: Thu, 2 Jan 2003 23:25:17 +0000
Subject: [PATCH] use StretchBlt() if available (part of patch 649866)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@18523 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
---
 src/msw/dc.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 63 insertions(+), 8 deletions(-)

diff --git a/src/msw/dc.cpp b/src/msw/dc.cpp
index 3bb029de5e..79b1b5e14f 100644
--- a/src/msw/dc.cpp
+++ b/src/msw/dc.cpp
@@ -132,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
 // ===========================================================================
@@ -1808,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 )
@@ -1901,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);
 
-- 
2.47.2