Enable cropping window capturing for Win7 when Aero is disabled.

BUG=webrtc:496110
R=sergeyu@chromium.org

Review URL: https://codereview.webrtc.org/1199073002 .

Cr-Commit-Position: refs/heads/master@{#9595}
diff --git a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc
index deffe66..73a2aa9 100644
--- a/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc
+++ b/webrtc/modules/desktop_capture/cropping_window_capturer_win.cc
@@ -119,10 +119,12 @@
   // The region from GetWindowRgn in the desktop coordinate if the region is
   // rectangular, or the rect from GetWindowRect if the region is not set.
   DesktopRect window_region_rect_;
+
+  AeroChecker aero_checker_;
 };
 
 bool CroppingWindowCapturerWin::ShouldUseScreenCapturer() {
-  if (!rtc::IsWindows8OrLater())
+  if (!rtc::IsWindows8OrLater() && aero_checker_.IsAeroEnabled())
     return false;
 
   // Check if the window is a translucent layered window.
diff --git a/webrtc/modules/desktop_capture/win/window_capture_utils.cc b/webrtc/modules/desktop_capture/win/window_capture_utils.cc
index bfe7363..83922ea 100644
--- a/webrtc/modules/desktop_capture/win/window_capture_utils.cc
+++ b/webrtc/modules/desktop_capture/win/window_capture_utils.cc
@@ -43,4 +43,27 @@
   return true;
 }
 
+AeroChecker::AeroChecker() : dwmapi_library_(nullptr), func_(nullptr) {
+  // Try to load dwmapi.dll dynamically since it is not available on XP.
+  dwmapi_library_ = LoadLibrary(L"dwmapi.dll");
+  if (dwmapi_library_) {
+    func_ = reinterpret_cast<DwmIsCompositionEnabledFunc>(
+        GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled"));
+  }
+}
+
+AeroChecker::~AeroChecker() {
+  if (dwmapi_library_) {
+    FreeLibrary(dwmapi_library_);
+  }
+}
+
+bool AeroChecker::IsAeroEnabled() {
+  BOOL result = FALSE;
+  if (func_) {
+    func_(&result);
+  }
+  return result != FALSE;
+}
+
 }  // namespace webrtc
diff --git a/webrtc/modules/desktop_capture/win/window_capture_utils.h b/webrtc/modules/desktop_capture/win/window_capture_utils.h
index 2a3a470..aa89c12 100644
--- a/webrtc/modules/desktop_capture/win/window_capture_utils.h
+++ b/webrtc/modules/desktop_capture/win/window_capture_utils.h
@@ -22,4 +22,19 @@
                           DesktopRect* cropped_rect,
                           DesktopRect* original_rect);
 
+typedef HRESULT (WINAPI *DwmIsCompositionEnabledFunc)(BOOL* enabled);
+class AeroChecker {
+ public:
+  AeroChecker();
+  ~AeroChecker();
+
+  bool IsAeroEnabled();
+
+ private:
+  HMODULE dwmapi_library_;
+  DwmIsCompositionEnabledFunc func_;
+
+  DISALLOW_COPY_AND_ASSIGN(AeroChecker);
+};
+
 }  // namespace webrtc
diff --git a/webrtc/modules/desktop_capture/window_capturer_win.cc b/webrtc/modules/desktop_capture/window_capturer_win.cc
index c7e1fd8..3d96881 100644
--- a/webrtc/modules/desktop_capture/window_capturer_win.cc
+++ b/webrtc/modules/desktop_capture/window_capturer_win.cc
@@ -22,8 +22,6 @@
 
 namespace {
 
-typedef HRESULT (WINAPI *DwmIsCompositionEnabledFunc)(BOOL* enabled);
-
 BOOL CALLBACK WindowsEnumerationHandler(HWND hwnd, LPARAM param) {
   WindowCapturer::WindowList* list =
       reinterpret_cast<WindowCapturer::WindowList*>(param);
@@ -81,48 +79,25 @@
   void Capture(const DesktopRegion& region) override;
 
  private:
-  bool IsAeroEnabled();
-
   Callback* callback_;
 
   // HWND and HDC for the currently selected window or NULL if window is not
   // selected.
   HWND window_;
 
-  // dwmapi.dll is used to determine if desktop compositing is enabled.
-  HMODULE dwmapi_library_;
-  DwmIsCompositionEnabledFunc is_composition_enabled_func_;
-
   DesktopSize previous_size_;
 
+  AeroChecker aero_checker_;
+
   DISALLOW_COPY_AND_ASSIGN(WindowCapturerWin);
 };
 
 WindowCapturerWin::WindowCapturerWin()
     : callback_(NULL),
       window_(NULL) {
-  // Try to load dwmapi.dll dynamically since it is not available on XP.
-  dwmapi_library_ = LoadLibrary(L"dwmapi.dll");
-  if (dwmapi_library_) {
-    is_composition_enabled_func_ =
-        reinterpret_cast<DwmIsCompositionEnabledFunc>(
-            GetProcAddress(dwmapi_library_, "DwmIsCompositionEnabled"));
-    assert(is_composition_enabled_func_);
-  } else {
-    is_composition_enabled_func_ = NULL;
-  }
 }
 
 WindowCapturerWin::~WindowCapturerWin() {
-  if (dwmapi_library_)
-    FreeLibrary(dwmapi_library_);
-}
-
-bool WindowCapturerWin::IsAeroEnabled() {
-  BOOL result = FALSE;
-  if (is_composition_enabled_func_)
-    is_composition_enabled_func_(&result);
-  return result != FALSE;
 }
 
 bool WindowCapturerWin::GetWindowList(WindowList* windows) {
@@ -228,7 +203,7 @@
   // capturing - it somehow affects what we get from BitBlt() on the subsequent
   // captures.
 
-  if (!IsAeroEnabled() || !previous_size_.equals(frame->size())) {
+  if (!aero_checker_.IsAeroEnabled() || !previous_size_.equals(frame->size())) {
     result = PrintWindow(window_, mem_dc, 0);
   }