| Index: remoting/host/capturer_win.cc
|
| diff --git a/remoting/host/capturer_gdi.cc b/remoting/host/capturer_win.cc
|
| similarity index 70%
|
| rename from remoting/host/capturer_gdi.cc
|
| rename to remoting/host/capturer_win.cc
|
| index 8e50bde78e8650c69a3f9fe558033fcd1d536443..b5fe81e9fa468877b58a974dc1820c428d1279ef 100644
|
| --- a/remoting/host/capturer_gdi.cc
|
| +++ b/remoting/host/capturer_win.cc
|
| @@ -2,13 +2,111 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| -#include "remoting/host/capturer_gdi.h"
|
| -#include "remoting/host/differ.h"
|
| +#include "remoting/host/capturer.h"
|
| +
|
| +#include <windows.h>
|
|
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "remoting/host/capturer_helper.h"
|
| +#include "remoting/host/differ.h"
|
| #include "ui/gfx/rect.h"
|
|
|
| namespace remoting {
|
|
|
| +namespace {
|
| +
|
| +// CapturerGdi captures 32bit RGB using GDI.
|
| +//
|
| +// CapturerGdi is double-buffered as required by Capturer. See
|
| +// remoting/host/capturer.h.
|
| +class CapturerGdi : public Capturer {
|
| + public:
|
| + CapturerGdi();
|
| + virtual ~CapturerGdi();
|
| +
|
| + // Capturer interface.
|
| + virtual void ScreenConfigurationChanged() OVERRIDE;
|
| + virtual media::VideoFrame::Format pixel_format() const OVERRIDE;
|
| + virtual void ClearInvalidRects() OVERRIDE;
|
| + virtual void InvalidateRects(const InvalidRects& inval_rects) OVERRIDE;
|
| + virtual void InvalidateScreen(const gfx::Size& size) OVERRIDE;
|
| + virtual void InvalidateFullScreen() OVERRIDE;
|
| + virtual void CaptureInvalidRects(CaptureCompletedCallback* callback) OVERRIDE;
|
| + virtual const gfx::Size& size_most_recent() const OVERRIDE;
|
| +
|
| + private:
|
| + struct VideoFrameBuffer {
|
| + VideoFrameBuffer(void* data, const gfx::Size& size, int bytes_per_pixel,
|
| + int bytes_per_row)
|
| + : data(data), size(size), bytes_per_pixel(bytes_per_pixel),
|
| + bytes_per_row(bytes_per_row) {
|
| + }
|
| + VideoFrameBuffer() {
|
| + data = 0;
|
| + size = gfx::Size(0, 0);
|
| + bytes_per_pixel = 0;
|
| + bytes_per_row = 0;
|
| + }
|
| + void* data;
|
| + gfx::Size size;
|
| + int bytes_per_pixel;
|
| + int bytes_per_row;
|
| + };
|
| +
|
| + // Make sure that the current buffer has the same size as the screen.
|
| + void UpdateBufferCapture(const gfx::Size& size);
|
| +
|
| + // Allocate memory for a buffer of a given size, freeing any memory previously
|
| + // allocated for that buffer.
|
| + void ReallocateBuffer(int buffer_index, const gfx::Size& size);
|
| +
|
| + void CalculateInvalidRects();
|
| + void CaptureRects(const InvalidRects& rects,
|
| + CaptureCompletedCallback* callback);
|
| +
|
| + void ReleaseBuffers();
|
| + // Generates an image in the current buffer.
|
| + void CaptureImage();
|
| +
|
| + // Gets the current screen size and calls ScreenConfigurationChanged
|
| + // if the screen size has changed.
|
| + void MaybeChangeScreenConfiguration();
|
| +
|
| + // Gets the screen size.
|
| + gfx::Size GetScreenSize();
|
| +
|
| + // A thread-safe list of invalid rectangles, and the size of the most
|
| + // recently captured screen.
|
| + CapturerHelper helper;
|
| +
|
| + // There are two buffers for the screen images, as required by Capturer.
|
| + static const int kNumBuffers = 2;
|
| + VideoFrameBuffer buffers_[kNumBuffers];
|
| +
|
| + // Gdi specific information about screen.
|
| + HDC desktop_dc_;
|
| + HDC memory_dc_;
|
| + HBITMAP target_bitmap_[kNumBuffers];
|
| +
|
| + // The screen size attached to the device contexts through which the screen
|
| + // is captured.
|
| + gfx::Size dc_size_;
|
| +
|
| + // The current buffer with valid data for reading.
|
| + int current_buffer_;
|
| +
|
| + // Format of pixels returned in buffer.
|
| + media::VideoFrame::Format pixel_format_;
|
| +
|
| + // Class to calculate the difference between two screen bitmaps.
|
| + scoped_ptr<Differ> differ_;
|
| +
|
| + // True if we should force a fullscreen capture.
|
| + bool capture_fullscreen_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(CapturerGdi);
|
| +};
|
| +
|
| // 3780 pixels per meter is equivalent to 96 DPI, typical on desktop monitors.
|
| static const int kPixelsPerMeter = 3780;
|
| // 32 bit RGBA is 4 bytes per pixel.
|
| @@ -229,6 +327,8 @@ gfx::Size CapturerGdi::GetScreenSize() {
|
| GetSystemMetrics(SM_CYSCREEN));
|
| }
|
|
|
| +} // namespace
|
| +
|
| // static
|
| Capturer* Capturer::Create() {
|
| return new CapturerGdi();
|
|
|