1/*
2 *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
12#define WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
13
14#include "webrtc/modules/desktop_capture/screen_capturer.h"
15
16#include <windows.h>
17
18#include "webrtc/base/scoped_ptr.h"
19#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h"
20#include "webrtc/modules/desktop_capture/screen_capturer_helper.h"
21#include "webrtc/modules/desktop_capture/win/scoped_thread_desktop.h"
22
23namespace webrtc {
24
25class Differ;
26
27// ScreenCapturerWinGdi captures 32bit RGB using GDI.
28//
29// ScreenCapturerWinGdi is double-buffered as required by ScreenCapturer.
30class ScreenCapturerWinGdi : public ScreenCapturer {
31 public:
32  explicit ScreenCapturerWinGdi(const DesktopCaptureOptions& options);
33  virtual ~ScreenCapturerWinGdi();
34
35  // Overridden from ScreenCapturer:
36  void Start(Callback* callback) override;
37  void Capture(const DesktopRegion& region) override;
38  bool GetScreenList(ScreenList* screens) override;
39  bool SelectScreen(ScreenId id) override;
40
41 private:
42  typedef HRESULT (WINAPI * DwmEnableCompositionFunc)(UINT);
43
44  // Make sure that the device contexts match the screen configuration.
45  void PrepareCaptureResources();
46
47  // Captures the current screen contents into the current buffer. Returns true
48  // if succeeded.
49  bool CaptureImage();
50
51  // Capture the current cursor shape.
52  void CaptureCursor();
53
54  Callback* callback_;
55  ScreenId current_screen_id_;
56  std::wstring current_device_key_;
57
58  // A thread-safe list of invalid rectangles, and the size of the most
59  // recently captured screen.
60  ScreenCapturerHelper helper_;
61
62  ScopedThreadDesktop desktop_;
63
64  // GDI resources used for screen capture.
65  HDC desktop_dc_;
66  HDC memory_dc_;
67
68  // Queue of the frames buffers.
69  ScreenCaptureFrameQueue queue_;
70
71  // Rectangle describing the bounds of the desktop device context, relative to
72  // the primary display's top-left.
73  DesktopRect desktop_dc_rect_;
74
75  // Class to calculate the difference between two screen bitmaps.
76  rtc::scoped_ptr<Differ> differ_;
77
78  HMODULE dwmapi_library_;
79  DwmEnableCompositionFunc composition_func_;
80
81  // Used to suppress duplicate logging of SetThreadExecutionState errors.
82  bool set_thread_execution_state_failed_;
83
84  RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCapturerWinGdi);
85};
86
87}  // namespace webrtc
88
89#endif  // WEBRTC_MODULES_DESKTOP_CAPTURE_WIN_SCREEN_CAPTURER_WIN_GDI_H_
90