Chromium Code Reviews| Index: remoting/host/capturer_win.cc |
| diff --git a/remoting/host/capturer_gdi.cc b/remoting/host/capturer_win.cc |
| similarity index 69% |
| rename from remoting/host/capturer_gdi.cc |
| rename to remoting/host/capturer_win.cc |
| index 8e50bde78e8650c69a3f9fe558033fcd1d536443..e4c45342c07352b429f52a966cbc4d707b1ebea5 100644 |
| --- a/remoting/host/capturer_gdi.cc |
| +++ b/remoting/host/capturer_win.cc |
| @@ -2,17 +2,115 @@ |
| // 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. |
|
Jamie
2011/04/01 10:51:10
Why can't these be static?
dmac
2011/04/01 21:15:07
I turned them back to static.
|
| -static const int kPixelsPerMeter = 3780; |
| +const int kPixelsPerMeter = 3780; |
| // 32 bit RGBA is 4 bytes per pixel. |
| -static const int kBytesPerPixel = 4; |
| +const int kBytesPerPixel = 4; |
| CapturerGdi::CapturerGdi() |
| : desktop_dc_(NULL), |
| @@ -229,6 +327,8 @@ gfx::Size CapturerGdi::GetScreenSize() { |
| GetSystemMetrics(SM_CYSCREEN)); |
| } |
| +} // namespace |
| + |
| // static |
| Capturer* Capturer::Create() { |
| return new CapturerGdi(); |